survey-analytics 1.9.75 → 1.9.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/survey.analytics.css +1 -1
- package/survey.analytics.d.ts +22 -0
- package/survey.analytics.datatables.css +1 -1
- package/survey.analytics.datatables.d.ts +22 -0
- package/survey.analytics.datatables.js +31 -7
- package/survey.analytics.datatables.min.css +1 -1
- package/survey.analytics.datatables.min.js +2 -2
- package/survey.analytics.js +29 -7
- package/survey.analytics.min.css +1 -1
- package/survey.analytics.min.js +3 -3
- package/survey.analytics.tabulator.css +15 -3
- package/survey.analytics.tabulator.d.ts +22 -0
- package/survey.analytics.tabulator.js +33 -9
- package/survey.analytics.tabulator.min.css +2 -2
- package/survey.analytics.tabulator.min.js +2 -2
package/survey.analytics.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* surveyjs - SurveyJS Dashboard library v1.9.
|
|
2
|
+
* surveyjs - SurveyJS Dashboard library v1.9.77
|
|
3
3
|
* Copyright (c) 2015-2023 Devsoft Baltic OÜ - http://surveyjs.io/
|
|
4
4
|
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
5
5
|
*/
|
|
@@ -7568,10 +7568,16 @@ var portugueseStrings = {
|
|
|
7568
7568
|
showLabel: "Mostrar",
|
|
7569
7569
|
entriesLabel: "entradas",
|
|
7570
7570
|
visualizer_text: "Textos em tabela",
|
|
7571
|
+
visualizer_wordcloud: "Nuvem de palavras",
|
|
7572
|
+
visualizer_histogram: "Histograma",
|
|
7573
|
+
visualizer_number: "Média",
|
|
7574
|
+
visualizer_choices: "Tabela",
|
|
7575
|
+
visualizer_selectBase: "Gráfico",
|
|
7571
7576
|
chartType_bar: "Barra",
|
|
7577
|
+
chartType_vbar: "Barra vertical",
|
|
7572
7578
|
chartType_stackedbar: "Barra Empilhada",
|
|
7573
|
-
chartType_doughnut: "
|
|
7574
|
-
chartType_pie: "
|
|
7579
|
+
chartType_doughnut: "Rosca",
|
|
7580
|
+
chartType_pie: "Tarte",
|
|
7575
7581
|
chartType_scatter: "Lastro",
|
|
7576
7582
|
chartType_gauge: "Escala",
|
|
7577
7583
|
chartType_bullet: "Bala",
|
|
@@ -7582,6 +7588,10 @@ var portugueseStrings = {
|
|
|
7582
7588
|
filter: "Filtrar",
|
|
7583
7589
|
resetFilter: "Restaurar Filtro",
|
|
7584
7590
|
changeLocale: "Mudar Localização",
|
|
7591
|
+
en: "Inglês",
|
|
7592
|
+
fr: "Francês",
|
|
7593
|
+
ru: "Russo",
|
|
7594
|
+
de: "Alemão",
|
|
7585
7595
|
clearButton: "Limpar",
|
|
7586
7596
|
addElement: "Escolher questão para mostrar...",
|
|
7587
7597
|
defaultOrder: "Ordenação Padrão",
|
|
@@ -7591,19 +7601,31 @@ var portugueseStrings = {
|
|
|
7591
7601
|
otherCommentTitle: "Outros itens e comentários",
|
|
7592
7602
|
showPercentages: "Mostrar percentuais",
|
|
7593
7603
|
hidePercentages: "Esconder percentuais",
|
|
7594
|
-
|
|
7604
|
+
pdfDownloadCaption: "PDF",
|
|
7605
|
+
xlsxDownloadCaption: "Excel",
|
|
7606
|
+
csvDownloadCaption: "CSV",
|
|
7607
|
+
saveDiagramAsPNG: "Baixar diagrama como PNG",
|
|
7595
7608
|
hideEmptyAnswers: "Esconder perguntas vazias",
|
|
7596
7609
|
showEmptyAnswers: "Mostrar perguntas vazias",
|
|
7597
7610
|
"topNValueText-1": "Todas as respostas",
|
|
7598
7611
|
"topNValueText5": "Primeiras 5 respostas",
|
|
7599
7612
|
"topNValueText10": "Primeiras 10 respostas",
|
|
7600
7613
|
"topNValueText20": "Primeiras 20 respostas",
|
|
7614
|
+
hideMissingAnswers: "Ocultar perguntas não respondidas",
|
|
7615
|
+
showMissingAnswers: "Mostrar perguntas não respondidas",
|
|
7616
|
+
missingAnswersLabel: "Perguntas não respondidas",
|
|
7601
7617
|
noVisualizerForQuestion: "Este tipo de pergunta ainda não foi visualizada",
|
|
7602
|
-
noResults: "Ainda não possui resultados"
|
|
7618
|
+
noResults: "Ainda não possui resultados",
|
|
7619
|
+
showPerValues: "Por valores",
|
|
7620
|
+
showPerColumns: "Por colunas",
|
|
7621
|
+
answer: "Resposta",
|
|
7622
|
+
correctAnswer: "Resposta correta: ",
|
|
7623
|
+
percent: "Percentagem",
|
|
7624
|
+
responses: "Respostas"
|
|
7603
7625
|
};
|
|
7604
7626
|
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
|
|
7605
7627
|
_localizationManager__WEBPACK_IMPORTED_MODULE_0__["localization"].locales["pt"] = portugueseStrings;
|
|
7606
|
-
_localizationManager__WEBPACK_IMPORTED_MODULE_0__["localization"].localeNames["pt"] = "
|
|
7628
|
+
_localizationManager__WEBPACK_IMPORTED_MODULE_0__["localization"].localeNames["pt"] = "Português";
|
|
7607
7629
|
|
|
7608
7630
|
|
|
7609
7631
|
/***/ }),
|
|
@@ -14249,4 +14271,4 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_wordcloud__;
|
|
|
14249
14271
|
|
|
14250
14272
|
/******/ });
|
|
14251
14273
|
});
|
|
14252
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3J1c3NpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYm9vbGVhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvY2hvaWNlcy10YWJsZS5zY3NzP2E2OGUiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2RhdGFQcm92aWRlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZW50cmllcy9zdW1tYXJ5LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9maWx0ZXJJbmZvLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9oaXN0b2dyYW0udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xheW91dEVuZ2luZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbG9jYWxpemF0aW9uTWFuYWdlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9tYXRyaXhEcm9wZG93bkdyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL251bWJlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9oaXN0b2dyYW0udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9pbmRleC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeGRyb3Bkb3duLWdyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9yYW5raW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmF0aW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NldHVwLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9zZWxlY3RCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy90ZXh0LnNjc3M/MmM0ZSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaGVscGVycy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYW5hZ2VyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwuc2Nzcz8zYzgyIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnNjc3M/YWZiZCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXplckJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2R1dGNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2VuZ2xpc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvbm9yd2VnaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC93b3JkY2xvdWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdL2V4dGVybmFsIHtcInJvb3RcIjpcIlBsb3RseVwiLFwiY29tbW9uanMyXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImNvbW1vbmpzXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImFtZFwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCJ9Iiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vZXh0ZXJuYWwge1wicm9vdFwiOlwiV29yZENsb3VkXCIsXCJjb21tb25qczJcIjpcIndvcmRjbG91ZFwiLFwiY29tbW9uanNcIjpcIndvcmRjbG91ZFwiLFwiYW1kXCI6XCJ3b3JkY2xvdWRcIn0iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FB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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxnQkFBZ0I7O0FBRXBFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlDQUFpQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLHFDQUFxQztBQUNsRCxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHlEQUF5RDtBQUN4Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5REFBeUQ7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEIsYUFBYSxvQkFBb0I7QUFDakMsYUFBYSxZQUFZO0FBQ3pCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHdEQUF3RDtBQUN2Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBd0Q7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQXdEO0FBQ3hGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsWUFBWTtBQUN6QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEMsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CO0FBQ2hDLGVBQWU7QUFD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QUNMLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLE1BQU07SUFDTixNQUFNO0lBQ04sSUFBSTtJQUNKLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixHQUFHO0lBQ0gsTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sSUFBSTtJQUNKLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJ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O0lBQ1IsS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULEdBQUc7SUFDSCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxTQUFTO0lBQ1QsT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixXQUFXO0lBQ1gsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFP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Q1AsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxPQUFPO0lBQ1AsSUFBSTtJQUNKLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLElBQUk7SUFDSixPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lB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QkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsaUJBQU0sT0FBTyxXQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxDQXRGOEIsOERBQWMsR0FzRjVDOztBQUVELDBFQUFvQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzRCwwRUFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUQsMEVBQW9CLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUN4S25FLGdFOzs7Ozs7Ozs7OztBQ0FBLHlEOzs7Ozs7Ozs7OztBQ0FBLHVEIiwiZmlsZSI6InN1cnZleS5hbmFseXRpY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcIndvcmRjbG91ZFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleUFuYWx5dGljc1wiLCBbXCJwbG90bHkuanMtZGlzdC1taW5cIiwgXCJzdXJ2ZXktY29yZVwiLCBcIndvcmRjbG91ZFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlBbmFseXRpY3NcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcIndvcmRjbG91ZFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5QW5hbHl0aWNzXCJdID0gZmFjdG9yeShyb290W1wiUGxvdGx5XCJdLCByb290W1wiU3VydmV5XCJdLCByb290W1wiV29yZENsb3VkXCJdKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9wbG90bHlfanNfZGlzdF9taW5fXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9zdXJ2ZXlfY29yZV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3dvcmRjbG91ZF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZW50cmllcy9zdW1tYXJ5LnRzXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgc3R5bGU9XFxcImRpc3BsYXk6bm9uZTtcXFwiPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRldGFpbFxcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCIxMy41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRyYWdcXFwiPjxwYXRoIGQ9XFxcIk0xMyA1bC0xIDEgMSAxSDlWM2wxIDEgMS0xLTMtMy0zIDMgMSAxIDEtMXY0SDNsMS0xLTEtMS0zIDMgMyAzIDEtMS0xLTFoNHY0bC0xLTEtMSAxIDMgMyAzLTMtMS0xLTEgMVY5aDRsLTEgMSAxIDEgMy0zelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWhpZGVcXFwiPjxwYXRoIGQ9XFxcIk0xMi43OSA0LjJMMTYgMWwtMS0xLTMuMzIgMy4zMkMxMC41NyAyLjU1IDkuMzIgMiA4IDIgMy42MyAyIDAgNy45NyAwIDcuOTdzMS4yNyAyLjEgMy4yMSAzLjgybC0zLjIzIDMuMjMuOTguOTggMy4zNS0zLjM0QzUuNDEgMTMuNDQgNi42NyAxNCA4IDE0YzQuMzcgMCA4LTYgOC02cy0xLjI3LTIuMDktMy4yMS0zLjh6TTIgNy45N2MxLjA3LTEuNDcgMy42MS00IDYtNCAuOCAwIDEuNi4yNyAyLjM1LjY4bC0uNzguNzhjLS40Ni0uMjktLjk5LS40Ni0xLjU3LS40Ni0xLjY2IDAtMyAxLjM0LTMgMyAwIC41OC4xNyAxLjExLjQ2IDEuNTdsLS45Ny45N0ExMy4zOCAxMy4zOCAwIDAgMSAyIDcuOTd6bTYgNGMtLjggMC0xLjU5LS4yNy0yLjMzLS42N2wuNzgtLjc3Yy40NS4yNy45OC40NCAxLjU1LjQ0IDEuNjYgMCAzLTEuMzQgMy0zIDAtLjU3LS4xNy0xLjA5LS40NC0xLjU1bC45OC0uOThjMS4xMS44NyAyLjAxIDEuOTEgMi40NiAyLjUyLTEuMDcgMS40OC0zLjYxIDQuMDEtNiA0LjAxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2Vwcml2YXRlXFxcIj48Y2lyY2xlIGN4PVxcXCI4XFxcIiBjeT1cXFwiNFxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTggOGMtMy4zMSAwLTYgMi43My02IDQuNjdTNS4yNyAxNSA4IDE1czYtLjQgNi0yLjMzUzExLjMxIDggOCA4elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2VwdWJsaWNcXFwiPjxjaXJjbGUgY3g9XFxcIjZcXFwiIGN5PVxcXCI1XFxcIiByPVxcXCIzXFxcIj48L2NpcmNsZT48cGF0aCBkPVxcXCJNMTAgNWMwIC4zNC0uMDYuNjctLjE0Ljk5LjA1IDAgLjA5LjAxLjE0LjAxIDEuNjYgMCAzLTEuMzQgMy0zcy0xLjM0LTMtMy0zQzguOTcgMCA4LjA3LjUyIDcuNTMgMS4zIDguOTggMS45MSAxMCAzLjMzIDEwIDV6TTYgOWMtMy4zMSAwLTYgMi43My02IDQuNjdTMy4yNyAxNiA2IDE2czYtLjQgNi0yLjMzUzkuMzEgOSA2IDl6TTEwIDdjLS4xOSAwLS4zOC4wMS0uNTcuMDNhNC4xNCA0LjE0IDAgMCAxLTEuMzcgMS4zOWMzIC44MyA1LjIzIDMuMzEgNS40MiA1LjI4IDEuNDQtLjMxIDIuNTItLjkyIDIuNTItMi4wM0MxNiA5Ljc0IDEzLjMxIDcgMTAgN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tb3ZldG9kZXRhaWxzXFxcIj48Y2lyY2xlIGN4PVxcXCIxLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEyIDFoM3Y5aC0zek0yLjAyIDcuMDJMMSA2IDAgN2wzIDMgMy0zLTEtMS0uOTQuOTRDNC4zMyA0LjczIDYuMjEgMyA4LjUgM2MuMTcgMCAuMzMuMDMuNS4wNVYxLjAzQzguODMgMS4wMSA4LjY3IDEgOC41IDEgNS4wOCAxIDIuMjcgMy42NiAyLjAyIDcuMDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbm9uY29tbWVyY2lhbFxcXCI+PHBhdGggZD1cXFwiTTggMEwwIDE1aDE2TDggMHptMSAxM0g3di0yaDJ2MnptLTItM1Y1aDJ2NUg3elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLXNvcnRpbmdcXFwiPjxwYXRoIGQ9XFxcIk04IDNsMiAyIDEtMS0zLTMtMyAzIDEgMXpNOCAxM2wtMi0yLTEgMSAzIDMgMy0zLTEtMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48L3N2Zz5cIjsiLCIvKipcbiogTXV1cmkgdjAuOC4wXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaVxuKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSGFsdHUgT3lcbiogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaS9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBQYWNrZXJcbiogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBUaWNrZXIgLyBNdXVyaSBFbWl0dGVyIC8gTXV1cmkgUXVldWVcbiogQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5NdXVyaSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBuYW1lc3BhY2UgPSAnTXV1cmknO1xuICB2YXIgZ3JpZEluc3RhbmNlcyA9IHt9O1xuXG4gIHZhciBhY3Rpb25Td2FwID0gJ3N3YXAnO1xuICB2YXIgYWN0aW9uTW92ZSA9ICdtb3ZlJztcblxuICB2YXIgZXZlbnRTeW5jaHJvbml6ZSA9ICdzeW5jaHJvbml6ZSc7XG4gIHZhciBldmVudExheW91dFN0YXJ0ID0gJ2xheW91dFN0YXJ0JztcbiAgdmFyIGV2ZW50TGF5b3V0RW5kID0gJ2xheW91dEVuZCc7XG4gIHZhciBldmVudEFkZCA9ICdhZGQnO1xuICB2YXIgZXZlbnRSZW1vdmUgPSAncmVtb3ZlJztcbiAgdmFyIGV2ZW50U2hvd1N0YXJ0ID0gJ3Nob3dTdGFydCc7XG4gIHZhciBldmVudFNob3dFbmQgPSAnc2hvd0VuZCc7XG4gIHZhciBldmVudEhpZGVTdGFydCA9ICdoaWRlU3RhcnQnO1xuICB2YXIgZXZlbnRIaWRlRW5kID0gJ2hpZGVFbmQnO1xuICB2YXIgZXZlbnRGaWx0ZXIgPSAnZmlsdGVyJztcbiAgdmFyIGV2ZW50U29ydCA9ICdzb3J0JztcbiAgdmFyIGV2ZW50TW92ZSA9ICdtb3ZlJztcbiAgdmFyIGV2ZW50U2VuZCA9ICdzZW5kJztcbiAgdmFyIGV2ZW50QmVmb3JlU2VuZCA9ICdiZWZvcmVTZW5kJztcbiAgdmFyIGV2ZW50UmVjZWl2ZSA9ICdyZWNlaXZlJztcbiAgdmFyIGV2ZW50QmVmb3JlUmVjZWl2ZSA9ICdiZWZvcmVSZWNlaXZlJztcbiAgdmFyIGV2ZW50RHJhZ0luaXQgPSAnZHJhZ0luaXQnO1xuICB2YXIgZXZlbnREcmFnU3RhcnQgPSAnZHJhZ1N0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ01vdmUgPSAnZHJhZ01vdmUnO1xuICB2YXIgZXZlbnREcmFnU2Nyb2xsID0gJ2RyYWdTY3JvbGwnO1xuICB2YXIgZXZlbnREcmFnRW5kID0gJ2RyYWdFbmQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZVN0YXJ0ID0gJ2RyYWdSZWxlYXNlU3RhcnQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZUVuZCA9ICdkcmFnUmVsZWFzZUVuZCc7XG4gIHZhciBldmVudERlc3Ryb3kgPSAnZGVzdHJveSc7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGxpc3RlbmVycyBxdWV1ZSBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdID0gW107XG5cbiAgICAvLyBBZGQgdGhlIGxpc3RlbmVyIHRvIHRoZSBxdWV1ZS5cbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFsbCBldmVudCBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbGlzdGVuZXJdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgYW5kIHJldHVybiBpbW1lZGlhdGVseSBpZiBub25lIGlzIGZvdW5kLlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIG5vIHNwZWNpZmljIGxpc3RlbmVyIGlzIHByb3ZpZGVkIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAgdmFyIGkgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGFsbCBsaXN0ZW5lcnMgaW4gYSBzcGVjaWZpZWQgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHsqfSBbYXJnMV1cbiAgICogQHBhcmFtIHsqfSBbYXJnMl1cbiAgICogQHBhcmFtIHsqfSBbYXJnM11cbiAgICogQHJldHVybnMge0VtaXR0ZXJ9XG4gICAqL1xuICBFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGV2ZW50IGxpc3RlbmVycyBhbmQgcXVpdCBlYXJseSBpZiB0aGVyZSdzIG5vIGxpc3RlbmVycy5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgYUxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQWRkIHRoZSBjdXJyZW50IGxpc3RlbmVycyB0byB0aGUgY2FsbGJhY2sgcXVldWUgYmVmb3JlIHdlIHByb2Nlc3MgdGhlbS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIGxpc3RlbmVycyBhcmUgY2FsbGVkIGluXG4gICAgLy8gY29ycmVjdCBvcmRlciBldmVuIGlmIG5ldyBldmVudCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQvYWRkZWQgZHVyaW5nXG4gICAgLy8gcHJvY2Vzc2luZyBhbmQvb3IgZXZlbnRzIGFyZSBlbWl0dGVkIGR1cmluZyBwcm9jZXNzaW5nLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICB9XG5cbiAgICAvLyBJbmNyZW1lbnQgcXVldWUgY291bnRlci4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzY2VuYXJpb3Mgd2hlcmUgZW1pdCBpc1xuICAgIC8vIHRyaWdnZXJlZCB3aGlsZSB0aGUgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2ZcbiAgICAvLyBob3cgbWFueSBcInF1ZXVlIHByb2Nlc3NvcnNcIiB0aGVyZSBhcmUgYWN0aXZlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZXNldFxuICAgIC8vIHRoZSBxdWV1ZSBpbiB0aGUgZW5kIHdoZW4gdGhlIGxhc3QgcXVldWUgcHJvY2Vzc29yIGlzIGZpbmlzaGVkLlxuICAgICsrdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlICh0aGUgc3BlY2lmaWMgcGFydCBvZiBpdCBmb3IgdGhpcyBlbWl0KS5cbiAgICBmb3IgKGkgPSBxTGVuZ3RoLCBxTGVuZ3RoID0gcXVldWUubGVuZ3RoOyBpIDwgcUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGFMZW5ndGggPT09IDAgPyBxdWV1ZVtpXSgpIDpcbiAgICAgIGFMZW5ndGggPT09IDEgPyBxdWV1ZVtpXShhcmcxKSA6XG4gICAgICBhTGVuZ3RoID09PSAyID8gcXVldWVbaV0oYXJnMSwgYXJnMikgOlxuICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW2ldKGFyZzEsIGFyZzIsIGFyZzMpO1xuXG4gICAgICAvLyBTdG9wIHByb2Nlc3NpbmcgaWYgdGhlIGVtaXR0ZXIgaXMgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEZWNyZW1lbnQgcXVldWUgcHJvY2VzcyBjb3VudGVyLlxuICAgIC0tdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFJlc2V0IHRoZSBxdWV1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBxdWV1ZSBwcm9jZXNzZXMgcnVubmluZy5cbiAgICBpZiAoIXRoaXMuX2NvdW50ZXIpIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBlbWl0dGVyIGluc3RhbmNlLiBCYXNpY2FsbHkganVzdCByZW1vdmVzIGFsbCBib3VuZCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgIHZhciBldmVudDtcblxuICAgIC8vIEZsYWcgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlIChpZiBxdWV1ZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyB0aGlzIHdpbGwgYWxzbyBzdG9wIHRoYXQpLlxuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IHRoaXMuX2NvdW50ZXIgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGlmIChldmVudHNbZXZlbnRdKSB7XG4gICAgICAgIGV2ZW50c1tldmVudF0ubGVuZ3RoID0gMDtcbiAgICAgICAgZXZlbnRzW2V2ZW50XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTZXQgdXAgdGhlIGRlZmF1bHQgZXhwb3J0IHZhbHVlcy5cbiAgdmFyIHRyYW5zZm9ybVN0eWxlID0gJ3RyYW5zZm9ybSc7XG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gJ3RyYW5zZm9ybSc7XG5cbiAgLy8gRmluZCB0aGUgc3VwcG9ydGVkIHRyYW5zZm9ybSBwcm9wIGFuZCBzdHlsZSBuYW1lcy5cbiAgdmFyIGRvY0VsZW1TdHlsZSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG4gIHZhciBzdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgc3R5bGVDYXAgPSAnVHJhbnNmb3JtJztcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIFsnJywgJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddLmZvckVhY2goZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgdmFyIHByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgc3R5bGVDYXAgOiBzdHlsZTtcbiAgICBpZiAoZG9jRWxlbVN0eWxlW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSBwcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRyYW5zZm9ybVN0eWxlID0gcHJlZml4ID8gJy0nICsgcHJlZml4ICsgJy0nICsgc3R5bGUgOiBzdHlsZTtcbiAgICAgIHRyYW5zZm9ybVByb3AgPSBwcm9wTmFtZTtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBzdHlsZXNDYWNoZSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gbmV3IFdlYWtNYXAoKSA6IG51bGw7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBzdHlsZSBwcm9wZXJ0eSBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlKSB7XG4gICAgdmFyIHN0eWxlcyA9IHN0eWxlc0NhY2hlICYmIHN0eWxlc0NhY2hlLmdldChlbGVtZW50KTtcbiAgICBpZiAoIXN0eWxlcykge1xuICAgICAgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICBpZiAoc3R5bGVzQ2FjaGUpIHN0eWxlc0NhY2hlLnNldChlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUgPT09ICd0cmFuc2Zvcm0nID8gdHJhbnNmb3JtU3R5bGUgOiBzdHlsZSk7XG4gIH1cblxuICB2YXIgc3R5bGVOYW1lUmVnRXggPSAvKFtBLVpdKS9nO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGEgY2FtZWwgY2FzZSBzdHlsZSBwcm9wZXJ0eSB0byBrZWJhYiBjYXNlIHN0eWxlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZU5hbWUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0eWxlTmFtZVJlZ0V4LCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHZhciBzdHJGdW5jdGlvbiA9ICdmdW5jdGlvbic7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSBzdHJGdW5jdGlvbjtcbiAgfVxuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSQxID0gJ3RyYW5zZm9ybSc7XG5cbiAgLyoqXG4gICAqIFNldCBpbmxpbmUgc3R5bGVzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIGZvciAodmFyIHByb3AgaW4gc3R5bGVzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3AgPT09IHRyYW5zZm9ybVN0eWxlJDEgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcF0gPSBzdHlsZXNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZW0gYW5pbWF0aW9uIGhhbmRsZXIgcG93ZXJlZCBieSBXZWIgQW5pbWF0aW9ucyBBUEkuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBJdGVtQW5pbWF0ZShlbGVtZW50KSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fcHJvcHMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9rZXlmcmFtZXMgPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zID0ge307XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9vbkZpbmlzaCA9IHRoaXMuX29uRmluaXNoLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaW5zdGFuY2UncyBhbmltYXRpb24uIEF1dG9tYXRpY2FsbHkgc3RvcHMgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXNcbiAgICogcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc0Zyb21cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzVG9cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZWFzaW5nPSdlYXNlJ11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihwcm9wc0Zyb20sIHByb3BzVG8sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRpb247XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjYW5jZWxBbmltYXRpb24gPSBmYWxzZTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXhpc3RpbmcgYW5pbWF0aW9uIHJ1bm5pbmcsIGxldCdzIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlXG4gICAgLy8gY2FuY2VsbGVkIG9yIGlmIGl0IGNhbiBjb250aW51ZSBydW5uaW5nLlxuICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgIHZhciBwcm9wQ291bnQgPSAwO1xuICAgICAgdmFyIHByb3BJbmRleDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBhbmltYXRpb24gdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGVcbiAgICAgIC8vIGN1cnJlbnQgcHJvcHMgYW5kIHZhbHVlcy5cbiAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgICAgKytwcm9wQ291bnQ7XG4gICAgICAgIHByb3BJbmRleCA9IGN1cnJlbnRQcm9wcy5pbmRleE9mKHByb3BOYW1lKTtcbiAgICAgICAgaWYgKHByb3BJbmRleCA9PT0gLTEgfHwgcHJvcHNUb1twcm9wTmFtZV0gIT09IGN1cnJlbnRWYWx1ZXNbcHJvcEluZGV4XSkge1xuICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBwcm9wcyBjb3VudCBtYXRjaGVzIGN1cnJlbnQgcHJvcHMgY291bnQuIFRoaXMgaXNcbiAgICAgIC8vIG5lZWRlZCBmb3IgdGhlIGVkZ2UgY2FzZSBzY2VuYXJpbyB3aGVyZSB0YXJnZXQgcHJvcHMgY29udGFpbiB0aGUgc2FtZVxuICAgICAgLy8gc3R5bGVzIGFzIGN1cnJlbnQgcHJvcHMsIGJ1dCB0aGUgY3VycmVudCBwcm9wcyBoYXZlIHNvbWUgYWRkaXRpb25hbFxuICAgICAgLy8gcHJvcHMuXG4gICAgICBpZiAoIWNhbmNlbEFuaW1hdGlvbiAmJiBwcm9wQ291bnQgIT09IGN1cnJlbnRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIChpZiByZXF1aXJlZCkuXG4gICAgaWYgKGNhbmNlbEFuaW1hdGlvbikgYW5pbWF0aW9uLmNhbmNlbCgpO1xuXG4gICAgLy8gU3RvcmUgYW5pbWF0aW9uIGNhbGxiYWNrLlxuICAgIHRoaXMuX2NhbGxiYWNrID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHJ1bm5pbmcgYW5pbWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0byBiZSBjYW5jZWxsZWQsIGxldCdzXG4gICAgLy8gY2FsbCBpdCBhIGRheSBoZXJlIGFuZCBsZXQgaXQgcnVuLlxuICAgIGlmIChhbmltYXRpb24gJiYgIWNhbmNlbEFuaW1hdGlvbikgcmV0dXJuO1xuXG4gICAgLy8gU3RvcmUgdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgdG8gaW5zdGFuY2UuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgICBmb3IgKHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgIGN1cnJlbnRQcm9wcy5wdXNoKHByb3BOYW1lKTtcbiAgICAgIGN1cnJlbnRWYWx1ZXMucHVzaChwcm9wc1RvW3Byb3BOYW1lXSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGtleWZyYW1lcy5cbiAgICB2YXIgYW5pbUtleWZyYW1lcyA9IHRoaXMuX2tleWZyYW1lcztcbiAgICBhbmltS2V5ZnJhbWVzWzBdID0gcHJvcHNGcm9tO1xuICAgIGFuaW1LZXlmcmFtZXNbMV0gPSBwcm9wc1RvO1xuXG4gICAgLy8gU2V0IHVwIG9wdGlvbnMuXG4gICAgdmFyIGFuaW1PcHRpb25zID0gdGhpcy5fb3B0aW9ucztcbiAgICBhbmltT3B0aW9ucy5kdXJhdGlvbiA9IG9wdHMuZHVyYXRpb24gfHwgMzAwO1xuICAgIGFuaW1PcHRpb25zLmVhc2luZyA9IG9wdHMuZWFzaW5nIHx8ICdlYXNlJztcblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgYW5pbWF0aW9uID0gZWxlbWVudC5hbmltYXRlKGFuaW1LZXlmcmFtZXMsIGFuaW1PcHRpb25zKTtcbiAgICBhbmltYXRpb24ub25maW5pc2ggPSB0aGlzLl9vbkZpbmlzaDtcbiAgICB0aGlzLl9hbmltYXRpb24gPSBhbmltYXRpb247XG5cbiAgICAvLyBTZXQgdGhlIGVuZCBzdHlsZXMuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBlbGVtZW50IHN0YXlzIGF0IHRoZSBlbmRcbiAgICAvLyB2YWx1ZXMgYWZ0ZXIgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLlxuICAgIHNldFN0eWxlcyhlbGVtZW50LCBwcm9wc1RvKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCBpbnN0YW5jZSdzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3N0eWxlc11cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oc3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9hbmltYXRpb24pIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgdmFyIGN1cnJlbnRWYWx1ZXMgPSB0aGlzLl92YWx1ZXM7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBwcm9wVmFsdWU7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBDYWxjdWxhdGUgKGlmIG5vdCBwcm92aWRlZCkgYW5kIHNldCBzdHlsZXMuXG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50UHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJvcE5hbWUgPSBjdXJyZW50UHJvcHNbaV07XG4gICAgICAgIHByb3BWYWx1ZSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wTmFtZSkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BOYW1lID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVByb3AgOiBwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cblxuICAgIC8vICBDYW5jZWwgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICB0aGlzLl9hbmltYXRpb24gPSB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgYmVpbmcgYW5pbWF0ZWQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5pc0FuaW1hdGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2FuaW1hdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9vcHRpb25zID0gdGhpcy5fa2V5ZnJhbWVzID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQW5pbWF0aW9uIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2s7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgdmFyIHZlbmRvclByZWZpeGVzID0gWycnLCAnd2Via2l0JywgJ21veicsICdtcycsICdvJywgJ1dlYmtpdCcsICdNb3onLCAnTVMnLCAnTyddO1xuXG4gIC8qKlxuICAgKiBHZXQgcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUgd2hlbiBnaXZlbiBhIG5vbi1wcmVmaXhlZCBDU1MgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1TdHlsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcE5hbWVcbiAgICogQHJldHVybnMgeyFTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1TdHlsZSwgcHJvcE5hbWUpIHtcbiAgICB2YXIgY2FtZWxQcm9wTmFtZSA9IHByb3BOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wTmFtZS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZWZpeDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wTmFtZTtcblxuICAgIHdoaWxlIChpIDwgdmVuZG9yUHJlZml4ZXMubGVuZ3RoKSB7XG4gICAgICBwcmVmaXggPSB2ZW5kb3JQcmVmaXhlc1tpXTtcbiAgICAgIHByZWZpeGVkUHJvcE5hbWUgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3BOYW1lIDogcHJvcE5hbWU7XG4gICAgICBpZiAocHJlZml4ZWRQcm9wTmFtZSBpbiBlbGVtU3R5bGUpIHJldHVybiBwcmVmaXhlZFByb3BOYW1lO1xuICAgICAgKytpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGR0ID0gMTAwMCAvIDYwO1xuXG4gIHZhciByYWYgPSAoXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKGR0KTtcbiAgICAgIH0sIGR0KTtcbiAgICB9XG4gICkuYmluZCh3aW5kb3cpO1xuXG4gIC8vIERldGVjdCBzdXBwb3J0IGZvciBwYXNzaXZlIGV2ZW50czpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQjZmVhdHVyZS1kZXRlY3Rpb25cbiAgdmFyIGlzUGFzc2l2ZUV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBwYXNzaXZlT3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVPcHRzKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgLy8gRHJhZ2dlciBldmVudHMuXG4gIHZhciBldmVudHMgPSB7XG4gICAgc3RhcnQ6ICdzdGFydCcsXG4gICAgbW92ZTogJ21vdmUnLFxuICAgIGVuZDogJ2VuZCcsXG4gICAgY2FuY2VsOiAnY2FuY2VsJ1xuICB9O1xuXG4gIHZhciBoYXNUb3VjaEV2ZW50cyA9ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuVG91Y2hFdmVudCk7XG4gIHZhciBoYXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xuICB2YXIgaGFzTXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG4gIHZhciBpc0FuZHJvaWQgPSAvKGFuZHJvaWQpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBsaXN0ZW5lck9wdGlvbnMgPSBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlO1xuXG4gIHZhciB0YVByb3AgPSAndG91Y2hBY3Rpb24nO1xuICB2YXIgdGFQcm9wUHJlZml4ZWQgPSBnZXRQcmVmaXhlZFByb3BOYW1lKHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsIHRhUHJvcCk7XG4gIHZhciB0YURlZmF1bHRWYWx1ZSA9ICdhdXRvJztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEcmFnZ2VyIGluc3RhbmNlIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3NzUHJvcHNdXG4gICAqL1xuICBmdW5jdGlvbiBEcmFnZ2VyKGVsZW1lbnQsIGNzc1Byb3BzKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jc3NQcm9wcyA9IHt9O1xuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gJyc7XG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5fc3RhcnRYID0gMDtcbiAgICB0aGlzLl9zdGFydFkgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRYID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WSA9IDA7XG5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uU3RhcnQgPSB0aGlzLl9vblN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Nb3ZlID0gdGhpcy5fb25Nb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25DYW5jZWwgPSB0aGlzLl9vbkNhbmNlbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRW5kID0gdGhpcy5fb25FbmQuYmluZCh0aGlzKTtcblxuICAgIC8vIEFwcGx5IGluaXRpYWwgY3NzIHByb3BzLlxuICAgIHRoaXMuc2V0Q3NzUHJvcHMoY3NzUHJvcHMpO1xuXG4gICAgLy8gSWYgdG91Y2ggYWN0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2l0aCBpbml0aWFsIGNzcyBwcm9wcyBsZXQncyBhc3N1bWUgaXQnc1xuICAgIC8vIGF1dG8uXG4gICAgaWYgKCF0aGlzLl90b3VjaEFjdGlvbikge1xuICAgICAgdGhpcy5zZXRUb3VjaEFjdGlvbih0YURlZmF1bHRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBuYXRpdmUgbGluay9pbWFnZSBkcmFnZ2luZyBmb3IgdGhlIGl0ZW0gYW5kIGl0J3MgYW5jZXN0b3JzLlxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIExpc3RlbiB0byBzdGFydCBldmVudC5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fZXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSB0b3VjaCBldmVudHMsIGJ1dCBubyBwb2ludGVyIGV2ZW50cyB3ZSBuZWVkIHRvIGFsc28gbGlzdGVuIGZvclxuICAgIC8vIG1vdXNlIGV2ZW50cyBpbiBhZGRpdGlvbiB0byB0b3VjaCBldmVudHMgZm9yIGRldmljZXMgd2hpY2ggc3VwcG9ydCBib3RoXG4gICAgLy8gbW91c2UgYW5kIHRvdWNoIGludGVyYWN0aW9uLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cyAmJiAhaGFzUG9pbnRlckV2ZW50cyAmJiAhaGFzTXNQb2ludGVyRXZlbnRzKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3BvaW50ZXJFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdwb2ludGVyZG93bicsXG4gICAgbW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgICBjYW5jZWw6ICdwb2ludGVyY2FuY2VsJyxcbiAgICBlbmQ6ICdwb2ludGVydXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnTVNQb2ludGVyRG93bicsXG4gICAgbW92ZTogJ01TUG9pbnRlck1vdmUnLFxuICAgIGNhbmNlbDogJ01TUG9pbnRlckNhbmNlbCcsXG4gICAgZW5kOiAnTVNQb2ludGVyVXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fdG91Y2hFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3ZlOiAndG91Y2htb3ZlJyxcbiAgICBjYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gICAgZW5kOiAndG91Y2hlbmQnXG4gIH07XG5cbiAgRHJhZ2dlci5fbW91c2VFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdtb3VzZWRvd24nLFxuICAgIG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIGNhbmNlbDogJycsXG4gICAgZW5kOiAnbW91c2V1cCdcbiAgfTtcblxuICBEcmFnZ2VyLl9ldmVudHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGhhc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNNc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9tc1BvaW50ZXJFdmVudHM7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fdG91Y2hFdmVudHM7XG4gICAgcmV0dXJuIERyYWdnZXIuX21vdXNlRXZlbnRzO1xuICB9KSgpO1xuXG4gIERyYWdnZXIuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0ICYmIGUuY2FuY2VsYWJsZSAhPT0gZmFsc2UpIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9hY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuZW5kLCBpbnN0YW5jZS5fb25FbmQpO1xuXG4gICAgaWYgKERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH07XG5cbiAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLm1vdmUsIGluc3RhbmNlLl9vbk1vdmUpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmICghRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmxlbmd0aCkge1xuICAgICAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl91bmJpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwb2ludGVyIGlkIGF2YWlsYWJsZSBsZXQncyB1c2UgaXQuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkO1xuICAgIH1cblxuICAgIC8vIEZvciB0b3VjaCBldmVudHMgbGV0J3MgZ2V0IHRoZSBmaXJzdCBjaGFuZ2VkIHRvdWNoJ3MgaWRlbnRpZmllci5cbiAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHtcbiAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgcHJvdmlkZSBhIHN0YXRpYyBpZC5cbiAgICByZXR1cm4gMTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRUb3VjaEJ5SWQgPSBmdW5jdGlvbihldmVudCwgaWQpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9pbnRlciBldmVudCByZXR1cm4gdGhlIHdob2xlIGV2ZW50IGlmIHRoZXJlJ3MgYSBtYXRjaCwgYW5kXG4gICAgLy8gbnVsbCBvdGhlcndpc2UuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkID09PSBpZCA/IGV2ZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGNoZWNrIGlmIHRoZXJlJ3MgYSBjaGFuZ2VkIHRvdWNoIG9iamVjdCB0aGF0IG1hdGNoZXNcbiAgICAvLyB0aGUgcG9pbnRlcklkIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZSB0b3VjaCBvYmplY3QuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyID09PSBpZCkge1xuICAgICAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vdXNlL290aGVyIGV2ZW50cyBsZXQncyBhc3N1bWUgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGFuZCBqdXN0XG4gICAgLy8gcmV0dXJuIHRoZSBldmVudC5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMubW92ZSwgZSk7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uRW5kID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuZW5kLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBjdXJyZW50IGRyYWcgb3BlcmF0aW9uIChpZiBhbnkpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjdXN0b20gZHJhZ2dlciBldmVudCBmcm9tIGEgcmF3IGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICogQHJldHVybnMge0RyYWdnZXJFdmVudH1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9jcmVhdGVFdmVudCA9IGZ1bmN0aW9uKHR5cGUsIGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEhhbW1lci5qcyBjb21wYXRpYmlsaXR5IGludGVyZmFjZS5cbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBzcmNFdmVudDogZSxcbiAgICAgIGRpc3RhbmNlOiB0aGlzLmdldERpc3RhbmNlKCksXG4gICAgICBkZWx0YVg6IHRoaXMuZ2V0RGVsdGFYKCksXG4gICAgICBkZWx0YVk6IHRoaXMuZ2V0RGVsdGFZKCksXG4gICAgICBkZWx0YVRpbWU6IHR5cGUgPT09IGV2ZW50cy5zdGFydCA/IDAgOiB0aGlzLmdldERlbHRhVGltZSgpLFxuICAgICAgaXNGaXJzdDogdHlwZSA9PT0gZXZlbnRzLnN0YXJ0LFxuICAgICAgaXNGaW5hbDogdHlwZSA9PT0gZXZlbnRzLmVuZCB8fCB0eXBlID09PSBldmVudHMuY2FuY2VsLFxuICAgICAgLy8gUGFydGlhbCBUb3VjaCBBUEkgaW50ZXJmYWNlLlxuICAgICAgaWRlbnRpZmllcjogdGhpcy5fcG9pbnRlcklkLFxuICAgICAgc2NyZWVuWDogdG91Y2guc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IHRvdWNoLnNjcmVlblksXG4gICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICAgIHBhZ2VYOiB0b3VjaC5wYWdlWCxcbiAgICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgICAgIHRhcmdldDogdG91Y2gudGFyZ2V0XG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhIHJhdyBldmVudCBhcyBkcmFnZ2VyIGV2ZW50IGludGVybmFsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2VtaXQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0KHR5cGUsIHRoaXMuX2NyZWF0ZUV2ZW50KHR5cGUsIGUpKTtcbiAgfTtcblxuICAvKipcbiAgICogSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgUG9pbnRlckV2ZW50IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGl0IGlmIGl0IGhhc1xuICAgKiB0aGUgc2FtZSBwb2ludGVySWQgYXMgdGhlIGluc3RhbmNlLiBJZiB0aGUgcHJvdmlkZWQgZXZlbnQgaXMgYSBUb3VjaEV2ZW50XG4gICAqIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGxvb2sgZm9yIGEgVG91Y2ggaW5zdGFuY2UgaW4gdGhlIGNoYW5nZWRUb3VjaGVzIHRoYXRcbiAgICogaGFzIGFuIGlkZW50aWZpZXIgbWF0Y2hpbmcgdGhpcyBpbnN0YW5jZSdzIHBvaW50ZXJJZC4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50XG4gICAqIGlzIGEgTW91c2VFdmVudCAob3IganVzdCBhbnkgb3RoZXIgZXZlbnQgdGhhbiBQb2ludGVyRXZlbnQgb3IgVG91Y2hFdmVudClcbiAgICogaXQgd2lsbCBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKiBAcmV0dXJucyB7PyhUb3VjaHxQb2ludGVyRXZlbnR8TW91c2VFdmVudCl9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fZ2V0VHJhY2tlZFRvdWNoID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHJhZ2dlci5fZ2V0VG91Y2hCeUlkKGUsIHRoaXMuX3BvaW50ZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBIHByZS1oYW5kbGVyIGZvciBzdGFydCBldmVudCB0aGF0IGNoZWNrcyBpZiB3ZSBjYW4gc3RhcnQgZHJhZ2dpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGJlaW5nIGRyYWdnZWQgY3VycmVudGx5LlxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkgcmV0dXJuO1xuXG4gICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMS5cbiAgICBpZiAoaXNBbmRyb2lkICYmIGUuY2FuY2VsYWJsZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIC8vIE1ha2Ugc3VyZSBsZWZ0IGJ1dHRvbiBpcyBwcmVzc2VkIG9uIG1vdXNlLlxuICAgIGlmIChlLmJ1dHRvbikgcmV0dXJuO1xuXG4gICAgLy8gR2V0IChhbmQgc2V0KSBwb2ludGVyIGlkLlxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IERyYWdnZXIuX2dldEV2ZW50UG9pbnRlcklkKGUpO1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRoZSBzdGFydCBldmVudCBhbmQgdHJpZ2dlciBzdGFydCAoYXN5bmMgb3Igc3luYykuIFBvaW50ZXIgZXZlbnRzXG4gICAgLy8gYXJlIGVtaXR0ZWQgYmVmb3JlIHRvdWNoIGV2ZW50cyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBib3RoIG9mIHRoZW0uIEFuZFxuICAgIC8vIGlmIHlvdSB0cnkgdG8gbW92ZSBhbiBlbGVtZW50IGJlZm9yZSBgdG91Y2hzdGFydGAgaXMgZW1pdHRlZCB0aGUgcG9pbnRlclxuICAgIC8vIGV2ZW50cyBmb3IgdGhhdCBlbGVtZW50IHdpbGwgYmUgY2FuY2VsZWQuIFRoZSBmaXggaXMgdG8gZGVsYXkgdGhlIGVtaXR0ZWRcbiAgICAvLyBwb2ludGVyIGV2ZW50cyBpbiBzdWNoIGEgc2NlbmFyaW8gYnkgb25lIGZyYW1lIHNvIHRoYXQgYHRvdWNoc3RhcnRgIGhhc1xuICAgIC8vIHRpbWUgdG8gYmUgZW1pdHRlZCBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgKHBvdGVudGlhbGx5KSBtb3ZlZC5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gZTtcbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgKGhhc1BvaW50ZXJFdmVudHMgfHwgaGFzTXNQb2ludGVyRXZlbnRzKSkge1xuICAgICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgICAgLy8gc3RhcnRpbmcgaWYgbmF0aXZlIHNjcm9sbGluZyBpcyBpbiBwcm9ncmVzcy4gUGFydCAyLlxuICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmFmKHRoaXMuX29uU3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXJ0KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBYm9ydCBzdGFydCBldmVudCBpZiBpdCB0dXJucyBvdXQgdG8gYmUgbm9uLWNhbmNlbGFibGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCxcbiAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICk7XG5cbiAgICBpZiAodGhpcy5fc3RhcnRFdmVudCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZHJhZyBwcm9jZWR1cmUgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZSA9IHRoaXMuX3N0YXJ0RXZlbnQ7XG4gICAgaWYgKCFlKSByZXR1cm47XG5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdXAgaW5pdCBkYXRhIGFuZCBlbWl0IHN0YXJ0IGV2ZW50LlxuICAgIHRoaXMuX3N0YXJ0WCA9IHRoaXMuX2N1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICB0aGlzLl9zdGFydFkgPSB0aGlzLl9jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5zdGFydCwgZSk7XG4gICAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX2VtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBtb3ZlIGNhbmNlbCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmNhbmNlbCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgZW5kIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoIXRoaXMuX2dldFRyYWNrZWRUb3VjaChlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZW1pdChldmVudHMuZW5kLCBlKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZWxlbWVudCBpcyBiZWluZyBkcmFnZ2VkIGF0IHRoZSBtb21lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuaXNEcmFnZ2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wb2ludGVySWQgIT09IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBlbGVtZW50J3MgdG91Y2gtYWN0aW9uIENTUyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgLy8gU3RvcmUgdW5tb2RpZmllZCB0b3VjaCBhY3Rpb24gdmFsdWUgKHdlIHRydXN0IHVzZXIgaW5wdXQgaGVyZSkuXG4gICAgdGhpcy5fdG91Y2hBY3Rpb24gPSB2YWx1ZTtcblxuICAgIC8vIFNldCB0b3VjaC1hY3Rpb24gc3R5bGUuXG4gICAgaWYgKHRhUHJvcFByZWZpeGVkKSB7XG4gICAgICB0aGlzLl9jc3NQcm9wc1t0YVByb3BQcmVmaXhlZF0gPSAnJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiB1bnN1cHBvcnRlZCB0b3VjaC1hY3Rpb24gdmFsdWUgbGV0J3MgYWRkIGEgc3BlY2lhbCBsaXN0ZW5lclxuICAgIC8vIHRoYXQgcHJldmVudHMgZGVmYXVsdCBhY3Rpb24gb24gdG91Y2ggc3RhcnQgZXZlbnQuIEEgZGlydHkgaGFjaywgYnV0IGJlc3RcbiAgICAvLyB3ZSBjYW4gZG8gZm9yIG5vdy4gVGhlIG90aGVyIG9wdGlvbnMgd291bGQgYmUgdG8gc29tZWhvdyBwb2x5ZmlsbCB0aGVcbiAgICAvLyB1bnN1cHBvcnRlZCB0b3VjaCBhY3Rpb24gYmVoYXZpb3Igd2l0aCBjdXN0b20gaGV1cmlzdGljcyB3aGljaCBzb3VuZHMgbGlrZVxuICAgIC8vIGEgY2FuIG9mIHdvcm1zLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cykge1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgZWxlbWVudCdzIENTUyBwcm9wZXJ0aWVzLiBBY2NlcHRzIGFuIG9iamVjdCB3aXRoIGNhbWVsIGNhc2VkIHN0eWxlXG4gICAqIHByb3BzIHdpdGggdmFsdWUgcGFpcnMgYXMgaXQncyBmaXJzdCBhcmd1bWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtuZXdQcm9wc11cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLnNldENzc1Byb3BzID0gZnVuY3Rpb24obmV3UHJvcHMpIHtcbiAgICBpZiAoIW5ld1Byb3BzKSByZXR1cm47XG5cbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fY3NzUHJvcHM7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBwcm9wO1xuICAgIHZhciBwcmVmaXhlZFByb3A7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBjdXJyZW50UHJvcHMpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBjdXJyZW50UHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgY3VycmVudFByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFNldCBuZXcgcHJvcHMuXG4gICAgZm9yIChwcm9wIGluIG5ld1Byb3BzKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciB0aGUgcHJvcC5cbiAgICAgIGlmICghbmV3UHJvcHNbcHJvcF0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0b3VjaC1hY3Rpb24uXG4gICAgICBpZiAocHJvcCA9PT0gdGFQcm9wKSB7XG4gICAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24obmV3UHJvcHNbcHJvcF0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHByZWZpeGVkIHByb3AgYW5kIHNraXAgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICBwcmVmaXhlZFByb3AgPSBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1lbnQuc3R5bGUsIHByb3ApO1xuICAgICAgaWYgKCFwcmVmaXhlZFByb3ApIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTdG9yZSB0aGUgcHJvcCBhbmQgYWRkIHRoZSBzdHlsZS5cbiAgICAgIGN1cnJlbnRQcm9wc1twcmVmaXhlZFByb3BdID0gJyc7XG4gICAgICBlbGVtZW50LnN0eWxlW3ByZWZpeGVkUHJvcF0gPSBuZXdQcm9wc1twcm9wXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBtdWNoIHRoZSBwb2ludGVyIGhhcyBtb3ZlZCBvbiB4LWF4aXMgZnJvbSBzdGFydCBwb3NpdGlvbiwgaW4gcGl4ZWxzLlxuICAgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgbW92ZW1lbnQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGVsdGFYID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRYIC0gdGhpcy5fc3RhcnRYO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geS1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gdG9wIHRvIGJvdHRvbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WSAtIHRoaXMuX3N0YXJ0WTtcbiAgfTtcblxuICAvKipcbiAgICogSG93IGZhciAoaW4gcGl4ZWxzKSBoYXMgcG9pbnRlciBtb3ZlZCBmcm9tIHN0YXJ0IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuZ2V0RGVsdGFYKCk7XG4gICAgdmFyIHkgPSB0aGlzLmdldERlbHRhWSgpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGhhcyBwb2ludGVyIGJlZW4gZHJhZ2dlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhVGltZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWUgPyBEYXRlLm5vdygpIC0gdGhpcy5fc3RhcnRUaW1lIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50cywgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHVuYmluZCBhbGwgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcblxuICAgIC8vIFJlc2V0IGRhdGEgYW5kIGRlYWN0aXZhdGUgdGhlIGluc3RhbmNlLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBEZXN0cm95IGVtaXR0ZXIuXG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIFJlc2V0IHN0eWxlcy5cbiAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX2Nzc1Byb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgZGF0YS5cbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIE1hcmsgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQSB0aWNrZXIgc3lzdGVtIGZvciBoYW5kbGluZyBET00gcmVhZHMgYW5kIHdyaXRlcyBpbiBhbiBlZmZpY2llbnQgd2F5LlxuICAgKiBDb250YWlucyBhIHJlYWQgcXVldWUgYW5kIGEgd3JpdGUgcXVldWUgdGhhdCBhcmUgcHJvY2Vzc2VkIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZSB3aGVuIG5lZWRlZC5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBUaWNrZXIoKSB7XG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9yZWFkcyA9IHt9O1xuICAgIHRoaXMuX3dyaXRlcyA9IHt9O1xuXG4gICAgdGhpcy5fYmF0Y2ggPSBbXTtcbiAgICB0aGlzLl9iYXRjaFJlYWRzID0ge307XG4gICAgdGhpcy5fYmF0Y2hXcml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX3N0ZXAgPSB0aGlzLl9zdGVwLmJpbmQodGhpcyk7XG4gIH1cblxuICBUaWNrZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGlkLCByZWFkT3BlcmF0aW9uLCB3cml0ZU9wZXJhdGlvbiwgaXNQcmlvcml0aXplZCkge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiBhbiBpdGVtIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZXMgd2l0aCB0aGUgc2FtZSBpZFxuICAgIC8vIGFuZCBpZiBzbyAtPiByZW1vdmUgaXQuXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuX3F1ZXVlLmluZGV4T2YoaWQpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPiAtMSkgdGhpcy5fcXVldWVbY3VycmVudEluZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEFkZCBlbnRyeS5cbiAgICBpc1ByaW9yaXRpemVkID8gdGhpcy5fcXVldWUudW5zaGlmdChpZCkgOiB0aGlzLl9xdWV1ZS5wdXNoKGlkKTtcbiAgICB0aGlzLl9yZWFkc1tpZF0gPSByZWFkT3BlcmF0aW9uO1xuICAgIHRoaXMuX3dyaXRlc1tpZF0gPSB3cml0ZU9wZXJhdGlvbjtcblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGtpY2stc3RhcnQgdGhlIG5leHQgdGljayBpZiBpdCBpcyBub3QgcnVubmluZyB5ZXQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCkgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gIH07XG5cbiAgVGlja2VyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbihpZCkge1xuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgdGhpcy5fcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX3dyaXRlc1tpZF07XG4gICAgfVxuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuX3N0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcmVhZHMgPSB0aGlzLl9yZWFkcztcbiAgICB2YXIgd3JpdGVzID0gdGhpcy5fd3JpdGVzO1xuICAgIHZhciBiYXRjaCA9IHRoaXMuX2JhdGNoO1xuICAgIHZhciBiYXRjaFJlYWRzID0gdGhpcy5fYmF0Y2hSZWFkcztcbiAgICB2YXIgYmF0Y2hXcml0ZXMgPSB0aGlzLl9iYXRjaFdyaXRlcztcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpZDtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlc2V0IHRpY2tlci5cbiAgICB0aGlzLl9uZXh0U3RlcCA9IG51bGw7XG5cbiAgICAvLyBTZXR1cCBxdWV1ZXMgYW5kIGNhbGxiYWNrIHBsYWNlaG9sZGVycy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gcXVldWVbaV07XG4gICAgICBpZiAoIWlkKSBjb250aW51ZTtcblxuICAgICAgYmF0Y2gucHVzaChpZCk7XG5cbiAgICAgIGJhdGNoUmVhZHNbaWRdID0gcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHJlYWRzW2lkXTtcblxuICAgICAgYmF0Y2hXcml0ZXNbaWRdID0gd3JpdGVzW2lkXTtcbiAgICAgIGRlbGV0ZSB3cml0ZXNbaWRdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcm9jZXNzIHJlYWQgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFJlYWRzW2lkXSkge1xuICAgICAgICBiYXRjaFJlYWRzW2lkXSgpO1xuICAgICAgICBkZWxldGUgYmF0Y2hSZWFkc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB3cml0ZSBjYWxsYmFja3MuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IGJhdGNoW2ldO1xuICAgICAgaWYgKGJhdGNoV3JpdGVzW2lkXSkge1xuICAgICAgICBiYXRjaFdyaXRlc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoV3JpdGVzW2lkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBiYXRjaC5cbiAgICBiYXRjaC5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIG5lZWRlZC5cbiAgICBpZiAoIXRoaXMuX25leHRTdGVwICYmIHF1ZXVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0aWNrZXIgPSBuZXcgVGlja2VyKCk7XG5cbiAgdmFyIGxheW91dFRpY2sgPSAnbGF5b3V0JztcbiAgdmFyIHZpc2liaWxpdHlUaWNrID0gJ3Zpc2liaWxpdHknO1xuICB2YXIgbW92ZVRpY2sgPSAnbW92ZSc7XG4gIHZhciBzY3JvbGxUaWNrID0gJ3Njcm9sbCc7XG4gIHZhciBwbGFjZWhvbGRlclRpY2sgPSAncGxhY2Vob2xkZXInO1xuXG4gIGZ1bmN0aW9uIGFkZExheW91dFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBsYXlvdXRUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTGF5b3V0VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBsYXlvdXRUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZpc2liaWxpdHlUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyB2aXNpYmlsaXR5VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRNb3ZlVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIG1vdmVUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTW92ZVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbW92ZVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkU2Nyb2xsVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHNjcm9sbFRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxTY3JvbGxUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHNjcm9sbFRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgcGxhY2Vob2xkZXJUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljayk7XG4gIH1cblxuICB2YXIgRWxQcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgdmFyIG1hdGNoZXNGbiA9XG4gICAgRWxQcm90by5tYXRjaGVzIHx8XG4gICAgRWxQcm90by5tYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgbWF0Y2hlcyBhIENTUyBzZWxlY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbWF0Y2hlc0ZuLmNhbGwoZWwsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY2xhc3MgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB0ZW1wQXJyYXkgPSBbXTtcbiAgdmFyIG51bWJlclR5cGUgPSAnbnVtYmVyJztcblxuICAvKipcbiAgICogSW5zZXJ0IGFuIGl0ZW0gb3IgYW4gYXJyYXkgb2YgaXRlbXMgdG8gYXJyYXkgdG8gYSBzcGVjaWZpZWQgaW5kZXguIE11dGF0ZXNcbiAgICogdGhlIGFycmF5LiBUaGUgaW5kZXggY2FuIGJlIG5lZ2F0aXZlIGluIHdoaWNoIGNhc2UgdGhlIGl0ZW1zIHdpbGwgYmUgYWRkZWRcbiAgICogdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbmRleD0tMV1cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5zZXJ0KGFycmF5LCBpdGVtcywgaW5kZXgpIHtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHR5cGVvZiBpbmRleCA9PT0gbnVtYmVyVHlwZSA/IGluZGV4IDogLTE7XG4gICAgaWYgKHN0YXJ0SW5kZXggPCAwKSBzdGFydEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gc3RhcnRJbmRleCArIDE7XG5cbiAgICBhcnJheS5zcGxpY2UuYXBwbHkoYXJyYXksIHRlbXBBcnJheS5jb25jYXQoc3RhcnRJbmRleCwgMCwgaXRlbXMpKTtcbiAgICB0ZW1wQXJyYXkubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYXJyYXkgaW5kZXguIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgcHJvdmlkZWRcbiAgICogYXJyYXkgaW5kZXggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHByb3ZpZGVkIGFycmF5IGFuZCBhbHNvIHRyYW5zZm9ybXNcbiAgICogbmVnYXRpdmUgaW5kZXggdG8gdGhlIG1hdGNoaW5nIHBvc2l0aXZlIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc01pZ3JhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgsIGlzTWlncmF0aW9uKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgbWF4SW5kZXggPSBNYXRoLm1heCgwLCBpc01pZ3JhdGlvbiA/IGxlbmd0aCA6IGxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBpbmRleCA+IG1heEluZGV4ID8gbWF4SW5kZXggOiBpbmRleCA8IDAgPyBNYXRoLm1heChtYXhJbmRleCArIGluZGV4ICsgMSwgMCkgOiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFycmF5IGl0ZW0gdG8gYW5vdGhlciBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZyb21JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgbW92ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBtb3ZlZCB0by5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TW92ZShhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgZnJvbSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGZyb21JbmRleCk7XG4gICAgdmFyIHRvID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgdG9JbmRleCk7XG5cbiAgICAvLyBBZGQgdGFyZ2V0IGl0ZW0gdG8gdGhlIG5ldyBwb3NpdGlvbi5cbiAgICBpZiAoZnJvbSAhPT0gdG8pIHtcbiAgICAgIGFycmF5LnNwbGljZSh0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCBhcnJheSBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gd2l0aEluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBvdGhlciBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTd2FwKGFycmF5LCBpbmRleCwgd2l0aEluZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgaW5kZXhBID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgpO1xuICAgIHZhciBpbmRleEIgPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCB3aXRoSW5kZXgpO1xuICAgIHZhciB0ZW1wO1xuXG4gICAgLy8gU3dhcCB0aGUgaXRlbXMuXG4gICAgaWYgKGluZGV4QSAhPT0gaW5kZXhCKSB7XG4gICAgICB0ZW1wID0gYXJyYXlbaW5kZXhBXTtcbiAgICAgIGFycmF5W2luZGV4QV0gPSBhcnJheVtpbmRleEJdO1xuICAgICAgYXJyYXlbaW5kZXhCXSA9IHRlbXA7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjdGlvbkNhbmNlbCA9ICdjYW5jZWwnO1xuICB2YXIgYWN0aW9uRmluaXNoID0gJ2ZpbmlzaCc7XG4gIHZhciBkZWJvdW5jZVRpY2sgPSAnZGVib3VuY2UnO1xuICB2YXIgZGVib3VuY2VJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAgICogYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICAgKiBOIG1pbGxpc2Vjb25kcy4gVGhlIHJldHVybmVkIGZ1bmN0aW9uIGFjY2VwdHMgb25lIGFyZ3VtZW50IHdoaWNoLCB3aGVuXG4gICAqIGJlaW5nIFwiZmluaXNoXCIsIGNhbGxzIHRoZSBkZWJvdW5jZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBpZiBpdCBpcyBjdXJyZW50bHlcbiAgICogd2FpdGluZyB0byBiZSBjYWxsZWQsIGFuZCB3aGVuIGJlaW5nIFwiY2FuY2VsXCIgY2FuY2VscyB0aGUgY3VycmVudGx5IHF1ZXVlZFxuICAgKiBmdW5jdGlvbiBjYWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gd2FpdFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgd2FpdCkge1xuICAgIHZhciB0aW1lb3V0O1xuICAgIHZhciB0aWNrZXJJZCA9ICsrZGVib3VuY2VJZCArIGRlYm91bmNlVGljaztcblxuICAgIGlmICh3YWl0ID4gMCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgdGlja2VyLmNhbmNlbCh0aWNrZXJJZCk7XG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gYWN0aW9uRmluaXNoKSBmbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsICYmIGFjdGlvbiAhPT0gYWN0aW9uRmluaXNoKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRpY2tlci5hZGQodGlja2VySWQsIGZuLCBudWxsLCB0cnVlKTtcbiAgICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgICBpZiAoYWN0aW9uICE9PSBhY3Rpb25DYW5jZWwpIGZuKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudCBpcyB0cmFuc2Zvcm1lZCwgZmFsc2UgaWYgbm90LiBJbiBwcmFjdGljZSB0aGVcbiAgICogZWxlbWVudCdzIGRpc3BsYXkgdmFsdWUgbXVzdCBiZSBhbnl0aGluZyBlbHNlIHRoYW4gXCJub25lXCIgb3IgXCJpbmxpbmVcIiBhc1xuICAgKiB3ZWxsIGFzIGhhdmUgYSB2YWxpZCB0cmFuc2Zvcm0gdmFsdWUgYXBwbGllZCBpbiBvcmRlciB0byBiZSBjb3VudGVkIGFzIGFcbiAgICogdHJhbnNmb3JtZWQgZWxlbWVudC5cbiAgICpcbiAgICogQm9ycm93ZWQgZnJvbSBNZXpyICh2MC42LjEpOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMNjYxXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1RyYW5zZm9ybWVkKGVsZW1lbnQpIHtcbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgJ3RyYW5zZm9ybScpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZGlzcGxheSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5Jyk7XG4gICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnIHx8IGRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnQncyBjb250YWluaW5nIGJsb2NrLCB3aGljaCBpc1xuICAgKiBjb25zaWRlcmVkIHRvIGJlIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCB0aGUgdGFyZ2V0IGVsZW1lbnQnc1xuICAgKiBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0by4gRGlzY2xhaW1lcjogdGhpcyBvbmx5IHdvcmtzIGFzIGludGVuZGVkIGZvclxuICAgKiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiAgIC0gV2hlbiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZSBjb250YWluaW5nIGJsb2NrIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbVxuICAgKiAgICAgdGhlIHByb3ZpZGVkIGVsZW1lbnQuIE90aGVyd2lzZSB0aGUgY2hlY2tpbmcgaXMgc3RhcnRlZCBmcm9tIHRoZVxuICAgKiAgICAgcHJvdmlkZWQgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7KERvY3VtZW50fEVsZW1lbnQpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQsIGluY2x1ZGVTZWxmKSB7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGUgY29udGFpbmluZyBibG9jayBpcyBhbiBlbGVtZW50LCBzdGF0aWMgYW5kIG5vdFxuICAgIC8vIHRyYW5zZm9ybWVkLCB0cnkgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcGFyZW50IGVsZW1lbnQgYW5kIGZhbGxiYWNrIHRvXG4gICAgLy8gZG9jdW1lbnQuIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXNyYW1vL21lenIvYmxvYi8wLjYuMS9tZXpyLmpzI0wzMzlcbiAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIHJldCA9IChpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50O1xuICAgIHdoaWxlIChyZXQgJiYgcmV0ICE9PSBkb2N1bWVudCAmJiBnZXRTdHlsZShyZXQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiAhaXNUcmFuc2Zvcm1lZChyZXQpKSB7XG4gICAgICByZXQgPSByZXQucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgdHJhbnNmb3JtZWQgaW50b1xuICAgKiBhIGZsb2F0IHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlQXNGbG9hdChlbCwgc3R5bGUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgc3R5bGUpKSB8fCAwO1xuICB9XG5cbiAgdmFyIG9mZnNldEEgPSB7fTtcbiAgdmFyIG9mZnNldEIgPSB7fTtcbiAgdmFyIG9mZnNldERpZmYgPSB7fTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZWxlbWVudCdzIGRvY3VtZW50IG9mZnNldCwgd2hpY2ggaW4gcHJhY3RpY2UgbWVhbnMgdGhlIHZlcnRpY2FsXG4gICAqIGFuZCBob3Jpem9udGFsIGRpc3RhbmNlIGJldHdlZW4gdGhlIGVsZW1lbnQncyBub3J0aHdlc3QgY29ybmVyIGFuZCB0aGVcbiAgICogZG9jdW1lbnQncyBub3J0aHdlc3QgY29ybmVyLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyB0aGUgc2FtZVxuICAgKiBvYmplY3Qgc28gYmUgc3VyZSB0byByZWFkIHRoZSBkYXRhIGZyb20gaXQgaW5zdGVhZCB1c2luZyBpdCBhcyBhIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsoRG9jdW1lbnR8RWxlbWVudHxXaW5kb3cpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2Zmc2V0RGF0YV1cbiAgICogICAtIE9wdGlvbmFsIGRhdGEgb2JqZWN0IHdoZXJlIHRoZSBvZmZzZXQgZGF0YSB3aWxsIGJlIGluc2VydGVkIHRvLiBJZiBub3RcbiAgICogICAgIHByb3ZpZGVkIGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSByZXR1cm4gZGF0YS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldChlbGVtZW50LCBvZmZzZXREYXRhKSB7XG4gICAgdmFyIHJldCA9IG9mZnNldERhdGEgfHwge307XG4gICAgdmFyIHJlY3Q7XG5cbiAgICAvLyBTZXQgdXAgcmV0dXJuIGRhdGEuXG4gICAgcmV0LmxlZnQgPSAwO1xuICAgIHJldC50b3AgPSAwO1xuXG4gICAgLy8gRG9jdW1lbnQncyBvZmZzZXRzIGFyZSBhbHdheXMgMC5cbiAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHRvIHRoZSByZXNwZWN0aXZlIG9mZnNldHMuXG4gICAgcmV0LmxlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgMDtcbiAgICByZXQudG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IDA7XG5cbiAgICAvLyBXaW5kb3cncyBvZmZzZXRzIGFyZSB0aGUgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHZhbHVlcy5cbiAgICBpZiAoZWxlbWVudC5zZWxmID09PSB3aW5kb3cuc2VsZikgcmV0dXJuIHJldDtcblxuICAgIC8vIEFkZCBlbGVtZW50J3MgY2xpZW50IHJlY3RzIHRvIHRoZSBvZmZzZXRzLlxuICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldC5sZWZ0ICs9IHJlY3QubGVmdDtcbiAgICByZXQudG9wICs9IHJlY3QudG9wO1xuXG4gICAgLy8gRXhjbHVkZSBlbGVtZW50J3MgYm9yZGVycyBmcm9tIHRoZSBvZmZzZXQuXG4gICAgcmV0LmxlZnQgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICAgIHJldC50b3AgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmZlcmVuY2UgdHdvIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcz1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9ja3Mgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnRzXG4gICAqICAgICB3aWxsIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlLiBPdGhlcndpc2UgdGhlIHByb3ZpZGVkXG4gICAqICAgICBlbGVtZW50cyB3aWxsIGJlIGNvbXBhcmVkIGRpcmVjdGx5LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2Zmc2V0RGlmZihlbGVtQSwgZWxlbUIsIGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gMDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IDA7XG5cbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc2FtZSBsZXQncyByZXR1cm4gZWFybHkuXG4gICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG5cbiAgICAvLyBDb21wYXJlIGNvbnRhaW5pbmcgYmxvY2tzIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoY29tcGFyZUNvbnRhaW5pbmdCbG9ja3MpIHtcbiAgICAgIGVsZW1BID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1BLCB0cnVlKTtcbiAgICAgIGVsZW1CID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1CLCB0cnVlKTtcblxuICAgICAgLy8gSWYgY29udGFpbmluZyBibG9ja3MgYXJlIGlkZW50aWNhbCwgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgbGV0J3MgY2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZi5cbiAgICBnZXRPZmZzZXQoZWxlbUEsIG9mZnNldEEpO1xuICAgIGdldE9mZnNldChlbGVtQiwgb2Zmc2V0Qik7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gb2Zmc2V0Qi5sZWZ0IC0gb2Zmc2V0QS5sZWZ0O1xuICAgIG9mZnNldERpZmYudG9wID0gb2Zmc2V0Qi50b3AgLSBvZmZzZXRBLnRvcDtcblxuICAgIHJldHVybiBvZmZzZXREaWZmO1xuICB9XG5cbiAgdmFyIHN0eWxlT3ZlcmZsb3cgPSAnb3ZlcmZsb3cnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1ggPSAnb3ZlcmZsb3cteCc7XG4gIHZhciBzdHlsZU92ZXJmbG93WSA9ICdvdmVyZmxvdy15JztcbiAgdmFyIG92ZXJmbG93QXV0byA9ICdhdXRvJztcbiAgdmFyIG92ZXJmbG93U2Nyb2xsID0gJ3Njcm9sbCc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtZW50KSB7XG4gICAgdmFyIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvdyk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvd1gpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dZKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgZWxlbWVudCdzIGFuY2VzdG9ycyB0aGF0IGFyZSBwb3RlbnRpYWxseSBzY3JvbGxhYmxlIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiBAcGFyYW0ge0FycmF5fSBbZGF0YV1cbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyhlbGVtZW50LCBpbmNsdWRlU2VsZiwgZGF0YSkge1xuICAgIHZhciByZXQgPSBkYXRhIHx8IFtdO1xuICAgIHZhciBwYXJlbnQgPSBpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBGaW5kIHNjcm9sbCBwYXJlbnRzLlxuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgLy8gSWYgZWxlbWVudCBpcyBpbnNpZGUgU2hhZG93RE9NIGxldCdzIGdldCBpdCdzIGhvc3Qgbm9kZSBmcm9tIHRoZSByZWFsXG4gICAgICAvLyBET00gYW5kIGNvbnRpbnVlIGxvb3BpbmcuXG4gICAgICBpZiAocGFyZW50LmdldFJvb3ROb2RlICYmIHBhcmVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFJvb3ROb2RlKCkuaG9zdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZSBsZXQncyBhZGQgaXQgdG8gdGhlIHNjcm9sbGFibGUgbGlzdC5cbiAgICAgIGlmIChpc1Njcm9sbGFibGUocGFyZW50KSkge1xuICAgICAgICByZXQucHVzaChwYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgYWRkIHdpbmRvdyB0byB0aGUgcmVzdWx0cy5cbiAgICByZXQucHVzaCh3aW5kb3cpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHt9O1xuICB2YXIgdHJhbnNmb3JtU3R5bGUkMiA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtTm9uZSA9ICdub25lJztcbiAgdmFyIHJ4TWF0M2QgPSAvXm1hdHJpeDNkLztcbiAgdmFyIHJ4TWF0VHggPSAvKFteLF0qLCl7NH0vO1xuICB2YXIgcnhNYXQzZFR4ID0gLyhbXixdKiwpezEyfS87XG4gIHZhciByeE5leHRJdGVtID0gL1teLF0qLC87XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBjb21wdXRlZCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBhcyBhIGZsb2F0cy5cbiAgICogVGhlIHJldHVybmVkIG9iamVjdCBpcyBhbHdheXMgdGhlIHNhbWUgb2JqZWN0IGFuZCB1cGRhdGVkIGV2ZXJ5IHRpbWUgdGhpc1xuICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbGVtZW50KSB7XG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IDA7XG5cbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgdHJhbnNmb3JtU3R5bGUkMik7XG4gICAgaWYgKCF0cmFuc2Zvcm0gfHwgdHJhbnNmb3JtID09PSB0cmFuc2Zvcm1Ob25lKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHN0eWxlIGNhbiBiZSBpbiBlaXRoZXIgbWF0cml4M2QoLi4uKSBvciBtYXRyaXgoLi4uKS5cbiAgICB2YXIgaXNNYXQzZCA9IHJ4TWF0M2QudGVzdCh0cmFuc2Zvcm0pO1xuICAgIHZhciB0WCA9IHRyYW5zZm9ybS5yZXBsYWNlKGlzTWF0M2QgPyByeE1hdDNkVHggOiByeE1hdFR4LCAnJyk7XG4gICAgdmFyIHRZID0gdFgucmVwbGFjZShyeE5leHRJdGVtLCAnJyk7XG5cbiAgICB0cmFuc2xhdGVWYWx1ZS54ID0gcGFyc2VGbG9hdCh0WCkgfHwgMDtcbiAgICB0cmFuc2xhdGVWYWx1ZS55ID0gcGFyc2VGbG9hdCh0WSkgfHwgMDtcblxuICAgIHJldHVybiB0cmFuc2xhdGVWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZSBpbnRvIENTUyB0cmFuc2Zvcm0gc3R5bGVcbiAgICogcHJvcGVydHkncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZVN0cmluZyh4LCB5KSB7XG4gICAgcmV0dXJuICd0cmFuc2xhdGVYKCcgKyB4ICsgJ3B4KSB0cmFuc2xhdGVZKCcgKyB5ICsgJ3B4KSc7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNsYXNzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudE1hdGNoZXMoZWxlbWVudCwgJy4nICsgY2xhc3NOYW1lKSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICgnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJylcbiAgICAgICAgICAucmVwbGFjZSgnICcgKyBjbGFzc05hbWUgKyAnICcsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlcy5cbiAgdmFyIHN0YXJ0UHJlZGljYXRlSW5hY3RpdmUgPSAwO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVQZW5kaW5nID0gMTtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgPSAyO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVSZWplY3RlZCA9IDM7XG5cbiAgLyoqXG4gICAqIEJpbmQgdG91Y2ggaW50ZXJhY3Rpb24gdG8gYW4gaXRlbS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWcoaXRlbSkge1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fZ3JpZElkID0gZ3JpZC5faWQ7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuXG4gICAgLy8gU3RhcnQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUgPSBpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSlcbiAgICAgID8gc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlXG4gICAgICA6IEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIERhdGEgZm9yIGRyYWcgc29ydCBwcmVkaWNhdGUgaGV1cmlzdGljcy5cbiAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLl9oWDEgPSAwO1xuICAgIHRoaXMuX2hYMiA9IDA7XG4gICAgdGhpcy5faFkxID0gMDtcbiAgICB0aGlzLl9oWTIgPSAwO1xuXG4gICAgLy8gU2V0dXAgaXRlbSdzIGluaXRpYWwgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBCaW5kIHRoZSBtZXRob2RzIHRoYXQgbmVlZHMgYmluZGluZy5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZUVuZENoZWNrID0gdGhpcy5fcHJlRW5kQ2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcHJlcGFyZU1vdmUgPSB0aGlzLl9wcmVwYXJlTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5TW92ZSA9IHRoaXMuX2FwcGx5TW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVTY3JvbGwgPSB0aGlzLl9wcmVwYXJlU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYXBwbHlTY3JvbGwgPSB0aGlzLl9hcHBseVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NoZWNrT3ZlcmxhcCA9IHRoaXMuX2NoZWNrT3ZlcmxhcC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gQ3JlYXRlIGRlYm91bmNlIG92ZXJsYXAgY2hlY2tlciBmdW5jdGlvbi5cbiAgICB2YXIgc29ydEludGVydmFsID0gc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbDtcbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSA9IGRlYm91bmNlKHRoaXMuX2NoZWNrT3ZlcmxhcCwgc29ydEludGVydmFsKTtcblxuICAgIC8vIEluaXQgZHJhZ2dlci5cbiAgICB0aGlzLl9kcmFnZ2VyID0gbmV3IERyYWdnZXIoZWxlbWVudCwgc2V0dGluZ3MuZHJhZ0Nzc1Byb3BzKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdzdGFydCcsIHRoaXMuX3ByZVN0YXJ0Q2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ21vdmUnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdjYW5jZWwnLCB0aGlzLl9wcmVFbmRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignZW5kJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBzdGF0aWMgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgaGFuZGxlciB0aGF0IGhhbmRsZXMgYW5jaG9yIGVsZW1lbnRzXG4gICAqIGdyYWNlZnVsbHkuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBkZWZpbmVzIGlmIHRoZSBkcmFnIGlzXG4gICAqIHN0YXJ0ZWQsIHJlamVjdGVkIG9yIHBlbmRpbmcuIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgc3RhcnRlZFxuICAgKiBhbmQgd2hlbiBmYWxzZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgcmVqZWN0ZWQuIElmIG5vdGhpbmcgaXMgcmV0dXJuZWRcbiAgICogdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCBkcmFnIG1vdmVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAtIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhc3MgdGhlIHByZWRpY2F0ZVxuICAgKiAgICAgaXQncyBvcHRpb25zIG1hbnVhbGx5LiBCeSBkZWZhdWx0IHRoZSBwcmVkaWNhdGUgcmV0cmlldmVzIHRoZSBvcHRpb25zXG4gICAqICAgICBmcm9tIHRoZSBncmlkJ3Mgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oaXRlbSwgZXZlbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgdmFyIHByZWRpY2F0ZSA9IGRyYWcuX3N0YXJ0UHJlZGljYXRlRGF0YSB8fCBkcmFnLl9zZXR1cFN0YXJ0UHJlZGljYXRlKG9wdGlvbnMpO1xuXG4gICAgLy8gRmluYWwgZXZlbnQgbG9naWMuIEF0IHRoaXMgc3RhZ2UgcmV0dXJuIHZhbHVlIGRvZXMgbm90IG1hdHRlciBhbnltb3JlLFxuICAgIC8vIHRoZSBwcmVkaWNhdGUgaXMgZWl0aGVyIHJlc29sdmVkIG9yIGl0J3Mgbm90IGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICAvLyBhYm91dCBpdC4gSGVyZSB3ZSBqdXN0IHJlc2V0IGRhdGEgYW5kIGlmIHRoZSBpdGVtIGVsZW1lbnQgaXMgYSBsaW5rXG4gICAgLy8gd2UgZm9sbG93IGl0IChpZiB0aGVyZSBoYXMgb25seSBiZWVuIHNsaWdodCBtb3ZlbWVudCkuXG4gICAgaWYgKGV2ZW50LmlzRmluYWwpIHtcbiAgICAgIGRyYWcuX2ZpbmlzaFN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGFuZCBzdG9yZSB0aGUgaGFuZGxlIGVsZW1lbnQgc28gd2UgY2FuIGNoZWNrIGxhdGVyIG9uIGlmIHRoZVxuICAgIC8vIGN1cnNvciBpcyB3aXRoaW4gdGhlIGhhbmRsZS4gSWYgd2UgaGF2ZSBhIGhhbmRsZSBzZWxlY3RvciBsZXQncyBmaW5kXG4gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudC4gT3RoZXJ3aXNlIGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZVxuICAgIC8vIGhhbmRsZS5cbiAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSB7XG4gICAgICBwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCA9IGRyYWcuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlKGV2ZW50KTtcbiAgICAgIGlmICghcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiBkZWxheSBpcyBkZWZpbmVkIGxldCdzIGtlZXAgdHJhY2sgb2YgdGhlIGxhdGVzdCBldmVudCBhbmQgaW5pdGlhdGVcbiAgICAvLyBkZWxheSBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSB5ZXQuXG4gICAgaWYgKHByZWRpY2F0ZS5kZWxheSkge1xuICAgICAgcHJlZGljYXRlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcHJlZGljYXRlLmRlbGF5ID0gMDtcbiAgICAgICAgICBpZiAoZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCkpIHtcbiAgICAgICAgICAgIGRyYWcuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCk7XG4gICAgICAgICAgICBkcmFnLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBwcmVkaWNhdGUuZGVsYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcmFnLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUoZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc29ydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hY3Rpb249J21vdmUnXVxuICAgKiBAcmV0dXJucyB7KEJvb2xlYW58RHJhZ1NvcnRDb21tYW5kKX1cbiAgICogICAtIFJldHVybnMgZmFsc2UgaWYgbm8gdmFsaWQgaW5kZXggd2FzIGZvdW5kLiBPdGhlcndpc2UgcmV0dXJucyBkcmFnIHNvcnRcbiAgICogICAgIGNvbW1hbmQuXG4gICAqL1xuICBJdGVtRHJhZy5kZWZhdWx0U29ydFByZWRpY2F0ZSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbVJlY3QgPSB7fTtcbiAgICB2YXIgdGFyZ2V0UmVjdCA9IHt9O1xuICAgIHZhciByZXR1cm5EYXRhID0ge307XG4gICAgdmFyIHJvb3RHcmlkQXJyYXkgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHRocmVzaG9sZCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGw7XG4gICAgICB2YXIgZHJhZ1NvcnQgPSByb290R3JpZC5fc2V0dGluZ3MuZHJhZ1NvcnQ7XG4gICAgICB2YXIgYmVzdFNjb3JlID0gLTE7XG4gICAgICB2YXIgZ3JpZFNjb3JlO1xuICAgICAgdmFyIGdyaWRzO1xuICAgICAgdmFyIGdyaWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gR2V0IHBvdGVudGlhbCB0YXJnZXQgZ3JpZHMuXG4gICAgICBpZiAoZHJhZ1NvcnQgPT09IHRydWUpIHtcbiAgICAgICAgcm9vdEdyaWRBcnJheVswXSA9IHJvb3RHcmlkO1xuICAgICAgICBncmlkcyA9IHJvb3RHcmlkQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkcyA9IGRyYWdTb3J0LmNhbGwocm9vdEdyaWQsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgYXJlIG5vIGdyaWRzLlxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyaWRzKSkgcmV0dXJuIHRhcmdldDtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBncmlkcyBhbmQgZ2V0IHRoZSBiZXN0IG1hdGNoLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyaWQgPSBncmlkc1tpXTtcblxuICAgICAgICAvLyBGaWx0ZXIgb3V0IGFsbCBkZXN0cm95ZWQgZ3JpZHMuXG4gICAgICAgIGlmIChncmlkLl9pc0Rlc3Ryb3llZCkgY29udGludWU7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGdyaWQncyBvZmZzZXRzIGFuZCBkaW1lbnNpb25zIHNpbmNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBjaGFuZ2VkIChlLmcgZHVyaW5nIHNjcm9sbGluZykuXG4gICAgICAgIGdyaWQuX3VwZGF0ZUJvdW5kaW5nUmVjdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGhvdyBtdWNoIGRyYWdnZWQgZWxlbWVudCBvdmVybGFwcyB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICAgIHRhcmdldFJlY3Qud2lkdGggPSBncmlkLl93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSBncmlkLl9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IGdyaWQuX2xlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gZ3JpZC5fdG9wO1xuICAgICAgICBncmlkU2NvcmUgPSBnZXRSZWN0T3ZlcmxhcFNjb3JlKGl0ZW1SZWN0LCB0YXJnZXRSZWN0KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyaWQgaXMgdGhlIGJlc3QgbWF0Y2ggc28gZmFyLlxuICAgICAgICBpZiAoZ3JpZFNjb3JlID4gdGhyZXNob2xkICYmIGdyaWRTY29yZSA+IGJlc3RTY29yZSkge1xuICAgICAgICAgIGJlc3RTY29yZSA9IGdyaWRTY29yZTtcbiAgICAgICAgICB0YXJnZXQgPSBncmlkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyByZXNldCByb290IGdyaWQgYXJyYXkuXG4gICAgICByb290R3JpZEFycmF5Lmxlbmd0aCA9IDA7XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIG9wdGlvbnMpIHtcbiAgICAgIHZhciBkcmFnID0gaXRlbS5fZHJhZztcbiAgICAgIHZhciByb290R3JpZCA9IGRyYWcuX2dldEdyaWQoKTtcblxuICAgICAgLy8gR2V0IGRyYWcgc29ydCBwcmVkaWNhdGUgc2V0dGluZ3MuXG4gICAgICB2YXIgc29ydFRocmVzaG9sZCA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMudGhyZXNob2xkID09PSAnbnVtYmVyJyA/IG9wdGlvbnMudGhyZXNob2xkIDogNTA7XG4gICAgICB2YXIgc29ydEFjdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhY3Rpb25Td2FwIDogYWN0aW9uTW92ZTtcblxuICAgICAgLy8gUG9wdWxhdGUgaXRlbSByZWN0IGRhdGEuXG4gICAgICBpdGVtUmVjdC53aWR0aCA9IGl0ZW0uX3dpZHRoO1xuICAgICAgaXRlbVJlY3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0O1xuICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2VsZW1lbnRDbGllbnRYO1xuICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZWxlbWVudENsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdGFyZ2V0IGdyaWQuXG4gICAgICB2YXIgZ3JpZCA9IGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHNvcnRUaHJlc2hvbGQpO1xuXG4gICAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgZm91bmQgbm8gZ3JpZCBjb250YWluZXIgZWxlbWVudCB0aGF0IG92ZXJsYXBzIHRoZVxuICAgICAgLy8gZHJhZ2dlZCBpdGVtIGVub3VnaC5cbiAgICAgIGlmICghZ3JpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgZ3JpZE9mZnNldExlZnQgPSAwO1xuICAgICAgdmFyIGdyaWRPZmZzZXRUb3AgPSAwO1xuICAgICAgdmFyIG1hdGNoU2NvcmUgPSAtMTtcbiAgICAgIHZhciBtYXRjaEluZGV4O1xuICAgICAgdmFyIGhhc1ZhbGlkVGFyZ2V0cztcbiAgICAgIHZhciB0YXJnZXQ7XG4gICAgICB2YXIgc2NvcmU7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gSWYgaXRlbSBpcyBtb3ZlZCB3aXRoaW4gaXQncyBvcmlnaW5hdGluZyBncmlkIGFkanVzdCBpdGVtJ3MgbGVmdCBhbmRcbiAgICAgIC8vIHRvcCBwcm9wcy4gT3RoZXJ3aXNlIGlmIGl0ZW0gaXMgbW92ZWQgdG8vd2l0aGluIGFub3RoZXIgZ3JpZCBnZXQgdGhlXG4gICAgICAvLyBjb250YWluZXIgZWxlbWVudCdzIG9mZnNldCAoZnJvbSB0aGUgZWxlbWVudCdzIGNvbnRlbnQgZWRnZSkuXG4gICAgICBpZiAoZ3JpZCA9PT0gcm9vdEdyaWQpIHtcbiAgICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2dyaWRYICsgaXRlbS5fbWFyZ2luTGVmdDtcbiAgICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZ3JpZFkgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkLl91cGRhdGVCb3JkZXJzKDEsIDAsIDEsIDApO1xuICAgICAgICBncmlkT2Zmc2V0TGVmdCA9IGdyaWQuX2xlZnQgKyBncmlkLl9ib3JkZXJMZWZ0O1xuICAgICAgICBncmlkT2Zmc2V0VG9wID0gZ3JpZC5fdG9wICsgZ3JpZC5fYm9yZGVyVG9wO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHRhcmdldCBncmlkIGl0ZW1zIGFuZCB0cnkgdG8gZmluZCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YXJnZXQgPSBncmlkLl9pdGVtc1tpXTtcblxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGl0ZW0gaXMgbm90IGFjdGl2ZSBvciB0aGUgdGFyZ2V0IGl0ZW0gaXMgdGhlIGRyYWdnZWRcbiAgICAgICAgLy8gaXRlbSBsZXQncyBza2lwIHRvIHRoZSBuZXh0IGl0ZW0uXG4gICAgICAgIGlmICghdGFyZ2V0Ll9pc0FjdGl2ZSB8fCB0YXJnZXQgPT09IGl0ZW0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgdGhlIGdyaWQgYXMgaGF2aW5nIHZhbGlkIHRhcmdldCBpdGVtcy5cbiAgICAgICAgaGFzVmFsaWRUYXJnZXRzID0gdHJ1ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCdzIG92ZXJsYXAgc2NvcmUgd2l0aCB0aGUgZHJhZ2dlZCBpdGVtLlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gdGFyZ2V0Ll93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSB0YXJnZXQuX2hlaWdodDtcbiAgICAgICAgdGFyZ2V0UmVjdC5sZWZ0ID0gdGFyZ2V0Ll9sZWZ0ICsgdGFyZ2V0Ll9tYXJnaW5MZWZ0ICsgZ3JpZE9mZnNldExlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gdGFyZ2V0Ll90b3AgKyB0YXJnZXQuX21hcmdpblRvcCArIGdyaWRPZmZzZXRUb3A7XG4gICAgICAgIHNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGJlc3QgbWF0Y2ggaW5kZXggYW5kIHNjb3JlIGlmIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGhcbiAgICAgICAgLy8gdGhlIGRyYWdnZWQgaXRlbSBpcyBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBiZXN0IG1hdGNoIHNjb3JlLlxuICAgICAgICBpZiAoc2NvcmUgPiBtYXRjaFNjb3JlKSB7XG4gICAgICAgICAgbWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgbWF0Y2hTY29yZSA9IHNjb3JlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHZhbGlkIG1hdGNoIGFuZCB0aGUgaXRlbSBpcyBiZWluZyBtb3ZlZCBpbnRvIGFub3RoZXJcbiAgICAgIC8vIGdyaWQuXG4gICAgICBpZiAobWF0Y2hTY29yZSA8IHNvcnRUaHJlc2hvbGQgJiYgaXRlbS5nZXRHcmlkKCkgIT09IGdyaWQpIHtcbiAgICAgICAgbWF0Y2hJbmRleCA9IGhhc1ZhbGlkVGFyZ2V0cyA/IC0xIDogMDtcbiAgICAgICAgbWF0Y2hTY29yZSA9IEluZmluaXR5O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYmVzdCBtYXRjaCBvdmVybGFwcyBlbm91Z2ggdG8ganVzdGlmeSBhIHBsYWNlbWVudCBzd2l0Y2guXG4gICAgICBpZiAobWF0Y2hTY29yZSA+PSBzb3J0VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybkRhdGEuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHJldHVybkRhdGEuaW5kZXggPSBtYXRjaEluZGV4O1xuICAgICAgICByZXR1cm5EYXRhLmFjdGlvbiA9IHNvcnRBY3Rpb247XG4gICAgICAgIHJldHVybiByZXR1cm5EYXRhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQWJvcnQgZHJhZ2dpbmcgYW5kIHJlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcblxuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYmVpbmcgZHJvcHBlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIGl0IHVwIGFuZCByZXR1cm5cbiAgICAvLyBpbW1lZGlhdGVseS5cbiAgICBpZiAodGhpcy5faXNNaWdyYXRpbmcpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaE1pZ3JhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gUmVtb3ZlIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgdGhpcy5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDYW5jZWwgb3ZlcmxhcCBjaGVjay5cbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnY2FuY2VsJyk7XG5cbiAgICAvLyBBcHBlbmQgaXRlbSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgaWYgaXQncyBub3QgaXQncyBjaGlsZC4gQWxzbyBtYWtlXG4gICAgLy8gc3VyZSB0aGUgdHJhbnNsYXRlIHZhbHVlcyBhcmUgYWRqdXN0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBzaGlmdC5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBncmlkLl9lbGVtZW50KSB7XG4gICAgICBncmlkLl9lbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9ncmlkWCwgdGhpcy5fZ3JpZFkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBkcmFnZ2luZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1EcmFnfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2RyYWdnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7P0dyaWR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdIHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwL3Jlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElzIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvLyBUaGUgZHJhZ2dlZCBpdGVtJ3MgY29udGFpbmluZyBibG9jay5cbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBudWxsO1xuXG4gICAgLy8gRHJhZy9zY3JvbGwgZXZlbnQgZGF0YS5cbiAgICB0aGlzLl9kcmFnRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Njcm9sbEV2ZW50ID0gbnVsbDtcblxuICAgIC8vIEFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbmVlZCB0byBiZSBsaXN0ZW5lZCBmb3Igc2Nyb2xsIGV2ZW50cyBkdXJpbmdcbiAgICAvLyBkcmFnZ2luZy5cbiAgICB0aGlzLl9zY3JvbGxlcnMgPSBbXTtcblxuICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zbGF0ZVgvdHJhbnNsYXRlWSBwb3NpdGlvbi5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gRHJhZ2dlZCBlbGVtZW50J3MgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGdyaWQuXG4gICAgdGhpcy5fZ3JpZFggPSAwO1xuICAgIHRoaXMuX2dyaWRZID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgb2Zmc2V0IGZyb20gd2luZG93J3Mgbm9ydGh3ZXN0IGNvcm5lci4gRG9lc1xuICAgIC8vIG5vdCBhY2NvdW50IGZvciBlbGVtZW50J3MgbWFyZ2lucy5cbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCA9IDA7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFkgPSAwO1xuXG4gICAgLy8gT2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZHJhZ2dlZCBlbGVtZW50J3MgdGVtcG9yYXJ5IGRyYWdcbiAgICAvLyBjb250YWluZXIgYW5kIGl0J3Mgb3JpZ2luYWwgY29udGFpbmVyLlxuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgdG8gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3IgZWxlbWVudHMgb2YgdGhlXG4gICAqIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYmluZFNjcm9sbExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gdGhpcy5fZ2V0R3JpZCgpLl9lbGVtZW50O1xuICAgIHZhciBkcmFnQ29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgIHZhciBzY3JvbGxlcnMgPSB0aGlzLl9zY3JvbGxlcnM7XG4gICAgdmFyIGdyaWRTY3JvbGxlcnM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBHZXQgZHJhZ2dlZCBlbGVtZW50J3Mgc2Nyb2xsaW5nIHBhcmVudHMuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gICAgZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyh0aGlzLl9pdGVtLl9lbGVtZW50LCBmYWxzZSwgc2Nyb2xsZXJzKTtcblxuICAgIC8vIElmIGRyYWcgY29udGFpbmVyIGlzIGRlZmluZWQgYW5kIGl0J3Mgbm90IHRoZSBzYW1lIGVsZW1lbnQgYXMgZ3JpZFxuICAgIC8vIGNvbnRhaW5lciB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGNvbnRhaW5lciBhbmQgaXQncyBzY3JvbGwgcGFyZW50c1xuICAgIC8vIHRvIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgZ29pbmcgdG8gYmUgbGlzdGVuZXIgZm9yIHNjcm9sbCBldmVudHMuXG4gICAgaWYgKGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIGdyaWRTY3JvbGxlcnMgPSBbXTtcbiAgICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZ3JpZENvbnRhaW5lciwgdHJ1ZSwgZ3JpZFNjcm9sbGVycyk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZFNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2Nyb2xsZXJzLmluZGV4T2YoZ3JpZFNjcm9sbGVyc1tpXSkgPCAwKSB7XG4gICAgICAgICAgc2Nyb2xsZXJzLnB1c2goZ3JpZFNjcm9sbGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW5kIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICBzY3JvbGxlcnMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogU2V0dXAgZGVmYXVsdCBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9zZXR1cFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBjb25maWcgPSBvcHRpb25zIHx8IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlIHx8IDA7XG4gICAgcmV0dXJuICh0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSB7XG4gICAgICBkaXN0YW5jZTogTWF0aC5hYnMoY29uZmlnLmRpc3RhbmNlKSB8fCAwLFxuICAgICAgZGVsYXk6IE1hdGgubWF4KGNvbmZpZy5kZWxheSwgMCkgfHwgMCxcbiAgICAgIGhhbmRsZTogdHlwZW9mIGNvbmZpZy5oYW5kbGUgPT09ICdzdHJpbmcnID8gY29uZmlnLmhhbmRsZSA6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlIGhhbmRsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMgez9IVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZ2V0U3RhcnRQcmVkaWNhdGVIYW5kbGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuICAgIHZhciBoYW5kbGVFbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIE5vIGhhbmRsZSwgbm8gaGFzc2xlIC0+IGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZSBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlKSByZXR1cm4gaGFuZGxlRWxlbWVudDtcblxuICAgIC8vIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgcHJlZGljYXRlIGhhbmRsZSBkZWZpbmVkLCBsZXQncyB0cnkgdG8gZ2V0IGl0LlxuICAgIGhhbmRsZUVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgd2hpbGUgKGhhbmRsZUVsZW1lbnQgJiYgIWVsZW1lbnRNYXRjaGVzKGhhbmRsZUVsZW1lbnQsIHByZWRpY2F0ZS5oYW5kbGUpKSB7XG4gICAgICBoYW5kbGVFbGVtZW50ID0gaGFuZGxlRWxlbWVudCAhPT0gZWxlbWVudCA/IGhhbmRsZUVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVFbGVtZW50IHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc29sdmVTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcblxuICAgIC8vIElmIHRoZSBtb3ZlZCBkaXN0YW5jZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkaXN0YW5jZSBvciB0aGVyZSBpc1xuICAgIC8vIHNvbWUgZGVsYXkgbGVmdCwgaWdub3JlIHRoaXMgcHJlZGljYXRlIGN5Y2xlLlxuICAgIGlmIChldmVudC5kaXN0YW5jZSA8IHByZWRpY2F0ZS5kaXN0YW5jZSB8fCBwcmVkaWNhdGUuZGVsYXkpIHJldHVybjtcblxuICAgIC8vIEdldCBoYW5kbGUgcmVjdCBkYXRhLlxuICAgIHZhciBoYW5kbGVSZWN0ID0gcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIGhhbmRsZUxlZnQgPSBoYW5kbGVSZWN0LmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVUb3AgPSBoYW5kbGVSZWN0LnRvcCArICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCk7XG4gICAgdmFyIGhhbmRsZVdpZHRoID0gaGFuZGxlUmVjdC53aWR0aDtcbiAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlUmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUgZGF0YS5cbiAgICB0aGlzLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG5cbiAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIHN0aWxsIHdpdGhpbiB0aGUgaGFuZGxlIGxldCdzIHN0YXJ0IHRoZSBkcmFnLlxuICAgIHJldHVybiAoXG4gICAgICBoYW5kbGVXaWR0aCAmJlxuICAgICAgaGFuZGxlSGVpZ2h0ICYmXG4gICAgICBldmVudC5wYWdlWCA+PSBoYW5kbGVMZWZ0ICYmXG4gICAgICBldmVudC5wYWdlWCA8IGhhbmRsZUxlZnQgKyBoYW5kbGVXaWR0aCAmJlxuICAgICAgZXZlbnQucGFnZVkgPj0gaGFuZGxlVG9wICYmXG4gICAgICBldmVudC5wYWdlWSA8IGhhbmRsZVRvcCArIGhhbmRsZUhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlZnVsbHkgcmVzb2x2ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZm9yY2VSZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghdGhpcy5faXNEZXN0cm95ZWQgJiYgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgIHRoaXMuX29uU3RhcnQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRmluYWxpemUgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9maW5pc2hTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWNrICh2ZXJ5IHN1YmplY3RpdmUgaGV1cmlzdGljcykuXG4gICAgdmFyIGlzQ2xpY2sgPSBNYXRoLmFicyhldmVudC5kZWx0YVgpIDwgMiAmJiBNYXRoLmFicyhldmVudC5kZWx0YVkpIDwgMiAmJiBldmVudC5kZWx0YVRpbWUgPCAyMDA7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGdlc3R1cmUgY2FuIGJlIGludGVycHJldGVkIGFzIGNsaWNrIGxldCdzIHRyeSB0byBvcGVuIHRoZSBlbGVtZW50J3NcbiAgICAvLyBocmVmIHVybCAoaWYgaXQgaXMgYW4gYW5jaG9yIGVsZW1lbnQpLlxuICAgIGlmIChpc0NsaWNrKSBvcGVuQW5jaG9ySHJlZihlbGVtZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZHJhZyBzb3J0IGhldXJpc3RpY3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc2V0SGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gdGhpcy5faFgyID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTIgPSBldmVudC5jbGllbnRZO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSdW4gaGV1cmlzdGljcyBhbmQgcmV0dXJuIHRydWUgaWYgb3ZlcmxhcCBjaGVjayBjYW4gYmUgcGVyZm9ybWVkLCBhbmQgZmFsc2VcbiAgICogaWYgaXQgY2FuIG5vdC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrSGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydEhldXJpc3RpY3M7XG4gICAgdmFyIG1pbkRpc3QgPSBzZXR0aW5ncy5taW5EcmFnRGlzdGFuY2U7XG5cbiAgICAvLyBTa2lwIGhldXJpc3RpY3MgaWYgbm90IG5lZWRlZC5cbiAgICBpZiAobWluRGlzdCA8PSAwKSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICB2YXIgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgdmFyIGRpZmZYID0geCAtIHRoaXMuX2hYMjtcbiAgICB2YXIgZGlmZlkgPSB5IC0gdGhpcy5faFkyO1xuXG4gICAgLy8gSWYgd2UgY2FuJ3QgZG8gcHJvcGVyIGJvdW5jZSBiYWNrIGNoZWNrIG1ha2Ugc3VyZSB0aGF0IHRoZSBibG9ja2VkIGluZGV4XG4gICAgLy8gaXMgbm90IHNldC5cbiAgICB2YXIgY2FuQ2hlY2tCb3VuY2VCYWNrID0gbWluRGlzdCA+IDMgJiYgc2V0dGluZ3MubWluQm91bmNlQmFja0FuZ2xlID4gMDtcbiAgICBpZiAoIWNhbkNoZWNrQm91bmNlQmFjaykge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IG1pbkRpc3QgfHwgTWF0aC5hYnMoZGlmZlkpID4gbWluRGlzdCkge1xuICAgICAgLy8gUmVzZXQgYmxvY2tlZCBpbmRleCBpZiBhbmdsZSBjaGFuZ2VkIGVub3VnaC4gVGhpcyBjaGVjayByZXF1aXJlcyBhXG4gICAgICAvLyBtaW5pbXVtIHZhbHVlIG9mIDMgZm9yIG1pbkRyYWdEaXN0YW5jZSB0byBmdW5jdGlvbiBwcm9wZXJseS5cbiAgICAgIGlmIChjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkaWZmWCwgZGlmZlkpO1xuICAgICAgICB2YXIgcHJldkFuZ2xlID0gTWF0aC5hdGFuMih0aGlzLl9oWDIgLSB0aGlzLl9oWDEsIHRoaXMuX2hZMiAtIHRoaXMuX2hZMSk7XG4gICAgICAgIHZhciBkZWx0YUFuZ2xlID0gTWF0aC5hdGFuMihNYXRoLnNpbihhbmdsZSAtIHByZXZBbmdsZSksIE1hdGguY29zKGFuZ2xlIC0gcHJldkFuZ2xlKSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YUFuZ2xlKSA+IHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSkge1xuICAgICAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwb2ludHMuXG4gICAgICB0aGlzLl9oWDEgPSB0aGlzLl9oWDI7XG4gICAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTI7XG4gICAgICB0aGlzLl9oWDIgPSB4O1xuICAgICAgdGhpcy5faFkyID0geTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBmb3IgZGVmYXVsdCBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcbiAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICBpZiAocHJlZGljYXRlLmRlbGF5VGltZXIpIHtcbiAgICAgICAgcHJlZGljYXRlLmRlbGF5VGltZXIgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHByZWRpY2F0ZS5kZWxheVRpbWVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayAoZHVyaW5nIGRyYWcpIGlmIGFuIGl0ZW0gaXMgb3ZlcmxhcHBpbmcgb3RoZXIgaXRlbXMgYW5kIGJhc2VkIG9uXG4gICAqIHRoZSBjb25maWd1cmF0aW9uIGxheW91dCB0aGUgaXRlbXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fY2hlY2tPdmVybGFwID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3M7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgY3VycmVudEdyaWQ7XG4gICAgdmFyIGN1cnJlbnRJbmRleDtcbiAgICB2YXIgdGFyZ2V0R3JpZDtcbiAgICB2YXIgdGFyZ2V0SW5kZXg7XG4gICAgdmFyIHNvcnRBY3Rpb247XG4gICAgdmFyIGlzTWlncmF0aW9uO1xuXG4gICAgLy8gR2V0IG92ZXJsYXAgY2hlY2sgcmVzdWx0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKSkge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUoaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUoaXRlbSwgc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IG9iamVjdCBoYXMgYSB2YWxpZCBpbmRleCBiZWZvcmUgZ29pbmcgZnVydGhlci5cbiAgICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0LmluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuO1xuXG4gICAgY3VycmVudEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB0YXJnZXRHcmlkID0gcmVzdWx0LmdyaWQgfHwgY3VycmVudEdyaWQ7XG4gICAgaXNNaWdyYXRpb24gPSBjdXJyZW50R3JpZCAhPT0gdGFyZ2V0R3JpZDtcbiAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50R3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0R3JpZC5faXRlbXMsIHJlc3VsdC5pbmRleCwgaXNNaWdyYXRpb24pO1xuICAgIHNvcnRBY3Rpb24gPSByZXN1bHQuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAvLyBQcmV2ZW50IHBvc2l0aW9uIGJvdW5jZS5cbiAgICBpZiAoIWlzTWlncmF0aW9uICYmIHRhcmdldEluZGV4ID09PSB0aGlzLl9oQmxvY2tlZEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHdpdGhpbiBpdCdzIGN1cnJlbnQgZ3JpZC5cbiAgICBpZiAoIWlzTWlncmF0aW9uKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHRhcmdldCBpbmRleCBpcyBub3QgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAgICBpZiAoY3VycmVudEluZGV4ICE9PSB0YXJnZXRJbmRleCkge1xuICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIC8vIERvIHRoZSBzb3J0LlxuICAgICAgICAoc29ydEFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFycmF5U3dhcCA6IGFycmF5TW92ZSkoXG4gICAgICAgICAgY3VycmVudEdyaWQuX2l0ZW1zLFxuICAgICAgICAgIGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0YXJnZXRJbmRleFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXgsXG4gICAgICAgICAgICBhY3Rpb246IHNvcnRBY3Rpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExheW91dCB0aGUgZ3JpZC5cbiAgICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHRvIGFub3RoZXIgZ3JpZC5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgICAgaXRlbS5fZ3JpZElkID0gdGFyZ2V0R3JpZC5faWQ7XG5cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIGluc3RhbmNlJ3MgbWlncmF0aW5nIGluZGljYXRvci5cbiAgICAgIHRoaXMuX2lzTWlncmF0aW5nID0gaXRlbS5fZ3JpZElkICE9PSB0aGlzLl9ncmlkSWQ7XG5cbiAgICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAgIGFycmF5SW5zZXJ0KHRhcmdldEdyaWQuX2l0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAgIC8vIFNldCBzb3J0IGRhdGEgYXMgbnVsbCwgd2hpY2ggaXMgYW4gaW5kaWNhdG9yIGZvciB0aGUgaXRlbSBjb21wYXJpc29uXG4gICAgICAvLyBmdW5jdGlvbiB0aGF0IHRoZSBzb3J0IGRhdGEgb2YgdGhpcyBzcGVjaWZpYyBpdGVtIHNob3VsZCBiZSBmZXRjaGVkXG4gICAgICAvLyBsYXppbHkuXG4gICAgICBpdGVtLl9zb3J0RGF0YSA9IG51bGw7XG5cbiAgICAgIC8vIEVtaXQgc2VuZCBldmVudC5cbiAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50U2VuZCkpIHtcbiAgICAgICAgY3VycmVudEdyaWQuX2VtaXQoZXZlbnRTZW5kLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudFJlY2VpdmUsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExheW91dCBib3RoIGdyaWRzLlxuICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB0YXJnZXRHcmlkLmxheW91dCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSWYgaXRlbSBpcyBkcmFnZ2VkIGludG8gYW5vdGhlciBncmlkLCBmaW5pc2ggdGhlIG1pZ3JhdGlvbiBwcm9jZXNzXG4gICAqIGdyYWNlZnVsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoTWlncmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGlzQWN0aXZlID0gaXRlbS5faXNBY3RpdmU7XG4gICAgdmFyIHRhcmdldEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgdGFyZ2V0R3JpZEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRTZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IHRhcmdldEdyaWRFbGVtZW50O1xuICAgIHZhciBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy4gTm90ZSB0aGF0IHdlIG5lZWQgdG8gc2V0IHRoZSBtaWdyYXRpbmcgZmxhZyB0b1xuICAgIC8vIGZhbHNlIGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjcmVhdGUgYW4gaW5maW5pdGUgbG9vcCBiZXR3ZWVuIHRoaXNcbiAgICAvLyBhbmQgdGhlIGRyYWcuc3RvcCgpIG1ldGhvZC5cbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZihjdXJyZW50Q29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIHRydWUpO1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlLnggLT0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdHJhbnNsYXRlLnkgLT0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0J3MgZHJhZyBjb250YWluZXIgKGlmIGFueSlcbiAgICAvLyBhbmQgYWN0dWFsIGdyaWQgY29udGFpbmVyIGVsZW1lbnQuIFdlIHNhdmUgaXQgbGF0ZXIgZm9yIHRoZSByZWxlYXNlXG4gICAgLy8gcHJvY2Vzcy5cbiAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEdyaWRFbGVtZW50LCB0cnVlKTtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWSA9IG9mZnNldERpZmYudG9wO1xuXG4gICAgLy8gUmVjcmVhdGUgaXRlbSdzIGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBlbGVtZW50IGlmIGl0IHdhcyBtb3ZlZCBmcm9tIGEgY29udGFpbmVyXG4gICAgLy8gdG8gYW5vdGhlci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZS54LCB0cmFuc2xhdGUueSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNoaWxkIGVsZW1lbnQncyBzdHlsZXMgdG8gcmVmbGVjdCB0aGUgY3VycmVudCB2aXNpYmlsaXR5IHN0YXRlLlxuICAgIGl0ZW0uX2NoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBTdGFydCB0aGUgcmVsZWFzZS5cbiAgICByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgcHJlLXN0YXJ0IGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIExldCdzIGFjdGl2YXRlIGRyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZUluYWN0aXZlKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nO1xuICAgIH1cblxuICAgIC8vIElmIHByZWRpY2F0ZSBpcyBwZW5kaW5nIHRyeSB0byByZXNvbHZlIGl0LlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVBlbmRpbmcpIHtcbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID0gdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuICAgICAgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlc29sdmVkO1xuICAgICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlamVjdGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBpZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWcgaXMgYWN0aXZlLCBtb3ZlIHRoZSBpdGVtLlxuICAgIGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuX29uTW92ZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1lbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlRW5kQ2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBwcmVkaWNhdGUgd2FzIHJlc29sdmVkIGR1cmluZyBkcmFnLlxuICAgIHZhciBpc1Jlc29sdmVkID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcblxuICAgIC8vIERvIGZpbmFsIHByZWRpY2F0ZSBjaGVjayB0byBhbGxvdyB1c2VyIHRvIHVuYmluZCBzdHVmZiBmb3IgdGhlIGN1cnJlbnRcbiAgICAvLyBkcmFnIHByb2NlZHVyZSB3aXRoaW4gdGhlIHByZWRpY2F0ZSBjYWxsYmFjay4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzXG4gICAgLy8gY2hlY2sgd2lsbCBoYXZlIG5vIGVmZmVjdCB0byB0aGUgc3RhdGUgb2YgdGhlIHByZWRpY2F0ZS5cbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZSh0aGlzLl9pdGVtLCBldmVudCk7XG5cbiAgICAvLyBSZXNldCBzdGFydCBwcmVkaWNhdGUgc3RhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWdnaW5nIGlzIGFjdGl2ZSwgY2FsbCB0aGUgZW5kIGhhbmRsZXIuXG4gICAgaWYgKGlzUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHRoaXMuX29uRW5kKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIGRvbid0IHN0YXJ0IHRoZSBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHNldHRpbmdzLmRyYWdDb250YWluZXIgfHwgZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgY29udGFpbmluZ0Jsb2NrID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGRyYWdDb250YWluZXIsIHRydWUpO1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgICB2YXIgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYXNEcmFnQ29udGFpbmVyID0gZHJhZ0NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIFJlc2V0IGhldXJpc3RpY3MgZGF0YS5cbiAgICB0aGlzLl9yZXNldEhldXJpc3RpY3MoZXZlbnQpO1xuXG4gICAgLy8gSWYgZ3JpZCBjb250YWluZXIgaXMgbm90IHRoZSBkcmFnIGNvbnRhaW5lciwgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlXG4gICAgLy8gb2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBncmlkIGNvbnRhaW5lciBhbmQgZHJhZyBjb250YWluZXIncyBjb250YWluaW5nXG4gICAgLy8gZWxlbWVudC5cbiAgICBpZiAoaGFzRHJhZ0NvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgcG9zaXRpb25pbmcgYW5pbWF0aW9uLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IG1pZ3JhdGlvbiBhbmltYXRpb24uXG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSB7XG4gICAgICBjdXJyZW50TGVmdCAtPSBtaWdyYXRlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIGN1cnJlbnRUb3AgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBtaWdyYXRlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBiZWluZyByZWxlYXNlZCByZXNldCByZWxlYXNlIGRhdGEuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkgcmVsZWFzZS5fcmVzZXQoKTtcblxuICAgIC8vIFNldHVwIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5fY29udGFpbmVyID0gZHJhZ0NvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBjb250YWluaW5nQmxvY2s7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gZWxlbWVudFJlY3QudG9wO1xuICAgIHRoaXMuX2xlZnQgPSB0aGlzLl9ncmlkWCA9IGN1cnJlbnRMZWZ0O1xuICAgIHRoaXMuX3RvcCA9IHRoaXMuX2dyaWRZID0gY3VycmVudFRvcDtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciAoaWYgbmVjZXNzYXJ5KS5cbiAgICBpZiAoc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQpIHtcbiAgICAgIGl0ZW0uX2RyYWdQbGFjZWhvbGRlci5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdJbml0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnSW5pdCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gSWYgYSBzcGVjaWZpYyBkcmFnIGNvbnRhaW5lciBpcyBzZXQgYW5kIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZVxuICAgIC8vIGdyaWQncyBjb250YWluZXIgZWxlbWVudCB3ZSBuZWVkIHRvIGNhc3Qgc29tZSBleHRyYSBzcGVsbHMuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBjb250YWluZXIgb2Zmc2V0IGRpZmZzIHRvIGRyYWcgZGF0YS5cbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgICAgLy8gSWYgdGhlIGRyYWdnZWQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIHRoZSBkcmFnIGNvbnRhaW5lciBhbGwgd2UgbmVlZCB0b1xuICAgICAgLy8gZG8gaXMgc2V0dXAgdGhlIHJlbGF0aXZlIGRyYWcgcG9zaXRpb24gZGF0YS5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgPT09IGRyYWdDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgICAgICB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVjdCBjb250YWluZXIsXG4gICAgICAvLyBzZXR1cCB0aGUgYWN0dWFsIGRyYWcgcG9zaXRpb24gZGF0YSBhbmQgYWRqdXN0IHRoZSBlbGVtZW50J3MgdHJhbnNsYXRlXG4gICAgICAvLyB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBwb3NpdGlvbiBzaGlmdC5cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9sZWZ0ID0gY3VycmVudExlZnQgKyB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fdG9wID0gY3VycmVudFRvcCArIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgICBkcmFnQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGRyYWcgY2xhc3MgYW5kIGJpbmQgc2Nyb2xsZXJzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcbiAgICB0aGlzLl9iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTdGFydCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ1N0YXJ0LCBpdGVtLCBldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgbW92ZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbk1vdmUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBheGlzID0gc2V0dGluZ3MuZHJhZ0F4aXM7XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHZhciB4RGlmZiA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCArPSB4RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYICs9IHhEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB2ZXJ0aWNhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneCcpIHtcbiAgICAgIHZhciB5RGlmZiA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WTtcbiAgICAgIHRoaXMuX3RvcCArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2dyaWRZICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZWxlbWVudENsaWVudFkgKz0geURpZmY7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG5cbiAgICAvLyBEbyBtb3ZlIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRNb3ZlVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZU1vdmUsIHRoaXMuX2FwcGx5TW92ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBtb3ZpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIXRoaXMuX2l0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBJZiBkcmFnIHNvcnQgaXMgZW5hYmxlZCAtPiBjaGVjayBvdmVybGFwLlxuICAgIGlmICh0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTb3J0KSB7XG4gICAgICBpZiAodGhpcy5fY2hlY2tIZXVyaXN0aWNzKHRoaXMuX2RyYWdFdmVudCkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IG1vdmVtZW50IHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCdzIHRyYW5zbGF0ZVgvWSB2YWx1ZXMuXG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuXG4gICAgLy8gRW1pdCBkcmFnTW92ZSBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnTW92ZSwgaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzY3JvbGwgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblNjcm9sbCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCByZXNldCBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsYXN0IHNjcm9sbCBldmVudC5cbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gc2Nyb2xsIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRTY3JvbGxUaWNrKGl0ZW0uX2lkLCB0aGlzLl9wcmVwYXJlU2Nyb2xsLCB0aGlzLl9hcHBseVNjcm9sbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIENhbGN1bGF0ZSBlbGVtZW50J3MgcmVjdCBhbmQgeC95IGRpZmYuXG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciB4RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHZhciB5RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIGRpZmYuXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGhpcy5fY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCA9IHRoaXMuX2xlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSA9IHRoaXMuX3RvcCAtIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgIH1cblxuICAgIC8vIE92ZXJsYXAgaGFuZGxpbmcuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdTb3J0KSB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBzY3JvbGwgdG8gZHJhZ2dlZCBpdGVtLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2FwcGx5U2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlIGRvIG5vdGhpbmcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ1Njcm9sbCBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnU2Nyb2xsLCBpdGVtLCB0aGlzLl9zY3JvbGxFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX29uRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5fZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgcXVldWVkIG1vdmUgYW5kIHNjcm9sbCB0aWNrcy5cbiAgICBjYW5jZWxNb3ZlVGljayhpdGVtLl9pZCk7XG4gICAgY2FuY2VsU2Nyb2xsVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBGaW5pc2ggY3VycmVudGx5IHF1ZXVlZCBvdmVybGFwIGNoZWNrLlxuICAgIHNldHRpbmdzLmRyYWdTb3J0ICYmIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCdmaW5pc2gnKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gU2V0dXAgcmVsZWFzZSBkYXRhLlxuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZYID0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSB0aGlzLl9jb250YWluZXJEaWZmWTtcblxuICAgIC8vIFJlc2V0IGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgbmFtZSBmcm9tIGVsZW1lbnQuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnRW5kIGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnRW5kLCBpdGVtLCBldmVudCk7XG5cbiAgICAvLyBGaW5pc2ggdXAgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIG9yIHN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPyB0aGlzLl9maW5pc2hNaWdyYXRpb24oKSA6IHJlbGVhc2Uuc3RhcnQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGhvdyBtYW55IHBlcmNlbnQgdGhlIGludGVyc2VjdGlvbiBhcmVhIG9mIHR3byByZWN0YW5nbGVzIGlzIGZyb21cbiAgICogdGhlIG1heGltdW0gcG90ZW50aWFsIGludGVyc2VjdGlvbiBhcmVhIGJldHdlZW4gdGhlIHJlY3RhbmdsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqICAgLSBBIG51bWJlciBiZXR3ZWVuIDAtMTAwLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVjdE92ZXJsYXBTY29yZShhLCBiKSB7XG4gICAgLy8gUmV0dXJuIDAgaW1tZWRpYXRlbHkgaWYgdGhlIHJlY3RhbmdsZXMgZG8gbm90IG92ZXJsYXAuXG4gICAgaWYgKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIGFyZWEncyB3aWR0aCwgaGVpZ2h0LCBtYXggaGVpZ2h0IGFuZCBtYXggd2lkdGguXG4gICAgdmFyIHdpZHRoID0gTWF0aC5taW4oYS5sZWZ0ICsgYS53aWR0aCwgYi5sZWZ0ICsgYi53aWR0aCkgLSBNYXRoLm1heChhLmxlZnQsIGIubGVmdCk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGgubWluKGEudG9wICsgYS5oZWlnaHQsIGIudG9wICsgYi5oZWlnaHQpIC0gTWF0aC5tYXgoYS50b3AsIGIudG9wKTtcbiAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbihhLndpZHRoLCBiLndpZHRoKTtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gTWF0aC5taW4oYS5oZWlnaHQsIGIuaGVpZ2h0KTtcblxuICAgIHJldHVybiAoKHdpZHRoICogaGVpZ2h0KSAvIChtYXhXaWR0aCAqIG1heEhlaWdodCkpICogMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgYW4gYW5jaG9yIGVsZW1lbnQgYW5kIG9wZW4gdGhlIGhyZWYgdXJsIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBvcGVuQW5jaG9ySHJlZihlbGVtZW50KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFuY2hvciBlbGVtZW50LlxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2EnKSByZXR1cm47XG5cbiAgICAvLyBHZXQgaHJlZiBhbmQgbWFrZSBzdXJlIGl0IGV4aXN0cy5cbiAgICB2YXIgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgaWYgKCFocmVmKSByZXR1cm47XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIG5hdmlnYXRlIHRvIHRoZSBsaW5rIGhyZWYuXG4gICAgdmFyIHRhcmdldCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gJ19zZWxmJykge1xuICAgICAgd2luZG93Lm9wZW4oaHJlZiwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFnIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtRHJhZ1BsYWNlaG9sZGVyKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fY2xhc3NOYW1lID0gJyc7XG4gICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IDA7XG4gICAgdGhpcy5fbmV4dExlZnQgPSAwO1xuICAgIHRoaXMuX25leHRUb3AgPSAwO1xuXG4gICAgLy8gQmluZCBhbmltYXRpb24gaGFuZGxlcnMuXG4gICAgdGhpcy5fc2V0dXBBbmltYXRpb24gPSB0aGlzLl9zZXR1cEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uID0gdGhpcy5fc3RhcnRBbmltYXRpb24uYmluZCh0aGlzKTtcblxuICAgIC8vIEJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fb25MYXlvdXRTdGFydCA9IHRoaXMuX29uTGF5b3V0U3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkxheW91dEVuZCA9IHRoaXMuX29uTGF5b3V0RW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlRW5kID0gdGhpcy5fb25SZWxlYXNlRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25NaWdyYXRlID0gdGhpcy5fb25NaWdyYXRlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNb3ZlIHBsYWNlaG9sZGVyIHRvIGEgbmV3IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vbkxheW91dFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG5cbiAgICAvLyBGaW5kIG91dCB0aGUgaXRlbSdzIG5ldyAodW5hcHBsaWVkKSBsZWZ0IGFuZCB0b3AgcG9zaXRpb24uXG4gICAgdmFyIGl0ZW1JbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIG5leHRMZWZ0ID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDJdO1xuICAgIHZhciBuZXh0VG9wID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDIgKyAxXTtcblxuICAgIC8vIElmIGl0ZW0ncyBwb3NpdGlvbiBkaWQgbm90IGNoYW5nZSBhbmQgdGhlIGl0ZW0gZGlkIG5vdCBtaWdyYXRlIHdlIGNhblxuICAgIC8vIHNhZmVseSBza2lwIGxheW91dC5cbiAgICBpZiAoIXRoaXMuX2RpZE1pZ3JhdGUgJiYgaXRlbS5fbGVmdCA9PT0gbmV4dExlZnQgJiYgaXRlbS5fdG9wID09PSBuZXh0VG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2xvdHMgZGF0YSBpcyBjYWxjdWxhdGVkIHdpdGggaXRlbSBtYXJnaW5zIGFkZGVkIHRvIHRoZW0gc28gd2UgbmVlZCB0byBhZGRcbiAgICAvLyBpdGVtJ3MgbGVmdCBhbmQgdG9wIG1hcmdpbiB0byB0aGUgc2xvdCBkYXRhIHRvIGdldCB0aGUgcGxhY2Vob2xkZXInc1xuICAgIC8vIG5leHQgcG9zaXRpb24uXG4gICAgbmV4dExlZnQgKz0gaXRlbS5fbWFyZ2luTGVmdDtcbiAgICBuZXh0VG9wICs9IGl0ZW0uX21hcmdpblRvcDtcblxuICAgIC8vIEp1c3Qgc25hcCB0byBuZXcgcG9zaXRpb24gd2l0aG91dCBhbnkgYW5pbWF0aW9ucyBpZiBubyBhbmltYXRpb24gaXNcbiAgICAvLyByZXF1aXJlZCBvciBpZiBwbGFjZWhvbGRlciBtb3ZlcyBiZXR3ZWVuIGdyaWRzLlxuICAgIHZhciBhbmltRW5hYmxlZCA9IGdyaWQuX3NldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5kdXJhdGlvbiA+IDA7XG4gICAgaWYgKCFhbmltRW5hYmxlZCB8fCB0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgICAgLy8gU25hcCBwbGFjZWhvbGRlciB0byBjb3JyZWN0IHBvc2l0aW9uLlxuICAgICAgdmFyIHRhcmdldFN0eWxlcyA9IHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobmV4dExlZnQsIG5leHRUb3ApIH07XG4gICAgICBpZiAodGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgcGxhY2Vob2xkZXIgaW5zaWRlIGNvcnJlY3QgY29udGFpbmVyIGFmdGVyIG1pZ3JhdGlvbi5cbiAgICAgIGlmICh0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICB0aGlzLl9kaWRNaWdyYXRlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgcGxhY2Vob2xkZXIncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suIFdlIGRvIHRoaXMgdG9cbiAgICAvLyBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nLlxuICAgIHRoaXMuX25leHRMZWZ0ID0gbmV4dExlZnQ7XG4gICAgdGhpcy5fbmV4dFRvcCA9IG5leHRUb3A7XG4gICAgYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIHBsYWNlaG9sZGVyIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcbiAgICB2YXIgY3VycmVudExlZnQgPSB0aGlzLl9jdXJyZW50TGVmdDtcbiAgICB2YXIgY3VycmVudFRvcCA9IHRoaXMuX2N1cnJlbnRUb3A7XG4gICAgdmFyIG5leHRMZWZ0ID0gdGhpcy5fbmV4dExlZnQ7XG4gICAgdmFyIG5leHRUb3AgPSB0aGlzLl9uZXh0VG9wO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuXG4gICAgLy8gSWYgcGxhY2Vob2xkZXIgaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIGp1c3Qgc3RvcCBhbmltYXRpb25cbiAgICAvLyBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmIChjdXJyZW50TGVmdCA9PT0gbmV4dExlZnQgJiYgY3VycmVudFRvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgaWYgKGFuaW1hdGlvbi5pc0FuaW1hdGluZygpKSBhbmltYXRpb24uc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBsZXQncyBzdGFydCB0aGUgYW5pbWF0aW9uLlxuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGN1cnJlbnRMZWZ0LCBjdXJyZW50VG9wKSB9O1xuICAgIGFuaW1hdGlvbi5zdGFydChjdXJyZW50U3R5bGVzLCB0YXJnZXRTdHlsZXMsIHtcbiAgICAgIGR1cmF0aW9uOiBzZXR0aW5ncy5kdXJhdGlvbixcbiAgICAgIGVhc2luZzogc2V0dGluZ3MuZWFzaW5nLFxuICAgICAgb25GaW5pc2g6IHRoaXMuX29uTGF5b3V0RW5kXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExheW91dCBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRFbmQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fcmVzZXRBZnRlckxheW91dCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBlbmQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGRyYWdSZWxlYXNlRW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vblJlbGVhc2VFbmQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgaWYgKGl0ZW0uX2lkID09PSB0aGlzLl9pdGVtLl9pZCkge1xuICAgICAgLy8gSWYgdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBhbmltYXRpbmcgYW55bW9yZSB3ZSBjYW4gc2FmZWx5IHJlc2V0IGl0LlxuICAgICAgaWYgKCF0aGlzLl9hbmltYXRlLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpdGVtIGlzIHN0aWxsIGFuaW1hdGluZyBoZXJlLCBsZXQncyB3YWl0IGZvciBpdCB0b1xuICAgICAgLy8gZmluaXNoIGl0J3MgYW5pbWF0aW9uLlxuICAgICAgdGhpcy5fcmVzZXRBZnRlckxheW91dCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBNaWdyYXRpb24gc3RhcnQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGJlZm9yZVNlbmQgZXZlbnQgaXNcbiAgICogZW1pdHRlZCBhbmQgcmVjZWl2ZXMgdGhlIGV2ZW50IGRhdGEgYXMgaXQncyBhcmd1bWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7SXRlbX0gZGF0YS5pdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS5mcm9tR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS5mcm9tSW5kZXhcbiAgICogQHBhcmFtIHtHcmlkfSBkYXRhLnRvR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS50b0luZGV4XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25NaWdyYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbWF0Y2hpbmcgaXRlbS5cbiAgICBpZiAoZGF0YS5pdGVtICE9PSB0aGlzLl9pdGVtKSByZXR1cm47XG5cbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBuZXh0R3JpZCA9IGRhdGEudG9HcmlkO1xuXG4gICAgLy8gVW5iaW5kIGxpc3RlbmVycyBmcm9tIGN1cnJlbnQgZ3JpZC5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIEJpbmQgbGlzdGVuZXJzIHRvIHRoZSBuZXh0IGdyaWQuXG4gICAgbmV4dEdyaWQub24oZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBuZXh0R3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBuZXh0R3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBNYXJrIHRoZSBpdGVtIGFzIG1pZ3JhdGVkLlxuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgcGxhY2Vob2xkZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IHdyaXRlcyB0byBET00gYW5kIGRvZXMgbm90XG4gICAqIHJlYWQgYW55dGhpbmcgZnJvbSBET00gc28gaXQgc2hvdWxkIG5vdCBjYXVzZSBhbnkgYWRkaXRpb25hbCBsYXlvdXRcbiAgICogdGhyYXNoaW5nIHdoZW4gaXQncyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBzdGFydCBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcGxhY2Vob2xkZXIgc2V0IHVwIHdlIGNhbiBza2lwIHRoZSBpbml0aWF0aW9uIGxvZ2ljLlxuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHZhciBlbGVtZW50O1xuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KSkge1xuICAgICAgZWxlbWVudCA9IHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50IHRvIGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gQWRkIHBsYWNlaG9sZGVyIGNsYXNzIHRvIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHNldHRpbmdzLml0ZW1QbGFjZWhvbGRlckNsYXNzIHx8ICcnO1xuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gdGhlIHBsYWNlaG9sZGVyIGl0ZW0gY29ycmVjdGx5LlxuICAgIHZhciBsZWZ0ID0gaXRlbS5fbGVmdCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgdmFyIHRvcCA9IGl0ZW0uX3RvcCArIGl0ZW0uX21hcmdpblRvcDtcbiAgICBzZXRTdHlsZXMoZWxlbWVudCwge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICB3aWR0aDogaXRlbS5fd2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiBpdGVtLl9oZWlnaHQgKyAncHgnLFxuICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobGVmdCwgdG9wKVxuICAgIH0pO1xuXG4gICAgLy8gQmluZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgZ3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBvbkNyZWF0ZSBob29rLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gdGhlIGdyaWQuXG4gICAgZ3JpZC5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBsYWNlaG9sZGVyIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBSZXNldCBmbGFnLlxuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcblxuICAgIC8vIENhbmNlbCBwb3RlbnRpYWwgKHF1ZXVlZCkgbGF5b3V0IHRpY2suXG4gICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlc2V0IGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uc3RvcCgpO1xuICAgIGFuaW1hdGlvbi5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub2ZmKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzIGZyb20gdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgaWYgKHRoaXMuX2NsYXNzTmFtZSkge1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgdGhpcy5fY2xhc3NOYW1lKTtcbiAgICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBlbGVtZW50LlxuICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIG9uUmVtb3ZlIGhvb2suIE5vdGUgdGhhdCBoZXJlIHdlIHVzZSB0aGUgY3VycmVudCBncmlkJ3Mgb25SZW1vdmUgY2FsbGJhY2tcbiAgICAvLyBzbyBpZiB0aGUgaXRlbSBoYXMgbWlncmF0ZWQgZHVyaW5nIGRyYWcgdGhlIG9uUmVtb3ZlIG1ldGhvZCB3aWxsIG5vdCBiZVxuICAgIC8vIHRoZSBvcmlnaW5hdGluZyBncmlkJ3MgbWV0aG9kLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge2hlaWdodH0gaGVpZ2h0XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS51cGRhdGVEaW1lbnNpb25zID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0ICsgJ3B4J1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwbGFjZWhvbGRlciBpcyBjdXJyZW50bHkgYWN0aXZlICh2aXNpYmxlKS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgcGxhY2Vob2xkZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuX2FuaW1hdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2l0ZW0gPSB0aGlzLl9hbmltYXRlID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogUXVldWUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUXVldWUoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFkZCBjYWxsYmFjayB0byB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHF1ZXVlIGNhbGxiYWNrcyBhbmQgcmVzZXQgdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsqfSBhcmcxXG4gICAqIEBwYXJhbSB7Kn0gYXJnMlxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhcmcxLCBhcmcyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBsZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBRdWl0IGVhcmx5IGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBpZiAoIWxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgc2luZ2xlQ2FsbGJhY2sgPSBsZW5ndGggPT09IDE7XG4gICAgdmFyIHNuYXBzaG90ID0gc2luZ2xlQ2FsbGJhY2sgPyBxdWV1ZVswXSA6IHF1ZXVlLnNsaWNlKDApO1xuXG4gICAgLy8gUmVzZXQgcXVldWUuXG4gICAgcXVldWUubGVuZ3RoID0gMDtcblxuICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBjYWxsYmFjayBsZXQncyBqdXN0IGNhbGwgaXQuXG4gICAgaWYgKHNpbmdsZUNhbGxiYWNrKSB7XG4gICAgICBzbmFwc2hvdChhcmcxLCBhcmcyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbXVsdGlwbGUgY2FsbGJhY2tzLCBsZXQncyBwcm9jZXNzIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBzbmFwc2hvdFtpXShhcmcxLCBhcmcyKTtcbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgUXVldWUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fcXVldWUubGVuZ3RoID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUxheW91dChpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50U3R5bGVzID0ge307XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzID0ge307XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX29mZnNldExlZnQgPSAwO1xuICAgIHRoaXMuX29mZnNldFRvcCA9IDA7XG4gICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IHtcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9maW5pc2guYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzIGFuZCBmaW5pc2ggbWV0aG9kLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaXRlbSBsYXlvdXQgYmFzZWQgb24gaXQncyBjdXJyZW50IGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZ3JpZFNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBpc1Bvc2l0aW9uaW5nID0gdGhpcy5faXNBY3RpdmU7XG4gICAgdmFyIGlzSnVzdFJlbGVhc2VkID0gcmVsZWFzZS5faXNBY3RpdmUgJiYgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPT09IGZhbHNlO1xuICAgIHZhciBhbmltRHVyYXRpb24gPSBpc0p1c3RSZWxlYXNlZFxuICAgICAgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VEdXJhdGlvblxuICAgICAgOiBncmlkU2V0dGluZ3MubGF5b3V0RHVyYXRpb247XG4gICAgdmFyIGFuaW1FYXNpbmcgPSBpc0p1c3RSZWxlYXNlZCA/IGdyaWRTZXR0aW5ncy5kcmFnUmVsZWFzZUVhc2luZyA6IGdyaWRTZXR0aW5ncy5sYXlvdXRFYXNpbmc7XG4gICAgdmFyIGFuaW1FbmFibGVkID0gIWluc3RhbnQgJiYgIXRoaXMuX3NraXBOZXh0QW5pbWF0aW9uICYmIGFuaW1EdXJhdGlvbiA+IDA7XG4gICAgdmFyIGlzQW5pbWF0aW5nO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgY3VycmVudGx5IHBvc2l0aW9uaW5nIHByb2Nlc3MgY3VycmVudCBsYXlvdXQgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIGludGVycnVwdGVkIGZsYWcgb24uXG4gICAgaWYgKGlzUG9zaXRpb25pbmcpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgLy8gTWFyayByZWxlYXNlIHBvc2l0aW9uaW5nIGFzIHN0YXJ0ZWQuXG4gICAgaWYgKGlzSnVzdFJlbGVhc2VkKSByZWxlYXNlLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IHRydWU7XG5cbiAgICAvLyBQdXNoIHRoZSBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgaWYgKGlzRnVuY3Rpb24ob25GaW5pc2gpKSB0aGlzLl9xdWV1ZS5hZGQob25GaW5pc2gpO1xuXG4gICAgLy8gSWYgbm8gYW5pbWF0aW9ucyBhcmUgbmVlZGVkLCBlYXN5IHBlYXN5IVxuICAgIGlmICghYW5pbUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuICAgICAgaXNBbmltYXRpbmcgPSBpdGVtLl9hbmltYXRlLmlzQW5pbWF0aW5nKCk7XG4gICAgICB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICAhaXNBbmltYXRpbmcgJiYgc2V0U3R5bGVzKGVsZW1lbnQsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtIGFjdGl2ZSBhbmQgc3RvcmUgc29tZSBkYXRhIGZvciB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgYWJvdXQgdG8gYmVcbiAgICAvLyB0cmlnZ2VyZWQuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmVhc2luZyA9IGFuaW1FYXNpbmc7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMuZHVyYXRpb24gPSBhbmltRHVyYXRpb247XG4gICAgdGhpcy5faXNJbnRlcnJ1cHRlZCA9IGlzUG9zaXRpb25pbmc7XG5cbiAgICAvLyBTdGFydCB0aGUgaXRlbSdzIGxheW91dCBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRMYXlvdXRUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaXRlbSdzIHBvc2l0aW9uIGFuaW1hdGlvbiBpZiBpdCBpcyBjdXJyZW50bHkgYW5pbWF0aW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwcm9jZXNzQ2FsbGJhY2tRdWV1ZT1mYWxzZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRTdHlsZXNdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHByb2Nlc3NDYWxsYmFja1F1ZXVlLCB0YXJnZXRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIENhbmNlbCBhbmltYXRpb24gaW5pdC5cbiAgICBjYW5jZWxMYXlvdXRUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFN0b3AgYW5pbWF0aW9uLlxuICAgIGl0ZW0uX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuXG4gICAgLy8gUmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzLlxuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBhY3RpdmUgc3RhdGUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFByb2Nlc3MgY2FsbGJhY2sgcXVldWUgaWYgbmVlZGVkLlxuICAgIGlmIChwcm9jZXNzQ2FsbGJhY2tRdWV1ZSkgdGhpcy5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSwge30pO1xuICAgIHRoaXMuX3F1ZXVlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fY3VycmVudFN0eWxlcyA9IHRoaXMuX3RhcmdldFN0eWxlcyA9IHRoaXMuX2FuaW1hdGVPcHRpb25zID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGN1cnJlbnQgbGF5b3V0IG9mZnNldCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVPZmZzZXRzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIHRoaXMuX29mZnNldExlZnQgPSByZWxlYXNlLl9pc0FjdGl2ZVxuICAgICAgPyByZWxlYXNlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiBtaWdyYXRlLl9pc0FjdGl2ZVxuICAgICAgPyBtaWdyYXRlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiAwO1xuXG4gICAgdGhpcy5fb2Zmc2V0VG9wID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGxheW91dCB0YXJnZXQgc3R5bGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVUYXJnZXRTdHlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLl90YXJnZXRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgdGhpcy5faXRlbS5fbGVmdCArIHRoaXMuX29mZnNldExlZnQsXG4gICAgICB0aGlzLl9pdGVtLl90b3AgKyB0aGlzLl9vZmZzZXRUb3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggaXRlbSBsYXlvdXQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgbWlncmF0ZSA9IGl0ZW0uX21pZ3JhdGU7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBpbmFjdGl2ZSBhbmQgcmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzZXMuXG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgcmVtb3ZlQ2xhc3MoaXRlbS5fZWxlbWVudCwgaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzLml0ZW1Qb3NpdGlvbmluZ0NsYXNzKTtcbiAgICB9XG5cbiAgICAvLyBGaW5pc2ggdXAgcmVsZWFzZSBhbmQgbWlncmF0aW9uLlxuICAgIGlmIChyZWxlYXNlLl9pc0FjdGl2ZSkgcmVsZWFzZS5zdG9wKCk7XG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSBtaWdyYXRlLnN0b3AoKTtcblxuICAgIC8vIFByb2Nlc3MgdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBpdGVtIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUodGhpcy5faXRlbS5fZWxlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSB0cmFuc2xhdGUueDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxheW91dCBhbmltYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgb2Zmc2V0IGRhdGEgYW5kIHRhcmdldCBzdHlsZXMuXG4gICAgdGhpcy5fdXBkYXRlT2Zmc2V0cygpO1xuICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKFxuICAgICAgaXRlbS5fbGVmdCA9PT0gdGhpcy5fY3VycmVudExlZnQgLSB0aGlzLl9vZmZzZXRMZWZ0ICYmXG4gICAgICBpdGVtLl90b3AgPT09IHRoaXMuX2N1cnJlbnRUb3AgLSB0aGlzLl9vZmZzZXRUb3BcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLl9pc0ludGVycnVwdGVkKSB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0ncyBwb3NpdGlvbmluZyBjbGFzcyBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9pc0ludGVycnVwdGVkKSB7XG4gICAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBzZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgc3R5bGVzIGZvciBhbmltYXRpb24uXG4gICAgdGhpcy5fY3VycmVudFN0eWxlcy50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fY3VycmVudExlZnQsIHRoaXMuX2N1cnJlbnRUb3ApO1xuXG4gICAgLy8gQW5pbWF0ZS5cbiAgICBpdGVtLl9hbmltYXRlLnN0YXJ0KHRoaXMuX2N1cnJlbnRTdHlsZXMsIHRoaXMuX3RhcmdldFN0eWxlcywgdGhpcy5fYW5pbWF0ZU9wdGlvbnMpO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBtaWdyYXRlIHByb2Nlc3MgaGFuZGxlciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbU1pZ3JhdGUoaXRlbSkge1xuICAgIC8vIFByaXZhdGUgcHJvcHMuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkfSB0YXJnZXRHcmlkXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2NvbnRhaW5lcl1cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24odGFyZ2V0R3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc1Zpc2libGUgPSBpdGVtLmlzVmlzaWJsZSgpO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldFNldHRpbmdzID0gdGFyZ2V0R3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRhcmdldEdyaWQuX2l0ZW1zO1xuICAgIHZhciBjdXJyZW50SW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBjb250YWluZXIgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciB0YXJnZXRJdGVtO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyO1xuICAgIHZhciBvZmZzZXREaWZmO1xuICAgIHZhciBjb250YWluZXJEaWZmO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIHRyYW5zbGF0ZVg7XG4gICAgdmFyIHRyYW5zbGF0ZVk7XG5cbiAgICAvLyBHZXQgdGFyZ2V0IGluZGV4LlxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0SXRlbXMsIHBvc2l0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0SXRlbSA9IHRhcmdldEdyaWQuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgICAgLyoqIEB0b2RvIENvbnNpZGVyIHRocm93aW5nIGFuIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBzaWxlbnRseSBmYWlsaW5nLiAqL1xuICAgICAgaWYgKCF0YXJnZXRJdGVtKSByZXR1cm4gdGhpcztcbiAgICAgIHRhcmdldEluZGV4ID0gdGFyZ2V0SXRlbXMuaW5kZXhPZih0YXJnZXRJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBpZiBuZWVkZWQuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpIHx8IHRoaXMuX2lzQWN0aXZlIHx8IGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZS54O1xuICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgcG9zaXRpb25pbmcuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpKSB7XG4gICAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVkpIH0pO1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgbWlncmF0aW9uLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB0aGlzLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHJlbGVhc2UuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSBpdGVtLl9yZWxlYXNlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBpdGVtLl9yZWxlYXNlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb25zLlxuICAgIGl0ZW0uX3Zpc2liaWxpdHkuX3N0b3BBbmltYXRpb24oKTtcblxuICAgIC8vIERlc3Ryb3kgY3VycmVudCBkcmFnLlxuICAgIGlmIChpdGVtLl9kcmFnKSBpdGVtLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFByb2Nlc3MgY3VycmVudCB2aXNpYmlsaXR5IGFuaW1hdGlvbiBxdWV1ZS5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIEVtaXQgYmVmb3JlU2VuZCBldmVudC5cbiAgICBpZiAoZ3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlU2VuZCkpIHtcbiAgICAgIGdyaWQuX2VtaXQoZXZlbnRCZWZvcmVTZW5kLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudEJlZm9yZVJlY2VpdmUsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgY3VycmVudCBjbGFzc25hbWVzLlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIEFkZCBuZXcgY2xhc3NuYW1lcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCB0YXJnZXRTZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzVmlzaWJsZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSBpdGVtIGluc3RhbmNlIGZyb20gY3VycmVudCBncmlkIHRvIHRhcmdldCBncmlkLlxuICAgIGdyaWQuX2l0ZW1zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIGFycmF5SW5zZXJ0KHRhcmdldEl0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGN1cnJlbnRDb250YWluZXIgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBNb3ZlIHRoZSBpdGVtIGluc2lkZSB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZVxuICAgIC8vIGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGlmICh0YXJnZXRDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpIHtcbiAgICAgIHRhcmdldENvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgY3VycmVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICBpZiAoIXRyYW5zbGF0ZSkge1xuICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgdHJhbnNsYXRlWCArIG9mZnNldERpZmYubGVmdCxcbiAgICAgICAgdHJhbnNsYXRlWSArIG9mZnNldERpZmYudG9wXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogdGFyZ2V0U2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcblxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHN0eWxlLlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzVmlzaWJsZSA/ICdibG9jaycgOiAnaGlkZGVuJztcblxuICAgIC8vIEdldCBvZmZzZXQgZGlmZiBmb3IgdGhlIG1pZ3JhdGlvbiBkYXRhLlxuICAgIGNvbnRhaW5lckRpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgdGFyZ2V0RWxlbWVudCwgdHJ1ZSk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGNhY2hlZCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgaXRlbS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICBpdGVtLl9yZWZyZXNoU29ydERhdGEoKTtcblxuICAgIC8vIENyZWF0ZSBuZXcgZHJhZyBoYW5kbGVyLlxuICAgIGl0ZW0uX2RyYWcgPSB0YXJnZXRTZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyhpdGVtKSA6IG51bGw7XG5cbiAgICAvLyBTZXR1cCBtaWdyYXRpb24gZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fY29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gY29udGFpbmVyRGlmZi5sZWZ0O1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gY29udGFpbmVyRGlmZi50b3A7XG5cbiAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgcmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgbWlncmF0ZSBwcm9jZXNzIG9mIGFuIGl0ZW0uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGFib3J0IGFuXG4gICAqIG9uZ29pbmcgbWlncmF0ZSBwcm9jZXNzIChhbmltYXRpb24pIG9yIGZpbmlzaCB0aGUgbWlncmF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbYWJvcnQ9ZmFsc2VdXG4gICAqICAtIFNob3VsZCB0aGUgbWlncmF0aW9uIGJlIGFib3J0ZWQ/XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBncmlkRWxlbWVudCA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIHRyYW5zbGF0ZTtcblxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRFbGVtZW50KSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgICAgICAgdHJhbnNsYXRlLnggLSB0aGlzLl9jb250YWluZXJEaWZmWCxcbiAgICAgICAgICAgIHRyYW5zbGF0ZS55IC0gdGhpcy5fY29udGFpbmVyRGlmZllcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXM7XG4gICAgICB9XG4gICAgICBncmlkRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCh0cnVlKTtcbiAgICB0aGlzLl9pdGVtID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIHRlbXBTdHlsZXMkMSA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuIEFsdGhvdWdoIHRoaXMgbWlnaHQgc2VlbSBhcyBwcm9wZXJcbiAgICogZml0IGZvciB0aGUgZHJhZyBwcm9jZXNzIHRoaXMgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIGludG8gaXQncyBvd24gbG9naWNcbiAgICogYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBhIHNjZW5hcmlvIHdoZXJlIGRyYWcgaXMgZGlzYWJsZWQsIGJ1dCB0aGUgcmVsZWFzZVxuICAgKiBwcm9jZXNzIHN0aWxsIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIChkcmFnZ2luZyBmcm9tIGEgZ3JpZCB0byBhbm90aGVyKS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVJlbGVhc2UoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtUmVsZWFzZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmxhZyByZWxlYXNlIGFzIGFjdGl2ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAvLyBBZGQgcmVsZWFzZSBjbGFzcyBuYW1lIHRvIHRoZSByZWxlYXNlZCBlbGVtZW50LlxuICAgIGFkZENsYXNzKGl0ZW0uX2VsZW1lbnQsIGdyaWQuX3NldHRpbmdzLml0ZW1SZWxlYXNpbmdDbGFzcyk7XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdSZWxlYXNlU3RhcnQsIGl0ZW0pO1xuXG4gICAgLy8gUG9zaXRpb24gdGhlIHJlbGVhc2VkIGl0ZW0uXG4gICAgaXRlbS5fbGF5b3V0LnN0YXJ0KGZhbHNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIHJlbGVhc2UgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIHJlbGVhc2UgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIHJlbGVhc2UgYmUgYWJvcnRlZD8gV2hlbiB0cnVlLCB0aGUgcmVsZWFzZSBlbmQgZXZlbnQgd29uJ3QgYmVcbiAgICogICAgZW1pdHRlZC4gU2V0IHRvIHRydWUgb25seSB3aGVuIHlvdSBuZWVkIHRvIGFib3J0IHRoZSByZWxlYXNlIHByb2Nlc3NcbiAgICogICAgd2hpbGUgdGhlIGl0ZW0gaXMgYW5pbWF0aW5nIHRvIGl0J3MgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBjb250YWluZXIgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzIG5hbWUgZnJvbSB0aGUgZWxlbWVudC5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gSWYgdGhlIHJlbGVhc2VkIGVsZW1lbnQgaXMgb3V0c2lkZSB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50IHB1dCBpdFxuICAgIC8vIGJhY2sgdGhlcmUgYW5kIGFkanVzdCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgIGlmICghY3VycmVudFN0eWxlcykge1xuICAgICAgICBpZiAoYWJvcnQpIHtcbiAgICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzJDEudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXMkMTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlRW5kIGV2ZW50LlxuICAgIGlmICghYWJvcnQpIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZUVuZCwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlc2V0IHB1YmxpYyBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIHN0eWxlcyBkZWZpbml0aW9uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVzXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB7fTtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgY3VycmVudFtwcm9wXSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wKSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2liaWxpdHkgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVZpc2liaWxpdHkoaXRlbSkge1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHVwIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIHRoaXMuX2lzSGlkZGVuID0gIWlzQWN0aXZlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBDYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gICAgLy8gQmluZCBzaG93L2hpZGUgZmluaXNoZXJzLlxuICAgIHRoaXMuX2ZpbmlzaFNob3cgPSB0aGlzLl9maW5pc2hTaG93LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZmluaXNoSGlkZSA9IHRoaXMuX2ZpbmlzaEhpZGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEZvcmNlIGl0ZW0gdG8gYmUgZWl0aGVyIHZpc2libGUgb3IgaGlkZGVuIG9uIGluaXQuXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gaXNBY3RpdmUgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgLy8gU2V0IHZpc2libGUvaGlkZGVuIGNsYXNzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzQWN0aXZlID8gc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyA6IHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBTZXQgaW5pdGlhbCBzdHlsZXMgZm9yIHRoZSBjaGlsZCBlbGVtZW50LlxuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNBY3RpdmUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTaG93IGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluc3RhbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIGNhbGxiYWNrID0gaXNGdW5jdGlvbihvbkZpbmlzaCkgPyBvbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIElmIGl0ZW0gaXMgdmlzaWJsZSBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNTaG93aW5nICYmICF0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBzaG93aW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNob3duIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzU2hvd2luZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGhpZGluZyBvciBoaWRkZW4gcHJvY2VzcyB0aGUgY3VycmVudCB2aXNpYmlsaXR5IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCB0aGUgaW50ZXJydXB0ZWQgZmxhZyBhY3RpdmUsIHVwZGF0ZSBjbGFzc2VzIGFuZCBzZXQgZGlzcGxheVxuICAgIC8vIHRvIGJsb2NrIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgICBpZiAoIXRoaXMuX2lzSGlkaW5nKSBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSB0cnVlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNIaWRkZW4gPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgc2hvdyBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24odHJ1ZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoU2hvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIGFscmVhZHkgaGlkZGVuIGNhbGwgdGhlIGNhbGxiYWNrIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZyAmJiB0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBoaWRpbmcgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgaGlkZGVuIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzSGlkaW5nICYmICFpbnN0YW50KSB7XG4gICAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgc2hvd2luZyBvciB2aXNpYmxlIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9IHRoaXMuX2lzSGlkaW5nID0gdHJ1ZTtcbiAgICBpdGVtLl9pc0FjdGl2ZSA9IHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBzdGFydCBoaWRlIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbihmYWxzZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoSGlkZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIFN0b3AgdmlzaWJpbGl0eSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RvcEFuaW1hdGlvbih7fSk7XG5cbiAgICAvLyBGaXJlIGFsbCB1bmNvbXBsZXRlZCBjYWxsYmFja3Mgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIGFuZCBkZXN0cm95IHRoZSBxdWV1ZS5cbiAgICBxdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKS5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgdmlzaWJsZS9oaWRkZW4gY2xhc3Nlcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgc3RhdGUuXG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNIaWRpbmcgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRoaXMuX2lzSGlkZGVuID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnRdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbih0b1Zpc2libGUsIGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB0b1Zpc2libGUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzO1xuICAgIHZhciBkdXJhdGlvbiA9IHBhcnNlSW50KHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dEdXJhdGlvbiA6IHNldHRpbmdzLmhpZGVEdXJhdGlvbikgfHwgMDtcbiAgICB2YXIgZWFzaW5nID0gKHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dFYXNpbmcgOiBzZXR0aW5ncy5oaWRlRWFzaW5nKSB8fCAnZWFzZSc7XG4gICAgdmFyIGlzSW5zdGFudCA9IGluc3RhbnQgfHwgZHVyYXRpb24gPD0gMDtcbiAgICB2YXIgY3VycmVudFN0eWxlcztcblxuICAgIC8vIE5vIHRhcmdldCBzdHlsZXM/IExldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKCF0YXJnZXRTdHlsZXMpIHtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCB2aXNpYmlsaXR5IHRpY2suXG4gICAgY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgc3R5bGVzIGluc3RhbnRseSB3aXRob3V0IGFuaW1hdGlvbi5cbiAgICBpZiAoaXNJbnN0YW50KSB7XG4gICAgICBpZiAoaXRlbS5fYW5pbWF0ZUNoaWxkLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH1cbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrICh0byBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nKS5cbiAgICBhZGRWaXNpYmlsaXR5VGljayhcbiAgICAgIGl0ZW0uX2lkLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSBnZXRDdXJyZW50U3R5bGVzKGl0ZW0uX2NoaWxkLCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogZWFzaW5nLFxuICAgICAgICAgIG9uRmluaXNoOiBvbkZpbmlzaFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLl9zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24odGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcbiAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggc2hvdyBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoU2hvdyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0hpZGRlbikgcmV0dXJuO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCB0aGlzLl9pdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGhpZGUgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICB2YXIgZmluaXNoU3R5bGVzID0ge307XG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoSGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdGhpcy5faXNIaWRpbmcgPSBmYWxzZTtcbiAgICBmaW5pc2hTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIGZpbmlzaFN0eWxlcyk7XG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICB2YXIgaWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWVyaWMgaWQgKGluY3JlbWVudHMgYSBiYXNlIHZhbHVlIG9uIGV2ZXJ5IGNhbGwpLlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVWlkKCkge1xuICAgIHJldHVybiArK2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSXRlbSBpbnN0YW5jZSBmb3IgYSBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtHcmlkfSBncmlkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaXNBY3RpdmVdXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtKGdyaWQsIGVsZW1lbnQsIGlzQWN0aXZlKSB7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQuXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcblxuICAgIC8vIFJlZmVyZW5jZSB0byBjb25uZWN0ZWQgR3JpZCBpbnN0YW5jZSdzIGlkLlxuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCBpbml0aWFsIHBvc2l0aW9ucy5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gVGhlIGVsZW1lbnRzLlxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2NoaWxkID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuICAgIC8vIElmIHRoZSBwcm92aWRlZCBpdGVtIGVsZW1lbnQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBncmlkIGNvbnRhaW5lclxuICAgIC8vIGVsZW1lbnQsIGFwcGVuZCBpdCB0byB0aGUgZ3JpZCBjb250YWluZXIuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gSWYgaXNBY3RpdmUgaXMgbm90IGRlZmluZWQsIGxldCdzIHRyeSB0byBhdXRvLWRldGVjdCBpdC5cbiAgICBpZiAodHlwZW9mIGlzQWN0aXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIGlzQWN0aXZlID0gZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBhY3RpdmUgc3RhdGUgKGRlZmluZXMgaWYgdGhlIGl0ZW0gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBsYXlvdXRcbiAgICAvLyBvciBub3QpLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gaXNBY3RpdmU7XG5cbiAgICAvLyBTZXQgZWxlbWVudCdzIGluaXRpYWwgcG9zaXRpb24gc3R5bGVzLlxuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuXG4gICAgLy8gSW5pdGlhdGUgaXRlbSdzIGFuaW1hdGlvbiBjb250cm9sbGVycy5cbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKGVsZW1lbnQpO1xuICAgIHRoaXMuX2FuaW1hdGVDaGlsZCA9IG5ldyBJdGVtQW5pbWF0ZSh0aGlzLl9jaGlsZCk7XG5cbiAgICAvLyBTZXR1cCB2aXNpYmlsaXR5IGhhbmRsZXIuXG4gICAgdGhpcy5fdmlzaWJpbGl0eSA9IG5ldyBJdGVtVmlzaWJpbGl0eSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBsYXlvdXQgaGFuZGxlci5cbiAgICB0aGlzLl9sYXlvdXQgPSBuZXcgSXRlbUxheW91dCh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBtaWdyYXRpb24gaGFuZGxlciBkYXRhLlxuICAgIHRoaXMuX21pZ3JhdGUgPSBuZXcgSXRlbU1pZ3JhdGUodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgcmVsZWFzZSBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG8gZHJhZ2dpbmdcbiAgICAvLyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvbiBzY2VuYXJpb3NcbiAgICAvLyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fcmVsZWFzZSA9IG5ldyBJdGVtUmVsZWFzZSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIHBsYWNlaG9sZGVyIGhhbmRsZXIuIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGlzIGZ1bGx5IGxpbmtlZCB0b1xuICAgIC8vIGRyYWdnaW5nIHRoaXMgc3RpbGwgbmVlZHMgdG8gYmUgYWx3YXlzIGluc3RhbnRpYXRlZCB0byBoYW5kbGUgbWlncmF0aW9uXG4gICAgLy8gc2NlbmFyaW9zIGNvcnJlY3RseS5cbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIgPSBuZXcgSXRlbURyYWdQbGFjZWhvbGRlcih0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIGhhbmRsZXIuXG4gICAgdGhpcy5fZHJhZyA9IHNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKHRoaXMpIDogbnVsbDtcblxuICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGdyaWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgd2lkdGguXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgaGVpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCwgcmlnaHQsIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXNcbiAgICogICAgIHdoaWNoIGluZGljYXRlIHRoZSBpdGVtIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldE1hcmdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9tYXJnaW5MZWZ0LFxuICAgICAgcmlnaHQ6IHRoaXMuX21hcmdpblJpZ2h0LFxuICAgICAgdG9wOiB0aGlzLl9tYXJnaW5Ub3AsXG4gICAgICBib3R0b206IHRoaXMuX21hcmdpbkJvdHRvbVxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKiAgIC0gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyBsZWZ0IGFuZCB0b3AgcHJvcGVydGllcyB3aGljaCBpbmRpY2F0ZSB0aGVcbiAgICogICAgIGl0ZW0gZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbiBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IHRoaXMuX2xlZnQsXG4gICAgICB0b3A6IHRoaXMuX3RvcFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGFjdGl2ZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Zpc2libGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl92aXNpYmlsaXR5ICYmICF0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbjtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Nob3dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc1Nob3dpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBhbmltYXRlZCB0byBoaWRkZW4/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNIaWRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGluZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHBvc2l0aW9uaW5nP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUG9zaXRpb25pbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fbGF5b3V0ICYmIHRoaXMuX2xheW91dC5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBkcmFnZ2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLl9pc0FjdGl2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIHJlbGVhc2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUmVsZWFzaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3JlbGVhc2UgJiYgdGhpcy5fcmVsZWFzZS5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBkZXN0cm95ZWQ/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNEZXN0cm95ZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZXN0cm95ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGUgaXRlbSdzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdQbGFjZWhvbGRlciA9IHRoaXMuX2RyYWdQbGFjZWhvbGRlcjtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2lucyAoaWdub3JlIG5lZ2F0aXZlIG1hcmdpbnMpLlxuICAgIHRoaXMuX21hcmdpbkxlZnQgPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1sZWZ0JykpO1xuICAgIHRoaXMuX21hcmdpblJpZ2h0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tcmlnaHQnKSk7XG4gICAgdGhpcy5fbWFyZ2luVG9wID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tdG9wJykpO1xuICAgIHRoaXMuX21hcmdpbkJvdHRvbSA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLWJvdHRvbScpKTtcblxuICAgIC8vIEtlZXAgZHJhZyBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMgc3luY2VkIHdpdGggdGhlIGl0ZW0ncy5cbiAgICBpZiAoZHJhZ1BsYWNlaG9sZGVyKSB7XG4gICAgICBkcmFnUGxhY2Vob2xkZXIudXBkYXRlRGltZW5zaW9ucyh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuZCBzdG9yZSBpdGVtJ3Mgc29ydCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoU29ydERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBkYXRhID0gKHRoaXMuX3NvcnREYXRhID0ge30pO1xuICAgIHZhciBnZXR0ZXJzID0gdGhpcy5nZXRHcmlkKCkuX3NldHRpbmdzLnNvcnREYXRhO1xuICAgIHZhciBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGdldHRlcnMpIHtcbiAgICAgIGRhdGFbcHJvcF0gPSBnZXR0ZXJzW3Byb3BdKHRoaXMsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpdGVtIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcmVtb3ZlRWxlbWVudD1mYWxzZV1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZih0aGlzKTtcblxuICAgIC8vIERlc3Ryb3kgaGFuZGxlcnMuXG4gICAgdGhpcy5fcmVsZWFzZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWlncmF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF5b3V0LmRlc3Ryb3koKTtcbiAgICB0aGlzLl92aXNpYmlsaXR5LmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWdQbGFjZWhvbGRlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBhbGwgaW5saW5lIHN0eWxlcy5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICB0aGlzLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAvLyBSZW1vdmUgaXRlbSBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBHcmlkIGluc3RhbmNlIGlmIGl0IHN0aWxsIGV4aXN0cyB0aGVyZS5cbiAgICBpbmRleCA+IC0xICYmIGdyaWQuX2l0ZW1zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudCBmcm9tIERPTS5cbiAgICByZW1vdmVFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGxheW91dCBhbGdvcml0aG0gZm9yIE11dXJpLiBCYXNlZCBvbiBNQVhSRUNUUyBhcHByb2FjaFxuICAgKiBhcyBkZXNjcmliZWQgYnkgSnVra2EgSnlsw6Rua2kgaW4gaGlzIHN1cnZleTogXCJBIFRob3VzYW5kIFdheXMgdG8gUGFjayB0aGVcbiAgICogQmluIC0gQSBQcmFjdGljYWwgQXBwcm9hY2ggdG8gVHdvLURpbWVuc2lvbmFsIFJlY3RhbmdsZSBCaW4gUGFja2luZy5cIi5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBQYWNrZXIoKSB7XG4gICAgdGhpcy5fc2xvdHMgPSBbXTtcbiAgICB0aGlzLl9zbG90U2l6ZXMgPSBbXTtcbiAgICB0aGlzLl9mcmVlU2xvdHMgPSBbXTtcbiAgICB0aGlzLl9uZXdTbG90cyA9IFtdO1xuICAgIHRoaXMuX3JlY3RJdGVtID0ge307XG4gICAgdGhpcy5fcmVjdFN0b3JlID0gW107XG4gICAgdGhpcy5fcmVjdElkID0gMDtcblxuICAgIC8vIFRoZSBsYXlvdXQgcmV0dXJuIGRhdGEsIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIGdldExheW91dC5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBzbG90czogbnVsbCxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogZmFsc2UsXG4gICAgICBoZWlnaHQ6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEJpbmQgc29ydCBoYW5kbGVycy5cbiAgICB0aGlzLl9zb3J0UmVjdHNMZWZ0VG9wID0gdGhpcy5fc29ydFJlY3RzTGVmdFRvcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3NvcnRSZWN0c1RvcExlZnQgPSB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW1bXX0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICogQHBhcmFtIHtOdW1iZXJbXX0gW3Nsb3RzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnblJpZ2h0PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7TGF5b3V0RGF0YX1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuZ2V0TGF5b3V0ID0gZnVuY3Rpb24oaXRlbXMsIHdpZHRoLCBoZWlnaHQsIHNsb3RzLCBvcHRpb25zKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgZmlsbEdhcHMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZmlsbEdhcHMpO1xuICAgIHZhciBpc0hvcml6b250YWwgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuaG9yaXpvbnRhbCk7XG4gICAgdmFyIGFsaWduUmlnaHQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxpZ25SaWdodCk7XG4gICAgdmFyIGFsaWduQm90dG9tID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduQm90dG9tKTtcbiAgICB2YXIgcm91bmRpbmcgPSAhIShvcHRpb25zICYmIG9wdGlvbnMucm91bmRpbmcpO1xuICAgIHZhciBzbG90U2l6ZXMgPSB0aGlzLl9zbG90U2l6ZXM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCBsYXlvdXQgZGF0YS5cbiAgICBsYXlvdXQuc2xvdHMgPSBzbG90cyA/IHNsb3RzIDogdGhpcy5fc2xvdHM7XG4gICAgbGF5b3V0LndpZHRoID0gaXNIb3Jpem9udGFsID8gMCA6IHJvdW5kaW5nID8gTWF0aC5yb3VuZCh3aWR0aCkgOiB3aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gIWlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQoaGVpZ2h0KSA6IGhlaWdodDtcbiAgICBsYXlvdXQuc2V0V2lkdGggPSBpc0hvcml6b250YWw7XG4gICAgbGF5b3V0LnNldEhlaWdodCA9ICFpc0hvcml6b250YWw7XG5cbiAgICAvLyBNYWtlIHN1cmUgc2xvdHMgYW5kIHNsb3Qgc2l6ZSBhcnJheXMgYXJlIHJlc2V0LlxuICAgIGxheW91dC5zbG90cy5sZW5ndGggPSAwO1xuICAgIHNsb3RTaXplcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIGl0ZW1zIGRvIG5vdCBleGlzdC5cbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIGxheW91dDtcblxuICAgIC8vIEZpbmQgc2xvdHMgZm9yIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYWRkU2xvdChpdGVtc1tpXSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIGFsaWduUmlnaHQgfHwgYWxpZ25Cb3R0b20pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIHJpZ2h0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLlxuICAgIGlmIChhbGlnblJpZ2h0KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC53aWR0aCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIGJvdHRvbSB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25Cb3R0b20pIHtcbiAgICAgIGZvciAoaSA9IDE7IGkgPCBsYXlvdXQuc2xvdHMubGVuZ3RoOyBpID0gaSArIDIpIHtcbiAgICAgICAgbGF5b3V0LnNsb3RzW2ldID0gbGF5b3V0LmhlaWdodCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHNsb3RzIGFycmF5cyBhbmQgcmVjdCBpZC5cbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmVlU2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9uZXdTbG90cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIHRoZSBsYXlvdXQgaXRlbS4gUmV0dXJucyB0aGUgbGVmdCBhbmQgdG9wIHBvc2l0aW9uXG4gICAqIG9mIHRoZSBpdGVtIGluIHBpeGVscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNIb3Jpem9udGFsXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmlsbEdhcHNcbiAgICogQHBhcmFtIHtCb29sZWFufSByb3VuZGluZ1xuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRTbG90ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBlcHMgPSAwLjAwMTtcbiAgICB2YXIgaXRlbVNsb3QgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIHRyYWNrU2l6ZSkge1xuICAgICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICAgIHZhciBmcmVlU2xvdHMgPSB0aGlzLl9mcmVlU2xvdHM7XG4gICAgICB2YXIgbmV3U2xvdHMgPSB0aGlzLl9uZXdTbG90cztcbiAgICAgIHZhciByZWN0O1xuICAgICAgdmFyIHJlY3RJZDtcbiAgICAgIHZhciBwb3RlbnRpYWxTbG90cztcbiAgICAgIHZhciBpZ25vcmVDdXJyZW50U2xvdHM7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBpaTtcblxuICAgICAgLy8gUmVzZXQgbmV3IHNsb3RzLlxuICAgICAgbmV3U2xvdHMubGVuZ3RoID0gMDtcblxuICAgICAgLy8gU2V0IGl0ZW0gc2xvdCBpbml0aWFsIGRhdGEuXG4gICAgICBpdGVtU2xvdC5sZWZ0ID0gbnVsbDtcbiAgICAgIGl0ZW1TbG90LnRvcCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC53aWR0aCA9IGl0ZW0uX3dpZHRoICsgaXRlbS5fbWFyZ2luTGVmdCArIGl0ZW0uX21hcmdpblJpZ2h0O1xuICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0ICsgaXRlbS5fbWFyZ2luVG9wICsgaXRlbS5fbWFyZ2luQm90dG9tO1xuXG4gICAgICAvLyBSb3VuZCBpdGVtIHNsb3Qgd2lkdGggYW5kIGhlaWdodCBpZiBuZWVkZWQuXG4gICAgICBpZiAocm91bmRpbmcpIHtcbiAgICAgICAgaXRlbVNsb3Qud2lkdGggPSBNYXRoLnJvdW5kKGl0ZW1TbG90LndpZHRoKTtcbiAgICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gTWF0aC5yb3VuZChpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gZmluZCBhIHNsb3QgZm9yIHRoZSBpdGVtLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGZyZWVTbG90cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZWN0SWQgPSBmcmVlU2xvdHNbaV07XG4gICAgICAgIGlmICghcmVjdElkKSBjb250aW51ZTtcbiAgICAgICAgcmVjdCA9IHRoaXMuX2dldFJlY3QocmVjdElkKTtcbiAgICAgICAgaWYgKGl0ZW1TbG90LndpZHRoIDw9IHJlY3Qud2lkdGggKyBlcHMgJiYgaXRlbVNsb3QuaGVpZ2h0IDw9IHJlY3QuaGVpZ2h0ICsgZXBzKSB7XG4gICAgICAgICAgaXRlbVNsb3QubGVmdCA9IHJlY3QubGVmdDtcbiAgICAgICAgICBpdGVtU2xvdC50b3AgPSByZWN0LnRvcDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzbG90IHdhcyBmb3VuZCBmb3IgdGhlIGl0ZW0uXG4gICAgICBpZiAoaXRlbVNsb3QubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBQb3NpdGlvbiB0aGUgaXRlbSBpbiB0byB0aGUgYm90dG9tIGxlZnQgKHZlcnRpY2FsIG1vZGUpIG9yIHRvcCByaWdodFxuICAgICAgICAvLyAoaG9yaXpvbnRhbCBtb2RlKSBvZiB0aGUgZ3JpZC5cbiAgICAgICAgaXRlbVNsb3QubGVmdCA9ICFpc0hvcml6b250YWwgPyAwIDogbGF5b3V0LndpZHRoO1xuICAgICAgICBpdGVtU2xvdC50b3AgPSAhaXNIb3Jpem9udGFsID8gbGF5b3V0LmhlaWdodCA6IDA7XG5cbiAgICAgICAgLy8gSWYgZ2FwcyBkb24ndCBuZWVkIGZpbGxpbmcgZG8gbm90IGFkZCBhbnkgY3VycmVudCBzbG90cyB0byB0aGUgbmV3XG4gICAgICAgIC8vIHNsb3RzIGFycmF5LlxuICAgICAgICBpZiAoIWZpbGxHYXBzKSB7XG4gICAgICAgICAgaWdub3JlQ3VycmVudFNsb3RzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJbiB2ZXJ0aWNhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIGJvdHRvbSBvdmVybGFwcyB0aGUgZ3JpZCdzIGJvdHRvbS5cbiAgICAgIGlmICghaXNIb3Jpem9udGFsICYmIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA+IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgbGVmdCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KDAsIGxheW91dC5oZWlnaHQsIGl0ZW1TbG90LmxlZnQsIEluZmluaXR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSByaWdodCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCA8IGxheW91dC53aWR0aCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQsXG4gICAgICAgICAgICAgIGxheW91dC53aWR0aCAtIGl0ZW1TbG90LmxlZnQgLSBpdGVtU2xvdC53aWR0aCxcbiAgICAgICAgICAgICAgSW5maW5pdHlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgaGVpZ2h0LlxuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBob3Jpem9udGFsIG1vZGUsIGlmIHRoZSBpdGVtJ3MgcmlnaHQgb3ZlcmxhcHMgdGhlIGdyaWQncyByaWdodCBlZGdlLlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPiBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgdG9wLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCA+IDApIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKHRoaXMuX2FkZFJlY3QobGF5b3V0LndpZHRoLCAwLCBJbmZpbml0eSwgaXRlbVNsb3QudG9wKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBib3R0b20sIGNyZWF0ZSBhIG5ldyBzbG90LlxuICAgICAgICBpZiAoaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0IDwgbGF5b3V0LmhlaWdodCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGgsXG4gICAgICAgICAgICAgIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCxcbiAgICAgICAgICAgICAgSW5maW5pdHksXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQgLSBpdGVtU2xvdC50b3AgLSBpdGVtU2xvdC5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgd2lkdGguXG4gICAgICAgIGxheW91dC53aWR0aCA9IGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gdXAgdGhlIGN1cnJlbnQgc2xvdHMgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIG9sZCBzbG90cyB0aGF0XG4gICAgICAvLyBvdmVybGFwIHdpdGggdGhlIGl0ZW0uIElmIGFuIG9sZCBzbG90IG92ZXJsYXBzIHdpdGggdGhlIGl0ZW0sIHNwbGl0IGl0XG4gICAgICAvLyBpbnRvIHNtYWxsZXIgc2xvdHMgaWYgbmVjZXNzYXJ5LlxuICAgICAgZm9yIChpID0gZmlsbEdhcHMgPyAwIDogaWdub3JlQ3VycmVudFNsb3RzID8gZnJlZVNsb3RzLmxlbmd0aCA6IGk7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIHBvdGVudGlhbFNsb3RzID0gdGhpcy5fc3BsaXRSZWN0KHJlY3QsIGl0ZW1TbG90KTtcbiAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcG90ZW50aWFsU2xvdHMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgcmVjdElkID0gcG90ZW50aWFsU2xvdHNbaWldO1xuICAgICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgICAgLy8gTGV0J3MgbWFrZSBzdXJlIGhlcmUgdGhhdCB3ZSBoYXZlIGEgYmlnIGVub3VnaCBzbG90XG4gICAgICAgICAgLy8gKHdpZHRoL2hlaWdodCA+IDAuNDlweCkgYW5kIGFsc28gbGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlIHNsb3QgaXNcbiAgICAgICAgICAvLyB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGdyaWQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVjdC53aWR0aCA+IDAuNDkgJiZcbiAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID4gMC40OSAmJlxuICAgICAgICAgICAgKCghaXNIb3Jpem9udGFsICYmIHJlY3QudG9wIDwgbGF5b3V0LmhlaWdodCkgfHxcbiAgICAgICAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiByZWN0LmxlZnQgPCBsYXlvdXQud2lkdGgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbmV3U2xvdHMucHVzaChyZWN0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBuZXcgc2xvdHMuXG4gICAgICBpZiAobmV3U2xvdHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3B1cmdlUmVjdHMobmV3U2xvdHMpLnNvcnQoXG4gICAgICAgICAgaXNIb3Jpem9udGFsID8gdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA6IHRoaXMuX3NvcnRSZWN0c1RvcExlZnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxheW91dCB3aWR0aC9oZWlnaHQuXG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIGxheW91dC53aWR0aCA9IE1hdGgubWF4KGxheW91dC53aWR0aCwgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPSBNYXRoLm1heChsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaXRlbSBzbG90IGRhdGEgdG8gbGF5b3V0IHNsb3RzIChhbmQgc3RvcmUgdGhlIHNsb3Qgc2l6ZSBmb3IgbGF0ZXJcbiAgICAgIC8vIHVzYWdlIHRvbyBpZiBuZWNlc3NhcnkpLlxuICAgICAgbGF5b3V0LnNsb3RzLnB1c2goaXRlbVNsb3QubGVmdCwgaXRlbVNsb3QudG9wKTtcbiAgICAgIGlmICh0cmFja1NpemUpIHRoaXMuX3Nsb3RTaXplcy5wdXNoKGl0ZW1TbG90LndpZHRoLCBpdGVtU2xvdC5oZWlnaHQpO1xuXG4gICAgICAvLyBGcmVlL25ldyBzbG90cyBzd2l0Y2hlcm9vIVxuICAgICAgdGhpcy5fZnJlZVNsb3RzID0gbmV3U2xvdHM7XG4gICAgICB0aGlzLl9uZXdTbG90cyA9IGZyZWVTbG90cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgcmVjdGFuZ2xlIHRvIHRoZSByZWN0YW5nbGUgc3RvcmUuIFJldHVybnMgdGhlIGlkIG9mIHRoZSBuZXdcbiAgICogcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVmdFxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9wXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEByZXR1cm5zIHtSZWN0SWR9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRSZWN0ID0gZnVuY3Rpb24obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIHJlY3RJZCA9ICsrdGhpcy5fcmVjdElkO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0U3RvcmVbcmVjdElkXSA9IGxlZnQgfHwgMDtcbiAgICByZWN0U3RvcmVbKyt0aGlzLl9yZWN0SWRdID0gdG9wIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHdpZHRoIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IGhlaWdodCB8fCAwO1xuXG4gICAgcmV0dXJuIHJlY3RJZDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHJlY3RhbmdsZSBkYXRhIGZyb20gdGhlIHJlY3RhbmdsZSBzdG9yZSBieSBpZC4gT3B0aW9uYWxseSB5b3UgY2FuXG4gICAqIHByb3ZpZGUgYSB0YXJnZXQgb2JqZWN0IHdoZXJlIHRoZSByZWN0YW5nbGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gaW4uIEJ5XG4gICAqIGRlZmF1bHQgYW4gaW50ZXJuYWwgb2JqZWN0IGlzIHJldXNlZCBhcyBhIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBpZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF1cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2dldFJlY3QgPSBmdW5jdGlvbihpZCwgdGFyZ2V0KSB7XG4gICAgdmFyIHJlY3RJdGVtID0gdGFyZ2V0ID8gdGFyZ2V0IDogdGhpcy5fcmVjdEl0ZW07XG4gICAgdmFyIHJlY3RTdG9yZSA9IHRoaXMuX3JlY3RTdG9yZTtcblxuICAgIHJlY3RJdGVtLmxlZnQgPSByZWN0U3RvcmVbaWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0udG9wID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0ud2lkdGggPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcbiAgICByZWN0SXRlbS5oZWlnaHQgPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcblxuICAgIHJldHVybiByZWN0SXRlbTtcbiAgfTtcblxuICAvKipcbiAgICogUHVuY2ggYSBob2xlIGludG8gYSByZWN0YW5nbGUgYW5kIHNwbGl0IHRoZSByZW1haW5pbmcgYXJlYSBpbnRvIHNtYWxsZXJcbiAgICogcmVjdGFuZ2xlcyAoNCBhdCBtYXgpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gcmVjdFxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gaG9sZVxuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zcGxpdFJlY3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdCwgaG9sZSkge1xuICAgICAgLy8gUmVzZXQgb2xkIHJlc3VsdHMuXG4gICAgICByZXN1bHRzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIElmIHRoZSByZWN0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgaG9sZSBhZGQgcmVjdCB0byB0aGUgcmV0dXJuIGRhdGFcbiAgICAgIC8vIGFzIGlzLlxuICAgICAgaWYgKCF0aGlzLl9kb1JlY3RzT3ZlcmxhcChyZWN0LCBob2xlKSkge1xuICAgICAgICByZXN1bHRzLnB1c2godGhpcy5fYWRkUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cblxuICAgICAgLy8gTGVmdCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgPCBob2xlLmxlZnQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgaG9sZS5sZWZ0IC0gcmVjdC5sZWZ0LCByZWN0LmhlaWdodCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSaWdodCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgKyByZWN0LndpZHRoID4gaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCkge1xuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgIGhvbGUubGVmdCArIGhvbGUud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCxcbiAgICAgICAgICAgIHJlY3QubGVmdCArIHJlY3Qud2lkdGggLSAoaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCksXG4gICAgICAgICAgICByZWN0LmhlaWdodFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVG9wIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wIDwgaG9sZS50b3ApIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgaG9sZS50b3AgLSByZWN0LnRvcCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb3R0b20gc3BsaXQuXG4gICAgICBpZiAocmVjdC50b3AgKyByZWN0LmhlaWdodCA+IGhvbGUudG9wICsgaG9sZS5oZWlnaHQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICByZWN0LmxlZnQsXG4gICAgICAgICAgICBob2xlLnRvcCArIGhvbGUuaGVpZ2h0LFxuICAgICAgICAgICAgcmVjdC53aWR0aCxcbiAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLSAoaG9sZS50b3AgKyBob2xlLmhlaWdodClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHR3byByZWN0YW5nbGVzIG92ZXJsYXAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fZG9SZWN0c092ZXJsYXAgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCB8fFxuICAgICAgYi5sZWZ0ICsgYi53aWR0aCA8PSBhLmxlZnQgfHxcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgfHxcbiAgICAgIGIudG9wICsgYi5oZWlnaHQgPD0gYS50b3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHJlY3RhbmdsZSBpcyBmdWxseSB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5faXNSZWN0V2l0aGluUmVjdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5sZWZ0ID49IGIubGVmdCAmJlxuICAgICAgYS50b3AgPj0gYi50b3AgJiZcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0ICsgYi53aWR0aCAmJlxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCArIGIuaGVpZ2h0XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9vcHMgdGhyb3VnaCBhbiBhcnJheSBvZiByZWN0YW5nbGUgaWRzIGFuZCByZXNldHMgYWxsIHRoYXQgYXJlIGZ1bGx5XG4gICAqIHdpdGhpbiBhbm90aGVyIHJlY3RhbmdsZSBpbiB0aGUgYXJyYXkuIFJlc2V0dGluZyBpbiB0aGlzIGNhc2UgbWVhbnMgdGhhdFxuICAgKiB0aGUgcmVjdGFuZ2xlIGlkIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggemVyby5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWRbXX0gcmVjdElkc1xuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9wdXJnZVJlY3RzID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihyZWN0SWRzKSB7XG4gICAgICB2YXIgaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgdmFyIGlpO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGlpID0gcmVjdElkcy5sZW5ndGg7XG4gICAgICAgIGlmICghcmVjdElkc1tpXSkgY29udGludWU7XG4gICAgICAgIHRoaXMuX2dldFJlY3QocmVjdElkc1tpXSwgcmVjdEEpO1xuICAgICAgICB3aGlsZSAoaWktLSkge1xuICAgICAgICAgIGlmICghcmVjdElkc1tpaV0gfHwgaSA9PT0gaWkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlY3RXaXRoaW5SZWN0KHJlY3RBLCB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaWldLCByZWN0QikpKSB7XG4gICAgICAgICAgICByZWN0SWRzW2ldID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjdElkcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCB0b3AtbGVmdCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c1RvcExlZnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLnRvcCA8IHJlY3RCLnRvcCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPiByZWN0Qi50b3AgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0IDwgcmVjdEIubGVmdCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0ID4gcmVjdEIubGVmdCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFNvcnQgcmVjdGFuZ2xlcyB3aXRoIGxlZnQtdG9wIGdyYXZpdHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBhSWRcbiAgICogQHBhcmFtIHtSZWN0SWR9IGJJZFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc29ydFJlY3RzTGVmdFRvcCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oYUlkLCBiSWQpIHtcbiAgICAgIHRoaXMuX2dldFJlY3QoYUlkLCByZWN0QSk7XG4gICAgICB0aGlzLl9nZXRSZWN0KGJJZCwgcmVjdEIpO1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICByZXR1cm4gcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6IDA7XG4gICAgfTtcbiAgfSkoKTtcblxuICB2YXIgaHRtbENvbGxlY3Rpb25UeXBlID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJztcbiAgdmFyIG5vZGVMaXN0VHlwZSA9ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG4gICAgcmV0dXJuIHR5cGUgPT09IGh0bWxDb2xsZWN0aW9uVHlwZSB8fCB0eXBlID09PSBub2RlTGlzdFR5cGU7XG4gIH1cblxuICB2YXIgb2JqZWN0VHlwZSA9ICdvYmplY3QnO1xuICB2YXIgb2JqZWN0VG9TdHJpbmdUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gb2JqZWN0VHlwZSAmJiB0b1N0cmluZy5jYWxsKHZhbCkgPT09IG9iamVjdFRvU3RyaW5nVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGFuIGFycmF5IG9yIGNsb25lcyBhbiBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB0YXJnZXRcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgICByZXR1cm4gaXNOb2RlTGlzdCh0YXJnZXQpID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0KSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQodGFyZ2V0KTtcbiAgfVxuXG4gIHZhciBwYWNrZXIgPSBuZXcgUGFja2VyKCk7XG4gIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuICB2YXIgbnVtYmVyVHlwZSQxID0gJ251bWJlcic7XG4gIHZhciBzdHJpbmdUeXBlID0gJ3N0cmluZyc7XG4gIHZhciBpbnN0YW50TGF5b3V0ID0gJ2luc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTdHJpbmcpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHs/KEhUTUxFbGVtZW50W118Tm9kZUxpc3R8U3RyaW5nKX0gW29wdGlvbnMuaXRlbXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zaG93RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2hvd0Vhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnZpc2libGVTdHlsZXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaGlkZUVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmhpZGRlblN0eWxlc11cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMubGF5b3V0XVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5maWxsR2Fwcz1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25Cb3R0b209ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LnJvdW5kaW5nPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TnVtYmVyKX0gW29wdGlvbnMubGF5b3V0T25SZXNpemU9MTAwXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dE9uSW5pdD10cnVlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubGF5b3V0RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubGF5b3V0RWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zLnNvcnREYXRhPW51bGxdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ0VuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P0h0bWxFbGVtZW50fSBbb3B0aW9ucy5kcmFnQ29udGFpbmVyPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGlzdGFuY2U9MF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5kZWxheT0wXVxuICAgKiBAcGFyYW0geyhCb29sZWFufFN0cmluZyl9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5oYW5kbGU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P1N0cmluZ30gW29wdGlvbnMuZHJhZ0F4aXNdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58RnVuY3Rpb24pfSBbb3B0aW9ucy5kcmFnU29ydD10cnVlXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbD0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydEhldXJpc3RpY3MubWluRHJhZ0Rpc3RhbmNlPTEwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkJvdW5jZUJhY2tBbmdsZT0xXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLnRocmVzaG9sZD01MF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdSZWxlYXNlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1JlbGVhc2VFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnQ3NzUHJvcHNdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXJdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50PW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGU9bnVsbF1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZT1udWxsXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGFpbmVyQ2xhc3M9XCJtdXVyaVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUNsYXNzPVwibXV1cmktaXRlbVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVZpc2libGVDbGFzcz1cIm11dXJpLWl0ZW0tdmlzaWJsZVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUhpZGRlbkNsYXNzPVwibXV1cmktaXRlbS1oaWRkZW5cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1Qb3NpdGlvbmluZ0NsYXNzPVwibXV1cmktaXRlbS1wb3NpdGlvbmluZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbURyYWdnaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLWRyYWdnaW5nXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUmVsZWFzaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLXJlbGVhc2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVBsYWNlaG9sZGVyQ2xhc3M9XCJtdXVyaS1pdGVtLXBsYWNlaG9sZGVyXCJdXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEdyaWQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgc2V0dGluZ3M7XG4gICAgdmFyIGl0ZW1zO1xuICAgIHZhciBsYXlvdXRPblJlc2l6ZTtcblxuICAgIC8vIEFsbG93IHBhc3NpbmcgZWxlbWVudCBhcyBzZWxlY3RvciBzdHJpbmcuIFN0b3JlIGVsZW1lbnQgZm9yIGluc3RhbmNlLlxuICAgIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50ID1cbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSBzdHJpbmdUeXBlID8gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnRhaW5lciBlbGVtZW50IGlzIG5vdCBib2R5IGVsZW1lbnQgb3IgZG9lcyBub3RcbiAgICAvLyBleGlzdCB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudC5cbiAgICB2YXIgaXNFbGVtZW50SW5Eb20gPSBlbGVtZW50LmdldFJvb3ROb2RlXG4gICAgICA/IGVsZW1lbnQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogdHJ1ZSB9KSA9PT0gZG9jdW1lbnRcbiAgICAgIDogd2luZG93LmRvY3VtZW50LmJvZHkuY29udGFpbnMoZWxlbWVudCk7XG4gICAgaWYgKCFpc0VsZW1lbnRJbkRvbSB8fCBlbGVtZW50ID09PSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhaW5lciBlbGVtZW50IG11c3QgYmUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2Ugc2V0dGluZ3MgYnkgbWVyZ2luZyB0aGUgb3B0aW9ucyB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzID0gbWVyZ2VTZXR0aW5ncyhHcmlkLmRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgIC8vIFNhbml0aXplIGRyYWdTb3J0IHNldHRpbmcuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0KSkge1xuICAgICAgc2V0dGluZ3MuZHJhZ1NvcnQgPSAhIXNldHRpbmdzLmRyYWdTb3J0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBpZCBhbmQgc3RvcmUgaXQgdG8gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IGluc3Q7XG5cbiAgICAvLyBEZXN0cm95ZWQgZmxhZy5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGxheW91dCBvYmplY3QgKG11dGF0ZWQgb24gZXZlcnkgbGF5b3V0KS5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBpZDogMCxcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIHNsb3RzOiBbXSxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgcHJpdmF0ZSBFbWl0dGVyIGluc3RhbmNlLlxuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lciBlbGVtZW50J3MgY2xhc3MgbmFtZS5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG5cbiAgICAvLyBDcmVhdGUgaW5pdGlhbCBpdGVtcy5cbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIGl0ZW1zID0gc2V0dGluZ3MuaXRlbXM7XG4gICAgaWYgKHR5cGVvZiBpdGVtcyA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgdG9BcnJheShlbGVtZW50LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIGlmIChpdGVtcyA9PT0gJyonIHx8IGVsZW1lbnRNYXRjaGVzKGl0ZW1FbGVtZW50LCBpdGVtcykpIHtcbiAgICAgICAgICBpbnN0Ll9pdGVtcy5wdXNoKG5ldyBJdGVtKGluc3QsIGl0ZW1FbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykgfHwgaXNOb2RlTGlzdChpdGVtcykpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gdG9BcnJheShpdGVtcykubWFwKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXRPblJlc2l6ZSBvcHRpb24gaXMgYSB2YWxpZCBudW1iZXIgc2FuaXRpemUgaXQgYW5kIGJpbmQgdGhlIHJlc2l6ZVxuICAgIC8vIGhhbmRsZXIuXG4gICAgbGF5b3V0T25SZXNpemUgPSBzZXR0aW5ncy5sYXlvdXRPblJlc2l6ZTtcbiAgICBpZiAodHlwZW9mIGxheW91dE9uUmVzaXplICE9PSBudW1iZXJUeXBlJDEpIHtcbiAgICAgIGxheW91dE9uUmVzaXplID0gbGF5b3V0T25SZXNpemUgPT09IHRydWUgPyAwIDogLTE7XG4gICAgfVxuICAgIGlmIChsYXlvdXRPblJlc2l6ZSA+PSAwKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Jlc2l6ZScsXG4gICAgICAgIChpbnN0Ll9yZXNpemVIYW5kbGVyID0gZGVib3VuY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaW5zdC5yZWZyZXNoSXRlbXMoKS5sYXlvdXQoKTtcbiAgICAgICAgfSwgbGF5b3V0T25SZXNpemUpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgb24gaW5pdCBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKHNldHRpbmdzLmxheW91dE9uSW5pdCkge1xuICAgICAgdGhpcy5sYXlvdXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1cbiAgICovXG4gIEdyaWQuSXRlbSA9IEl0ZW07XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUxheW91dFxuICAgKi9cbiAgR3JpZC5JdGVtTGF5b3V0ID0gSXRlbUxheW91dDtcblxuICAvKipcbiAgICogQHNlZSBJdGVtVmlzaWJpbGl0eVxuICAgKi9cbiAgR3JpZC5JdGVtVmlzaWJpbGl0eSA9IEl0ZW1WaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1NaWdyYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1NaWdyYXRlID0gSXRlbU1pZ3JhdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUFuaW1hdGVcbiAgICovXG4gIEdyaWQuSXRlbUFuaW1hdGUgPSBJdGVtQW5pbWF0ZTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtRHJhZ1xuICAgKi9cbiAgR3JpZC5JdGVtRHJhZyA9IEl0ZW1EcmFnO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1SZWxlYXNlXG4gICAqL1xuICBHcmlkLkl0ZW1SZWxlYXNlID0gSXRlbVJlbGVhc2U7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdQbGFjZWhvbGRlclxuICAgKi9cbiAgR3JpZC5JdGVtRHJhZ1BsYWNlaG9sZGVyID0gSXRlbURyYWdQbGFjZWhvbGRlcjtcblxuICAvKipcbiAgICogQHNlZSBFbWl0dGVyXG4gICAqL1xuICBHcmlkLkVtaXR0ZXIgPSBFbWl0dGVyO1xuXG4gIC8qKlxuICAgKiBAc2VlIERyYWdnZXJcbiAgICovXG4gIEdyaWQuRHJhZ2dlciA9IERyYWdnZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgUGFja2VyXG4gICAqL1xuICBHcmlkLlBhY2tlciA9IFBhY2tlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBvcHRpb25zIGZvciBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkXG4gICAqL1xuICBHcmlkLmRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIEl0ZW0gZWxlbWVudHNcbiAgICBpdGVtczogJyonLFxuXG4gICAgLy8gRGVmYXVsdCBzaG93IGFuaW1hdGlvblxuICAgIHNob3dEdXJhdGlvbjogMzAwLFxuICAgIHNob3dFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIERlZmF1bHQgaGlkZSBhbmltYXRpb25cbiAgICBoaWRlRHVyYXRpb246IDMwMCxcbiAgICBoaWRlRWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBJdGVtJ3MgdmlzaWJsZS9oaWRkZW4gc3RhdGUgc3R5bGVzXG4gICAgdmlzaWJsZVN0eWxlczoge1xuICAgICAgb3BhY2l0eTogJzEnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgfSxcbiAgICBoaWRkZW5TdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcwJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknXG4gICAgfSxcblxuICAgIC8vIExheW91dFxuICAgIGxheW91dDoge1xuICAgICAgZmlsbEdhcHM6IGZhbHNlLFxuICAgICAgaG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICBhbGlnblJpZ2h0OiBmYWxzZSxcbiAgICAgIGFsaWduQm90dG9tOiBmYWxzZSxcbiAgICAgIHJvdW5kaW5nOiB0cnVlXG4gICAgfSxcbiAgICBsYXlvdXRPblJlc2l6ZTogMTAwLFxuICAgIGxheW91dE9uSW5pdDogdHJ1ZSxcbiAgICBsYXlvdXREdXJhdGlvbjogMzAwLFxuICAgIGxheW91dEVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gU29ydGluZ1xuICAgIHNvcnREYXRhOiBudWxsLFxuXG4gICAgLy8gRHJhZyAmIERyb3BcbiAgICBkcmFnRW5hYmxlZDogZmFsc2UsXG4gICAgZHJhZ0NvbnRhaW5lcjogbnVsbCxcbiAgICBkcmFnU3RhcnRQcmVkaWNhdGU6IHtcbiAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgZGVsYXk6IDAsXG4gICAgICBoYW5kbGU6IGZhbHNlXG4gICAgfSxcbiAgICBkcmFnQXhpczogbnVsbCxcbiAgICBkcmFnU29ydDogdHJ1ZSxcbiAgICBkcmFnU29ydEhldXJpc3RpY3M6IHtcbiAgICAgIHNvcnRJbnRlcnZhbDogMTAwLFxuICAgICAgbWluRHJhZ0Rpc3RhbmNlOiAxMCxcbiAgICAgIG1pbkJvdW5jZUJhY2tBbmdsZTogMVxuICAgIH0sXG4gICAgZHJhZ1NvcnRQcmVkaWNhdGU6IHtcbiAgICAgIHRocmVzaG9sZDogNTAsXG4gICAgICBhY3Rpb246IGFjdGlvbk1vdmVcbiAgICB9LFxuICAgIGRyYWdSZWxlYXNlRHVyYXRpb246IDMwMCxcbiAgICBkcmFnUmVsZWFzZUVhc2luZzogJ2Vhc2UnLFxuICAgIGRyYWdDc3NQcm9wczoge1xuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG4gICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknLFxuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgICBjb250ZW50Wm9vbWluZzogJ25vbmUnXG4gICAgfSxcbiAgICBkcmFnUGxhY2Vob2xkZXI6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2UnLFxuICAgICAgY3JlYXRlRWxlbWVudDogbnVsbCxcbiAgICAgIG9uQ3JlYXRlOiBudWxsLFxuICAgICAgb25SZW1vdmU6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQ2xhc3NuYW1lc1xuICAgIGNvbnRhaW5lckNsYXNzOiAnbXV1cmknLFxuICAgIGl0ZW1DbGFzczogJ211dXJpLWl0ZW0nLFxuICAgIGl0ZW1WaXNpYmxlQ2xhc3M6ICdtdXVyaS1pdGVtLXNob3duJyxcbiAgICBpdGVtSGlkZGVuQ2xhc3M6ICdtdXVyaS1pdGVtLWhpZGRlbicsXG4gICAgaXRlbVBvc2l0aW9uaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXBvc2l0aW9uaW5nJyxcbiAgICBpdGVtRHJhZ2dpbmdDbGFzczogJ211dXJpLWl0ZW0tZHJhZ2dpbmcnLFxuICAgIGl0ZW1SZWxlYXNpbmdDbGFzczogJ211dXJpLWl0ZW0tcmVsZWFzaW5nJyxcbiAgICBpdGVtUGxhY2Vob2xkZXJDbGFzczogJ211dXJpLWl0ZW0tcGxhY2Vob2xkZXInXG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGFsbCBpdGVtcy4gT3B0aW9uYWxseSB5b3UgY2FuIHByb3ZpZGUgc3BlY2lmaWMgdGFyZ2V0cyAoZWxlbWVudHMgYW5kXG4gICAqIGluZGljZXMpLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGlzIG5vdCB0aGUgc2FtZSBvYmplY3QgdXNlZCBieSB0aGVcbiAgICogaW5zdGFuY2Ugc28gbW9kaWZ5aW5nIGl0IHdpbGwgbm90IGFmZmVjdCBpbnN0YW5jZSdzIGl0ZW1zLiBBbGwgaXRlbXMgdGhhdFxuICAgKiBhcmUgbm90IGZvdW5kIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJldHVybmVkIGFycmF5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW3RhcmdldHNdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRJdGVtcyA9IGZ1bmN0aW9uKHRhcmdldHMpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGl0ZW1zIGltbWVkaWF0ZWx5IGlmIG5vIHRhcmdldHMgd2VyZSBwcm92aWRlZCBvciBpZiB0aGVcbiAgICAvLyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0cyAmJiB0YXJnZXRzICE9PSAwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKDApO1xuICAgIH1cblxuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0b0FycmF5KHRhcmdldHMpO1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gSWYgdGFyZ2V0IGl0ZW1zIGFyZSBkZWZpbmVkIHJldHVybiBmaWx0ZXJlZCByZXN1bHRzLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0odGFyZ2V0SXRlbXNbaV0pO1xuICAgICAgaXRlbSAmJiByZXQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNhY2hlZCBkaW1lbnNpb25zIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hJdGVtcyA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRzID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGFyZ2V0c1tpXS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzb3J0IGRhdGEgb2YgdGhlIGluc3RhbmNlJ3MgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBbaXRlbXNdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUucmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oaXRlbXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldEl0ZW1zW2ldLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIGl0ZW0gZWxlbWVudHMgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpbiB0aGUgRE9NLlxuICAgKiBUaGlzIGNvbWVzIGhhbmR5IGlmIHlvdSBuZWVkIHRvIGtlZXAgdGhlIERPTSBzdHJ1Y3R1cmUgbWF0Y2hlZCB3aXRoIHRoZVxuICAgKiBvcmRlciBvZiB0aGUgaXRlbXMuIE5vdGUgdGhhdCBpZiBhbiBpdGVtJ3MgZWxlbWVudCBpcyBub3QgY3VycmVudGx5IGEgY2hpbGRcbiAgICogb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IChpZiBpdCBpcyBkcmFnZ2VkIGZvciBleGFtcGxlKSBpdCBpcyBpZ25vcmVkIGFuZFxuICAgKiBsZWZ0IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zeW5jaHJvbml6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgZnJhZ21lbnQ7XG4gICAgdmFyIGVsZW1lbnQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBBcHBlbmQgYWxsIGVsZW1lbnRzIGluIG9yZGVyIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxlbWVudCA9IGl0ZW1zW2ldLl9lbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZyYWdtZW50KSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc3luY2hyb25pemUgZXZlbnQuXG4gICAgdGhpcy5fZW1pdChldmVudFN5bmNocm9uaXplKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYW5kIGFwcGx5IGl0ZW0gcG9zaXRpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0xheW91dENhbGxiYWNrfSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGluc3QgPSB0aGlzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG4gICAgdmFyIGxheW91dElkID0gbGF5b3V0LmlkO1xuICAgIHZhciBpdGVtc0xlbmd0aCA9IGxheW91dC5pdGVtcy5sZW5ndGg7XG4gICAgdmFyIGNvdW50ZXIgPSBpdGVtc0xlbmd0aDtcbiAgICB2YXIgaXNCb3JkZXJCb3g7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGNoZWNraW5nIGlmIGFsbCB0aGUgaXRlbXNcbiAgICAvLyBoYXZlIGxhaWQgb3V0IHlldC4gQWZ0ZXIgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsXG4gICAgLy8gY2FsbGJhY2sgYW5kIGVtaXQgbGF5b3V0RW5kIGV2ZW50LiBPbmx5IGVtaXQgbGF5b3V0RW5kIGV2ZW50IGlmIHRoZXJlXG4gICAgLy8gaGFzbid0IGJlZW4gYSBuZXcgbGF5b3V0IGNhbGwgZHVyaW5nIHRoaXMgbGF5b3V0LlxuICAgIGZ1bmN0aW9uIHRyeUZpbmlzaCgpIHtcbiAgICAgIGlmICgtLWNvdW50ZXIgPiAwKSByZXR1cm47XG5cbiAgICAgIHZhciBoYXNMYXlvdXRDaGFuZ2VkID0gaW5zdC5fbGF5b3V0LmlkICE9PSBsYXlvdXRJZDtcbiAgICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24oaW5zdGFudCkgPyBpbnN0YW50IDogb25GaW5pc2g7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICBjYWxsYmFjayhoYXNMYXlvdXRDaGFuZ2VkLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc0xheW91dENoYW5nZWQgJiYgaW5zdC5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0RW5kKSkge1xuICAgICAgICBpbnN0Ll9lbWl0KGV2ZW50TGF5b3V0RW5kLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGdyaWQncyB3aWR0aCBvciBoZWlnaHQgd2FzIG1vZGlmaWVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCdzIGNhY2hlZFxuICAgIC8vIGRpbWVuc2lvbnMuIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQgZ3JpZCdzIGNhY2hlZCB3aWR0aC9oZWlnaHQgc2hvdWxkXG4gICAgLy8gYWx3YXlzIGVxdWFsIHRvIHdoYXQgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB3b3VsZCByZXR1cm4sIHNvXG4gICAgLy8gdGhlcmVmb3JlIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGVsZW1lbnQncyBib3JkZXJzIHRvIHRoZSBkaW1lbnNpb25zIGlmXG4gICAgLy8gaXQncyBib3gtc2l6aW5nIGlzIGJvcmRlci1ib3guIE5vdGUgdGhhdCB3ZSBzdXBwb3J0IHByb3ZpZGluZyB0aGVcbiAgICAvLyBkaW1lbnNpb25zIGFzIGEgc3RyaW5nIGhlcmUgdG9vIHNvIHRoYXQgb25lIGNhbiBkZWZpbmUgdGhlIHVuaXQgb2YgdGhlXG4gICAgLy8gZGltZW5zaW9ucywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyB0aGUgYm9yZGVyLWJveCBjaGVjay5cbiAgICBpZiAoXG4gICAgICAobGF5b3V0LnNldEhlaWdodCAmJiB0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB8fFxuICAgICAgKGxheW91dC5zZXRXaWR0aCAmJiB0eXBlb2YgbGF5b3V0LndpZHRoID09PSBudW1iZXJUeXBlJDEpXG4gICAgKSB7XG4gICAgICBpc0JvcmRlckJveCA9IGdldFN0eWxlKGVsZW1lbnQsICdib3gtc2l6aW5nJykgPT09ICdib3JkZXItYm94JztcbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRIZWlnaHQpIHtcbiAgICAgIGlmICh0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQuaGVpZ2h0ICsgdGhpcy5fYm9yZGVyVG9wICsgdGhpcy5fYm9yZGVyQm90dG9tIDogbGF5b3V0LmhlaWdodCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBsYXlvdXQuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGF5b3V0LnNldFdpZHRoKSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgICAgIChpc0JvcmRlckJveCA/IGxheW91dC53aWR0aCArIHRoaXMuX2JvcmRlckxlZnQgKyB0aGlzLl9ib3JkZXJSaWdodCA6IGxheW91dC53aWR0aCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGxheW91dC53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0IGxheW91dFN0YXJ0IGV2ZW50LiBOb3RlIHRoYXQgdGhpcyBpcyBpbnRlbnRpb25hbGx5IGVtaXR0ZWQgYWZ0ZXIgdGhlXG4gICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBkaW1lbnNpb25zIGFyZSBzZXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlXG4gICAgLy8gbm8gaG9vayBmb3IgcmVhY3RpbmcgdG8gY29udGFpbmVyIGRpbWVuc2lvbiBjaGFuZ2VzLlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRMYXlvdXRTdGFydCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRMYXlvdXRTdGFydCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgbGV0J3MgZmluaXNoIHF1aWNrbHkuXG4gICAgaWYgKCFpdGVtc0xlbmd0aCkge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgaXRlbXMgbGV0J3MgcG9zaXRpb24gdGhlbS5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IGxheW91dC5pdGVtc1tpXTtcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgcG9zaXRpb24uXG4gICAgICBpdGVtLl9sZWZ0ID0gbGF5b3V0LnNsb3RzW2kgKiAyXTtcbiAgICAgIGl0ZW0uX3RvcCA9IGxheW91dC5zbG90c1tpICogMiArIDFdO1xuXG4gICAgICAvLyBMYXlvdXQgaXRlbSBpZiBpdCBpcyBub3QgZHJhZ2dlZC5cbiAgICAgIGl0ZW0uaXNEcmFnZ2luZygpID8gdHJ5RmluaXNoKCkgOiBpdGVtLl9sYXlvdXQuc3RhcnQoaW5zdGFudCA9PT0gdHJ1ZSwgdHJ5RmluaXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIG5ldyBpdGVtcyBieSBwcm92aWRpbmcgdGhlIGVsZW1lbnRzIHlvdSB3aXNoIHRvIGFkZCB0byB0aGUgaW5zdGFuY2UgYW5kXG4gICAqIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGUgaW5kZXggd2hlcmUgeW91IHdhbnQgdGhlIGl0ZW1zIHRvIGJlIGluc2VydGVkIGludG8uXG4gICAqIEFsbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWxyZWFkeSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC4gSWYgYW4gZWxlbWVudCBoYXMgaXQncyBDU1NcbiAgICogZGlzcGxheSBwcm9wZXJ0eSBzZXQgdG8gXCJub25lXCIgaXQgd2lsbCBiZSBtYXJrZWQgYXMgaW5hY3RpdmUgZHVyaW5nIHRoZVxuICAgKiBpbml0aWF0aW9uIHByb2Nlc3MuIEFzIGxvbmcgYXMgdGhlIGl0ZW0gaXMgaW5hY3RpdmUgaXQgd2lsbCBub3QgYmUgcGFydCBvZlxuICAgKiB0aGUgbGF5b3V0LCBidXQgaXQgd2lsbCByZXRhaW4gaXQncyBpbmRleC4gWW91IGNhbiBhY3RpdmF0ZSBpdGVtcyBhdCBhbnlcbiAgICogcG9pbnQgd2l0aCBncmlkLnNob3coKSBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBjYWxsXG4gICAqIGdyaWQubGF5b3V0KCkgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGFkZGVkIGVsZW1lbnRzIGFyZSB2aXNpYmxlLiBJZiBvbmx5XG4gICAqIGhpZGRlbiBpdGVtcyBhcmUgYWRkZWQgbm8gbGF5b3V0IHdpbGwgYmUgY2FsbGVkLiBBbGwgdGhlIG5ldyB2aXNpYmxlIGl0ZW1zXG4gICAqIGFyZSBwb3NpdGlvbmVkIHdpdGhvdXQgYW5pbWF0aW9uIGR1cmluZyB0aGVpciBmaXJzdCBsYXlvdXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fEhUTUxFbGVtZW50W10pfSBlbGVtZW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbmRleD0tMV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pc0FjdGl2ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFlbGVtZW50cykgcmV0dXJuIFtdO1xuXG4gICAgdmFyIG5ld0l0ZW1zID0gdG9BcnJheShlbGVtZW50cyk7XG4gICAgaWYgKCFuZXdJdGVtcy5sZW5ndGgpIHJldHVybiBuZXdJdGVtcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIE1hcCBwcm92aWRlZCBlbGVtZW50cyBpbnRvIG5ldyBncmlkIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBuZXdJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IG5ldyBJdGVtKHRoaXMsIG5ld0l0ZW1zW2ldLCBvcHRzLmlzQWN0aXZlKTtcbiAgICAgIG5ld0l0ZW1zW2ldID0gaXRlbTtcblxuICAgICAgLy8gSWYgdGhlIGl0ZW0gdG8gYmUgYWRkZWQgaXMgYWN0aXZlLCB3ZSBuZWVkIHRvIGRvIGEgbGF5b3V0LiBBbHNvLCB3ZVxuICAgICAgLy8gbmVlZCB0byBtYXJrIHRoZSBpdGVtIHdpdGggdGhlIHNraXBOZXh0QW5pbWF0aW9uIGZsYWcgdG8gbWFrZSBpdFxuICAgICAgLy8gcG9zaXRpb24gaW5zdGFudGx5ICh3aXRob3V0IGFuaW1hdGlvbikgZHVyaW5nIHRoZSBuZXh0IGxheW91dC4gV2l0aG91dFxuICAgICAgLy8gdGhlIGhhY2sgdGhlIGl0ZW0gd291bGQgYW5pbWF0ZSB0byBpdCdzIG5ldyBwb3NpdGlvbiBmcm9tIHRoZSBub3J0aHdlc3RcbiAgICAgIC8vIGNvcm5lciBvZiB0aGUgZ3JpZCwgd2hpY2ggZmVlbHMgYSBiaXQgYnVnZ3kgKGltaG8pLlxuICAgICAgaWYgKGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBuZXcgaXRlbXMgdG8gdGhlIGl0ZW1zIGNvbGxlY3Rpb24gdG8gY29ycmVjdCBpbmRleC5cbiAgICBhcnJheUluc2VydChpdGVtcywgbmV3SXRlbXMsIG9wdHMuaW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhZGQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudEFkZCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRBZGQsIG5ld0l0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGluZGljZXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlbW92ZSB0aGUgaW5kaXZpZHVhbCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0YXJnZXRJdGVtc1tpXTtcbiAgICAgIGluZGljZXMucHVzaChhbGxJdGVtcy5pbmRleE9mKGl0ZW0pKTtcbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkgbmVlZHNMYXlvdXQgPSB0cnVlO1xuICAgICAgaXRlbS5fZGVzdHJveShvcHRzLnJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlbW92ZSBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50UmVtb3ZlKSkge1xuICAgICAgdGhpcy5fZW1pdChldmVudFJlbW92ZSwgdGFyZ2V0SXRlbXMuc2xpY2UoMCksIGluZGljZXMpO1xuICAgIH1cblxuICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRJdGVtcztcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge1Nob3dDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIHRydWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWRlIGluc3RhbmNlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gaXRlbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7SGlkZUNhbGxiYWNrfSBbb3B0aW9ucy5vbkZpbmlzaF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaXRlbXMsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3NldEl0ZW1zVmlzaWJpbGl0eShpdGVtcywgZmFsc2UsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgaXRlbXMuIEV4cGVjdHMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LCBhIHByZWRpY2F0ZSwgd2hpY2ggc2hvdWxkIGJlXG4gICAqIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGZvciBldmVyeVxuICAgKiBpdGVtIGluIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlIGlzIHRydXRoeSB0aGVcbiAgICogaXRlbSBpbiBxdWVzdGlvbiB3aWxsIGJlIHNob3duIGFuZCBvdGhlcndpc2UgaGlkZGVuLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrXG4gICAqIHJlY2VpdmVzIHRoZSBpdGVtIGluc3RhbmNlIGFzIGl0J3MgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGUgaXMgYSBzdHJpbmdcbiAgICogaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIHNlbGVjdG9yIGFuZCBpdCBpcyBjaGVja2VkIGFnYWluc3QgZXZlcnkgaXRlbVxuICAgKiBlbGVtZW50IGluIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBuYXRpdmUgZWxlbWVudC5tYXRjaGVzKCkgbWV0aG9kLiBBbGwgdGhlXG4gICAqIG1hdGNoaW5nIGl0ZW1zIHdpbGwgYmUgc2hvd24gYW5kIG90aGVycyBoaWRkZW4uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufFN0cmluZyl9IHByZWRpY2F0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtGaWx0ZXJDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pdGVtcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zVG9TaG93ID0gW107XG4gICAgdmFyIGl0ZW1zVG9IaWRlID0gW107XG4gICAgdmFyIGlzUHJlZGljYXRlU3RyaW5nID0gdHlwZW9mIHByZWRpY2F0ZSA9PT0gc3RyaW5nVHlwZTtcbiAgICB2YXIgaXNQcmVkaWNhdGVGbiA9IGlzRnVuY3Rpb24ocHJlZGljYXRlKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgb25GaW5pc2ggPSBpc0Z1bmN0aW9uKG9wdHMub25GaW5pc2gpID8gb3B0cy5vbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIHRyeUZpbmlzaENvdW50ZXIgPSAtMTtcbiAgICB2YXIgdHJ5RmluaXNoID0gbm9vcDtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHdlIGhhdmUgb25GaW5pc2ggY2FsbGJhY2ssIGxldCdzIGNyZWF0ZSBwcm9wZXIgdHJ5RmluaXNoIGNhbGxiYWNrLlxuICAgIGlmIChvbkZpbmlzaCkge1xuICAgICAgdHJ5RmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICsrdHJ5RmluaXNoQ291bnRlciAmJiBvbkZpbmlzaChpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB3aGljaCBpdGVtcyBuZWVkIHRvIGJlIHNob3duIGFuZCB3aGljaCBoaWRkZW4uXG4gICAgaWYgKGlzUHJlZGljYXRlRm4gfHwgaXNQcmVkaWNhdGVTdHJpbmcpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVtID0gdGhpcy5faXRlbXNbaV07XG4gICAgICAgIGlmIChpc1ByZWRpY2F0ZUZuID8gcHJlZGljYXRlKGl0ZW0pIDogZWxlbWVudE1hdGNoZXMoaXRlbS5fZWxlbWVudCwgcHJlZGljYXRlKSkge1xuICAgICAgICAgIGl0ZW1zVG9TaG93LnB1c2goaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbXNUb0hpZGUucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3cgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvdyhpdGVtc1RvU2hvdywge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBoaWRkZW4uXG4gICAgaWYgKGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWRlKGl0ZW1zVG9IaWRlLCB7XG4gICAgICAgIGluc3RhbnQ6IGlzSW5zdGFudCxcbiAgICAgICAgb25GaW5pc2g6IHRyeUZpbmlzaCxcbiAgICAgICAgbGF5b3V0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgaXRlbXMgdG8gZmlsdGVyLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGggfHwgaXRlbXNUb0hpZGUubGVuZ3RoKSB7XG4gICAgICAvLyBFbWl0IGZpbHRlciBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRGaWx0ZXIsIGl0ZW1zVG9TaG93LnNsaWNlKDApLCBpdGVtc1RvSGlkZS5zbGljZSgwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU29ydCBpdGVtcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc29ydCB0aGUgaXRlbXMuIFRoZSBmaXJzdCBpcyBzaW1wbHkgYnlcbiAgICogcHJvdmlkaW5nIGEgZnVuY3Rpb24gYXMgdGhlIGNvbXBhcmVyIHdoaWNoIHdvcmtzIGlkZW50aWNhbGx5IHRvIG5hdGl2ZVxuICAgKiBhcnJheSBzb3J0LiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc29ydCBieSB0aGUgc29ydCBkYXRhIHlvdSBoYXZlIHByb3ZpZGVkXG4gICAqIGluIHRoZSBpbnN0YW5jZSdzIG9wdGlvbnMuIEp1c3QgcHJvdmlkZSB0aGUgc29ydCBkYXRhIGtleShzKSBhcyBhIHN0cmluZ1xuICAgKiAoc2VwYXJhdGVkIGJ5IHNwYWNlKSBhbmQgdGhlIGl0ZW1zIHdpbGwgYmUgc29ydGVkIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICAgKiBzb3J0IGRhdGEga2V5cy4gTGFzdGx5IHlvdSBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBwcm92aWRlIGEgcHJlc29ydGVkXG4gICAqIGFycmF5IG9mIGl0ZW1zIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzeW5jIHRoZSBpbnRlcm5hbCBpdGVtcyBhcnJheSBpbiB0aGVcbiAgICogc2FtZSBvcmRlci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258SXRlbVtdfFN0cmluZ3xTdHJpbmdbXSl9IGNvbXBhcmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZXNjZW5kaW5nPWZhbHNlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNvcnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvcnRDb21wYXJlcjtcbiAgICB2YXIgaXNEZXNjZW5kaW5nO1xuICAgIHZhciBvcmlnSXRlbXM7XG4gICAgdmFyIGluZGV4TWFwO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VDcml0ZXJpYShkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnOicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJbmRleE1hcChpdGVtcykge1xuICAgICAgdmFyIHJldCA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXRbaXRlbXNbaV0uX2lkXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBhcmVJbmRpY2VzKGl0ZW1BLCBpdGVtQikge1xuICAgICAgdmFyIGluZGV4QSA9IGluZGV4TWFwW2l0ZW1BLl9pZF07XG4gICAgICB2YXIgaW5kZXhCID0gaW5kZXhNYXBbaXRlbUIuX2lkXTtcbiAgICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyBpbmRleEIgLSBpbmRleEEgOiBpbmRleEEgLSBpbmRleEI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgdmFyIGNyaXRlcmlhTmFtZTtcbiAgICAgIHZhciBjcml0ZXJpYU9yZGVyO1xuICAgICAgdmFyIHZhbEE7XG4gICAgICB2YXIgdmFsQjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsaXN0IG9mIHNvcnQgY3JpdGVyaWEuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRDb21wYXJlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIGNyaXRlcmlhIG5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCBhbiBpdGVtJ3Mgc29ydCBkYXRhIGtleS5cbiAgICAgICAgY3JpdGVyaWFOYW1lID0gc29ydENvbXBhcmVyW2ldWzBdO1xuICAgICAgICBjcml0ZXJpYU9yZGVyID0gc29ydENvbXBhcmVyW2ldWzFdO1xuXG4gICAgICAgIC8vIEdldCBpdGVtcycgY2FjaGVkIHNvcnQgdmFsdWVzIGZvciB0aGUgY3JpdGVyaWEuIElmIHRoZSBpdGVtIGhhcyBubyBzb3J0XG4gICAgICAgIC8vIGRhdGEgbGV0J3MgdXBkYXRlIHRoZSBpdGVtcyBzb3J0IGRhdGEgKHRoaXMgaXMgYSBsYXp5IGxvYWQgbWVjaGFuaXNtKS5cbiAgICAgICAgdmFsQSA9IChhLl9zb3J0RGF0YSA/IGEgOiBhLl9yZWZyZXNoU29ydERhdGEoKSkuX3NvcnREYXRhW2NyaXRlcmlhTmFtZV07XG4gICAgICAgIHZhbEIgPSAoYi5fc29ydERhdGEgPyBiIDogYi5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuXG4gICAgICAgIC8vIFNvcnQgdGhlIGl0ZW1zIGluIGRlc2NlbmRpbmcgb3JkZXIgaWYgZGVmaW5lZCBzbyBleHBsaWNpdGx5LiBPdGhlcndpc2VcbiAgICAgICAgLy8gc29ydCBpdGVtcyBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgIGlmIChjcml0ZXJpYU9yZGVyID09PSAnZGVzYycgfHwgKCFjcml0ZXJpYU9yZGVyICYmIGlzRGVzY2VuZGluZykpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxCIDwgdmFsQSA/IC0xIDogdmFsQiA+IHZhbEEgPyAxIDogMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxBIDwgdmFsQiA/IC0xIDogdmFsQSA+IHZhbEIgPyAxIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgLTEgb3IgMSBhcyB0aGUgcmV0dXJuIHZhbHVlLCBsZXQncyByZXR1cm4gaXQgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHZhbHVlcyBhcmUgZXF1YWwgbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZVxuICAgICAgLy8gaGF2ZSBhIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgICByZXN1bHQgPSBjb21wYXJlSW5kaWNlcyhhLCBiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VzdG9tQ29tcGFyZXIoYSwgYikge1xuICAgICAgdmFyIHJlc3VsdCA9IHNvcnRDb21wYXJlcihhLCBiKTtcbiAgICAgIC8vIElmIGRlc2NlbmRpbmcgbGV0J3MgaW52ZXJ0IHRoZSByZXN1bHQgdmFsdWUuXG4gICAgICBpZiAoaXNEZXNjZW5kaW5nICYmIHJlc3VsdCkgcmVzdWx0ID0gLXJlc3VsdDtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCByZXN1bHQgKG5vdCB6ZXJvKSBsZXQncyByZXR1cm4gaXQgcmlnaHQgYXdheS5cbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAvLyBJZiByZXN1bHQgaXMgemVybyBsZXQncyBjb21wYXJlIHRoZSBpdGVtIGluZGljZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYVxuICAgICAgLy8gc3RhYmxlIHNvcnQuXG4gICAgICBpZiAoIWluZGV4TWFwKSBpbmRleE1hcCA9IGdldEluZGV4TWFwKG9yaWdJdGVtcyk7XG4gICAgICByZXR1cm4gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBhcmVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgdGhpcy5faXRlbXMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXM7XG5cbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gU2V0dXAgcGFyZW50IHNjb3BlIGRhdGEuXG4gICAgICBzb3J0Q29tcGFyZXIgPSBjb21wYXJlcjtcbiAgICAgIGlzRGVzY2VuZGluZyA9ICEhb3B0cy5kZXNjZW5kaW5nO1xuICAgICAgb3JpZ0l0ZW1zID0gaXRlbXMuc2xpY2UoMCk7XG4gICAgICBpbmRleE1hcCA9IG51bGw7XG5cbiAgICAgIC8vIElmIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGRvIGEgbmF0aXZlIGFycmF5IHNvcnQuXG4gICAgICBpZiAoaXNGdW5jdGlvbihzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGl0ZW1zLnNvcnQoY3VzdG9tQ29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhIHN0cmluZywgbGV0J3Mgc29ydCBieSB0aGUgc29ydCBkYXRhIGFzIHByb3ZpZGVkIGluXG4gICAgICAvLyB0aGUgaW5zdGFuY2UncyBvcHRpb25zLlxuICAgICAgZWxzZSBpZiAodHlwZW9mIHNvcnRDb21wYXJlciA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgICBzb3J0Q29tcGFyZXIgPSBwYXJzZUNyaXRlcmlhKGNvbXBhcmVyKTtcbiAgICAgICAgaXRlbXMuc29ydChkZWZhdWx0Q29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhbiBhcnJheSwgbGV0J3MgYXNzdW1lIGl0J3MgYSBwcmVzb3J0ZWQgYXJyYXkgb2YgdGhlXG4gICAgICAvLyBpdGVtcyBhbmQgb3JkZXIgdGhlIGl0ZW1zIGJhc2VkIG9uIGl0LlxuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGlmIChzb3J0Q29tcGFyZXIubGVuZ3RoICE9PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1snICsgbmFtZXNwYWNlICsgJ10gc29ydCByZWZlcmVuY2UgaXRlbXMgZG8gbm90IG1hdGNoIHdpdGggZ3JpZCBpdGVtcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoc29ydENvbXBhcmVyLmluZGV4T2YoaXRlbXNbaV0pIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGl0ZW1zW2ldID0gc29ydENvbXBhcmVyW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rlc2NlbmRpbmcpIGl0ZW1zLnJldmVyc2UoKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBsZXQncyBqdXN0IHNraXAgaXQsIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLyoqIEB0b2RvIE1heWJlIHRocm93IGFuIGVycm9yIGhlcmU/ICovXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHNvcnQgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50U29ydCkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudFNvcnQsIGl0ZW1zLnNsaWNlKDApLCBvcmlnSXRlbXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIE1vdmUgaXRlbSB0byBhbm90aGVyIGluZGV4IG9yIGluIHBsYWNlIG9mIGFub3RoZXIgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPVwibW92ZVwiXVxuICAgKiAgIC0gQWNjZXB0cyBlaXRoZXIgXCJtb3ZlXCIgb3IgXCJzd2FwXCIuXG4gICAqICAgLSBcIm1vdmVcIiBtb3ZlcyB0aGUgaXRlbSBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgaXRlbS5cbiAgICogICAtIFwic3dhcFwiIHN3YXBzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbXMuXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKGl0ZW0sIHBvc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBpc1N3YXAgPSBvcHRzLmFjdGlvbiA9PT0gYWN0aW9uU3dhcDtcbiAgICB2YXIgYWN0aW9uID0gaXNTd2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG4gICAgdmFyIGZyb21JdGVtID0gdGhpcy5fZ2V0SXRlbShpdGVtKTtcbiAgICB2YXIgdG9JdGVtID0gdGhpcy5fZ2V0SXRlbShwb3NpdGlvbik7XG4gICAgdmFyIGZyb21JbmRleDtcbiAgICB2YXIgdG9JbmRleDtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbXMgZXhpc3QgYW5kIGFyZSBub3QgdGhlIHNhbWUuXG4gICAgaWYgKGZyb21JdGVtICYmIHRvSXRlbSAmJiBmcm9tSXRlbSAhPT0gdG9JdGVtKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGljZXMgb2YgdGhlIGl0ZW1zLlxuICAgICAgZnJvbUluZGV4ID0gaXRlbXMuaW5kZXhPZihmcm9tSXRlbSk7XG4gICAgICB0b0luZGV4ID0gaXRlbXMuaW5kZXhPZih0b0l0ZW0pO1xuXG4gICAgICAvLyBEbyB0aGUgbW92ZS9zd2FwLlxuICAgICAgaWYgKGlzU3dhcCkge1xuICAgICAgICBhcnJheVN3YXAoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheU1vdmUoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgIGl0ZW06IGZyb21JdGVtLFxuICAgICAgICAgIGZyb21JbmRleDogZnJvbUluZGV4LFxuICAgICAgICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2VuZCBpdGVtIHRvIGFub3RoZXIgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuYXBwZW5kVG89ZG9jdW1lbnQuYm9keV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRTZW5kZXI9dHJ1ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRSZWNlaXZlcj10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihpdGVtLCBncmlkLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCBncmlkLl9pc0Rlc3Ryb3llZCB8fCB0aGlzID09PSBncmlkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgdGFyZ2V0IGl0ZW0uXG4gICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjb250YWluZXIgPSBvcHRzLmFwcGVuZFRvIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciBsYXlvdXRTZW5kZXIgPSBvcHRzLmxheW91dFNlbmRlciA/IG9wdHMubGF5b3V0U2VuZGVyIDogb3B0cy5sYXlvdXRTZW5kZXIgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbGF5b3V0UmVjZWl2ZXIgPSBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA/IG9wdHMubGF5b3V0UmVjZWl2ZXJcbiAgICAgIDogb3B0cy5sYXlvdXRSZWNlaXZlciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gU3RhcnQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLlxuICAgIGl0ZW0uX21pZ3JhdGUuc3RhcnQoZ3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcik7XG5cbiAgICAvLyBJZiBtaWdyYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgaXRlbSBpcyBhY3RpdmUsIGxldCdzIGxheW91dFxuICAgIC8vIHRoZSBncmlkcy5cbiAgICBpZiAoaXRlbS5fbWlncmF0ZS5faXNBY3RpdmUgJiYgaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIGlmIChsYXlvdXRTZW5kZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQoXG4gICAgICAgICAgbGF5b3V0U2VuZGVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0U2VuZGVyKSA/IGxheW91dFNlbmRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGxheW91dFJlY2VpdmVyKSB7XG4gICAgICAgIGdyaWQubGF5b3V0KFxuICAgICAgICAgIGxheW91dFJlY2VpdmVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0UmVjZWl2ZXIpID8gbGF5b3V0UmVjZWl2ZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnRzPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihyZW1vdmVFbGVtZW50cykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFVuYmluZCB3aW5kb3cgcmVzaXplIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICh0aGlzLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLl9kZXN0cm95KHJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGNvbnRhaW5lci5cbiAgICByZW1vdmVDbGFzcyhjb250YWluZXIsIHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lckNsYXNzKTtcbiAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJyc7XG5cbiAgICAvLyBFbWl0IGRlc3Ryb3kgZXZlbnQgYW5kIHVuYmluZCBhbGwgZXZlbnRzLlxuICAgIHRoaXMuX2VtaXQoZXZlbnREZXN0cm95KTtcbiAgICB0aGlzLl9lbWl0dGVyLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSByZWZlcmVuY2UgZnJvbSB0aGUgZ3JpZCBpbnN0YW5jZXMgY29sbGVjdGlvbi5cbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEZsYWcgaW5zdGFuY2UgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSdzIGl0ZW0gYnkgZWxlbWVudCBvciBieSBpbmRleC4gVGFyZ2V0IGNhbiBhbHNvIGJlIGFuIEl0ZW1cbiAgICogaW5zdGFuY2UgaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgaXRlbSBpZiBpdCBleGlzdHMgd2l0aGluXG4gICAqIHJlbGF0ZWQgR3JpZCBpbnN0YW5jZS4gSWYgbm90aGluZyBpcyBmb3VuZCB3aXRoIHRoZSBwcm92aWRlZCB0YXJnZXQsIG51bGxcbiAgICogaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHs/SXRlbX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9nZXRJdGVtID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgLy8gSWYgbm8gdGFyZ2V0IGlzIHNwZWNpZmllZCBvciB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLCByZXR1cm4gbnVsbC5cbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgKCF0YXJnZXQgJiYgdGFyZ2V0ICE9PSAwKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGFyZ2V0IGlzIG51bWJlciByZXR1cm4gdGhlIGl0ZW0gaW4gdGhhdCBpbmRleC4gSWYgdGhlIG51bWJlciBpcyBsb3dlclxuICAgIC8vIHRoYW4gemVybyBsb29rIGZvciB0aGUgaXRlbSBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIGl0ZW1zIGFycmF5LiBGb3JcbiAgICAvLyBleGFtcGxlIC0xIGZvciB0aGUgbGFzdCBpdGVtLCAtMiBmb3IgdGhlIHNlY29uZCBsYXN0IGl0ZW0sIGV0Yy5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXNbdGFyZ2V0ID4gLTEgPyB0YXJnZXQgOiB0aGlzLl9pdGVtcy5sZW5ndGggKyB0YXJnZXRdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBpcyBhbiBpbnN0YW5jZSBvZiBJdGVtIHJldHVybiBpdCBpZiBpdCBpcyBhdHRhY2hlZCB0byB0aGlzXG4gICAgLy8gR3JpZCBpbnN0YW5jZSwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJdGVtKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Ll9ncmlkSWQgPT09IHRoaXMuX2lkID8gdGFyZ2V0IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJbiBvdGhlciBjYXNlcyBsZXQncyBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzIGFuIGVsZW1lbnQsIHNvIGxldCdzIHRyeVxuICAgIC8vIHRvIGZpbmQgYW4gaXRlbSB0aGF0IG1hdGNoZXMgdGhlIGVsZW1lbnQgYW5kIHJldHVybiBpdC4gSWYgaXRlbSBpcyBub3RcbiAgICAvLyBmb3VuZCByZXR1cm4gbnVsbC5cbiAgICAvKiogQHRvZG8gVGhpcyBjb3VsZCBiZSBtYWRlIGEgbG90IGZhc3RlciBieSB1c2luZyBNYXAvV2Vha01hcCBvZiBlbGVtZW50cy4gKi9cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2VsZW1lbnQgPT09IHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBpbnN0YW5jZSdzIGxheW91dCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5sYXlvdXQ7XG4gICAgdmFyIHdpZHRoO1xuICAgIHZhciBoZWlnaHQ7XG4gICAgdmFyIG5ld0xheW91dDtcbiAgICB2YXIgaTtcblxuICAgIC8vIExldCdzIGluY3JlbWVudCBsYXlvdXQgaWQuXG4gICAgKytsYXlvdXQuaWQ7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgbGF5b3V0IGl0ZW1zXG4gICAgbGF5b3V0Lml0ZW1zLmxlbmd0aCA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2lzQWN0aXZlKSBsYXlvdXQuaXRlbXMucHVzaCh0aGlzLl9pdGVtc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gTGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjb250YWluZXIgd2lkdGggYW5kIGhlaWdodCAod2l0aG91dCBib3JkZXJzKS5cbiAgICB3aWR0aCA9IHRoaXMuX3dpZHRoIC0gdGhpcy5fYm9yZGVyTGVmdCAtIHRoaXMuX2JvcmRlclJpZ2h0O1xuICAgIGhlaWdodCA9IHRoaXMuX2hlaWdodCAtIHRoaXMuX2JvcmRlclRvcCAtIHRoaXMuX2JvcmRlckJvdHRvbTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgbGF5b3V0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzKSkge1xuICAgICAgbmV3TGF5b3V0ID0gc2V0dGluZ3MobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5b3V0ID0gcGFja2VyLmdldExheW91dChsYXlvdXQuaXRlbXMsIHdpZHRoLCBoZWlnaHQsIGxheW91dC5zbG90cywgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgZ3JpZCdzIGxheW91dC5cbiAgICBsYXlvdXQuc2xvdHMgPSBuZXdMYXlvdXQuc2xvdHM7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0V2lkdGgpO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSBCb29sZWFuKG5ld0xheW91dC5zZXRIZWlnaHQpO1xuICAgIGxheW91dC53aWR0aCA9IG5ld0xheW91dC53aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gbmV3TGF5b3V0LmhlaWdodDtcblxuICAgIHJldHVybiBsYXlvdXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBncmlkIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Li4uKn0gW2FyZ11cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0LmFwcGx5KHRoaXMuX2VtaXR0ZXIsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZXZlbnRzIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5faGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZW1pdHRlci5fZXZlbnRzW2V2ZW50XTtcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVycy5sZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29udGFpbmVyJ3Mgd2lkdGgsIGhlaWdodCBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgdGhpcy5fbGVmdCA9IHJlY3QubGVmdDtcbiAgICB0aGlzLl90b3AgPSByZWN0LnRvcDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIGJvcmRlciBzaXplcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGVmdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJpZ2h0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9wXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm90dG9tXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm9yZGVycyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAobGVmdCkgdGhpcy5fYm9yZGVyTGVmdCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICBpZiAocmlnaHQpIHRoaXMuX2JvcmRlclJpZ2h0ID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgICBpZiAodG9wKSB0aGlzLl9ib3JkZXJUb3AgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICBpZiAoYm90dG9tKSB0aGlzLl9ib3JkZXJCb3R0b20gPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1ib3R0b20td2lkdGgnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVmcmVzaCBhbGwgb2YgY29udGFpbmVyJ3MgaW50ZXJuYWwgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fcmVmcmVzaERpbWVuc2lvbnMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcbiAgICB0aGlzLl91cGRhdGVCb3JkZXJzKDEsIDEsIDEsIDEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgR3JpZCBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0geyhTaG93Q2FsbGJhY2t8SGlkZUNhbGxiYWNrKX0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fc2V0SXRlbXNWaXNpYmlsaXR5ID0gZnVuY3Rpb24oaXRlbXMsIHRvVmlzaWJsZSwgb3B0aW9ucykge1xuICAgIHZhciBncmlkID0gdGhpcztcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0aGlzLmdldEl0ZW1zKGl0ZW1zKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBjYWxsYmFjayA9IG9wdHMub25GaW5pc2g7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBjb3VudGVyID0gdGFyZ2V0SXRlbXMubGVuZ3RoO1xuICAgIHZhciBzdGFydEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93U3RhcnQgOiBldmVudEhpZGVTdGFydDtcbiAgICB2YXIgZW5kRXZlbnQgPSB0b1Zpc2libGUgPyBldmVudFNob3dFbmQgOiBldmVudEhpZGVFbmQ7XG4gICAgdmFyIG1ldGhvZCA9IHRvVmlzaWJsZSA/ICdzaG93JyA6ICdoaWRlJztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgY29tcGxldGVkSXRlbXMgPSBbXTtcbiAgICB2YXIgaGlkZGVuSXRlbXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBjYWxsIHRoZSBjYWxsYmFjaywgYnV0IGRvbid0IGVtaXQgYW55IGV2ZW50cy5cbiAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2sodGFyZ2V0SXRlbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc2hvd1N0YXJ0L2hpZGVTdGFydCBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKHN0YXJ0RXZlbnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KHN0YXJ0RXZlbnQsIHRhcmdldEl0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBTaG93L2hpZGUgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gb3IgYWN0aXZlIGl0ZW0gaXMgaGlkZGVuIHdlIG5lZWQgdG8gZG9cbiAgICAgIC8vIGxheW91dC5cbiAgICAgIGlmICgodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkgfHwgKCF0b1Zpc2libGUgJiYgaXRlbS5faXNBY3RpdmUpKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaW5hY3RpdmUgaXRlbSBpcyBzaG93biB3ZSBhbHNvIG5lZWQgdG8gZG8gYSBsaXR0bGUgaGFjayB0byBtYWtlIHRoZVxuICAgICAgLy8gaXRlbSBub3QgYW5pbWF0ZSBpdCdzIG5leHQgcG9zaXRpb25pbmcgKGxheW91dCkuXG4gICAgICBpZiAodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBpdGVtLl9sYXlvdXQuX3NraXBOZXh0QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSBoaWRkZW4gaXRlbSBpcyBiZWluZyBzaG93biB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGl0ZW0nc1xuICAgICAgLy8gZGltZW5zaW9ucy5cbiAgICAgIGlmICh0b1Zpc2libGUgJiYgaXRlbS5fdmlzaWJpbGl0eS5faXNIaWRkZW4pIHtcbiAgICAgICAgaGlkZGVuSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdy9oaWRlIHRoZSBpdGVtLlxuICAgICAgaXRlbS5fdmlzaWJpbGl0eVttZXRob2RdKGlzSW5zdGFudCwgZnVuY3Rpb24oaW50ZXJydXB0ZWQsIGl0ZW0pIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaXRlbSdzIGFuaW1hdGlvbiB3YXMgbm90IGludGVycnVwdGVkIGFkZCBpdCB0byB0aGVcbiAgICAgICAgLy8gY29tcGxldGVkSXRlbXMgYXJyYXkuXG4gICAgICAgIGlmICghaW50ZXJydXB0ZWQpIGNvbXBsZXRlZEl0ZW1zLnB1c2goaXRlbSk7XG5cbiAgICAgICAgLy8gSWYgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsIHRoZSBjYWxsYmFja1xuICAgICAgICAvLyBhbmQgZW1pdCBzaG93RW5kL2hpZGVFbmQgZXZlbnQuXG4gICAgICAgIGlmICgtLWNvdW50ZXIgPCAxKSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSBjYWxsYmFjayhjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhlbmRFdmVudCkpIGdyaWQuX2VtaXQoZW5kRXZlbnQsIGNvbXBsZXRlZEl0ZW1zLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBoaWRkZW4gaXRlbXMuXG4gICAgaWYgKGhpZGRlbkl0ZW1zLmxlbmd0aCkgdGhpcy5yZWZyZXNoSXRlbXMoaGlkZGVuSXRlbXMpO1xuXG4gICAgLy8gTGF5b3V0IGlmIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGhlbHBlcnNcbiAgICogKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXJnZSBkZWZhdWx0IHNldHRpbmdzIHdpdGggdXNlciBzZXR0aW5ncy4gVGhlIHJldHVybmVkIG9iamVjdCBpcyBhIG5ld1xuICAgKiBvYmplY3Qgd2l0aCBtZXJnZWQgdmFsdWVzLiBUaGUgbWVyZ2luZyBpcyBhIGRlZXAgbWVyZ2UgbWVhbmluZyB0aGF0IGFsbFxuICAgKiBvYmplY3RzIGFuZCBhcnJheXMgd2l0aGluIHRoZSBwcm92aWRlZCBzZXR0aW5ncyBvYmplY3RzIHdpbGwgYmUgYWxzbyBtZXJnZWRcbiAgICogc28gdGhhdCBtb2RpZnlpbmcgdGhlIHZhbHVlcyBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgaGF2ZSBubyBlZmZlY3Qgb25cbiAgICogdGhlIHJldHVybmVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRTZXR0aW5nc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW3VzZXJTZXR0aW5nc11cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIG5ldyBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZVNldHRpbmdzKGRlZmF1bHRTZXR0aW5ncywgdXNlclNldHRpbmdzKSB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggY29weSBvZiBkZWZhdWx0IHNldHRpbmdzLlxuICAgIHZhciByZXQgPSBtZXJnZU9iamVjdHMoe30sIGRlZmF1bHRTZXR0aW5ncyk7XG5cbiAgICAvLyBNZXJnZSB1c2VyIHNldHRpbmdzIHRvIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgaWYgKHVzZXJTZXR0aW5ncykge1xuICAgICAgcmV0ID0gbWVyZ2VPYmplY3RzKHJldCwgdXNlclNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdmlzaWJsZS9oaWRkZW4gc3R5bGVzIG1hbnVhbGx5IHNvIHRoYXQgdGhlIHdob2xlIG9iamVjdCBpc1xuICAgIC8vIG92ZXJyaWRkZW4gaW5zdGVhZCBvZiB0aGUgcHJvcHMuXG4gICAgcmV0LnZpc2libGVTdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLnZpc2libGVTdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzO1xuICAgIHJldC5oaWRkZW5TdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcyB8fCAoZGVmYXVsdFNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcztcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgdHdvIG9iamVjdHMgcmVjdXJzaXZlbHkgKGRlZXAgbWVyZ2UpLiBUaGUgc291cmNlIG9iamVjdCdzIHByb3BlcnRpZXNcbiAgICogYXJlIG1lcmdlZCB0byB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiAgIC0gVGhlIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VcbiAgICogICAtIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKHRhcmdldCwgc291cmNlKSB7XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDtcbiAgICB2YXIgaXNTb3VyY2VPYmplY3Q7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9wTmFtZSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpc1NvdXJjZU9iamVjdCA9IGlzUGxhaW5PYmplY3Qoc291cmNlW3Byb3BOYW1lXSk7XG5cbiAgICAgIC8vIElmIHRhcmdldCBhbmQgc291cmNlIHZhbHVlcyBhcmUgYm90aCBvYmplY3RzLCBtZXJnZSB0aGUgb2JqZWN0cyBhbmRcbiAgICAgIC8vIGFzc2lnbiB0aGUgbWVyZ2VkIHZhbHVlIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRbcHJvcE5hbWVdKSAmJiBpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKG1lcmdlT2JqZWN0cyh7fSwgdGFyZ2V0W3Byb3BOYW1lXSksIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgb2JqZWN0IGFuZCB0YXJnZXQncyBpcyBub3QgbGV0J3MgY2xvbmUgdGhlIG9iamVjdCBhc1xuICAgICAgLy8gdGhlIHRhcmdldCdzIHZhbHVlLlxuICAgICAgaWYgKGlzU291cmNlT2JqZWN0KSB7XG4gICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBtZXJnZU9iamVjdHMoe30sIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgYW4gYXJyYXkgbGV0J3MgY2xvbmUgdGhlIGFycmF5IGFzIHRoZSB0YXJnZXQnc1xuICAgICAgLy8gdmFsdWUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VbcHJvcE5hbWVdKSkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXS5zbGljZSgwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGFsbCBvdGhlciBjYXNlcyBsZXQncyBqdXN0IGRpcmVjdGx5IGFzc2lnbiB0aGUgc291cmNlJ3MgdmFsdWUgYXMgdGhlXG4gICAgICAvLyB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gR3JpZDtcblxufSkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEl0ZW1WYWx1ZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXJcbiAgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZVxuICBpbXBsZW1lbnRzIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdmlzdWFsaXplcnM6IEFycmF5PFZpc3VhbGl6ZXJCYXNlPixcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0XG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgICBpZiAoIXZpc3VhbGl6ZXJzIHx8IHZpc3VhbGl6ZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJWaXN1YWxpemVyQXJyYXlXcmFwcGVyIHdvcmtzIHdpdGggdmlzdWFsaXplcnMgY29sbGVjdGlvbiBvbmx5LlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICBpZiAodmlzdWFsaXplci5zdXBwb3J0U2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N1cHBvcnRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5wdXNoKFxuICAgICAgICAgIDxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+KDxhbnk+dmlzdWFsaXplcilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZVZpc3VhbGl6ZXJcIiwgKCkgPT5cbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLm1hcCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdmlzdWFsaXplci5uYW1lLFxuICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZpc3VhbGl6ZXJfXCIgKyB2aXN1YWxpemVyLm5hbWUpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMudmlzdWFsaXplci5uYW1lID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgIChlOiBhbnkpID0+IHRoaXMuc2V0VmlzdWFsaXplcihlLnRhcmdldC52YWx1ZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplcnNbMF07XG4gICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmlzdWFsaXplckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxpemVycygpIHtcbiAgICByZXR1cm4gdGhpcy52aXN1YWxpemVycztcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uOiBBcnJheTxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+ID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWU7XG4gIHByaXZhdGUgdmlzdWFsaXplcjogVmlzdWFsaXplckJhc2U7XG5cbiAgcHJpdmF0ZSBvbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwcml2YXRlIHNldFZpc3VhbGl6ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICB0aGlzLnZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUoXG4gICAgICAgIHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFja1xuICAgICAgKTtcbiAgICAgIHRoaXMudmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMudmlzdWFsaXplciA9IHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2Lm5hbWUgPT09IG5hbWUpWzBdO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgb25EYXRhSXRlbVNlbGVjdGVkKFxuICAgIHZhbDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWRcbiAgKSB7XG4gICAgdGhpcy52aXN1YWxpemVyc1dpdGhTZWxlY3Rpb24uZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB2YWw7XG4gICAgfSk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKSB7XG4gICAgdGhpcy52aXN1YWxpemVyc1dpdGhTZWxlY3Rpb24uZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5zZXRTZWxlY3Rpb24oaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiAoPGFueT50aGlzLnZpc3VhbGl6ZXIpLnNlbGVjdGlvbiB8fCB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy52aXN1YWxpemVyLnJlbmRlcih0aGlzLnZpc3VhbGl6ZXJDb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3IpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCh2aXN1YWxpemVyID0+IHZpc3VhbGl6ZXIuYmFja2dyb3VuZENvbG9yID0gY29sb3IpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJBbHRlcm5hdGl2ZXNWaXN1YWxpemVyKFxuICBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuKTtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgYXJhYmljU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwi2LLYsdin2LEg2KfZhNmF2KzZhdmI2LnYqVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcItiq2YUg2KfZhNiq2K3Yr9mK2Ksg2YXZhiDYrtmE2KfZhNmJXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLYp9iu2KrYsVwiLFxuICBoaWRlQ29sdW1uOiBcItin2K7Zgdin2KEg2KfZhNi52YXZiNivXCIsXG4gIHNob3dDb2x1bW46IFwi2KfYuNmH2KfYsVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCLYo9is2LnZhCDYp9mE2LnZhdmI2K8g2K7Yp9i1XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwi2KPYrNi52YQg2KfZhNi52YXZiNivINi52KfZhVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwi2KfZhtiq2YLZhCDYpdmE2Ykg2KfZhNiq2YHYp9i12YrZhFwiLFxuICBzaG93QXNDb2x1bW46IFwi2KXYuNmH2KfYsSDZg9i52YXZiNivXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcItio2K3Yqy4uLlwiLFxuICByZW1vdmVSb3dzOiBcItit2LDZgVwiLFxuICBzaG93TGFiZWw6IFwi2KfYuNmH2KfYsVwiLFxuICBlbnRyaWVzTGFiZWw6IFwi2YXYr9iu2YTYp9iqXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCLYrNiv2KfZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcItmD2YTZhdin2KpcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwi2KfZhNix2LPZhSDYp9mE2KjZitin2YbZilwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCLZhdiq2YjYs9i3XCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCLYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwi2LHYs9mFINio2YrYp9mG2YpcIixcbiAgY2hhcnRUeXBlX2JhcjogXCLYtNix2YrYt1wiLFxuICBjaGFydFR5cGVfdmJhcjogXCLYtNix2YrYtyDYudmF2YjYr9mKXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIti02LHZiti3INmF2YPYr9izXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcItin2K7Zgdin2KFcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwi2KPYrNi52YQg2K7Yp9i1XCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwi2KPYrNi52YQg2LnYp9mFXCIsXG4gIHNob3dCdXR0b246IFwi2KfYuNmH2KfYsVwiLFxuICBmaWx0ZXI6IFwi2KrYsdi02K1cIixcbiAgcmVzZXRGaWx0ZXI6IFwi2KXYudin2K/YqSDYqti52YrZitmGXCIsXG4gIGNoYW5nZUxvY2FsZTogXCLYqti62YrZitixINin2YTZhNi62KlcIixcbiAgZW46IFwi2KfZhNmE2LrYqSDYp9mE2KfZhtis2YTZitiy2YrYqVwiLFxuICBmcjogXCLYp9mE2YTYutmHINin2YTZgdix2YbYs9mK2KlcIixcbiAgcnU6IFwi2KfZhNmE2LrZhyDYp9mE2LHZiNiz2YrYqVwiLFxuICBkZTogXCLYp9mE2YTYutmHINin2YTYp9mG2KzZhNmK2LLZitipXCIsXG4gIGNsZWFyQnV0dG9uOiBcItmF2LPYrVwiLFxuICBhZGRFbGVtZW50OiBcItin2K7YqtixINiz2KTYp9mE2KfZiyDZhNmE2LnYsdi2IC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwi2KfZhNiq2LHYqtmK2Kgg2KfZhNin2YHYqtix2KfYttmKXCIsXG4gIGFzY09yZGVyOiBcItiq2LXYp9i52K/ZiVwiLFxuICBkZXNjT3JkZXI6IFwi2KrZhtin2LLZhNmJXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi2KXYuNmH2KfYsSDYp9mE2KPYudmF2K/YqSDYp9mE2KvYp9mG2YjZitipXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItio2YbZiNivINmI2KrYudmE2YrZgtin2Kog2KPYrtix2YlcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIti52LHYtiDYp9mE2YbYs9ioINin2YTZhdim2YjZitipXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCLYpdiu2YHYp9ihINin2YTZhtiz2KhcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLYqtmG2LLZitmEINio2LXZiti62KkgcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwi2KXYrtmB2KfYoSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwi2KXYuNmH2KfYsSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCLYpdiu2YHYp9ihINin2YTYpdis2KfYqNin2Kog2KfZhNmF2YHZgtmI2K/YqVwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwi2LnYsdi2INin2YTYpdis2KfYqNin2Kog2KfZhNmF2YHZgtmI2K/YqVwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcItij2KzZiNio2Kkg2YXZgdmC2YjYr9ipXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcItmE2YUg2YrYqtmFINin2YTYudix2LYg2KjYudivXCIsXG4gIG5vUmVzdWx0czogXCLZhNinINmK2YjYrNivINmG2KrYp9im2Kwg2YTZhNi52LHYtlwiLFxuICBzaG93UGVyVmFsdWVzOiBcItmE2YPZhCDYp9mE2YLZitmFXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcItmE2YPZhCDYp9mE2KPYudmF2K/YqVwiLFxuICBhbnN3ZXI6IFwi2KXYrNioXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwi2KfZhNin2KzYp9io2Kkg2KfZhNi12K3Zitit2Kk6IFwiLFxuICBwZXJjZW50OiBcItin2YTZhtiz2KjZhyDYp9mE2YXYptmI2YrZh1wiLFxuICByZXNwb25zZXM6IFwi2KfZhNin2LPYqtis2KfYqNin2KpcIixcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcIkFyYWJpY1wiO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBkdXRjaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb2VwIGRvb3IgbWlqXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGVncm9lcGVyZW4gYmlqIG1palwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0ZWVyIG1palwiLFxuICBoaWRlQ29sdW1uOiBcIktvbG9tIHZlcmJlcmdlblwiLFxuICBzaG93Q29sdW1uOiBcIlRvb24ga29sb21cIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiS29sb20gcHJpdsOpIG1ha2VuXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFhayBkZSBrb2xvbSBvcGVuYmFhclwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiR2EgbmFhciBEZXRhaWxcIixcbiAgc2hvd0FzQ29sdW1uOiBcIldlZXJnZXZlbiBhbHMga29sb21cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiWm9la2VuLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiVmVyd2lqZGVyIHJpamVuXCIsXG4gIHNob3dMYWJlbDogXCJUb25lblwiLFxuICBlbnRyaWVzTGFiZWw6IFwiaW56ZW5kaW5nZW5cIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRla3N0ZW4gaW4gdGFiZWxcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkdlc3RhcGVsZGUgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb251dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlRhYXJ0XCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlZlcnN0cm9vaWVuXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNZXRlclwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIktvZ2VsXCIsXG4gIGhpZGVCdXR0b246IFwiVmVyYmVyZ2VuXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1hYWsgcHJpdmVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJPcGVuYmFhciBtYWtlblwiLFxuICBzaG93QnV0dG9uOiBcIlRvbmVuXCIsXG4gIHJlc2V0RmlsdGVyOiBcIkZpbHRlciByZXNldHRlblwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiV2lqemlnIGRlIGxhbmRpbnN0ZWxsaW5nXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkRvb3J6aWNodGlnXCIsXG4gIGFkZEVsZW1lbnQ6IFwiS2llcyBlZW4gdnJhYWcgb20gd2VlciB0ZSBnZXZlbiAuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYWFyZHZvbGdvcmRlXCIsXG4gIGFzY09yZGVyOiBcIk9wbG9wZW5kXCIsXG4gIGRlc2NPcmRlcjogXCJBZmxvcGVuZFwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlRvb24ga2xlaW5lIGtvbG9tbWVuXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFuZGVyZSBpdGVtcyBlbiBvcG1lcmtpbmdlblwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiUGVyY2VudGFnZXMgd2VlcmdldmVuXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJWZXJiZXJnIHBlcmNlbnRhZ2VzXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhbHMgZWVuIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIlZlcmJlcmcgbGVnZSBhbnR3b29yZGVuXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiVG9vbiBsZWdlIGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGxlIGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJUb3AgMTAgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIlRvcCAyMCBhbnR3b29yZGVuXCIsXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwiRHV0Y2hcIjtcbiIsIi8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnlcbi8vIGltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZW5nbGlzaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwIEJ5IE1lXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiVW5ncm91cCBCeSBNZVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0IE1lXCIsXG4gIGhpZGVDb2x1bW46IFwiSGlkZSBjb2x1bW5cIixcbiAgc2hvd0NvbHVtbjogXCJTaG93IGNvbHVtblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJNYWtlIGNvbHVtbiBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlIHRvIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiU2hvdyBhcyBDb2x1bW5cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmVtb3ZlIHJvd3NcIixcbiAgc2hvd0xhYmVsOiBcIlNob3dcIixcbiAgZW50cmllc0xhYmVsOiBcImVudHJpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRzIGluIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiQXZlcmFnZVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFja2VkIEJhclwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiU2NhdHRlclwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCJIaWRlXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1ha2UgcHJpdmF0ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk1ha2UgcHVibGljXCIsXG4gIHNob3dCdXR0b246IFwiU2hvd1wiLFxuICBmaWx0ZXI6IFwiRmlsdGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc2V0IEZpbHRlclwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQ2hhbmdlIExvY2FsZVwiLFxuICBlbjogXCJFbmdsaXNoXCIsXG4gIGZyOiBcIkZyYW7Dp2Fpc1wiLFxuICBydTogXCLQoNGD0YHRgdC60LjQuVwiLFxuICBkZTogXCJEZXV0c2NoXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNsZWFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvb3NlIHF1ZXN0aW9uIHRvIHNob3cuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIkRlZmF1bHQgT3JkZXJcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kaW5nXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kaW5nXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiU2hvdyBtaW5vciBjb2x1bW5zXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk90aGVyIGl0ZW1zIGFuZCBjb21tZW50c1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiU2hvdyBwZXJjZW50YWdlc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiSGlkZSBwZXJjZW50YWdlc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRvd25sb2FkIHBsb3QgYXMgYSBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGwgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIGFuc3dlcnNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJTaG93IG1pc3NpbmcgYW5zd2Vyc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJUaGlzIHF1ZXN0aW9uIHR5cGUgaXMgbm90IHZpc3VhbGl6ZWQgeWV0XCIsXG4gIG5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2x1bW5zXCIsXG4gIGFuc3dlcjogXCJBbnN3ZXJcIixcbiAgY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudFwiLFxuICByZXNwb25zZXM6IFwiUmVzcG9uc2VzXCJcbn07XG5cbi8vIFVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cgaWYgeW91IGNyZWF0ZSBhIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gUmVwbGFjZSBcImVuXCIgd2l0aCBhIGN1c3RvbSBsb2NhbGUgY29kZSAoZm9yIGV4YW1wbGUsIFwiZnJcIiBvciBcImRlXCIpLFxuLy8gUmVwbGFjZSBgZW5nbGlzaFN0cmluZ3NgIHdpdGggdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gbG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuLy8gbG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcIkVuZ2xpc2hcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZmFyc2lTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLar9ix2YjZhyDYqNmG2K/bjCDYqNinXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2K3YsNmBINqv2LHZiNmHXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLYp9mG2KrYrtin2KhcIixcbiAgaGlkZUNvbHVtbjogXCLZhdiu2YHbjCDaqdix2K/ZhiDYs9iq2YjZhlwiLFxuICBzaG93Q29sdW1uOiBcItmG2YXYp9uM2LQg2LPYqtmI2YZcIixcbiAgbW92ZVRvRGV0YWlsOiBcItin2YbYqtmC2KfZhCDYqNmHINis2LLYptuM2KfYqlwiLFxuICBzaG93QXNDb2x1bW46IFwi2YbZhdin24zYtCDYqNmHINi52YbZiNin2YYg2LPYqtmI2YZcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcItmF2KrZiNmGINiv2LEg2KzYr9mI2YRcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi2KfYqNixINqp2YTZhdin2KpcIixcbiAgY2hhcnRUeXBlX2JhcjogXCLZhduM2YTZhyDYp9uMXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwi2K/Yp9io2LHZhyDYp9uMKHBpZSlcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwi2b7Ysdin2qnZhtiv2q/bjChTY2F0dGVyKVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwi2LnZgtix2KjZhyDYp9uMXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2YXYrtmB24xcIixcbiAgcmVzZXRGaWx0ZXI6IFwi2KjYp9iy2YbYtNin2YbbjCDZgduM2YTYqtix2YfYp1wiLFxuICBjbGVhckJ1dHRvbjogXCLZvtin2qkg2qnYsdiv2YZcIixcbiAgYWRkRWxlbWVudDogXCLYp9mG2KrYrtin2Kgg2LPZiNin2YQg2KjYsdin24wg2YbZhdin24zYtC4uLlwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImZhXCJdID0gZmFyc2lTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmFcIl0gPSBcIkZhcnNpKFBlcnNpYW4pXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwZXJcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEaXNzb2NpZXJcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlPDqWxlY3Rpb25uZXJcIixcbiAgaGlkZUNvbHVtbjogXCJNYXNxdWVyIGNvbG9ubmVcIixcbiAgc2hvd0NvbHVtbjogXCJBZmZpY2hlciBjb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHByaXbDqVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHB1YmxpY1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwiRMOpcGxhY2VyIHZlcnMgZMOpdGFpbHNcIixcbiAgc2hvd0FzQ29sdW1uOiBcIkFmZmljaGVyIGVuIGNvbG9ubmVcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiUmVjaGVyY2hlci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlN1cHByaW1lciBjb2xvbm5lXCIsXG4gIHNob3dMYWJlbDogXCJBZmZpY2hlclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50csOpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRlcyBlbiB0YWJsZVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdWFnZXMgZGUgbW90c1wiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJlc1wiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJCYXJyZXMgZW1waWzDqWVzXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJBbm5lYXVcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJTZWN0ZXVyc1wiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJOdWFnZXMgZGUgcG9pbnRzXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxlc1wiLFxuICBmaWx0ZXI6IFwiRmlsdHJlXCIsXG4gIGhpZGVCdXR0b246IFwiTWFzcXVlclwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIlNhdXZlciBlbiBwbmdcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZHJlIHByaXbDqVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRyZSBwdWJsaXF1ZVwiLFxuICBzaG93QnV0dG9uOiBcIkFmZmljaGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJhZnJhaWNoaXIgRmlsdHJlc1wiLFxuICBjbGVhckJ1dHRvbjogXCJSYWZyYWljaGlyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvaXNpciBsYSBxdWVzdGlvbiDDoCBhZmZpY2hlci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXV0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGFudFwiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGFudFwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIkFmZmljaGVyIGxlcyBjb2xvbm5lcyBtaW5ldXJlc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBdXRyZSDDqWzDqW1lbnQgZXQgY29tbWVudGFpcmVzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkNlIHR5cGUgZGUgcXVlc3Rpb24gbidlc3QgcGFzIGVuY29yZSB2aXN1YWxpc8OpXCIsXG4gIG5vUmVzdWx0czogXCJJbCBuJ3kgYSBwYXMgZW5jb3JlIGRlIHLDqXN1bHRhdHNcIixcbiAgc2hvd1BlclZhbHVlczogXCJQYXIgdmFsZXVyXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBhciBjb2xvbm5lXCIsXG4gIGFuc3dlcjogXCJSw6lwb25zZVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlLDqXBvbnNlIGNvcnJlY3RlOiBcIixcbiAgcGVyY2VudDogXCJQb3VyY2VudGFnZVwiLFxuICByZXNwb25zZXM6IFwiUsOpcG9uc2VzXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZnJcIl0gPSBmcmVuY2hTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZnJcIl0gPSBcIkZyZW5jaFwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiUmFnZ3J1cHBhXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGl2aWRpXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlemlvbmFtaVwiLFxuICBoaWRlQ29sdW1uOiBcIk5hc2NvbmRpIGNvbG9ubmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmEgY29sb25uYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHByaXZhdGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHB1YmJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJTcG9zdGEgaW4gRGV0dGFnbGlvXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmEgY29tZSBDb2xvbm5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIkNlcmNhLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmltdW92aSByaWdoZVwiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhXCIsXG4gIGVudHJpZXNMYWJlbDogXCJ2b2NpXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJQYXJvbGUgaW4gdGFiZWxsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdXZvbGEgZGkgcGFyb2xlXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIklzdG9ncmFtbWFcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiTWVkaWFcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyYWZpY29cIixcbiAgY2hhcnRUeXBlX2JhcjogXCJHcmFmaWNvIGEgYmFycmVcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHZlcnRpY2FsaVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJHcmFmaWNvIGEgYmFycmUgc292cmFwcG9zdGVcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkdyYWZpY28gYSBjaWFtYmVsbGFcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJHcmFmaWNvIGEgdG9ydGFcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiR3JhZmljbyBhIGRpc3BlcnNpb25lXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHcmFmaWNvIEdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiUHVudG9cIixcbiAgaGlkZUJ1dHRvbjogXCJOYXNjb25kaVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJSZW5kaSBwcml2YXRvXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiUmVuZGkgcHViYmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFcIixcbiAgZmlsdGVyOiBcIkZpbHRyb1wiLFxuICByZXNldEZpbHRlcjogXCJDYW5jZWxsYSBmaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIkNhbWJpYSBsaW5ndWFcIixcbiAgZW46IFwiSW5nbGVzZVwiLFxuICBmcjogXCJGcmFuY2VzZVwiLFxuICBydTogXCJSdXNzb1wiLFxuICBkZTogXCJUZWRlc2NvXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNhbmNlbGxhXCIsXG4gIGFkZEVsZW1lbnQ6IFwiU2NlZ2xpIGxhIGRvbWFuZGEgZGEgbW9zdHJhcmUuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIk9yZGluZSBkaSBEZWZhdWx0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRpc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhIGNvbG9ubmUgc2Vjb25kYXJpZVwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbHRyaSBwdW50aSBlIGNvbW1lbnRpXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJNb3N0cmEgcGVyY2VudHVhbGlcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIk5hc2NvbmRpIHBlcmNlbnR1YWxpXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2NhcmljYSBpbCBncmFmaWNvIGluIGZvcm1hdG8gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiTmFzY29uZGkgcmlzcG9zdGUgdnVvdGVcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJNb3N0cmEgcmlzcG9zdGUgdnVvdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUdXR0ZSBsZSByaXNwb3N0ZVwiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJUb3AgMTAgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgcmlzcG9zdGVcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk5hc2NvbmRpIGxlIHJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJNb3N0cmEgbGUgcmlzcG9zdGUgbWFuY2FudGlcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJSaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJRdWVzdG8gdGlwbyBkaSBkb21hbmRhIG5vbiDDqCBhbmNvcmEgc3RhdG8gdmlzdWFsaXp6YXRvXCIsXG4gIG5vUmVzdWx0czogXCJOb24gY2kgc29ubyBhbmNvcmEgcmlzdWx0YXRpXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUGVyIFZhbG9yaVwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQZXIgQ29sb25uZVwiLFxuICBhbnN3ZXI6IFwiUmlzcG9zdGFcIixcbiAgcGVyY2VudDogXCJQZXJjZW50dWFsZVwiLFxuICByZXNwb25zZXM6IFwiUmlzcG9zdGVcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaXRcIl0gPSBcIkl0YWxpYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgbm9yd2VnaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3J1cHBlclwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIk9wcGhldiBncnVwcGVyaW5nXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJWZWxnXCIsXG4gIGhpZGVDb2x1bW46IFwiU2tqdWwga29sb25uZVwiLFxuICBzaG93Q29sdW1uOiBcIlZpcyBrb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIkdqw7hyIGtvbG9ubmUgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiR2rDuHIga29sb25uZSBvZmZlbnRsaWdcIixcbiAgbW92ZVRvRGV0YWlsOiBcIkZseXR0IHRpbCBkZXRhbGplcnQgdmlzbmluZ1wiLFxuICBzaG93QXNDb2x1bW46IFwiVmlzIHNvbSBrb2xvbm5lXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlPDuGsuLi5cIixcbiAgcmVtb3ZlUm93czogXCJGamVybiByYWRlclwiLFxuICBzaG93TGFiZWw6IFwiVmlzXCIsXG4gIGVudHJpZXNMYWJlbDogXCJvcHBmw7hyaW5nZXJcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRhYmVsbHZpc25pbmdcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiT3Jkc2t5XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiU3RvbHBlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFibGV0IHN0b2xwZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkhqdWxkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiU2VrdG9yZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk3DpWxlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkt1bGVkaWFncmFtXCIsXG4gIGhpZGVCdXR0b246IFwiU2tqdWxcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiR2rDuHIgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiR2rDuHIgb2ZmZW50bGlnXCIsXG4gIHNob3dCdXR0b246IFwiVmlzXCIsXG4gIHJlc2V0RmlsdGVyOiBcIk51bGxzdGlsbCBmaWx0ZXJcIixcbiAgY2hhbmdlTG9jYWxlOiBcIkJ5dHQgc3Byw6VrXCIsXG4gIGNsZWFyQnV0dG9uOiBcIlTDuG1cIixcbiAgYWRkRWxlbWVudDogXCJWZWxnIHNww7hyc23DpWwuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkXCIsXG4gIGFzY09yZGVyOiBcIlN0aWdlbmRlXCIsXG4gIGRlc2NPcmRlcjogXCJTeW5rZW5kZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlZpcyBtaW5kcmUga29sb25uZXJcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5uZXQgb2cga29tbWVudGFyZXJcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlZpcyBwcm9zZW50ZXJcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlNranVsIHByb3NlbnRlclwiLFxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJub1wiXSA9IG5vcndlZ2lhblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJub1wiXSA9IFwiTm9yd2VnaWFuXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJBZ3J1cGFyIFBvciBNaW1cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZXNhZ3J1cGFyIFBvciBNaW1cIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjaW9uYXJcIixcbiAgaGlkZUNvbHVtbjogXCJFc2NvbmRlciBjb2x1bmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmFyIGNvbHVuYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJUb3JuYXIgY29sdW5hIHByaXZhZGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJUb3JuYXIgY29sdW5hIHDDumJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlciBwYXJhIERldGFsaGVzXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmFyIGNvbW8gQ29sdW5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlBlc3F1aXNhci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJlbW92ZXIgbGluaGFzXCIsXG4gIHNob3dMYWJlbDogXCJNb3N0cmFyXCIsXG4gIGVudHJpZXNMYWJlbDogXCJlbnRyYWRhc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dG9zIGVtIHRhYmVsYVwiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJhXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJhIEVtcGlsaGFkYVwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiUm9zcXVpbmhhXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiVG9ydGFcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiTGFzdHJvXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJFc2NhbGFcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCYWxhXCIsXG4gIGhpZGVCdXR0b246IFwiRXNjb25kZXJcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiVG9ybmFyIHByaXZhZG9cIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJUb3JuYXIgcMO6YmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFyXCIsXG4gIGZpbHRlcjogXCJGaWx0cmFyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc3RhdXJhciBGaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIk11ZGFyIExvY2FsaXphw6fDo29cIixcbiAgY2xlYXJCdXR0b246IFwiTGltcGFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiRXNjb2xoZXIgcXVlc3TDo28gcGFyYSBtb3N0cmFyLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJPcmRlbmHDp8OjbyBQYWRyw6NvXCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhciBjb2x1bmFzIG1lbm9yZXNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiT3V0cm9zIGl0ZW5zIGUgY29tZW50w6FyaW9zXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJNb3N0cmFyIHBlcmNlbnR1YWlzXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJFc2NvbmRlciBwZXJjZW50dWFpc1wiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkJhaXhhciBwbG90IGNvbW8gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiRXNjb25kZXIgcGVyZ3VudGFzIHZhemlhc1wiLFxuICBzaG93RW1wdHlBbnN3ZXJzOiBcIk1vc3RyYXIgcGVyZ3VudGFzIHZhemlhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIlRvZGFzIGFzIHJlc3Bvc3Rhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiUHJpbWVpcmFzIDUgcmVzcG9zdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiUHJpbWVpcmFzIDEwIHJlc3Bvc3Rhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIlByaW1laXJhcyAyMCByZXNwb3N0YXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRXN0ZSB0aXBvIGRlIHBlcmd1bnRhIGFpbmRhIG7Do28gZm9pIHZpc3VhbGl6YWRhXCIsXG4gIG5vUmVzdWx0czogXCJBaW5kYSBuw6NvIHBvc3N1aSByZXN1bHRhZG9zXCJcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwdFwiXSA9IHBvcnR1Z3Vlc2VTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicHRcIl0gPSBcIlBvcnR1Z3Vlc2VcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgcnVzc2lhblN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwIEJ5IE1lXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiVW5ncm91cCBCeSBNZVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0IE1lXCIsXG4gIGhpZGVDb2x1bW46IFwiSGlkZSBjb2x1bW5cIixcbiAgc2hvd0NvbHVtbjogXCJTaG93IGNvbHVtblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJNYWtlIGNvbHVtbiBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlIHRvIERldGFpbFwiLFxuICBmaWx0ZXI6IFwi0KTQuNC70YzRgtGAXCIsXG4gIHNob3dBc0NvbHVtbjogXCJTaG93IGFzIENvbHVtblwiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dHMgaW4gdGFibGVcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIlN0YWNrZWQgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcItCh0LrRgNGL0YLRjFwiLFxuICBzaG93QnV0dG9uOiBcItCf0L7QutCw0LfQsNGC0YxcIixcbiAgcmVzZXRGaWx0ZXI6IFwi0J7Rh9C40YHRgtC40YLRjCDRhNC40LvRjNGC0YBcIixcbiAgY2hhbmdlTG9jYWxlOiBcItCh0LzQtdC90LjRgtGMINGP0LfRi9C6XCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNsZWFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvb3NlIHF1ZXN0aW9uIHRvIHNob3cuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIkRlZmF1bHRcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kaW5nXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kaW5nXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiU2hvdyBtaW5vciBjb2x1bW5zXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItCU0YDRg9Cz0L7QtSDQuCDQutC+0LzQvNC10L3RgtCw0YDQuNC4XCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcItCt0YLQvtGCINGC0LjQvyDQstC+0L/RgNC+0YHQsCDQtdGJ0LUg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPINCw0L3QsNC70LjRgtC40LrQvtC5XCIsXG4gIG5vUmVzdWx0czogXCLQoNC10LfRg9C70YzRgtCw0YLRiyDQvtGC0YHRg9GC0YHRgtCy0YPRjtGCXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wicnVcIl0gPSBydXNzaWFuU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJ1XCJdID0gXCJSdXNzaWFuXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIHNwYW5pc2hTdHJpbmdzID0ge1xuICBcInVuZ3JvdXBCdXR0b25cIjogXCJEZXNhZ3J1cGFyIHBvciBtw61cIixcbiAgXCJzZWxlY3RCdXR0b25cIjogXCJTZWxlY2Npb25hcm1lXCIsXG4gIFwiaGlkZUNvbHVtblwiOiBcIk9jdWx0YXIgY29sdW1uYVwiLFxuICBcInNob3dDb2x1bW5cIjogXCJNb3N0cmFyIGNvbHVtbmFcIixcbiAgXCJtYWtlUHJpdmF0ZUNvbHVtblwiOiBcIkhhY2VyIHF1ZSBsYSBjb2x1bW5hIHNlYSBwcml2YWRhXCIsXG4gIFwibWFrZVB1YmxpY0NvbHVtblwiOiBcIkhhY2VyIHDDumJsaWNhIGxhIGNvbHVtbmFcIixcbiAgXCJtb3ZlVG9EZXRhaWxcIjogXCJNb3ZlciBhbCBkZXRhbGxlXCIsXG4gIFwic2hvd0FzQ29sdW1uXCI6IFwiTW9zdHJhciBjb21vIGNvbHVtbmFcIixcbiAgXCJmaWx0ZXJQbGFjZWhvbGRlclwiOiBcIkJ1c2NhciAuLi5cIixcbiAgXCJyZW1vdmVSb3dzXCI6IFwiRWxpbWluYXIgZmlsYXNcIixcbiAgXCJzaG93TGFiZWxcIjogXCJNb3N0cmFyXCIsXG4gIFwiZW50cnlMYWJlbFwiOiBcImVudHJhZGFzXCIsXG4gIFwidmlzdWFsaXplcl90ZXh0XCI6IFwiVGV4dG9zIGVuIHRhYmxhXCIsXG4gIFwidmlzdWFsaXplcl93b3JkY2xvdWRcIjogXCJXb3JkY2xvdWRcIixcbiAgXCJjaGFydFR5cGVfYmFyXCI6IFwiQmFyXCIsXG4gIFwiY2hhcnRUeXBlX3N0YWNrZWRiYXJcIjogXCJCYXJyYSBhcGlsYWRhXCIsXG4gIFwiY2hhcnRUeXBlX2RvdWdobnV0XCI6IFwiRG9udXRcIixcbiAgXCJjaGFydFR5cGVfcGllXCI6IFwiUGllXCIsXG4gIFwiY2hhcnRUeXBlX3NjYXR0ZXJcIjogXCJEaXNwZXJzacOzblwiLFxuICBcImNoYXJ0VHlwZV9nYXVnZVwiOiBcIkdhdWdlXCIsXG4gIFwiY2hhcnRUeXBlX2J1bGxldFwiOiBcIkJ1bGxldFwiLFxuICBcImhpZGVCdXR0b25cIjogXCJPY3VsdGFyXCIsXG4gIFwibWFrZVByaXZhdGVCdXR0b25cIjogXCJIYWNlciBwcml2YWRvXCIsXG4gIFwibWFrZVB1YmxpY0J1dHRvblwiOiBcIkhhY2VyIHDDumJsaWNvXCIsXG4gIFwic2hvd0J1dHRvblwiOiBcIk1vc3RyYXJcIixcbiAgXCJmaWx0ZXJcIjogXCJGaWx0cm9cIixcbiAgXCJyZXNldEZpbHRlclwiOiBcIlJlc3RhYmxlY2VyIGZpbHRyb1wiLFxuICBcImNoYW5nZUxvY2FsZVwiOiBcIkNhbWJpYXIgY29uZmlndXJhY2nDs24gcmVnaW9uYWxcIixcbiAgXCJjbGVhckJ1dHRvblwiOiBcIkJvcnJhclwiLFxuICBcImFkZEVsZW1lbnRcIjogXCJFbGlqYSBsYSBwcmVndW50YSBwYXJhIG1vc3RyYXIgLi4uXCIsXG4gIFwiZGVmYXVsdE9yZGVyXCI6IFwiT3JkZW4gcHJlZGV0ZXJtaW5hZG9cIixcbiAgXCJhc2NPcmRlclwiOiBcIkFzY2VuZGVudGVcIixcbiAgXCJkZXNjT3JkZXJcIjogXCJEZXNjZW5kZW50ZVwiLFxuICBcInNob3dNaW5vckNvbHVtbnNcIjogXCJNb3N0cmFyIGNvbHVtbmFzIHNlY3VuZGFyaWFzXCIsXG4gIFwib3RoZXJDb21tZW50VGl0bGVcIjogXCJPdHJvcyBlbGVtZW50b3MgeSBjb21lbnRhcmlvc1wiLFxuICBcInNob3dQZXJjZW50YWdlc1wiOiBcIk1vc3RyYXIgcG9yY2VudGFqZXNcIixcbiAgXCJoaWRlUGVyY2VudGFnZXNcIjogXCJPY3VsdGFyIHBvcmNlbnRhamVzXCIsXG4gIFwicGRmRG93bmxvYWRDYXB0aW9uXCI6IFwiUERGXCIsXG4gIFwieGxzeERvd25sb2FkQ2FwdGlvblwiOiBcIkV4Y2VsXCIsXG4gIFwiY3N2RG93bmxvYWRDYXB0aW9uXCI6IFwiQ1NWXCIsXG4gIFwic2F2ZURpYWdyYW1Bc1BOR1wiOiBcIkRlc2NhcmdhciBlbCBncsOhZmljbyBjb21vIHBuZ1wiLFxuICBcImhpZGVFbXB0eUFuc3dlcnNcIjogXCJPY3VsdGFyIHJlc3B1ZXN0YXMgdmFjw61hc1wiLFxuICBcInNob3dFbXB0eUFuc3dlcnNcIjogXCJNb3N0cmFyIHJlc3B1ZXN0YXMgdmFjw61hc1wiLFxuICBcInRvcE5WYWx1ZVRleHQtMVwiOiBcIlRvZGFzIGxhcyByZXNwdWVzdGFzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDVcIjogXCJMYXMgNSByZXNwdWVzdGFzIHByaW5jaXBhbGVzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDEwXCI6IFwiTGFzIDEwIHJlc3B1ZXN0YXMgcHJpbmNpcGFsZXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCIyMCByZXNwdWVzdGFzIHByaW5jaXBhbGVzXCIsXG4gIFwibm9WaXN1YWxpemVyRm9yUXVlc3Rpb25cIjogXCJFc3RlIHRpcG8gZGUgcHJlZ3VudGEgYcO6biBubyBzZSB2aXN1YWxpemFcIixcbiAgXCJub1Jlc3VsdHNcIjogXCJBw7puIG5vIGhheSByZXN1bHRhZG9zXCJcbn07XG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImVzXCJdID0gc3BhbmlzaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlc1wiXSA9IFwiU3BhbmlzaFwiO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5Nb2RlbCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW107XG4gIHB1YmxpYyBjaGFydFR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJib29sZWFuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gdGhpcy5ib29sZWFuUXVlc3Rpb24uY29ycmVjdEFuc3dlcjtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgISFjb3JyZWN0QW5zd2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlID09PSBjb3JyZWN0QW5zd2VyVmFsdWUgfHwgIWNvcnJlY3RBbnN3ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsRmFsc2UudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RBbnN3ZXJWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYm9vbGVhblF1ZXN0aW9uKCkge1xuICAgIHJldHVybiA8UXVlc3Rpb25Cb29sZWFuTW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdHJ1ZUNvbG9yID0gXCJcIjtcbiAgcHVibGljIHN0YXRpYyBmYWxzZUNvbG9yID0gXCJcIjtcblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUodmFsdWVzW2xhYmVscy5pbmRleE9mKGl0ZW1UZXh0KV0sIGl0ZW1UZXh0KTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZVxuICAgICAgICA6IHRydWUsXG4gICAgICB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlXG4gICAgICAgIDogZmFsc2UsXG4gICAgXTtcbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGxhYmVscyA9IFtdLmNvbmNhdCh0aGlzLmdldFZhbHVlcygpKTtcbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxUcnVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxhYmVsc1swXSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib29sZWFuUXVlc3Rpb24ubGFiZWxGYWxzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbHNbMV0gPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzWzJdID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIik7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vY2hvaWNlcy10YWJsZS5zY3NzXCIpO1xuXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1RhYmxlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IENob2ljZXNUYWJsZSkge31cblxuICBwdWJsaWMgY3JlYXRlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gdGhpcy5tb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDE7XG5cbiAgICBjb25zdCBlbXB0eVRleHROb2RlID0gPEhUTUxFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIFwiXCIsIHtcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcbiAgICB9KTtcblxuICAgIGlmIChkYXRhc2V0cy5sZW5ndGggPT09IDAgfHwgZGF0YXNldHNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXG4gICAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLWNob2ljZXMtdGFibGVcIilcbiAgICAgICk7XG5cbiAgICAgIHRhYmxlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuXG4gICAgICB2YXIgaGVhZGVyUm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgdmFyIGxhYmVsQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwtaGVhZGVyXCIsIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhbnN3ZXJcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgdmFyIHNwYXJrbGluZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBcIlwiLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoc3BhcmtsaW5lQ2VsbCk7XG4gICAgICB2YXIgcGVyY2VudENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGVyY2VudFwiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHBlcmNlbnRDZWxsKTtcbiAgICAgIHZhciB2YWx1ZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzcG9uc2VzXCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodmFsdWVDZWxsKTtcbiAgICAgIHRhYmxlTm9kZS5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xuXG4gICAgICBkYXRhLmZvckVhY2goKHJvd0RhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICAgIHZhciBsYWJlbENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogbGFiZWxzW2luZGV4XSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChsYWJlbENlbGwpO1xuICAgICAgICB2YXIgc3BhcmtsaW5lQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGxcIik7XG4gICAgICAgIHZhciBvdXRlckJhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jaG9pY2VzLXNwYXJrbGluZVwiKTtcbiAgICAgICAgdmFyIGlubmVyQmFyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLWNob2ljZXMtc3BhcmtsaW5lLXZhbHVlXCIpO1xuICAgICAgICBpbm5lckJhci5zdHlsZS53aWR0aCA9IHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCI7XG4gICAgICAgIG91dGVyQmFyLmFwcGVuZENoaWxkKGlubmVyQmFyKTtcbiAgICAgICAgc3BhcmtsaW5lQ2VsbC5hcHBlbmRDaGlsZChvdXRlckJhcik7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChzcGFya2xpbmVDZWxsKTtcbiAgICAgICAgdmFyIHBlcmNlbnRDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogXCJcIiArIHRleHRzW2lkeF1baW5kZXhdICsgXCIlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQocGVyY2VudENlbGwpO1xuICAgICAgICB2YXIgdmFsdWVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbCBzYS1jaG9pY2VzLXRhYmxlX19jZWxsLXZhbHVlXCIsIHtcbiAgICAgICAgICB0ZXh0Q29udGVudDogcm93RGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh2YWx1ZUNlbGwpO1xuICAgICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS1jaG9pY2VzLXRhYmxlX19jb250YWluZXJcIjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBub2RlLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENob2ljZXNUYWJsZSBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcml2YXRlIF9jaG9pY2VzVGFibGVBZGFwdGVyOiBDaG9pY2VzVGFibGVBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImNob2ljZXNcIik7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlciA9IG5ldyBDaG9pY2VzVGFibGVBZGFwdGVyKHRoaXMpO1xuICAgIHRoaXMuYW5zd2Vyc09yZGVyID0gXCJhc2NcIjtcbiAgICB0aGlzLnNob3dQZXJjZW50YWdlcyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveShjb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hvaWNlc1RhYmxlQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYWRpb2dyb3VwXCIsIENob2ljZXNUYWJsZSk7XG4vLyBWaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBDaG9pY2VzVGFibGUpO1xuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY2hlY2tib3hcIiwgQ2hvaWNlc1RhYmxlKTtcbiIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcblxyXG4vKipcclxuICogRGVzY3JpYmVzIGRhdGEgaW5mbzpcclxuICogZGF0YU5hbWUgLSBxdWVzdGlvbiBuYW1lLCB1c2VkIGFzIGEga2V5IHRvIG9idGFpbiBxdWVzdGlvbiBkYXRhXHJcbiAqIGdldFZhbHVlcyAtIGZ1bmN0aW9uIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgcG9zc2libGUgdmFsdWVzXHJcbiAqIGdldExhYmVscyAtIGZ1bmN0aW9uIHJldHVybmluZyBhbiBhcnJheSBvZiBodW1hbi1mcmllbmRseSBkZXNjcmlwdGlvbnMgZm9yIHZhbHVlc1xyXG4gKiBnZXRTZXJpZXNWYWx1ZXMgLSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIHBvc3NpYmxlIHNlcmllcyB2YWx1ZXNcclxuICogZ2V0U2VyaWVzTGFiZWxzIC0gZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGh1bWFuLWZyaWVuZGx5IGRlc2NyaXB0aW9ucyBmb3Igc2VyaWVzIHZhbHVlc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJRGF0YUluZm8ge1xyXG4gIGRhdGFOYW1lOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+O1xyXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFNlcmllc1ZhbHVlcygpOiBBcnJheTxzdHJpbmc+O1xyXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0YVByb3ZpZGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHNlcmllc01hcmtlcktleSA9IFwiX19zYV9zZXJpZXNfbmFtZVwiO1xyXG5cclxuICBwcml2YXRlIF9maWx0ZXJlZERhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT47XHJcbiAgcHJpdmF0ZSBfc3RhdGlzdGljc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gfCBBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4gfTtcclxuICBwcm90ZWN0ZWQgZmlsdGVyVmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0aXN0aWNzQ2FjaGVLZXkoZGF0YUluZm86IElEYXRhSW5mbyk6IHN0cmluZyB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhSW5mby5kYXRhTmFtZSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGFJbmZvLmRhdGFOYW1lLmpvaW4oXCItXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFJbmZvLmRhdGFOYW1lO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0YTogQXJyYXk8YW55PiA9IFtdLCBwcml2YXRlIF9nZXREYXRhQ29yZTogKGRhdGFJbmZvOiBJRGF0YUluZm8pID0+IG51bWJlcltdW10gPSB1bmRlZmluZWQpIHsgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoZGF0YUluZm8/OiBJRGF0YUluZm8pIHtcclxuICAgIGlmKCEhZGF0YUluZm8pIHtcclxuICAgICAgaWYodGhpcy5fc3RhdGlzdGljc0NhY2hlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSAhPT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSAhPT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMucmFpc2VEYXRhQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICB0aGlzLl9kYXRhID0gW10uY29uY2F0KGRhdGEpO1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmaWx0ZXJlZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyZWREYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGZpbHRlcktleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlcyk7XHJcbiAgICAgIGlmIChmaWx0ZXJLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB0aGlzLmRhdGEuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gIU9iamVjdC5rZXlzKHRoaXMuZmlsdGVyVmFsdWVzKS5zb21lKFxyXG4gICAgICAgICAgICAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVHlwZSA9IHR5cGVvZiBmaWx0ZXJWYWx1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvblZhbHVlID0gaXRlbVtrZXldO1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXN0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcXVlc3Rpb25WYWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSA9PSAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWVUeXBlICE9PSBcIm9iamVjdFwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhcXVlc3Rpb25Db250YWluc1ZhbHVlKHF1ZXN0aW9uVmFsdWUsIGZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzVmFsdWUgPSBpdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldO1xyXG4gICAgICAgICAgICAgIGlmICghIXNlcmllc1ZhbHVlICYmIGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uVmFsdWUgIT09IGZpbHRlclZhbHVlW3Nlcmllc1ZhbHVlXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIiAmJiBmaWx0ZXJWYWx1ZS5zdGFydCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlclZhbHVlLmVuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGluaW9pdXNWYWx1ZSA9IHR5cGVvZiBxdWVzdGlvblZhbHVlID09PSBcIm51bWJlclwiID8gcXVlc3Rpb25WYWx1ZSA6IERhdGUucGFyc2UocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29udGluaW9pdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGluaW9pdXNWYWx1ZSA9IHBhcnNlRmxvYXQocXVlc3Rpb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc05hTihjb250aW5pb2l1c1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGluaW9pdXNWYWx1ZSA8IGZpbHRlclZhbHVlLnN0YXJ0IHx8IGNvbnRpbmlvaXVzVmFsdWUgPj0gZmlsdGVyVmFsdWUuZW5kO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gaXRlbVtrZXldICE9PSB0aGlzLmZpbHRlclZhbHVlc1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgZmlsdGVyIGJ5IHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcsIHNlbGVjdGVkVmFsdWU6IGFueSkge1xyXG4gICAgdmFyIGZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJWYWx1ZXNbcXVlc3Rpb25OYW1lXTtcclxuICAgIH1cclxuICAgIGlmIChmaWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXREYXRhQ29yZShkYXRhSW5mbzogSURhdGFJbmZvKSB7XHJcbiAgICBpZiAoISF0aGlzLl9nZXREYXRhQ29yZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YUNvcmUoZGF0YUluZm8pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFOYW1lcyA9IEFycmF5LmlzQXJyYXkoZGF0YUluZm8uZGF0YU5hbWUpID8gZGF0YUluZm8uZGF0YU5hbWUgOiBbZGF0YUluZm8uZGF0YU5hbWVdO1xyXG4gICAgY29uc3Qgc3RhdGlzdGljczogQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+ID0gW107XHJcblxyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YUluZm8uZ2V0VmFsdWVzKCk7XHJcbiAgICBjb25zdCB2YWx1ZXNJbmRleDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdmFsdWVzSW5kZXhbdmFsXSA9IGluZGV4O1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMgPSB2YWx1ZXMuaW5kZXhPZih1bmRlZmluZWQpICE9PSAtMTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXMgPSBkYXRhSW5mby5nZXRTZXJpZXNWYWx1ZXMoKTtcclxuICAgIGNvbnN0IHNlcmllc0luZGV4OiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIHNlcmllcy5mb3JFYWNoKCh2YWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBzZXJpZXNJbmRleFt2YWxdID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZXJpZXNMZW5ndGggPSBzZXJpZXMubGVuZ3RoIHx8IDE7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFOYW1lcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBkYXRhTmFtZVN0YXRpc3RpY3MgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPj4oKTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXJpZXNMZW5ndGg7ICsraikge1xyXG4gICAgICAgIGRhdGFOYW1lU3RhdGlzdGljcy5wdXNoKG5ldyBBcnJheTxudW1iZXI+KHZhbHVlcy5sZW5ndGgpLmZpbGwoMCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHN0YXRpc3RpY3MucHVzaChkYXRhTmFtZVN0YXRpc3RpY3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgIGRhdGFOYW1lcy5mb3JFYWNoKChkYXRhTmFtZSwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByb3dWYWx1ZTogYW55ID0gcm93W2RhdGFOYW1lXTtcclxuICAgICAgICBpZiAocm93VmFsdWUgIT09IHVuZGVmaW5lZCB8fCBwcm9jZXNzTWlzc2luZ0Fuc3dlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IHJvd1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkocm93VmFsdWUpID8gcm93VmFsdWUgOiBbcm93VmFsdWVdO1xyXG4gICAgICAgICAgaWYgKHNlcmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgbGFiZWxsZWQgYnkgc2VyaWVzTWFya2VyS2V5IGluIHJvdyBkYXRhXHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzSW5kZXhbcm93W0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldXSB8fCAwO1xyXG4gICAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxdXSsrO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFNlcmllcyBhcmUgdGhlIGtleXMgaW4gcXVlc3Rpb24gdmFsdWUgKG1hdHJpeCBxdWVzdGlvbilcclxuICAgICAgICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCB0aGUgZGUtbm9ybWFsaXphdGlvbiBhbmQgY29tYmluZSB3aXRoIHRoZSBwcmV2aW91cyBjYXNlXHJcbiAgICAgICAgICAgICAgcm93VmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmZvckVhY2goKHNlcmllc05hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHZhbFtzZXJpZXNOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzTm8gPSBzZXJpZXNJbmRleFtzZXJpZXNOYW1lXSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NbaW5kZXhdW3Nlcmllc05vXVt2YWx1ZXNJbmRleFt2YWxbc2VyaWVzTmFtZV1dXSsrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTm8gc2VyaWVzXHJcbiAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHN0YXRpc3RpY3NbMF1bMF1bdmFsdWVzSW5kZXhbdmFsXV0rKyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGFJbmZvLmRhdGFOYW1lKSA/IHN0YXRpc3RpY3MgOiBzdGF0aXN0aWNzWzBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBjYWxjdWxhdGVkIHN0YXRpc2N0aWNzIGZvciB0aGUgSURhdGFJbmZvIG9iamVjdC5cclxuICAgKi9cclxuICBnZXREYXRhKGRhdGFJbmZvOiBJRGF0YUluZm8pIHtcclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRTdGF0aXN0aWNzQ2FjaGVLZXkoZGF0YUluZm8pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldID09PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0NhY2hlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldID0gdGhpcy5nZXREYXRhQ29yZShkYXRhSW5mbyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW10uY29uY2F0KHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiBkYXRhIGhhcyBiZWVuIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uRGF0YUNoYW5nZWQgPSBuZXcgRXZlbnQ8XHJcbiAgICAoc2VuZGVyOiBEYXRhUHJvdmlkZXIsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxyXG4gICAgRGF0YVByb3ZpZGVyLFxyXG4gICAgYW55XHJcbiAgPigpO1xyXG5cclxuICBwcm90ZWN0ZWQgcmFpc2VEYXRhQ2hhbmdlZCgpIHtcclxuICAgIGlmICghdGhpcy5vbkRhdGFDaGFuZ2VkLmlzRW1wdHkpIHtcclxuICAgICAgdGhpcy5vbkRhdGFDaGFuZ2VkLmZpcmUodGhpcywge30pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25Db250YWluc1ZhbHVlKHF1ZXN0aW9uVmFsdWU6IGFueSwgZmlsdGVyVmFsdWU6IGFueSkge1xyXG4gIGNvbnN0IHF1ZXN0aW9uVmFsdWVLZXlzID0gT2JqZWN0LmtleXMocXVlc3Rpb25WYWx1ZSk7XHJcbiAgY29uc3QgZmlsdGVyVmFsdWVLZXlzID0gT2JqZWN0LmtleXMoZmlsdGVyVmFsdWUpO1xyXG5cclxuICBpZiAoZmlsdGVyVmFsdWVLZXlzLmxlbmd0aCA+IHF1ZXN0aW9uVmFsdWVLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBmb3IgKHZhciBrZXkgb2YgZmlsdGVyVmFsdWVLZXlzKSB7XHJcbiAgICBpZiAoZmlsdGVyVmFsdWVba2V5XSAhPSBxdWVzdGlvblZhbHVlW2tleV0pIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG4vL2xvY2FsaXphdGlvblxuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9mYXJzaVwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vcnVzc2lhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9zcGFuaXNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2l0YWxpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9kYXRhUHJvdmlkZXJcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL251bWJlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3NlbGVjdEJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9tYXRyaXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9ib29sZWFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vaGlzdG9ncmFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWF0cml4RHluYW1pY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYXRyaXhEcm9wZG93blwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9wbG90bHkvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi93b3JkY2xvdWQvd29yZGNsb3VkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vd29yZGNsb3VkL3N0b3B3b3Jkcy9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9jaG9pY2VzLXRhYmxlXCI7XG5cbmV4cG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4XCI7XG4iLCJpbXBvcnQgeyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XHJcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbHRlckluZm8ge1xyXG4gIHByaXZhdGUgX2h0bWxFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHRleHQ6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWxpemVyOiBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24pIHtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PihcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLXF1ZXN0aW9uX19maWx0ZXJcIilcclxuICAgICk7XHJcbiAgICB0aGlzLnRleHQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxyXG4gICAgICBcInNwYW5cIixcclxuICAgICAgXCJzYS1xdWVzdGlvbl9fZmlsdGVyLXRleHRcIlxyXG4gICAgKTtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGV4dCk7XHJcbiAgICBjb25zdCBmaWx0ZXJDbGVhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XHJcbiAgICAgIHZpc3VhbGl6ZXIuc2V0U2VsZWN0aW9uKHVuZGVmaW5lZCk7XHJcbiAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYXJCdXR0b25cIikpO1xyXG4gICAgdGhpcy5faHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmlsdGVyQ2xlYXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBodG1sRWxlbWVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9odG1sRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGUoc2VsZWN0aW9uOiB7IHZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0aW9uLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5faHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XHJcbiAgICAgIHRoaXMudGV4dC5pbm5lclRleHQgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZmlsdGVyXCIpICsgXCI6IFtcIiArIHNlbGVjdGlvbi50ZXh0ICsgXCJdXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgIHRoaXMudGV4dC5pbm5lclRleHQgPSBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBIaXN0b2dyYW1Nb2RlbCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBwcm90ZWN0ZWQgdmFsdWVUeXBlOiBcImRhdGVcIiB8IFwibnVtYmVyXCIgPSBcIm51bWJlclwiO1xuICBwcml2YXRlIF9jYWNoZWRWYWx1ZXM6IEFycmF5PHsgb3JpZ2luYWw6IGFueSwgY29udGluaW91czogbnVtYmVyIH0+ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jb250aW5pb3VzRGF0YTogeyBbc2VyaWVzOiBzdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NhY2hlZEludGVydmFsczogQXJyYXk8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbGFiZWw6IHN0cmluZyB9PiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaW50ZXJ2YWxQcmVjaXNpb246IG51bWJlciA9IDI7XG4gIHByb3RlY3RlZCBjaGFydFR5cGVzOiBzdHJpbmdbXTtcbiAgcHVibGljIGNoYXJ0VHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgSW50ZXJ2YWxzQ291bnQgPSAxMDtcbiAgcHVibGljIHN0YXRpYyBVc2VJbnRlcnZhbHNGcm9tID0gMTA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwiaGlzdG9ncmFtXCIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJ2YWxQcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW50ZXJ2YWxQcmVjaXNpb24gPSB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxQcmVjaXNpb247XG4gICAgfVxuICAgIGNvbnN0IHF1ZXN0aW9uVHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICBpZiAocXVlc3Rpb25UeXBlID09PSBcInRleHRcIiAmJiAocXVlc3Rpb25bXCJpbnB1dFR5cGVcIl0gPT09IFwiZGF0ZVwiIHx8IHF1ZXN0aW9uW1wiaW5wdXRUeXBlXCJdID09PSBcImRhdGV0aW1lXCIpKSB7XG4gICAgICB0aGlzLnZhbHVlVHlwZSA9IFwiZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpIHtcbiAgICB0aGlzLl9jb250aW5pb3VzRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRWYWx1ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRpbmlvdXNWYWx1ZSh2YWx1ZTogYW55KTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52YWx1ZVR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICByZXR1cm4gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmcodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmFsdWVUeXBlID09PSBcImRhdGVcIikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QcmVjaXNpb24odmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGJhc2UgPSBNYXRoLnBvdygxMCwgdGhpcy5faW50ZXJ2YWxQcmVjaXNpb24pO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGJhc2UgKiB2YWx1ZSkgLyBiYXNlO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpLmxlbmd0aCA+IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20pIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5pbnRlcnZhbHMuZmlsdGVyKGludGVydmFsID0+IGludGVydmFsLmxhYmVsID09PSBpdGVtVGV4dClbMF07XG4gICAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZShpbnRlcnZhbCwgaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCA/IGludGVydmFsLmxhYmVsIDogXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgY29uc3QgbGFiZWxJbmRleCA9IGxhYmVscy5pbmRleE9mKGl0ZW1UZXh0KTtcbiAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZSh0aGlzLmdldFZhbHVlcygpW2xhYmVsSW5kZXhdLCBsYWJlbHNbbGFiZWxJbmRleF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdmlzdWFsaXplciBkYXRhLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZWQoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHN1cGVyLm9uRGF0YUNoYW5nZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb250aW5pb3VzVmFsdWVzKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRWYWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICAgIGlmIChzZXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNlcmllcy5wdXNoKFwiXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGluaW91c0RhdGEgPSB7fTtcbiAgICAgIHNlcmllcy5mb3JFYWNoKHNlcmllc1ZhbHVlID0+IHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1ZhbHVlXSA9IFtdKTtcbiAgICAgIGNvbnN0IGhhc2ggPSB7fTtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGRhdGFJdGVtID0+IHtcbiAgICAgICAgY29uc3QgYW5zd2VyRGF0YSA9IGRhdGFJdGVtW3RoaXMuZGF0YU5hbWUgYXMgc3RyaW5nXTtcbiAgICAgICAgaWYgKGFuc3dlckRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNlcmllc1ZhbHVlID0gZGF0YUl0ZW1bRGF0YVByb3ZpZGVyLnNlcmllc01hcmtlcktleV0gfHwgXCJcIjtcbiAgICAgICAgICAvLyBUT0RPOiBfY29udGluaW91c0RhdGEgc2hvdWxkIGJlIHNvcnRlZCBpbiBvcmRlciB0byBzcGVlZC11cCBzdGF0aXN0aWNzIGNhbGN1bGF0aW9uIGluIHRoZSBnZXREYXRhIGZ1bmN0aW9uXG4gICAgICAgICAgdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzVmFsdWVdLnB1c2godGhpcy5nZXRDb250aW5pb3VzVmFsdWUoYW5zd2VyRGF0YSkpO1xuICAgICAgICAgIGhhc2hbYW5zd2VyRGF0YV0gPSBhbnN3ZXJEYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2NhY2hlZFZhbHVlcyA9IE9iamVjdC5rZXlzKGhhc2gpLm1hcChrZXkgPT4gKHsgb3JpZ2luYWw6IGhhc2hba2V5XSwgY29udGluaW91czogdGhpcy5nZXRDb250aW5pb3VzVmFsdWUoa2V5KSB9KSk7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZXMuc29ydCgoYSwgYikgPT4gYS5jb250aW5pb3VzIC0gYi5jb250aW5pb3VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFZhbHVlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG5lZWRVc2VSYXRlVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSA9PSBcInJhdGluZ1wiICYmIEFycmF5LmlzQXJyYXkodGhpcy5xdWVzdGlvbltcInJhdGVWYWx1ZXNcIl0pICYmIHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IGNvbnRpbmlvdXNWYWx1ZXMgPSB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKTtcbiAgICBpZiAodGhpcy5oYXNDdXN0b21JbnRlcnZhbHMgfHwgY29udGluaW91c1ZhbHVlcy5sZW5ndGggPiBIaXN0b2dyYW1Nb2RlbC5Vc2VJbnRlcnZhbHNGcm9tIHx8IHRoaXMubmVlZFVzZVJhdGVWYWx1ZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVydmFscy5tYXAoaW50ZXJ2YWwgPT4gaW50ZXJ2YWwuc3RhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGluaW91c1ZhbHVlcy5tYXAodmFsdWUgPT4gdmFsdWUub3JpZ2luYWwpO1xuICB9XG5cbiAgcHVibGljIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSB8fCB0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMubWFwKGludGVydmFsID0+IGludGVydmFsLmxhYmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRpbmlvdXNWYWx1ZXMubWFwKHZhbHVlID0+IFwiXCIgKyB2YWx1ZS5vcmlnaW5hbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0N1c3RvbUludGVydmFscygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uT3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KHRoaXMucXVlc3Rpb25PcHRpb25zLmludGVydmFscyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVydmFscygpIHtcbiAgICBpZiAodGhpcy5oYXNDdXN0b21JbnRlcnZhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uT3B0aW9ucy5pbnRlcnZhbHMucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGlmKHRoaXMubmVlZFVzZVJhdGVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSB0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXSBhcyBJdGVtVmFsdWVbXTtcbiAgICAgIHJldHVybiByYXRlVmFsdWVzLm1hcCgocmF0ZVZhbHVlLCBpKSA9PiAoe1xuICAgICAgICBzdGFydDogcmF0ZVZhbHVlLnZhbHVlLFxuICAgICAgICBlbmQ6IGkgPCByYXRlVmFsdWVzLmxlbmd0aCAtIDEgPyByYXRlVmFsdWVzW2kgKyAxXS52YWx1ZSA6IHJhdGVWYWx1ZS52YWx1ZSArIDEsXG4gICAgICAgIGxhYmVsOiByYXRlVmFsdWUudGV4dFxuICAgICAgfSkpLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2FjaGVkSW50ZXJ2YWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbnRpbmlvdXNWYWx1ZXMgPSB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKTtcbiAgICAgIHRoaXMuX2NhY2hlZEludGVydmFscyA9IFtdO1xuICAgICAgaWYgKGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IGNvbnRpbmlvdXNWYWx1ZXNbMF0uY29udGluaW91cztcbiAgICAgICAgY29uc3QgZW5kID0gY29udGluaW91c1ZhbHVlc1tjb250aW5pb3VzVmFsdWVzLmxlbmd0aCAtIDFdLmNvbnRpbmlvdXM7XG4gICAgICAgIGNvbnN0IGludGVydmFsc0NvdW50ID0gSGlzdG9ncmFtTW9kZWwuSW50ZXJ2YWxzQ291bnQ7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gKGVuZCAtIHN0YXJ0KSAvIGludGVydmFsc0NvdW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVydmFsc0NvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gc3RhcnQgKyBkZWx0YTtcbiAgICAgICAgICBjb25zdCBpc3RhcnQgPSB0aGlzLnRvUHJlY2lzaW9uKHN0YXJ0KTtcbiAgICAgICAgICBjb25zdCBpbmV4dCA9IHRoaXMudG9QcmVjaXNpb24obmV4dCk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVkSW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgc3RhcnQ6IGlzdGFydCxcbiAgICAgICAgICAgIGVuZDogaW5leHQsXG4gICAgICAgICAgICBsYWJlbDogXCJcIiArIHRoaXMuZ2V0U3RyaW5nKGlzdGFydCkgKyBcIi1cIiArIHRoaXMuZ2V0U3RyaW5nKGluZXh0KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN0YXJ0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkSW50ZXJ2YWxzO1xuICB9XG5cbiAgcHVibGljIGdldERhdGEoKSB7XG4gICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgIGlmICghdGhpcy5oYXNDdXN0b21JbnRlcnZhbHMgJiYgY29udGluaW91c1ZhbHVlcy5sZW5ndGggPD0gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldERhdGEoKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJ2YWxzID0gdGhpcy5pbnRlcnZhbHM7XG4gICAgY29uc3Qgc3RhdGlzdGljczogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGlmIChzZXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXJpZXMucHVzaChcIlwiKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN0YXRpc3RpY3MucHVzaChpbnRlcnZhbHMubWFwKGkgPT4gMCkpO1xuICAgICAgdGhpcy5fY29udGluaW91c0RhdGFbc2VyaWVzW2ldXS5mb3JFYWNoKGRhdGFWYWx1ZSA9PiB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW50ZXJ2YWxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgaWYgKGludGVydmFsc1tqXS5zdGFydCA8PSBkYXRhVmFsdWUgJiYgKGRhdGFWYWx1ZSA8IGludGVydmFsc1tqXS5lbmQgfHwgaiA9PSBpbnRlcnZhbHMubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIHN0YXRpc3RpY3NbaV1bal0rKztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG4iLCJjb25zdCBNdXVyaSA9IHJlcXVpcmUoXCJtdXVyaVwiKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRFbmdpbmUge1xyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfYWxsb3dlZDogYm9vbGVhbikge31cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7fVxyXG4gIHByb3RlY3RlZCBzdG9wQ29yZSgpIHt9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUNvcmUoKSB7fVxyXG5cclxuICBnZXQgYWxsb3dlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgc3RhcnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy5zdGFydENvcmUoY29udGFpbmVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RvcCgpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMuc3RvcENvcmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVDb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGQoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkge31cclxuICByZW1vdmUoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkge31cclxuXHJcbiAgb25Nb3ZlQ2FsbGJhY2s6IChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSA9PiB2b2lkO1xyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdG9wKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTXV1cmlMYXlvdXRFbmdpbmUgZXh0ZW5kcyBMYXlvdXRFbmdpbmUge1xyXG4gIHByaXZhdGUgX211dXJpOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfbGF5b3V0aW5nVGltZXI6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoYWxsb3dlZDogYm9vbGVhbiwgcHJpdmF0ZSBfc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgc3VwZXIoYWxsb3dlZCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRDb3JlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuX211dXJpID0gbmV3IE11dXJpKGNvbnRhaW5lciwge1xyXG4gICAgICBkcmFnU3RhcnRQcmVkaWNhdGU6IHtcclxuICAgICAgICBoYW5kbGU6IFwiLnNhLXF1ZXN0aW9uX190aXRsZS0tZHJhZ2dhYmxlXCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiB0aGlzLl9zZWxlY3RvcixcclxuICAgICAgZHJhZ0VuYWJsZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX211dXJpLm9uKFxyXG4gICAgICBcImRyYWdSZWxlYXNlRW5kXCIsXHJcbiAgICAgIChkYXRhOiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5vbk1vdmVDYWxsYmFjayAmJiB0aGlzLm9uTW92ZUNhbGxiYWNrKGRhdGEuZnJvbUluZGV4LCBkYXRhLnRvSW5kZXgpXHJcbiAgICApO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7XHJcbiAgICB0aGlzLl9tdXVyaS5vZmYoXCJkcmFnUmVsZWFzZUVuZFwiKTtcclxuICAgIHRoaXMuX211dXJpLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX211dXJpID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29yZSgpIHtcclxuICAgIGlmICh0aGlzLl9sYXlvdXRpbmdUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sYXlvdXRpbmdUaW1lcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sYXlvdXRpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9sYXlvdXRpbmdUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fbXV1cmkucmVmcmVzaEl0ZW1zKCk7XHJcbiAgICAgIHRoaXMuX211dXJpLmxheW91dCgpO1xyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB0aGlzLl9tdXVyaS5hZGQoZWxlbWVudHMsIG9wdGlvbnMpO1xyXG4gIH1cclxuICByZW1vdmUoZWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50Piwgb3B0aW9ucz86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX2FsbG93ZWQpIHRoaXMuX211dXJpLnJlbW92ZShlbGVtZW50cywgb3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGVuZ2xpc2hTdHJpbmdzIH0gZnJvbSBcIi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoXCI7XG5cbmV4cG9ydCB2YXIgbG9jYWxpemF0aW9uID0ge1xuICBjdXJyZW50TG9jYWxlVmFsdWU6IFwiXCIsXG4gIGRlZmF1bHRMb2NhbGVWYWx1ZTogXCJlblwiLFxuICBsb2NhbGVzOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICBsb2NhbGVOYW1lczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uIChzdHJOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50TG9jYWxlXG4gICAgICA/IHRoaXMubG9jYWxlc1t0aGlzLmN1cnJlbnRMb2NhbGVdXG4gICAgICA6IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIGlmICghbG9jIHx8ICFsb2Nbc3RyTmFtZV0pIGxvYyA9IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIHZhciByZXN1bHQgPSBsb2Nbc3RyTmFtZV07XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmxvY2FsZXNbXCJlblwiXVtzdHJOYW1lXSB8fCBzdHJOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBnZXRMb2NhbGVzOiBmdW5jdGlvbiAoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHJlcy5wdXNoKFwiXCIpO1xuICAgIGlmICh0aGlzLnN1cHBvcnRlZExvY2FsZXMgJiYgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuc3VwcG9ydGVkTG9jYWxlc1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxvY2FsZXMpIHtcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzLnNvcnQoKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSBlbmdsaXNoU3RyaW5ncztcbig8YW55PmxvY2FsaXphdGlvbikubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5sb2NhbGl6YXRpb24pLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcImVuZ2xpc2hcIjtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElBbnN3ZXJzRGF0YSwgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeCBleHRlbmRzIFNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJtYXRyaXhcIik7XG4gICAgdGhpcy5nZXRBbnN3ZXJzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtYXRyaXhRdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeE1vZGVsIHtcbiAgICByZXR1cm4gPFF1ZXN0aW9uTWF0cml4TW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiBcIlwiICsgcm93LnZhbHVlKTtcbiAgfVxuXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+XG4gICAgICBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLCByb3cudmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbjogSXRlbVZhbHVlKSA9PiBjb2x1bW4udGV4dCA9PT0gaXRlbVRleHRcbiAgICApWzBdO1xuICB9XG5cbiAgdmFsdWVzU291cmNlKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnM7XG4gIH1cblxuICBwcml2YXRlIGdldEhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycmF5KFxuICAgIGRhdGFzZXRzOiBBcnJheTxBcnJheTxhbnk+PlxuICApOiBBcnJheTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogQXJyYXk8Ym9vbGVhbj4gPSBBcnJheTxib29sZWFuPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGF0YXNldHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGRhdGFzZXRzW2pdW2ldICE9IDApIHtcbiAgICAgICAgICByZXN1bHRbaV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldEhhc0Fuc3dlcnNJblNlcmllcyhkYXRhc2V0OiBBcnJheTxhbnk+KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGF0YXNldFtpXSAhPSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YTogSUFuc3dlcnNEYXRhKTogSUFuc3dlcnNEYXRhIHtcbiAgICBjb25zdCByZXN1bHQ6IElBbnN3ZXJzRGF0YSA9IHtcbiAgICAgIGRhdGFzZXRzOiA8QXJyYXk8QXJyYXk8YW55Pj4+W10sXG4gICAgICBsYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgICAgY29sb3JzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIHRleHRzOiA8QXJyYXk8QXJyYXk8YW55Pj4+W10sXG4gICAgICBzZXJpZXNMYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgIH07XG5cbiAgICBjb25zdCBoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnIgPSB0aGlzLmdldEhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycmF5KFxuICAgICAgYW5zd2Vyc0RhdGEuZGF0YXNldHNcbiAgICApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGhhc0Fuc3dlcnNJblNlcmllcyA9IHRoaXMuZ2V0SGFzQW5zd2Vyc0luU2VyaWVzKFxuICAgICAgICBhbnN3ZXJzRGF0YS5kYXRhc2V0c1tpXVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNBbnN3ZXJzSW5TZXJpZXMpIHtcbiAgICAgICAgcmVzdWx0LmxhYmVscy5wdXNoKGFuc3dlcnNEYXRhLmxhYmVsc1tpXSk7XG4gICAgICAgIHJlc3VsdC5jb2xvcnMucHVzaChhbnN3ZXJzRGF0YS5jb2xvcnNbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0cyA9IFtdO1xuICAgICAgY29uc3QgdGV4dHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGhhc0Fuc3dlcnNJbkFsbFNlcmllc0FycltqXSkge1xuICAgICAgICAgIGRhdGFzZXRzLnB1c2goYW5zd2Vyc0RhdGEuZGF0YXNldHNbaV1bal0pO1xuICAgICAgICAgIHRleHRzLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbaV1bal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQuZGF0YXNldHMucHVzaChkYXRhc2V0cyk7XG4gICAgICByZXN1bHQudGV4dHMucHVzaCh0ZXh0cyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJbaV0pIHtcbiAgICAgICAgcmVzdWx0LnNlcmllc0xhYmVscy5wdXNoKGFuc3dlcnNEYXRhLnNlcmllc0xhYmVsc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc05hbWUsIHNlcmllc0luZGV4KSA9PiBzdGF0aXN0aWNzW3Nlcmllc0luZGV4XVt2YWx1ZUluZGV4XVxuICAgICAgICApO1xuICAgICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpc3RpY3M7XG4gIH1cbn1cbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLCBRdWVzdGlvbiwgTWF0cml4RHJvcGRvd25Db2x1bW4sIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJQW5zd2Vyc0RhdGEsIFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkdyb3VwZWQgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4RHJvcGRvd25Hcm91cGVkXCIpO1xuICAgIHRoaXMuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbWF0cml4UXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIHtcbiAgICByZXR1cm4gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD50aGlzLnF1ZXN0aW9uO1xuICB9XG5cbiAgZ2V0IGRhdGFOYW1lKCk6IHN0cmluZyB8IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcCgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikgPT4gY29sdW1uLnRpdGxlKTtcbiAgfVxuXG4gIC8vIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAvLyAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMuZmlsdGVyKFxuICAvLyAgICAgKGNvbHVtbjogSXRlbVZhbHVlKSA9PiBjb2x1bW4udGV4dCA9PT0gaXRlbVRleHRcbiAgLy8gICApWzBdO1xuICAvLyB9XG5cbiAgdmFsdWVzU291cmNlKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNob2ljZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MubWFwKHJvdyA9PiByb3cudmFsdWUpO1xuXG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEoe1xuICAgICAgZGF0YU5hbWU6IHNlcmllcyxcbiAgICAgIGdldFZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0TGFiZWxzOiAoKSA9PiB2YWx1ZXMsXG4gICAgICBnZXRTZXJpZXNWYWx1ZXM6ICgpID0+IHJvd3MsXG4gICAgICBnZXRTZXJpZXNMYWJlbHM6ICgpID0+IHJvd3MsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bMF1bdmFsdWVJbmRleF1cbiAgICAgICk7XG4gICAgICBwcmVwYXJlZERhdGEucHVzaChzZXJpZXNEYXRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgTnVtYmVyTW9kZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3Jlc3VsdEF2ZXJhZ2U6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVzdWx0TWluOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1heDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgc3RlcHNDb3VudCA9IDU7XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVUZXh0c0NhbGxiYWNrOiAoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG1heFZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBzdGVwc0NvdW50OiBudW1iZXIsXG4gICAgdGV4dHM6IHN0cmluZ1tdXG4gICkgPT4gc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNoYXJ0VHlwZTogU3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0FzUGVyY2VudGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJudW1iZXJcIik7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFydFR5cGVDaGFuZ2VkKCkge31cblxuICBwcm90ZWN0ZWQgc2V0Q2hhcnRUeXBlKGNoYXJ0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoY2hhcnRUeXBlKSAhPT0gLTEgJiZcbiAgICAgIHRoaXMuY2hhcnRUeXBlICE9PSBjaGFydFR5cGVcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlID0gY2hhcnRUeXBlO1xuICAgICAgdGhpcy5vbkNoYXJ0VHlwZUNoYW5nZWQoKTtcbiAgICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNaW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWF4ID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdlbmVyYXRlVGV4dChtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBsZXQgdGV4dHM6IGFueSA9IFtdO1xuXG4gICAgaWYgKHN0ZXBzQ291bnQgPT09IDUpIHtcbiAgICAgIHRleHRzID0gW1xuICAgICAgICBcInZlcnkgaGlnaCAoXCIgKyBtYXhWYWx1ZSArIFwiKVwiLFxuICAgICAgICBcImhpZ2hcIixcbiAgICAgICAgXCJtZWRpdW1cIixcbiAgICAgICAgXCJsb3dcIixcbiAgICAgICAgXCJ2ZXJ5IGxvdyAoXCIgKyBtaW5WYWx1ZSArIFwiKVwiLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHMucHVzaChtYXhWYWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQgLSAyOyBpKyspIHtcbiAgICAgICAgdGV4dHMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRleHRzLnB1c2gobWluVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghIU51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIE51bWJlck1vZGVsLmdlbmVyYXRlVGV4dHNDYWxsYmFjayhcbiAgICAgICAgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgbWF4VmFsdWUsXG4gICAgICAgIG1pblZhbHVlLFxuICAgICAgICBzdGVwc0NvdW50LFxuICAgICAgICB0ZXh0c1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dHM7XG4gIH1cblxuICBnZW5lcmF0ZVZhbHVlcyhtYXhWYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSAvIHN0ZXBzQ291bnQpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKG1heFZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBnZW5lcmF0ZUNvbG9ycyhtYXhWYWx1ZTogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBzdGVwc0NvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHNDb3VudDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaChwYWxldHRlW2ldKTtcbiAgICB9XG5cbiAgICBjb2xvcnMucHVzaChcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIik7XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0RGF0YSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5fcmVzdWx0TWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdE1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IDA7XG4gICAgICBsZXQgYWN0dWFsQW5zd2VyQ291bnQgPSAwO1xuXG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICBpZihyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uVmFsdWU6IG51bWJlciA9ICtyb3dEYXRhW3RoaXMucXVlc3Rpb24ubmFtZV07XG4gICAgICAgICAgYWN0dWFsQW5zd2VyQ291bnQrKztcbiAgICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlICs9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3VsdE1pbiA+IHF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHF1ZXN0aW9uVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNYXggPCBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXggPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmKGFjdHVhbEFuc3dlckNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdGhpcy5fcmVzdWx0QXZlcmFnZSAvIGFjdHVhbEFuc3dlckNvdW50O1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IE1hdGguY2VpbCh0aGlzLl9yZXN1bHRBdmVyYWdlICogMTAwKSAvIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLl9yZXN1bHRBdmVyYWdlLCB0aGlzLl9yZXN1bHRNaW4sIHRoaXMuX3Jlc3VsdE1heF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9ib29sZWFuXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Qm9vbENoYXJ0QWRhcHRlciBleHRlbmRzIFBsb3RseUNoYXJ0QWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBCb29sZWFuUGxvdGx5KSB7XG4gICAgc3VwZXIobW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBib29sQ29sb3JzID0gW1xuICAgICAgQm9vbGVhblBsb3RseS50cnVlQ29sb3IgfHwgY29sb3JzWzBdLFxuICAgICAgQm9vbGVhblBsb3RseS5mYWxzZUNvbG9yIHx8IGNvbG9yc1sxXSxcbiAgICBdO1xuICAgIGlmKHRoaXMubW9kZWwuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBib29sQ29sb3JzLnB1c2goY29sb3JzWzJdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgdGhpcy5tb2RlbC5jaGFydFR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9ycyA9IGJvb2xDb2xvcnM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJhclwiKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2U6IGFueSkgPT4ge1xuICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuUGxvdGx5IGV4dGVuZHMgQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJwaWVcIiwgXCJiYXJcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEJvb2xlYW5QbG90bHkudHlwZXM7XG4gICAgdGhpcy5jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUJvb2xDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD4oXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiYm9vbGVhblwiLCBCb29sZWFuUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgSGlzdG9ncmFtTW9kZWwgfSBmcm9tIFwiLi4vaGlzdG9ncmFtXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtUGxvdGx5IGV4dGVuZHMgSGlzdG9ncmFtTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUNoYXJ0QWRhcHRlcjtcbiAgcHVibGljIHN0YXRpYyB0eXBlcyA9IFtcInZiYXJcIiwgXCJiYXJcIiwgXCJzY2F0dGVyXCJdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSk7XG4gICAgdGhpcy5jaGFydFR5cGVzID0gSGlzdG9ncmFtUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD4oXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImRhdGVcIiwgSGlzdG9ncmFtUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBIaXN0b2dyYW1QbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmF0aW5nXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9zZXR1cFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWF0cml4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ib29sZWFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYW5raW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYXRyaXhkcm9wZG93bi1ncm91cGVkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JhdGluZ1wiO1xuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IE1hdHJpeCB9IGZyb20gXCIuLi9tYXRyaXhcIjtcbmltcG9ydCB7IFBsb3RseUNoYXJ0QWRhcHRlciB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhQbG90bHkgZXh0ZW5kcyBNYXRyaXgge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUNoYXJ0QWRhcHRlcjtcbiAgcHVibGljIHN0YXRpYyB0eXBlcyA9IFtcImJhclwiLCBcInN0YWNrZWRiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IE1hdHJpeFBsb3RseS50eXBlcztcbiAgICB0aGlzLmNoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIgPSBuZXcgUGxvdGx5Q2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJtYXRyaXhcIiwgTWF0cml4UGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IE1hdHJpeERyb3Bkb3duR3JvdXBlZCB9IGZyb20gXCIuLi9tYXRyaXhEcm9wZG93bkdyb3VwZWRcIjtcbmltcG9ydCB7IFBsb3RseUNoYXJ0QWRhcHRlciB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkgZXh0ZW5kcyBNYXRyaXhEcm9wZG93bkdyb3VwZWQge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUNoYXJ0QWRhcHRlcjtcbiAgcHVibGljIHN0YXRpYyB0eXBlcyA9IFtcInN0YWNrZWRiYXJcIiwgXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkudHlwZXM7XG4gICAgdGhpcy5jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiLCBNYXRyaXhEcm9wZG93bkdyb3VwZWRQbG90bHkpO1xuIiwiaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2VQbG90bHkgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nUGxvdGx5IGV4dGVuZHMgU2VsZWN0QmFzZVBsb3RseSB7XG4gIGdldFF1ZXN0aW9uUmVzdWx0cygpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5xdWVzdGlvbi5uYW1lO1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChkYXRhSXRlbSkgPT4gZGF0YUl0ZW1bbmFtZV0pO1xuICB9XG5cbiAgZ2V0RW1wdHlEYXRhKCkge1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIGxldCBkYXRhOiBhbnkgPSBbXTtcblxuICAgIGRhdGEubGVuZ3RoID0gY2hvaWNlcy5sZW5ndGg7XG4gICAgZGF0YS5maWxsKDApO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5nZXRRdWVzdGlvblJlc3VsdHMoKTtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWYWx1ZXMoKTtcblxuICAgIGxldCBwbG90bHlEYXRhID0gdGhpcy5nZXRFbXB0eURhdGEoKTtcblxuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdCwgcGxvdGx5RGF0YSwgY2hvaWNlcyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gW3Bsb3RseURhdGFdO1xuICB9XG5cbiAgYXBwbHlSZXN1bHRUb1Bsb3RseURhdGEocmVzdWx0OiBhbnlbXSwgcGxvdGx5RGF0YTogYW55LCBjaG9pY2VzOiBhbnkpIHtcbiAgICBpZiAoIXJlc3VsdCB8fCAhcGxvdGx5RGF0YSB8fCAhY2hvaWNlcykgcmV0dXJuO1xuXG4gICAgcmVzdWx0LmZvckVhY2goKHJlc3VsdFZhbHVlOiBhbnksIHJlc3VsdFZhbHVlSW5kZXg6IG51bWJlciwgcmVzdWx0OiBhbnlbXSkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gY2hvaWNlcy5pbmRleE9mKHJlc3VsdFZhbHVlKTtcbiAgICAgIHBsb3RseURhdGFbaW5kZXhdID1cbiAgICAgICAgK3Bsb3RseURhdGFbaW5kZXhdICsgKHJlc3VsdC5sZW5ndGggLSByZXN1bHRWYWx1ZUluZGV4KTtcbiAgICB9KTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYW5raW5nXCIsIFJhbmtpbmdQbG90bHkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IE51bWJlck1vZGVsIH0gZnJvbSBcIi4uL251bWJlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IGFsbG93RG9tUmVuZGVyaW5nLCBEYXRhSGVscGVyLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlscy9pbmRleFwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFBsb3RseVNldHVwIH0gZnJvbSBcIi4vc2V0dXBcIjtcbmltcG9ydCBQbG90bHkgZnJvbSBcInBsb3RseS5qcy1kaXN0LW1pblwiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5R2F1Z2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSBfY2hhcnQ6IFByb21pc2U8UGxvdGx5LlBsb3RseUhUTUxFbGVtZW50PiA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBHYXVnZVBsb3RseSkge31cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5tb2RlbC5xdWVzdGlvbjtcbiAgICBsZXQgW2xldmVsLCBtaW5WYWx1ZSwgbWF4VmFsdWVdID0gdGhpcy5tb2RlbC5nZXREYXRhKCk7XG5cbiAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcInJhdGluZ1wiKSB7XG4gICAgICBjb25zdCByYXRlVmFsdWVzID0gKDxRdWVzdGlvblJhdGluZ01vZGVsPnF1ZXN0aW9uKS52aXNpYmxlUmF0ZVZhbHVlcztcbiAgICAgIG1heFZhbHVlID0gcmF0ZVZhbHVlc1tyYXRlVmFsdWVzLmxlbmd0aCAtIDFdLnZhbHVlO1xuICAgICAgbWluVmFsdWUgPSByYXRlVmFsdWVzWzBdLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMubW9kZWwuZ2VuZXJhdGVDb2xvcnMoXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgR2F1Z2VQbG90bHkuc3RlcHNDb3VudFxuICAgICk7XG5cbiAgICBpZiAoR2F1Z2VQbG90bHkuc2hvd0FzUGVyY2VudGFnZSkge1xuICAgICAgbGV2ZWwgPSBEYXRhSGVscGVyLnRvUGVyY2VudGFnZShsZXZlbCwgbWF4VmFsdWUpO1xuICAgICAgbWluVmFsdWUgPSBEYXRhSGVscGVyLnRvUGVyY2VudGFnZShtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgbWF4VmFsdWUgPSBEYXRhSGVscGVyLnRvUGVyY2VudGFnZShtYXhWYWx1ZSwgbWF4VmFsdWUpO1xuICAgIH1cblxuICAgIHZhciBkYXRhOiBhbnkgPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiaW5kaWNhdG9yXCIsXG4gICAgICAgIG1vZGU6IFwiZ2F1Z2UrbnVtYmVyXCIsXG4gICAgICAgIGdhdWdlOiB7XG4gICAgICAgICAgYXhpczogeyByYW5nZTogW21pblZhbHVlLCBtYXhWYWx1ZV0gfSxcbiAgICAgICAgICBzaGFwZTogdGhpcy5tb2RlbC5jaGFydFR5cGUsXG4gICAgICAgICAgYmdjb2xvcjogXCJ3aGl0ZVwiLFxuICAgICAgICAgIGJhcjogeyBjb2xvcjogY29sb3JzWzBdIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBsZXZlbCxcbiAgICAgICAgdGV4dDogcXVlc3Rpb24ubmFtZSxcbiAgICAgICAgZG9tYWluOiB7IHg6IFswLCAxXSwgeTogWzAsIDFdIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB2YXIgbGF5b3V0OmFueSA9IHtcbiAgICAgIHBsb3RfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiB0aGlzLm1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImJ1bGxldFwiKSB7XG4gICAgICBsYXlvdXQuaGVpZ2h0ID0gMjUwO1xuICAgICAgbGF5b3V0LndpZHRoID0gNjAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRpc3BsYXlNb2RlQmFyOiBmYWxzZSxcbiAgICAgIHN0YXRpY1Bsb3Q6IHRydWUsXG4gICAgICBsb2NhbGU6IGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZVxuICAgIH07XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBsYXlvdXQ6IGxheW91dCxcbiAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgIH07XG4gICAgUGxvdGx5U2V0dXAub25QbG90Q3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcblxuICAgIHJldHVybiAoPGFueT5QbG90bHkpLm5ld1Bsb3QoXG4gICAgICBjaGFydE5vZGUsXG4gICAgICBvcHRpb25zLmRhdGEsXG4gICAgICBvcHRpb25zLmxheW91dCxcbiAgICAgIG9wdGlvbnMuY29uZmlnXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgKDxhbnk+UGxvdGx5KS5wdXJnZShub2RlKTtcbiAgICB0aGlzLl9jaGFydCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2F1Z2VQbG90bHkgZXh0ZW5kcyBOdW1iZXJNb2RlbCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5R2F1Z2VBZGFwdGVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJnYXVnZVwiLCBcImJ1bGxldFwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEdhdWdlUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlHYXVnZUFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm51bWJlclwiLCBHYXVnZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJyYXRpbmdcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZXhwcmVzc2lvblwiLCBHYXVnZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgYWxsb3dEb21SZW5kZXJpbmcsIERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IFBsb3RseSBmcm9tIFwicGxvdGx5LmpzLWRpc3QtbWluXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBwcml2YXRlIF9jaGFydDogUHJvbWlzZTxQbG90bHkuUGxvdGx5SFRNTEVsZW1lbnQ+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtb2RlbDogU2VsZWN0QmFzZSkgeyB9XG5cbiAgcHJvdGVjdGVkIHBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICBjaGFydE5vZGU6IG9iamVjdCxcbiAgICB0cmFjZXM6IEFycmF5PG9iamVjdD4sXG4gICAgbGF5b3V0OiBvYmplY3QsXG4gICAgY29uZmlnOiBvYmplY3RcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGNoYXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFydDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUoY2hhcnROb2RlOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBwbG90bHlPcHRpb25zID0gUGxvdGx5U2V0dXAuc2V0dXAodGhpcy5tb2RlbC5jaGFydFR5cGUsIHRoaXMubW9kZWwpO1xuXG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgZGlzcGxheWxvZ286IGZhbHNlLFxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIGxvY2FsZTogbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUsXG4gICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBbXCJ0b0ltYWdlXCJdLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b0ltYWdlU2pzXCIsXG4gICAgICAgICAgdGl0bGU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzYXZlRGlhZ3JhbUFzUE5HXCIpLFxuICAgICAgICAgIGljb246ICg8YW55PlBsb3RseSkuSWNvbnMuY2FtZXJhLFxuICAgICAgICAgIGNsaWNrOiAoZ2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIGZvcm1hdDogUGxvdGx5U2V0dXAuaW1hZ2VFeHBvcnRGb3JtYXQsXG4gICAgICAgICAgICAgIC8vIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICAgIC8vIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5tb2RlbC5xdWVzdGlvbi5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFBsb3RseVNldHVwLm9uSW1hZ2VTYXZpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICg8YW55PlBsb3RseSkuZG93bmxvYWRJbWFnZShnZCwgb3B0aW9ucyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAoU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuZGlzcGxheU1vZGVCYXIgPSBTZWxlY3RCYXNlUGxvdGx5LmRpc3BsYXlNb2RlQmFyO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hDb25maWdQYXJhbWV0ZXJzKFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIHRyYWNlczogcGxvdGx5T3B0aW9ucy50cmFjZXMsXG4gICAgICBsYXlvdXQ6IHBsb3RseU9wdGlvbnMubGF5b3V0LFxuICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgfTtcbiAgICBQbG90bHlTZXR1cC5vblBsb3RDcmVhdGluZy5maXJlKHRoaXMubW9kZWwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGxvdCA9ICg8YW55PlBsb3RseSkubmV3UGxvdChcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIG9wdGlvbnMudHJhY2VzLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG5cbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfY2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEucG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGl0ZW1UZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKCFwbG90bHlPcHRpb25zLmhhc1Nlcmllcykge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgICAgY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1UZXh0ID0gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TGFiZWwgPSBkYXRhLnBvaW50c1swXS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZXMgPSB0aGlzLm1vZGVsLmdldFNlcmllc1ZhbHVlcygpO1xuICAgICAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMubW9kZWwuZ2V0U2VyaWVzTGFiZWxzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHNlcmllc1ZhbHVlc1tzZXJpZXNMYWJlbHMuaW5kZXhPZihwcm9wZXJ0eUxhYmVsKV07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB0aGlzLm1vZGVsLmdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtVmFsdWUoeyBbcHJvcGVydHlWYWx1ZV06IHNlbGVjdGVkSXRlbS52YWx1ZSB9LCBwcm9wZXJ0eUxhYmVsICsgXCI6IFwiICsgc2VsZWN0ZWRJdGVtLnRleHQpO1xuICAgICAgICAgIHRoaXMubW9kZWwuc2V0U2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc3QgaXRlbVRleHQgPSBwbG90bHlPcHRpb25zLmhhc1Nlcmllc1xuICAgICAgICAvLyAgID8gZGF0YS5wb2ludHNbMF0uZGF0YS5uYW1lXG4gICAgICAgIC8vICAgOiBBcnJheS5pc0FycmF5KGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGEpXG4gICAgICAgIC8vICAgICA/IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGFbMF1cbiAgICAgICAgLy8gICAgIDogZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YTtcbiAgICAgICAgLy8gY29uc3QgaXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAvLyB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBnZXREcmFnTGF5ZXIgPSAoKSA9PlxuICAgICAgPEhUTUxFbGVtZW50PmNoYXJ0Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibnNld2RyYWdcIilbMF07XG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2hvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCIpO1xuICAgIH0pO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV91bmhvdmVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdMYXllciA9IGdldERyYWdMYXllcigpO1xuICAgICAgZHJhZ0xheWVyICYmIChkcmFnTGF5ZXIuc3R5bGUuY3Vyc29yID0gXCJcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFydCA9IHBsb3Q7XG4gICAgcmV0dXJuIHBsb3Q7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VQbG90bHkgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcInNjYXR0ZXJcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheU1vZGVCYXI6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBbXS5jb25jYXQoU2VsZWN0QmFzZVBsb3RseS50eXBlcyk7XG4gICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCAmJiB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgPT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZXMucHVzaChcInN0YWNrZWRiYXJcIik7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcykge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnNwbGljZSgxLCAwLCBcInZiYXJcIik7XG4gICAgfVxuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIGlmKHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZSkgIT09IC0xKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZSA9IG9wdGlvbnMuZGVmYXVsdENoYXJ0VHlwZTtcbiAgICB9XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdGF0aXN0aWNzID0gc3VwZXIuZ2V0RGF0YSgpO1xuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkRGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5tYXAoXG4gICAgICAgICAgKHNlcmllc1ZhbHVlLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNoZWNrYm94XCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFkaW9ncm91cFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImRyb3Bkb3duXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiaW1hZ2VwaWNrZXJcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuLi92aXN1YWxpemVyQmFzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RseU9wdGlvbnMge1xuICB0cmFjZXM6IEFycmF5PGFueT47XG4gIGxheW91dDogYW55O1xuICBoYXNTZXJpZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbG90bHlTZXR1cCB7XG4gIHB1YmxpYyBzdGF0aWMgaW1hZ2VFeHBvcnRGb3JtYXQgPSBcInBuZ1wiO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiBlbmQgdXNlciBjbGlja3Mgb24gdGhlICdzYXZlIGFzIGltYWdlJyBidXR0b24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uSW1hZ2VTYXZpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU2VsZWN0QmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgU2VsZWN0QmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyBiZWZvcmUgcGxvdCB3aWxsIGJlIGNyZWF0ZWQuIFVzZXIgY2FuIGNoYW5nZSB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKiBPcHRpb25zIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB0cmFjZXMsIGxheW91dCBhbmQgY29uZmlnIG9mIHRoZSBwbG90LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvblBsb3RDcmVhdGluZyA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBzdGF0aWMgc2V0dXBzOiB7IFt0eXBlOiBzdHJpbmddOiAobW9kZWw6IFNlbGVjdEJhc2UpID0+IFBsb3RseU9wdGlvbnMgfSA9IHtcbiAgICBiYXI6IFBsb3RseVNldHVwLnNldHVwQmFyLFxuICAgIHZiYXI6IFBsb3RseVNldHVwLnNldHVwVkJhcixcbiAgICBzdGFja2VkYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICBkb3VnaG51dDogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgcGllOiBQbG90bHlTZXR1cC5zZXR1cFBpZSxcbiAgICBzY2F0dGVyOiBQbG90bHlTZXR1cC5zZXR1cFNjYXR0ZXIsXG4gIH07XG5cbiAgc3RhdGljIHNldHVwKGNoYXJUeXBlOiBzdHJpbmcsIG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dXBzW2NoYXJUeXBlXShtb2RlbCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHJ1bmNhdGVkTGFiZWwgPSAobGFiZWw6IHN0cmluZywgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzID0gXCIuLi5cIjtcbiAgICBjb25zdCB0cnVuY2F0ZVN5bWJvbHNMZW5ndGggPSB0cnVuY2F0ZVN5bWJvbHMubGVuZ3RoO1xuXG4gICAgaWYgKCFsYWJlbFRydW5jYXRlTGVuZ3RoKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsVHJ1bmNhdGVMZW5ndGggPT09IC0xKSByZXR1cm4gbGFiZWw7XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA8PSBsYWJlbFRydW5jYXRlTGVuZ3RoICsgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoKVxuICAgICAgcmV0dXJuIGxhYmVsO1xuXG4gICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBsYWJlbFRydW5jYXRlTGVuZ3RoKSArIHRydW5jYXRlU3ltYm9scztcbiAgfTtcblxuICBzdGF0aWMgc2V0dXBQaWUobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG4gICAgY29uc3QgaGFzU2VyaWVzID0gc2VyaWVzTGFiZWxzLmxlbmd0aCA+IDE7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogKGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscykubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBQbG90bHlTZXR1cC5nZXRUcnVuY2F0ZWRMYWJlbChcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICB0cmFjZUNvbmZpZy5ob3ZlcmluZm8gPSBcImxhYmVsK3ZhbHVlK3BlcmNlbnRcIjtcbiAgICB0cmFjZUNvbmZpZy5tYXJrZXIuY29sb3JzID0gY29sb3JzO1xuICAgIHRyYWNlQ29uZmlnLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG5cbiAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09PSBcImRvdWdobnV0XCIpIHtcbiAgICAgIHRyYWNlQ29uZmlnLnR5cGUgPSBcInBpZVwiO1xuICAgICAgdHJhY2VDb25maWcuaG9sZSA9IDAuNDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHRyYWNlcy5wdXNoKFxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0cmFjZUNvbmZpZywge1xuICAgICAgICAgIHZhbHVlczogZGF0YXNldCxcbiAgICAgICAgICBsYWJlbHM6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IGxhYmVscy5sZW5ndGggPCAxMCA/IGxhYmVscy5sZW5ndGggKiA1MCArIDEwMCA6IDU1MDtcbiAgICBjb25zdCBoZWlnaHQgPSByYWRpdXMgKiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSArIDI1O1xuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIGw6IDAsXG4gICAgICAgIHQ6IDI1LFxuICAgICAgICBiOiAwLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5ncmlkID0ge1xuICAgICAgICByb3dzOiBNYXRoLnJvdW5kKHRyYWNlcy5sZW5ndGggLyAyKSxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgIH07XG4gICAgICBsYXlvdXQuYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5kb21haW4gPSB7XG4gICAgICAgICAgY29sdW1uOiBpbmRleCAlIDIsXG4gICAgICAgICAgcm93OiBNYXRoLmZsb29yKGluZGV4IC8gMiksXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlc1tpbmRleF0udGl0bGUgPSB7IHBvc2l0aW9uOiBcImJvdHRvbSBjZW50ZXJcIiwgdGV4dDogbGFiZWwgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cblxuICBzdGF0aWMgc2V0dXBCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgbGluZUhlaWdodCA9IDMwO1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHlGdWxsVGV4dHMgPSBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHM7XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogbW9kZWwuY2hhcnRUeXBlLFxuICAgICAgeTogeUZ1bGxUZXh0cyxcbiAgICAgIHRleHQ6IHlGdWxsVGV4dHMsXG4gICAgICBjdXN0b21kYXRhOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICBob3ZlcmluZm86IFwidGV4dFwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB0ZXh0cG9zaXRpb246IFwibm9uZVwiLFxuICAgICAgd2lkdGg6IDAuNSxcbiAgICAgIGJhcmdhcDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG4gICAgdHJhY2VDb25maWcubWFya2VyLmNvbG9yID0gY29sb3JzO1xuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgeDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgICBob3ZlcnRleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nLCBsYWJlbEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbaW5kZXhdW2xhYmVsSW5kZXhdfSwgJHtsYWJlbH1gO1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcykge1xuICAgICAgICBsZXQgdGV4dHRlbXBsYXRlID0gbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcyA/IFwiJXt0ZXh0fSVcIiA6IFwiJXt2YWx1ZX0gKCV7dGV4dH0lKVwiO1xuICAgICAgICB0cmFjZS50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuICAgICAgICB0cmFjZS50ZXh0dGVtcGxhdGUgPSB0ZXh0dGVtcGxhdGU7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhlaWdodCA9IChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luO1xuXG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBvcmllbnRhdGlvbjogXCJoXCIsXG4gICAgICAgIHRpY2ttb2RlOiBcImFycmF5XCIsXG4gICAgICAgIHRpY2t2YWxzOiB5RnVsbFRleHRzLFxuICAgICAgICB0aWNrdGV4dDogeUZ1bGxUZXh0cy5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgICApICsgXCIgIFwiO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICB4YXhpczoge1xuICAgICAgICByYW5nZW1vZGU6IFwibm9ubmVnYXRpdmVcIixcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgLy8gZHRpY2s6IDFcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoaGFzU2VyaWVzKSB7XG4gICAgICBsYXlvdXQuc2hvd2xlZ2VuZCA9IHRydWU7XG4gICAgICBpZiAobW9kZWwuY2hhcnRUeXBlID09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgIGxheW91dC5iYXJtb2RlID0gXCJzdGFja1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0LmhlaWdodCA9XG4gICAgICAgICAgKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKiBzZXJpZXNMYWJlbHMubGVuZ3RoICtcbiAgICAgICAgICB0b3BNYXJnaW4gK1xuICAgICAgICAgIGJvdHRvbU1hcmdpbjtcbiAgICAgIH1cblxuICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG5cbiAgICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJzdGFja2VkYmFyXCIpIHtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLnR5cGUgPSBcImJhclwiO1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS53aWR0aCA9XG4gICAgICAgICAgICAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gMC43IDogMC41KSAvIHRyYWNlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0cmFjZXMuZm9yRWFjaCgodHJhY2UsIHRyYWNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyY2VudFN0cmluZyA9IG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IFwiJVwiIDogXCJcIjtcbiAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dCA9IFtdO1xuICAgICAgICB5RnVsbFRleHRzLmZvckVhY2goKHlGdWxsVGV4dCwgeUZ1bGxUZXh0SW5kZXgpID0+IHtcbiAgICAgICAgICB0cmFjZXNbdHJhY2VJbmRleF0uaG92ZXJ0ZXh0LnB1c2goYCR7dHJhY2UueVt5RnVsbFRleHRJbmRleF19IDogJHt0cmFjZS5uYW1lfSwgJHt0cmFjZS50ZXh0W3lGdWxsVGV4dEluZGV4XX0ke3BlcmNlbnRTdHJpbmd9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwVkJhcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCB0b3BNYXJnaW4gPSAzMDtcbiAgICBsZXQgYm90dG9tTWFyZ2luID0gMzA7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuXG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHRyYWNlQ29uZmlnOiBhbnkgPSB7XG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB0ZXh0cG9zaXRpb246IFwibm9uZVwiLFxuICAgICAgd2lkdGg6IDAuNSxcbiAgICAgIGJhcmdhcDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG4gICAgdHJhY2VDb25maWcubWFya2VyLmNvbG9yID0gY29sb3JzO1xuXG4gICAgZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogQXJyYXk8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgeDogbGFiZWxzLFxuICAgICAgICB5OiBtb2RlbC5zaG93UGVyY2VudGFnZXMgPyB0ZXh0c1tpbmRleF0ubWFwKHkgPT4geSAvIDEwMCkgOiBkYXRhc2V0LFxuICAgICAgICB0ZXh0OiB0ZXh0c1tpbmRleF0sXG4gICAgICB9KTtcbiAgICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMpIHtcbiAgICAgICAgbGV0IHRleHR0ZW1wbGF0ZSA9IG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMgPyBcIiV7dGV4dH0lXCIgOiBcIiV7dmFsdWV9ICgle3RleHR9JSlcIjtcbiAgICAgICAgdHJhY2UudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcbiAgICAgICAgdHJhY2UudGV4dHRlbXBsYXRlID0gdGV4dHRlbXBsYXRlO1xuICAgICAgICB0cmFjZS53aWR0aCA9IDAuOTtcbiAgICAgICAgdHJhY2UuYmFyZ2FwID0gMC4xO1xuICAgICAgfVxuICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsLnNob3dQZXJjZW50YWdlcyAmJiBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzKSB7XG4gICAgICBsYXlvdXQueWF4aXMgPSB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHRpY2tmb3JtYXQ6IFwiLjAlXCIsXG4gICAgICAgIHJhbmdlOiBbMCwgMV0sXG4gICAgICAgIHRpY2tsZW46IG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMgPyAyNSA6IDUsXG4gICAgICAgIHRpY2tjb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0cmFjZXMsIGxheW91dCwgaGFzU2VyaWVzIH07XG4gIH1cblxuICBzdGF0aWMgc2V0dXBTY2F0dGVyKG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgbGV0IGxpbmVIZWlnaHQgPSAzMDtcbiAgICBsZXQgdG9wTWFyZ2luID0gMzA7XG4gICAgbGV0IGJvdHRvbU1hcmdpbiA9IDMwO1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSBtb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHRyYWNlczogYW55ID0gW107XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICB5OiAoaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzKS5tYXAoKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIG1vZGVsLmxhYmVsVHJ1bmNhdGVMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgdGV4dDogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcIngreVwiLFxuICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgbW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICB3aWR0aDogMC41LFxuICAgICAgbWFya2VyOiA8YW55Pnt9LFxuICAgIH07XG5cbiAgICBpZiAoIWhhc1Nlcmllcykge1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnN5bWJvbCA9IFwiY2lyY2xlXCI7XG4gICAgICB0cmFjZUNvbmZpZy5tYXJrZXIuc2l6ZSA9IDE2O1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4pID0+IHtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRyYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgICB4OiBkYXRhc2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgaGVpZ2h0ID0gKGxhYmVscy5sZW5ndGggKyAxKSAqIGxpbmVIZWlnaHQgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW47XG5cbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICB5YXhpczoge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIHRpY2tsZW46IDUsXG4gICAgICAgIHRpY2tjb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgfSxcbiAgICAgIHhheGlzOiB7XG4gICAgICAgIHJhbmdlbW9kZTogXCJub25uZWdhdGl2ZVwiLFxuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHBsb3RfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgc2hvd2xlZ2VuZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGlmIChoYXNTZXJpZXMpIHtcbiAgICAgIGxheW91dC5zaG93bGVnZW5kID0gdHJ1ZTtcbiAgICAgIGxheW91dC5oZWlnaHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5ob3ZlcmluZm8gPSBcIngrbmFtZVwiO1xuICAgICAgICB0cmFjZXNbaW5kZXhdLm1hcmtlci5jb2xvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5uYW1lID0gbGFiZWw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG59IiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uU2VsZWN0QmFzZSwgSXRlbVZhbHVlLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHNlbGVjdGlvbjogSXRlbVZhbHVlO1xuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQW5zd2Vyc0RhdGEge1xuICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIGxhYmVsczogQXJyYXk8c3RyaW5nPjtcbiAgY29sb3JzOiBBcnJheTxzdHJpbmc+O1xuICB0ZXh0czogQXJyYXk8QXJyYXk8YW55Pj47XG4gIHNlcmllc0xhYmVsczogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJhc2VcbiAgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZVxuICBpbXBsZW1lbnRzIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIHByb3RlY3RlZCBzZWxlY3RlZEl0ZW06IEl0ZW1WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjaG9pY2VzT3JkZXJTZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hvd1BlcmNlbnRhZ2VCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGVtcHR5QW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdHJhbnNwb3NlRGF0YUJ0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdG9wTlNlbGVjdG9yOiBIVE1MRGl2RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2hvd1BlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dPbmx5UGVyY2VudGFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcGVyY2VudGFnZVByZWNpc2lvbjogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIF9hbnN3ZXJzT3JkZXI6IHN0cmluZyA9IFwiZGVmYXVsdFwiO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9oaWRlRW1wdHlBbnN3ZXJzID0gZmFsc2U7XG4gIHByaXZhdGUgX3RvcE4gPSAtMTtcbiAgcHVibGljIHN0YXRpYyB0b3BOVmFsdWVzRGVmYXVsdHMgPSBbLTEsIDUsIDEwLCAyMF07XG4gIHB1YmxpYyB0b3BOVmFsdWVzID0gW10uY29uY2F0KFNlbGVjdEJhc2UudG9wTlZhbHVlc0RlZmF1bHRzKTtcbiAgcHJpdmF0ZSBfdHJhbnNwb3NlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93TWlzc2luZ0Fuc3dlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaXNzaW5nQW5zd2Vyc0J0bjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IGFueSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwic2VsZWN0QmFzZVwiKTtcbiAgICAoPGFueT5xdWVzdGlvbikudmlzaWJsZUNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCgpO1xuICAgIH07XG4gICAgdGhpcy5fc2hvd1BlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dQZXJjZW50YWdlcyA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdGhpcy5vcHRpb25zLnNob3dPbmx5UGVyY2VudGFnZXMgPT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb24pIHtcbiAgICAgIHRoaXMuX3BlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLm9wdGlvbnMucGVyY2VudGFnZVByZWNpc2lvbjtcbiAgICB9XG5cbiAgICB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzID0gdGhpcy5vcHRpb25zLmhpZGVFbXB0eUFuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5fYW5zd2Vyc09yZGVyID0gdGhpcy5vcHRpb25zLmFuc3dlcnNPcmRlciB8fCBcImRlZmF1bHRcIjtcbiAgICB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnMgPSB0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLnNob3dNaXNzaW5nQW5zd2VycyA9PT0gdHJ1ZTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VDaGFydFR5cGVcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMubWFwKChjaGFydFR5cGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBjaGFydFR5cGUsXG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaGFydFR5cGVfXCIgKyBjaGFydFR5cGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMuY2hhcnRUeXBlID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgICAgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDaGFydFR5cGUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUFuc3dlcnNPcmRlclwiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0NoYW5nZUFuc3dlcnNPcmRlcikgJiZcbiAgICAgICAgdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVmYXVsdE9yZGVyXCIpLCB2YWx1ZTogXCJkZWZhdWx0XCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFzY09yZGVyXCIpLCB2YWx1ZTogXCJhc2NcIiB9LFxuICAgICAgICAgICAgeyB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZGVzY09yZGVyXCIpLCB2YWx1ZTogXCJkZXNjXCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIChvcHRpb24pID0+IGZhbHNlLFxuICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFuc3dlcnNPcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93UGVyY2VudGFnZXNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dTaG93UGVyY2VudGFnZXMgJiZcbiAgICAgICAgKHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwiYmFyXCIpICE9PSAtMSB8fFxuICAgICAgICAgIHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKFwic3RhY2tlZGJhclwiKSAhPT0gLTEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZXMgPSAhdGhpcy5zaG93UGVyY2VudGFnZXM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dQZXJjZW50YWdlQnRuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImhpZGVFbXB0eUFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0hpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZUVtcHR5QW5zd2VycyA9ICF0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVFbXB0eUFuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVtcHR5QW5zd2Vyc0J0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0b3BOQW5zd2Vyc1wiLCAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1RvcE5BbnN3ZXJzICYmXG4gICAgICAgIHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50b3BOU2VsZWN0b3IgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICB0aGlzLnRvcE5WYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInRvcE5WYWx1ZVRleHRcIiArIHZhbHVlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b3BOID0gcGFyc2VJbnQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRvcE5TZWxlY3RvcjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJ0cmFuc3Bvc2VEYXRhXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dUcmFuc3Bvc2VEYXRhKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhID0gIXRoaXMudHJhbnNwb3NlRGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3NlRGF0YUJ0bjtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJzaG93TWlzc2luZ0Fuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQW5zd2Vyc0J0biA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMgPSAhdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGNoYXJ0VHlwZTogc3RyaW5nID0gXCJiYXJcIjtcblxuICBwcml2YXRlIHVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLmVtcHR5QW5zd2Vyc0J0bikge1xuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uaW5uZXJUZXh0ID0gdGhpcy5faGlkZUVtcHR5QW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93RW1wdHlBbnN3ZXJzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVFbXB0eUFuc3dlcnNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIikge1xuICAgICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy50cmFuc3Bvc2VEYXRhQnRuKSB7XG4gICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4uaW5uZXJUZXh0ID0gdGhpcy50cmFuc3Bvc2VEYXRhXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJDb2x1bW5zXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJWYWx1ZXNcIik7XG4gICAgICBpZiAodGhpcy5nZXRTZXJpZXNWYWx1ZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVPcmRlclNlbGVjdG9yKCkge1xuICAgIGlmICghIXRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fFxuICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9PSBcInNjYXR0ZXJcIiB8fFxuICAgICAgICAoKHRoaXMuY2hhcnRUeXBlID09IFwicGllXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJkb3VnaG51dFwiKSAmJlxuICAgICAgICAgIHRoaXMudG9wTiA+IDApXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3Rvci5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgXCJzZWxlY3RcIlxuICAgICAgKVswXS52YWx1ZSA9IHRoaXMuYW5zd2Vyc09yZGVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2hvd1BlcmNlbnRhZ2VCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy5zaG93UGVyY2VudGFnZUJ0bikge1xuICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5pbm5lclRleHQgPSB0aGlzLl9zaG93UGVyY2VudGFnZXNcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZVBlcmNlbnRhZ2VzXCIpXG4gICAgICAgIDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dQZXJjZW50YWdlc1wiKTtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZSA9PSBcImJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwidmJhclwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvcE5TZWxlY3RvcigpIHtcbiAgICBpZiAoISF0aGlzLnRvcE5TZWxlY3Rvcikge1xuICAgICAgdGhpcy50b3BOU2VsZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzZWxlY3RcIilbMF0udmFsdWUgPSA8YW55PihcbiAgICAgICAgdGhpcy5fdG9wTlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1pc3NpbmdBbnN3ZXJzQnRuKCkge1xuICAgIGlmICghIXRoaXMubWlzc2luZ0Fuc3dlcnNCdG4pIHtcbiAgICAgIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG4uaW5uZXJUZXh0ID0gdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVNaXNzaW5nQW5zd2Vyc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93TWlzc2luZ0Fuc3dlcnNcIik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2hhcnRUeXBlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCk7XG4gICAgdGhpcy51cGRhdGVFbXB0eUFuc3dlcnNCdG4oKTtcbiAgICB0aGlzLnVwZGF0ZVRvcE5TZWxlY3RvcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldENoYXJ0VHlwZShjaGFydFR5cGU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKGNoYXJ0VHlwZSkgIT09IC0xICYmXG4gICAgICB0aGlzLmNoYXJ0VHlwZSAhPT0gY2hhcnRUeXBlXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29ycmVjdEFuc3dlclZhbHVlID0gc3VwZXIuZ2V0Q29ycmVjdEFuc3dlclRleHQoKTtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNvcnJlY3RBbnN3ZXJWYWx1ZSkgPyBjb3JyZWN0QW5zd2VyVmFsdWUgOiBbY29ycmVjdEFuc3dlclZhbHVlXTtcbiAgICBjb25zdCBzZWxlY3RCYXNlUXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uIGFzIFF1ZXN0aW9uU2VsZWN0QmFzZTtcbiAgICByZXR1cm4gcmVzdWx0VmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHNlbGVjdEJhc2VRdWVzdGlvbi5jaG9pY2VzLCB2YWx1ZSkpLmpvaW4oXCIsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgJiYgaXRlbVRleHQgPT0gc2VsQmFzZS5vdGhlclRleHQpIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLm90aGVySXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbEJhc2UuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4gY2hvaWNlLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgICApWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gIT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25EYXRhSXRlbVNlbGVjdGVkKFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXRlbSAhPT0gdW5kZWZpbmVkID8gaXRlbS50ZXh0IDogXCJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd09ubHlQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd09ubHlQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93T25seVBlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd1BlcmNlbnRhZ2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dQZXJjZW50YWdlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGVyY2VudGFnZXMgPSB2YWw7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5zd2Vyc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9hbnN3ZXJzT3JkZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFuc3dlcnNPcmRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5zd2Vyc09yZGVyID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRlRW1wdHlBbnN3ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9oaWRlRW1wdHlBbnN3ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBoaWRlRW1wdHlBbnN3ZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlkZUVtcHR5QW5zd2VycyA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cmFuc3Bvc2VEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3Bvc2VEYXRhO1xuICB9XG5cbiAgcHVibGljIHNldCB0cmFuc3Bvc2VEYXRhKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdHJhbnNwb3NlRGF0YSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVHJhbnNwb3NlRGF0YUJ0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9wTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3BOO1xuICB9XG5cbiAgcHVibGljIHNldCB0b3BOKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3BOID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgICB0aGlzLnVwZGF0ZU9yZGVyU2VsZWN0b3IoKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dNaXNzaW5nQW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBzaG93TWlzc2luZ0Fuc3dlcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93TWlzc2luZ0Fuc3dlcnMgPSB0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdmFsdWU7XG4gICAgdGhpcy51cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpO1xuICAgIHRoaXMuZGF0YVByb3ZpZGVyLnJlc2V0KHRoaXMpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHJlZnJlc2hDb250ZW50KCkge1xuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgfVxuXG4gIG9uRGF0YUl0ZW1TZWxlY3RlZDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgZ2V0IHNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyICE9PSBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gcXVlc3Rpb25bXCJhY3RpdmVDaG9pY2VzXCJdO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8YW55PiA9IHRoaXMudmFsdWVzU291cmNlKCkubWFwKFxuICAgICAgKGNob2ljZSkgPT4gY2hvaWNlLnZhbHVlXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc090aGVyKSB7XG4gICAgICB2YWx1ZXMucHVzaChcIm90aGVyXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIHZhbHVlcy51bnNoaWZ0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVmFsdWVzQXNMYWJlbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlcygpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHM6IEFycmF5PHN0cmluZz4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcCgoY2hvaWNlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMudmFsdWVzU291cmNlKCksIGNob2ljZS52YWx1ZSlcbiAgICApO1xuICAgIGNvbnN0IHNlbEJhc2UgPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKHNlbEJhc2UuaGFzT3RoZXIpIHtcbiAgICAgIGxhYmVscy5wdXNoKHNlbEJhc2Uub3RoZXJUZXh0KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICBsYWJlbHMudW5zaGlmdChsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWlzc2luZ0Fuc3dlcnNMYWJlbFwiKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dWYWx1ZXNJbk9yaWdpbmFsT3JkZXIpIHtcbiAgICAgIHJldHVybiBsYWJlbHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgZ2V0UGVyY2VudGFnZXMoKTogQXJyYXk8QXJyYXk8bnVtYmVyPj4ge1xuICAgIHZhciBkYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IHRoaXMuZ2V0RGF0YSgpO1xuICAgIHZhciBwZXJjZW50YWdlczogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICB2YXIgcGVyY2VudGFnZVByZWNpc2lvbiA9IHRoaXMuX3BlcmNlbnRhZ2VQcmVjaXNpb247XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPCAyKSB7XG4gICAgICBkYXRhLmZvckVhY2goKHJlcywgaW5kZXgpID0+IHtcbiAgICAgICAgdmFyIHN1bSA9IHJlcy5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyB2YWwsIDApO1xuICAgICAgICBwZXJjZW50YWdlc1tpbmRleF0gPSByZXMubWFwKCh2YWwpID0+IHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBwZXJjZW50YWdlUHJlY2lzaW9uID8gKyh2YWwgLyBzdW0pLnRvRml4ZWQocGVyY2VudGFnZVByZWNpc2lvbikgOiBNYXRoLnJvdW5kKCh2YWwgLyBzdW0pICogMTAwMDApO1xuICAgICAgICAgIHJldHVybiBzdW0gJiYgKHZhbHVlIC8gMTAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzdW0gKz0gZGF0YVtqXVtpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGVyY2VudGFnZXNbal0pKSBwZXJjZW50YWdlc1tqXSA9IFtdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHBlcmNlbnRhZ2VQcmVjaXNpb24gPyArKChkYXRhW2pdW2ldIC8gc3VtKSAqIDEwMCkudG9GaXhlZChwZXJjZW50YWdlUHJlY2lzaW9uKSA6IE1hdGgucm91bmQoKGRhdGFbal1baV0gLyBzdW0pICogMTAwKTtcbiAgICAgICAgICBwZXJjZW50YWdlc1tqXVtpXSA9IHN1bSAmJiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGVyY2VudGFnZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YTogSUFuc3dlcnNEYXRhKTogSUFuc3dlcnNEYXRhIHtcbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZGF0YXNldHM6IDxBcnJheTxhbnk+PltbXV0sXG4gICAgICBsYWJlbHM6IDxBcnJheTxzdHJpbmc+PltdLFxuICAgICAgY29sb3JzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIHRleHRzOiA8QXJyYXk8YW55Pj5bW11dLFxuICAgICAgc2VyaWVzTGFiZWxzOiBhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHMsXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF1baV0gIT0gMCkge1xuICAgICAgICByZXN1bHQuZGF0YXNldHNbMF0ucHVzaChhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXVtpXSk7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgICAgcmVzdWx0LnRleHRzWzBdLnB1c2goYW5zd2Vyc0RhdGEudGV4dHNbMF1baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFuc3dlcnNEYXRhUmVhZHkoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSkge1xuICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLmhpZGVFbXB0eUFuc3dlcnMpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuaGlkZUVtcHR5QW5zd2Vyc0luRGF0YShhbnN3ZXJzRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGFuc3dlcnNEYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy50b3BOID4gMCkge1xuICAgICAgcmVzdWx0LmRhdGFzZXRzWzBdID0gcmVzdWx0LmRhdGFzZXRzWzBdLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LmxhYmVscyA9IHJlc3VsdC5sYWJlbHMuc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQuY29sb3JzID0gcmVzdWx0LmNvbG9ycy5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC50ZXh0c1swXSA9IHJlc3VsdC50ZXh0c1swXS5zbGljZSgtdGhpcy50b3BOKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGFuc3dlciBkYXRhIGhhcyBiZWVuIGNvbWJpbmVkIGJlZm9yZSB0aGV5IHBhc3NlZCB0byBkcmF3IGdyYXBoLlxuICAgKiBvcHRpb25zIC0gdGhlIGFuc3dlcnMgZGF0YSBvYmplY3QgY29udGFpbmluZzogZGF0YXNldHMsIGxhYmVscywgY29sb3JzLCBhZGRpdGlvbmFsIHRleHRzIChwZXJjZW50YWdlKS5cbiAgICogb3B0aW9ucyBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkXG4gICAqL1xuICBwdWJsaWMgb25BbnN3ZXJzRGF0YVJlYWR5ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFNlbGVjdEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFNlbGVjdEJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogUmV0dXJucyBvYmplY3Qgd2l0aCBhbGwgaW5mb3RtYXRpb24gZm9yIGRhdGEgdmlzdWFsaXphdGlvbjogZGF0YXNldHMsIGxhYmVscywgY29sb3JzLCBhZGRpdGlvbmFsIHRleHRzIChwZXJjZW50YWdlKS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbnN3ZXJzRGF0YSgpOiBJQW5zd2Vyc0RhdGEge1xuICAgIGxldCBzZXJpZXNMYWJlbHMgPSB0aGlzLmdldFNlcmllc0xhYmVscygpO1xuICAgIGxldCBkYXRhc2V0cyA9IHRoaXMuZ2V0RGF0YSgpO1xuICAgIGxldCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGxldCBjb2xvcnMgPSB0aGlzLmdldENvbG9ycygpO1xuICAgIHZhciB0ZXh0cyA9IHRoaXMuc2hvd1BlcmNlbnRhZ2VzID8gdGhpcy5nZXRQZXJjZW50YWdlcygpIDogZGF0YXNldHM7XG5cbiAgICBpZiAodGhpcy50cmFuc3Bvc2VEYXRhKSB7XG4gICAgICBkYXRhc2V0cyA9IHRoaXMudHJhbnNwb3NlKGRhdGFzZXRzKTtcbiAgICAgIHRleHRzID0gdGhpcy50cmFuc3Bvc2UodGV4dHMpO1xuICAgICAgY29uc3QgdGVtcCA9IHNlcmllc0xhYmVscztcbiAgICAgIHNlcmllc0xhYmVscyA9IGxhYmVscztcbiAgICAgIGxhYmVscyA9IHRlbXA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYW5zd2Vyc09yZGVyID09IFwiYXNjXCIgfHwgdGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJkZXNjXCIpIHtcbiAgICAgIHZhciB6aXBwZWRBcnJheSA9IHRoaXMuc2hvd1BlcmNlbnRhZ2VzXG4gICAgICAgID8gRGF0YUhlbHBlci56aXBBcnJheXMobGFiZWxzLCBjb2xvcnMsIHRleHRzWzBdKVxuICAgICAgICA6IERhdGFIZWxwZXIuemlwQXJyYXlzKGxhYmVscywgY29sb3JzKTtcbiAgICAgIGxldCBkaWN0ID0gRGF0YUhlbHBlci5zb3J0RGljdGlvbmFyeShcbiAgICAgICAgemlwcGVkQXJyYXksXG4gICAgICAgIGRhdGFzZXRzWzBdLFxuICAgICAgICB0aGlzLmFuc3dlcnNPcmRlciA9PSBcImRlc2NcIlxuICAgICAgKTtcbiAgICAgIGxldCB1bnppcHBlZEFycmF5ID0gRGF0YUhlbHBlci51bnppcEFycmF5cyhkaWN0LmtleXMpO1xuICAgICAgbGFiZWxzID0gdW56aXBwZWRBcnJheVswXTtcbiAgICAgIGNvbG9ycyA9IHVuemlwcGVkQXJyYXlbMV07XG4gICAgICBpZiAodGhpcy5zaG93UGVyY2VudGFnZXMpIHRleHRzWzBdID0gdW56aXBwZWRBcnJheVsyXTtcbiAgICAgIGRhdGFzZXRzWzBdID0gZGljdC52YWx1ZXM7XG4gICAgfVxuXG4gICAgbGV0IGFuc3dlcnNEYXRhID0ge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9O1xuICAgIGFuc3dlcnNEYXRhID0gdGhpcy5hbnN3ZXJzRGF0YVJlYWR5KGFuc3dlcnNEYXRhKTtcbiAgICB0aGlzLm9uQW5zd2Vyc0RhdGFSZWFkeS5maXJlKHRoaXMsIGFuc3dlcnNEYXRhKTtcblxuICAgIHJldHVybiBhbnN3ZXJzRGF0YTtcbiAgfVxuICBwcm90ZWN0ZWQgdHJhbnNwb3NlKGRhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+KTogQXJyYXk8QXJyYXk8bnVtYmVyPj4ge1xuICAgIGNvbnN0IGRpbTIgPSBkYXRhWzBdLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPj4oZGltMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW0yOyArK2kpXG4gICAgICByZXN1bHRbaV0gPSBuZXcgQXJyYXk8bnVtYmVyPihkYXRhLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpbTI7ICsraikge1xuICAgICAgICByZXN1bHRbal1baV0gPSBkYXRhW2ldW2pdO1xuICAgICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfc3RhdGVQcm9wZXJ0aWVzID0gW1wiY2hhcnRUeXBlXCIsIFwiYW5zd2Vyc09yZGVyXCIsIFwiaGlkZUVtcHR5QW5zd2Vyc1wiLCBcInRvcE5cIl07XG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBhbnkge1xuICAgIGxldCBzdGF0ZTogYW55ID0ge307XG4gICAgU2VsZWN0QmFzZS5fc3RhdGVQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcbiAgICAgIHN0YXRlW3Byb3BlcnR5TmFtZV0gPSAoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBpZiAoc3RhdGVbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0gPSBzdGF0ZVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XHJcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vdGV4dC5zY3NzXCIpO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRUYWJsZUFkYXB0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IFRleHQpIHt9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zQ291bnQsIGRhdGEgfSA9IHRoaXMubW9kZWwuZ2V0RGF0YSgpO1xyXG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XHJcbiAgICAgIGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vUmVzdWx0c1wiKSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YWJsZU5vZGUgPSA8SFRNTFRhYmxlRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCBcInNhLXRleHQtdGFibGVcIilcclxuICAgICk7XHJcblxyXG4gICAgdGFibGVOb2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlTm9kZSk7XHJcblxyXG4gICAgZGF0YS5mb3JFYWNoKChyb3dEYXRhKSA9PiB7XHJcbiAgICAgIHZhciByb3cgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidHJcIik7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcclxuICAgICAgICB2YXIgdGQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS10ZXh0LXRhYmxlX19jZWxsXCIsIHtcclxuICAgICAgICAgIHRleHRDb250ZW50OiByb3dEYXRhW2ldLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZCh0ZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKHJvdyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gXCJzYS10ZXh0LXRhYmxlX19jb250YWluZXJcIjtcclxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcclxuICAgIG5vZGUuaW5uZXJIVE1MID0gXCJcIjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0IGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xyXG4gIHByaXZhdGUgX3RleHRUYWJsZUFkYXB0ZXI6IFRleHRUYWJsZUFkYXB0ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcclxuICAgIG9wdGlvbnM/OiBPYmplY3QsXHJcbiAgICBuYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInRleHRcIik7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyID0gbmV3IFRleHRUYWJsZUFkYXB0ZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXREYXRhKCkge1xyXG4gICAgbGV0IHJlc3VsdDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuICAgIGxldCBjb2x1bW5zQ291bnQgPSAwO1xyXG5cclxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xyXG4gICAgICBjb25zdCBkYXRhU3RyaW5nczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICBpZiAoISFyb3dWYWx1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xyXG4gICAgICAgICAgZGF0YVN0cmluZ3MuY29uY2F0KHJvd1ZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWVba2V5XSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFTdHJpbmdzLnB1c2gocm93VmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQucHVzaChkYXRhU3RyaW5ncyk7XHJcbiAgICAgICAgaWYgKGRhdGFTdHJpbmdzLmxlbmd0aCA+IGNvbHVtbnNDb3VudCkge1xyXG4gICAgICAgICAgY29sdW1uc0NvdW50ID0gZGF0YVN0cmluZ3MubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uc0NvdW50LCBkYXRhOiByZXN1bHQgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcclxuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmNyZWF0ZShjb250YWluZXIpO1xyXG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpIHtcclxuICAgIHRoaXMuX3RleHRUYWJsZUFkYXB0ZXIuZGVzdHJveSh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xyXG4gICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gIH1cclxufVxyXG5cclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBUZXh0KTtcclxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFRleHQpO1xyXG4iLCJleHBvcnQgdmFyIF9fYXNzaWduID1cbiAgKDxhbnk+T2JqZWN0KVtcImFzc2lnblwiXSB8fFxuICBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIHAgaW4gcylcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyh0aGlzQ2xhc3M6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgZm9yICh2YXIgcCBpbiBiYXNlQ2xhc3MpXG4gICAgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzO1xuICB9XG4gIHRoaXNDbGFzcy5wcm90b3R5cGUgPVxuICAgIGJhc2VDbGFzcyA9PT0gbnVsbFxuICAgICAgPyBPYmplY3QuY3JlYXRlKGJhc2VDbGFzcylcbiAgICAgIDogKChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlKSwgbmV3ICg8YW55Pl9fKSgpKTtcbn1cblxuZXhwb3J0IHZhciBfX3Jlc3QgPSBmdW5jdGlvbihzb3VyY2U6IGFueSwgZTogYW55KSB7XG4gIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gc291cmNlKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIHByb3BlcnR5TmFtZSkgJiZcbiAgICAgIGUuaW5kZXhPZihwcm9wZXJ0eU5hbWUpIDwgMFxuICAgIClcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gc291cmNlW3Byb3BlcnR5TmFtZV07XG4gIGlmIChcbiAgICBzb3VyY2UgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiAoPGFueT5PYmplY3QpW1wiZ2V0T3duUHJvcGVydHlTeW1ib2xzXCJdID09PSBcImZ1bmN0aW9uXCJcbiAgKVxuICAgIGZvciAoXG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgIHByb3BlcnR5U3ltYm9scyA9ICg8YW55Pk9iamVjdClbXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIl0oc291cmNlKTtcbiAgICAgIGkgPCBwcm9wZXJ0eVN5bWJvbHMubGVuZ3RoO1xuICAgICAgaSsrXG4gICAgKVxuICAgICAgaWYgKGUuaW5kZXhPZihwcm9wZXJ0eVN5bWJvbHNbaV0pIDwgMClcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5U3ltYm9sc1tpXV0gPSBzb3VyY2VbcHJvcGVydHlTeW1ib2xzW2ldXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxuZXhwb3J0IHZhciBfX2RlY29yYXRlID0gZnVuY3Rpb24oXG4gIGRlY29yYXRvcnM6IGFueSxcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogYW55LFxuICBkZXNjOiBhbnlcbikge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcbiIsImV4cG9ydCBjbGFzcyBEb2N1bWVudEhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTZWxlY3RvcihcclxuICAgIG9wdGlvbnM6IEFycmF5PHsgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0+LFxyXG4gICAgaXNTZWxlY3RlZDogKG9wdGlvbjogeyB2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfSkgPT4gYm9vbGVhbixcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgc2VsZWN0V3JhcHBlci5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3Qtd3JhcHBlclwiO1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcclxuICAgIHNlbGVjdC5jbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uX19zZWxlY3RcIjtcclxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCBcIlwiLCB7XHJcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcclxuICAgICAgICB0ZXh0OiBvcHRpb24udGV4dCxcclxuICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZChvcHRpb24pLFxyXG4gICAgICB9KTtcclxuICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICBzZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVyO1xyXG4gICAgc2VsZWN0V3JhcHBlci5hcHBlbmRDaGlsZChzZWxlY3QpO1xyXG4gICAgcmV0dXJuIHNlbGVjdFdyYXBwZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUJ1dHRvbihcclxuICAgIGhhbmRsZXI6IChlOiBhbnkpID0+IHZvaWQsXHJcbiAgICB0ZXh0ID0gXCJcIixcclxuICAgIGNsYXNzTmFtZSA9IFwic2EtdG9vbGJhcl9fYnV0dG9uXCJcclxuICApIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIGNsYXNzTmFtZSwge1xyXG4gICAgICBpbm5lclRleHQ6IHRleHQsXHJcbiAgICAgIG9uY2xpY2s6IGhhbmRsZXIsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBidXR0b247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUVsZW1lbnQoXHJcbiAgICB0YWdOYW1lOiBzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU6IHN0cmluZyA9IFwiXCIsXHJcbiAgICBhdHRycz86IGFueVxyXG4gICk6IEhUTUxFbGVtZW50IHtcclxuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcbiAgICBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XHJcbiAgICBpZiAoISFhdHRycykge1xyXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgKDxhbnk+ZWwpW2tleV0gPSBhdHRyc1trZXldO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnRWxlbWVudChwYXRoOiBzdHJpbmcpOiBTVkdTVkdFbGVtZW50IHtcclxuICAgIGNvbnN0IHN2Z0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJzdmdcIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHVzZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgXCJ1c2VcIlxyXG4gICAgKTtcclxuICAgIHVzZUVsZW0uc2V0QXR0cmlidXRlTlMoXHJcbiAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxyXG4gICAgICBcImhyZWZcIixcclxuICAgICAgXCIjc2Etc3ZnLVwiICsgcGF0aFxyXG4gICAgKTtcclxuICAgIHN2Z0VsZW0uYXBwZW5kQ2hpbGQodXNlRWxlbSk7XHJcbiAgICByZXR1cm4gc3ZnRWxlbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQnV0dG9uKHBhdGg6IHN0cmluZyk6IEhUTUxCdXR0b25FbGVtZW50IHtcclxuICAgIGNvbnN0IGJ0biA9IDxIVE1MQnV0dG9uRWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgXCJzYS10YWJsZV9fc3ZnLWJ1dHRvblwiKVxyXG4gICAgKTtcclxuICAgIGJ0bi5hcHBlbmRDaGlsZChEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KHBhdGgpKTtcclxuICAgIHJldHVybiBidG47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcclxuICAgIHN2Z1BhdGgxOiBzdHJpbmcsXHJcbiAgICBzdlBwYXRoMjogc3RyaW5nLFxyXG4gICAgdGV4dDE6IHN0cmluZyxcclxuICAgIHRleHQyOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyMTogKGU6IGFueSkgPT4gYW55LFxyXG4gICAgaGFuZGxlcjI6IChlOiBhbnkpID0+IGFueSxcclxuICAgIHN0YXRlID0gXCJmaXJzdFwiLFxyXG4gICAgY2xhc3NOYW1lID0gXCJzYS10b29sYmFyX19idXR0b24gc2EtdG9vbGJhcl9fc3ZnLWJ1dHRvblwiXHJcbiAgKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3Qgc3ZnMSA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZnUGF0aDEpO1xyXG4gICAgY29uc3Qgc3ZnMiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z0VsZW1lbnQoc3ZQcGF0aDIpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBjbGFzc05hbWUpO1xyXG5cclxuICAgIGNvbnN0IHRvZ2dsZSA9IChlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgICBzdGF0ZSA9IFwic2Vjb25kXCI7XHJcbiAgICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgICAgYnV0dG9uLnJlbW92ZUNoaWxkKHN2ZzEpO1xyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgICAgICBoYW5kbGVyMihlKTtcclxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJzZWNvbmRcIikge1xyXG4gICAgICAgIHN0YXRlID0gXCJmaXJzdFwiO1xyXG4gICAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQxO1xyXG4gICAgICAgIGJ1dHRvbi5yZW1vdmVDaGlsZChzdmcyKTtcclxuICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMSk7XHJcbiAgICAgICAgaGFuZGxlcjEoZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBcImZpcnN0XCIpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDE7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcxKTtcclxuICAgIH0gZWxzZSBpZiAoKHN0YXRlID0gXCJzZWNvbmRcIikpIHtcclxuICAgICAgYnV0dG9uLnRpdGxlID0gdGV4dDI7XHJcbiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChzdmcyKTtcclxuICAgIH1cclxuXHJcbiAgICBidXR0b24ub25jbGljayA9IHRvZ2dsZTtcclxuXHJcbiAgICByZXR1cm4gYnV0dG9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVJbnB1dChcclxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxyXG4gICAgcGxhY2Vob2xkZXIgPSBcIlwiLFxyXG4gICAgZGVmYXVsdFZhbHVlID0gXCJcIlxyXG4gICk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgdmFyIGVsID0gPEhUTUxJbnB1dEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgICAgXCJpbnB1dFwiLFxyXG4gICAgICBjbGFzc05hbWUsXHJcbiAgICAgIHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gZWw7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIG9wdGlvbnMgPSB7XHJcbiAgcnVubmluZ0luQnJvd3NlcjogdHlwZW9mIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIsXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dEb21SZW5kZXJpbmcoKSB7XHJcbiAgcmV0dXJuIG9wdGlvbnMucnVubmluZ0luQnJvd3NlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluaygpIHtcclxuICBjb25zdCBjb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCBsaW5rID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJzYS1jb21tZXJjaWFsX190ZXh0XCIsIHtcclxuICAgIGhyZWY6IFwiaHR0cHM6Ly93d3cuc3VydmV5anMuaW8vQnV5XCIsXHJcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXHJcbiAgfSk7XHJcbiAgY29uc3QgY29udGFpbmVyU3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiXCIpO1xyXG4gIGNvbnN0IGljb24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KFwibm9uY29tbWVyY2lhbFwiKTtcclxuICBjb25zdCB0ZXh0U3BhbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICBcInNwYW5cIixcclxuICAgIFwic2EtY29tbWVyY2lhbF9fcHJvZHVjdFwiLFxyXG4gICAge1xyXG4gICAgICBpbm5lclRleHQ6IFwiUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgQW5hbHl0aWNzIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcC5cIixcclxuICAgIH1cclxuICApO1xyXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKS5hcHBlbmRDaGlsZChjb250YWluZXJTcGFuKTtcclxuICBjb250YWluZXJTcGFuLmFwcGVuZENoaWxkKGljb24pO1xyXG4gIGNvbnRhaW5lclNwYW4uYXBwZW5kQ2hpbGQodGV4dFNwYW4pO1xyXG4gIHJldHVybiBjb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhSGVscGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHppcEFycmF5cyguLi5hcnJheXM6IGFueVtdKTogYW55W11bXSB7XHJcbiAgICBsZXQgemlwQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB6aXBBcnJheVtpXSA9IFtdO1xyXG4gICAgICBhcnJheXMuZm9yRWFjaCgoYXJyKSA9PiB7XHJcbiAgICAgICAgemlwQXJyYXlbaV0ucHVzaChhcnJbaV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB6aXBBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdW56aXBBcnJheXMoemlwQXJyYXk6IGFueVtdW10pOiBhbnlbXVtdIHtcclxuICAgIGxldCBhcnJheXM6IGFueVtdW10gPSBbXTtcclxuICAgIHppcEFycmF5LmZvckVhY2goKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgIHZhbHVlLmZvckVhY2goKHZhbCwgaikgPT4ge1xyXG4gICAgICAgIGlmICghYXJyYXlzW2pdKSBhcnJheXNbal0gPSBbXTtcclxuICAgICAgICBhcnJheXNbal1baV0gPSB2YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXJyYXlzO1xyXG4gIH1cclxuICBwdWJsaWMgc3RhdGljIHNvcnREaWN0aW9uYXJ5KFxyXG4gICAga2V5czogYW55W10sXHJcbiAgICB2YWx1ZXM6IGFueVtdLFxyXG4gICAgZGVzYzogYm9vbGVhblxyXG4gICk6IHsga2V5czogYW55W10sIHZhbHVlczogYW55W10gfSB7XHJcbiAgICBsZXQgZGljdGlvbmFyeSA9IHRoaXMuemlwQXJyYXlzKGtleXMsIHZhbHVlcyk7XHJcbiAgICBsZXQgY29tcGFyYXRvciA9IChhOiBhbnlbXSwgYjogYW55W10sIGFzYzogYm9vbGVhbiA9IHRydWUpID0+IHtcclxuICAgICAgbGV0IHJlc3VsdCA9IGFbMV0gPCBiWzFdID8gMSA6IGFbMV0gPT0gYlsxXSA/IDAgOiAtMTtcclxuICAgICAgcmV0dXJuIGFzYyA/IHJlc3VsdCA6IHJlc3VsdCAqIC0xO1xyXG4gICAgfTtcclxuICAgIGRpY3Rpb25hcnkuc29ydCgoYTogYW55W10sIGI6IGFueVtdKSA9PiB7XHJcbiAgICAgIHJldHVybiBkZXNjID8gY29tcGFyYXRvcihhLCBiLCBmYWxzZSkgOiBjb21wYXJhdG9yKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQga2V5c0FuZFZhbHVlcyA9IHRoaXMudW56aXBBcnJheXMoZGljdGlvbmFyeSk7XHJcbiAgICByZXR1cm4geyBrZXlzOiBrZXlzQW5kVmFsdWVzWzBdLCB2YWx1ZXM6IGtleXNBbmRWYWx1ZXNbMV0gfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdG9QZXJjZW50YWdlKHZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodmFsdWUgLyBtYXhWYWx1ZSkgKiAxMDA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGlua3NDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImFcIiwgXCJcIiwge1xyXG4gICAgICAgIGlubmVyVGV4dDogbGluay5uYW1lLFxyXG4gICAgICAgIGRvd25sb2FkOiBsaW5rLm5hbWUsXHJcbiAgICAgICAgaHJlZjogbGluay5jb250ZW50LFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gbGlua3NDb250YWluZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbWFnZXNDb250YWluZXIoXHJcbiAgbGlua3M6IEFycmF5PHsgbmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnkgfT5cclxuKTogSFRNTEVsZW1lbnQge1xyXG4gIGNvbnN0IGxpbmtzQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICBsaW5rc0NvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImltZ1wiLCBcIlwiLCB7XHJcbiAgICAgICAgYWx0OiBsaW5rLm5hbWUsXHJcbiAgICAgICAgc3JjOiBsaW5rLmNvbnRlbnQsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG4gIHJldHVybiBsaW5rc0NvbnRhaW5lcjtcclxufVxyXG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuXG5kZWNsYXJlIHR5cGUgVmlzdWFsaXplckNvbnN0cnVjdG9yID0gbmV3IChcbiAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICBvcHRpb25zPzogT2JqZWN0XG4pID0+IGFueTtcblxuLyoqXG4gKiBWaXN1YWxpemVycyByZXBvc2l0b3J5LiBZb3UgbmVlZCB0byByZWdpc3RlciBhIHZpc3VhbGl6ZXIsIGxpbmsgaXQgdG8gdGhlIHF1ZXN0aW9uIHR5cGUgbmFtZSBpbiBvcmRlciB0byB2aXN1YWxpemUgdGhlIHF1ZXN0aW9uIGFuc3dlcnMgd2l0aCB0aGUgY2VydGFpbiByZXByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYW5hZ2VyIHtcbiAgc3RhdGljIGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXI6IGFueSA9IHVuZGVmaW5lZDtcbiAgc3RhdGljIHZpenVhbGl6ZXJzOiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8VmlzdWFsaXplckNvbnN0cnVjdG9yPiB9ID0ge307XG4gIC8qKlxuICAgKiBSZWdpc3RlciB2aXN1YWxpemVyIChjb25zdHJ1Y3RvcikgZm9yIHF1ZXN0aW9uIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyVmlzdWFsaXplcihcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3JcbiAgKSB7XG4gICAgbGV0IHZpc3VhbGl6ZXJzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIudml6dWFsaXplcnNbdHlwZU5hbWVdO1xuICAgIGlmICghdmlzdWFsaXplcnMpIHtcbiAgICAgIHZpc3VhbGl6ZXJzID0gW107XG4gICAgICBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1t0eXBlTmFtZV0gPSB2aXN1YWxpemVycztcbiAgICB9XG4gICAgdmlzdWFsaXplcnMucHVzaChjb25zdHJ1Y3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgdmlzdWFsaXplciAoY29uc3RydWN0b3IpIGZvciBxdWVzdGlvbiB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3JcbiAgKSB7XG4gICAgbGV0IHZpc3VhbGl6ZXJzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIudml6dWFsaXplcnNbdHlwZU5hbWVdO1xuICAgIGlmICghIXZpc3VhbGl6ZXJzKSB7XG4gICAgICBsZXQgaW5kZXggPSB2aXN1YWxpemVycy5pbmRleE9mKGNvbnN0cnVjdG9yKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdmlzdWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgdmlzdWFsaXplciAoY29uc3RydWN0b3IpIGZvciBhbGwgcXVlc3Rpb24gdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVucmVnaXN0ZXJWaXN1YWxpemVyRm9yQWxsKGNvbnN0cnVjdG9yOiBWaXN1YWxpemVyQ29uc3RydWN0b3IpIHtcbiAgICBPYmplY3Qua2V5cyhWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVycykuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgVmlzdWFsaXphdGlvbk1hbmFnZXIudW5yZWdpc3RlclZpc3VhbGl6ZXIoa2V5LCBjb25zdHJ1Y3RvcilcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdmlzdWFsaXplcnMgKGNvbnN0cnVjdG9ycykgZm9yIHF1ZXN0aW9uIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFZpc3VhbGl6ZXJzQnlUeXBlKFxuICAgIHR5cGVOYW1lOiBzdHJpbmdcbiAgKTogVmlzdWFsaXplckNvbnN0cnVjdG9yW10ge1xuICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3R5cGVOYW1lXTtcbiAgICBpZiAoIXZpc3VhbGl6ZXJzKSB7XG4gICAgICByZXR1cm4gW1Zpc3VhbGl6ZXJCYXNlXTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc3VhbGl6ZXJzO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdmlzdWFsaXplcnMgKGNvbnN0cnVjdG9ycykgZm9yIHF1ZXN0aW9uIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIFZpc3VhbGl6YXRpb25NYW5hZ2VyLmFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIgfHwgVmlzdWFsaXplckJhc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHZpc3VhbGl6ZXIgKGNvbnN0cnVjdG9yKSBmb3IgcXVlc3Rpb24gdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJBbHRlcm5hdGl2ZXNWaXN1YWxpemVyKGNvbnN0cnVjdG9yOiBhbnkpIHtcbiAgICBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyID0gY29uc3RydWN0b3I7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIEl0ZW1WYWx1ZSxcbiAgSGVscGVycyxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25QYW5lbCB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbFwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24gZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByb3RlY3RlZCBfbWF0cml4RHJvcGRvd25WaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4RHJvcGRvd25cIik7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmRpc2FibGVMb2NhbGVTd2l0Y2ggPSB0cnVlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMgPSBxdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy52YWx1ZSk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc0xhYmVscyA9IHF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gcm93LnRleHQpO1xuXG4gICAgY29uc3QgaW5uZXJRdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9ucygpO1xuICAgIGNvbnN0IGNhbkdyb3VwQ29sdW1ucyA9IHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNWYWx1ZXMubGVuZ3RoID09IDEgJiYgaW5uZXJRdWVzdGlvbnMuZXZlcnkoaW5uZXJRdWVzdGlvbiA9PiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoaW5uZXJRdWVzdGlvbi5jaG9pY2VzLCAoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5jaG9pY2VzKSk7XG4gICAgaWYgKGNhbkdyb3VwQ29sdW1ucykge1xuICAgICAgdmFyIGNyZWF0b3JzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0VmlzdWFsaXplcnNCeVR5cGUoXCJtYXRyaXhkcm9wZG93bi1ncm91cGVkXCIpO1xuICAgICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyID0gbmV3IGNyZWF0b3JzWzBdKHRoaXMucXVlc3Rpb24sIFtdLCB0aGlzLl9jaGlsZE9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKGlubmVyUXVlc3Rpb25zLCBbXSwgdGhpcy5fY2hpbGRPcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5xdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy50ZXh0KTtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIubG9jYWxlID0gbmV3TG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplcjtcbiAgfVxuXG4gIHByaXZhdGUgb25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpIHtcbiAgICBsZXQgcGFuZWxEYXRhOiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGRhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgcmF3RGF0YUl0ZW0gPSBkYXRhSXRlbVt0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcmF3RGF0YUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXMocmF3RGF0YUl0ZW0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHZhciBuZXN0ZWREYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHJhd0RhdGFJdGVtW2tleV0pO1xuICAgICAgICAgIG5lc3RlZERhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldID0ga2V5O1xuICAgICAgICAgIHBhbmVsRGF0YS5wdXNoKG5lc3RlZERhdGFJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnVwZGF0ZURhdGEocGFuZWxEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIHN1cGVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgdGhpcy51cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXRRdWVzdGlvbnMoKSB7XG4gICAgY29uc3QgbWF0cml4ZHJvcGRvd246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICByZXR1cm4gbWF0cml4ZHJvcGRvd24uY29sdW1ucy5tYXAoXG4gICAgICAoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBjZWxsUXVlc3Rpb246IGFueSA9IGNvbHVtbi50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsUXVlc3Rpb24uY2hvaWNlcykgJiYgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY2VsbFF1ZXN0aW9uLmNob2ljZXMgPSBtYXRyaXhkcm9wZG93bi5jaG9pY2VzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXIuY2xlYXIoKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLnJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25QYW5lbEFmdGVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBWaXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd25cbik7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1wiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWMgZXh0ZW5kcyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdFxuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4RHluYW1pY1wiO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25zKCkge1xuICAgIGNvbnN0IG1hdHJpeGR5bmFtaWM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCA9IDxhbnk+dGhpcy5xdWVzdGlvbjtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IG1hdHJpeGR5bmFtaWMudmlzaWJsZVJvd3M7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gdmlzaWJsZVJvd3NbMF0uY2VsbHMubWFwKGMgPT4gYy5xdWVzdGlvbik7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgVmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWNcbik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBFdmVudCwgUXVlc3Rpb24sIFN1cnZleU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlLCBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24gfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlciB9IGZyb20gXCIuL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciwgY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LCBJU3RhdGUsIElQZXJtaXNzaW9uIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBGaWx0ZXJJbmZvIH0gZnJvbSBcIi4vZmlsdGVySW5mb1wiO1xuaW1wb3J0IHsgTGF5b3V0RW5naW5lLCBNdXVyaUxheW91dEVuZ2luZSB9IGZyb20gXCIuL2xheW91dEVuZ2luZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemF0aW9uUGFuZWwuc2Nzc1wiKTtcblxuY29uc3QgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvblwiO1xuY29uc3QgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWUgPSBcInNhLXF1ZXN0aW9uLWxheW91dGVkXCI7XG5cbmlmICghIWRvY3VtZW50KSB7XG4gIGNvbnN0IHN2Z1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zdmdidW5kbGUuaHRtbFwiKTtcbiAgY29uc3QgdGVtcGxhdGVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wbGF0ZUhvbGRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRlbXBsYXRlSG9sZGVyLmlubmVySFRNTCA9IHN2Z1RlbXBsYXRlO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlSG9sZGVyKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50XG4gIGV4dGVuZHMgSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQge1xuICByZW5kZXJlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uIFBhbmVsIGNvbmZpZ3VyYXRpb24uIFBhc3MgaXQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBgVmlzdWFsaXphdGlvblBhbmVsYCBjb25zdHJ1Y3RvcjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgdml6UGFuZWwgPSBuZXcgU3VydmV5QW5hbHl0aWNzLlZpc3VhbGl6YXRpb25QYW5lbChzdXJ2ZXlRdWVzdGlvbnMsIHN1cnZleVJlc3VsdHMsIHZpelBhbmVsT3B0aW9ucyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9ucyB7XG4gIC8vIEFuIG9iamVjdCBuYW1lZCBhZnRlciBhIHF1ZXN0aW9uIHRoYXQgaXQgY29uZmlndXJlcy5cbiAgLy8gcXVlc3Rpb25OYW1lOiB7XG4gIC8vICAgaW50ZXJ2YWxzOiBbXVxuICAvLyB9LFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGxhYmVsIGNoYXJhY3RlcnMgYWZ0ZXIgd2hpY2ggdHJ1bmNhdGlvbiBzdGFydHMuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIC0xIHRvIGRpc2FibGUgdHJ1bmNhdGlvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMjdcbiAgICovXG4gIGxhYmVsVHJ1bmNhdGVMZW5ndGg/OiBudW1iZXI7XG5cbiAgYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgc2VyaWVzVmFsdWVzPzogc3RyaW5nW107XG4gIHNlcmllc0xhYmVscz86IHN0cmluZ1tdO1xuICB1c2VWYWx1ZXNBc0xhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhc3MgYSBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIHN1cnZleSBsb2NhbGVzIGluIHRoZSBWaXN1YWxpemF0aW9uIFBhbmVsLlxuICAgKi9cbiAgc3VydmV5PzogU3VydmV5TW9kZWw7XG4gIC8qKlxuICAgKiBBIGNvbW1vbiBkYXRhIHByb3ZpZGVyIGZvciBhbGwgdmlzdWFsaXplcnMuXG4gICAqL1xuICBkYXRhUHJvdmlkZXI/OiBEYXRhUHJvdmlkZXI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGluZGl2aWR1YWwgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93SGlkZVF1ZXN0aW9ucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcnJhbmdlIGNoYXJ0cyBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSBhbmQgYWxsb3cgdXNlcnMgdG8gcmVvcmRlciB0aGVtIHZpYSBkcmFnIGFuZCBkcm9wLlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGRpc2FibGVkLCBjaGFydHMgYXJlIGRpc3BsYXllZCBvbmUgdW5kZXIgdGhlIG90aGVyIGFuZCB1c2VycyBjYW5ub3QgcmVvcmRlciB0aGVtLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9BbmFseXRpY3M/aWQ9Y3VzdG9tLWxheW91dCAobGlua1N0eWxlKSlcbiAgICpcbiAgICogQHNlZSBsYXlvdXRFbmdpbmVcbiAgICovXG4gIGFsbG93RHluYW1pY0xheW91dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBIGxheW91dCBlbmdpbmUgdXNlZCB0byBhcnJhbmdlIGNoYXJ0cyBvbiB0aGUgVmlzdWFsaXphdGlvbiBQYW5lbC5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBpbnRlZ3JhdGUgYSB0aGlyZC1wYXJ0eSBsYXlvdXQgZW5naW5lIHdpdGggU3VydmV5SlMgRGFzaGJvYXJkLlxuICAgKlxuICAgKiBAc2VlIGFsbG93RHluYW1pY0xheW91dFxuICAgKi9cbiAgbGF5b3V0RW5naW5lPzogTGF5b3V0RW5naW5lO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHN3aXRjaCBiZXR3ZWVuIGFic29sdXRlIGFuZCBwZXJjZW50YWdlIHZhbHVlcyBpbiBiYXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IFBlcmNlbnRhZ2VzIGJ1dHRvbiB0byBlYWNoIGJhciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dPbmx5UGVyY2VudGFnZXNcbiAgICogQHNlZSBwZXJjZW50YWdlUHJlY2lzaW9uXG4gICAqL1xuICBhbGxvd1Nob3dQZXJjZW50YWdlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBiYXIgY2hhcnRzIGRpc3BsYXkgcGVyY2VudGFnZXMgaW4gYWRkaXRpb24gdG8gYWJzb2x1dGUgdmFsdWVzLlxuICAgKlxuICAgKiBVc2VycyBjYW4gY2hhbmdlIHRoaXMgcHJvcGVydHkgdmFsdWUgaWYgeW91IGVuYWJsZSB0aGUgYGFsbG93U2hvd1BlcmNlbnRhZ2VzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93U2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKiBAc2VlIHBlcmNlbnRhZ2VQcmVjaXNpb25cbiAgICovXG4gIHNob3dQZXJjZW50YWdlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBiYXIgY2hhcnRzIGRpc3BsYXkgb25seSBwZXJjZW50YWdlcywgd2l0aG91dCBhYnNvbHV0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEFwcGxpZXMgb25seSBpZiB0aGUgYGFsbG93U2hvd1BlcmNlbnRhZ2VzYCBvciBgc2hvd1BlcmNlbnRhZ2VzYCBwcm9wZXJ0eSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dTaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBwZXJjZW50YWdlUHJlY2lzaW9uXG4gICAqL1xuICBzaG93T25seVBlcmNlbnRhZ2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBwZXJjZW50YWdlIHByZWNpc2lvbi5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogMFxuICAgKlxuICAgKiBAc2VlIGFsbG93U2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd09ubHlQZXJjZW50YWdlc1xuICAgKi9cbiAgcGVyY2VudGFnZVByZWNpc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIEZyZWUgVHJpYWwgYmFyLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqID4gWW91IGNhbiBlbmFibGUgdGhpcyBwcm9wZXJ0eSBvbmx5IGlmIHlvdSBoYXZlIGEgU3VydmV5SlMgRGFzaGJvYXJkIGNvbW1lcmNpYWwgbGljZW5zZS4gSXQgaXMgaWxsZWdhbCB0byBlbmFibGUgdGhpcyBwcm9wZXJ0eSB3aXRob3V0IGEgbGljZW5zZS5cbiAgICovXG4gIGhhdmVDb21tZXJjaWFsTGljZW5zZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc29ydCBhbnN3ZXJzIGJ5IGFuc3dlciBjb3VudC4gQXBwbGllcyBvbmx5IHRvIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNvcnRpbmcgZHJvcGRvd24gdG8gZWFjaCBiYXIgYW5kIHNjYXR0ZXIgY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKlxuICAgKiBAc2VlIGFuc3dlcnNPcmRlclxuICAgKi9cbiAgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyB0byBzb3J0IGFuc3dlcnMgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICogQWNjZXB0ZWQgdmFsdWVzOlxuICAgKlxuICAgKiAtIGBcImRlZmF1bHRcImAgKGRlZmF1bHQpIC0gRG8gbm90IHNvcnQgYW5zd2Vycy5cbiAgICogLSBgXCJhc2NcImAgLSBTb3J0IGFuc3dlcnMgYnkgYXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICogLSBgXCJkZXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGRlc2NlbmRpbmcgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBVc2VycyBjYW4gY2hhbmdlIHRoaXMgcHJvcGVydHkgdmFsdWUgaWYgeW91IGVuYWJsZSB0aGUgYGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHNlZSBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlclxuICAgKi9cbiAgYW5zd2Vyc09yZGVyPzogXCJkZWZhdWx0XCIgfCBcImFzY1wiIHwgXCJkZXNjXCI7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gaGlkZSBhbnN3ZXJzIHdpdGggemVybyBjb3VudCBpbiBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBIaWRlIEVtcHR5IEFuc3dlcnMgYnV0dG9uIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqL1xuICBhbGxvd0hpZGVFbXB0eUFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogSGlkZXMgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0hpZGVFbXB0eUFuc3dlcnNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqXG4gICAqIEBzZWUgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzXG4gICAqL1xuICBoaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFsbG93cyB1c2VycyB0byBzZWxlY3Qgd2hldGhlciB0byBzaG93IHRvcCA1LCAxMCwgb3IgMjAgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFRvcCBOIEFuc3dlcnMgZHJvcGRvd24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dUb3BOQW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2hvdyB0aGUgbnVtYmVyIG9mIHJlc3BvbmRlbnRzIHdobyBkaWQgbm90IGFuc3dlciBhIHBhcnRpY3VsYXIgcXVlc3Rpb24uXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFNob3cgTWlzc2luZyBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAqL1xuICBhbGxvd1Nob3dNaXNzaW5nQW5zd2Vycz86IGJvb2xlYW47XG5cbiAgYWxsb3dFeHBlcmltZW50YWxGZWF0dXJlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZWZhdWx0IGNoYXJ0IHR5cGUuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlcyBkZXBlbmQgb24gdGhlIHF1ZXN0aW9uIHR5cGUgYXMgZm9sbG93czpcbiAgICpcbiAgICogLSBCb29sZWFuOiBgXCJiYXJcImAgfCBgXCJwaWVcImAgfCBgXCJkb3VnaG51dFwiYFxuICAgKiAtIERhdGUsIE51bWJlcjogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYFxuICAgKiAtIE1hdHJpeDogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImAgfCBgXCJzdGFja2VkYmFyXCJgXG4gICAqIC0gUmF0aW5nOiBgXCJiYXJcImAgfCBgXCJzY2F0dGVyXCJgIHwgYFwiZ2F1Z2VcImAgfCBgXCJidWxsZXRcImBcbiAgICogLSBSYWRpb2dyb3VwLCBDaGVja2JveCwgRHJvcGRvd24sIEltYWdlIFBpY2tlcjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImAgfCBgXCJzY2F0dGVyXCJgXG4gICAqXG4gICAqIFRvIHNldCBhIHR5cGUgZm9yIGFuIGluZGl2aWR1YWwgY2hhcnQsIGFjY2VzcyB0aGlzIGNoYXJ0IGluIHRoZSBgdmlzdWFsaXplcnNgIGFycmF5IGFuZCBzZXQgaXRzIGBjaGFydFR5cGVgIHByb3BlcnR5IHRvIG9uZSBvZiB0aGUgdmFsdWVzIGRlc2NyaWJlZCBhYm92ZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3Qgdml6UGFuZWwgPSBuZXcgU3VydmV5QW5hbHl0aWNzLlZpc3VhbGl6YXRpb25QYW5lbCggLi4uICk7XG4gICAqIHZpelBhbmVsLnZpc3VhbGl6ZXJzWzBdLmNoYXJ0VHlwZSA9IFwic3RhY2tlZGJhclwiO1xuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGRlZmF1bHRDaGFydFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gdHJhbnNwb3NlIGEgdmlzdWFsaXplZCBtYXRyaXggcXVlc3Rpb24uXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgYWRkcyBhIFRyYW5zcG9zZSBidXR0b24gdG8gY2hhcnRzIHRoYXQgdmlzdWFsaXplIG1hdHJpeGVzLiBXaGVuIHVzZXJzIHNlbGVjdCBQZXIgVmFsdWVzLCBtYXRyaXggcm93cyBnbyB0byBjaGFydCBhcmd1bWVudHMgYW5kIG1hdHJpeCBjb2x1bW5zIGZvcm0gY2hhcnQgc2VyaWVzLiBXaGVuIHVzZXJzIHNlbGVjdCBQZXIgQ29sdW1ucywgbWF0cml4IHJvd3MgZm9ybSBjaGFydCBzZXJpZXMgYW5kIG1hdHJpeCBjb2x1bW5zIGdvIHRvIGNoYXJ0IGFyZ3VtZW50cy5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dUcmFuc3Bvc2VEYXRhPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFsbG93cyB1c2VycyB0byBjcm9zcy1maWx0ZXIgY2hhcnRzLiBUaGUgZmlsdGVyIGFwcGxpZXMgd2hlbiB1c2VycyBzZWxlY3QgYSBzZXJpZXMgcG9pbnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGB0cnVlYFxuICAgKi9cbiAgYWxsb3dTZWxlY3Rpb24/OiBib29sZWFuO1xuXG4gIHJlbmRlckNvbnRlbnQ/OiBGdW5jdGlvbjtcbiAgZGVzdHJveUNvbnRlbnQ/OiBGdW5jdGlvbjtcblxuICAvKipcbiAgICogUmVtb3ZlcyBIVE1MIHRhZ3MgZnJvbSBzdXJ2ZXkgZWxlbWVudCB0aXRsZXMuXG4gICAqXG4gICAqIFN1cnZleSBlbGVtZW50IHRpdGxlcyBjYW4gY29udGFpbiBIVE1MIG1hcmt1cCBhbmQgYXJlIHNwZWNpZmllZCBieSB1c2Vycy4gQW4gYXR0YWNrZXIgY2FuIGluamVjdCBtYWxpY2lvdXMgY29kZSBpbnRvIHRoZSB0aXRsZXMuIFRvIGd1YXJkIGFnYWluc3QgaXQsIGtlZXAgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIHN0cmlwSHRtbEZyb21UaXRsZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFZpc3VhbGl6YXRpb25QYW5lbCBpcyByZXNwb25zaWJsZSBmb3IgdmlzdWFsaXppbmcgYW4gYXJyYXkgb2Ygc3VydmV5IHF1ZXN0aW9uc1xuICogPGJyLz5cbiAqIDxici8+IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnM6XG4gKiA8YnIvPiBxdWVzdGlvbnMgLSBhbiBhcnJheSBvZiBzdXJ2ZXkgcXVlc3Rpb25zIHRvIHZpc3VhbGl6ZSxcbiAqIDxici8+IGRhdGEgLSBhbiBhcnJheSBvZiBhbnN3ZXJzIGluIGZvcm1hdCBvZiBzdXJ2ZXkgcmVzdWx0LFxuICogPGJyLz4gb3B0aW9ucyAtIG9iamVjdCBvZiB0aGUgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnMgdHlwZSwgQHNlZSBJVmlzdWFsaXphdGlvblBhbmVsT3B0aW9uc1xuICogPGJyLz4gZWxlbWVudHMgLSBsaXN0IG9mIHZpc3VhbCBlbGVtZW50IGRlc2NyaXB0aW9uc1xuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25QYW5lbCBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBoYXZlQ29tbWVyY2lhbExpY2Vuc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHZpc3VhbGl6ZXJzOiBBcnJheTxWaXN1YWxpemVyQmFzZT4gPSBbXTtcbiAgcHJpdmF0ZSBoYXZlQ29tbWVyY2lhbExpY2Vuc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZW5kZXJlZFF1ZXN0aW9uc0NvdW50OiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25zOiBBcnJheTxhbnk+LFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnMgPSB7fSxcbiAgICBwcml2YXRlIF9lbGVtZW50czogQXJyYXk8SVZpc3VhbGl6ZXJQYW5lbFJlbmRlcmVkRWxlbWVudD4gPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIobnVsbCwgZGF0YSwgb3B0aW9ucywgXCJwYW5lbFwiKTtcblxuICAgIHRoaXMuX2xheW91dEVuZ2luZSA9XG4gICAgICBvcHRpb25zLmxheW91dEVuZ2luZSB8fFxuICAgICAgbmV3IE11dXJpTGF5b3V0RW5naW5lKFxuICAgICAgICB0aGlzLmFsbG93RHluYW1pY0xheW91dCxcbiAgICAgICAgXCIuXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZVxuICAgICAgKTtcbiAgICB0aGlzLl9sYXlvdXRFbmdpbmUub25Nb3ZlQ2FsbGJhY2sgPSAoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHRoaXMubW92ZVZpc2libGVFbGVtZW50KGZyb21JbmRleCwgdG9JbmRleCk7XG5cbiAgICB0aGlzLnNob3dIZWFkZXIgPSB0cnVlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VydmV5KSB7XG4gICAgICBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSA9IHRoaXMub3B0aW9ucy5zdXJ2ZXkubG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChfZWxlbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZWxlbWVudHMgPSB0aGlzLmJ1aWxkRWxlbWVudHMocXVlc3Rpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSA9XG4gICAgICBWaXN1YWxpemF0aW9uUGFuZWwuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlIHx8XG4gICAgICAodHlwZW9mIG9wdGlvbnMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2VcbiAgICAgICAgOiBmYWxzZSk7XG5cbiAgICB0aGlzLmJ1aWxkVmlzdWFsaXplcnMocXVlc3Rpb25zKTtcbiAgICBpZiAoIXRoaXMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjb21tZXJjaWFsTGljZW5zZVwiLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVDb21tZXJjaWFsTGljZW5zZUxpbmsoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcInJlc2V0RmlsdGVyXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UgfHwgdmlzdWFsaXplciBpbnN0YW5jZW9mIEFsdGVybmF0aXZlVmlzdWFsaXplcnNXcmFwcGVyKSB7XG4gICAgICAgICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbih1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVzZXRGaWx0ZXJcIikpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiYWRkRWxlbWVudFwiLCAodG9vbGJhcjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICBsZXQgYWRkRWxlbWVudFNlbGVjdG9yOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlciA9IChcbiAgICAgICAgICBwYW5lbDogVmlzdWFsaXphdGlvblBhbmVsLFxuICAgICAgICAgIG9wdGlvbnM6IGFueVxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBoaWRkZW5FbGVtZW50cyA9IHRoaXMuaGlkZGVuRWxlbWVudHM7XG4gICAgICAgICAgaWYgKGhpZGRlbkVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIDxhbnk+e1xuICAgICAgICAgICAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRFbGVtZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuY29uY2F0KGhpZGRlbkVsZW1lbnRzKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAob3B0aW9uOiBhbnkpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoYWRkRWxlbWVudFNlbGVjdG9yICYmXG4gICAgICAgICAgICAgIHRvb2xiYXIucmVwbGFjZUNoaWxkKHNlbGVjdFdyYXBwZXIsIGFkZEVsZW1lbnRTZWxlY3RvcikpIHx8XG4gICAgICAgICAgICAgIHRvb2xiYXIuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgPSBzZWxlY3RXcmFwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRFbGVtZW50U2VsZWN0b3IgJiYgdG9vbGJhci5yZW1vdmVDaGlsZChhZGRFbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlcih0aGlzLCB7fSk7XG4gICAgICAgIHRoaXMub25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkLmFkZChhZGRFbGVtZW50U2VsZWN0b3JVcGRhdGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsZVN3aXRjaCAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbG9jYWxlQ2hvaWNlcyA9IHRoaXMubG9jYWxlcy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogZWxlbWVudCxcbiAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKGVsZW1lbnQpXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIC8vIGxvY2FsZUNob2ljZXMudW5zaGlmdCh7XG4gICAgICAvLyAgIHZhbHVlOiBcIlwiLFxuICAgICAgLy8gICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhbmdlTG9jYWxlXCIpLFxuICAgICAgLy8gfSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VMb2NhbGVcIiwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IobG9jYWxlQ2hvaWNlcyxcbiAgICAgICAgICAob3B0aW9uOiBhbnkpID0+ICEhb3B0aW9uLnZhbHVlICYmIHRoaXMubG9jYWxlID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgICAgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdmFyIG5ld0xvY2FsZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayA9IChcbiAgICBzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLFxuICAgIG9wdGlvbnM6IGFueVxuICApID0+IHtcbiAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25zQ291bnQrKztcbiAgICBpZiAodGhpcy5yZW5kZXJlZFF1ZXN0aW9uc0NvdW50ID09IHRoaXMucXVlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uc0NvdW50ID0gMDtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIHNob3dFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVzdGlvbkVsZW1lbnQgPSB0aGlzLnJlbmRlclBhbmVsRWxlbWVudChcbiAgICAgIGVsZW1lbnQsXG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXJcbiAgICApO1xuICAgIHRoaXMubGF5b3V0RW5naW5lLmFkZChbcXVlc3Rpb25FbGVtZW50XSwgeyBpbmRleDogZWxlbWVudEluZGV4IH0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50LCBcIkFEREVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIGlmICghIWVsZW1lbnQucmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxheW91dEVuZ2luZS5yZW1vdmUoW2VsZW1lbnQucmVuZGVyZWRFbGVtZW50XSk7XG4gICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIucmVtb3ZlQ2hpbGQoZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5yZW5kZXJlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50LCBcIlJFTU9WRURcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSB7XG4gICAgZWxlbWVudC5pc1B1YmxpYyA9IGZhbHNlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlRWxlbWVudFB1YmxpYyhlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkge1xuICAgIGVsZW1lbnQuaXNQdWJsaWMgPSB0cnVlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb3ZlVmlzaWJsZUVsZW1lbnQoXG4gICAgZnJvbVZpc2libGVJbmRleDogbnVtYmVyLFxuICAgIHRvVmlzaWJsZUluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IGZyb21JbmRleCwgdG9JbmRleDtcblxuICAgIGxldCBmcm9tVmlzaWJsZUluZGV4RWxlbWVudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzW2Zyb21WaXNpYmxlSW5kZXhdO1xuICAgIGxldCB0b1Zpc2libGVJbmRleEVsZW1lbnQgPSB0aGlzLnZpc2libGVFbGVtZW50c1t0b1Zpc2libGVJbmRleF07XG5cbiAgICBmcm9tSW5kZXggPSB0aGlzLl9lbGVtZW50cy5pbmRleE9mKGZyb21WaXNpYmxlSW5kZXhFbGVtZW50KTtcbiAgICB0b0luZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZih0b1Zpc2libGVJbmRleEVsZW1lbnQpO1xuXG4gICAgdGhpcy5tb3ZlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVFbGVtZW50KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLl9lbGVtZW50cy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICB0aGlzLl9lbGVtZW50cy5zcGxpY2UodG9JbmRleCwgMCwgZWxlbWVudHNbMF0pO1xuICAgIHRoaXMudmlzaWJsZUVsZW1lbnRzQ2hhbmdlZChlbGVtZW50c1swXSwgXCJNT1ZFRFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKGNvbG9yKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godmlzdWFsaXplciA9PiB2aXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWaXN1YWxpemVycyhxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPikge1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuY3JlYXRlVmlzdWFsaXplcihxdWVzdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmFsbG93SGlkZVF1ZXN0aW9ucykge1xuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJyZW1vdmVRdWVzdGlvblwiLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZUJ1dHRvbigoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUVsZW1lbnQocXVlc3Rpb24ubmFtZSksIDApO1xuICAgICAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlQnV0dG9uXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUpIHtcbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwibWFrZVByaXZhdGVQdWJsaWNcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGVsZW1lbnQuaXNQdWJsaWMgPyBcImZpcnN0XCIgOiBcInNlY29uZFwiO1xuXG4gICAgICAgICAgY29uc3QgcGF0aE1ha2VQcml2YXRlU3ZnID0gXCJtYWtlcHJpdmF0ZVwiO1xuICAgICAgICAgIGNvbnN0IHBhdGhNYWtlUHVibGljU3ZnID0gXCJtYWtlcHVibGljXCI7XG4gICAgICAgICAgY29uc3QgbWFrZVByaXZhdGVUaXRsZSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYWtlUHJpdmF0ZUJ1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBtYWtlUHVibGljVGl0bGUgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWFrZVB1YmxpY0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCBkb1ByaXZhdGUgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFrZUVsZW1lbnRQcml2YXRlKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRvUHVibGljID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm1ha2VFbGVtZW50UHVibGljKGVsZW1lbnQpLCAwKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVN2Z1RvZ2dsZUJ1dHRvbihcbiAgICAgICAgICAgIHBhdGhNYWtlUHVibGljU3ZnLFxuICAgICAgICAgICAgcGF0aE1ha2VQcml2YXRlU3ZnLFxuICAgICAgICAgICAgbWFrZVByaXZhdGVUaXRsZSxcbiAgICAgICAgICAgIG1ha2VQdWJsaWNUaXRsZSxcbiAgICAgICAgICAgIGRvUHVibGljLFxuICAgICAgICAgICAgZG9Qcml2YXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpc3VhbGl6ZXIuc3VwcG9ydFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCB2aXN1YWxpemVyV2l0aFNlbGVjdGlvbiA9IDxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+KFxuICAgICAgICAgICg8YW55PnZpc3VhbGl6ZXIpXG4gICAgICAgICk7XG4gICAgICAgIGxldCBmaWx0ZXJJbmZvID0gbmV3IEZpbHRlckluZm8odmlzdWFsaXplcldpdGhTZWxlY3Rpb24pO1xuXG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcInF1ZXN0aW9uRmlsdGVySW5mb1wiLCAoKSA9PiB7XG4gICAgICAgICAgZmlsdGVySW5mby51cGRhdGUodmlzdWFsaXplcldpdGhTZWxlY3Rpb24uc2VsZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gZmlsdGVySW5mby5odG1sRWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmlzdWFsaXplcldpdGhTZWxlY3Rpb24ub25EYXRhSXRlbVNlbGVjdGVkID0gKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWU6IGFueSxcbiAgICAgICAgICBzZWxlY3RlZFRleHQ6IHN0cmluZ1xuICAgICAgICApID0+IHtcbiAgICAgICAgICBmaWx0ZXJJbmZvLnVwZGF0ZSh7IHZhbHVlOiBzZWxlY3RlZFZhbHVlLCB0ZXh0OiBzZWxlY3RlZFRleHQgfSk7XG4gICAgICAgICAgdGhpcy5zZXRGaWx0ZXIocXVlc3Rpb24ubmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmxheW91dCgpO1xuICAgICAgdmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKTtcbiAgICAgIHRoaXMudmlzdWFsaXplcnMucHVzaCh2aXN1YWxpemVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVZpc3VhbGl6ZXJzKCkge1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vblVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2aXN1YWxpemVyIGluc3RhbmNlb2YgU2VsZWN0QmFzZSkge1xuICAgICAgICB2aXN1YWxpemVyLm9uRGF0YUl0ZW1TZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayk7XG4gICAgICB2aXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzID0gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgKHRoaXMucXVlc3Rpb25zIHx8IFtdKS5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChxdWVzdGlvbi5uYW1lKTtcbiAgICAgIGlmICghIWVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5kaXNwbGF5TmFtZSA9IHRoaXMucHJvY2Vzc1RleHQocXVlc3Rpb24udGl0bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCh2ID0+IHtcbiAgICAgIHYub3B0aW9ucy5zZXJpZXNMYWJlbHMgPSB0aGlzLm9wdGlvbnMuc2VyaWVzTGFiZWxzO1xuICAgICAgdi5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgfSk7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHRoaXMuc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgVmlzdWFsaXphdGlvblBhbmVsIGFsbG93cyBkeW5hbWljIGxheW91dGluZyAtIHJlYXJyYW5nZSBpdGVtcyB2aWEgZHJhcC9kcm9wLiBTZXQgdmlhIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93RHluYW1pY0xheW91dCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dEeW5hbWljTGF5b3V0ID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFZpc3VhbGl6YXRpb25QYW5lbCBhbGxvd3MgdG8gaGlkZS9zaG93IGluZGl2aWR1YWwgaW5uZXIgdmlzdWFsaXplcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93SGlkZVF1ZXN0aW9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93SGlkZVF1ZXN0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLm9wdGlvbnMuYWxsb3dIaWRlUXVlc3Rpb25zID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFZpc3VhbGl6YXRpb25QYW5lbCBhbGxvd3MgdG8gbWFrZSBwcml2YXRlL3B1YmxpYyBpbmRpdmlkdWFsIGlubmVyIHZpc3VhbGl6ZXJzIGZvciB3b3JrIHdpdGggcGVybWlzc2lvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd01ha2VRdWVzdGlvbnNQcml2YXRlID09PSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGF5b3V0RW5naW5lOiBMYXlvdXRFbmdpbmU7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZW5naW5lIGluc3RhbmNlIGlmIGFueS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbGF5b3V0RW5naW5lKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXRFbmdpbmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRFbGVtZW50cyhxdWVzdGlvbnM6IGFueVtdKTogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIChxdWVzdGlvbnMgfHwgW10pLm1hcCgocXVlc3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLnByb2Nlc3NUZXh0KHF1ZXN0aW9uLnRpdGxlKSxcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBpc1B1YmxpYzogdHJ1ZSxcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhbmVsIGVsZW1lbnRzIGRlc2NyaXB0aW9ucyBhcnJheS5cbiAgICogSW5uZXIgdmlzdWFsaXplcnMgYXJlIHJlbmRlcmVkIGluIHRoZSBvcmRlciBvZiB0aGlzIGFycmF5IGFuZCB3aXRoIHRpdGxlcyBmcm9tIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRzKCk6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIHJldHVybiAodGhpcy5fZWxlbWVudHMgfHwgW10pLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZWxlbWVudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgaXNWaXNpYmxlOiBlbGVtZW50LmlzVmlzaWJsZSxcbiAgICAgICAgaXNQdWJsaWM6IGVsZW1lbnQuaXNQdWJsaWMsXG4gICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYW5lbCdzIHZpc2libGUgZWxlbWVudHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzVmlzaWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYW5lbCdzIGhpZGRlbiBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZGVuRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcihcbiAgICAgIChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+ICFlbC5pc1Zpc2libGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFuZWwncyBwdWJsaWMgZWxlbWVudHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHB1YmxpY0VsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gZWwuaXNQdWJsaWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFuZWwncyBwcml2YXRlIGVsZW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldCBwcml2YXRlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiAhZWwuaXNQdWJsaWMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBsb2NhbGVzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VydmV5KSByZXR1cm4gdGhpcy5vcHRpb25zLnN1cnZleS5nZXRVc2VkTG9jYWxlcygpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhbmVsIGVsZW1lbnQgZGVzY3JpcHRpb24gYnkgdGhlIHF1ZXN0aW9uIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbCkgPT4gZWwubmFtZSA9PT0gbmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYW5lbCBlbGVtZW50IHZpc3VhbGl6ZXIgYnkgdGhlIHF1ZXN0aW9uIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlzdWFsaXplcih2aXN1YWxpemVyTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2LnF1ZXN0aW9uLm5hbWUgPT09IHZpc3VhbGl6ZXJOYW1lKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGVsZW1lbnQgdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiBvcHRpb25zOlxuICAgKiBlbGVtZW50cyAtIHBhbmVsIGVsZW1lbnRzIGFycmF5XG4gICAqIGNoYW5nZWQgLSBjaGFuZ2VkIGVsZW1lbnRcbiAgICogcmVhc29uIC0gcmVhc29uIChzdHJpbmcpIHdoeSBldmVudCBmaXJlZDogXCJBRERFRFwiLCBcIk1PVkVEXCIgb3IgXCJSRU1PVkVEXCJcbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVFbGVtZW50c0NoYW5nZWQgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgcHJvdGVjdGVkIHZpc2libGVFbGVtZW50c0NoYW5nZWQoXG4gICAgZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQsXG4gICAgcmVhc29uOiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uVmlzaWJsZUVsZW1lbnRzQ2hhbmdlZC5pc0VtcHR5KSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUVsZW1lbnRzQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgZWxlbWVudHM6IHRoaXMuX2VsZW1lbnRzLFxuICAgICAgICBjaGFuZ2VkOiBlbGVtZW50LFxuICAgICAgICByZWFzb246IHJlYXNvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkLmZpcmUodGhpcywgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHZpenVhbGl6YXRpb24gcGFuZWwgc3RhdGUgY2hhbmdlZC5cbiAgICogc2VuZGVyIC0gdGhpcyBwYW5lbFxuICAgKiBzdGF0ZSAtIG5ldyBzdGF0ZSBvZiB0aGUgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemF0aW9uUGFuZWwsIHN0YXRlOiBJU3RhdGUpID0+IGFueSxcbiAgICBWaXN1YWxpemF0aW9uUGFuZWwsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBwZXJtaXNzaW9ucyBjaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgb25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjazogYW55O1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGdpdmVuIHBhbmVsIGVsZW1lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyUGFuZWxFbGVtZW50KFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICApIHtcbiAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5nZXRWaXN1YWxpemVyKGVsZW1lbnQubmFtZSk7XG5cbiAgICBjb25zdCBxdWVzdGlvbkVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHF1ZXN0aW9uRWxlbWVudCk7XG5cbiAgICBjb25zdCBxdWVzdGlvbkNvbnRlbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJoM1wiKTtcbiAgICBjb25zdCB2aXp1YWxpemVyRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0ID0gZWxlbWVudC5kaXNwbGF5TmFtZTtcblxuICAgIHF1ZXN0aW9uRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLmFsbG93RHluYW1pY0xheW91dFxuICAgICAgPyBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIiBcIiArIHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lXG4gICAgICA6IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZTtcbiAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lID0gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCJfX3RpdGxlXCI7XG4gICAgaWYgKHRoaXMuYWxsb3dEeW5hbWljTGF5b3V0KSB7XG4gICAgICB0aXRsZUVsZW1lbnQuY2xhc3NOYW1lID1cbiAgICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSArXG4gICAgICAgIFwiIFwiICtcbiAgICAgICAgcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICtcbiAgICAgICAgXCJfX3RpdGxlLS1kcmFnZ2FibGVcIjtcbiAgICB9XG4gICAgcXVlc3Rpb25Db250ZW50LmNsYXNzTmFtZSA9IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArIFwiX19jb250ZW50XCI7XG4gICAgcXVlc3Rpb25Db250ZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgcXVlc3Rpb25Db250ZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XG4gICAgcXVlc3Rpb25Db250ZW50LmFwcGVuZENoaWxkKHZpenVhbGl6ZXJFbGVtZW50KTtcbiAgICBxdWVzdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocXVlc3Rpb25Db250ZW50KTtcblxuICAgIHZpc3VhbGl6ZXIucmVuZGVyKHZpenVhbGl6ZXJFbGVtZW50KTtcblxuICAgIGVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gcXVlc3Rpb25FbGVtZW50O1xuICAgIHJldHVybiBxdWVzdGlvbkVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSBcIiBzYS1wYW5lbF9faGVhZGVyXCI7XG4gICAgc3VwZXIucmVuZGVyVG9vbGJhcihjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYWxsIHF1ZXN0aW9ucyBpbnRvIGdpdmVuIEhUTUwgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqIGNvbnRhaW5lciAtIEhUTUwgZWxlbWVudCB0byByZW5kZXIgdGhlIHBhbmVsXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSArPSBcIiBzYS1wYW5lbF9fY29udGVudCBzYS1ncmlkXCI7XG5cbiAgICB0aGlzLnZpc2libGVFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoZWxlbWVudCwgY29udGFpbmVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RW5naW5lLnN0YXJ0KGNvbnRhaW5lcik7XG4gICAgLy8gISF3aW5kb3cgJiYgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFVJRXZlbnQoXCJyZXNpemVcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHZpc3VhbGl6ZXIgYW5kIGFsbCBpbm5lciBjb250ZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS5zdG9wKCk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXdzIHZpc3VhbGl6ZXIgdG9vYmFyIGFuZCBhbGwgaW5uZXIgY29udGVudC5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCkge1xuICAgIGlmICghIXRoaXMudG9vbGJhckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgdGhpcy5yZW5kZXJUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgfVxuICAgIHN1cGVyLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGxheW91dCBvZiB2aXN1YWxpemVyIGlubmVyIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgbGF5b3V0KCkge1xuICAgIHRoaXMubGF5b3V0RW5naW5lLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZmlsdGVyIGJ5IHF1ZXN0aW9uIG5hbWUgYW5kIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcihxdWVzdGlvbk5hbWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhUHJvdmlkZXIuc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZSwgc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB2aXp1YWxpemF0aW9uIHBhbmVsIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGF0ZSgpOiBJU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgZWxlbWVudHM6IFtdLmNvbmNhdCh0aGlzLl9lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0YXRlID0geyAuLi5lbGVtZW50LCAuLi52aXN1YWxpemVyPy5nZXRTdGF0ZSgpIH07XG4gICAgICAgIGlmIChlbGVtZW50U3RhdGUucmVuZGVyZWRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgZWxlbWVudFN0YXRlLnJlbmRlcmVkRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFN0YXRlO1xuICAgICAgfSkpLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdml6dWFsaXphdGlvbiBwYW5lbCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzZXQgc3RhdGUobmV3U3RhdGU6IElTdGF0ZSkge1xuICAgIGlmICghbmV3U3RhdGUpIHJldHVybjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld1N0YXRlLmVsZW1lbnRzKSkge1xuICAgICAgY29uc3QgcXVlc3Rpb25OYW1lcyA9IHRoaXMucXVlc3Rpb25zLm1hcChxID0+IHEubmFtZSk7XG4gICAgICB0aGlzLl9lbGVtZW50cyA9IFtdLmNvbmNhdChuZXdTdGF0ZS5lbGVtZW50cy5maWx0ZXIoZSA9PiAocXVlc3Rpb25OYW1lcy5pbmRleE9mKGUubmFtZSkgIT09IC0xKSkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3U3RhdGUubG9jYWxlICE9PSBcInVuZGVmaW5lZFwiKSB0aGlzLnNldExvY2FsZShuZXdTdGF0ZS5sb2NhbGUpO1xuXG4gICAgdGhpcy5fZWxlbWVudHMuZm9yRWFjaChlbGVtZW50U3RhdGUgPT4ge1xuICAgICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50U3RhdGUubmFtZSk7XG4gICAgICBpZiAodmlzdWFsaXplciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIuc2V0U3RhdGUoZWxlbWVudFN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdml6dWFsaXphdGlvbiBwYW5lbCBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnMoKTogSVBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIDxhbnk+dGhpcy5fZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB2aXp1YWxpemF0aW9uIHBhbmVsIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgcHVibGljIHNldCBwZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogSVBlcm1pc3Npb25bXSkge1xuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBpZiAocGVybWlzc2lvbi5uYW1lID09PSBlbGVtZW50Lm5hbWUpXG4gICAgICAgICAgZWxlbWVudC5pc1B1YmxpYyA9IHBlcm1pc3Npb24uaXNQdWJsaWM7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgLi4uZWxlbWVudCB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2VsZW1lbnRzID0gW10uY29uY2F0KHVwZGF0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmRlc3Ryb3lWaXN1YWxpemVycygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uUGFuZWxcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLCBJUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByb3RlY3RlZCBfcGFuZWxWaXN1YWxpemVyOiBWaXN1YWxpemF0aW9uUGFuZWwgPSB1bmRlZmluZWQ7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJwYW5lbER5bmFtaWNcIik7XG4gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9IGZhbHNlO1xuICAgIG9wdGlvbnMuZGF0YVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemF0aW9uUGFuZWwoXG4gICAgICB0aGlzLmdldFF1ZXN0aW9ucygpLFxuICAgICAgW10sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5hZGQodGhpcy5vbkFmdGVyUmVuZGVyUGFuZWxDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gIH1cblxuICBwcml2YXRlIG9uQWZ0ZXJSZW5kZXJQYW5lbENhbGxiYWNrID0gKCkgPT4ge1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIFwicGFuZWxEeW5hbWljXCI7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKSB7XG4gICAgbGV0IHBhbmVsRGF0YTogQXJyYXk8YW55PiA9IFtdO1xuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChkYXRhSXRlbSkgPT4ge1xuICAgICAgaWYgKGRhdGFJdGVtW3RoaXMucXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYW5lbERhdGEgPSBwYW5lbERhdGEuY29uY2F0KGRhdGFJdGVtW3RoaXMucXVlc3Rpb24ubmFtZV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci51cGRhdGVEYXRhKHBhbmVsRGF0YSk7XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIHRoaXMudXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCk7XG4gICAgc3VwZXIub25EYXRhQ2hhbmdlZCgpO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25zKCk6IElRdWVzdGlvbltdIHtcbiAgICBjb25zdCBwYW5lbGR5bmFtaWM6IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgPSA8YW55PnRoaXMucXVlc3Rpb247XG4gICAgcmV0dXJuIHBhbmVsZHluYW1pYy50ZW1wbGF0ZS5xdWVzdGlvbnM7XG4gIH1cblxuICBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLmNsZWFyKCk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5yZW5kZXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyUmVuZGVyUGFuZWxDYWxsYmFjayk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFxuICBcInBhbmVsZHluYW1pY1wiLFxuICBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljXG4pO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uQ29tbWVudE1vZGVsLCBzZXR0aW5ncyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSURhdGFJbmZvLCBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi9kYXRhUHJvdmlkZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJGYWN0b3J5IH0gZnJvbSBcIi4vdmlzdWFsaXplckZhY3RvcnlcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbnZhciBzdHlsZXMgPSByZXF1aXJlKFwiLi92aXN1YWxpemVyQmFzZS5zY3NzXCIpO1xuXG4vKipcbiAqIFZpc3VhbGl6ZXJCYXNlIGlzIGEgYmFzZSBvYmplY3QgZm9yIGFsbCB2aXN1emxpemVycy4gSXQgcmVzcG9uc2libGUgZm9yIHRoZSByZW5kZXJpbmcgYW5kIGRlc3Ryb3lpbmcgdmlzdWFsaXplci5cbiAqXG4gKiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzOlxuICogcXVlc3Rpb24gLSBhIHN1cnZleSBxdWVzdGlvbiB0byB2aXN1YWxpemUsXG4gKiBkYXRhIC0gYW4gYXJyYXkgb2YgYW5zd2VycyBpbiBmb3JtYXQgb2Ygc3VydmV5IHJlc3VsdCxcbiAqIG9wdGlvbnMgLSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnMsXG4gKiBuYW1lIC0gdmlzdWFsaXplciBuYW1lXG4gKlxuICogb3B0aW9uczpcbiAqIHNlcmllc1ZhbHVlcyAtIGFuIGFycmF5IG9mIHNlcmllcyB2YWx1ZXMgaW4gZGF0YSB0byBncm91cCBkYXRhIGJ5IHNlcmllcyxcbiAqIHNlcmllc0xhYmVscyAtIGxhYmVscyBmb3Igc2VyaWVzIHRvIGRpc3BsYXksIGlmIG5vdCBwYXNzZWQgdGhlIHNlcmllc1ZhbHVlcyBhcmUgdXNlZCBhcyBsYWJlbHMsXG4gKiBzdXJ2ZXkgLSBwYXNzIHN1cnZleSBpbnN0YW5jZSB0byB1c2UgbG9jYWxzZXMgZnJvbSB0aGUgc3VydmV5IEpTT04sXG4gKiBkYXRhUHJvdmlkZXIgLSBkYXRhUHJvdmlkZXIgZm9yIHRoaXMgdmlzdWFsaXplcixcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyQmFzZSBpbXBsZW1lbnRzIElEYXRhSW5mbyB7XG4gIHByaXZhdGUgX3Nob3dIZWFkZXIgPSB0cnVlO1xuICBwcml2YXRlIF9mb290ZXJWaXN1YWxpemVyOiBWaXN1YWxpemVyQmFzZSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsYWJlbFRydW5jYXRlTGVuZ3RoOiBudW1iZXIgPSAyNztcbiAgcHJvdGVjdGVkIHJlbmRlclJlc3VsdDogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB0b29sYmFyQ29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGhlYWRlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBjb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZvb3RlckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfc3VwcG9ydFNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBwdWJsaWMgc3RhdGljIG90aGVyQ29tbWVudFF1ZXN0aW9uVHlwZSA9IFwiY29tbWVudFwiOyAvLyBUT0RPOiBtYWtlIGl0IGNvbmZpZ3VyZWFibGUgLSBhbGxvdyBjaG9vc2Ugd2hhdCBraW5kIG9mIHF1ZXN0aW9uL3Zpc3VhbGl6ZXIgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cy9vdGhlcnNcbiAgcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRDb2xsYXBzZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSB2aXN1YWxpemVyJ3MgY29udGVudCBpcyByZW5kZXJlZCBpbiBET00uXG4gICAqKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6ZXJCYXNlLCBhbnk+KCk7XG5cbiAgcHJvdGVjdGVkIGFmdGVyUmVuZGVyKGNvbnRlbnRDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyLmZpcmUodGhpcywgeyBodG1sRWxlbWVudDogY29udGVudENvbnRhaW5lciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHZpc3VhbGl6ZXIgbG9jYWxlIGNoYW5nZWQuXG4gICAqIHNlbmRlciAtIHRoaXMgdmlzdWFsaXplclxuICAgKiBsb2NhbGUgLSBuZXcgbG9jYWxlIG9mIHRoZSB2aXN1YWxpemVyXG4gICAqL1xuICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6ZXJCYXNlLCBvcHRpb25zOiB7IGxvY2FsZTogc3RyaW5nIH0pID0+IGFueSxcbiAgICBWaXN1YWxpemVyQmFzZSxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHByb3RlY3RlZCB0b29sYmFySXRlbUNyZWF0b3JzOiB7IFtuYW1lOiBzdHJpbmddOiAodG9vbGJhcj86IEhUTUxEaXZFbGVtZW50KSA9PiBIVE1MRWxlbWVudCB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIHB1YmxpYyBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBwcml2YXRlIF9uYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IG9wdGlvbnMuZGF0YVByb3ZpZGVyIHx8IG5ldyBEYXRhUHJvdmlkZXIoZGF0YSk7XG4gICAgdGhpcy5fZGF0YVByb3ZpZGVyLm9uRGF0YUNoYW5nZWQuYWRkKCgpID0+IHRoaXMub25EYXRhQ2hhbmdlZCgpKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmxhYmVsVHJ1bmNhdGVMZW5ndGggPSBvcHRpb25zLmxhYmVsVHJ1bmNhdGVMZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGVuIGRhdGEgaGFzIGJlZW4gY2hhbmdlZCBmb3Igc29tZSByZWFzb24sIGUuZy4gZmlsdGVyIHdhcyBzZXQuXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZW4gaWYgZGVzY2VuZGFudCBjb21wdXRlcyBvd24gc3RhdGlzdGljcyBvciBwcm9jZXNzIGRhdGEgc29tZWhvdy5cbiAgICovXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRhdGEgZmllbGQgb2YgZGF0YSBvYmplY3QgZnJvbSB0aGUgZGF0YSBhcnJheS5cbiAgICovXG4gIGdldCBkYXRhTmFtZSgpOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52YWx1ZU5hbWUgfHwgdGhpcy5xdWVzdGlvbi5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHZpc3VhbGl6ZXIgaGFzIGhlYWRlci4gVXN1YWxseSBpdCBpcyB0cnVlIHRoZW4gYSBxdWVzdGlvbiBoYXMgY29ycmVjdCBhbnN3ZXIuXG4gICAqL1xuICBnZXQgaGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd0NvcnJlY3RBbnN3ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gJiYgISF0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdmlzdWFsaXplciBoYXMgZm9vdGVyLiBVc3VhbGx5IGl0IGlzIHRydWUgdGhlbiBhIHF1ZXN0aW9uIGhhcyBjb21tZW50IG9yIGNob2ljZXMgcXVlc3Rpb24gaGFzIG90aGVyIGl0ZW0uXG4gICAqL1xuICBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMucXVlc3Rpb24gJiYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCB8fCB0aGlzLnF1ZXN0aW9uLmhhc090aGVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVmlzdWFsaXplcjxUID0gVmlzdWFsaXplckJhc2U+KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFQge1xuICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kYXRhUHJvdmlkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFZpc3VhbGl6ZXJGYWN0b3J5LmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24sIHRoaXMuZGF0YSwgb3B0aW9ucykgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb290ZXIgdmlzdWFsaXplciBnZXR0ZXIuXG4gICAqL1xuICBnZXQgZm9vdGVyVmlzdWFsaXplcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLm5hbWUgKyAoc2V0dGluZ3MgfHwge30pLmNvbW1lbnRQcmVmaXhcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi50aXRsZSA9IHRoaXMucHJvY2Vzc1RleHQodGhpcy5xdWVzdGlvbi50aXRsZSk7XG5cbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5vblVwZGF0ZSA9ICgpID0+IHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdmlzdWFsaXplciBzdXBwb3J0cyBzZWxlY3Rpb24uIFZpc3VhbGl6ZXJzIG9mIHF1ZXN0aW9ucyB3aXRoIGNob2ljZXMgYWxsb3cgdG8gc2VsZWN0IGNob2ljZSBieSBjbGlja2luZyBvbiB0aGUgZGlhZ3JhbSBiYXIgYW5kIGZpbHRlciBvdGhlciBkYXRhIGZvciB0aGUgc2VsZWN0ZWQgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd1NlbGVjdGlvbikgJiZcbiAgICAgIHRoaXMuX3N1cHBvcnRTZWxlY3Rpb25cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmllcyB2YWx1ZXMgZ2V0dGVyLiBTb21lIHF1ZXN0aW9ucyAodXNlZCBpbiBtYXRyaWNlcykgc2hvdWxkIGJlIGdyb3VwZWQgYnkgbWF0cml4IHJvd3MuIFRoaXMgZ3JvdXBzIGFyZSBjYWxsZWQgc2VyaWVzLlxuICAgKi9cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzVmFsdWVzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmllcyBsYWJlbHMgZ2V0dGVyLiBTb21lIHF1ZXN0aW9ucyAodXNlZCBpbiBtYXRyaWNlcykgc2hvdWxkIGJlIGdyb3VwZWQgYnkgbWF0cml4IHJvd3MuIFRoaXMgZ3JvdXBzIGFyZSBjYWxsZWQgc2VyaWVzLlxuICAgKi9cbiAgZ2V0U2VyaWVzTGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2VyaWVzTGFiZWxzIHx8IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXZhaWxhYmxlIHZhbHVlcyBvZiBxdWVzdGlvbiBhbnN3ZXJzIChhdmFpbGFibGUgY2hvaWNlcykuXG4gICAqL1xuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gIH1cblxuICAvKipcbiAgICogQXZhaWxhYmxlIGxhYmVscyBvZiBxdWVzdGlvbiBhbnN3ZXJzIChodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhdmFpbGFibGUgY2hvaWNlcykuXG4gICAqL1xuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNyZWF0b3Igb2YgdmlzdWFsaXplciB0b29sYmFyIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUb29sYmFySXRlbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlYXRvcjogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW25hbWVdID0gY3JlYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmlzYXVsaXplci5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZSB8fCBcInZpc3VhbGl6ZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0dWFsIGRhdGEgb2YgdGhlIHZpc2F1bGl6ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmZpbHRlcmVkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBwcm92aWRlciBpcyB1c2VkIGJ5IHRoZSB2aXNhdWxpemVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkYXRhUHJvdmlkZXIoKTogRGF0YVByb3ZpZGVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdmlzdWFsaXplciBkYXRhLlxuICAgKi9cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICB0aGlzLmRhdGFQcm92aWRlci5kYXRhID0gZGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRm9vdGVyKSB7XG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBvblVwZGF0ZTogKCkgPT4gdm9pZDtcblxuICBpbnZva2VPblVwZGF0ZSgpIHtcbiAgICB0aGlzLm9uVXBkYXRlICYmIHRoaXMub25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB2aXN1YWxpemVyLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAoISF0aGlzLnJlbmRlclJlc3VsdCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5mb290ZXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnJlbmRlclJlc3VsdC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgdGhpcy5yZW5kZXJSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghIXRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIpIHtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZm9vdGVyVmlzdWFsaXplci5vblVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBmb3IgY2xlYXJpbmcgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIGZyb20gb3V0c2lkZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5jb250ZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZm9vdGVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUb29sYmFySXRlbXModG9vbGJhcjogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLnRvb2xiYXJJdGVtQ3JlYXRvcnMgfHwge30pLmZvckVhY2goKHRvb2xiYXJJdGVtTmFtZSkgPT4ge1xuICAgICAgbGV0IHRvb2xiYXJJdGVtID0gdGhpcy50b29sYmFySXRlbUNyZWF0b3JzW3Rvb2xiYXJJdGVtTmFtZV0odG9vbGJhcik7XG4gICAgICBpZiAoISF0b29sYmFySXRlbSkge1xuICAgICAgICB0b29sYmFyLmFwcGVuZENoaWxkKHRvb2xiYXJJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb24gPyB0aGlzLnF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXIgOiBcIlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHZpc3VhbGl6ZXIgdG9vbGJhci5cbiAgICovXG4gIHByb3RlY3RlZCBkZXN0cm95VG9vbGJhcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyc3MgdmlzdWFsaXplciB0b29sYmFyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlclRvb2xiYXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLnNob3dIZWFkZXIpIHtcbiAgICAgIGNvbnN0IHRvb2xiYXIgPSA8SFRNTERpdkVsZW1lbnQ+KFxuICAgICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtdG9vbGJhclwiKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXIpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2xiYXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB2aXN1YWxpemVyIGhlYWRlci5cbiAgICogVXN1YWxseSBvdmVycmlkZW4gaW4gZGVzY2VuZGFudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVzdHJveUhlYWRlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdHJveUhlYWRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVzdHJveUhlYWRlcihjb250YWluZXIsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdmlzdWFsaXplciBjb250ZW50LlxuICAgKiBVc3VhbGx5IG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdHJveUNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHZpc3VhbGl6ZXIgaGVhZGVyLlxuICAgKiBVc3VhbGx5IG92ZXJyaWRlbiBpbiBkZXNjZW5kYW50cy5cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckhlYWRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMucmVuZGVySGVhZGVyKGNvbnRhaW5lciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19jb3JyZWN0LWFuc3dlclwiXG4gICAgICApO1xuICAgICAgY29ycmVjdEFuc3dlckVsZW1lbnQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvcnJlY3RBbnN3ZXJcIikgKyB0aGlzLmdldENvcnJlY3RBbnN3ZXJUZXh0KCk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29ycmVjdEFuc3dlckVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHZpc3VhbGl6ZXIgY29udGVudC5cbiAgICogVXN1YWxseSBvdmVycmlkZW4gaW4gZGVzY2VuZGFudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMucmVuZGVyQ29udGVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMucmVuZGVyQ29udGVudChjb250YWluZXIsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vVmlzdWFsaXplckZvclF1ZXN0aW9uXCIpO1xuICAgIH1cbiAgICB0aGlzLmFmdGVyUmVuZGVyKGNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdmlzdWFsaXplciBmb290ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVzdHJveUZvb3Rlcihjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB2aXN1YWxpemVyIGZvb3Rlci5cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGlmICh0aGlzLmhhc0Zvb3Rlcikge1xuICAgICAgY29uc3QgZm9vdGVyVGl0bGVFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJoNFwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci10aXRsZVwiLFxuICAgICAgICB7IGlubmVyVGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyQ29tbWVudFRpdGxlXCIpIH1cbiAgICAgICk7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyVGl0bGVFbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9vdGVyQ29udGVudEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2Zvb3Rlci1jb250ZW50XCJcbiAgICAgICk7XG4gICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gVmlzdWFsaXplckJhc2Uub3RoZXJDb21tZW50Q29sbGFwc2VkXG4gICAgICAgID8gXCJub25lXCJcbiAgICAgICAgOiBcImJsb2NrXCI7XG5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHlCdXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICBpZiAoZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICBmb290ZXJDb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVCdXR0b25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgIHZpc2liaWxpdHlCdXR0b24uaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgICAgIFZpc3VhbGl6ZXJCYXNlLm90aGVyQ29tbWVudENvbGxhcHNlZCA/IFwic2hvd0J1dHRvblwiIDogXCJoaWRlQnV0dG9uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9vdGVyVmlzdWFsaXplci5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNob3dCdXR0b25cIikgLyosIFwic2EtdG9vbGJhcl9fYnV0dG9uLS1yaWdodFwiKi8pO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHZpc2liaWxpdHlCdXR0b24pO1xuXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9vdGVyQ29udGVudEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIucmVuZGVyKGZvb3RlckNvbnRlbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB2aXN1YWxpemVyIGluIHRoZSBnaXZlbiBjb250YWluZXIuXG4gICAqL1xuICByZW5kZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldEVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSZXN1bHQgPSB0YXJnZXRFbGVtZW50O1xuXG4gICAgdGhpcy50b29sYmFyQ29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX3Rvb2xiYXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuXG4gICAgaWYgKHRoaXMuaGFzSGVhZGVyKSB7XG4gICAgICB0aGlzLmhlYWRlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9faGVhZGVyXCJcbiAgICAgICk7XG4gICAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fY29udGVudFwiXG4gICAgKTtcbiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG5cbiAgICB0aGlzLmZvb3RlckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX19mb290ZXJcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgdGhpcy5yZW5kZXJGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhd3MgdmlzdWFsaXplciBhbmQgYWxsIGlubmVyIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLmhlYWRlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVySGVhZGVyKHRoaXMuaGVhZGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVzdHJveUZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyRm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5pbnZva2VPblVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcEh0bWxGcm9tVGl0bGVzICE9PSBmYWxzZSkge1xuICAgICAgbGV0IG9yaWdpbmFsVGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICAgIGxldCBwcm9jZXNzZWRUZXh0ID0gb3JpZ2luYWxUZXh0LnJlcGxhY2UoLyg8KFtePl0rKT4pL2dpLCBcIlwiKTtcbiAgICAgIHJldHVybiBwcm9jZXNzZWRUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGdldFJhbmRvbUNvbG9yKCkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgcmV0dXJuIGNvbG9yc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjb2xvcnMubGVuZ3RoKV07XG4gIH1cblxuICBwcml2YXRlIF9iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmN2Y3ZjdcIjtcblxuICBnZXQgYmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gdGhpcy5nZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCk7IH1cbiAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZSkgeyB0aGlzLnNldEJhY2tncm91bmRDb2xvckNvcmUodmFsdWUpOyB9XG5cbiAgcHJvdGVjdGVkIGdldEJhY2tncm91bmRDb2xvckNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgaWYgKHRoaXMuZm9vdGVyVmlzdWFsaXplcikgdGhpcy5mb290ZXJWaXN1YWxpemVyLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICB9XG5cbiAgc3RhdGljIGN1c3RvbUNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3JzID0gW1xuICAgIFwiIzg2ZTFmYlwiLFxuICAgIFwiIzM5OTlmYlwiLFxuICAgIFwiI2ZmNjc3MVwiLFxuICAgIFwiIzFlYjQ5NlwiLFxuICAgIFwiI2ZmYzE1MlwiLFxuICAgIFwiI2FiYTFmZlwiLFxuICAgIFwiIzdkOGRhNVwiLFxuICAgIFwiIzRlYzQ2Y1wiLFxuICAgIFwiI2NmMzdhNlwiLFxuICAgIFwiIzRlNjE5OFwiLFxuICBdO1xuXG4gIGdldENvbG9ycyhjb3VudCA9IDEwKSB7XG4gICAgY29uc3QgY29sb3JzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzKSAmJlxuICAgICAgICBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnMubGVuZ3RoID4gMFxuICAgICAgICA/IFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9yc1xuICAgICAgICA6IFZpc3VhbGl6ZXJCYXNlLmNvbG9ycztcblxuICAgIGxldCBtYW55Q29sb3JzOiBhbnkgPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgbWFueUNvbG9ycyA9IG1hbnlDb2xvcnMuY29uY2F0KGNvbG9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbnlDb2xvcnM7XG4gIH1cblxuICBnZXQgc2hvd0hlYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0hlYWRlcjtcbiAgfVxuICBzZXQgc2hvd0hlYWRlcihuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLl9zaG93SGVhZGVyKSB7XG4gICAgICB0aGlzLl9zaG93SGVhZGVyID0gbmV3VmFsdWU7XG4gICAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95VG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkYXRhIHRvIGJlIHVzZWQgaW4gdGhlIHZpc3VhbGl6ZXIuXG4gICAqL1xuICBnZXREYXRhKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgbG9jYWxlIG9mIHRoZSB2aXN1YWxpemVyLlxuICAgKiBJZiBsb2NhbGVzIG1vcmUgdGhhbiBvbmUsIHRoZSBsYW5ndWFnZSBzZWxlY3Rpb24gZHJvcGRvd24gd2lsbCBiZSBhZGRlZCBpbiB0aGUgdG9vbGJhclxuICAgKiBJbiBvcmRlciB0byB1c2Ugc3VydmV5IGxvY2FsZXMgdGhlIHN1cnZleSBpbnN0YW5jZSBvYmplY3Qgc2hvdWxkIGJlIHBhc3NlZCBhcyAnc3VydmV5JyBvcHRpb24gZm9yIHZpc3VhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmV0dXJuIHN1cnZleS5sb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxvY2FsZSBmb3IgdmlzdWFsaXphdGlvbiBwYW5lbC5cbiAgICovXG4gIHB1YmxpYyBzZXQgbG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLm9uTG9jYWxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgbG9jYWxlOiBuZXdMb2NhbGUgfSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMub3B0aW9ucy5zdXJ2ZXk7XG4gICAgaWYgKCEhc3VydmV5ICYmIHN1cnZleS5sb2NhbGUgIT09IG5ld0xvY2FsZSkge1xuICAgICAgc3VydmV5LmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgICB9XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcblxuLyoqXG4gKiBWaXN1YWxpemVycyBmYWN0b3J5LiBDcmVhdGVzIHZpc3VhbGl6ZXIgZm9yIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpc3VhbGl6ZXJGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSB2aXN1YWxpemVyIGJ5IHF1ZXN0aW9uLiBZb3UgY2FuIHBhc3MgZGF0YSBhbmQgb3B0aW9ucyB0byB0aGUgY3JlYXRlZCB2aXN1YWxpemVyIGFzIHdlbGwuXG4gICAqIElmIG1vcmUgdGhlbiBvbmUgdmlzdWFsaXplciBhcmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHF1ZXN0aW9uLCB0aGVuIHRoZXkgYXJlIGNvbWJpbmVkIHVzaW5nIHdyYXBwZXIgZm9yIHNob3dpbmcgYWx0ZXJuYXRpdmUgdmlhdWFsaXplcnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpc3VhbGl6ZXIoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfVxuICApOiBWaXN1YWxpemVyQmFzZSB7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcInRleHRcIiAmJiAoPGFueT5xdWVzdGlvbikuaW5wdXRUeXBlKSB7XG4gICAgICB0eXBlID0gKDxhbnk+cXVlc3Rpb24pLmlucHV0VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRvcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci5nZXRWaXN1YWxpemVyc0J5VHlwZSh0eXBlKTtcbiAgICB2YXIgdmlzdWFsaXplcnMgPSBjcmVhdG9ycy5tYXAoXG4gICAgICAoY3JlYXRvcikgPT4gbmV3IGNyZWF0b3IocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpXG4gICAgKTtcbiAgICBpZiAodmlzdWFsaXplcnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgYWx0ZXJuYXRpdmVzVmlzdWFsaXplckNvbnN0cnVjdG9yID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0QWx0ZXJuYXRpdmVzVmlzdWFsaXplcigpO1xuICAgICAgbGV0IHZpc3VhbGl6ZXIgPSBuZXcgYWx0ZXJuYXRpdmVzVmlzdWFsaXplckNvbnN0cnVjdG9yKFxuICAgICAgICB2aXN1YWxpemVycyxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIGRhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmlzdWFsaXplcjtcbiAgICB9XG4gICAgcmV0dXJuIHZpc3VhbGl6ZXJzWzBdO1xuICB9XG59XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCJkZVwiLFxuICBcImVuXCIsXG4gIFwidmFuXCIsXG4gIFwiaWtcIixcbiAgXCJ0ZVwiLFxuICBcImRhdFwiLFxuICBcImRpZVwiLFxuICBcImluXCIsXG4gIFwiZWVuXCIsXG4gIFwiaGlqXCIsXG4gIFwiaGV0XCIsXG4gIFwibmlldFwiLFxuICBcInppam5cIixcbiAgXCJpc1wiLFxuICBcIndhc1wiLFxuICBcIm9wXCIsXG4gIFwiYWFuXCIsXG4gIFwibWV0XCIsXG4gIFwiYWxzXCIsXG4gIFwidm9vclwiLFxuICBcImhhZFwiLFxuICBcImVyXCIsXG4gIFwibWFhclwiLFxuICBcIm9tXCIsXG4gIFwiaGVtXCIsXG4gIFwiZGFuXCIsXG4gIFwiem91XCIsXG4gIFwib2ZcIixcbiAgXCJ3YXRcIixcbiAgXCJtaWpuXCIsXG4gIFwibWVuXCIsXG4gIFwiZGl0XCIsXG4gIFwiem9cIixcbiAgXCJkb29yXCIsXG4gIFwib3ZlclwiLFxuICBcInplXCIsXG4gIFwiemljaFwiLFxuICBcImJpalwiLFxuICBcIm9va1wiLFxuICBcInRvdFwiLFxuICBcImplXCIsXG4gIFwibWlqXCIsXG4gIFwidWl0XCIsXG4gIFwiZGVyXCIsXG4gIFwiZGFhclwiLFxuICBcImhhYXJcIixcbiAgXCJuYWFyXCIsXG4gIFwiaGViXCIsXG4gIFwiaG9lXCIsXG4gIFwiaGVlZnRcIixcbiAgXCJoZWJiZW5cIixcbiAgXCJkZXplXCIsXG4gIFwidVwiLFxuICBcIndhbnRcIixcbiAgXCJub2dcIixcbiAgXCJ6YWxcIixcbiAgXCJtZVwiLFxuICBcInppalwiLFxuICBcIm51XCIsXG4gIFwiZ2VcIixcbiAgXCJnZWVuXCIsXG4gIFwib21kYXRcIixcbiAgXCJpZXRzXCIsXG4gIFwid29yZGVuXCIsXG4gIFwidG9jaFwiLFxuICBcImFsXCIsXG4gIFwid2FyZW5cIixcbiAgXCJ2ZWVsXCIsXG4gIFwibWVlclwiLFxuICBcImRvZW5cIixcbiAgXCJ0b2VuXCIsXG4gIFwibW9ldFwiLFxuICBcImJlblwiLFxuICBcInpvbmRlclwiLFxuICBcImthblwiLFxuICBcImh1blwiLFxuICBcImR1c1wiLFxuICBcImFsbGVzXCIsXG4gIFwib25kZXJcIixcbiAgXCJqYVwiLFxuICBcImVlbnNcIixcbiAgXCJoaWVyXCIsXG4gIFwid2llXCIsXG4gIFwid2VyZFwiLFxuICBcImFsdGlqZFwiLFxuICBcImRvY2hcIixcbiAgXCJ3b3JkdFwiLFxuICBcIndlemVuXCIsXG4gIFwia3VubmVuXCIsXG4gIFwib25zXCIsXG4gIFwiemVsZlwiLFxuICBcInRlZ2VuXCIsXG4gIFwibmFcIixcbiAgXCJyZWVkc1wiLFxuICBcIndpbFwiLFxuICBcImtvblwiLFxuICBcIm5pZXRzXCIsXG4gIFwidXdcIixcbiAgXCJpZW1hbmRcIixcbiAgXCJnZXdlZXN0XCIsXG4gIFwiYW5kZXJlXCJcbl07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhXCIsXG4gIFwiYWJvdXRcIixcbiAgXCJhYm92ZVwiLFxuICBcImFjcm9zc1wiLFxuICBcImFmdGVyXCIsXG4gIFwiYWdhaW5cIixcbiAgXCJhZ2FpbnN0XCIsXG4gIFwiYWxsXCIsXG4gIFwiYWxtb3N0XCIsXG4gIFwiYWxvbmVcIixcbiAgXCJhbG9uZ1wiLFxuICBcImFscmVhZHlcIixcbiAgXCJhbHNvXCIsXG4gIFwiYWx0aG91Z2hcIixcbiAgXCJhbHdheXNcIixcbiAgXCJhbW9uZ1wiLFxuICBcImFuXCIsXG4gIFwiYW5kXCIsXG4gIFwiYW5vdGhlclwiLFxuICBcImFueVwiLFxuICBcImFueWJvZHlcIixcbiAgXCJhbnlvbmVcIixcbiAgXCJhbnl0aGluZ1wiLFxuICBcImFueXdoZXJlXCIsXG4gIFwiYXJlXCIsXG4gIFwiYXJlYVwiLFxuICBcImFyZWFzXCIsXG4gIFwiYXJvdW5kXCIsXG4gIFwiYXNcIixcbiAgXCJhc2tcIixcbiAgXCJhc2tlZFwiLFxuICBcImFza2luZ1wiLFxuICBcImFza3NcIixcbiAgXCJhdFwiLFxuICBcImF3YXlcIixcbiAgXCJiXCIsXG4gIFwiYmFja1wiLFxuICBcImJhY2tlZFwiLFxuICBcImJhY2tpbmdcIixcbiAgXCJiYWNrc1wiLFxuICBcImJlXCIsXG4gIFwiYmVjYW1lXCIsXG4gIFwiYmVjYXVzZVwiLFxuICBcImJlY29tZVwiLFxuICBcImJlY29tZXNcIixcbiAgXCJiZWVuXCIsXG4gIFwiYmVmb3JlXCIsXG4gIFwiYmVnYW5cIixcbiAgXCJiZWhpbmRcIixcbiAgXCJiZWluZ1wiLFxuICBcImJlaW5nc1wiLFxuICBcImJlc3RcIixcbiAgXCJiZXR0ZXJcIixcbiAgXCJiZXR3ZWVuXCIsXG4gIFwiYmlnXCIsXG4gIFwiYm90aFwiLFxuICBcImJ1dFwiLFxuICBcImJ5XCIsXG4gIFwiY1wiLFxuICBcImNhbWVcIixcbiAgXCJjYW5cIixcbiAgXCJjYW5ub3RcIixcbiAgXCJjYXNlXCIsXG4gIFwiY2FzZXNcIixcbiAgXCJjZXJ0YWluXCIsXG4gIFwiY2VydGFpbmx5XCIsXG4gIFwiY2xlYXJcIixcbiAgXCJjbGVhcmx5XCIsXG4gIFwiY29tZVwiLFxuICBcImNvdWxkXCIsXG4gIFwiZFwiLFxuICBcImRpZFwiLFxuICBcImRpZmZlclwiLFxuICBcImRpZmZlcmVudFwiLFxuICBcImRpZmZlcmVudGx5XCIsXG4gIFwiZG9cIixcbiAgXCJkb2VzXCIsXG4gIFwiZG9uZVwiLFxuICBcImRvd25cIixcbiAgXCJkb3duXCIsXG4gIFwiZG93bmVkXCIsXG4gIFwiZG93bmluZ1wiLFxuICBcImRvd25zXCIsXG4gIFwiZHVyaW5nXCIsXG4gIFwiZVwiLFxuICBcImVhY2hcIixcbiAgXCJlYXJseVwiLFxuICBcImVpdGhlclwiLFxuICBcImVuZFwiLFxuICBcImVuZGVkXCIsXG4gIFwiZW5kaW5nXCIsXG4gIFwiZW5kc1wiLFxuICBcImVub3VnaFwiLFxuICBcImV2ZW5cIixcbiAgXCJldmVubHlcIixcbiAgXCJldmVyXCIsXG4gIFwiZXZlcnlcIixcbiAgXCJldmVyeWJvZHlcIixcbiAgXCJldmVyeW9uZVwiLFxuICBcImV2ZXJ5dGhpbmdcIixcbiAgXCJldmVyeXdoZXJlXCIsXG4gIFwiZlwiLFxuICBcImZhY2VcIixcbiAgXCJmYWNlc1wiLFxuICBcImZhY3RcIixcbiAgXCJmYWN0c1wiLFxuICBcImZhclwiLFxuICBcImZlbHRcIixcbiAgXCJmZXdcIixcbiAgXCJmaW5kXCIsXG4gIFwiZmluZHNcIixcbiAgXCJmaXJzdFwiLFxuICBcImZvclwiLFxuICBcImZvdXJcIixcbiAgXCJmcm9tXCIsXG4gIFwiZnVsbFwiLFxuICBcImZ1bGx5XCIsXG4gIFwiZnVydGhlclwiLFxuICBcImZ1cnRoZXJlZFwiLFxuICBcImZ1cnRoZXJpbmdcIixcbiAgXCJmdXJ0aGVyc1wiLFxuICBcImdcIixcbiAgXCJnYXZlXCIsXG4gIFwiZ2VuZXJhbFwiLFxuICBcImdlbmVyYWxseVwiLFxuICBcImdldFwiLFxuICBcImdldHNcIixcbiAgXCJnaXZlXCIsXG4gIFwiZ2l2ZW5cIixcbiAgXCJnaXZlc1wiLFxuICBcImdvXCIsXG4gIFwiZ29pbmdcIixcbiAgXCJnb29kXCIsXG4gIFwiZ29vZHNcIixcbiAgXCJnb3RcIixcbiAgXCJncmVhdFwiLFxuICBcImdyZWF0ZXJcIixcbiAgXCJncmVhdGVzdFwiLFxuICBcImdyb3VwXCIsXG4gIFwiZ3JvdXBlZFwiLFxuICBcImdyb3VwaW5nXCIsXG4gIFwiZ3JvdXBzXCIsXG4gIFwiaFwiLFxuICBcImhhZFwiLFxuICBcImhhc1wiLFxuICBcImhhdmVcIixcbiAgXCJoYXZpbmdcIixcbiAgXCJoZVwiLFxuICBcImhlclwiLFxuICBcImhlcmVcIixcbiAgXCJoZXJzZWxmXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaGVyXCIsXG4gIFwiaGlnaGVzdFwiLFxuICBcImhpbVwiLFxuICBcImhpbXNlbGZcIixcbiAgXCJoaXNcIixcbiAgXCJob3dcIixcbiAgXCJob3dldmVyXCIsXG4gIFwiaVwiLFxuICBcImlmXCIsXG4gIFwiaW1wb3J0YW50XCIsXG4gIFwiaW5cIixcbiAgXCJpbnRlcmVzdFwiLFxuICBcImludGVyZXN0ZWRcIixcbiAgXCJpbnRlcmVzdGluZ1wiLFxuICBcImludGVyZXN0c1wiLFxuICBcImludG9cIixcbiAgXCJpc1wiLFxuICBcIml0XCIsXG4gIFwiaXRzXCIsXG4gIFwiaXRzZWxmXCIsXG4gIFwialwiLFxuICBcImp1c3RcIixcbiAgXCJrXCIsXG4gIFwia2VlcFwiLFxuICBcImtlZXBzXCIsXG4gIFwia2luZFwiLFxuICBcImtuZXdcIixcbiAgXCJrbm93XCIsXG4gIFwia25vd25cIixcbiAgXCJrbm93c1wiLFxuICBcImxcIixcbiAgXCJsYXJnZVwiLFxuICBcImxhcmdlbHlcIixcbiAgXCJsYXN0XCIsXG4gIFwibGF0ZXJcIixcbiAgXCJsYXRlc3RcIixcbiAgXCJsZWFzdFwiLFxuICBcImxlc3NcIixcbiAgXCJsZXRcIixcbiAgXCJsZXRzXCIsXG4gIFwibGlrZVwiLFxuICBcImxpa2VseVwiLFxuICBcImxvbmdcIixcbiAgXCJsb25nZXJcIixcbiAgXCJsb25nZXN0XCIsXG4gIFwibVwiLFxuICBcIm1hZGVcIixcbiAgXCJtYWtlXCIsXG4gIFwibWFraW5nXCIsXG4gIFwibWFuXCIsXG4gIFwibWFueVwiLFxuICBcIm1heVwiLFxuICBcIm1lXCIsXG4gIFwibWVtYmVyXCIsXG4gIFwibWVtYmVyc1wiLFxuICBcIm1lblwiLFxuICBcIm1pZ2h0XCIsXG4gIFwibW9yZVwiLFxuICBcIm1vc3RcIixcbiAgXCJtb3N0bHlcIixcbiAgXCJtclwiLFxuICBcIm1yc1wiLFxuICBcIm11Y2hcIixcbiAgXCJtdXN0XCIsXG4gIFwibXlcIixcbiAgXCJteXNlbGZcIixcbiAgXCJuXCIsXG4gIFwibmVjZXNzYXJ5XCIsXG4gIFwibmVlZFwiLFxuICBcIm5lZWRlZFwiLFxuICBcIm5lZWRpbmdcIixcbiAgXCJuZWVkc1wiLFxuICBcIm5ldmVyXCIsXG4gIFwibmV3XCIsXG4gIFwibmV3XCIsXG4gIFwibmV3ZXJcIixcbiAgXCJuZXdlc3RcIixcbiAgXCJuZXh0XCIsXG4gIFwibm9cIixcbiAgXCJub2JvZHlcIixcbiAgXCJub25cIixcbiAgXCJub29uZVwiLFxuICBcIm5vdFwiLFxuICBcIm5vdGhpbmdcIixcbiAgXCJub3dcIixcbiAgXCJub3doZXJlXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwibnVtYmVyc1wiLFxuICBcIm9cIixcbiAgXCJvZlwiLFxuICBcIm9mZlwiLFxuICBcIm9mdGVuXCIsXG4gIFwib2xkXCIsXG4gIFwib2xkZXJcIixcbiAgXCJvbGRlc3RcIixcbiAgXCJvblwiLFxuICBcIm9uY2VcIixcbiAgXCJvbmVcIixcbiAgXCJvbmx5XCIsXG4gIFwib3BlblwiLFxuICBcIm9wZW5lZFwiLFxuICBcIm9wZW5pbmdcIixcbiAgXCJvcGVuc1wiLFxuICBcIm9yXCIsXG4gIFwib3JkZXJcIixcbiAgXCJvcmRlcmVkXCIsXG4gIFwib3JkZXJpbmdcIixcbiAgXCJvcmRlcnNcIixcbiAgXCJvdGhlclwiLFxuICBcIm90aGVyc1wiLFxuICBcIm91clwiLFxuICBcIm91dFwiLFxuICBcIm92ZXJcIixcbiAgXCJwXCIsXG4gIFwicGFydFwiLFxuICBcInBhcnRlZFwiLFxuICBcInBhcnRpbmdcIixcbiAgXCJwYXJ0c1wiLFxuICBcInBlclwiLFxuICBcInBlcmhhcHNcIixcbiAgXCJwbGFjZVwiLFxuICBcInBsYWNlc1wiLFxuICBcInBvaW50XCIsXG4gIFwicG9pbnRlZFwiLFxuICBcInBvaW50aW5nXCIsXG4gIFwicG9pbnRzXCIsXG4gIFwicG9zc2libGVcIixcbiAgXCJwcmVzZW50XCIsXG4gIFwicHJlc2VudGVkXCIsXG4gIFwicHJlc2VudGluZ1wiLFxuICBcInByZXNlbnRzXCIsXG4gIFwicHJvYmxlbVwiLFxuICBcInByb2JsZW1zXCIsXG4gIFwicHV0XCIsXG4gIFwicHV0c1wiLFxuICBcInFcIixcbiAgXCJxdWl0ZVwiLFxuICBcInJcIixcbiAgXCJyYXRoZXJcIixcbiAgXCJyZWFsbHlcIixcbiAgXCJyaWdodFwiLFxuICBcInJpZ2h0XCIsXG4gIFwicm9vbVwiLFxuICBcInJvb21zXCIsXG4gIFwic1wiLFxuICBcInNhaWRcIixcbiAgXCJzYW1lXCIsXG4gIFwic2F3XCIsXG4gIFwic2F5XCIsXG4gIFwic2F5c1wiLFxuICBcInNlY29uZFwiLFxuICBcInNlY29uZHNcIixcbiAgXCJzZWVcIixcbiAgXCJzZWVtXCIsXG4gIFwic2VlbWVkXCIsXG4gIFwic2VlbWluZ1wiLFxuICBcInNlZW1zXCIsXG4gIFwic2Vlc1wiLFxuICBcInNldmVyYWxcIixcbiAgXCJzaGFsbFwiLFxuICBcInNoZVwiLFxuICBcInNob3VsZFwiLFxuICBcInNob3dcIixcbiAgXCJzaG93ZWRcIixcbiAgXCJzaG93aW5nXCIsXG4gIFwic2hvd3NcIixcbiAgXCJzaWRlXCIsXG4gIFwic2lkZXNcIixcbiAgXCJzaW5jZVwiLFxuICBcInNtYWxsXCIsXG4gIFwic21hbGxlclwiLFxuICBcInNtYWxsZXN0XCIsXG4gIFwic29cIixcbiAgXCJzb21lXCIsXG4gIFwic29tZWJvZHlcIixcbiAgXCJzb21lb25lXCIsXG4gIFwic29tZXRoaW5nXCIsXG4gIFwic29tZXdoZXJlXCIsXG4gIFwic3RhdGVcIixcbiAgXCJzdGF0ZXNcIixcbiAgXCJzdGlsbFwiLFxuICBcInN0aWxsXCIsXG4gIFwic3VjaFwiLFxuICBcInN1cmVcIixcbiAgXCJ0XCIsXG4gIFwidGFrZVwiLFxuICBcInRha2VuXCIsXG4gIFwidGhhblwiLFxuICBcInRoYXRcIixcbiAgXCJ0aGVcIixcbiAgXCJ0aGVpclwiLFxuICBcInRoZW1cIixcbiAgXCJ0aGVuXCIsXG4gIFwidGhlcmVcIixcbiAgXCJ0aGVyZWZvcmVcIixcbiAgXCJ0aGVzZVwiLFxuICBcInRoZXlcIixcbiAgXCJ0aGluZ1wiLFxuICBcInRoaW5nc1wiLFxuICBcInRoaW5rXCIsXG4gIFwidGhpbmtzXCIsXG4gIFwidGhpc1wiLFxuICBcInRob3NlXCIsXG4gIFwidGhvdWdoXCIsXG4gIFwidGhvdWdodFwiLFxuICBcInRob3VnaHRzXCIsXG4gIFwidGhyZWVcIixcbiAgXCJ0aHJvdWdoXCIsXG4gIFwidGh1c1wiLFxuICBcInRvXCIsXG4gIFwidG9kYXlcIixcbiAgXCJ0b2dldGhlclwiLFxuICBcInRvb1wiLFxuICBcInRvb2tcIixcbiAgXCJ0b3dhcmRcIixcbiAgXCJ0dXJuXCIsXG4gIFwidHVybmVkXCIsXG4gIFwidHVybmluZ1wiLFxuICBcInR1cm5zXCIsXG4gIFwidHdvXCIsXG4gIFwidVwiLFxuICBcInVuZGVyXCIsXG4gIFwidW50aWxcIixcbiAgXCJ1cFwiLFxuICBcInVwb25cIixcbiAgXCJ1c1wiLFxuICBcInVzZVwiLFxuICBcInVzZWRcIixcbiAgXCJ1c2VzXCIsXG4gIFwidlwiLFxuICBcInZlcnlcIixcbiAgXCJ3XCIsXG4gIFwid2FudFwiLFxuICBcIndhbnRlZFwiLFxuICBcIndhbnRpbmdcIixcbiAgXCJ3YW50c1wiLFxuICBcIndhc1wiLFxuICBcIndheVwiLFxuICBcIndheXNcIixcbiAgXCJ3ZVwiLFxuICBcIndlbGxcIixcbiAgXCJ3ZWxsc1wiLFxuICBcIndlbnRcIixcbiAgXCJ3ZXJlXCIsXG4gIFwid2hhdFwiLFxuICBcIndoZW5cIixcbiAgXCJ3aGVyZVwiLFxuICBcIndoZXRoZXJcIixcbiAgXCJ3aGljaFwiLFxuICBcIndoaWxlXCIsXG4gIFwid2hvXCIsXG4gIFwid2hvbGVcIixcbiAgXCJ3aG9zZVwiLFxuICBcIndoeVwiLFxuICBcIndpbGxcIixcbiAgXCJ3aXRoXCIsXG4gIFwid2l0aGluXCIsXG4gIFwid2l0aG91dFwiLFxuICBcIndvcmtcIixcbiAgXCJ3b3JrZWRcIixcbiAgXCJ3b3JraW5nXCIsXG4gIFwid29ya3NcIixcbiAgXCJ3b3VsZFwiLFxuICBcInhcIixcbiAgXCJ5XCIsXG4gIFwieWVhclwiLFxuICBcInllYXJzXCIsXG4gIFwieWV0XCIsXG4gIFwieW91XCIsXG4gIFwieW91bmdcIixcbiAgXCJ5b3VuZ2VyXCIsXG4gIFwieW91bmdlc3RcIixcbiAgXCJ5b3VyXCIsXG4gIFwieW91cnNcIixcbiAgXCJ6XCJcbl07XG4iLCJpbXBvcnQgeyBzdG9wV29yZHMgfSBmcm9tIFwiLi9lbmdsaXNoXCI7XG5pbXBvcnQgeyBzdG9wV29yZHMgYXMgbm9TdG9wV29yZHMgfSBmcm9tIFwiLi9ub3J3ZWdpYW5cIjtcbmltcG9ydCB7IHN0b3BXb3JkcyBhcyBubFN0b3BXb3JkcyB9IGZyb20gXCIuL2R1dGNoXCI7XG5pbXBvcnQgeyBzdG9wV29yZHMgYXMgZXNTdG9wV29yZHMgfSBmcm9tIFwiLi9zcGFuaXNoXCI7XG5cbnZhciBzdG9wV29yZHNEaWN0aW9uYXJ5OiB7IFtpbmRleDogc3RyaW5nXTogQXJyYXk8c3RyaW5nPiB9ID0ge307XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wiZW5cIl0gPSBzdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wibm9cIl0gPSBub1N0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJubFwiXSA9IG5sU3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcImVzXCJdID0gZXNTdG9wV29yZHM7XG5cbmV4cG9ydCB2YXIgdGV4dEhlbHBlciA9IHtcbiAgZ2V0U3RvcFdvcmRzOiAobG9jYWxlOiBzdHJpbmcgPSBcIlwiKSA9PiB7XG4gICAgcmV0dXJuIHN0b3BXb3Jkc0RpY3Rpb25hcnlbbG9jYWxlIHx8IFwiZW5cIl0gfHwgW107XG4gIH0sXG59O1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYWxsZVwiLFxuICBcImFuZHJlXCIsXG4gIFwiYXJiZWlkXCIsXG4gIFwiYXRcIixcbiAgXCJhdlwiLFxuICBcImJhcmVcIixcbiAgXCJiZWdnZVwiLFxuICBcImJsZVwiLFxuICBcImJsZWlcIixcbiAgXCJibGlcIixcbiAgXCJibGlyXCIsXG4gIFwiYmxpdHRcIixcbiAgXCJib3J0XCIsXG4gIFwiYnJ1a2VcIixcbiAgXCJiw6VkZVwiLFxuICBcImLDpWVcIixcbiAgXCJkYVwiLFxuICBcImRlXCIsXG4gIFwiZGVnXCIsXG4gIFwiZGVpXCIsXG4gIFwiZGVpbVwiLFxuICBcImRlaXJhXCIsXG4gIFwiZGVpcmVzXCIsXG4gIFwiZGVtXCIsXG4gIFwiZGVuXCIsXG4gIFwiZGVubmVcIixcbiAgXCJkZXJcIixcbiAgXCJkZXJlXCIsXG4gIFwiZGVyZXNcIixcbiAgXCJkZXRcIixcbiAgXCJkZXR0ZVwiLFxuICBcImRpXCIsXG4gIFwiZGluXCIsXG4gIFwiZGlzc2VcIixcbiAgXCJkaXR0XCIsXG4gIFwiZHVcIixcbiAgXCJkeWtrXCIsXG4gIFwiZHlra2FyXCIsXG4gIFwiZMOlXCIsXG4gIFwiZWdcIixcbiAgXCJlaW5cIixcbiAgXCJlaXRcIixcbiAgXCJlaXR0XCIsXG4gIFwiZWxsZXJcIixcbiAgXCJlbGxlc1wiLFxuICBcImVuXCIsXG4gIFwiZW5lXCIsXG4gIFwiZW5lc3RlXCIsXG4gIFwiZW5odmVyXCIsXG4gIFwiZW5uXCIsXG4gIFwiZXJcIixcbiAgXCJldFwiLFxuICBcImV0dFwiLFxuICBcImV0dGVyXCIsXG4gIFwiZm9sa1wiLFxuICBcImZvclwiLFxuICBcImZvcmRpXCIsXG4gIFwiZm9yc8O4a2VcIixcbiAgXCJmcmFcIixcbiAgXCJmw6VcIixcbiAgXCJmw7hyXCIsXG4gIFwiZsO4clwiLFxuICBcImbDuHJzdFwiLFxuICBcImdqb3JkZVwiLFxuICBcImdqw7hyZVwiLFxuICBcImdvZFwiLFxuICBcImfDpVwiLFxuICBcImhhXCIsXG4gIFwiaGFkZGVcIixcbiAgXCJoYW5cIixcbiAgXCJoYW5zXCIsXG4gIFwiaGFyXCIsXG4gIFwiaGVubmFyXCIsXG4gIFwiaGVubmVcIixcbiAgXCJoZW5uZXNcIixcbiAgXCJoZXJcIixcbiAgXCJoasOlXCIsXG4gIFwiaG9cIixcbiAgXCJob2VcIixcbiAgXCJob25vbVwiLFxuICBcImhvc3NcIixcbiAgXCJob3NzZW5cIixcbiAgXCJodW5cIixcbiAgXCJodmFcIixcbiAgXCJodmVtXCIsXG4gIFwiaHZlclwiLFxuICBcImh2aWxrZVwiLFxuICBcImh2aWxrZW5cIixcbiAgXCJodmlzXCIsXG4gIFwiaHZvclwiLFxuICBcImh2b3JkYW5cIixcbiAgXCJodm9yZm9yXCIsXG4gIFwiaVwiLFxuICBcImlra2VcIixcbiAgXCJpa2tqZVwiLFxuICBcImluZ2VuXCIsXG4gIFwiaW5naVwiLFxuICBcImlua2plXCIsXG4gIFwiaW5uXCIsXG4gIFwiaW5uZW5cIixcbiAgXCJpbm5pXCIsXG4gIFwiamFcIixcbiAgXCJqZWdcIixcbiAgXCJrYW5cIixcbiAgXCJrb21cIixcbiAgXCJrb3JsZWlzXCIsXG4gIFwia29yc29cIixcbiAgXCJrdW5cIixcbiAgXCJrdW5uZVwiLFxuICBcImt2YVwiLFxuICBcImt2YXJcIixcbiAgXCJrdmFyaGVsc3RcIixcbiAgXCJrdmVuXCIsXG4gIFwia3ZpXCIsXG4gIFwia3ZpZm9yXCIsXG4gIFwibGFnZVwiLFxuICBcImxhbmdcIixcbiAgXCJsaWtcIixcbiAgXCJsaWtlXCIsXG4gIFwibWFrdFwiLFxuICBcIm1hblwiLFxuICBcIm1hbmdlXCIsXG4gIFwibWVcIixcbiAgXCJtZWRcIixcbiAgXCJtZWRhblwiLFxuICBcIm1lZ1wiLFxuICBcIm1lZ2V0XCIsXG4gIFwibWVsbG9tXCIsXG4gIFwibWVuXCIsXG4gIFwibWVuc1wiLFxuICBcIm1lclwiLFxuICBcIm1lc3RcIixcbiAgXCJtaVwiLFxuICBcIm1pblwiLFxuICBcIm1pbmVcIixcbiAgXCJtaXR0XCIsXG4gIFwibW90XCIsXG4gIFwibXllXCIsXG4gIFwibXlramVcIixcbiAgXCJtw6VcIixcbiAgXCJtw6V0ZVwiLFxuICBcIm5hdm5cIixcbiAgXCJuZWRcIixcbiAgXCJuZWlcIixcbiAgXCJub1wiLFxuICBcIm5vZVwiLFxuICBcIm5vZW5cIixcbiAgXCJub2thXCIsXG4gIFwibm9rb1wiLFxuICBcIm5va29uXCIsXG4gIFwibm9rb3JcIixcbiAgXCJub2tyZVwiLFxuICBcIm55XCIsXG4gIFwibsOlXCIsXG4gIFwibsOlclwiLFxuICBcIm9nXCIsXG4gIFwib2dzw6VcIixcbiAgXCJvbVwiLFxuICBcIm9wcFwiLFxuICBcIm9zc1wiLFxuICBcIm92ZXJcIixcbiAgXCJwYXJ0XCIsXG4gIFwicHVua3RcIixcbiAgXCJww6VcIixcbiAgXCJzYW1tZVwiLFxuICBcInNlZ1wiLFxuICBcInNlbHZcIixcbiAgXCJzaVwiLFxuICBcInNpYVwiLFxuICBcInNpZGFuXCIsXG4gIFwic2lkZW5cIixcbiAgXCJzaW5cIixcbiAgXCJzaW5lXCIsXG4gIFwic2lzdFwiLFxuICBcInNpdHRcIixcbiAgXCJzasO4bFwiLFxuICBcInNrYWxcIixcbiAgXCJza3VsbGVcIixcbiAgXCJzbGlrXCIsXG4gIFwic2x1dHRcIixcbiAgXCJzb1wiLFxuICBcInNvbVwiLFxuICBcInNvbW1lXCIsXG4gIFwic29tdFwiLFxuICBcInN0YXJ0XCIsXG4gIFwic3RpbGxlXCIsXG4gIFwic8OlXCIsXG4gIFwic8Olbm5cIixcbiAgXCJ0aWRcIixcbiAgXCJ0aWxcIixcbiAgXCJ0aWxiYWtlXCIsXG4gIFwidGlsc3RhbmRcIixcbiAgXCJ1bVwiLFxuICBcInVuZGVyXCIsXG4gIFwidXBwXCIsXG4gIFwidXRcIixcbiAgXCJ1dGVuXCIsXG4gIFwidmFyXCIsXG4gIFwidmFydFwiLFxuICBcInZhcnRlXCIsXG4gIFwidmVkXCIsXG4gIFwidmVyZGlcIixcbiAgXCJ2ZXJlXCIsXG4gIFwidmVydGVcIixcbiAgXCJ2aVwiLFxuICBcInZpbFwiLFxuICBcInZpbGxlXCIsXG4gIFwidml0ZVwiLFxuICBcInZvcmVcIixcbiAgXCJ2b3JzXCIsXG4gIFwidm9ydFwiLFxuICBcInbDpXJcIixcbiAgXCJ2w6ZyZVwiLFxuICBcInbDpnJ0XCIsXG4gIFwidsO4cmVcIixcbiAgXCJ2w7hydFwiLFxuICBcIsOmXCIsXG4gIFwiw6VcIlxuXTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFcIixcbiAgXCJhY3R1YWxtZW50ZVwiLFxuICBcImFkZWxhbnRlXCIsXG4gIFwiYWRlbcOhc1wiLFxuICBcImFmaXJtw7NcIixcbiAgXCJhZ3JlZ8OzXCIsXG4gIFwiYWhvcmFcIixcbiAgXCJhaMOtXCIsXG4gIFwiYWxcIixcbiAgXCJhbGdvXCIsXG4gIFwiYWxndW5hXCIsXG4gIFwiYWxndW5hc1wiLFxuICBcImFsZ3Vub1wiLFxuICBcImFsZ3Vub3NcIixcbiAgXCJhbGfDum5cIixcbiAgXCJhbHJlZGVkb3JcIixcbiAgXCJhbWJvc1wiLFxuICBcImFtcGxlYW1vc1wiLFxuICBcImFudGVcIixcbiAgXCJhbnRlcmlvclwiLFxuICBcImFudGVzXCIsXG4gIFwiYXBlbmFzXCIsXG4gIFwiYXByb3hpbWFkYW1lbnRlXCIsXG4gIFwiYXF1ZWxcIixcbiAgXCJhcXVlbGxhc1wiLFxuICBcImFxdWVsbG9zXCIsXG4gIFwiYXF1aVwiLFxuICBcImFxdcOtXCIsXG4gIFwiYXJyaWJhXCIsXG4gIFwiYXNlZ3Vyw7NcIixcbiAgXCJhc8OtXCIsXG4gIFwiYXRyYXNcIixcbiAgXCJhdW5xdWVcIixcbiAgXCJheWVyXCIsXG4gIFwiYcOxYWRpw7NcIixcbiAgXCJhw7puXCIsXG4gIFwiYmFqb1wiLFxuICBcImJhc3RhbnRlXCIsXG4gIFwiYmllblwiLFxuICBcImJ1ZW5cIixcbiAgXCJidWVuYVwiLFxuICBcImJ1ZW5hc1wiLFxuICBcImJ1ZW5vXCIsXG4gIFwiYnVlbm9zXCIsXG4gIFwiY2FkYVwiLFxuICBcImNhc2lcIixcbiAgXCJjZXJjYVwiLFxuICBcImNpZXJ0YVwiLFxuICBcImNpZXJ0YXNcIixcbiAgXCJjaWVydG9cIixcbiAgXCJjaWVydG9zXCIsXG4gIFwiY2luY29cIixcbiAgXCJjb21lbnTDs1wiLFxuICBcImNvbW9cIixcbiAgXCJjb25cIixcbiAgXCJjb25vY2VyXCIsXG4gIFwiY29uc2VndWltb3NcIixcbiAgXCJjb25zZWd1aXJcIixcbiAgXCJjb25zaWRlcmFcIixcbiAgXCJjb25zaWRlcsOzXCIsXG4gIFwiY29uc2lnb1wiLFxuICBcImNvbnNpZ3VlXCIsXG4gIFwiY29uc2lndWVuXCIsXG4gIFwiY29uc2lndWVzXCIsXG4gIFwiY29udHJhXCIsXG4gIFwiY29zYXNcIixcbiAgXCJjcmVvXCIsXG4gIFwiY3VhbFwiLFxuICBcImN1YWxlc1wiLFxuICBcImN1YWxxdWllclwiLFxuICBcImN1YW5kb1wiLFxuICBcImN1YW50b1wiLFxuICBcImN1YXRyb1wiLFxuICBcImN1ZW50YVwiLFxuICBcImPDs21vXCIsXG4gIFwiZGFcIixcbiAgXCJkYWRvXCIsXG4gIFwiZGFuXCIsXG4gIFwiZGFyXCIsXG4gIFwiZGVcIixcbiAgXCJkZWJlXCIsXG4gIFwiZGViZW5cIixcbiAgXCJkZWJpZG9cIixcbiAgXCJkZWNpclwiLFxuICBcImRlasOzXCIsXG4gIFwiZGVsXCIsXG4gIFwiZGVtw6FzXCIsXG4gIFwiZGVudHJvXCIsXG4gIFwiZGVzZGVcIixcbiAgXCJkZXNwdcOpc1wiLFxuICBcImRpY2VcIixcbiAgXCJkaWNlblwiLFxuICBcImRpY2hvXCIsXG4gIFwiZGllcm9uXCIsXG4gIFwiZGlmZXJlbnRlXCIsXG4gIFwiZGlmZXJlbnRlc1wiLFxuICBcImRpamVyb25cIixcbiAgXCJkaWpvXCIsXG4gIFwiZGlvXCIsXG4gIFwiZG9uZGVcIixcbiAgXCJkb3NcIixcbiAgXCJkdXJhbnRlXCIsXG4gIFwiZVwiLFxuICBcImVqZW1wbG9cIixcbiAgXCJlbFwiLFxuICBcImVsbGFcIixcbiAgXCJlbGxhc1wiLFxuICBcImVsbG9cIixcbiAgXCJlbGxvc1wiLFxuICBcImVtYmFyZ29cIixcbiAgXCJlbXBsZWFpc1wiLFxuICBcImVtcGxlYW5cIixcbiAgXCJlbXBsZWFyXCIsXG4gIFwiZW1wbGVhc1wiLFxuICBcImVtcGxlb1wiLFxuICBcImVuXCIsXG4gIFwiZW5jaW1hXCIsXG4gIFwiZW5jdWVudHJhXCIsXG4gIFwiZW50b25jZXNcIixcbiAgXCJlbnRyZVwiLFxuICBcImVyYVwiLFxuICBcImVyYWlzXCIsXG4gIFwiZXJhbW9zXCIsXG4gIFwiZXJhblwiLFxuICBcImVyYXNcIixcbiAgXCJlcmVzXCIsXG4gIFwiZXNcIixcbiAgXCJlc2FcIixcbiAgXCJlc2FzXCIsXG4gIFwiZXNlXCIsXG4gIFwiZXNvXCIsXG4gIFwiZXNvc1wiLFxuICBcImVzdGFcIixcbiAgXCJlc3RhYmFcIixcbiAgXCJlc3RhYmFpc1wiLFxuICBcImVzdGFiYW5cIixcbiAgXCJlc3RhYmFzXCIsXG4gIFwiZXN0YWRcIixcbiAgXCJlc3RhZGFcIixcbiAgXCJlc3RhZGFzXCIsXG4gIFwiZXN0YWRvXCIsXG4gIFwiZXN0YWRvc1wiLFxuICBcImVzdGFpc1wiLFxuICBcImVzdGFtb3NcIixcbiAgXCJlc3RhblwiLFxuICBcImVzdGFuZG9cIixcbiAgXCJlc3RhclwiLFxuICBcImVzdGFyZW1vc1wiLFxuICBcImVzdGFyw6FcIixcbiAgXCJlc3RhcsOhblwiLFxuICBcImVzdGFyw6FzXCIsXG4gIFwiZXN0YXLDqVwiLFxuICBcImVzdGFyw6lpc1wiLFxuICBcImVzdGFyw61hXCIsXG4gIFwiZXN0YXLDrWFpc1wiLFxuICBcImVzdGFyw61hbW9zXCIsXG4gIFwiZXN0YXLDrWFuXCIsXG4gIFwiZXN0YXLDrWFzXCIsXG4gIFwiZXN0YXNcIixcbiAgXCJlc3RlXCIsXG4gIFwiZXN0ZW1vc1wiLFxuICBcImVzdG9cIixcbiAgXCJlc3Rvc1wiLFxuICBcImVzdG95XCIsXG4gIFwiZXN0dXZlXCIsXG4gIFwiZXN0dXZpZXJhXCIsXG4gIFwiZXN0dXZpZXJhaXNcIixcbiAgXCJlc3R1dmllcmFuXCIsXG4gIFwiZXN0dXZpZXJhc1wiLFxuICBcImVzdHV2aWVyb25cIixcbiAgXCJlc3R1dmllc2VcIixcbiAgXCJlc3R1dmllc2Vpc1wiLFxuICBcImVzdHV2aWVzZW5cIixcbiAgXCJlc3R1dmllc2VzXCIsXG4gIFwiZXN0dXZpbW9zXCIsXG4gIFwiZXN0dXZpc3RlXCIsXG4gIFwiZXN0dXZpc3RlaXNcIixcbiAgXCJlc3R1dmnDqXJhbW9zXCIsXG4gIFwiZXN0dXZpw6lzZW1vc1wiLFxuICBcImVzdHV2b1wiLFxuICBcImVzdMOhXCIsXG4gIFwiZXN0w6FiYW1vc1wiLFxuICBcImVzdMOhaXNcIixcbiAgXCJlc3TDoW5cIixcbiAgXCJlc3TDoXNcIixcbiAgXCJlc3TDqVwiLFxuICBcImVzdMOpaXNcIixcbiAgXCJlc3TDqW5cIixcbiAgXCJlc3TDqXNcIixcbiAgXCJleFwiLFxuICBcImV4aXN0ZVwiLFxuICBcImV4aXN0ZW5cIixcbiAgXCJleHBsaWPDs1wiLFxuICBcImV4cHJlc8OzXCIsXG4gIFwiZmluXCIsXG4gIFwiZnVlXCIsXG4gIFwiZnVlcmFcIixcbiAgXCJmdWVyYWlzXCIsXG4gIFwiZnVlcmFuXCIsXG4gIFwiZnVlcmFzXCIsXG4gIFwiZnVlcm9uXCIsXG4gIFwiZnVlc2VcIixcbiAgXCJmdWVzZWlzXCIsXG4gIFwiZnVlc2VuXCIsXG4gIFwiZnVlc2VzXCIsXG4gIFwiZnVpXCIsXG4gIFwiZnVpbW9zXCIsXG4gIFwiZnVpc3RlXCIsXG4gIFwiZnVpc3RlaXNcIixcbiAgXCJmdcOpcmFtb3NcIixcbiAgXCJmdcOpc2Vtb3NcIixcbiAgXCJncmFuXCIsXG4gIFwiZ3JhbmRlc1wiLFxuICBcImd1ZW5vXCIsXG4gIFwiaGFcIixcbiAgXCJoYWJlclwiLFxuICBcImhhYmlkYVwiLFxuICBcImhhYmlkYXNcIixcbiAgXCJoYWJpZG9cIixcbiAgXCJoYWJpZG9zXCIsXG4gIFwiaGFiaWVuZG9cIixcbiAgXCJoYWJyZW1vc1wiLFxuICBcImhhYnLDoVwiLFxuICBcImhhYnLDoW5cIixcbiAgXCJoYWJyw6FzXCIsXG4gIFwiaGFicsOpXCIsXG4gIFwiaGFicsOpaXNcIixcbiAgXCJoYWJyw61hXCIsXG4gIFwiaGFicsOtYWlzXCIsXG4gIFwiaGFicsOtYW1vc1wiLFxuICBcImhhYnLDrWFuXCIsXG4gIFwiaGFicsOtYXNcIixcbiAgXCJoYWLDqWlzXCIsXG4gIFwiaGFiw61hXCIsXG4gIFwiaGFiw61haXNcIixcbiAgXCJoYWLDrWFtb3NcIixcbiAgXCJoYWLDrWFuXCIsXG4gIFwiaGFiw61hc1wiLFxuICBcImhhY2VcIixcbiAgXCJoYWNlaXNcIixcbiAgXCJoYWNlbW9zXCIsXG4gIFwiaGFjZW5cIixcbiAgXCJoYWNlclwiLFxuICBcImhhY2VybG9cIixcbiAgXCJoYWNlc1wiLFxuICBcImhhY2lhXCIsXG4gIFwiaGFjaWVuZG9cIixcbiAgXCJoYWdvXCIsXG4gIFwiaGFuXCIsXG4gIFwiaGFzXCIsXG4gIFwiaGFzdGFcIixcbiAgXCJoYXlcIixcbiAgXCJoYXlhXCIsXG4gIFwiaGF5YW1vc1wiLFxuICBcImhheWFuXCIsXG4gIFwiaGF5YXNcIixcbiAgXCJoYXnDoWlzXCIsXG4gIFwiaGVcIixcbiAgXCJoZWNob1wiLFxuICBcImhlbW9zXCIsXG4gIFwiaGljaWVyb25cIixcbiAgXCJoaXpvXCIsXG4gIFwiaG95XCIsXG4gIFwiaHViZVwiLFxuICBcImh1YmllcmFcIixcbiAgXCJodWJpZXJhaXNcIixcbiAgXCJodWJpZXJhblwiLFxuICBcImh1YmllcmFzXCIsXG4gIFwiaHViaWVyb25cIixcbiAgXCJodWJpZXNlXCIsXG4gIFwiaHViaWVzZWlzXCIsXG4gIFwiaHViaWVzZW5cIixcbiAgXCJodWJpZXNlc1wiLFxuICBcImh1Ymltb3NcIixcbiAgXCJodWJpc3RlXCIsXG4gIFwiaHViaXN0ZWlzXCIsXG4gIFwiaHViacOpcmFtb3NcIixcbiAgXCJodWJpw6lzZW1vc1wiLFxuICBcImh1Ym9cIixcbiAgXCJpZ3VhbFwiLFxuICBcImluY2x1c29cIixcbiAgXCJpbmRpY8OzXCIsXG4gIFwiaW5mb3Jtw7NcIixcbiAgXCJpbnRlbnRhXCIsXG4gIFwiaW50ZW50YWlzXCIsXG4gIFwiaW50ZW50YW1vc1wiLFxuICBcImludGVudGFuXCIsXG4gIFwiaW50ZW50YXJcIixcbiAgXCJpbnRlbnRhc1wiLFxuICBcImludGVudG9cIixcbiAgXCJpclwiLFxuICBcImp1bnRvXCIsXG4gIFwibGFcIixcbiAgXCJsYWRvXCIsXG4gIFwibGFyZ29cIixcbiAgXCJsYXNcIixcbiAgXCJsZVwiLFxuICBcImxlc1wiLFxuICBcImxsZWfDs1wiLFxuICBcImxsZXZhXCIsXG4gIFwibGxldmFyXCIsXG4gIFwibG9cIixcbiAgXCJsb3NcIixcbiAgXCJsdWVnb1wiLFxuICBcImx1Z2FyXCIsXG4gIFwibWFuZXJhXCIsXG4gIFwibWFuaWZlc3TDs1wiLFxuICBcIm1heW9yXCIsXG4gIFwibWVcIixcbiAgXCJtZWRpYW50ZVwiLFxuICBcIm1lam9yXCIsXG4gIFwibWVuY2lvbsOzXCIsXG4gIFwibWVub3NcIixcbiAgXCJtaVwiLFxuICBcIm1pZW50cmFzXCIsXG4gIFwibWlvXCIsXG4gIFwibWlzXCIsXG4gIFwibWlzbWFcIixcbiAgXCJtaXNtYXNcIixcbiAgXCJtaXNtb1wiLFxuICBcIm1pc21vc1wiLFxuICBcIm1vZG9cIixcbiAgXCJtb21lbnRvXCIsXG4gIFwibXVjaGFcIixcbiAgXCJtdWNoYXNcIixcbiAgXCJtdWNob1wiLFxuICBcIm11Y2hvc1wiLFxuICBcIm11eVwiLFxuICBcIm3DoXNcIixcbiAgXCJtw61cIixcbiAgXCJtw61hXCIsXG4gIFwibcOtYXNcIixcbiAgXCJtw61vXCIsXG4gIFwibcOtb3NcIixcbiAgXCJuYWRhXCIsXG4gIFwibmFkaWVcIixcbiAgXCJuaVwiLFxuICBcIm5pbmd1bmFcIixcbiAgXCJuaW5ndW5hc1wiLFxuICBcIm5pbmd1bm9cIixcbiAgXCJuaW5ndW5vc1wiLFxuICBcIm5pbmfDum5cIixcbiAgXCJub1wiLFxuICBcIm5vc1wiLFxuICBcIm5vc290cmFzXCIsXG4gIFwibm9zb3Ryb3NcIixcbiAgXCJudWVzdHJhXCIsXG4gIFwibnVlc3RyYXNcIixcbiAgXCJudWVzdHJvXCIsXG4gIFwibnVlc3Ryb3NcIixcbiAgXCJudWV2YVwiLFxuICBcIm51ZXZhc1wiLFxuICBcIm51ZXZvXCIsXG4gIFwibnVldm9zXCIsXG4gIFwibnVuY2FcIixcbiAgXCJvXCIsXG4gIFwib2Nob1wiLFxuICBcIm9zXCIsXG4gIFwib3RyYVwiLFxuICBcIm90cmFzXCIsXG4gIFwib3Ryb1wiLFxuICBcIm90cm9zXCIsXG4gIFwicGFyYVwiLFxuICBcInBhcmVjZVwiLFxuICBcInBhcnRlXCIsXG4gIFwicGFydGlyXCIsXG4gIFwicGFzYWRhXCIsXG4gIFwicGFzYWRvXCIsXG4gIFwicGVyb1wiLFxuICBcInBlc2FyXCIsXG4gIFwicG9jYVwiLFxuICBcInBvY2FzXCIsXG4gIFwicG9jb1wiLFxuICBcInBvY29zXCIsXG4gIFwicG9kZWlzXCIsXG4gIFwicG9kZW1vc1wiLFxuICBcInBvZGVyXCIsXG4gIFwicG9kcmlhXCIsXG4gIFwicG9kcmlhaXNcIixcbiAgXCJwb2RyaWFtb3NcIixcbiAgXCJwb2RyaWFuXCIsXG4gIFwicG9kcmlhc1wiLFxuICBcInBvZHLDoVwiLFxuICBcInBvZHLDoW5cIixcbiAgXCJwb2Ryw61hXCIsXG4gIFwicG9kcsOtYW5cIixcbiAgXCJwb25lclwiLFxuICBcInBvclwiLFxuICBcInBvciBxdcOpXCIsXG4gIFwicG9ycXVlXCIsXG4gIFwicG9zaWJsZVwiLFxuICBcInByaW1lclwiLFxuICBcInByaW1lcmFcIixcbiAgXCJwcmltZXJvXCIsXG4gIFwicHJpbWVyb3NcIixcbiAgXCJwcmluY2lwYWxtZW50ZVwiLFxuICBcInByb3BpYVwiLFxuICBcInByb3BpYXNcIixcbiAgXCJwcm9waW9cIixcbiAgXCJwcm9waW9zXCIsXG4gIFwicHLDs3hpbW9cIixcbiAgXCJwcsOzeGltb3NcIixcbiAgXCJwdWRvXCIsXG4gIFwicHVlZGFcIixcbiAgXCJwdWVkZVwiLFxuICBcInB1ZWRlblwiLFxuICBcInB1ZWRvXCIsXG4gIFwicHVlc1wiLFxuICBcInF1ZVwiLFxuICBcInF1ZWTDs1wiLFxuICBcInF1ZXJlbW9zXCIsXG4gIFwicXVpZW5cIixcbiAgXCJxdWllbmVzXCIsXG4gIFwicXVpZXJlXCIsXG4gIFwicXVpw6luXCIsXG4gIFwicXXDqVwiLFxuICBcInJlYWxpemFkb1wiLFxuICBcInJlYWxpemFyXCIsXG4gIFwicmVhbGl6w7NcIixcbiAgXCJyZXNwZWN0b1wiLFxuICBcInNhYmVcIixcbiAgXCJzYWJlaXNcIixcbiAgXCJzYWJlbW9zXCIsXG4gIFwic2FiZW5cIixcbiAgXCJzYWJlclwiLFxuICBcInNhYmVzXCIsXG4gIFwic2VcIixcbiAgXCJzZWFcIixcbiAgXCJzZWFtb3NcIixcbiAgXCJzZWFuXCIsXG4gIFwic2Vhc1wiLFxuICBcInNlZ3VuZGFcIixcbiAgXCJzZWd1bmRvXCIsXG4gIFwic2Vnw7puXCIsXG4gIFwic2Vpc1wiLFxuICBcInNlclwiLFxuICBcInNlcmVtb3NcIixcbiAgXCJzZXLDoVwiLFxuICBcInNlcsOhblwiLFxuICBcInNlcsOhc1wiLFxuICBcInNlcsOpXCIsXG4gIFwic2Vyw6lpc1wiLFxuICBcInNlcsOtYVwiLFxuICBcInNlcsOtYWlzXCIsXG4gIFwic2Vyw61hbW9zXCIsXG4gIFwic2Vyw61hblwiLFxuICBcInNlcsOtYXNcIixcbiAgXCJzZcOhaXNcIixcbiAgXCJzZcOxYWzDs1wiLFxuICBcInNpXCIsXG4gIFwic2lkb1wiLFxuICBcInNpZW1wcmVcIixcbiAgXCJzaWVuZG9cIixcbiAgXCJzaWV0ZVwiLFxuICBcInNpZ3VlXCIsXG4gIFwic2lndWllbnRlXCIsXG4gIFwic2luXCIsXG4gIFwic2lub1wiLFxuICBcInNvYnJlXCIsXG4gIFwic29pc1wiLFxuICBcInNvbGFcIixcbiAgXCJzb2xhbWVudGVcIixcbiAgXCJzb2xhc1wiLFxuICBcInNvbG9cIixcbiAgXCJzb2xvc1wiLFxuICBcInNvbW9zXCIsXG4gIFwic29uXCIsXG4gIFwic295XCIsXG4gIFwic3VcIixcbiAgXCJzdXNcIixcbiAgXCJzdXlhXCIsXG4gIFwic3V5YXNcIixcbiAgXCJzdXlvXCIsXG4gIFwic3V5b3NcIixcbiAgXCJzw61cIixcbiAgXCJzw7Nsb1wiLFxuICBcInRhbFwiLFxuICBcInRhbWJpw6luXCIsXG4gIFwidGFtcG9jb1wiLFxuICBcInRhblwiLFxuICBcInRhbnRvXCIsXG4gIFwidGVcIixcbiAgXCJ0ZW5kcmVtb3NcIixcbiAgXCJ0ZW5kcsOhXCIsXG4gIFwidGVuZHLDoW5cIixcbiAgXCJ0ZW5kcsOhc1wiLFxuICBcInRlbmRyw6lcIixcbiAgXCJ0ZW5kcsOpaXNcIixcbiAgXCJ0ZW5kcsOtYVwiLFxuICBcInRlbmRyw61haXNcIixcbiAgXCJ0ZW5kcsOtYW1vc1wiLFxuICBcInRlbmRyw61hblwiLFxuICBcInRlbmRyw61hc1wiLFxuICBcInRlbmVkXCIsXG4gIFwidGVuZWlzXCIsXG4gIFwidGVuZW1vc1wiLFxuICBcInRlbmVyXCIsXG4gIFwidGVuZ2FcIixcbiAgXCJ0ZW5nYW1vc1wiLFxuICBcInRlbmdhblwiLFxuICBcInRlbmdhc1wiLFxuICBcInRlbmdvXCIsXG4gIFwidGVuZ8OhaXNcIixcbiAgXCJ0ZW5pZGFcIixcbiAgXCJ0ZW5pZGFzXCIsXG4gIFwidGVuaWRvXCIsXG4gIFwidGVuaWRvc1wiLFxuICBcInRlbmllbmRvXCIsXG4gIFwidGVuw6lpc1wiLFxuICBcInRlbsOtYVwiLFxuICBcInRlbsOtYWlzXCIsXG4gIFwidGVuw61hbW9zXCIsXG4gIFwidGVuw61hblwiLFxuICBcInRlbsOtYXNcIixcbiAgXCJ0ZXJjZXJhXCIsXG4gIFwidGlcIixcbiAgXCJ0aWVtcG9cIixcbiAgXCJ0aWVuZVwiLFxuICBcInRpZW5lblwiLFxuICBcInRpZW5lc1wiLFxuICBcInRvZGFcIixcbiAgXCJ0b2Rhc1wiLFxuICBcInRvZGF2w61hXCIsXG4gIFwidG9kb1wiLFxuICBcInRvZG9zXCIsXG4gIFwidG90YWxcIixcbiAgXCJ0cmFiYWphXCIsXG4gIFwidHJhYmFqYWlzXCIsXG4gIFwidHJhYmFqYW1vc1wiLFxuICBcInRyYWJhamFuXCIsXG4gIFwidHJhYmFqYXJcIixcbiAgXCJ0cmFiYWphc1wiLFxuICBcInRyYWJham9cIixcbiAgXCJ0cmFzXCIsXG4gIFwidHJhdGFcIixcbiAgXCJ0cmF2w6lzXCIsXG4gIFwidHJlc1wiLFxuICBcInR1XCIsXG4gIFwidHVzXCIsXG4gIFwidHV2ZVwiLFxuICBcInR1dmllcmFcIixcbiAgXCJ0dXZpZXJhaXNcIixcbiAgXCJ0dXZpZXJhblwiLFxuICBcInR1dmllcmFzXCIsXG4gIFwidHV2aWVyb25cIixcbiAgXCJ0dXZpZXNlXCIsXG4gIFwidHV2aWVzZWlzXCIsXG4gIFwidHV2aWVzZW5cIixcbiAgXCJ0dXZpZXNlc1wiLFxuICBcInR1dmltb3NcIixcbiAgXCJ0dXZpc3RlXCIsXG4gIFwidHV2aXN0ZWlzXCIsXG4gIFwidHV2acOpcmFtb3NcIixcbiAgXCJ0dXZpw6lzZW1vc1wiLFxuICBcInR1dm9cIixcbiAgXCJ0dXlhXCIsXG4gIFwidHV5YXNcIixcbiAgXCJ0dXlvXCIsXG4gIFwidHV5b3NcIixcbiAgXCJ0w7pcIixcbiAgXCJ1bHRpbW9cIixcbiAgXCJ1blwiLFxuICBcInVuYVwiLFxuICBcInVuYXNcIixcbiAgXCJ1bm9cIixcbiAgXCJ1bm9zXCIsXG4gIFwidXNhXCIsXG4gIFwidXNhaXNcIixcbiAgXCJ1c2Ftb3NcIixcbiAgXCJ1c2FuXCIsXG4gIFwidXNhclwiLFxuICBcInVzYXNcIixcbiAgXCJ1c29cIixcbiAgXCJ1c3RlZFwiLFxuICBcInZhXCIsXG4gIFwidmFpc1wiLFxuICBcInZhbG9yXCIsXG4gIFwidmFtb3NcIixcbiAgXCJ2YW5cIixcbiAgXCJ2YXJpYXNcIixcbiAgXCJ2YXJpb3NcIixcbiAgXCJ2YXlhXCIsXG4gIFwidmVjZXNcIixcbiAgXCJ2ZXJcIixcbiAgXCJ2ZXJkYWRcIixcbiAgXCJ2ZXJkYWRlcmFcIixcbiAgXCJ2ZXJkYWRlcm9cIixcbiAgXCJ2ZXpcIixcbiAgXCJ2b3NvdHJhc1wiLFxuICBcInZvc290cm9zXCIsXG4gIFwidm95XCIsXG4gIFwidnVlc3RyYVwiLFxuICBcInZ1ZXN0cmFzXCIsXG4gIFwidnVlc3Ryb1wiLFxuICBcInZ1ZXN0cm9zXCIsXG4gIFwieVwiLFxuICBcInlhXCIsXG4gIFwieW9cIixcbiAgXCLDqWxcIixcbiAgXCLDqXJhbW9zXCIsXG4gIFwiw6lzdGFcIixcbiAgXCLDqXN0YXNcIixcbiAgXCLDqXN0ZVwiLFxuICBcIsOpc3Rvc1wiLFxuICBcIsO6bHRpbWFcIixcbiAgXCLDumx0aW1hc1wiLFxuICBcIsO6bHRpbW9cIixcbiAgXCLDumx0aW1vc1wiXG5dOyIsImltcG9ydCB7IFF1ZXN0aW9uLCBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyB0ZXh0SGVscGVyIH0gZnJvbSBcIi4vc3RvcHdvcmRzL2luZGV4XCI7XG5pbXBvcnQgV29yZENsb3VkTGliIGZyb20gXCJ3b3JkY2xvdWRcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgV29yZENsb3VkQWRhcHRlciB7XG4gIHByaXZhdGUgX3dvcmRjbG91ZDogYW55O1xuXG4gIHB1YmxpYyBzdGF0aWMgZHJhd091dE9mQm91bmQgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBzaHJpbmtUb0ZpdCA9IHRydWU7XG4gIHB1YmxpYyBzdGF0aWMgYWJvcnRUaHJlc2hvbGQ6IGFueSA9IHVuZGVmaW5lZDtcbiAgcHVibGljIHN0YXRpYyB3ZWlnaHRGYWN0b3IgPSAyMDtcblxuICBwdWJsaWMgc3RhdGljIG9uV29yZGNsb3VkQ3JlYXRpbmcgPSBuZXcgRXZlbnQ8XG4gICAgICAoc2VuZGVyOiBXb3JkQ2xvdWQsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgICAgV29yZENsb3VkLFxuICAgICAgYW55XG4gICAgPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IFdvcmRDbG91ZCkge31cblxuICBwdWJsaWMgZ2V0IHdvcmRjbG91ZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd29yZGNsb3VkO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1vZGVsLmdldERhdGEoKTtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdldENvbG9ycygpO1xuICAgIGNvbnN0IGNhbnZhc05vZGUgPSA8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLCBcIlwiKVxuICAgICk7XG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZW1wdHlUZXh0Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5hcHBlbmRDaGlsZChjYW52YXNOb2RlKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGxpc3Q6IGRhdGEsXG4gICAgICB3ZWlnaHRGYWN0b3I6IFdvcmRDbG91ZEFkYXB0ZXIud2VpZ2h0RmFjdG9yLFxuICAgICAgYWJvcnRUaHJlc2hvbGQ6IFdvcmRDbG91ZEFkYXB0ZXIuYWJvcnRUaHJlc2hvbGQsXG4gICAgICBkcmF3T3V0T2ZCb3VuZDogV29yZENsb3VkQWRhcHRlci5kcmF3T3V0T2ZCb3VuZCxcbiAgICAgIHNocmlua1RvRml0OiBXb3JkQ2xvdWRBZGFwdGVyLnNocmlua1RvRml0LFxuICAgICAgZm9udEZhbWlseTogXCJTZWdvZSBVSSBCb2xkLCBzYW5zLXNlcmlmXCIsXG4gICAgICBjb2xvcjogKHdvcmQ6IHN0cmluZywgd2VpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0UmFuZG9tQ29sb3IoKTtcbiAgICAgIH0sXG4gICAgICByb3RhdGVSYXRpbzogMC41LFxuICAgICAgcm90YXRpb25TdGVwczogMixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBjbGljazogZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhpdGVtWzBdICsgXCI6IFwiICsgaXRlbVsxXSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2FudmFzOiBjYW52YXNOb2RlLFxuICAgICAgY29uZmlnXG4gICAgfTtcbiAgICBXb3JkQ2xvdWRBZGFwdGVyLm9uV29yZGNsb3VkQ3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcbiAgICB0aGlzLl93b3JkY2xvdWQgPSBXb3JkQ2xvdWRMaWIob3B0aW9ucy5jYW52YXMsIG9wdGlvbnMuY29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5fd29yZGNsb3VkO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl93b3JkY2xvdWQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdvcmRDbG91ZCBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcbiAgcHJpdmF0ZSBfd29yZGNsb3VkQWRhcHRlcjogV29yZENsb3VkQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJ3b3JkY2xvdWRcIik7XG4gICAgdGhpcy5fd29yZGNsb3VkQWRhcHRlciA9IG5ldyBXb3JkQ2xvdWRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgZ2V0RGF0YSgpIHtcbiAgICBsZXQgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgICBsZXQgc3RvcFdvcmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGxvY2FsZSA9IGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlO1xuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHN0b3BXb3JkcyA9IHRleHRIZWxwZXIuZ2V0U3RvcFdvcmRzKGxvY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3BXb3JkcyA9IHRleHRIZWxwZXIuZ2V0U3RvcFdvcmRzKCk7XG4gICAgfVxuXG4gICAgbGV0IHN0b3BUaGVXb3JkID0gKHdvcmQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHN0b3BXb3Jkcy5pbmRleE9mKHdvcmQpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3b3JkO1xuICAgIH07XG5cbiAgICBsZXQgcHJvY2Vzc1N0cmluZyA9IChyb3c6IHN0cmluZykgPT4ge1xuICAgICAgcm93ID0gXCJcIiArIHJvdztcblxuICAgICAgaWYgKHJvdy5sZW5ndGggPiAxNSkgcm93ID0gcm93LnN1YnN0cmluZygwLCAxNCkgKyBcIi4uLlwiO1xuXG4gICAgICBpZiAoISFyb3cpIHtcbiAgICAgICAgcm93LnNwbGl0KFwiIFwiKS5mb3JFYWNoKCh3b3JkKSA9PiB7XG4gICAgICAgICAgd29yZCA9IHN0b3BUaGVXb3JkKHdvcmQudG9Mb3dlckNhc2UoKSB8fCBcIlwiKTtcbiAgICAgICAgICBpZiAoISF3b3JkKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdFt3b3JkXSkge1xuICAgICAgICAgICAgICByZXN1bHRbd29yZF0gPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0W3dvcmRdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1t0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgaWYgKCEhcm93VmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUuZm9yRWFjaChwcm9jZXNzU3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlW2tleV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzU3RyaW5nKHJvd1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gW2tleSwgcmVzdWx0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwidGV4dFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiY29tbWVudFwiLCBXb3JkQ2xvdWQpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibXVsdGlwbGV0ZXh0XCIsIFdvcmRDbG91ZCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcGxvdGx5X2pzX2Rpc3RfbWluX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3N1cnZleV9jb3JlX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3dvcmRjbG91ZF9fOyJdLCJzb3VyY2VSb290IjoiIn0=
|
|
14274
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bcGMtbmFtZV0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1twYy1uYW1lXS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvc3ZnYnVuZGxlLmh0bWwiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vbm9kZV9tb2R1bGVzL211dXJpL2Rpc3QvbXV1cmkuanMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FsdGVybmF0aXZlVml6dWFsaXplcnNXcmFwcGVyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9kdXRjaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZhcnNpLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3J1c3NpYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvYm9vbGVhbi50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvY2hvaWNlcy10YWJsZS5zY3NzP2E2OGUiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2Nob2ljZXMtdGFibGUudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2RhdGFQcm92aWRlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvZW50cmllcy9zdW1tYXJ5LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9maWx0ZXJJbmZvLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9oaXN0b2dyYW0udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL2xheW91dEVuZ2luZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbG9jYWxpemF0aW9uTWFuYWdlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvbWF0cml4LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9tYXRyaXhEcm9wZG93bkdyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL251bWJlci50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9oaXN0b2dyYW0udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9pbmRleC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L21hdHJpeGRyb3Bkb3duLWdyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Bsb3RseS9yYW5raW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvcmF0aW5nLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9wbG90bHkvc2VsZWN0QmFzZS50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvcGxvdGx5L3NldHVwLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy9zZWxlY3RCYXNlLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy90ZXh0LnNjc3M/MmM0ZSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdGV4dC50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaGVscGVycy50cyIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdXRpbHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYW5hZ2VyLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwuc2Nzcz8zYzgyIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy92aXN1YWxpemF0aW9uUGFuZWwudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJCYXNlLnNjc3M/YWZiZCIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vLi9zcmMvdmlzdWFsaXplckJhc2UudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3Zpc3VhbGl6ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2R1dGNoLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL2VuZ2xpc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC9zdG9wd29yZHMvbm9yd2VnaWFuLnRzIiwid2VicGFjazovL1twYy1uYW1lXS8uL3NyYy93b3JkY2xvdWQvc3RvcHdvcmRzL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdLy4vc3JjL3dvcmRjbG91ZC93b3JkY2xvdWQudHMiLCJ3ZWJwYWNrOi8vW3BjLW5hbWVdL2V4dGVybmFsIHtcInJvb3RcIjpcIlBsb3RseVwiLFwiY29tbW9uanMyXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImNvbW1vbmpzXCI6XCJwbG90bHkuanMtZGlzdC1taW5cIixcImFtZFwiOlwicGxvdGx5LmpzLWRpc3QtbWluXCJ9Iiwid2VicGFjazovL1twYy1uYW1lXS9leHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifSIsIndlYnBhY2s6Ly9bcGMtbmFtZV0vZXh0ZXJuYWwge1wicm9vdFwiOlwiV29yZENsb3VkXCIsXCJjb21tb25qczJcIjpcIndvcmRjbG91ZFwiLFwiY29tbW9uanNcIjpcIndvcmRjbG91ZFwiLFwiYW1kXCI6XCJ3b3JkY2xvdWRcIn0iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FB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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxnQkFBZ0I7O0FBRXBFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlDQUFpQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLHFDQUFxQztBQUNsRCxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQ0FBcUM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEscUNBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHlEQUF5RDtBQUN4Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5REFBeUQ7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGFBQWEsVUFBVTtBQUN2QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsT0FBTztBQUNwQixhQUFhLEtBQUs7QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmLGFBQWEsRUFBRTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEIsYUFBYSxvQkFBb0I7QUFDakMsYUFBYSxZQUFZO0FBQ3pCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHdEQUF3RDtBQUN2Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBd0Q7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQXdEO0FBQ3hGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCLGFBQWEsWUFBWTtBQUN6QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFNBQVM7QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEMsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CO0FBQ2hDLGVBQWU7QUFD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QUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixJQUFJO0lBQ0osSUFBSTtJQUNKLE1BQU07SUFDTixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixLQUFLO0lBQ0wsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsSUFBSTtJQUNKLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLElBQUk7SUFDSixNQUFNO0lBQ04sUUFBUTtJQUNSLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osS0FBSztJQUNMLFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osSUFBSTtJQUNKLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULEdBQUc7SUFDSCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxTQUFTO0lBQ1QsT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixXQUFXO0lBQ1gsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxPQUFPO0lBQ1AsUUFBUTtJQUNSLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsSUFBSTtJQUNKLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLElBQUk7SUFDSixJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixNQUFNO0lBQ04sSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsSUFBSTtJQUNKLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9B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d2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcIndvcmRjbG91ZFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleUFuYWx5dGljc1wiLCBbXCJwbG90bHkuanMtZGlzdC1taW5cIiwgXCJzdXJ2ZXktY29yZVwiLCBcIndvcmRjbG91ZFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlBbmFseXRpY3NcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJwbG90bHkuanMtZGlzdC1taW5cIiksIHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcIndvcmRjbG91ZFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5QW5hbHl0aWNzXCJdID0gZmFjdG9yeShyb290W1wiUGxvdGx5XCJdLCByb290W1wiU3VydmV5XCJdLCByb290W1wiV29yZENsb3VkXCJdKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9wbG90bHlfanNfZGlzdF9taW5fXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9zdXJ2ZXlfY29yZV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3dvcmRjbG91ZF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZW50cmllcy9zdW1tYXJ5LnRzXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgc3R5bGU9XFxcImRpc3BsYXk6bm9uZTtcXFwiPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRldGFpbFxcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjguNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCIxMy41XFxcIiBjeT1cXFwiOC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWRyYWdcXFwiPjxwYXRoIGQ9XFxcIk0xMyA1bC0xIDEgMSAxSDlWM2wxIDEgMS0xLTMtMy0zIDMgMSAxIDEtMXY0SDNsMS0xLTEtMS0zIDMgMyAzIDEtMS0xLTFoNHY0bC0xLTEtMSAxIDMgMyAzLTMtMS0xLTEgMVY5aDRsLTEgMSAxIDEgMy0zelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLWhpZGVcXFwiPjxwYXRoIGQ9XFxcIk0xMi43OSA0LjJMMTYgMWwtMS0xLTMuMzIgMy4zMkMxMC41NyAyLjU1IDkuMzIgMiA4IDIgMy42MyAyIDAgNy45NyAwIDcuOTdzMS4yNyAyLjEgMy4yMSAzLjgybC0zLjIzIDMuMjMuOTguOTggMy4zNS0zLjM0QzUuNDEgMTMuNDQgNi42NyAxNCA4IDE0YzQuMzcgMCA4LTYgOC02cy0xLjI3LTIuMDktMy4yMS0zLjh6TTIgNy45N2MxLjA3LTEuNDcgMy42MS00IDYtNCAuOCAwIDEuNi4yNyAyLjM1LjY4bC0uNzguNzhjLS40Ni0uMjktLjk5LS40Ni0xLjU3LS40Ni0xLjY2IDAtMyAxLjM0LTMgMyAwIC41OC4xNyAxLjExLjQ2IDEuNTdsLS45Ny45N0ExMy4zOCAxMy4zOCAwIDAgMSAyIDcuOTd6bTYgNGMtLjggMC0xLjU5LS4yNy0yLjMzLS42N2wuNzgtLjc3Yy40NS4yNy45OC40NCAxLjU1LjQ0IDEuNjYgMCAzLTEuMzQgMy0zIDAtLjU3LS4xNy0xLjA5LS40NC0xLjU1bC45OC0uOThjMS4xMS44NyAyLjAxIDEuOTEgMi40NiAyLjUyLTEuMDcgMS40OC0zLjYxIDQuMDEtNiA0LjAxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2Vwcml2YXRlXFxcIj48Y2lyY2xlIGN4PVxcXCI4XFxcIiBjeT1cXFwiNFxcXCIgcj1cXFwiM1xcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTggOGMtMy4zMSAwLTYgMi43My02IDQuNjdTNS4yNyAxNSA4IDE1czYtLjQgNi0yLjMzUzExLjMxIDggOCA4elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLW1ha2VwdWJsaWNcXFwiPjxjaXJjbGUgY3g9XFxcIjZcXFwiIGN5PVxcXCI1XFxcIiByPVxcXCIzXFxcIj48L2NpcmNsZT48cGF0aCBkPVxcXCJNMTAgNWMwIC4zNC0uMDYuNjctLjE0Ljk5LjA1IDAgLjA5LjAxLjE0LjAxIDEuNjYgMCAzLTEuMzQgMy0zcy0xLjM0LTMtMy0zQzguOTcgMCA4LjA3LjUyIDcuNTMgMS4zIDguOTggMS45MSAxMCAzLjMzIDEwIDV6TTYgOWMtMy4zMSAwLTYgMi43My02IDQuNjdTMy4yNyAxNiA2IDE2czYtLjQgNi0yLjMzUzkuMzEgOSA2IDl6TTEwIDdjLS4xOSAwLS4zOC4wMS0uNTcuMDNhNC4xNCA0LjE0IDAgMCAxLTEuMzcgMS4zOWMzIC44MyA1LjIzIDMuMzEgNS40MiA1LjI4IDEuNDQtLjMxIDIuNTItLjkyIDIuNTItMi4wM0MxNiA5Ljc0IDEzLjMxIDcgMTAgN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcInNhLXN2Zy1tb3ZldG9kZXRhaWxzXFxcIj48Y2lyY2xlIGN4PVxcXCIxLjVcXFwiIGN5PVxcXCIxNC41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjcuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTMuNVxcXCIgY3k9XFxcIjE0LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEyIDFoM3Y5aC0zek0yLjAyIDcuMDJMMSA2IDAgN2wzIDMgMy0zLTEtMS0uOTQuOTRDNC4zMyA0LjczIDYuMjEgMyA4LjUgM2MuMTcgMCAuMzMuMDMuNS4wNVYxLjAzQzguODMgMS4wMSA4LjY3IDEgOC41IDEgNS4wOCAxIDIuMjcgMy42NiAyLjAyIDcuMDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJzYS1zdmctbm9uY29tbWVyY2lhbFxcXCI+PHBhdGggZD1cXFwiTTggMEwwIDE1aDE2TDggMHptMSAxM0g3di0yaDJ2MnptLTItM1Y1aDJ2NUg3elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwic2Etc3ZnLXNvcnRpbmdcXFwiPjxwYXRoIGQ9XFxcIk04IDNsMiAyIDEtMS0zLTMtMyAzIDEgMXpNOCAxM2wtMi0yLTEgMSAzIDMgMy0zLTEtMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48L3N2Zz5cIjsiLCIvKipcbiogTXV1cmkgdjAuOC4wXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaVxuKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSGFsdHUgT3lcbiogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWx0dS9tdXVyaS9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBQYWNrZXJcbiogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKlxuKiBNdXVyaSBUaWNrZXIgLyBNdXVyaSBFbWl0dGVyIC8gTXV1cmkgUXVldWVcbiogQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQsIE5pa2xhcyBSw6Rtw7YgPGlucmFtb0BnbWFpbC5jb20+XG4qIEBsaWNlbnNlIE1JVFxuKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5NdXVyaSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBuYW1lc3BhY2UgPSAnTXV1cmknO1xuICB2YXIgZ3JpZEluc3RhbmNlcyA9IHt9O1xuXG4gIHZhciBhY3Rpb25Td2FwID0gJ3N3YXAnO1xuICB2YXIgYWN0aW9uTW92ZSA9ICdtb3ZlJztcblxuICB2YXIgZXZlbnRTeW5jaHJvbml6ZSA9ICdzeW5jaHJvbml6ZSc7XG4gIHZhciBldmVudExheW91dFN0YXJ0ID0gJ2xheW91dFN0YXJ0JztcbiAgdmFyIGV2ZW50TGF5b3V0RW5kID0gJ2xheW91dEVuZCc7XG4gIHZhciBldmVudEFkZCA9ICdhZGQnO1xuICB2YXIgZXZlbnRSZW1vdmUgPSAncmVtb3ZlJztcbiAgdmFyIGV2ZW50U2hvd1N0YXJ0ID0gJ3Nob3dTdGFydCc7XG4gIHZhciBldmVudFNob3dFbmQgPSAnc2hvd0VuZCc7XG4gIHZhciBldmVudEhpZGVTdGFydCA9ICdoaWRlU3RhcnQnO1xuICB2YXIgZXZlbnRIaWRlRW5kID0gJ2hpZGVFbmQnO1xuICB2YXIgZXZlbnRGaWx0ZXIgPSAnZmlsdGVyJztcbiAgdmFyIGV2ZW50U29ydCA9ICdzb3J0JztcbiAgdmFyIGV2ZW50TW92ZSA9ICdtb3ZlJztcbiAgdmFyIGV2ZW50U2VuZCA9ICdzZW5kJztcbiAgdmFyIGV2ZW50QmVmb3JlU2VuZCA9ICdiZWZvcmVTZW5kJztcbiAgdmFyIGV2ZW50UmVjZWl2ZSA9ICdyZWNlaXZlJztcbiAgdmFyIGV2ZW50QmVmb3JlUmVjZWl2ZSA9ICdiZWZvcmVSZWNlaXZlJztcbiAgdmFyIGV2ZW50RHJhZ0luaXQgPSAnZHJhZ0luaXQnO1xuICB2YXIgZXZlbnREcmFnU3RhcnQgPSAnZHJhZ1N0YXJ0JztcbiAgdmFyIGV2ZW50RHJhZ01vdmUgPSAnZHJhZ01vdmUnO1xuICB2YXIgZXZlbnREcmFnU2Nyb2xsID0gJ2RyYWdTY3JvbGwnO1xuICB2YXIgZXZlbnREcmFnRW5kID0gJ2RyYWdFbmQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZVN0YXJ0ID0gJ2RyYWdSZWxlYXNlU3RhcnQnO1xuICB2YXIgZXZlbnREcmFnUmVsZWFzZUVuZCA9ICdkcmFnUmVsZWFzZUVuZCc7XG4gIHZhciBldmVudERlc3Ryb3kgPSAnZGVzdHJveSc7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRW1pdHRlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGxpc3RlbmVycyBxdWV1ZSBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdID0gW107XG5cbiAgICAvLyBBZGQgdGhlIGxpc3RlbmVyIHRvIHRoZSBxdWV1ZS5cbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5iaW5kIGFsbCBldmVudCBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbGlzdGVuZXJdXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEdldCBsaXN0ZW5lcnMgYW5kIHJldHVybiBpbW1lZGlhdGVseSBpZiBub25lIGlzIGZvdW5kLlxuICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIElmIG5vIHNwZWNpZmljIGxpc3RlbmVyIGlzIHByb3ZpZGVkIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAgdmFyIGkgPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IGFsbCBsaXN0ZW5lcnMgaW4gYSBzcGVjaWZpZWQgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBFbWl0dGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHsqfSBbYXJnMV1cbiAgICogQHBhcmFtIHsqfSBbYXJnMl1cbiAgICogQHBhcmFtIHsqfSBbYXJnM11cbiAgICogQHJldHVybnMge0VtaXR0ZXJ9XG4gICAqL1xuICBFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IGV2ZW50IGxpc3RlbmVycyBhbmQgcXVpdCBlYXJseSBpZiB0aGVyZSdzIG5vIGxpc3RlbmVycy5cbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcUxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgICB2YXIgYUxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgIHZhciBpO1xuXG4gICAgLy8gQWRkIHRoZSBjdXJyZW50IGxpc3RlbmVycyB0byB0aGUgY2FsbGJhY2sgcXVldWUgYmVmb3JlIHdlIHByb2Nlc3MgdGhlbS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIGxpc3RlbmVycyBhcmUgY2FsbGVkIGluXG4gICAgLy8gY29ycmVjdCBvcmRlciBldmVuIGlmIG5ldyBldmVudCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQvYWRkZWQgZHVyaW5nXG4gICAgLy8gcHJvY2Vzc2luZyBhbmQvb3IgZXZlbnRzIGFyZSBlbWl0dGVkIGR1cmluZyBwcm9jZXNzaW5nLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICB9XG5cbiAgICAvLyBJbmNyZW1lbnQgcXVldWUgY291bnRlci4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzY2VuYXJpb3Mgd2hlcmUgZW1pdCBpc1xuICAgIC8vIHRyaWdnZXJlZCB3aGlsZSB0aGUgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2ZcbiAgICAvLyBob3cgbWFueSBcInF1ZXVlIHByb2Nlc3NvcnNcIiB0aGVyZSBhcmUgYWN0aXZlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZXNldFxuICAgIC8vIHRoZSBxdWV1ZSBpbiB0aGUgZW5kIHdoZW4gdGhlIGxhc3QgcXVldWUgcHJvY2Vzc29yIGlzIGZpbmlzaGVkLlxuICAgICsrdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlICh0aGUgc3BlY2lmaWMgcGFydCBvZiBpdCBmb3IgdGhpcyBlbWl0KS5cbiAgICBmb3IgKGkgPSBxTGVuZ3RoLCBxTGVuZ3RoID0gcXVldWUubGVuZ3RoOyBpIDwgcUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGFMZW5ndGggPT09IDAgPyBxdWV1ZVtpXSgpIDpcbiAgICAgIGFMZW5ndGggPT09IDEgPyBxdWV1ZVtpXShhcmcxKSA6XG4gICAgICBhTGVuZ3RoID09PSAyID8gcXVldWVbaV0oYXJnMSwgYXJnMikgOlxuICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW2ldKGFyZzEsIGFyZzIsIGFyZzMpO1xuXG4gICAgICAvLyBTdG9wIHByb2Nlc3NpbmcgaWYgdGhlIGVtaXR0ZXIgaXMgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEZWNyZW1lbnQgcXVldWUgcHJvY2VzcyBjb3VudGVyLlxuICAgIC0tdGhpcy5fY291bnRlcjtcblxuICAgIC8vIFJlc2V0IHRoZSBxdWV1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBxdWV1ZSBwcm9jZXNzZXMgcnVubmluZy5cbiAgICBpZiAoIXRoaXMuX2NvdW50ZXIpIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBlbWl0dGVyIGluc3RhbmNlLiBCYXNpY2FsbHkganVzdCByZW1vdmVzIGFsbCBib3VuZCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEVtaXR0ZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtFbWl0dGVyfVxuICAgKi9cbiAgRW1pdHRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgIHZhciBldmVudDtcblxuICAgIC8vIEZsYWcgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFJlc2V0IHF1ZXVlIChpZiBxdWV1ZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyB0aGlzIHdpbGwgYWxzbyBzdG9wIHRoYXQpLlxuICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IHRoaXMuX2NvdW50ZXIgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGlmIChldmVudHNbZXZlbnRdKSB7XG4gICAgICAgIGV2ZW50c1tldmVudF0ubGVuZ3RoID0gMDtcbiAgICAgICAgZXZlbnRzW2V2ZW50XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTZXQgdXAgdGhlIGRlZmF1bHQgZXhwb3J0IHZhbHVlcy5cbiAgdmFyIHRyYW5zZm9ybVN0eWxlID0gJ3RyYW5zZm9ybSc7XG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gJ3RyYW5zZm9ybSc7XG5cbiAgLy8gRmluZCB0aGUgc3VwcG9ydGVkIHRyYW5zZm9ybSBwcm9wIGFuZCBzdHlsZSBuYW1lcy5cbiAgdmFyIGRvY0VsZW1TdHlsZSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG4gIHZhciBzdHlsZSA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgc3R5bGVDYXAgPSAnVHJhbnNmb3JtJztcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIFsnJywgJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddLmZvckVhY2goZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgdmFyIHByb3BOYW1lID0gcHJlZml4ID8gcHJlZml4ICsgc3R5bGVDYXAgOiBzdHlsZTtcbiAgICBpZiAoZG9jRWxlbVN0eWxlW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVmaXggPSBwcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRyYW5zZm9ybVN0eWxlID0gcHJlZml4ID8gJy0nICsgcHJlZml4ICsgJy0nICsgc3R5bGUgOiBzdHlsZTtcbiAgICAgIHRyYW5zZm9ybVByb3AgPSBwcm9wTmFtZTtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBzdHlsZXNDYWNoZSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gbmV3IFdlYWtNYXAoKSA6IG51bGw7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBzdHlsZSBwcm9wZXJ0eSBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlKSB7XG4gICAgdmFyIHN0eWxlcyA9IHN0eWxlc0NhY2hlICYmIHN0eWxlc0NhY2hlLmdldChlbGVtZW50KTtcbiAgICBpZiAoIXN0eWxlcykge1xuICAgICAgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICBpZiAoc3R5bGVzQ2FjaGUpIHN0eWxlc0NhY2hlLnNldChlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUgPT09ICd0cmFuc2Zvcm0nID8gdHJhbnNmb3JtU3R5bGUgOiBzdHlsZSk7XG4gIH1cblxuICB2YXIgc3R5bGVOYW1lUmVnRXggPSAvKFtBLVpdKS9nO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGEgY2FtZWwgY2FzZSBzdHlsZSBwcm9wZXJ0eSB0byBrZWJhYiBjYXNlIHN0eWxlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdHlsZU5hbWUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0eWxlTmFtZVJlZ0V4LCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHZhciBzdHJGdW5jdGlvbiA9ICdmdW5jdGlvbic7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSBzdHJGdW5jdGlvbjtcbiAgfVxuXG4gIHZhciB0cmFuc2Zvcm1TdHlsZSQxID0gJ3RyYW5zZm9ybSc7XG5cbiAgLyoqXG4gICAqIFNldCBpbmxpbmUgc3R5bGVzIHRvIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICAgIGZvciAodmFyIHByb3AgaW4gc3R5bGVzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3AgPT09IHRyYW5zZm9ybVN0eWxlJDEgPyB0cmFuc2Zvcm1Qcm9wIDogcHJvcF0gPSBzdHlsZXNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZW0gYW5pbWF0aW9uIGhhbmRsZXIgcG93ZXJlZCBieSBXZWIgQW5pbWF0aW9ucyBBUEkuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBJdGVtQW5pbWF0ZShlbGVtZW50KSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fcHJvcHMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9rZXlmcmFtZXMgPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zID0ge307XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9vbkZpbmlzaCA9IHRoaXMuX29uRmluaXNoLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaW5zdGFuY2UncyBhbmltYXRpb24uIEF1dG9tYXRpY2FsbHkgc3RvcHMgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXNcbiAgICogcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc0Zyb21cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzVG9cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZWFzaW5nPSdlYXNlJ11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihwcm9wc0Zyb20sIHByb3BzVG8sIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLl9hbmltYXRpb247XG4gICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMuX3Byb3BzO1xuICAgIHZhciBjdXJyZW50VmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjYW5jZWxBbmltYXRpb24gPSBmYWxzZTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXhpc3RpbmcgYW5pbWF0aW9uIHJ1bm5pbmcsIGxldCdzIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlXG4gICAgLy8gY2FuY2VsbGVkIG9yIGlmIGl0IGNhbiBjb250aW51ZSBydW5uaW5nLlxuICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgIHZhciBwcm9wQ291bnQgPSAwO1xuICAgICAgdmFyIHByb3BJbmRleDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBhbmltYXRpb24gdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGVcbiAgICAgIC8vIGN1cnJlbnQgcHJvcHMgYW5kIHZhbHVlcy5cbiAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgICAgKytwcm9wQ291bnQ7XG4gICAgICAgIHByb3BJbmRleCA9IGN1cnJlbnRQcm9wcy5pbmRleE9mKHByb3BOYW1lKTtcbiAgICAgICAgaWYgKHByb3BJbmRleCA9PT0gLTEgfHwgcHJvcHNUb1twcm9wTmFtZV0gIT09IGN1cnJlbnRWYWx1ZXNbcHJvcEluZGV4XSkge1xuICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBwcm9wcyBjb3VudCBtYXRjaGVzIGN1cnJlbnQgcHJvcHMgY291bnQuIFRoaXMgaXNcbiAgICAgIC8vIG5lZWRlZCBmb3IgdGhlIGVkZ2UgY2FzZSBzY2VuYXJpbyB3aGVyZSB0YXJnZXQgcHJvcHMgY29udGFpbiB0aGUgc2FtZVxuICAgICAgLy8gc3R5bGVzIGFzIGN1cnJlbnQgcHJvcHMsIGJ1dCB0aGUgY3VycmVudCBwcm9wcyBoYXZlIHNvbWUgYWRkaXRpb25hbFxuICAgICAgLy8gcHJvcHMuXG4gICAgICBpZiAoIWNhbmNlbEFuaW1hdGlvbiAmJiBwcm9wQ291bnQgIT09IGN1cnJlbnRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYW5pbWF0aW9uIChpZiByZXF1aXJlZCkuXG4gICAgaWYgKGNhbmNlbEFuaW1hdGlvbikgYW5pbWF0aW9uLmNhbmNlbCgpO1xuXG4gICAgLy8gU3RvcmUgYW5pbWF0aW9uIGNhbGxiYWNrLlxuICAgIHRoaXMuX2NhbGxiYWNrID0gaXNGdW5jdGlvbihvcHRzLm9uRmluaXNoKSA/IG9wdHMub25GaW5pc2ggOiBudWxsO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHJ1bm5pbmcgYW5pbWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0byBiZSBjYW5jZWxsZWQsIGxldCdzXG4gICAgLy8gY2FsbCBpdCBhIGRheSBoZXJlIGFuZCBsZXQgaXQgcnVuLlxuICAgIGlmIChhbmltYXRpb24gJiYgIWNhbmNlbEFuaW1hdGlvbikgcmV0dXJuO1xuXG4gICAgLy8gU3RvcmUgdGFyZ2V0IHByb3BzIGFuZCB2YWx1ZXMgdG8gaW5zdGFuY2UuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgICBmb3IgKHByb3BOYW1lIGluIHByb3BzVG8pIHtcbiAgICAgIGN1cnJlbnRQcm9wcy5wdXNoKHByb3BOYW1lKTtcbiAgICAgIGN1cnJlbnRWYWx1ZXMucHVzaChwcm9wc1RvW3Byb3BOYW1lXSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGtleWZyYW1lcy5cbiAgICB2YXIgYW5pbUtleWZyYW1lcyA9IHRoaXMuX2tleWZyYW1lcztcbiAgICBhbmltS2V5ZnJhbWVzWzBdID0gcHJvcHNGcm9tO1xuICAgIGFuaW1LZXlmcmFtZXNbMV0gPSBwcm9wc1RvO1xuXG4gICAgLy8gU2V0IHVwIG9wdGlvbnMuXG4gICAgdmFyIGFuaW1PcHRpb25zID0gdGhpcy5fb3B0aW9ucztcbiAgICBhbmltT3B0aW9ucy5kdXJhdGlvbiA9IG9wdHMuZHVyYXRpb24gfHwgMzAwO1xuICAgIGFuaW1PcHRpb25zLmVhc2luZyA9IG9wdHMuZWFzaW5nIHx8ICdlYXNlJztcblxuICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgYW5pbWF0aW9uID0gZWxlbWVudC5hbmltYXRlKGFuaW1LZXlmcmFtZXMsIGFuaW1PcHRpb25zKTtcbiAgICBhbmltYXRpb24ub25maW5pc2ggPSB0aGlzLl9vbkZpbmlzaDtcbiAgICB0aGlzLl9hbmltYXRpb24gPSBhbmltYXRpb247XG5cbiAgICAvLyBTZXQgdGhlIGVuZCBzdHlsZXMuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBlbGVtZW50IHN0YXlzIGF0IHRoZSBlbmRcbiAgICAvLyB2YWx1ZXMgYWZ0ZXIgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLlxuICAgIHNldFN0eWxlcyhlbGVtZW50LCBwcm9wc1RvKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcCBpbnN0YW5jZSdzIGN1cnJlbnQgYW5pbWF0aW9uIGlmIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1BbmltYXRlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW3N0eWxlc11cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oc3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9hbmltYXRpb24pIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgdmFyIGN1cnJlbnRWYWx1ZXMgPSB0aGlzLl92YWx1ZXM7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBwcm9wVmFsdWU7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBDYWxjdWxhdGUgKGlmIG5vdCBwcm92aWRlZCkgYW5kIHNldCBzdHlsZXMuXG4gICAgaWYgKCFzdHlsZXMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50UHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcHJvcE5hbWUgPSBjdXJyZW50UHJvcHNbaV07XG4gICAgICAgIHByb3BWYWx1ZSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wTmFtZSkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BOYW1lID09PSAndHJhbnNmb3JtJyA/IHRyYW5zZm9ybVByb3AgOiBwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpO1xuICAgIH1cblxuICAgIC8vICBDYW5jZWwgYW5pbWF0aW9uLlxuICAgIHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICB0aGlzLl9hbmltYXRpb24gPSB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzIGFuZCB2YWx1ZXMuXG4gICAgY3VycmVudFByb3BzLmxlbmd0aCA9IGN1cnJlbnRWYWx1ZXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgYmVpbmcgYW5pbWF0ZWQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtQW5pbWF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW1BbmltYXRlLnByb3RvdHlwZS5pc0FuaW1hdGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2FuaW1hdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9vcHRpb25zID0gdGhpcy5fa2V5ZnJhbWVzID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQW5pbWF0aW9uIGVuZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUFuaW1hdGUucHJvdG90eXBlXG4gICAqL1xuICBJdGVtQW5pbWF0ZS5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2s7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gdGhpcy5fY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX3Byb3BzLmxlbmd0aCA9IHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgdmFyIHZlbmRvclByZWZpeGVzID0gWycnLCAnd2Via2l0JywgJ21veicsICdtcycsICdvJywgJ1dlYmtpdCcsICdNb3onLCAnTVMnLCAnTyddO1xuXG4gIC8qKlxuICAgKiBHZXQgcHJlZml4ZWQgQ1NTIHByb3BlcnR5IG5hbWUgd2hlbiBnaXZlbiBhIG5vbi1wcmVmaXhlZCBDU1MgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1TdHlsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcE5hbWVcbiAgICogQHJldHVybnMgeyFTdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1TdHlsZSwgcHJvcE5hbWUpIHtcbiAgICB2YXIgY2FtZWxQcm9wTmFtZSA9IHByb3BOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wTmFtZS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZWZpeDtcbiAgICB2YXIgcHJlZml4ZWRQcm9wTmFtZTtcblxuICAgIHdoaWxlIChpIDwgdmVuZG9yUHJlZml4ZXMubGVuZ3RoKSB7XG4gICAgICBwcmVmaXggPSB2ZW5kb3JQcmVmaXhlc1tpXTtcbiAgICAgIHByZWZpeGVkUHJvcE5hbWUgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3BOYW1lIDogcHJvcE5hbWU7XG4gICAgICBpZiAocHJlZml4ZWRQcm9wTmFtZSBpbiBlbGVtU3R5bGUpIHJldHVybiBwcmVmaXhlZFByb3BOYW1lO1xuICAgICAgKytpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGR0ID0gMTAwMCAvIDYwO1xuXG4gIHZhciByYWYgPSAoXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKGR0KTtcbiAgICAgIH0sIGR0KTtcbiAgICB9XG4gICkuYmluZCh3aW5kb3cpO1xuXG4gIC8vIERldGVjdCBzdXBwb3J0IGZvciBwYXNzaXZlIGV2ZW50czpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQjZmVhdHVyZS1kZXRlY3Rpb25cbiAgdmFyIGlzUGFzc2l2ZUV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBwYXNzaXZlT3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVPcHRzKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBwYXNzaXZlT3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgLy8gRHJhZ2dlciBldmVudHMuXG4gIHZhciBldmVudHMgPSB7XG4gICAgc3RhcnQ6ICdzdGFydCcsXG4gICAgbW92ZTogJ21vdmUnLFxuICAgIGVuZDogJ2VuZCcsXG4gICAgY2FuY2VsOiAnY2FuY2VsJ1xuICB9O1xuXG4gIHZhciBoYXNUb3VjaEV2ZW50cyA9ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuVG91Y2hFdmVudCk7XG4gIHZhciBoYXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xuICB2YXIgaGFzTXNQb2ludGVyRXZlbnRzID0gISF3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG4gIHZhciBpc0FuZHJvaWQgPSAvKGFuZHJvaWQpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBsaXN0ZW5lck9wdGlvbnMgPSBpc1Bhc3NpdmVFdmVudHNTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlO1xuXG4gIHZhciB0YVByb3AgPSAndG91Y2hBY3Rpb24nO1xuICB2YXIgdGFQcm9wUHJlZml4ZWQgPSBnZXRQcmVmaXhlZFByb3BOYW1lKHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsIHRhUHJvcCk7XG4gIHZhciB0YURlZmF1bHRWYWx1ZSA9ICdhdXRvJztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEcmFnZ2VyIGluc3RhbmNlIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3NzUHJvcHNdXG4gICAqL1xuICBmdW5jdGlvbiBEcmFnZ2VyKGVsZW1lbnQsIGNzc1Byb3BzKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jc3NQcm9wcyA9IHt9O1xuICAgIHRoaXMuX3RvdWNoQWN0aW9uID0gJyc7XG4gICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG5cbiAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5fc3RhcnRYID0gMDtcbiAgICB0aGlzLl9zdGFydFkgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRYID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WSA9IDA7XG5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uU3RhcnQgPSB0aGlzLl9vblN0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Nb3ZlID0gdGhpcy5fb25Nb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25DYW5jZWwgPSB0aGlzLl9vbkNhbmNlbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRW5kID0gdGhpcy5fb25FbmQuYmluZCh0aGlzKTtcblxuICAgIC8vIEFwcGx5IGluaXRpYWwgY3NzIHByb3BzLlxuICAgIHRoaXMuc2V0Q3NzUHJvcHMoY3NzUHJvcHMpO1xuXG4gICAgLy8gSWYgdG91Y2ggYWN0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2l0aCBpbml0aWFsIGNzcyBwcm9wcyBsZXQncyBhc3N1bWUgaXQnc1xuICAgIC8vIGF1dG8uXG4gICAgaWYgKCF0aGlzLl90b3VjaEFjdGlvbikge1xuICAgICAgdGhpcy5zZXRUb3VjaEFjdGlvbih0YURlZmF1bHRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBuYXRpdmUgbGluay9pbWFnZSBkcmFnZ2luZyBmb3IgdGhlIGl0ZW0gYW5kIGl0J3MgYW5jZXN0b3JzLlxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIExpc3RlbiB0byBzdGFydCBldmVudC5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fZXZlbnRzLnN0YXJ0LCB0aGlzLl9wcmVTdGFydENoZWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSB0b3VjaCBldmVudHMsIGJ1dCBubyBwb2ludGVyIGV2ZW50cyB3ZSBuZWVkIHRvIGFsc28gbGlzdGVuIGZvclxuICAgIC8vIG1vdXNlIGV2ZW50cyBpbiBhZGRpdGlvbiB0byB0b3VjaCBldmVudHMgZm9yIGRldmljZXMgd2hpY2ggc3VwcG9ydCBib3RoXG4gICAgLy8gbW91c2UgYW5kIHRvdWNoIGludGVyYWN0aW9uLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cyAmJiAhaGFzUG9pbnRlckV2ZW50cyAmJiAhaGFzTXNQb2ludGVyRXZlbnRzKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3BvaW50ZXJFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdwb2ludGVyZG93bicsXG4gICAgbW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgICBjYW5jZWw6ICdwb2ludGVyY2FuY2VsJyxcbiAgICBlbmQ6ICdwb2ludGVydXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fbXNQb2ludGVyRXZlbnRzID0ge1xuICAgIHN0YXJ0OiAnTVNQb2ludGVyRG93bicsXG4gICAgbW92ZTogJ01TUG9pbnRlck1vdmUnLFxuICAgIGNhbmNlbDogJ01TUG9pbnRlckNhbmNlbCcsXG4gICAgZW5kOiAnTVNQb2ludGVyVXAnXG4gIH07XG5cbiAgRHJhZ2dlci5fdG91Y2hFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3ZlOiAndG91Y2htb3ZlJyxcbiAgICBjYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gICAgZW5kOiAndG91Y2hlbmQnXG4gIH07XG5cbiAgRHJhZ2dlci5fbW91c2VFdmVudHMgPSB7XG4gICAgc3RhcnQ6ICdtb3VzZWRvd24nLFxuICAgIG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIGNhbmNlbDogJycsXG4gICAgZW5kOiAnbW91c2V1cCdcbiAgfTtcblxuICBEcmFnZ2VyLl9ldmVudHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGhhc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9wb2ludGVyRXZlbnRzO1xuICAgIGlmIChoYXNNc1BvaW50ZXJFdmVudHMpIHJldHVybiBEcmFnZ2VyLl9tc1BvaW50ZXJFdmVudHM7XG4gICAgaWYgKGhhc1RvdWNoRXZlbnRzKSByZXR1cm4gRHJhZ2dlci5fdG91Y2hFdmVudHM7XG4gICAgcmV0dXJuIERyYWdnZXIuX21vdXNlRXZlbnRzO1xuICB9KSgpO1xuXG4gIERyYWdnZXIuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgc3RhdGljIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0ICYmIGUuY2FuY2VsYWJsZSAhPT0gZmFsc2UpIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9hY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHJldHVybjtcblxuICAgIERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5tb3ZlLCBpbnN0YW5jZS5fb25Nb3ZlKTtcbiAgICBEcmFnZ2VyLl9lbWl0dGVyLm9uKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vbihldmVudHMuZW5kLCBpbnN0YW5jZS5fb25FbmQpO1xuXG4gICAgaWYgKERyYWdnZXIuX2FjdGl2ZUluc3RhbmNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH07XG5cbiAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgaW5kZXggPSBEcmFnZ2VyLl9hY3RpdmVJbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLm1vdmUsIGluc3RhbmNlLl9vbk1vdmUpO1xuICAgIERyYWdnZXIuX2VtaXR0ZXIub2ZmKGV2ZW50cy5jYW5jZWwsIGluc3RhbmNlLl9vbkNhbmNlbCk7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5vZmYoZXZlbnRzLmVuZCwgaW5zdGFuY2UuX29uRW5kKTtcblxuICAgIGlmICghRHJhZ2dlci5fYWN0aXZlSW5zdGFuY2VzLmxlbmd0aCkge1xuICAgICAgRHJhZ2dlci5fdW5iaW5kTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyYWdnZXIuX2JpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl91bmJpbmRMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnRzID0gRHJhZ2dlci5fZXZlbnRzO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5tb3ZlLCBEcmFnZ2VyLl9vbk1vdmUsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRzLmVuZCwgRHJhZ2dlci5fb25FbmQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZXZlbnRzLmNhbmNlbCAmJiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudHMuY2FuY2VsLCBEcmFnZ2VyLl9vbkNhbmNlbCwgbGlzdGVuZXJPcHRpb25zKTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRFdmVudFBvaW50ZXJJZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwb2ludGVyIGlkIGF2YWlsYWJsZSBsZXQncyB1c2UgaXQuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkO1xuICAgIH1cblxuICAgIC8vIEZvciB0b3VjaCBldmVudHMgbGV0J3MgZ2V0IHRoZSBmaXJzdCBjaGFuZ2VkIHRvdWNoJ3MgaWRlbnRpZmllci5cbiAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHtcbiAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3VzZS9vdGhlciBldmVudHMgbGV0J3MgcHJvdmlkZSBhIHN0YXRpYyBpZC5cbiAgICByZXR1cm4gMTtcbiAgfTtcblxuICBEcmFnZ2VyLl9nZXRUb3VjaEJ5SWQgPSBmdW5jdGlvbihldmVudCwgaWQpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9pbnRlciBldmVudCByZXR1cm4gdGhlIHdob2xlIGV2ZW50IGlmIHRoZXJlJ3MgYSBtYXRjaCwgYW5kXG4gICAgLy8gbnVsbCBvdGhlcndpc2UuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gZXZlbnQucG9pbnRlcklkID09PSBpZCA/IGV2ZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgdG91Y2ggZXZlbnRzIGxldCdzIGNoZWNrIGlmIHRoZXJlJ3MgYSBjaGFuZ2VkIHRvdWNoIG9iamVjdCB0aGF0IG1hdGNoZXNcbiAgICAvLyB0aGUgcG9pbnRlcklkIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZSB0b3VjaCBvYmplY3QuXG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyID09PSBpZCkge1xuICAgICAgICAgIHJldHVybiBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vdXNlL290aGVyIGV2ZW50cyBsZXQncyBhc3N1bWUgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGFuZCBqdXN0XG4gICAgLy8gcmV0dXJuIHRoZSBldmVudC5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMubW92ZSwgZSk7XG4gIH07XG5cbiAgRHJhZ2dlci5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgRHJhZ2dlci5fZW1pdHRlci5lbWl0KGV2ZW50cy5jYW5jZWwsIGUpO1xuICB9O1xuXG4gIERyYWdnZXIuX29uRW5kID0gZnVuY3Rpb24oZSkge1xuICAgIERyYWdnZXIuX2VtaXR0ZXIuZW1pdChldmVudHMuZW5kLCBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXNldCBjdXJyZW50IGRyYWcgb3BlcmF0aW9uIChpZiBhbnkpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fcG9pbnRlcklkID0gbnVsbDtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3N0YXJ0WCA9IDA7XG4gICAgdGhpcy5fc3RhcnRZID0gMDtcbiAgICB0aGlzLl9jdXJyZW50WCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFkgPSAwO1xuICAgIHRoaXMuX3N0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICB0aGlzLl9hYm9ydE5vbkNhbmNlbGFibGUsXG4gICAgICBsaXN0ZW5lck9wdGlvbnNcbiAgICApO1xuXG4gICAgRHJhZ2dlci5fZGVhY3RpdmF0ZUluc3RhbmNlKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjdXN0b20gZHJhZ2dlciBldmVudCBmcm9tIGEgcmF3IGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICogQHJldHVybnMge0RyYWdnZXJFdmVudH1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9jcmVhdGVFdmVudCA9IGZ1bmN0aW9uKHR5cGUsIGUpIHtcbiAgICB2YXIgdG91Y2ggPSB0aGlzLl9nZXRUcmFja2VkVG91Y2goZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEhhbW1lci5qcyBjb21wYXRpYmlsaXR5IGludGVyZmFjZS5cbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBzcmNFdmVudDogZSxcbiAgICAgIGRpc3RhbmNlOiB0aGlzLmdldERpc3RhbmNlKCksXG4gICAgICBkZWx0YVg6IHRoaXMuZ2V0RGVsdGFYKCksXG4gICAgICBkZWx0YVk6IHRoaXMuZ2V0RGVsdGFZKCksXG4gICAgICBkZWx0YVRpbWU6IHR5cGUgPT09IGV2ZW50cy5zdGFydCA/IDAgOiB0aGlzLmdldERlbHRhVGltZSgpLFxuICAgICAgaXNGaXJzdDogdHlwZSA9PT0gZXZlbnRzLnN0YXJ0LFxuICAgICAgaXNGaW5hbDogdHlwZSA9PT0gZXZlbnRzLmVuZCB8fCB0eXBlID09PSBldmVudHMuY2FuY2VsLFxuICAgICAgLy8gUGFydGlhbCBUb3VjaCBBUEkgaW50ZXJmYWNlLlxuICAgICAgaWRlbnRpZmllcjogdGhpcy5fcG9pbnRlcklkLFxuICAgICAgc2NyZWVuWDogdG91Y2guc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IHRvdWNoLnNjcmVlblksXG4gICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICAgIHBhZ2VYOiB0b3VjaC5wYWdlWCxcbiAgICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgICAgIHRhcmdldDogdG91Y2gudGFyZ2V0XG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhIHJhdyBldmVudCBhcyBkcmFnZ2VyIGV2ZW50IGludGVybmFsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2VtaXQgPSBmdW5jdGlvbih0eXBlLCBlKSB7XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0KHR5cGUsIHRoaXMuX2NyZWF0ZUV2ZW50KHR5cGUsIGUpKTtcbiAgfTtcblxuICAvKipcbiAgICogSWYgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIGEgUG9pbnRlckV2ZW50IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGl0IGlmIGl0IGhhc1xuICAgKiB0aGUgc2FtZSBwb2ludGVySWQgYXMgdGhlIGluc3RhbmNlLiBJZiB0aGUgcHJvdmlkZWQgZXZlbnQgaXMgYSBUb3VjaEV2ZW50XG4gICAqIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGxvb2sgZm9yIGEgVG91Y2ggaW5zdGFuY2UgaW4gdGhlIGNoYW5nZWRUb3VjaGVzIHRoYXRcbiAgICogaGFzIGFuIGlkZW50aWZpZXIgbWF0Y2hpbmcgdGhpcyBpbnN0YW5jZSdzIHBvaW50ZXJJZC4gSWYgdGhlIHByb3ZpZGVkIGV2ZW50XG4gICAqIGlzIGEgTW91c2VFdmVudCAob3IganVzdCBhbnkgb3RoZXIgZXZlbnQgdGhhbiBQb2ludGVyRXZlbnQgb3IgVG91Y2hFdmVudClcbiAgICogaXQgd2lsbCBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfVxuICAgKiBAcmV0dXJucyB7PyhUb3VjaHxQb2ludGVyRXZlbnR8TW91c2VFdmVudCl9XG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fZ2V0VHJhY2tlZFRvdWNoID0gZnVuY3Rpb24oZSkge1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHJhZ2dlci5fZ2V0VG91Y2hCeUlkKGUsIHRoaXMuX3BvaW50ZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBIHByZS1oYW5kbGVyIGZvciBzdGFydCBldmVudCB0aGF0IGNoZWNrcyBpZiB3ZSBjYW4gc3RhcnQgZHJhZ2dpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGJlaW5nIGRyYWdnZWQgY3VycmVudGx5LlxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkgcmV0dXJuO1xuXG4gICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgIC8vIHN0YXJ0aW5nIGlmIG5hdGl2ZSBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MuIFBhcnQgMS5cbiAgICBpZiAoaXNBbmRyb2lkICYmIGUuY2FuY2VsYWJsZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIC8vIE1ha2Ugc3VyZSBsZWZ0IGJ1dHRvbiBpcyBwcmVzc2VkIG9uIG1vdXNlLlxuICAgIGlmIChlLmJ1dHRvbikgcmV0dXJuO1xuXG4gICAgLy8gR2V0IChhbmQgc2V0KSBwb2ludGVyIGlkLlxuICAgIHRoaXMuX3BvaW50ZXJJZCA9IERyYWdnZXIuX2dldEV2ZW50UG9pbnRlcklkKGUpO1xuICAgIGlmICh0aGlzLl9wb2ludGVySWQgPT09IG51bGwpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRoZSBzdGFydCBldmVudCBhbmQgdHJpZ2dlciBzdGFydCAoYXN5bmMgb3Igc3luYykuIFBvaW50ZXIgZXZlbnRzXG4gICAgLy8gYXJlIGVtaXR0ZWQgYmVmb3JlIHRvdWNoIGV2ZW50cyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBib3RoIG9mIHRoZW0uIEFuZFxuICAgIC8vIGlmIHlvdSB0cnkgdG8gbW92ZSBhbiBlbGVtZW50IGJlZm9yZSBgdG91Y2hzdGFydGAgaXMgZW1pdHRlZCB0aGUgcG9pbnRlclxuICAgIC8vIGV2ZW50cyBmb3IgdGhhdCBlbGVtZW50IHdpbGwgYmUgY2FuY2VsZWQuIFRoZSBmaXggaXMgdG8gZGVsYXkgdGhlIGVtaXR0ZWRcbiAgICAvLyBwb2ludGVyIGV2ZW50cyBpbiBzdWNoIGEgc2NlbmFyaW8gYnkgb25lIGZyYW1lIHNvIHRoYXQgYHRvdWNoc3RhcnRgIGhhc1xuICAgIC8vIHRpbWUgdG8gYmUgZW1pdHRlZCBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgKHBvdGVudGlhbGx5KSBtb3ZlZC5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gZTtcbiAgICBpZiAoaGFzVG91Y2hFdmVudHMgJiYgKGhhc1BvaW50ZXJFdmVudHMgfHwgaGFzTXNQb2ludGVyRXZlbnRzKSkge1xuICAgICAgLy8gU3BlY2lhbCBjYW5jZWxhYmxlIGNoZWNrIGZvciBBbmRyb2lkIHRvIHByZXZlbnQgZHJhZyBwcm9jZWR1cmUgZnJvbVxuICAgICAgLy8gc3RhcnRpbmcgaWYgbmF0aXZlIHNjcm9sbGluZyBpcyBpbiBwcm9ncmVzcy4gUGFydCAyLlxuICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsXG4gICAgICAgICAgdGhpcy5fYWJvcnROb25DYW5jZWxhYmxlLFxuICAgICAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmFmKHRoaXMuX29uU3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXJ0KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBYm9ydCBzdGFydCBldmVudCBpZiBpdCB0dXJucyBvdXQgdG8gYmUgbm9uLWNhbmNlbGFibGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0geyhQb2ludGVyRXZlbnR8VG91Y2hFdmVudHxNb3VzZUV2ZW50KX0gZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX2Fib3J0Tm9uQ2FuY2VsYWJsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCxcbiAgICAgIHRoaXMuX2Fib3J0Tm9uQ2FuY2VsYWJsZSxcbiAgICAgIGxpc3RlbmVyT3B0aW9uc1xuICAgICk7XG5cbiAgICBpZiAodGhpcy5fc3RhcnRFdmVudCAmJiBlLmNhbmNlbGFibGUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9wb2ludGVySWQgPSBudWxsO1xuICAgICAgdGhpcy5fc3RhcnRFdmVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZHJhZyBwcm9jZWR1cmUgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuX29uU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZSA9IHRoaXMuX3N0YXJ0RXZlbnQ7XG4gICAgaWYgKCFlKSByZXR1cm47XG5cbiAgICB0aGlzLl9zdGFydEV2ZW50ID0gbnVsbDtcblxuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdXAgaW5pdCBkYXRhIGFuZCBlbWl0IHN0YXJ0IGV2ZW50LlxuICAgIHRoaXMuX3N0YXJ0WCA9IHRoaXMuX2N1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICB0aGlzLl9zdGFydFkgPSB0aGlzLl9jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLl9lbWl0KGV2ZW50cy5zdGFydCwgZSk7XG4gICAgRHJhZ2dlci5fYWN0aXZhdGVJbnN0YW5jZSh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbW92ZSBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgIHZhciB0b3VjaCA9IHRoaXMuX2dldFRyYWNrZWRUb3VjaChlKTtcbiAgICBpZiAoIXRvdWNoKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgdGhpcy5fY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHRoaXMuX2VtaXQoZXZlbnRzLm1vdmUsIGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBtb3ZlIGNhbmNlbCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KFBvaW50ZXJFdmVudHxUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfSBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5fb25DYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRUcmFja2VkVG91Y2goZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2VtaXQoZXZlbnRzLmNhbmNlbCwgZSk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgZW5kIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoUG9pbnRlckV2ZW50fFRvdWNoRXZlbnR8TW91c2VFdmVudCl9IGVcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLl9vbkVuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoIXRoaXMuX2dldFRyYWNrZWRUb3VjaChlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZW1pdChldmVudHMuZW5kLCBlKTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZWxlbWVudCBpcyBiZWluZyBkcmFnZ2VkIGF0IHRoZSBtb21lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuaXNEcmFnZ2luZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wb2ludGVySWQgIT09IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBlbGVtZW50J3MgdG91Y2gtYWN0aW9uIENTUyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5zZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgLy8gU3RvcmUgdW5tb2RpZmllZCB0b3VjaCBhY3Rpb24gdmFsdWUgKHdlIHRydXN0IHVzZXIgaW5wdXQgaGVyZSkuXG4gICAgdGhpcy5fdG91Y2hBY3Rpb24gPSB2YWx1ZTtcblxuICAgIC8vIFNldCB0b3VjaC1hY3Rpb24gc3R5bGUuXG4gICAgaWYgKHRhUHJvcFByZWZpeGVkKSB7XG4gICAgICB0aGlzLl9jc3NQcm9wc1t0YVByb3BQcmVmaXhlZF0gPSAnJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiB1bnN1cHBvcnRlZCB0b3VjaC1hY3Rpb24gdmFsdWUgbGV0J3MgYWRkIGEgc3BlY2lhbCBsaXN0ZW5lclxuICAgIC8vIHRoYXQgcHJldmVudHMgZGVmYXVsdCBhY3Rpb24gb24gdG91Y2ggc3RhcnQgZXZlbnQuIEEgZGlydHkgaGFjaywgYnV0IGJlc3RcbiAgICAvLyB3ZSBjYW4gZG8gZm9yIG5vdy4gVGhlIG90aGVyIG9wdGlvbnMgd291bGQgYmUgdG8gc29tZWhvdyBwb2x5ZmlsbCB0aGVcbiAgICAvLyB1bnN1cHBvcnRlZCB0b3VjaCBhY3Rpb24gYmVoYXZpb3Igd2l0aCBjdXN0b20gaGV1cmlzdGljcyB3aGljaCBzb3VuZHMgbGlrZVxuICAgIC8vIGEgY2FuIG9mIHdvcm1zLlxuICAgIGlmIChoYXNUb3VjaEV2ZW50cykge1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKERyYWdnZXIuX3RvdWNoRXZlbnRzLnN0YXJ0LCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGVbdGFQcm9wUHJlZml4ZWRdICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fdG91Y2hFdmVudHMuc3RhcnQsIERyYWdnZXIuX3ByZXZlbnREZWZhdWx0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgZWxlbWVudCdzIENTUyBwcm9wZXJ0aWVzLiBBY2NlcHRzIGFuIG9iamVjdCB3aXRoIGNhbWVsIGNhc2VkIHN0eWxlXG4gICAqIHByb3BzIHdpdGggdmFsdWUgcGFpcnMgYXMgaXQncyBmaXJzdCBhcmd1bWVudC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtuZXdQcm9wc11cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLnNldENzc1Byb3BzID0gZnVuY3Rpb24obmV3UHJvcHMpIHtcbiAgICBpZiAoIW5ld1Byb3BzKSByZXR1cm47XG5cbiAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5fY3NzUHJvcHM7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBwcm9wO1xuICAgIHZhciBwcmVmaXhlZFByb3A7XG5cbiAgICAvLyBSZXNldCBjdXJyZW50IHByb3BzLlxuICAgIGZvciAocHJvcCBpbiBjdXJyZW50UHJvcHMpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBjdXJyZW50UHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgY3VycmVudFByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIC8vIFNldCBuZXcgcHJvcHMuXG4gICAgZm9yIChwcm9wIGluIG5ld1Byb3BzKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciB0aGUgcHJvcC5cbiAgICAgIGlmICghbmV3UHJvcHNbcHJvcF0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0b3VjaC1hY3Rpb24uXG4gICAgICBpZiAocHJvcCA9PT0gdGFQcm9wKSB7XG4gICAgICAgIHRoaXMuc2V0VG91Y2hBY3Rpb24obmV3UHJvcHNbcHJvcF0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHByZWZpeGVkIHByb3AgYW5kIHNraXAgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICBwcmVmaXhlZFByb3AgPSBnZXRQcmVmaXhlZFByb3BOYW1lKGVsZW1lbnQuc3R5bGUsIHByb3ApO1xuICAgICAgaWYgKCFwcmVmaXhlZFByb3ApIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTdG9yZSB0aGUgcHJvcCBhbmQgYWRkIHRoZSBzdHlsZS5cbiAgICAgIGN1cnJlbnRQcm9wc1twcmVmaXhlZFByb3BdID0gJyc7XG4gICAgICBlbGVtZW50LnN0eWxlW3ByZWZpeGVkUHJvcF0gPSBuZXdQcm9wc1twcm9wXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBtdWNoIHRoZSBwb2ludGVyIGhhcyBtb3ZlZCBvbiB4LWF4aXMgZnJvbSBzdGFydCBwb3NpdGlvbiwgaW4gcGl4ZWxzLlxuICAgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgbW92ZW1lbnQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGVsdGFYID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRYIC0gdGhpcy5fc3RhcnRYO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIb3cgbXVjaCB0aGUgcG9pbnRlciBoYXMgbW92ZWQgb24geS1heGlzIGZyb20gc3RhcnQgcG9zaXRpb24sIGluIHBpeGVscy5cbiAgICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIG1vdmVtZW50IGZyb20gdG9wIHRvIGJvdHRvbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhWSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50WSAtIHRoaXMuX3N0YXJ0WTtcbiAgfTtcblxuICAvKipcbiAgICogSG93IGZhciAoaW4gcGl4ZWxzKSBoYXMgcG9pbnRlciBtb3ZlZCBmcm9tIHN0YXJ0IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBEcmFnZ2VyLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgRHJhZ2dlci5wcm90b3R5cGUuZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuZ2V0RGVsdGFYKCk7XG4gICAgdmFyIHkgPSB0aGlzLmdldERlbHRhWSgpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGhhcyBwb2ludGVyIGJlZW4gZHJhZ2dlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLmdldERlbHRhVGltZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWUgPyBEYXRlLm5vdygpIC0gdGhpcy5fc3RhcnRUaW1lIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBkcmFnIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgRHJhZ2dlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgKiAgIC0gJ3N0YXJ0JywgJ21vdmUnLCAnY2FuY2VsJyBvciAnZW5kJy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICovXG4gIERyYWdnZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50cywgbGlzdGVuZXIpIHtcbiAgICB0aGlzLl9lbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHVuYmluZCBhbGwgZHJhZyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIERyYWdnZXIucHJvdG90eXBlXG4gICAqL1xuICBEcmFnZ2VyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGV2ZW50cyA9IERyYWdnZXIuX2V2ZW50cztcblxuICAgIC8vIFJlc2V0IGRhdGEgYW5kIGRlYWN0aXZhdGUgdGhlIGluc3RhbmNlLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBEZXN0cm95IGVtaXR0ZXIuXG4gICAgdGhpcy5fZW1pdHRlci5kZXN0cm95KCk7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50cy5zdGFydCwgdGhpcy5fcHJlU3RhcnRDaGVjaywgbGlzdGVuZXJPcHRpb25zKTtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRHJhZ2dlci5fbW91c2VFdmVudHMuc3RhcnQsIHRoaXMuX3ByZVN0YXJ0Q2hlY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBEcmFnZ2VyLl9wcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihEcmFnZ2VyLl90b3VjaEV2ZW50cy5zdGFydCwgRHJhZ2dlci5fcHJldmVudERlZmF1bHQsIGZhbHNlKTtcblxuICAgIC8vIFJlc2V0IHN0eWxlcy5cbiAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX2Nzc1Byb3BzKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgICBkZWxldGUgdGhpcy5fY3NzUHJvcHNbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgZGF0YS5cbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIE1hcmsgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQSB0aWNrZXIgc3lzdGVtIGZvciBoYW5kbGluZyBET00gcmVhZHMgYW5kIHdyaXRlcyBpbiBhbiBlZmZpY2llbnQgd2F5LlxuICAgKiBDb250YWlucyBhIHJlYWQgcXVldWUgYW5kIGEgd3JpdGUgcXVldWUgdGhhdCBhcmUgcHJvY2Vzc2VkIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZSB3aGVuIG5lZWRlZC5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBUaWNrZXIoKSB7XG4gICAgdGhpcy5fbmV4dFN0ZXAgPSBudWxsO1xuXG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9yZWFkcyA9IHt9O1xuICAgIHRoaXMuX3dyaXRlcyA9IHt9O1xuXG4gICAgdGhpcy5fYmF0Y2ggPSBbXTtcbiAgICB0aGlzLl9iYXRjaFJlYWRzID0ge307XG4gICAgdGhpcy5fYmF0Y2hXcml0ZXMgPSB7fTtcblxuICAgIHRoaXMuX3N0ZXAgPSB0aGlzLl9zdGVwLmJpbmQodGhpcyk7XG4gIH1cblxuICBUaWNrZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGlkLCByZWFkT3BlcmF0aW9uLCB3cml0ZU9wZXJhdGlvbiwgaXNQcmlvcml0aXplZCkge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiBhbiBpdGVtIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZXMgd2l0aCB0aGUgc2FtZSBpZFxuICAgIC8vIGFuZCBpZiBzbyAtPiByZW1vdmUgaXQuXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuX3F1ZXVlLmluZGV4T2YoaWQpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPiAtMSkgdGhpcy5fcXVldWVbY3VycmVudEluZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEFkZCBlbnRyeS5cbiAgICBpc1ByaW9yaXRpemVkID8gdGhpcy5fcXVldWUudW5zaGlmdChpZCkgOiB0aGlzLl9xdWV1ZS5wdXNoKGlkKTtcbiAgICB0aGlzLl9yZWFkc1tpZF0gPSByZWFkT3BlcmF0aW9uO1xuICAgIHRoaXMuX3dyaXRlc1tpZF0gPSB3cml0ZU9wZXJhdGlvbjtcblxuICAgIC8vIEZpbmFsbHksIGxldCdzIGtpY2stc3RhcnQgdGhlIG5leHQgdGljayBpZiBpdCBpcyBub3QgcnVubmluZyB5ZXQuXG4gICAgaWYgKCF0aGlzLl9uZXh0U3RlcCkgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gIH07XG5cbiAgVGlja2VyLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbihpZCkge1xuICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLl9xdWV1ZS5pbmRleE9mKGlkKTtcbiAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuX3F1ZXVlW2N1cnJlbnRJbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgdGhpcy5fcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX3dyaXRlc1tpZF07XG4gICAgfVxuICB9O1xuXG4gIFRpY2tlci5wcm90b3R5cGUuX3N0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgcmVhZHMgPSB0aGlzLl9yZWFkcztcbiAgICB2YXIgd3JpdGVzID0gdGhpcy5fd3JpdGVzO1xuICAgIHZhciBiYXRjaCA9IHRoaXMuX2JhdGNoO1xuICAgIHZhciBiYXRjaFJlYWRzID0gdGhpcy5fYmF0Y2hSZWFkcztcbiAgICB2YXIgYmF0Y2hXcml0ZXMgPSB0aGlzLl9iYXRjaFdyaXRlcztcbiAgICB2YXIgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIHZhciBpZDtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlc2V0IHRpY2tlci5cbiAgICB0aGlzLl9uZXh0U3RlcCA9IG51bGw7XG5cbiAgICAvLyBTZXR1cCBxdWV1ZXMgYW5kIGNhbGxiYWNrIHBsYWNlaG9sZGVycy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlkID0gcXVldWVbaV07XG4gICAgICBpZiAoIWlkKSBjb250aW51ZTtcblxuICAgICAgYmF0Y2gucHVzaChpZCk7XG5cbiAgICAgIGJhdGNoUmVhZHNbaWRdID0gcmVhZHNbaWRdO1xuICAgICAgZGVsZXRlIHJlYWRzW2lkXTtcblxuICAgICAgYmF0Y2hXcml0ZXNbaWRdID0gd3JpdGVzW2lkXTtcbiAgICAgIGRlbGV0ZSB3cml0ZXNbaWRdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHF1ZXVlLlxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcm9jZXNzIHJlYWQgY2FsbGJhY2tzLlxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWQgPSBiYXRjaFtpXTtcbiAgICAgIGlmIChiYXRjaFJlYWRzW2lkXSkge1xuICAgICAgICBiYXRjaFJlYWRzW2lkXSgpO1xuICAgICAgICBkZWxldGUgYmF0Y2hSZWFkc1tpZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB3cml0ZSBjYWxsYmFja3MuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZCA9IGJhdGNoW2ldO1xuICAgICAgaWYgKGJhdGNoV3JpdGVzW2lkXSkge1xuICAgICAgICBiYXRjaFdyaXRlc1tpZF0oKTtcbiAgICAgICAgZGVsZXRlIGJhdGNoV3JpdGVzW2lkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNldCBiYXRjaC5cbiAgICBiYXRjaC5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIG5lZWRlZC5cbiAgICBpZiAoIXRoaXMuX25leHRTdGVwICYmIHF1ZXVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbmV4dFN0ZXAgPSByYWYodGhpcy5fc3RlcCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0aWNrZXIgPSBuZXcgVGlja2VyKCk7XG5cbiAgdmFyIGxheW91dFRpY2sgPSAnbGF5b3V0JztcbiAgdmFyIHZpc2liaWxpdHlUaWNrID0gJ3Zpc2liaWxpdHknO1xuICB2YXIgbW92ZVRpY2sgPSAnbW92ZSc7XG4gIHZhciBzY3JvbGxUaWNrID0gJ3Njcm9sbCc7XG4gIHZhciBwbGFjZWhvbGRlclRpY2sgPSAncGxhY2Vob2xkZXInO1xuXG4gIGZ1bmN0aW9uIGFkZExheW91dFRpY2soaXRlbUlkLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGlja2VyLmFkZChpdGVtSWQgKyBsYXlvdXRUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTGF5b3V0VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyBsYXlvdXRUaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZpc2liaWxpdHlUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgdmlzaWJpbGl0eVRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxWaXNpYmlsaXR5VGljayhpdGVtSWQpIHtcbiAgICByZXR1cm4gdGlja2VyLmNhbmNlbChpdGVtSWQgKyB2aXNpYmlsaXR5VGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRNb3ZlVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIG1vdmVUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2ssIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTW92ZVRpY2soaXRlbUlkKSB7XG4gICAgcmV0dXJuIHRpY2tlci5jYW5jZWwoaXRlbUlkICsgbW92ZVRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkU2Nyb2xsVGljayhpdGVtSWQsIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaykge1xuICAgIHJldHVybiB0aWNrZXIuYWRkKGl0ZW1JZCArIHNjcm9sbFRpY2ssIHJlYWRDYWxsYmFjaywgd3JpdGVDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxTY3JvbGxUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHNjcm9sbFRpY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCwgcmVhZENhbGxiYWNrLCB3cml0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRpY2tlci5hZGQoaXRlbUlkICsgcGxhY2Vob2xkZXJUaWNrLCByZWFkQ2FsbGJhY2ssIHdyaXRlQ2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW1JZCkge1xuICAgIHJldHVybiB0aWNrZXIuY2FuY2VsKGl0ZW1JZCArIHBsYWNlaG9sZGVyVGljayk7XG4gIH1cblxuICB2YXIgRWxQcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgdmFyIG1hdGNoZXNGbiA9XG4gICAgRWxQcm90by5tYXRjaGVzIHx8XG4gICAgRWxQcm90by5tYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBFbFByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgRWxQcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgIEVsUHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgbWF0Y2hlcyBhIENTUyBzZWxlY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gbWF0Y2hlc0ZuLmNhbGwoZWwsIHNlbGVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY2xhc3MgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICcuJyArIGNsYXNzTmFtZSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB0ZW1wQXJyYXkgPSBbXTtcbiAgdmFyIG51bWJlclR5cGUgPSAnbnVtYmVyJztcblxuICAvKipcbiAgICogSW5zZXJ0IGFuIGl0ZW0gb3IgYW4gYXJyYXkgb2YgaXRlbXMgdG8gYXJyYXkgdG8gYSBzcGVjaWZpZWQgaW5kZXguIE11dGF0ZXNcbiAgICogdGhlIGFycmF5LiBUaGUgaW5kZXggY2FuIGJlIG5lZ2F0aXZlIGluIHdoaWNoIGNhc2UgdGhlIGl0ZW1zIHdpbGwgYmUgYWRkZWRcbiAgICogdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbmRleD0tMV1cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5zZXJ0KGFycmF5LCBpdGVtcywgaW5kZXgpIHtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHR5cGVvZiBpbmRleCA9PT0gbnVtYmVyVHlwZSA/IGluZGV4IDogLTE7XG4gICAgaWYgKHN0YXJ0SW5kZXggPCAwKSBzdGFydEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gc3RhcnRJbmRleCArIDE7XG5cbiAgICBhcnJheS5zcGxpY2UuYXBwbHkoYXJyYXksIHRlbXBBcnJheS5jb25jYXQoc3RhcnRJbmRleCwgMCwgaXRlbXMpKTtcbiAgICB0ZW1wQXJyYXkubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYXJyYXkgaW5kZXguIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgcHJvdmlkZWRcbiAgICogYXJyYXkgaW5kZXggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHByb3ZpZGVkIGFycmF5IGFuZCBhbHNvIHRyYW5zZm9ybXNcbiAgICogbmVnYXRpdmUgaW5kZXggdG8gdGhlIG1hdGNoaW5nIHBvc2l0aXZlIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc01pZ3JhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgsIGlzTWlncmF0aW9uKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgbWF4SW5kZXggPSBNYXRoLm1heCgwLCBpc01pZ3JhdGlvbiA/IGxlbmd0aCA6IGxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBpbmRleCA+IG1heEluZGV4ID8gbWF4SW5kZXggOiBpbmRleCA8IDAgPyBNYXRoLm1heChtYXhJbmRleCArIGluZGV4ICsgMSwgMCkgOiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFycmF5IGl0ZW0gdG8gYW5vdGhlciBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZyb21JbmRleFxuICAgKiAgIC0gSW5kZXggKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgbW92ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0b0luZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBtb3ZlZCB0by5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TW92ZShhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgZnJvbSA9IG5vcm1hbGl6ZUFycmF5SW5kZXgoYXJyYXksIGZyb21JbmRleCk7XG4gICAgdmFyIHRvID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgdG9JbmRleCk7XG5cbiAgICAvLyBBZGQgdGFyZ2V0IGl0ZW0gdG8gdGhlIG5ldyBwb3NpdGlvbi5cbiAgICBpZiAoZnJvbSAhPT0gdG8pIHtcbiAgICAgIGFycmF5LnNwbGljZSh0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCBhcnJheSBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gd2l0aEluZGV4XG4gICAqICAgLSBJbmRleCAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIHRoZSBvdGhlciBpdGVtIHRoYXQgd2lsbCBiZSBzd2FwcGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTd2FwKGFycmF5LCBpbmRleCwgd2l0aEluZGV4KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBoYXMgdHdvIG9yIG1vcmUgaXRlbXMuXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IDIpIHJldHVybjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgaW5kaWNlcy5cbiAgICB2YXIgaW5kZXhBID0gbm9ybWFsaXplQXJyYXlJbmRleChhcnJheSwgaW5kZXgpO1xuICAgIHZhciBpbmRleEIgPSBub3JtYWxpemVBcnJheUluZGV4KGFycmF5LCB3aXRoSW5kZXgpO1xuICAgIHZhciB0ZW1wO1xuXG4gICAgLy8gU3dhcCB0aGUgaXRlbXMuXG4gICAgaWYgKGluZGV4QSAhPT0gaW5kZXhCKSB7XG4gICAgICB0ZW1wID0gYXJyYXlbaW5kZXhBXTtcbiAgICAgIGFycmF5W2luZGV4QV0gPSBhcnJheVtpbmRleEJdO1xuICAgICAgYXJyYXlbaW5kZXhCXSA9IHRlbXA7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjdGlvbkNhbmNlbCA9ICdjYW5jZWwnO1xuICB2YXIgYWN0aW9uRmluaXNoID0gJ2ZpbmlzaCc7XG4gIHZhciBkZWJvdW5jZVRpY2sgPSAnZGVib3VuY2UnO1xuICB2YXIgZGVib3VuY2VJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAgICogYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICAgKiBOIG1pbGxpc2Vjb25kcy4gVGhlIHJldHVybmVkIGZ1bmN0aW9uIGFjY2VwdHMgb25lIGFyZ3VtZW50IHdoaWNoLCB3aGVuXG4gICAqIGJlaW5nIFwiZmluaXNoXCIsIGNhbGxzIHRoZSBkZWJvdW5jZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBpZiBpdCBpcyBjdXJyZW50bHlcbiAgICogd2FpdGluZyB0byBiZSBjYWxsZWQsIGFuZCB3aGVuIGJlaW5nIFwiY2FuY2VsXCIgY2FuY2VscyB0aGUgY3VycmVudGx5IHF1ZXVlZFxuICAgKiBmdW5jdGlvbiBjYWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gd2FpdFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgd2FpdCkge1xuICAgIHZhciB0aW1lb3V0O1xuICAgIHZhciB0aWNrZXJJZCA9ICsrZGVib3VuY2VJZCArIGRlYm91bmNlVGljaztcblxuICAgIGlmICh3YWl0ID4gMCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgdGlja2VyLmNhbmNlbCh0aWNrZXJJZCk7XG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gYWN0aW9uRmluaXNoKSBmbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbiAhPT0gYWN0aW9uQ2FuY2VsICYmIGFjdGlvbiAhPT0gYWN0aW9uRmluaXNoKSB7XG4gICAgICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRpY2tlci5hZGQodGlja2VySWQsIGZuLCBudWxsLCB0cnVlKTtcbiAgICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgICBpZiAoYWN0aW9uICE9PSBhY3Rpb25DYW5jZWwpIGZuKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudCBpcyB0cmFuc2Zvcm1lZCwgZmFsc2UgaWYgbm90LiBJbiBwcmFjdGljZSB0aGVcbiAgICogZWxlbWVudCdzIGRpc3BsYXkgdmFsdWUgbXVzdCBiZSBhbnl0aGluZyBlbHNlIHRoYW4gXCJub25lXCIgb3IgXCJpbmxpbmVcIiBhc1xuICAgKiB3ZWxsIGFzIGhhdmUgYSB2YWxpZCB0cmFuc2Zvcm0gdmFsdWUgYXBwbGllZCBpbiBvcmRlciB0byBiZSBjb3VudGVkIGFzIGFcbiAgICogdHJhbnNmb3JtZWQgZWxlbWVudC5cbiAgICpcbiAgICogQm9ycm93ZWQgZnJvbSBNZXpyICh2MC42LjEpOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzcmFtby9tZXpyL2Jsb2IvMC42LjEvbWV6ci5qcyNMNjYxXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1RyYW5zZm9ybWVkKGVsZW1lbnQpIHtcbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgJ3RyYW5zZm9ybScpO1xuICAgIGlmICghdHJhbnNmb3JtIHx8IHRyYW5zZm9ybSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZGlzcGxheSA9IGdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5Jyk7XG4gICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnIHx8IGRpc3BsYXkgPT09ICdub25lJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnQncyBjb250YWluaW5nIGJsb2NrLCB3aGljaCBpc1xuICAgKiBjb25zaWRlcmVkIHRvIGJlIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCB0aGUgdGFyZ2V0IGVsZW1lbnQnc1xuICAgKiBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0by4gRGlzY2xhaW1lcjogdGhpcyBvbmx5IHdvcmtzIGFzIGludGVuZGVkIGZvclxuICAgKiBhYnNvbHV0ZSBwb3NpdGlvbmVkIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiAgIC0gV2hlbiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZSBjb250YWluaW5nIGJsb2NrIGNoZWNraW5nIGlzIHN0YXJ0ZWQgZnJvbVxuICAgKiAgICAgdGhlIHByb3ZpZGVkIGVsZW1lbnQuIE90aGVyd2lzZSB0aGUgY2hlY2tpbmcgaXMgc3RhcnRlZCBmcm9tIHRoZVxuICAgKiAgICAgcHJvdmlkZWQgZWxlbWVudCdzIHBhcmVudCBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7KERvY3VtZW50fEVsZW1lbnQpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQsIGluY2x1ZGVTZWxmKSB7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGUgY29udGFpbmluZyBibG9jayBpcyBhbiBlbGVtZW50LCBzdGF0aWMgYW5kIG5vdFxuICAgIC8vIHRyYW5zZm9ybWVkLCB0cnkgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcGFyZW50IGVsZW1lbnQgYW5kIGZhbGxiYWNrIHRvXG4gICAgLy8gZG9jdW1lbnQuIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXNyYW1vL21lenIvYmxvYi8wLjYuMS9tZXpyLmpzI0wzMzlcbiAgICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIHJldCA9IChpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50O1xuICAgIHdoaWxlIChyZXQgJiYgcmV0ICE9PSBkb2N1bWVudCAmJiBnZXRTdHlsZShyZXQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiAhaXNUcmFuc2Zvcm1lZChyZXQpKSB7XG4gICAgICByZXQgPSByZXQucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhbiBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHkgdHJhbnNmb3JtZWQgaW50b1xuICAgKiBhIGZsb2F0IHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0eWxlQXNGbG9hdChlbCwgc3R5bGUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgc3R5bGUpKSB8fCAwO1xuICB9XG5cbiAgdmFyIG9mZnNldEEgPSB7fTtcbiAgdmFyIG9mZnNldEIgPSB7fTtcbiAgdmFyIG9mZnNldERpZmYgPSB7fTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZWxlbWVudCdzIGRvY3VtZW50IG9mZnNldCwgd2hpY2ggaW4gcHJhY3RpY2UgbWVhbnMgdGhlIHZlcnRpY2FsXG4gICAqIGFuZCBob3Jpem9udGFsIGRpc3RhbmNlIGJldHdlZW4gdGhlIGVsZW1lbnQncyBub3J0aHdlc3QgY29ybmVyIGFuZCB0aGVcbiAgICogZG9jdW1lbnQncyBub3J0aHdlc3QgY29ybmVyLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyB0aGUgc2FtZVxuICAgKiBvYmplY3Qgc28gYmUgc3VyZSB0byByZWFkIHRoZSBkYXRhIGZyb20gaXQgaW5zdGVhZCB1c2luZyBpdCBhcyBhIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsoRG9jdW1lbnR8RWxlbWVudHxXaW5kb3cpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2Zmc2V0RGF0YV1cbiAgICogICAtIE9wdGlvbmFsIGRhdGEgb2JqZWN0IHdoZXJlIHRoZSBvZmZzZXQgZGF0YSB3aWxsIGJlIGluc2VydGVkIHRvLiBJZiBub3RcbiAgICogICAgIHByb3ZpZGVkIGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSByZXR1cm4gZGF0YS5cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldChlbGVtZW50LCBvZmZzZXREYXRhKSB7XG4gICAgdmFyIHJldCA9IG9mZnNldERhdGEgfHwge307XG4gICAgdmFyIHJlY3Q7XG5cbiAgICAvLyBTZXQgdXAgcmV0dXJuIGRhdGEuXG4gICAgcmV0LmxlZnQgPSAwO1xuICAgIHJldC50b3AgPSAwO1xuXG4gICAgLy8gRG9jdW1lbnQncyBvZmZzZXRzIGFyZSBhbHdheXMgMC5cbiAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQpIHJldHVybiByZXQ7XG5cbiAgICAvLyBBZGQgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHRvIHRoZSByZXNwZWN0aXZlIG9mZnNldHMuXG4gICAgcmV0LmxlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgMDtcbiAgICByZXQudG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IDA7XG5cbiAgICAvLyBXaW5kb3cncyBvZmZzZXRzIGFyZSB0aGUgdmlld3BvcnQgc2Nyb2xsIGxlZnQvdG9wIHZhbHVlcy5cbiAgICBpZiAoZWxlbWVudC5zZWxmID09PSB3aW5kb3cuc2VsZikgcmV0dXJuIHJldDtcblxuICAgIC8vIEFkZCBlbGVtZW50J3MgY2xpZW50IHJlY3RzIHRvIHRoZSBvZmZzZXRzLlxuICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldC5sZWZ0ICs9IHJlY3QubGVmdDtcbiAgICByZXQudG9wICs9IHJlY3QudG9wO1xuXG4gICAgLy8gRXhjbHVkZSBlbGVtZW50J3MgYm9yZGVycyBmcm9tIHRoZSBvZmZzZXQuXG4gICAgcmV0LmxlZnQgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICAgIHJldC50b3AgKz0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IGRpZmZlcmVuY2UgdHdvIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wYXJlQ29udGFpbmluZ0Jsb2Nrcz1mYWxzZV1cbiAgICogICAtIFdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgY29udGFpbmluZyBibG9ja3Mgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnRzXG4gICAqICAgICB3aWxsIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlLiBPdGhlcndpc2UgdGhlIHByb3ZpZGVkXG4gICAqICAgICBlbGVtZW50cyB3aWxsIGJlIGNvbXBhcmVkIGRpcmVjdGx5LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2Zmc2V0RGlmZihlbGVtQSwgZWxlbUIsIGNvbXBhcmVDb250YWluaW5nQmxvY2tzKSB7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gMDtcbiAgICBvZmZzZXREaWZmLnRvcCA9IDA7XG5cbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc2FtZSBsZXQncyByZXR1cm4gZWFybHkuXG4gICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG5cbiAgICAvLyBDb21wYXJlIGNvbnRhaW5pbmcgYmxvY2tzIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoY29tcGFyZUNvbnRhaW5pbmdCbG9ja3MpIHtcbiAgICAgIGVsZW1BID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1BLCB0cnVlKTtcbiAgICAgIGVsZW1CID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1CLCB0cnVlKTtcblxuICAgICAgLy8gSWYgY29udGFpbmluZyBibG9ja3MgYXJlIGlkZW50aWNhbCwgbGV0J3MgcmV0dXJuIGVhcmx5LlxuICAgICAgaWYgKGVsZW1BID09PSBlbGVtQikgcmV0dXJuIG9mZnNldERpZmY7XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgbGV0J3MgY2FsY3VsYXRlIHRoZSBvZmZzZXQgZGlmZi5cbiAgICBnZXRPZmZzZXQoZWxlbUEsIG9mZnNldEEpO1xuICAgIGdldE9mZnNldChlbGVtQiwgb2Zmc2V0Qik7XG4gICAgb2Zmc2V0RGlmZi5sZWZ0ID0gb2Zmc2V0Qi5sZWZ0IC0gb2Zmc2V0QS5sZWZ0O1xuICAgIG9mZnNldERpZmYudG9wID0gb2Zmc2V0Qi50b3AgLSBvZmZzZXRBLnRvcDtcblxuICAgIHJldHVybiBvZmZzZXREaWZmO1xuICB9XG5cbiAgdmFyIHN0eWxlT3ZlcmZsb3cgPSAnb3ZlcmZsb3cnO1xuICB2YXIgc3R5bGVPdmVyZmxvd1ggPSAnb3ZlcmZsb3cteCc7XG4gIHZhciBzdHlsZU92ZXJmbG93WSA9ICdvdmVyZmxvdy15JztcbiAgdmFyIG92ZXJmbG93QXV0byA9ICdhdXRvJztcbiAgdmFyIG92ZXJmbG93U2Nyb2xsID0gJ3Njcm9sbCc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtZW50KSB7XG4gICAgdmFyIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvdyk7XG4gICAgaWYgKG92ZXJmbG93ID09PSBvdmVyZmxvd0F1dG8gfHwgb3ZlcmZsb3cgPT09IG92ZXJmbG93U2Nyb2xsKSByZXR1cm4gdHJ1ZTtcblxuICAgIG92ZXJmbG93ID0gZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVPdmVyZmxvd1gpO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gb3ZlcmZsb3dBdXRvIHx8IG92ZXJmbG93ID09PSBvdmVyZmxvd1Njcm9sbCkgcmV0dXJuIHRydWU7XG5cbiAgICBvdmVyZmxvdyA9IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlT3ZlcmZsb3dZKTtcbiAgICBpZiAob3ZlcmZsb3cgPT09IG92ZXJmbG93QXV0byB8fCBvdmVyZmxvdyA9PT0gb3ZlcmZsb3dTY3JvbGwpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgZWxlbWVudCdzIGFuY2VzdG9ycyB0aGF0IGFyZSBwb3RlbnRpYWxseSBzY3JvbGxhYmxlIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVTZWxmPWZhbHNlXVxuICAgKiBAcGFyYW0ge0FycmF5fSBbZGF0YV1cbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyhlbGVtZW50LCBpbmNsdWRlU2VsZiwgZGF0YSkge1xuICAgIHZhciByZXQgPSBkYXRhIHx8IFtdO1xuICAgIHZhciBwYXJlbnQgPSBpbmNsdWRlU2VsZiA/IGVsZW1lbnQgOiBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBGaW5kIHNjcm9sbCBwYXJlbnRzLlxuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgLy8gSWYgZWxlbWVudCBpcyBpbnNpZGUgU2hhZG93RE9NIGxldCdzIGdldCBpdCdzIGhvc3Qgbm9kZSBmcm9tIHRoZSByZWFsXG4gICAgICAvLyBET00gYW5kIGNvbnRpbnVlIGxvb3BpbmcuXG4gICAgICBpZiAocGFyZW50LmdldFJvb3ROb2RlICYmIHBhcmVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFJvb3ROb2RlKCkuaG9zdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZSBsZXQncyBhZGQgaXQgdG8gdGhlIHNjcm9sbGFibGUgbGlzdC5cbiAgICAgIGlmIChpc1Njcm9sbGFibGUocGFyZW50KSkge1xuICAgICAgICByZXQucHVzaChwYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgYWRkIHdpbmRvdyB0byB0aGUgcmVzdWx0cy5cbiAgICByZXQucHVzaCh3aW5kb3cpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHt9O1xuICB2YXIgdHJhbnNmb3JtU3R5bGUkMiA9ICd0cmFuc2Zvcm0nO1xuICB2YXIgdHJhbnNmb3JtTm9uZSA9ICdub25lJztcbiAgdmFyIHJ4TWF0M2QgPSAvXm1hdHJpeDNkLztcbiAgdmFyIHJ4TWF0VHggPSAvKFteLF0qLCl7NH0vO1xuICB2YXIgcnhNYXQzZFR4ID0gLyhbXixdKiwpezEyfS87XG4gIHZhciByeE5leHRJdGVtID0gL1teLF0qLC87XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQncyBjb21wdXRlZCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBhcyBhIGZsb2F0cy5cbiAgICogVGhlIHJldHVybmVkIG9iamVjdCBpcyBhbHdheXMgdGhlIHNhbWUgb2JqZWN0IGFuZCB1cGRhdGVkIGV2ZXJ5IHRpbWUgdGhpc1xuICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbGVtZW50KSB7XG4gICAgdHJhbnNsYXRlVmFsdWUueCA9IDA7XG4gICAgdHJhbnNsYXRlVmFsdWUueSA9IDA7XG5cbiAgICB2YXIgdHJhbnNmb3JtID0gZ2V0U3R5bGUoZWxlbWVudCwgdHJhbnNmb3JtU3R5bGUkMik7XG4gICAgaWYgKCF0cmFuc2Zvcm0gfHwgdHJhbnNmb3JtID09PSB0cmFuc2Zvcm1Ob25lKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHN0eWxlIGNhbiBiZSBpbiBlaXRoZXIgbWF0cml4M2QoLi4uKSBvciBtYXRyaXgoLi4uKS5cbiAgICB2YXIgaXNNYXQzZCA9IHJ4TWF0M2QudGVzdCh0cmFuc2Zvcm0pO1xuICAgIHZhciB0WCA9IHRyYW5zZm9ybS5yZXBsYWNlKGlzTWF0M2QgPyByeE1hdDNkVHggOiByeE1hdFR4LCAnJyk7XG4gICAgdmFyIHRZID0gdFgucmVwbGFjZShyeE5leHRJdGVtLCAnJyk7XG5cbiAgICB0cmFuc2xhdGVWYWx1ZS54ID0gcGFyc2VGbG9hdCh0WCkgfHwgMDtcbiAgICB0cmFuc2xhdGVWYWx1ZS55ID0gcGFyc2VGbG9hdCh0WSkgfHwgMDtcblxuICAgIHJldHVybiB0cmFuc2xhdGVWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdHJhbnNsYXRlWCBhbmQgdHJhbnNsYXRlWSB2YWx1ZSBpbnRvIENTUyB0cmFuc2Zvcm0gc3R5bGVcbiAgICogcHJvcGVydHkncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZVN0cmluZyh4LCB5KSB7XG4gICAgcmV0dXJuICd0cmFuc2xhdGVYKCcgKyB4ICsgJ3B4KSB0cmFuc2xhdGVZKCcgKyB5ICsgJ3B4KSc7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNsYXNzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudE1hdGNoZXMoZWxlbWVudCwgJy4nICsgY2xhc3NOYW1lKSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICgnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJylcbiAgICAgICAgICAucmVwbGFjZSgnICcgKyBjbGFzc05hbWUgKyAnICcsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlcy5cbiAgdmFyIHN0YXJ0UHJlZGljYXRlSW5hY3RpdmUgPSAwO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVQZW5kaW5nID0gMTtcbiAgdmFyIHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgPSAyO1xuICB2YXIgc3RhcnRQcmVkaWNhdGVSZWplY3RlZCA9IDM7XG5cbiAgLyoqXG4gICAqIEJpbmQgdG91Y2ggaW50ZXJhY3Rpb24gdG8gYW4gaXRlbS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbURyYWcoaXRlbSkge1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5fZ3JpZElkID0gZ3JpZC5faWQ7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuXG4gICAgLy8gU3RhcnQgcHJlZGljYXRlIGRhdGEuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGUgPSBpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTdGFydFByZWRpY2F0ZSlcbiAgICAgID8gc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlXG4gICAgICA6IEl0ZW1EcmFnLmRlZmF1bHRTdGFydFByZWRpY2F0ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVJbmFjdGl2ZTtcbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIERhdGEgZm9yIGRyYWcgc29ydCBwcmVkaWNhdGUgaGV1cmlzdGljcy5cbiAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLl9oWDEgPSAwO1xuICAgIHRoaXMuX2hYMiA9IDA7XG4gICAgdGhpcy5faFkxID0gMDtcbiAgICB0aGlzLl9oWTIgPSAwO1xuXG4gICAgLy8gU2V0dXAgaXRlbSdzIGluaXRpYWwgZHJhZyBkYXRhLlxuICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAvLyBCaW5kIHRoZSBtZXRob2RzIHRoYXQgbmVlZHMgYmluZGluZy5cbiAgICB0aGlzLl9wcmVTdGFydENoZWNrID0gdGhpcy5fcHJlU3RhcnRDaGVjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZUVuZENoZWNrID0gdGhpcy5fcHJlRW5kQ2hlY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcHJlcGFyZU1vdmUgPSB0aGlzLl9wcmVwYXJlTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FwcGx5TW92ZSA9IHRoaXMuX2FwcGx5TW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3ByZXBhcmVTY3JvbGwgPSB0aGlzLl9wcmVwYXJlU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYXBwbHlTY3JvbGwgPSB0aGlzLl9hcHBseVNjcm9sbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NoZWNrT3ZlcmxhcCA9IHRoaXMuX2NoZWNrT3ZlcmxhcC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gQ3JlYXRlIGRlYm91bmNlIG92ZXJsYXAgY2hlY2tlciBmdW5jdGlvbi5cbiAgICB2YXIgc29ydEludGVydmFsID0gc2V0dGluZ3MuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbDtcbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSA9IGRlYm91bmNlKHRoaXMuX2NoZWNrT3ZlcmxhcCwgc29ydEludGVydmFsKTtcblxuICAgIC8vIEluaXQgZHJhZ2dlci5cbiAgICB0aGlzLl9kcmFnZ2VyID0gbmV3IERyYWdnZXIoZWxlbWVudCwgc2V0dGluZ3MuZHJhZ0Nzc1Byb3BzKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdzdGFydCcsIHRoaXMuX3ByZVN0YXJ0Q2hlY2spO1xuICAgIHRoaXMuX2RyYWdnZXIub24oJ21vdmUnLCB0aGlzLl9wcmVTdGFydENoZWNrKTtcbiAgICB0aGlzLl9kcmFnZ2VyLm9uKCdjYW5jZWwnLCB0aGlzLl9wcmVFbmRDaGVjayk7XG4gICAgdGhpcy5fZHJhZ2dlci5vbignZW5kJywgdGhpcy5fcHJlRW5kQ2hlY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBzdGF0aWMgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZHJhZyBzdGFydCBwcmVkaWNhdGUgaGFuZGxlciB0aGF0IGhhbmRsZXMgYW5jaG9yIGVsZW1lbnRzXG4gICAqIGdyYWNlZnVsbHkuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBkZWZpbmVzIGlmIHRoZSBkcmFnIGlzXG4gICAqIHN0YXJ0ZWQsIHJlamVjdGVkIG9yIHBlbmRpbmcuIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgc3RhcnRlZFxuICAgKiBhbmQgd2hlbiBmYWxzZSBpcyByZXR1cm5lZCB0aGUgZHJhZ2dpbmcgaXMgcmVqZWN0ZWQuIElmIG5vdGhpbmcgaXMgcmV0dXJuZWRcbiAgICogdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCBkcmFnIG1vdmVtZW50LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1xuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAtIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhc3MgdGhlIHByZWRpY2F0ZVxuICAgKiAgICAgaXQncyBvcHRpb25zIG1hbnVhbGx5LiBCeSBkZWZhdWx0IHRoZSBwcmVkaWNhdGUgcmV0cmlldmVzIHRoZSBvcHRpb25zXG4gICAqICAgICBmcm9tIHRoZSBncmlkJ3Mgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbURyYWcuZGVmYXVsdFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oaXRlbSwgZXZlbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZHJhZyA9IGl0ZW0uX2RyYWc7XG4gICAgdmFyIHByZWRpY2F0ZSA9IGRyYWcuX3N0YXJ0UHJlZGljYXRlRGF0YSB8fCBkcmFnLl9zZXR1cFN0YXJ0UHJlZGljYXRlKG9wdGlvbnMpO1xuXG4gICAgLy8gRmluYWwgZXZlbnQgbG9naWMuIEF0IHRoaXMgc3RhZ2UgcmV0dXJuIHZhbHVlIGRvZXMgbm90IG1hdHRlciBhbnltb3JlLFxuICAgIC8vIHRoZSBwcmVkaWNhdGUgaXMgZWl0aGVyIHJlc29sdmVkIG9yIGl0J3Mgbm90IGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICAvLyBhYm91dCBpdC4gSGVyZSB3ZSBqdXN0IHJlc2V0IGRhdGEgYW5kIGlmIHRoZSBpdGVtIGVsZW1lbnQgaXMgYSBsaW5rXG4gICAgLy8gd2UgZm9sbG93IGl0IChpZiB0aGVyZSBoYXMgb25seSBiZWVuIHNsaWdodCBtb3ZlbWVudCkuXG4gICAgaWYgKGV2ZW50LmlzRmluYWwpIHtcbiAgICAgIGRyYWcuX2ZpbmlzaFN0YXJ0UHJlZGljYXRlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGFuZCBzdG9yZSB0aGUgaGFuZGxlIGVsZW1lbnQgc28gd2UgY2FuIGNoZWNrIGxhdGVyIG9uIGlmIHRoZVxuICAgIC8vIGN1cnNvciBpcyB3aXRoaW4gdGhlIGhhbmRsZS4gSWYgd2UgaGF2ZSBhIGhhbmRsZSBzZWxlY3RvciBsZXQncyBmaW5kXG4gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudC4gT3RoZXJ3aXNlIGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZVxuICAgIC8vIGhhbmRsZS5cbiAgICBpZiAoIXByZWRpY2F0ZS5oYW5kbGVFbGVtZW50KSB7XG4gICAgICBwcmVkaWNhdGUuaGFuZGxlRWxlbWVudCA9IGRyYWcuX2dldFN0YXJ0UHJlZGljYXRlSGFuZGxlKGV2ZW50KTtcbiAgICAgIGlmICghcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiBkZWxheSBpcyBkZWZpbmVkIGxldCdzIGtlZXAgdHJhY2sgb2YgdGhlIGxhdGVzdCBldmVudCBhbmQgaW5pdGlhdGVcbiAgICAvLyBkZWxheSBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSB5ZXQuXG4gICAgaWYgKHByZWRpY2F0ZS5kZWxheSkge1xuICAgICAgcHJlZGljYXRlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5kZWxheVRpbWVyKSB7XG4gICAgICAgIHByZWRpY2F0ZS5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcHJlZGljYXRlLmRlbGF5ID0gMDtcbiAgICAgICAgICBpZiAoZHJhZy5fcmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCkpIHtcbiAgICAgICAgICAgIGRyYWcuX2ZvcmNlUmVzb2x2ZVN0YXJ0UHJlZGljYXRlKHByZWRpY2F0ZS5ldmVudCk7XG4gICAgICAgICAgICBkcmFnLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBwcmVkaWNhdGUuZGVsYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkcmFnLl9yZXNvbHZlU3RhcnRQcmVkaWNhdGUoZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRyYWcgc29ydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aHJlc2hvbGQ9NTBdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hY3Rpb249J21vdmUnXVxuICAgKiBAcmV0dXJucyB7KEJvb2xlYW58RHJhZ1NvcnRDb21tYW5kKX1cbiAgICogICAtIFJldHVybnMgZmFsc2UgaWYgbm8gdmFsaWQgaW5kZXggd2FzIGZvdW5kLiBPdGhlcndpc2UgcmV0dXJucyBkcmFnIHNvcnRcbiAgICogICAgIGNvbW1hbmQuXG4gICAqL1xuICBJdGVtRHJhZy5kZWZhdWx0U29ydFByZWRpY2F0ZSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbVJlY3QgPSB7fTtcbiAgICB2YXIgdGFyZ2V0UmVjdCA9IHt9O1xuICAgIHZhciByZXR1cm5EYXRhID0ge307XG4gICAgdmFyIHJvb3RHcmlkQXJyYXkgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHRocmVzaG9sZCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGw7XG4gICAgICB2YXIgZHJhZ1NvcnQgPSByb290R3JpZC5fc2V0dGluZ3MuZHJhZ1NvcnQ7XG4gICAgICB2YXIgYmVzdFNjb3JlID0gLTE7XG4gICAgICB2YXIgZ3JpZFNjb3JlO1xuICAgICAgdmFyIGdyaWRzO1xuICAgICAgdmFyIGdyaWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gR2V0IHBvdGVudGlhbCB0YXJnZXQgZ3JpZHMuXG4gICAgICBpZiAoZHJhZ1NvcnQgPT09IHRydWUpIHtcbiAgICAgICAgcm9vdEdyaWRBcnJheVswXSA9IHJvb3RHcmlkO1xuICAgICAgICBncmlkcyA9IHJvb3RHcmlkQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkcyA9IGRyYWdTb3J0LmNhbGwocm9vdEdyaWQsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgYXJlIG5vIGdyaWRzLlxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyaWRzKSkgcmV0dXJuIHRhcmdldDtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBncmlkcyBhbmQgZ2V0IHRoZSBiZXN0IG1hdGNoLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGdyaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyaWQgPSBncmlkc1tpXTtcblxuICAgICAgICAvLyBGaWx0ZXIgb3V0IGFsbCBkZXN0cm95ZWQgZ3JpZHMuXG4gICAgICAgIGlmIChncmlkLl9pc0Rlc3Ryb3llZCkgY29udGludWU7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGdyaWQncyBvZmZzZXRzIGFuZCBkaW1lbnNpb25zIHNpbmNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBjaGFuZ2VkIChlLmcgZHVyaW5nIHNjcm9sbGluZykuXG4gICAgICAgIGdyaWQuX3VwZGF0ZUJvdW5kaW5nUmVjdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGhvdyBtdWNoIGRyYWdnZWQgZWxlbWVudCBvdmVybGFwcyB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICAgIHRhcmdldFJlY3Qud2lkdGggPSBncmlkLl93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSBncmlkLl9oZWlnaHQ7XG4gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IGdyaWQuX2xlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gZ3JpZC5fdG9wO1xuICAgICAgICBncmlkU2NvcmUgPSBnZXRSZWN0T3ZlcmxhcFNjb3JlKGl0ZW1SZWN0LCB0YXJnZXRSZWN0KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyaWQgaXMgdGhlIGJlc3QgbWF0Y2ggc28gZmFyLlxuICAgICAgICBpZiAoZ3JpZFNjb3JlID4gdGhyZXNob2xkICYmIGdyaWRTY29yZSA+IGJlc3RTY29yZSkge1xuICAgICAgICAgIGJlc3RTY29yZSA9IGdyaWRTY29yZTtcbiAgICAgICAgICB0YXJnZXQgPSBncmlkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyByZXNldCByb290IGdyaWQgYXJyYXkuXG4gICAgICByb290R3JpZEFycmF5Lmxlbmd0aCA9IDA7XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0sIG9wdGlvbnMpIHtcbiAgICAgIHZhciBkcmFnID0gaXRlbS5fZHJhZztcbiAgICAgIHZhciByb290R3JpZCA9IGRyYWcuX2dldEdyaWQoKTtcblxuICAgICAgLy8gR2V0IGRyYWcgc29ydCBwcmVkaWNhdGUgc2V0dGluZ3MuXG4gICAgICB2YXIgc29ydFRocmVzaG9sZCA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMudGhyZXNob2xkID09PSAnbnVtYmVyJyA/IG9wdGlvbnMudGhyZXNob2xkIDogNTA7XG4gICAgICB2YXIgc29ydEFjdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hY3Rpb24gPT09IGFjdGlvblN3YXAgPyBhY3Rpb25Td2FwIDogYWN0aW9uTW92ZTtcblxuICAgICAgLy8gUG9wdWxhdGUgaXRlbSByZWN0IGRhdGEuXG4gICAgICBpdGVtUmVjdC53aWR0aCA9IGl0ZW0uX3dpZHRoO1xuICAgICAgaXRlbVJlY3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0O1xuICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2VsZW1lbnRDbGllbnRYO1xuICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZWxlbWVudENsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdGFyZ2V0IGdyaWQuXG4gICAgICB2YXIgZ3JpZCA9IGdldFRhcmdldEdyaWQoaXRlbSwgcm9vdEdyaWQsIHNvcnRUaHJlc2hvbGQpO1xuXG4gICAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgZm91bmQgbm8gZ3JpZCBjb250YWluZXIgZWxlbWVudCB0aGF0IG92ZXJsYXBzIHRoZVxuICAgICAgLy8gZHJhZ2dlZCBpdGVtIGVub3VnaC5cbiAgICAgIGlmICghZ3JpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgZ3JpZE9mZnNldExlZnQgPSAwO1xuICAgICAgdmFyIGdyaWRPZmZzZXRUb3AgPSAwO1xuICAgICAgdmFyIG1hdGNoU2NvcmUgPSAtMTtcbiAgICAgIHZhciBtYXRjaEluZGV4O1xuICAgICAgdmFyIGhhc1ZhbGlkVGFyZ2V0cztcbiAgICAgIHZhciB0YXJnZXQ7XG4gICAgICB2YXIgc2NvcmU7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gSWYgaXRlbSBpcyBtb3ZlZCB3aXRoaW4gaXQncyBvcmlnaW5hdGluZyBncmlkIGFkanVzdCBpdGVtJ3MgbGVmdCBhbmRcbiAgICAgIC8vIHRvcCBwcm9wcy4gT3RoZXJ3aXNlIGlmIGl0ZW0gaXMgbW92ZWQgdG8vd2l0aGluIGFub3RoZXIgZ3JpZCBnZXQgdGhlXG4gICAgICAvLyBjb250YWluZXIgZWxlbWVudCdzIG9mZnNldCAoZnJvbSB0aGUgZWxlbWVudCdzIGNvbnRlbnQgZWRnZSkuXG4gICAgICBpZiAoZ3JpZCA9PT0gcm9vdEdyaWQpIHtcbiAgICAgICAgaXRlbVJlY3QubGVmdCA9IGRyYWcuX2dyaWRYICsgaXRlbS5fbWFyZ2luTGVmdDtcbiAgICAgICAgaXRlbVJlY3QudG9wID0gZHJhZy5fZ3JpZFkgKyBpdGVtLl9tYXJnaW5Ub3A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkLl91cGRhdGVCb3JkZXJzKDEsIDAsIDEsIDApO1xuICAgICAgICBncmlkT2Zmc2V0TGVmdCA9IGdyaWQuX2xlZnQgKyBncmlkLl9ib3JkZXJMZWZ0O1xuICAgICAgICBncmlkT2Zmc2V0VG9wID0gZ3JpZC5fdG9wICsgZ3JpZC5fYm9yZGVyVG9wO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHRhcmdldCBncmlkIGl0ZW1zIGFuZCB0cnkgdG8gZmluZCB0aGUgYmVzdCBtYXRjaC5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBncmlkLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YXJnZXQgPSBncmlkLl9pdGVtc1tpXTtcblxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGl0ZW0gaXMgbm90IGFjdGl2ZSBvciB0aGUgdGFyZ2V0IGl0ZW0gaXMgdGhlIGRyYWdnZWRcbiAgICAgICAgLy8gaXRlbSBsZXQncyBza2lwIHRvIHRoZSBuZXh0IGl0ZW0uXG4gICAgICAgIGlmICghdGFyZ2V0Ll9pc0FjdGl2ZSB8fCB0YXJnZXQgPT09IGl0ZW0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgdGhlIGdyaWQgYXMgaGF2aW5nIHZhbGlkIHRhcmdldCBpdGVtcy5cbiAgICAgICAgaGFzVmFsaWRUYXJnZXRzID0gdHJ1ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCdzIG92ZXJsYXAgc2NvcmUgd2l0aCB0aGUgZHJhZ2dlZCBpdGVtLlxuICAgICAgICB0YXJnZXRSZWN0LndpZHRoID0gdGFyZ2V0Ll93aWR0aDtcbiAgICAgICAgdGFyZ2V0UmVjdC5oZWlnaHQgPSB0YXJnZXQuX2hlaWdodDtcbiAgICAgICAgdGFyZ2V0UmVjdC5sZWZ0ID0gdGFyZ2V0Ll9sZWZ0ICsgdGFyZ2V0Ll9tYXJnaW5MZWZ0ICsgZ3JpZE9mZnNldExlZnQ7XG4gICAgICAgIHRhcmdldFJlY3QudG9wID0gdGFyZ2V0Ll90b3AgKyB0YXJnZXQuX21hcmdpblRvcCArIGdyaWRPZmZzZXRUb3A7XG4gICAgICAgIHNjb3JlID0gZ2V0UmVjdE92ZXJsYXBTY29yZShpdGVtUmVjdCwgdGFyZ2V0UmVjdCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGJlc3QgbWF0Y2ggaW5kZXggYW5kIHNjb3JlIGlmIHRoZSB0YXJnZXQncyBvdmVybGFwIHNjb3JlIHdpdGhcbiAgICAgICAgLy8gdGhlIGRyYWdnZWQgaXRlbSBpcyBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBiZXN0IG1hdGNoIHNjb3JlLlxuICAgICAgICBpZiAoc2NvcmUgPiBtYXRjaFNjb3JlKSB7XG4gICAgICAgICAgbWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgbWF0Y2hTY29yZSA9IHNjb3JlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHZhbGlkIG1hdGNoIGFuZCB0aGUgaXRlbSBpcyBiZWluZyBtb3ZlZCBpbnRvIGFub3RoZXJcbiAgICAgIC8vIGdyaWQuXG4gICAgICBpZiAobWF0Y2hTY29yZSA8IHNvcnRUaHJlc2hvbGQgJiYgaXRlbS5nZXRHcmlkKCkgIT09IGdyaWQpIHtcbiAgICAgICAgbWF0Y2hJbmRleCA9IGhhc1ZhbGlkVGFyZ2V0cyA/IC0xIDogMDtcbiAgICAgICAgbWF0Y2hTY29yZSA9IEluZmluaXR5O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYmVzdCBtYXRjaCBvdmVybGFwcyBlbm91Z2ggdG8ganVzdGlmeSBhIHBsYWNlbWVudCBzd2l0Y2guXG4gICAgICBpZiAobWF0Y2hTY29yZSA+PSBzb3J0VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybkRhdGEuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHJldHVybkRhdGEuaW5kZXggPSBtYXRjaEluZGV4O1xuICAgICAgICByZXR1cm5EYXRhLmFjdGlvbiA9IHNvcnRBY3Rpb247XG4gICAgICAgIHJldHVybiByZXR1cm5EYXRhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQWJvcnQgZHJhZ2dpbmcgYW5kIHJlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtRHJhZ31cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcblxuICAgIGlmICghdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYmVpbmcgZHJvcHBlZCBpbnRvIGFub3RoZXIgZ3JpZCwgZmluaXNoIGl0IHVwIGFuZCByZXR1cm5cbiAgICAvLyBpbW1lZGlhdGVseS5cbiAgICBpZiAodGhpcy5faXNNaWdyYXRpbmcpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaE1pZ3JhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCBtb3ZlIGFuZCBzY3JvbGwgdGlja3MuXG4gICAgY2FuY2VsTW92ZVRpY2soaXRlbS5faWQpO1xuICAgIGNhbmNlbFNjcm9sbFRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gUmVtb3ZlIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgdGhpcy5fdW5iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDYW5jZWwgb3ZlcmxhcCBjaGVjay5cbiAgICB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgnY2FuY2VsJyk7XG5cbiAgICAvLyBBcHBlbmQgaXRlbSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgaWYgaXQncyBub3QgaXQncyBjaGlsZC4gQWxzbyBtYWtlXG4gICAgLy8gc3VyZSB0aGUgdHJhbnNsYXRlIHZhbHVlcyBhcmUgYWRqdXN0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBzaGlmdC5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBncmlkLl9lbGVtZW50KSB7XG4gICAgICBncmlkLl9lbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9ncmlkWCwgdGhpcy5fZ3JpZFkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBkcmFnZ2luZyBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBncmlkLl9zZXR0aW5ncy5pdGVtRHJhZ2dpbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBkcmFnIGRhdGEuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1EcmFnfVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX2RyYWdnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7P0dyaWR9XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2dldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdIHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwL3Jlc2V0IGRyYWcgZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElzIGl0ZW0gYmVpbmcgZHJhZ2dlZD9cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGRyYWdnZWQgaXRlbSdzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvLyBUaGUgZHJhZ2dlZCBpdGVtJ3MgY29udGFpbmluZyBibG9jay5cbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBudWxsO1xuXG4gICAgLy8gRHJhZy9zY3JvbGwgZXZlbnQgZGF0YS5cbiAgICB0aGlzLl9kcmFnRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Njcm9sbEV2ZW50ID0gbnVsbDtcblxuICAgIC8vIEFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbmVlZCB0byBiZSBsaXN0ZW5lZCBmb3Igc2Nyb2xsIGV2ZW50cyBkdXJpbmdcbiAgICAvLyBkcmFnZ2luZy5cbiAgICB0aGlzLl9zY3JvbGxlcnMgPSBbXTtcblxuICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zbGF0ZVgvdHJhbnNsYXRlWSBwb3NpdGlvbi5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gRHJhZ2dlZCBlbGVtZW50J3MgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGdyaWQuXG4gICAgdGhpcy5fZ3JpZFggPSAwO1xuICAgIHRoaXMuX2dyaWRZID0gMDtcblxuICAgIC8vIERyYWdnZWQgZWxlbWVudCdzIGN1cnJlbnQgb2Zmc2V0IGZyb20gd2luZG93J3Mgbm9ydGh3ZXN0IGNvcm5lci4gRG9lc1xuICAgIC8vIG5vdCBhY2NvdW50IGZvciBlbGVtZW50J3MgbWFyZ2lucy5cbiAgICB0aGlzLl9lbGVtZW50Q2xpZW50WCA9IDA7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFkgPSAwO1xuXG4gICAgLy8gT2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZHJhZ2dlZCBlbGVtZW50J3MgdGVtcG9yYXJ5IGRyYWdcbiAgICAvLyBjb250YWluZXIgYW5kIGl0J3Mgb3JpZ2luYWwgY29udGFpbmVyLlxuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgdG8gYWxsIHNjcm9sbGFibGUgYW5jZXN0b3IgZWxlbWVudHMgb2YgdGhlXG4gICAqIGRyYWdnZWQgZWxlbWVudCBhbmQgdGhlIGRyYWcgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fYmluZFNjcm9sbExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gdGhpcy5fZ2V0R3JpZCgpLl9lbGVtZW50O1xuICAgIHZhciBkcmFnQ29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgIHZhciBzY3JvbGxlcnMgPSB0aGlzLl9zY3JvbGxlcnM7XG4gICAgdmFyIGdyaWRTY3JvbGxlcnM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBHZXQgZHJhZ2dlZCBlbGVtZW50J3Mgc2Nyb2xsaW5nIHBhcmVudHMuXG4gICAgc2Nyb2xsZXJzLmxlbmd0aCA9IDA7XG4gICAgZ2V0U2Nyb2xsYWJsZUFuY2VzdG9ycyh0aGlzLl9pdGVtLl9lbGVtZW50LCBmYWxzZSwgc2Nyb2xsZXJzKTtcblxuICAgIC8vIElmIGRyYWcgY29udGFpbmVyIGlzIGRlZmluZWQgYW5kIGl0J3Mgbm90IHRoZSBzYW1lIGVsZW1lbnQgYXMgZ3JpZFxuICAgIC8vIGNvbnRhaW5lciB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGNvbnRhaW5lciBhbmQgaXQncyBzY3JvbGwgcGFyZW50c1xuICAgIC8vIHRvIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgZ29pbmcgdG8gYmUgbGlzdGVuZXIgZm9yIHNjcm9sbCBldmVudHMuXG4gICAgaWYgKGRyYWdDb250YWluZXIgIT09IGdyaWRDb250YWluZXIpIHtcbiAgICAgIGdyaWRTY3JvbGxlcnMgPSBbXTtcbiAgICAgIGdldFNjcm9sbGFibGVBbmNlc3RvcnMoZ3JpZENvbnRhaW5lciwgdHJ1ZSwgZ3JpZFNjcm9sbGVycyk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JpZFNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2Nyb2xsZXJzLmluZGV4T2YoZ3JpZFNjcm9sbGVyc1tpXSkgPCAwKSB7XG4gICAgICAgICAgc2Nyb2xsZXJzLnB1c2goZ3JpZFNjcm9sbGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW5kIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl91bmJpbmRTY3JvbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2Nyb2xsZXJzID0gdGhpcy5fc2Nyb2xsZXJzO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNjcm9sbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgc2Nyb2xsZXJzW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICBzY3JvbGxlcnMubGVuZ3RoID0gMDtcbiAgfTtcblxuICAvKipcbiAgICogU2V0dXAgZGVmYXVsdCBzdGFydCBwcmVkaWNhdGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9zZXR1cFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBjb25maWcgPSBvcHRpb25zIHx8IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3MuZHJhZ1N0YXJ0UHJlZGljYXRlIHx8IDA7XG4gICAgcmV0dXJuICh0aGlzLl9zdGFydFByZWRpY2F0ZURhdGEgPSB7XG4gICAgICBkaXN0YW5jZTogTWF0aC5hYnMoY29uZmlnLmRpc3RhbmNlKSB8fCAwLFxuICAgICAgZGVsYXk6IE1hdGgubWF4KGNvbmZpZy5kZWxheSwgMCkgfHwgMCxcbiAgICAgIGhhbmRsZTogdHlwZW9mIGNvbmZpZy5oYW5kbGUgPT09ICdzdHJpbmcnID8gY29uZmlnLmhhbmRsZSA6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIGRlZmF1bHQgc3RhcnQgcHJlZGljYXRlIGhhbmRsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMgez9IVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZ2V0U3RhcnRQcmVkaWNhdGVIYW5kbGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9zdGFydFByZWRpY2F0ZURhdGE7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuICAgIHZhciBoYW5kbGVFbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIE5vIGhhbmRsZSwgbm8gaGFzc2xlIC0+IGxldCdzIHVzZSB0aGUgaXRlbSBlbGVtZW50IGFzIHRoZSBoYW5kbGUuXG4gICAgaWYgKCFwcmVkaWNhdGUuaGFuZGxlKSByZXR1cm4gaGFuZGxlRWxlbWVudDtcblxuICAgIC8vIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgcHJlZGljYXRlIGhhbmRsZSBkZWZpbmVkLCBsZXQncyB0cnkgdG8gZ2V0IGl0LlxuICAgIGhhbmRsZUVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgd2hpbGUgKGhhbmRsZUVsZW1lbnQgJiYgIWVsZW1lbnRNYXRjaGVzKGhhbmRsZUVsZW1lbnQsIHByZWRpY2F0ZS5oYW5kbGUpKSB7XG4gICAgICBoYW5kbGVFbGVtZW50ID0gaGFuZGxlRWxlbWVudCAhPT0gZWxlbWVudCA/IGhhbmRsZUVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVFbGVtZW50IHx8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVuYmluZCBjdXJyZW50bHkgYm91bmQgZHJhZyBzY3JvbGwgaGFuZGxlcnMgZnJvbSBhbGwgc2Nyb2xsYWJsZSBhbmNlc3RvclxuICAgKiBlbGVtZW50cyBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCB0aGUgZHJhZyBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc29sdmVTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcblxuICAgIC8vIElmIHRoZSBtb3ZlZCBkaXN0YW5jZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkaXN0YW5jZSBvciB0aGVyZSBpc1xuICAgIC8vIHNvbWUgZGVsYXkgbGVmdCwgaWdub3JlIHRoaXMgcHJlZGljYXRlIGN5Y2xlLlxuICAgIGlmIChldmVudC5kaXN0YW5jZSA8IHByZWRpY2F0ZS5kaXN0YW5jZSB8fCBwcmVkaWNhdGUuZGVsYXkpIHJldHVybjtcblxuICAgIC8vIEdldCBoYW5kbGUgcmVjdCBkYXRhLlxuICAgIHZhciBoYW5kbGVSZWN0ID0gcHJlZGljYXRlLmhhbmRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIGhhbmRsZUxlZnQgPSBoYW5kbGVSZWN0LmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IDApO1xuICAgIHZhciBoYW5kbGVUb3AgPSBoYW5kbGVSZWN0LnRvcCArICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCk7XG4gICAgdmFyIGhhbmRsZVdpZHRoID0gaGFuZGxlUmVjdC53aWR0aDtcbiAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlUmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUgZGF0YS5cbiAgICB0aGlzLl9yZXNldFN0YXJ0UHJlZGljYXRlKCk7XG5cbiAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIHN0aWxsIHdpdGhpbiB0aGUgaGFuZGxlIGxldCdzIHN0YXJ0IHRoZSBkcmFnLlxuICAgIHJldHVybiAoXG4gICAgICBoYW5kbGVXaWR0aCAmJlxuICAgICAgaGFuZGxlSGVpZ2h0ICYmXG4gICAgICBldmVudC5wYWdlWCA+PSBoYW5kbGVMZWZ0ICYmXG4gICAgICBldmVudC5wYWdlWCA8IGhhbmRsZUxlZnQgKyBoYW5kbGVXaWR0aCAmJlxuICAgICAgZXZlbnQucGFnZVkgPj0gaGFuZGxlVG9wICYmXG4gICAgICBldmVudC5wYWdlWSA8IGhhbmRsZVRvcCArIGhhbmRsZUhlaWdodFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlZnVsbHkgcmVzb2x2ZSBkcmFnIHN0YXJ0IHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZm9yY2VSZXNvbHZlU3RhcnRQcmVkaWNhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghdGhpcy5faXNEZXN0cm95ZWQgJiYgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcbiAgICAgIHRoaXMuX29uU3RhcnQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRmluYWxpemUgc3RhcnQgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9maW5pc2hTdGFydFByZWRpY2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9pdGVtLl9lbGVtZW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWNrICh2ZXJ5IHN1YmplY3RpdmUgaGV1cmlzdGljcykuXG4gICAgdmFyIGlzQ2xpY2sgPSBNYXRoLmFicyhldmVudC5kZWx0YVgpIDwgMiAmJiBNYXRoLmFicyhldmVudC5kZWx0YVkpIDwgMiAmJiBldmVudC5kZWx0YVRpbWUgPCAyMDA7XG5cbiAgICAvLyBSZXNldCBwcmVkaWNhdGUuXG4gICAgdGhpcy5fcmVzZXRTdGFydFByZWRpY2F0ZSgpO1xuXG4gICAgLy8gSWYgdGhlIGdlc3R1cmUgY2FuIGJlIGludGVycHJldGVkIGFzIGNsaWNrIGxldCdzIHRyeSB0byBvcGVuIHRoZSBlbGVtZW50J3NcbiAgICAvLyBocmVmIHVybCAoaWYgaXQgaXMgYW4gYW5jaG9yIGVsZW1lbnQpLlxuICAgIGlmIChpc0NsaWNrKSBvcGVuQW5jaG9ySHJlZihlbGVtZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgZHJhZyBzb3J0IGhldXJpc3RpY3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3Jlc2V0SGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5faFgxID0gdGhpcy5faFgyID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTIgPSBldmVudC5jbGllbnRZO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSdW4gaGV1cmlzdGljcyBhbmQgcmV0dXJuIHRydWUgaWYgb3ZlcmxhcCBjaGVjayBjYW4gYmUgcGVyZm9ybWVkLCBhbmQgZmFsc2VcbiAgICogaWYgaXQgY2FuIG5vdC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2NoZWNrSGV1cmlzdGljcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnU29ydEhldXJpc3RpY3M7XG4gICAgdmFyIG1pbkRpc3QgPSBzZXR0aW5ncy5taW5EcmFnRGlzdGFuY2U7XG5cbiAgICAvLyBTa2lwIGhldXJpc3RpY3MgaWYgbm90IG5lZWRlZC5cbiAgICBpZiAobWluRGlzdCA8PSAwKSB7XG4gICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICB2YXIgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgdmFyIGRpZmZYID0geCAtIHRoaXMuX2hYMjtcbiAgICB2YXIgZGlmZlkgPSB5IC0gdGhpcy5faFkyO1xuXG4gICAgLy8gSWYgd2UgY2FuJ3QgZG8gcHJvcGVyIGJvdW5jZSBiYWNrIGNoZWNrIG1ha2Ugc3VyZSB0aGF0IHRoZSBibG9ja2VkIGluZGV4XG4gICAgLy8gaXMgbm90IHNldC5cbiAgICB2YXIgY2FuQ2hlY2tCb3VuY2VCYWNrID0gbWluRGlzdCA+IDMgJiYgc2V0dGluZ3MubWluQm91bmNlQmFja0FuZ2xlID4gMDtcbiAgICBpZiAoIWNhbkNoZWNrQm91bmNlQmFjaykge1xuICAgICAgdGhpcy5faEJsb2NrZWRJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IG1pbkRpc3QgfHwgTWF0aC5hYnMoZGlmZlkpID4gbWluRGlzdCkge1xuICAgICAgLy8gUmVzZXQgYmxvY2tlZCBpbmRleCBpZiBhbmdsZSBjaGFuZ2VkIGVub3VnaC4gVGhpcyBjaGVjayByZXF1aXJlcyBhXG4gICAgICAvLyBtaW5pbXVtIHZhbHVlIG9mIDMgZm9yIG1pbkRyYWdEaXN0YW5jZSB0byBmdW5jdGlvbiBwcm9wZXJseS5cbiAgICAgIGlmIChjYW5DaGVja0JvdW5jZUJhY2spIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkaWZmWCwgZGlmZlkpO1xuICAgICAgICB2YXIgcHJldkFuZ2xlID0gTWF0aC5hdGFuMih0aGlzLl9oWDIgLSB0aGlzLl9oWDEsIHRoaXMuX2hZMiAtIHRoaXMuX2hZMSk7XG4gICAgICAgIHZhciBkZWx0YUFuZ2xlID0gTWF0aC5hdGFuMihNYXRoLnNpbihhbmdsZSAtIHByZXZBbmdsZSksIE1hdGguY29zKGFuZ2xlIC0gcHJldkFuZ2xlKSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YUFuZ2xlKSA+IHNldHRpbmdzLm1pbkJvdW5jZUJhY2tBbmdsZSkge1xuICAgICAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwb2ludHMuXG4gICAgICB0aGlzLl9oWDEgPSB0aGlzLl9oWDI7XG4gICAgICB0aGlzLl9oWTEgPSB0aGlzLl9oWTI7XG4gICAgICB0aGlzLl9oWDIgPSB4O1xuICAgICAgdGhpcy5faFkyID0geTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCBmb3IgZGVmYXVsdCBkcmFnIHN0YXJ0IHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9yZXNldFN0YXJ0UHJlZGljYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZWRpY2F0ZSA9IHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YTtcbiAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICBpZiAocHJlZGljYXRlLmRlbGF5VGltZXIpIHtcbiAgICAgICAgcHJlZGljYXRlLmRlbGF5VGltZXIgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHByZWRpY2F0ZS5kZWxheVRpbWVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayAoZHVyaW5nIGRyYWcpIGlmIGFuIGl0ZW0gaXMgb3ZlcmxhcHBpbmcgb3RoZXIgaXRlbXMgYW5kIGJhc2VkIG9uXG4gICAqIHRoZSBjb25maWd1cmF0aW9uIGxheW91dCB0aGUgaXRlbXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fY2hlY2tPdmVybGFwID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2dldEdyaWQoKS5fc2V0dGluZ3M7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgY3VycmVudEdyaWQ7XG4gICAgdmFyIGN1cnJlbnRJbmRleDtcbiAgICB2YXIgdGFyZ2V0R3JpZDtcbiAgICB2YXIgdGFyZ2V0SW5kZXg7XG4gICAgdmFyIHNvcnRBY3Rpb247XG4gICAgdmFyIGlzTWlncmF0aW9uO1xuXG4gICAgLy8gR2V0IG92ZXJsYXAgY2hlY2sgcmVzdWx0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0UHJlZGljYXRlKSkge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUoaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gSXRlbURyYWcuZGVmYXVsdFNvcnRQcmVkaWNhdGUoaXRlbSwgc2V0dGluZ3MuZHJhZ1NvcnRQcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIC8vIExldCdzIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IG9iamVjdCBoYXMgYSB2YWxpZCBpbmRleCBiZWZvcmUgZ29pbmcgZnVydGhlci5cbiAgICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0LmluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuO1xuXG4gICAgY3VycmVudEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB0YXJnZXRHcmlkID0gcmVzdWx0LmdyaWQgfHwgY3VycmVudEdyaWQ7XG4gICAgaXNNaWdyYXRpb24gPSBjdXJyZW50R3JpZCAhPT0gdGFyZ2V0R3JpZDtcbiAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50R3JpZC5faXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0R3JpZC5faXRlbXMsIHJlc3VsdC5pbmRleCwgaXNNaWdyYXRpb24pO1xuICAgIHNvcnRBY3Rpb24gPSByZXN1bHQuYWN0aW9uID09PSBhY3Rpb25Td2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG5cbiAgICAvLyBQcmV2ZW50IHBvc2l0aW9uIGJvdW5jZS5cbiAgICBpZiAoIWlzTWlncmF0aW9uICYmIHRhcmdldEluZGV4ID09PSB0aGlzLl9oQmxvY2tlZEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHdpdGhpbiBpdCdzIGN1cnJlbnQgZ3JpZC5cbiAgICBpZiAoIWlzTWlncmF0aW9uKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHRhcmdldCBpbmRleCBpcyBub3QgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAgICBpZiAoY3VycmVudEluZGV4ICE9PSB0YXJnZXRJbmRleCkge1xuICAgICAgICB0aGlzLl9oQmxvY2tlZEluZGV4ID0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIC8vIERvIHRoZSBzb3J0LlxuICAgICAgICAoc29ydEFjdGlvbiA9PT0gYWN0aW9uU3dhcCA/IGFycmF5U3dhcCA6IGFycmF5TW92ZSkoXG4gICAgICAgICAgY3VycmVudEdyaWQuX2l0ZW1zLFxuICAgICAgICAgIGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0YXJnZXRJbmRleFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgICAgaWYgKGN1cnJlbnRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXgsXG4gICAgICAgICAgICBhY3Rpb246IHNvcnRBY3Rpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExheW91dCB0aGUgZ3JpZC5cbiAgICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gd2FzIG1vdmVkIHRvIGFub3RoZXIgZ3JpZC5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2hCbG9ja2VkSW5kZXggPSBudWxsO1xuXG4gICAgICAvLyBFbWl0IGJlZm9yZVNlbmQgZXZlbnQuXG4gICAgICBpZiAoY3VycmVudEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVNlbmQpKSB7XG4gICAgICAgIGN1cnJlbnRHcmlkLl9lbWl0KGV2ZW50QmVmb3JlU2VuZCwge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgZnJvbUdyaWQ6IGN1cnJlbnRHcmlkLFxuICAgICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgICAgaWYgKHRhcmdldEdyaWQuX2hhc0xpc3RlbmVycyhldmVudEJlZm9yZVJlY2VpdmUpKSB7XG4gICAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRCZWZvcmVSZWNlaXZlLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgICAgaXRlbS5fZ3JpZElkID0gdGFyZ2V0R3JpZC5faWQ7XG5cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIGluc3RhbmNlJ3MgbWlncmF0aW5nIGluZGljYXRvci5cbiAgICAgIHRoaXMuX2lzTWlncmF0aW5nID0gaXRlbS5fZ3JpZElkICE9PSB0aGlzLl9ncmlkSWQ7XG5cbiAgICAgIC8vIE1vdmUgaXRlbSBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgZ3JpZCB0byB0YXJnZXQgZ3JpZC5cbiAgICAgIGN1cnJlbnRHcmlkLl9pdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAgIGFycmF5SW5zZXJ0KHRhcmdldEdyaWQuX2l0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAgIC8vIFNldCBzb3J0IGRhdGEgYXMgbnVsbCwgd2hpY2ggaXMgYW4gaW5kaWNhdG9yIGZvciB0aGUgaXRlbSBjb21wYXJpc29uXG4gICAgICAvLyBmdW5jdGlvbiB0aGF0IHRoZSBzb3J0IGRhdGEgb2YgdGhpcyBzcGVjaWZpYyBpdGVtIHNob3VsZCBiZSBmZXRjaGVkXG4gICAgICAvLyBsYXppbHkuXG4gICAgICBpdGVtLl9zb3J0RGF0YSA9IG51bGw7XG5cbiAgICAgIC8vIEVtaXQgc2VuZCBldmVudC5cbiAgICAgIGlmIChjdXJyZW50R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50U2VuZCkpIHtcbiAgICAgICAgY3VycmVudEdyaWQuX2VtaXQoZXZlbnRTZW5kLCB7XG4gICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICBmcm9tR3JpZDogY3VycmVudEdyaWQsXG4gICAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHJlY2VpdmUgZXZlbnQuXG4gICAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudFJlY2VpdmUsIHtcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGZyb21HcmlkOiBjdXJyZW50R3JpZCxcbiAgICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExheW91dCBib3RoIGdyaWRzLlxuICAgICAgY3VycmVudEdyaWQubGF5b3V0KCk7XG4gICAgICB0YXJnZXRHcmlkLmxheW91dCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSWYgaXRlbSBpcyBkcmFnZ2VkIGludG8gYW5vdGhlciBncmlkLCBmaW5pc2ggdGhlIG1pZ3JhdGlvbiBwcm9jZXNzXG4gICAqIGdyYWNlZnVsbHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fZmluaXNoTWlncmF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGlzQWN0aXZlID0gaXRlbS5faXNBY3RpdmU7XG4gICAgdmFyIHRhcmdldEdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgdGFyZ2V0R3JpZEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRTZXR0aW5ncyA9IHRhcmdldEdyaWQuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRTZXR0aW5ncy5kcmFnQ29udGFpbmVyIHx8IHRhcmdldEdyaWRFbGVtZW50O1xuICAgIHZhciBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIG9mZnNldERpZmY7XG5cbiAgICAvLyBEZXN0cm95IGN1cnJlbnQgZHJhZy4gTm90ZSB0aGF0IHdlIG5lZWQgdG8gc2V0IHRoZSBtaWdyYXRpbmcgZmxhZyB0b1xuICAgIC8vIGZhbHNlIGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjcmVhdGUgYW4gaW5maW5pdGUgbG9vcCBiZXR3ZWVuIHRoaXNcbiAgICAvLyBhbmQgdGhlIGRyYWcuc3RvcCgpIG1ldGhvZC5cbiAgICB0aGlzLl9pc01pZ3JhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuXG4gICAgLy8gUmVtb3ZlIGN1cnJlbnQgY2xhc3NuYW1lcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBjdXJyZW50U2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3VycmVudFNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzbmFtZXMuXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgdGFyZ2V0U2V0dGluZ3MuaXRlbUNsYXNzKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBpc0FjdGl2ZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSB0aGUgaXRlbSBpbnNpZGUgdGhlIHRhcmdldCBjb250YWluZXIgaWYgaXQncyBkaWZmZXJlbnQgdGhhbiB0aGVcbiAgICAvLyBjdXJyZW50IGNvbnRhaW5lci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0YXJnZXRDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZihjdXJyZW50Q29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIHRydWUpO1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlLnggLT0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdHJhbnNsYXRlLnkgLT0gb2Zmc2V0RGlmZi50b3A7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGl0ZW0ncyBjYWNoZWQgZGltZW5zaW9ucyBhbmQgc29ydCBkYXRhLlxuICAgIGl0ZW0uX3JlZnJlc2hEaW1lbnNpb25zKCk7XG4gICAgaXRlbS5fcmVmcmVzaFNvcnREYXRhKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0J3MgZHJhZyBjb250YWluZXIgKGlmIGFueSlcbiAgICAvLyBhbmQgYWN0dWFsIGdyaWQgY29udGFpbmVyIGVsZW1lbnQuIFdlIHNhdmUgaXQgbGF0ZXIgZm9yIHRoZSByZWxlYXNlXG4gICAgLy8gcHJvY2Vzcy5cbiAgICBvZmZzZXREaWZmID0gZ2V0T2Zmc2V0RGlmZih0YXJnZXRDb250YWluZXIsIHRhcmdldEdyaWRFbGVtZW50LCB0cnVlKTtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWCA9IG9mZnNldERpZmYubGVmdDtcbiAgICByZWxlYXNlLl9jb250YWluZXJEaWZmWSA9IG9mZnNldERpZmYudG9wO1xuXG4gICAgLy8gUmVjcmVhdGUgaXRlbSdzIGRyYWcgaGFuZGxlci5cbiAgICBpdGVtLl9kcmFnID0gdGFyZ2V0U2V0dGluZ3MuZHJhZ0VuYWJsZWQgPyBuZXcgSXRlbURyYWcoaXRlbSkgOiBudWxsO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBlbGVtZW50IGlmIGl0IHdhcyBtb3ZlZCBmcm9tIGEgY29udGFpbmVyXG4gICAgLy8gdG8gYW5vdGhlci5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZS54LCB0cmFuc2xhdGUueSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNoaWxkIGVsZW1lbnQncyBzdHlsZXMgdG8gcmVmbGVjdCB0aGUgY3VycmVudCB2aXNpYmlsaXR5IHN0YXRlLlxuICAgIGl0ZW0uX2NoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICBzZXRTdHlsZXMoaXRlbS5fY2hpbGQsIGlzQWN0aXZlID8gdGFyZ2V0U2V0dGluZ3MudmlzaWJsZVN0eWxlcyA6IHRhcmdldFNldHRpbmdzLmhpZGRlblN0eWxlcyk7XG5cbiAgICAvLyBTdGFydCB0aGUgcmVsZWFzZS5cbiAgICByZWxlYXNlLnN0YXJ0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgcHJlLXN0YXJ0IGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX3ByZVN0YXJ0Q2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIExldCdzIGFjdGl2YXRlIGRyYWcgc3RhcnQgcHJlZGljYXRlIHN0YXRlLlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZUluYWN0aXZlKSB7XG4gICAgICB0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID0gc3RhcnRQcmVkaWNhdGVQZW5kaW5nO1xuICAgIH1cblxuICAgIC8vIElmIHByZWRpY2F0ZSBpcyBwZW5kaW5nIHRyeSB0byByZXNvbHZlIGl0LlxuICAgIGlmICh0aGlzLl9zdGFydFByZWRpY2F0ZVN0YXRlID09PSBzdGFydFByZWRpY2F0ZVBlbmRpbmcpIHtcbiAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID0gdGhpcy5fc3RhcnRQcmVkaWNhdGUodGhpcy5faXRlbSwgZXZlbnQpO1xuICAgICAgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlc29sdmVkO1xuICAgICAgICB0aGlzLl9vblN0YXJ0KGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhcnRQcmVkaWNhdGVSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPSBzdGFydFByZWRpY2F0ZVJlamVjdGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBpZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWcgaXMgYWN0aXZlLCBtb3ZlIHRoZSBpdGVtLlxuICAgIGVsc2UgaWYgKHRoaXMuX3N0YXJ0UHJlZGljYXRlU3RhdGUgPT09IHN0YXJ0UHJlZGljYXRlUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuX29uTW92ZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEcmFnIHByZS1lbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0RyYWdnZXJFdmVudH0gZXZlbnRcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlRW5kQ2hlY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBwcmVkaWNhdGUgd2FzIHJlc29sdmVkIGR1cmluZyBkcmFnLlxuICAgIHZhciBpc1Jlc29sdmVkID0gdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9PT0gc3RhcnRQcmVkaWNhdGVSZXNvbHZlZDtcblxuICAgIC8vIERvIGZpbmFsIHByZWRpY2F0ZSBjaGVjayB0byBhbGxvdyB1c2VyIHRvIHVuYmluZCBzdHVmZiBmb3IgdGhlIGN1cnJlbnRcbiAgICAvLyBkcmFnIHByb2NlZHVyZSB3aXRoaW4gdGhlIHByZWRpY2F0ZSBjYWxsYmFjay4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzXG4gICAgLy8gY2hlY2sgd2lsbCBoYXZlIG5vIGVmZmVjdCB0byB0aGUgc3RhdGUgb2YgdGhlIHByZWRpY2F0ZS5cbiAgICB0aGlzLl9zdGFydFByZWRpY2F0ZSh0aGlzLl9pdGVtLCBldmVudCk7XG5cbiAgICAvLyBSZXNldCBzdGFydCBwcmVkaWNhdGUgc3RhdGUuXG4gICAgdGhpcy5fc3RhcnRQcmVkaWNhdGVTdGF0ZSA9IHN0YXJ0UHJlZGljYXRlSW5hY3RpdmU7XG5cbiAgICAvLyBJZiBwcmVkaWNhdGUgaXMgcmVzb2x2ZWQgYW5kIGRyYWdnaW5nIGlzIGFjdGl2ZSwgY2FsbCB0aGUgZW5kIGhhbmRsZXIuXG4gICAgaWYgKGlzUmVzb2x2ZWQgJiYgdGhpcy5faXNBY3RpdmUpIHRoaXMuX29uRW5kKGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzdGFydCBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBJZiBpdGVtIGlzIG5vdCBhY3RpdmUsIGRvbid0IHN0YXJ0IHRoZSBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgcmVsZWFzZSA9IGl0ZW0uX3JlbGVhc2U7XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgZHJhZ0NvbnRhaW5lciA9IHNldHRpbmdzLmRyYWdDb250YWluZXIgfHwgZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgY29udGFpbmluZ0Jsb2NrID0gZ2V0Q29udGFpbmluZ0Jsb2NrKGRyYWdDb250YWluZXIsIHRydWUpO1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgdmFyIGN1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdmFyIGN1cnJlbnRUb3AgPSB0cmFuc2xhdGUueTtcbiAgICB2YXIgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBoYXNEcmFnQ29udGFpbmVyID0gZHJhZ0NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcjtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIFJlc2V0IGhldXJpc3RpY3MgZGF0YS5cbiAgICB0aGlzLl9yZXNldEhldXJpc3RpY3MoZXZlbnQpO1xuXG4gICAgLy8gSWYgZ3JpZCBjb250YWluZXIgaXMgbm90IHRoZSBkcmFnIGNvbnRhaW5lciwgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlXG4gICAgLy8gb2Zmc2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBncmlkIGNvbnRhaW5lciBhbmQgZHJhZyBjb250YWluZXIncyBjb250YWluaW5nXG4gICAgLy8gZWxlbWVudC5cbiAgICBpZiAoaGFzRHJhZ0NvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYoY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgcG9zaXRpb25pbmcgYW5pbWF0aW9uLlxuICAgIGlmIChpdGVtLmlzUG9zaXRpb25pbmcoKSkge1xuICAgICAgaXRlbS5fbGF5b3V0LnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBjdXJyZW50IG1pZ3JhdGlvbiBhbmltYXRpb24uXG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSB7XG4gICAgICBjdXJyZW50TGVmdCAtPSBtaWdyYXRlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIGN1cnJlbnRUb3AgLT0gbWlncmF0ZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBtaWdyYXRlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyhjdXJyZW50TGVmdCwgY3VycmVudFRvcCkgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBiZWluZyByZWxlYXNlZCByZXNldCByZWxlYXNlIGRhdGEuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkgcmVsZWFzZS5fcmVzZXQoKTtcblxuICAgIC8vIFNldHVwIGRyYWcgZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5fY29udGFpbmVyID0gZHJhZ0NvbnRhaW5lcjtcbiAgICB0aGlzLl9jb250YWluaW5nQmxvY2sgPSBjb250YWluaW5nQmxvY2s7XG4gICAgdGhpcy5fZWxlbWVudENsaWVudFggPSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIHRoaXMuX2VsZW1lbnRDbGllbnRZID0gZWxlbWVudFJlY3QudG9wO1xuICAgIHRoaXMuX2xlZnQgPSB0aGlzLl9ncmlkWCA9IGN1cnJlbnRMZWZ0O1xuICAgIHRoaXMuX3RvcCA9IHRoaXMuX2dyaWRZID0gY3VycmVudFRvcDtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciAoaWYgbmVjZXNzYXJ5KS5cbiAgICBpZiAoc2V0dGluZ3MuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQpIHtcbiAgICAgIGl0ZW0uX2RyYWdQbGFjZWhvbGRlci5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdJbml0IGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnSW5pdCwgaXRlbSwgZXZlbnQpO1xuXG4gICAgLy8gSWYgYSBzcGVjaWZpYyBkcmFnIGNvbnRhaW5lciBpcyBzZXQgYW5kIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZVxuICAgIC8vIGdyaWQncyBjb250YWluZXIgZWxlbWVudCB3ZSBuZWVkIHRvIGNhc3Qgc29tZSBleHRyYSBzcGVsbHMuXG4gICAgaWYgKGhhc0RyYWdDb250YWluZXIpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBjb250YWluZXIgb2Zmc2V0IGRpZmZzIHRvIGRyYWcgZGF0YS5cbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcblxuICAgICAgLy8gSWYgdGhlIGRyYWdnZWQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIHRoZSBkcmFnIGNvbnRhaW5lciBhbGwgd2UgbmVlZCB0b1xuICAgICAgLy8gZG8gaXMgc2V0dXAgdGhlIHJlbGF0aXZlIGRyYWcgcG9zaXRpb24gZGF0YS5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUgPT09IGRyYWdDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fZ3JpZFggPSBjdXJyZW50TGVmdCAtIHRoaXMuX2NvbnRhaW5lckRpZmZYO1xuICAgICAgICB0aGlzLl9ncmlkWSA9IGN1cnJlbnRUb3AgLSB0aGlzLl9jb250YWluZXJEaWZmWTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVjdCBjb250YWluZXIsXG4gICAgICAvLyBzZXR1cCB0aGUgYWN0dWFsIGRyYWcgcG9zaXRpb24gZGF0YSBhbmQgYWRqdXN0IHRoZSBlbGVtZW50J3MgdHJhbnNsYXRlXG4gICAgICAvLyB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIERPTSBwb3NpdGlvbiBzaGlmdC5cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9sZWZ0ID0gY3VycmVudExlZnQgKyB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgICAgdGhpcy5fdG9wID0gY3VycmVudFRvcCArIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgICAgICBkcmFnQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGRyYWcgY2xhc3MgYW5kIGJpbmQgc2Nyb2xsZXJzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1EcmFnZ2luZ0NsYXNzKTtcbiAgICB0aGlzLl9iaW5kU2Nyb2xsTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBFbWl0IGRyYWdTdGFydCBldmVudC5cbiAgICBncmlkLl9lbWl0KGV2ZW50RHJhZ1N0YXJ0LCBpdGVtLCBldmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgbW92ZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7RHJhZ2dlckV2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vbk1vdmUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBheGlzID0gc2V0dGluZ3MuZHJhZ0F4aXM7XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHZhciB4RGlmZiA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCArPSB4RGlmZjtcbiAgICAgIHRoaXMuX2VsZW1lbnRDbGllbnRYICs9IHhEaWZmO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB2ZXJ0aWNhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneCcpIHtcbiAgICAgIHZhciB5RGlmZiA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLl9kcmFnRXZlbnQuY2xpZW50WTtcbiAgICAgIHRoaXMuX3RvcCArPSB5RGlmZjtcbiAgICAgIHRoaXMuX2dyaWRZICs9IHlEaWZmO1xuICAgICAgdGhpcy5fZWxlbWVudENsaWVudFkgKz0geURpZmY7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV2ZW50IGRhdGEuXG4gICAgdGhpcy5fZHJhZ0V2ZW50ID0gZXZlbnQ7XG5cbiAgICAvLyBEbyBtb3ZlIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRNb3ZlVGljayhpdGVtLl9pZCwgdGhpcy5fcHJlcGFyZU1vdmUsIHRoaXMuX2FwcGx5TW92ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBtb3ZpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIXRoaXMuX2l0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBJZiBkcmFnIHNvcnQgaXMgZW5hYmxlZCAtPiBjaGVjayBvdmVybGFwLlxuICAgIGlmICh0aGlzLl9nZXRHcmlkKCkuX3NldHRpbmdzLmRyYWdTb3J0KSB7XG4gICAgICBpZiAodGhpcy5fY2hlY2tIZXVyaXN0aWNzKHRoaXMuX2RyYWdFdmVudCkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tPdmVybGFwRGVib3VuY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IG1vdmVtZW50IHRvIGRyYWdnZWQgaXRlbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9hcHBseU1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG5cbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0ZW0gaXMgbm90IGFjdGl2ZS5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgZWxlbWVudCdzIHRyYW5zbGF0ZVgvWSB2YWx1ZXMuXG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyh0aGlzLl9sZWZ0LCB0aGlzLl90b3ApO1xuXG4gICAgLy8gRW1pdCBkcmFnTW92ZSBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnTW92ZSwgaXRlbSwgdGhpcy5fZHJhZ0V2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBzY3JvbGwgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKi9cbiAgSXRlbURyYWcucHJvdG90eXBlLl9vblNjcm9sbCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlLCByZXNldCBkcmFnLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsYXN0IHNjcm9sbCBldmVudC5cbiAgICB0aGlzLl9zY3JvbGxFdmVudCA9IGV2ZW50O1xuXG4gICAgLy8gRG8gc2Nyb2xsIHByZXBhcmUvYXBwbHkgaGFuZGxpbmcgaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRTY3JvbGxUaWNrKGl0ZW0uX2lkLCB0aGlzLl9wcmVwYXJlU2Nyb2xsLCB0aGlzLl9hcHBseVNjcm9sbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZHJhZ2dlZCBpdGVtIGZvciBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnLnByb3RvdHlwZS5fcHJlcGFyZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSBkbyBub3RoaW5nLlxuICAgIGlmICghaXRlbS5faXNBY3RpdmUpIHJldHVybjtcblxuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2dldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYXhpcyA9IHNldHRpbmdzLmRyYWdBeGlzO1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gZ3JpZC5fZWxlbWVudDtcbiAgICB2YXIgb2Zmc2V0RGlmZjtcblxuICAgIC8vIENhbGN1bGF0ZSBlbGVtZW50J3MgcmVjdCBhbmQgeC95IGRpZmYuXG4gICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciB4RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHZhciB5RGlmZiA9IHRoaXMuX2VsZW1lbnRDbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAvLyBVcGRhdGUgY29udGFpbmVyIGRpZmYuXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lciAhPT0gZ3JpZENvbnRhaW5lcikge1xuICAgICAgb2Zmc2V0RGlmZiA9IGdldE9mZnNldERpZmYodGhpcy5fY29udGFpbmluZ0Jsb2NrLCBncmlkQ29udGFpbmVyKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gb2Zmc2V0RGlmZi5sZWZ0O1xuICAgICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSBvZmZzZXREaWZmLnRvcDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBkYXRhLlxuICAgIGlmIChheGlzICE9PSAneScpIHtcbiAgICAgIHRoaXMuX2xlZnQgKz0geERpZmY7XG4gICAgICB0aGlzLl9ncmlkWCA9IHRoaXMuX2xlZnQgLSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmVydGljYWwgcG9zaXRpb24gZGF0YS5cbiAgICBpZiAoYXhpcyAhPT0gJ3gnKSB7XG4gICAgICB0aGlzLl90b3AgKz0geURpZmY7XG4gICAgICB0aGlzLl9ncmlkWSA9IHRoaXMuX3RvcCAtIHRoaXMuX2NvbnRhaW5lckRpZmZZO1xuICAgIH1cblxuICAgIC8vIE92ZXJsYXAgaGFuZGxpbmcuXG4gICAgaWYgKHNldHRpbmdzLmRyYWdTb3J0KSB0aGlzLl9jaGVja092ZXJsYXBEZWJvdW5jZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBzY3JvbGwgdG8gZHJhZ2dlZCBpdGVtLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWcucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX2FwcGx5U2Nyb2xsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuXG4gICAgLy8gSWYgaXRlbSBpcyBub3QgYWN0aXZlIGRvIG5vdGhpbmcuXG4gICAgaWYgKCFpdGVtLl9pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGVsZW1lbnQncyB0cmFuc2xhdGVYL1kgdmFsdWVzLlxuICAgIGl0ZW0uX2VsZW1lbnQuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fbGVmdCwgdGhpcy5fdG9wKTtcblxuICAgIC8vIEVtaXQgZHJhZ1Njcm9sbCBldmVudC5cbiAgICB0aGlzLl9nZXRHcmlkKCkuX2VtaXQoZXZlbnREcmFnU2Nyb2xsLCBpdGVtLCB0aGlzLl9zY3JvbGxFdmVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERyYWcgZW5kIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZy5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtEcmFnZ2VyRXZlbnR9IGV2ZW50XG4gICAqL1xuICBJdGVtRHJhZy5wcm90b3R5cGUuX29uRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5fZ2V0R3JpZCgpO1xuICAgIHZhciBzZXR0aW5ncyA9IGdyaWQuX3NldHRpbmdzO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIC8vIElmIGl0ZW0gaXMgbm90IGFjdGl2ZSwgcmVzZXQgZHJhZy5cbiAgICBpZiAoIWl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgcXVldWVkIG1vdmUgYW5kIHNjcm9sbCB0aWNrcy5cbiAgICBjYW5jZWxNb3ZlVGljayhpdGVtLl9pZCk7XG4gICAgY2FuY2VsU2Nyb2xsVGljayhpdGVtLl9pZCk7XG5cbiAgICAvLyBGaW5pc2ggY3VycmVudGx5IHF1ZXVlZCBvdmVybGFwIGNoZWNrLlxuICAgIHNldHRpbmdzLmRyYWdTb3J0ICYmIHRoaXMuX2NoZWNrT3ZlcmxhcERlYm91bmNlKCdmaW5pc2gnKTtcblxuICAgIC8vIFJlbW92ZSBzY3JvbGwgbGlzdGVuZXJzLlxuICAgIHRoaXMuX3VuYmluZFNjcm9sbExpc3RlbmVycygpO1xuXG4gICAgLy8gU2V0dXAgcmVsZWFzZSBkYXRhLlxuICAgIHJlbGVhc2UuX2NvbnRhaW5lckRpZmZYID0gdGhpcy5fY29udGFpbmVyRGlmZlg7XG4gICAgcmVsZWFzZS5fY29udGFpbmVyRGlmZlkgPSB0aGlzLl9jb250YWluZXJEaWZmWTtcblxuICAgIC8vIFJlc2V0IGRyYWcgZGF0YS5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgbmFtZSBmcm9tIGVsZW1lbnQuXG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbURyYWdnaW5nQ2xhc3MpO1xuXG4gICAgLy8gRW1pdCBkcmFnRW5kIGV2ZW50LlxuICAgIGdyaWQuX2VtaXQoZXZlbnREcmFnRW5kLCBpdGVtLCBldmVudCk7XG5cbiAgICAvLyBGaW5pc2ggdXAgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzIG9yIHN0YXJ0IHRoZSByZWxlYXNlIHByb2Nlc3MuXG4gICAgdGhpcy5faXNNaWdyYXRpbmcgPyB0aGlzLl9maW5pc2hNaWdyYXRpb24oKSA6IHJlbGVhc2Uuc3RhcnQoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBoZWxwZXJzXG4gICAqICoqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGhvdyBtYW55IHBlcmNlbnQgdGhlIGludGVyc2VjdGlvbiBhcmVhIG9mIHR3byByZWN0YW5nbGVzIGlzIGZyb21cbiAgICogdGhlIG1heGltdW0gcG90ZW50aWFsIGludGVyc2VjdGlvbiBhcmVhIGJldHdlZW4gdGhlIHJlY3RhbmdsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqICAgLSBBIG51bWJlciBiZXR3ZWVuIDAtMTAwLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVjdE92ZXJsYXBTY29yZShhLCBiKSB7XG4gICAgLy8gUmV0dXJuIDAgaW1tZWRpYXRlbHkgaWYgdGhlIHJlY3RhbmdsZXMgZG8gbm90IG92ZXJsYXAuXG4gICAgaWYgKFxuICAgICAgYS5sZWZ0ICsgYS53aWR0aCA8PSBiLmxlZnQgfHxcbiAgICAgIGIubGVmdCArIGIud2lkdGggPD0gYS5sZWZ0IHx8XG4gICAgICBhLnRvcCArIGEuaGVpZ2h0IDw9IGIudG9wIHx8XG4gICAgICBiLnRvcCArIGIuaGVpZ2h0IDw9IGEudG9wXG4gICAgKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIGFyZWEncyB3aWR0aCwgaGVpZ2h0LCBtYXggaGVpZ2h0IGFuZCBtYXggd2lkdGguXG4gICAgdmFyIHdpZHRoID0gTWF0aC5taW4oYS5sZWZ0ICsgYS53aWR0aCwgYi5sZWZ0ICsgYi53aWR0aCkgLSBNYXRoLm1heChhLmxlZnQsIGIubGVmdCk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGgubWluKGEudG9wICsgYS5oZWlnaHQsIGIudG9wICsgYi5oZWlnaHQpIC0gTWF0aC5tYXgoYS50b3AsIGIudG9wKTtcbiAgICB2YXIgbWF4V2lkdGggPSBNYXRoLm1pbihhLndpZHRoLCBiLndpZHRoKTtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gTWF0aC5taW4oYS5oZWlnaHQsIGIuaGVpZ2h0KTtcblxuICAgIHJldHVybiAoKHdpZHRoICogaGVpZ2h0KSAvIChtYXhXaWR0aCAqIG1heEhlaWdodCkpICogMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgaXMgYW4gYW5jaG9yIGVsZW1lbnQgYW5kIG9wZW4gdGhlIGhyZWYgdXJsIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBvcGVuQW5jaG9ySHJlZihlbGVtZW50KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFuY2hvciBlbGVtZW50LlxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2EnKSByZXR1cm47XG5cbiAgICAvLyBHZXQgaHJlZiBhbmQgbWFrZSBzdXJlIGl0IGV4aXN0cy5cbiAgICB2YXIgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgaWYgKCFocmVmKSByZXR1cm47XG5cbiAgICAvLyBGaW5hbGx5IGxldCdzIG5hdmlnYXRlIHRvIHRoZSBsaW5rIGhyZWYuXG4gICAgdmFyIHRhcmdldCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gJ19zZWxmJykge1xuICAgICAgd2luZG93Lm9wZW4oaHJlZiwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFnIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtRHJhZ1BsYWNlaG9sZGVyKGl0ZW0pIHtcbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fY2xhc3NOYW1lID0gJyc7XG4gICAgdGhpcy5fZGlkTWlncmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50TGVmdCA9IDA7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IDA7XG4gICAgdGhpcy5fbmV4dExlZnQgPSAwO1xuICAgIHRoaXMuX25leHRUb3AgPSAwO1xuXG4gICAgLy8gQmluZCBhbmltYXRpb24gaGFuZGxlcnMuXG4gICAgdGhpcy5fc2V0dXBBbmltYXRpb24gPSB0aGlzLl9zZXR1cEFuaW1hdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uID0gdGhpcy5fc3RhcnRBbmltYXRpb24uYmluZCh0aGlzKTtcblxuICAgIC8vIEJpbmQgZXZlbnQgaGFuZGxlcnMuXG4gICAgdGhpcy5fb25MYXlvdXRTdGFydCA9IHRoaXMuX29uTGF5b3V0U3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkxheW91dEVuZCA9IHRoaXMuX29uTGF5b3V0RW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlRW5kID0gdGhpcy5fb25SZWxlYXNlRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25NaWdyYXRlID0gdGhpcy5fb25NaWdyYXRlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNb3ZlIHBsYWNlaG9sZGVyIHRvIGEgbmV3IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vbkxheW91dFN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG5cbiAgICAvLyBGaW5kIG91dCB0aGUgaXRlbSdzIG5ldyAodW5hcHBsaWVkKSBsZWZ0IGFuZCB0b3AgcG9zaXRpb24uXG4gICAgdmFyIGl0ZW1JbmRleCA9IGdyaWQuX2l0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIG5leHRMZWZ0ID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDJdO1xuICAgIHZhciBuZXh0VG9wID0gZ3JpZC5fbGF5b3V0LnNsb3RzW2l0ZW1JbmRleCAqIDIgKyAxXTtcblxuICAgIC8vIElmIGl0ZW0ncyBwb3NpdGlvbiBkaWQgbm90IGNoYW5nZSBhbmQgdGhlIGl0ZW0gZGlkIG5vdCBtaWdyYXRlIHdlIGNhblxuICAgIC8vIHNhZmVseSBza2lwIGxheW91dC5cbiAgICBpZiAoIXRoaXMuX2RpZE1pZ3JhdGUgJiYgaXRlbS5fbGVmdCA9PT0gbmV4dExlZnQgJiYgaXRlbS5fdG9wID09PSBuZXh0VG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2xvdHMgZGF0YSBpcyBjYWxjdWxhdGVkIHdpdGggaXRlbSBtYXJnaW5zIGFkZGVkIHRvIHRoZW0gc28gd2UgbmVlZCB0byBhZGRcbiAgICAvLyBpdGVtJ3MgbGVmdCBhbmQgdG9wIG1hcmdpbiB0byB0aGUgc2xvdCBkYXRhIHRvIGdldCB0aGUgcGxhY2Vob2xkZXInc1xuICAgIC8vIG5leHQgcG9zaXRpb24uXG4gICAgbmV4dExlZnQgKz0gaXRlbS5fbWFyZ2luTGVmdDtcbiAgICBuZXh0VG9wICs9IGl0ZW0uX21hcmdpblRvcDtcblxuICAgIC8vIEp1c3Qgc25hcCB0byBuZXcgcG9zaXRpb24gd2l0aG91dCBhbnkgYW5pbWF0aW9ucyBpZiBubyBhbmltYXRpb24gaXNcbiAgICAvLyByZXF1aXJlZCBvciBpZiBwbGFjZWhvbGRlciBtb3ZlcyBiZXR3ZWVuIGdyaWRzLlxuICAgIHZhciBhbmltRW5hYmxlZCA9IGdyaWQuX3NldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5kdXJhdGlvbiA+IDA7XG4gICAgaWYgKCFhbmltRW5hYmxlZCB8fCB0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAvLyBDYW5jZWwgcG90ZW50aWFsIChxdWV1ZWQpIGxheW91dCB0aWNrLlxuICAgICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgICAgLy8gU25hcCBwbGFjZWhvbGRlciB0byBjb3JyZWN0IHBvc2l0aW9uLlxuICAgICAgdmFyIHRhcmdldFN0eWxlcyA9IHsgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobmV4dExlZnQsIG5leHRUb3ApIH07XG4gICAgICBpZiAodGhpcy5fYW5pbWF0ZS5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRhcmdldFN0eWxlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgcGxhY2Vob2xkZXIgaW5zaWRlIGNvcnJlY3QgY29udGFpbmVyIGFmdGVyIG1pZ3JhdGlvbi5cbiAgICAgIGlmICh0aGlzLl9kaWRNaWdyYXRlKSB7XG4gICAgICAgIGdyaWQuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICB0aGlzLl9kaWRNaWdyYXRlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgcGxhY2Vob2xkZXIncyBsYXlvdXQgYW5pbWF0aW9uIGluIHRoZSBuZXh0IHRpY2suIFdlIGRvIHRoaXMgdG9cbiAgICAvLyBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nLlxuICAgIHRoaXMuX25leHRMZWZ0ID0gbmV4dExlZnQ7XG4gICAgdGhpcy5fbmV4dFRvcCA9IG5leHRUb3A7XG4gICAgYWRkUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcmVwYXJlIHBsYWNlaG9sZGVyIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2N1cnJlbnRMZWZ0ID0gdHJhbnNsYXRlLng7XG4gICAgdGhpcy5fY3VycmVudFRvcCA9IHRyYW5zbGF0ZS55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcbiAgICB2YXIgY3VycmVudExlZnQgPSB0aGlzLl9jdXJyZW50TGVmdDtcbiAgICB2YXIgY3VycmVudFRvcCA9IHRoaXMuX2N1cnJlbnRUb3A7XG4gICAgdmFyIG5leHRMZWZ0ID0gdGhpcy5fbmV4dExlZnQ7XG4gICAgdmFyIG5leHRUb3AgPSB0aGlzLl9uZXh0VG9wO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKG5leHRMZWZ0LCBuZXh0VG9wKSB9O1xuXG4gICAgLy8gSWYgcGxhY2Vob2xkZXIgaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIGp1c3Qgc3RvcCBhbmltYXRpb25cbiAgICAvLyBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmIChjdXJyZW50TGVmdCA9PT0gbmV4dExlZnQgJiYgY3VycmVudFRvcCA9PT0gbmV4dFRvcCkge1xuICAgICAgaWYgKGFuaW1hdGlvbi5pc0FuaW1hdGluZygpKSBhbmltYXRpb24uc3RvcCh0YXJnZXRTdHlsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBsZXQncyBzdGFydCB0aGUgYW5pbWF0aW9uLlxuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5kcmFnUGxhY2Vob2xkZXI7XG4gICAgdmFyIGN1cnJlbnRTdHlsZXMgPSB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKGN1cnJlbnRMZWZ0LCBjdXJyZW50VG9wKSB9O1xuICAgIGFuaW1hdGlvbi5zdGFydChjdXJyZW50U3R5bGVzLCB0YXJnZXRTdHlsZXMsIHtcbiAgICAgIGR1cmF0aW9uOiBzZXR0aW5ncy5kdXJhdGlvbixcbiAgICAgIGVhc2luZzogc2V0dGluZ3MuZWFzaW5nLFxuICAgICAgb25GaW5pc2g6IHRoaXMuX29uTGF5b3V0RW5kXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExheW91dCBlbmQgaGFuZGxlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25MYXlvdXRFbmQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fcmVzZXRBZnRlckxheW91dCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRHJhZyBlbmQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGRyYWdSZWxlYXNlRW5kIGV2ZW50IGlzXG4gICAqIGVtaXR0ZWQgYW5kIHJlY2VpdmVzIHRoZSBldmVudCBkYXRhIGFzIGl0J3MgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICovXG4gIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlLl9vblJlbGVhc2VFbmQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgaWYgKGl0ZW0uX2lkID09PSB0aGlzLl9pdGVtLl9pZCkge1xuICAgICAgLy8gSWYgdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBhbmltYXRpbmcgYW55bW9yZSB3ZSBjYW4gc2FmZWx5IHJlc2V0IGl0LlxuICAgICAgaWYgKCF0aGlzLl9hbmltYXRlLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpdGVtIGlzIHN0aWxsIGFuaW1hdGluZyBoZXJlLCBsZXQncyB3YWl0IGZvciBpdCB0b1xuICAgICAgLy8gZmluaXNoIGl0J3MgYW5pbWF0aW9uLlxuICAgICAgdGhpcy5fcmVzZXRBZnRlckxheW91dCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBNaWdyYXRpb24gc3RhcnQgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGNhbGxlZCB3aGVuIGJlZm9yZVNlbmQgZXZlbnQgaXNcbiAgICogZW1pdHRlZCBhbmQgcmVjZWl2ZXMgdGhlIGV2ZW50IGRhdGEgYXMgaXQncyBhcmd1bWVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7SXRlbX0gZGF0YS5pdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZGF0YS5mcm9tR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS5mcm9tSW5kZXhcbiAgICogQHBhcmFtIHtHcmlkfSBkYXRhLnRvR3JpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YS50b0luZGV4XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5fb25NaWdyYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbWF0Y2hpbmcgaXRlbS5cbiAgICBpZiAoZGF0YS5pdGVtICE9PSB0aGlzLl9pdGVtKSByZXR1cm47XG5cbiAgICB2YXIgZ3JpZCA9IHRoaXMuX2l0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBuZXh0R3JpZCA9IGRhdGEudG9HcmlkO1xuXG4gICAgLy8gVW5iaW5kIGxpc3RlbmVycyBmcm9tIGN1cnJlbnQgZ3JpZC5cbiAgICBncmlkLm9mZihldmVudERyYWdSZWxlYXNlRW5kLCB0aGlzLl9vblJlbGVhc2VFbmQpO1xuICAgIGdyaWQub2ZmKGV2ZW50TGF5b3V0U3RhcnQsIHRoaXMuX29uTGF5b3V0U3RhcnQpO1xuICAgIGdyaWQub2ZmKGV2ZW50QmVmb3JlU2VuZCwgdGhpcy5fb25NaWdyYXRlKTtcblxuICAgIC8vIEJpbmQgbGlzdGVuZXJzIHRvIHRoZSBuZXh0IGdyaWQuXG4gICAgbmV4dEdyaWQub24oZXZlbnREcmFnUmVsZWFzZUVuZCwgdGhpcy5fb25SZWxlYXNlRW5kKTtcbiAgICBuZXh0R3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBuZXh0R3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBNYXJrIHRoZSBpdGVtIGFzIG1pZ3JhdGVkLlxuICAgIHRoaXMuX2RpZE1pZ3JhdGUgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgcGxhY2Vob2xkZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IHdyaXRlcyB0byBET00gYW5kIGRvZXMgbm90XG4gICAqIHJlYWQgYW55dGhpbmcgZnJvbSBET00gc28gaXQgc2hvdWxkIG5vdCBjYXVzZSBhbnkgYWRkaXRpb25hbCBsYXlvdXRcbiAgICogdGhyYXNoaW5nIHdoZW4gaXQncyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBzdGFydCBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcGxhY2Vob2xkZXIgc2V0IHVwIHdlIGNhbiBza2lwIHRoZSBpbml0aWF0aW9uIGxvZ2ljLlxuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5fYW5pbWF0ZTtcblxuICAgIC8vIENyZWF0ZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHZhciBlbGVtZW50O1xuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KSkge1xuICAgICAgZWxlbWVudCA9IHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50KGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIC8vIFVwZGF0ZSBlbGVtZW50IHRvIGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uX2VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gQWRkIHBsYWNlaG9sZGVyIGNsYXNzIHRvIHRoZSBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgIHRoaXMuX2NsYXNzTmFtZSA9IHNldHRpbmdzLml0ZW1QbGFjZWhvbGRlckNsYXNzIHx8ICcnO1xuICAgIGlmICh0aGlzLl9jbGFzc05hbWUpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIHRoaXMuX2NsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gdGhlIHBsYWNlaG9sZGVyIGl0ZW0gY29ycmVjdGx5LlxuICAgIHZhciBsZWZ0ID0gaXRlbS5fbGVmdCArIGl0ZW0uX21hcmdpbkxlZnQ7XG4gICAgdmFyIHRvcCA9IGl0ZW0uX3RvcCArIGl0ZW0uX21hcmdpblRvcDtcbiAgICBzZXRTdHlsZXMoZWxlbWVudCwge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICB3aWR0aDogaXRlbS5fd2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiBpdGVtLl9oZWlnaHQgKyAncHgnLFxuICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2xhdGVTdHJpbmcobGVmdCwgdG9wKVxuICAgIH0pO1xuXG4gICAgLy8gQmluZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgZ3JpZC5vbihldmVudExheW91dFN0YXJ0LCB0aGlzLl9vbkxheW91dFN0YXJ0KTtcbiAgICBncmlkLm9uKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vbihldmVudEJlZm9yZVNlbmQsIHRoaXMuX29uTWlncmF0ZSk7XG5cbiAgICAvLyBvbkNyZWF0ZSBob29rLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vbkNyZWF0ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gdGhlIGdyaWQuXG4gICAgZ3JpZC5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBsYWNlaG9sZGVyIGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuX2FuaW1hdGU7XG5cbiAgICAvLyBSZXNldCBmbGFnLlxuICAgIHRoaXMuX3Jlc2V0QWZ0ZXJMYXlvdXQgPSBmYWxzZTtcblxuICAgIC8vIENhbmNlbCBwb3RlbnRpYWwgKHF1ZXVlZCkgbGF5b3V0IHRpY2suXG4gICAgY2FuY2VsUGxhY2Vob2xkZXJUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFJlc2V0IGFuaW1hdGlvbiBpbnN0YW5jZS5cbiAgICBhbmltYXRpb24uc3RvcCgpO1xuICAgIGFuaW1hdGlvbi5fZWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzLlxuICAgIGdyaWQub2ZmKGV2ZW50RHJhZ1JlbGVhc2VFbmQsIHRoaXMuX29uUmVsZWFzZUVuZCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRMYXlvdXRTdGFydCwgdGhpcy5fb25MYXlvdXRTdGFydCk7XG4gICAgZ3JpZC5vZmYoZXZlbnRCZWZvcmVTZW5kLCB0aGlzLl9vbk1pZ3JhdGUpO1xuXG4gICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzIGZyb20gdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgaWYgKHRoaXMuX2NsYXNzTmFtZSkge1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgdGhpcy5fY2xhc3NOYW1lKTtcbiAgICAgIHRoaXMuX2NsYXNzTmFtZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBlbGVtZW50LlxuICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIG9uUmVtb3ZlIGhvb2suIE5vdGUgdGhhdCBoZXJlIHdlIHVzZSB0aGUgY3VycmVudCBncmlkJ3Mgb25SZW1vdmUgY2FsbGJhY2tcbiAgICAvLyBzbyBpZiB0aGUgaXRlbSBoYXMgbWlncmF0ZWQgZHVyaW5nIGRyYWcgdGhlIG9uUmVtb3ZlIG1ldGhvZCB3aWxsIG5vdCBiZVxuICAgIC8vIHRoZSBvcmlnaW5hdGluZyBncmlkJ3MgbWV0aG9kLlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZSkpIHtcbiAgICAgIHNldHRpbmdzLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZShpdGVtLCBlbGVtZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge2hlaWdodH0gaGVpZ2h0XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS51cGRhdGVEaW1lbnNpb25zID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0ICsgJ3B4J1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwbGFjZWhvbGRlciBpcyBjdXJyZW50bHkgYWN0aXZlICh2aXNpYmxlKS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbURyYWdQbGFjZWhvbGRlci5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2VsZW1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgcGxhY2Vob2xkZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1EcmFnUGxhY2Vob2xkZXIucHJvdG90eXBlXG4gICAqL1xuICBJdGVtRHJhZ1BsYWNlaG9sZGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuX2FuaW1hdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX2l0ZW0gPSB0aGlzLl9hbmltYXRlID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogUXVldWUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKi9cbiAgZnVuY3Rpb24gUXVldWUoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEFkZCBjYWxsYmFjayB0byB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHF1ZXVlIGNhbGxiYWNrcyBhbmQgcmVzZXQgdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBRdWV1ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsqfSBhcmcxXG4gICAqIEBwYXJhbSB7Kn0gYXJnMlxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhcmcxLCBhcmcyKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBsZW5ndGggPSBxdWV1ZS5sZW5ndGg7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBRdWl0IGVhcmx5IGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBpZiAoIWxlbmd0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgc2luZ2xlQ2FsbGJhY2sgPSBsZW5ndGggPT09IDE7XG4gICAgdmFyIHNuYXBzaG90ID0gc2luZ2xlQ2FsbGJhY2sgPyBxdWV1ZVswXSA6IHF1ZXVlLnNsaWNlKDApO1xuXG4gICAgLy8gUmVzZXQgcXVldWUuXG4gICAgcXVldWUubGVuZ3RoID0gMDtcblxuICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBjYWxsYmFjayBsZXQncyBqdXN0IGNhbGwgaXQuXG4gICAgaWYgKHNpbmdsZUNhbGxiYWNrKSB7XG4gICAgICBzbmFwc2hvdChhcmcxLCBhcmcyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbXVsdGlwbGUgY2FsbGJhY2tzLCBsZXQncyBwcm9jZXNzIHRoZW0uXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBzbmFwc2hvdFtpXShhcmcxLCBhcmcyKTtcbiAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgUXVldWUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFF1ZXVlLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBRdWV1ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fcXVldWUubGVuZ3RoID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXlvdXQgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbUxheW91dChpdGVtKSB7XG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzSW50ZXJydXB0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50U3R5bGVzID0ge307XG4gICAgdGhpcy5fdGFyZ2V0U3R5bGVzID0ge307XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRUb3AgPSAwO1xuICAgIHRoaXMuX29mZnNldExlZnQgPSAwO1xuICAgIHRoaXMuX29mZnNldFRvcCA9IDA7XG4gICAgdGhpcy5fc2tpcE5leHRBbmltYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbmltYXRlT3B0aW9ucyA9IHtcbiAgICAgIG9uRmluaXNoOiB0aGlzLl9maW5pc2guYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICAgIC8vIEJpbmQgYW5pbWF0aW9uIGhhbmRsZXJzIGFuZCBmaW5pc2ggbWV0aG9kLlxuICAgIHRoaXMuX3NldHVwQW5pbWF0aW9uID0gdGhpcy5fc2V0dXBBbmltYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbiA9IHRoaXMuX3N0YXJ0QW5pbWF0aW9uLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgaXRlbSBsYXlvdXQgYmFzZWQgb24gaXQncyBjdXJyZW50IGRhdGEuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1MYXlvdXQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcbiAgICB2YXIgZ3JpZFNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciBpc1Bvc2l0aW9uaW5nID0gdGhpcy5faXNBY3RpdmU7XG4gICAgdmFyIGlzSnVzdFJlbGVhc2VkID0gcmVsZWFzZS5faXNBY3RpdmUgJiYgcmVsZWFzZS5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPT09IGZhbHNlO1xuICAgIHZhciBhbmltRHVyYXRpb24gPSBpc0p1c3RSZWxlYXNlZFxuICAgICAgPyBncmlkU2V0dGluZ3MuZHJhZ1JlbGVhc2VEdXJhdGlvblxuICAgICAgOiBncmlkU2V0dGluZ3MubGF5b3V0RHVyYXRpb247XG4gICAgdmFyIGFuaW1FYXNpbmcgPSBpc0p1c3RSZWxlYXNlZCA/IGdyaWRTZXR0aW5ncy5kcmFnUmVsZWFzZUVhc2luZyA6IGdyaWRTZXR0aW5ncy5sYXlvdXRFYXNpbmc7XG4gICAgdmFyIGFuaW1FbmFibGVkID0gIWluc3RhbnQgJiYgIXRoaXMuX3NraXBOZXh0QW5pbWF0aW9uICYmIGFuaW1EdXJhdGlvbiA+IDA7XG4gICAgdmFyIGlzQW5pbWF0aW5nO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgY3VycmVudGx5IHBvc2l0aW9uaW5nIHByb2Nlc3MgY3VycmVudCBsYXlvdXQgY2FsbGJhY2tcbiAgICAvLyBxdWV1ZSB3aXRoIGludGVycnVwdGVkIGZsYWcgb24uXG4gICAgaWYgKGlzUG9zaXRpb25pbmcpIHRoaXMuX3F1ZXVlLmZsdXNoKHRydWUsIGl0ZW0pO1xuXG4gICAgLy8gTWFyayByZWxlYXNlIHBvc2l0aW9uaW5nIGFzIHN0YXJ0ZWQuXG4gICAgaWYgKGlzSnVzdFJlbGVhc2VkKSByZWxlYXNlLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IHRydWU7XG5cbiAgICAvLyBQdXNoIHRoZSBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgaWYgKGlzRnVuY3Rpb24ob25GaW5pc2gpKSB0aGlzLl9xdWV1ZS5hZGQob25GaW5pc2gpO1xuXG4gICAgLy8gSWYgbm8gYW5pbWF0aW9ucyBhcmUgbmVlZGVkLCBlYXN5IHBlYXN5IVxuICAgIGlmICghYW5pbUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZU9mZnNldHMoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuICAgICAgaXNBbmltYXRpbmcgPSBpdGVtLl9hbmltYXRlLmlzQW5pbWF0aW5nKCk7XG4gICAgICB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICAhaXNBbmltYXRpbmcgJiYgc2V0U3R5bGVzKGVsZW1lbnQsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9za2lwTmV4dEFuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIFNldCBpdGVtIGFjdGl2ZSBhbmQgc3RvcmUgc29tZSBkYXRhIGZvciB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgYWJvdXQgdG8gYmVcbiAgICAvLyB0cmlnZ2VyZWQuXG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2FuaW1hdGVPcHRpb25zLmVhc2luZyA9IGFuaW1FYXNpbmc7XG4gICAgdGhpcy5fYW5pbWF0ZU9wdGlvbnMuZHVyYXRpb24gPSBhbmltRHVyYXRpb247XG4gICAgdGhpcy5faXNJbnRlcnJ1cHRlZCA9IGlzUG9zaXRpb25pbmc7XG5cbiAgICAvLyBTdGFydCB0aGUgaXRlbSdzIGxheW91dCBhbmltYXRpb24gaW4gdGhlIG5leHQgdGljay5cbiAgICBhZGRMYXlvdXRUaWNrKGl0ZW0uX2lkLCB0aGlzLl9zZXR1cEFuaW1hdGlvbiwgdGhpcy5fc3RhcnRBbmltYXRpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3AgaXRlbSdzIHBvc2l0aW9uIGFuaW1hdGlvbiBpZiBpdCBpcyBjdXJyZW50bHkgYW5pbWF0aW5nLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwcm9jZXNzQ2FsbGJhY2tRdWV1ZT1mYWxzZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRTdHlsZXNdXG4gICAqIEByZXR1cm5zIHtJdGVtTGF5b3V0fVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHByb2Nlc3NDYWxsYmFja1F1ZXVlLCB0YXJnZXRTdHlsZXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIXRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcblxuICAgIC8vIENhbmNlbCBhbmltYXRpb24gaW5pdC5cbiAgICBjYW5jZWxMYXlvdXRUaWNrKGl0ZW0uX2lkKTtcblxuICAgIC8vIFN0b3AgYW5pbWF0aW9uLlxuICAgIGl0ZW0uX2FuaW1hdGUuc3RvcCh0YXJnZXRTdHlsZXMpO1xuXG4gICAgLy8gUmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzLlxuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG5cbiAgICAvLyBSZXNldCBhY3RpdmUgc3RhdGUuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFByb2Nlc3MgY2FsbGJhY2sgcXVldWUgaWYgbmVlZGVkLlxuICAgIGlmIChwcm9jZXNzQ2FsbGJhY2tRdWV1ZSkgdGhpcy5fcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1MYXlvdXR9XG4gICAqL1xuICBJdGVtTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSwge30pO1xuICAgIHRoaXMuX3F1ZXVlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pdGVtID0gdGhpcy5fY3VycmVudFN0eWxlcyA9IHRoaXMuX3RhcmdldFN0eWxlcyA9IHRoaXMuX2FuaW1hdGVPcHRpb25zID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGN1cnJlbnQgbGF5b3V0IG9mZnNldCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVPZmZzZXRzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIG1pZ3JhdGUgPSBpdGVtLl9taWdyYXRlO1xuICAgIHZhciByZWxlYXNlID0gaXRlbS5fcmVsZWFzZTtcblxuICAgIHRoaXMuX29mZnNldExlZnQgPSByZWxlYXNlLl9pc0FjdGl2ZVxuICAgICAgPyByZWxlYXNlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiBtaWdyYXRlLl9pc0FjdGl2ZVxuICAgICAgPyBtaWdyYXRlLl9jb250YWluZXJEaWZmWFxuICAgICAgOiAwO1xuXG4gICAgdGhpcy5fb2Zmc2V0VG9wID0gcmVsZWFzZS5faXNBY3RpdmVcbiAgICAgID8gcmVsZWFzZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogbWlncmF0ZS5faXNBY3RpdmVcbiAgICAgID8gbWlncmF0ZS5fY29udGFpbmVyRGlmZllcbiAgICAgIDogMDtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgaXRlbSdzIGxheW91dCB0YXJnZXQgc3R5bGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl91cGRhdGVUYXJnZXRTdHlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLl90YXJnZXRTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgdGhpcy5faXRlbS5fbGVmdCArIHRoaXMuX29mZnNldExlZnQsXG4gICAgICB0aGlzLl9pdGVtLl90b3AgKyB0aGlzLl9vZmZzZXRUb3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggaXRlbSBsYXlvdXQgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgbWlncmF0ZSA9IGl0ZW0uX21pZ3JhdGU7XG4gICAgdmFyIHJlbGVhc2UgPSBpdGVtLl9yZWxlYXNlO1xuXG4gICAgLy8gTWFyayB0aGUgaXRlbSBhcyBpbmFjdGl2ZSBhbmQgcmVtb3ZlIHBvc2l0aW9uaW5nIGNsYXNzZXMuXG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgcmVtb3ZlQ2xhc3MoaXRlbS5fZWxlbWVudCwgaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzLml0ZW1Qb3NpdGlvbmluZ0NsYXNzKTtcbiAgICB9XG5cbiAgICAvLyBGaW5pc2ggdXAgcmVsZWFzZSBhbmQgbWlncmF0aW9uLlxuICAgIGlmIChyZWxlYXNlLl9pc0FjdGl2ZSkgcmVsZWFzZS5zdG9wKCk7XG4gICAgaWYgKG1pZ3JhdGUuX2lzQWN0aXZlKSBtaWdyYXRlLnN0b3AoKTtcblxuICAgIC8vIFByb2Nlc3MgdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJlcGFyZSBpdGVtIGZvciBsYXlvdXQgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbUxheW91dC5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1MYXlvdXQucHJvdG90eXBlLl9zZXR1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUodGhpcy5faXRlbS5fZWxlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudExlZnQgPSB0cmFuc2xhdGUueDtcbiAgICB0aGlzLl9jdXJyZW50VG9wID0gdHJhbnNsYXRlLnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxheW91dCBhbmltYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtTGF5b3V0LnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbUxheW91dC5wcm90b3R5cGUuX3N0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBzZXR0aW5ncyA9IGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncztcblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgb2Zmc2V0IGRhdGEgYW5kIHRhcmdldCBzdHlsZXMuXG4gICAgdGhpcy5fdXBkYXRlT2Zmc2V0cygpO1xuICAgIHRoaXMuX3VwZGF0ZVRhcmdldFN0eWxlcygpO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYWxyZWFkeSBpbiBjb3JyZWN0IHBvc2l0aW9uIGxldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKFxuICAgICAgaXRlbS5fbGVmdCA9PT0gdGhpcy5fY3VycmVudExlZnQgLSB0aGlzLl9vZmZzZXRMZWZ0ICYmXG4gICAgICBpdGVtLl90b3AgPT09IHRoaXMuX2N1cnJlbnRUb3AgLSB0aGlzLl9vZmZzZXRUb3BcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLl9pc0ludGVycnVwdGVkKSB0aGlzLnN0b3AoZmFsc2UsIHRoaXMuX3RhcmdldFN0eWxlcyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IGl0ZW0ncyBwb3NpdGlvbmluZyBjbGFzcyBpZiBuZWVkZWQuXG4gICAgaWYgKCF0aGlzLl9pc0ludGVycnVwdGVkKSB7XG4gICAgICBhZGRDbGFzcyhpdGVtLl9lbGVtZW50LCBzZXR0aW5ncy5pdGVtUG9zaXRpb25pbmdDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgc3R5bGVzIGZvciBhbmltYXRpb24uXG4gICAgdGhpcy5fY3VycmVudFN0eWxlcy50cmFuc2Zvcm0gPSBnZXRUcmFuc2xhdGVTdHJpbmcodGhpcy5fY3VycmVudExlZnQsIHRoaXMuX2N1cnJlbnRUb3ApO1xuXG4gICAgLy8gQW5pbWF0ZS5cbiAgICBpdGVtLl9hbmltYXRlLnN0YXJ0KHRoaXMuX2N1cnJlbnRTdHlsZXMsIHRoaXMuX3RhcmdldFN0eWxlcywgdGhpcy5fYW5pbWF0ZU9wdGlvbnMpO1xuICB9O1xuXG4gIHZhciB0ZW1wU3R5bGVzID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBtaWdyYXRlIHByb2Nlc3MgaGFuZGxlciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbU1pZ3JhdGUoaXRlbSkge1xuICAgIC8vIFByaXZhdGUgcHJvcHMuXG4gICAgdGhpcy5faXRlbSA9IGl0ZW07XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIG1pZ3JhdGUgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkfSB0YXJnZXRHcmlkXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2NvbnRhaW5lcl1cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24odGFyZ2V0R3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcikge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBpc1Zpc2libGUgPSBpdGVtLmlzVmlzaWJsZSgpO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldFNldHRpbmdzID0gdGFyZ2V0R3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSB0YXJnZXRHcmlkLl9lbGVtZW50O1xuICAgIHZhciB0YXJnZXRJdGVtcyA9IHRhcmdldEdyaWQuX2l0ZW1zO1xuICAgIHZhciBjdXJyZW50SW5kZXggPSBncmlkLl9pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBjb250YWluZXIgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7XG4gICAgdmFyIHRhcmdldEluZGV4O1xuICAgIHZhciB0YXJnZXRJdGVtO1xuICAgIHZhciBjdXJyZW50Q29udGFpbmVyO1xuICAgIHZhciBvZmZzZXREaWZmO1xuICAgIHZhciBjb250YWluZXJEaWZmO1xuICAgIHZhciB0cmFuc2xhdGU7XG4gICAgdmFyIHRyYW5zbGF0ZVg7XG4gICAgdmFyIHRyYW5zbGF0ZVk7XG5cbiAgICAvLyBHZXQgdGFyZ2V0IGluZGV4LlxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0YXJnZXRJbmRleCA9IG5vcm1hbGl6ZUFycmF5SW5kZXgodGFyZ2V0SXRlbXMsIHBvc2l0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0SXRlbSA9IHRhcmdldEdyaWQuX2dldEl0ZW0ocG9zaXRpb24pO1xuICAgICAgLyoqIEB0b2RvIENvbnNpZGVyIHRocm93aW5nIGFuIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBzaWxlbnRseSBmYWlsaW5nLiAqL1xuICAgICAgaWYgKCF0YXJnZXRJdGVtKSByZXR1cm4gdGhpcztcbiAgICAgIHRhcmdldEluZGV4ID0gdGFyZ2V0SXRlbXMuaW5kZXhPZih0YXJnZXRJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHZhbHVlcyBpZiBuZWVkZWQuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpIHx8IHRoaXMuX2lzQWN0aXZlIHx8IGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZS54O1xuICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgcG9zaXRpb25pbmcuXG4gICAgaWYgKGl0ZW0uaXNQb3NpdGlvbmluZygpKSB7XG4gICAgICBpdGVtLl9sYXlvdXQuc3RvcCh0cnVlLCB7IHRyYW5zZm9ybTogZ2V0VHJhbnNsYXRlU3RyaW5nKHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVkpIH0pO1xuICAgIH1cblxuICAgIC8vIEFib3J0IGN1cnJlbnQgbWlncmF0aW9uLlxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSB0aGlzLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gdGhpcy5fY29udGFpbmVyRGlmZlk7XG4gICAgICB0aGlzLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBBYm9ydCBjdXJyZW50IHJlbGVhc2UuXG4gICAgaWYgKGl0ZW0uaXNSZWxlYXNpbmcoKSkge1xuICAgICAgdHJhbnNsYXRlWCAtPSBpdGVtLl9yZWxlYXNlLl9jb250YWluZXJEaWZmWDtcbiAgICAgIHRyYW5zbGF0ZVkgLT0gaXRlbS5fcmVsZWFzZS5fY29udGFpbmVyRGlmZlk7XG4gICAgICBpdGVtLl9yZWxlYXNlLnN0b3AodHJ1ZSwgeyB0cmFuc2Zvcm06IGdldFRyYW5zbGF0ZVN0cmluZyh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB9KTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIGN1cnJlbnQgdmlzaWJpbGl0eSBhbmltYXRpb25zLlxuICAgIGl0ZW0uX3Zpc2liaWxpdHkuX3N0b3BBbmltYXRpb24oKTtcblxuICAgIC8vIERlc3Ryb3kgY3VycmVudCBkcmFnLlxuICAgIGlmIChpdGVtLl9kcmFnKSBpdGVtLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFByb2Nlc3MgY3VycmVudCB2aXNpYmlsaXR5IGFuaW1hdGlvbiBxdWV1ZS5cbiAgICBpdGVtLl92aXNpYmlsaXR5Ll9xdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKTtcblxuICAgIC8vIEVtaXQgYmVmb3JlU2VuZCBldmVudC5cbiAgICBpZiAoZ3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50QmVmb3JlU2VuZCkpIHtcbiAgICAgIGdyaWQuX2VtaXQoZXZlbnRCZWZvcmVTZW5kLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBiZWZvcmVSZWNlaXZlIGV2ZW50LlxuICAgIGlmICh0YXJnZXRHcmlkLl9oYXNMaXN0ZW5lcnMoZXZlbnRCZWZvcmVSZWNlaXZlKSkge1xuICAgICAgdGFyZ2V0R3JpZC5fZW1pdChldmVudEJlZm9yZVJlY2VpdmUsIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZnJvbUdyaWQ6IGdyaWQsXG4gICAgICAgIGZyb21JbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICB0b0dyaWQ6IHRhcmdldEdyaWQsXG4gICAgICAgIHRvSW5kZXg6IHRhcmdldEluZGV4XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgY3VycmVudCBjbGFzc25hbWVzLlxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLml0ZW1DbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbUhpZGRlbkNsYXNzKTtcblxuICAgIC8vIEFkZCBuZXcgY2xhc3NuYW1lcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCB0YXJnZXRTZXR0aW5ncy5pdGVtQ2xhc3MpO1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzVmlzaWJsZSA/IHRhcmdldFNldHRpbmdzLml0ZW1WaXNpYmxlQ2xhc3MgOiB0YXJnZXRTZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gTW92ZSBpdGVtIGluc3RhbmNlIGZyb20gY3VycmVudCBncmlkIHRvIHRhcmdldCBncmlkLlxuICAgIGdyaWQuX2l0ZW1zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIGFycmF5SW5zZXJ0KHRhcmdldEl0ZW1zLCBpdGVtLCB0YXJnZXRJbmRleCk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGdyaWQgaWQgcmVmZXJlbmNlLlxuICAgIGl0ZW0uX2dyaWRJZCA9IHRhcmdldEdyaWQuX2lkO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGN1cnJlbnRDb250YWluZXIgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAvLyBNb3ZlIHRoZSBpdGVtIGluc2lkZSB0aGUgdGFyZ2V0IGNvbnRhaW5lciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZVxuICAgIC8vIGN1cnJlbnQgY29udGFpbmVyLlxuICAgIGlmICh0YXJnZXRDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpIHtcbiAgICAgIHRhcmdldENvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIG9mZnNldERpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgY3VycmVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICBpZiAoIXRyYW5zbGF0ZSkge1xuICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgIHRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueDtcbiAgICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZS55O1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgdHJhbnNsYXRlWCArIG9mZnNldERpZmYubGVmdCxcbiAgICAgICAgdHJhbnNsYXRlWSArIG9mZnNldERpZmYudG9wXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjaGlsZCBlbGVtZW50J3Mgc3R5bGVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAgICBpdGVtLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgc2V0U3R5bGVzKGl0ZW0uX2NoaWxkLCBpc1Zpc2libGUgPyB0YXJnZXRTZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogdGFyZ2V0U2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcblxuICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHN0eWxlLlxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IGlzVmlzaWJsZSA/ICdibG9jaycgOiAnaGlkZGVuJztcblxuICAgIC8vIEdldCBvZmZzZXQgZGlmZiBmb3IgdGhlIG1pZ3JhdGlvbiBkYXRhLlxuICAgIGNvbnRhaW5lckRpZmYgPSBnZXRPZmZzZXREaWZmKHRhcmdldENvbnRhaW5lciwgdGFyZ2V0RWxlbWVudCwgdHJ1ZSk7XG5cbiAgICAvLyBVcGRhdGUgaXRlbSdzIGNhY2hlZCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgaXRlbS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICBpdGVtLl9yZWZyZXNoU29ydERhdGEoKTtcblxuICAgIC8vIENyZWF0ZSBuZXcgZHJhZyBoYW5kbGVyLlxuICAgIGl0ZW0uX2RyYWcgPSB0YXJnZXRTZXR0aW5ncy5kcmFnRW5hYmxlZCA/IG5ldyBJdGVtRHJhZyhpdGVtKSA6IG51bGw7XG5cbiAgICAvLyBTZXR1cCBtaWdyYXRpb24gZGF0YS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5fY29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gY29udGFpbmVyRGlmZi5sZWZ0O1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gY29udGFpbmVyRGlmZi50b3A7XG5cbiAgICAvLyBFbWl0IHNlbmQgZXZlbnQuXG4gICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhldmVudFNlbmQpKSB7XG4gICAgICBncmlkLl9lbWl0KGV2ZW50U2VuZCwge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBmcm9tR3JpZDogZ3JpZCxcbiAgICAgICAgZnJvbUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgIHRvR3JpZDogdGFyZ2V0R3JpZCxcbiAgICAgICAgdG9JbmRleDogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgcmVjZWl2ZSBldmVudC5cbiAgICBpZiAodGFyZ2V0R3JpZC5faGFzTGlzdGVuZXJzKGV2ZW50UmVjZWl2ZSkpIHtcbiAgICAgIHRhcmdldEdyaWQuX2VtaXQoZXZlbnRSZWNlaXZlLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGZyb21HcmlkOiBncmlkLFxuICAgICAgICBmcm9tSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgdG9HcmlkOiB0YXJnZXRHcmlkLFxuICAgICAgICB0b0luZGV4OiB0YXJnZXRJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgbWlncmF0ZSBwcm9jZXNzIG9mIGFuIGl0ZW0uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGFib3J0IGFuXG4gICAqIG9uZ29pbmcgbWlncmF0ZSBwcm9jZXNzIChhbmltYXRpb24pIG9yIGZpbmlzaCB0aGUgbWlncmF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbYWJvcnQ9ZmFsc2VdXG4gICAqICAtIFNob3VsZCB0aGUgbWlncmF0aW9uIGJlIGFib3J0ZWQ/XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBncmlkRWxlbWVudCA9IGdyaWQuX2VsZW1lbnQ7XG4gICAgdmFyIHRyYW5zbGF0ZTtcblxuICAgIGlmICh0aGlzLl9jb250YWluZXIgIT09IGdyaWRFbGVtZW50KSB7XG4gICAgICBpZiAoIWN1cnJlbnRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgdHJhbnNsYXRlID0gZ2V0VHJhbnNsYXRlKGVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKFxuICAgICAgICAgICAgdHJhbnNsYXRlLnggLSB0aGlzLl9jb250YWluZXJEaWZmWCxcbiAgICAgICAgICAgIHRyYW5zbGF0ZS55IC0gdGhpcy5fY29udGFpbmVyRGlmZllcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXM7XG4gICAgICB9XG4gICAgICBncmlkRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlggPSAwO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZZID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtTWlncmF0ZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1NaWdyYXRlfVxuICAgKi9cbiAgSXRlbU1pZ3JhdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RvcCh0cnVlKTtcbiAgICB0aGlzLl9pdGVtID0gbnVsbDtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIHRlbXBTdHlsZXMkMSA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBwcm9jZXNzIGhhbmRsZXIgY29uc3RydWN0b3IuIEFsdGhvdWdoIHRoaXMgbWlnaHQgc2VlbSBhcyBwcm9wZXJcbiAgICogZml0IGZvciB0aGUgZHJhZyBwcm9jZXNzIHRoaXMgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIGludG8gaXQncyBvd24gbG9naWNcbiAgICogYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBhIHNjZW5hcmlvIHdoZXJlIGRyYWcgaXMgZGlzYWJsZWQsIGJ1dCB0aGUgcmVsZWFzZVxuICAgKiBwcm9jZXNzIHN0aWxsIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIChkcmFnZ2luZyBmcm9tIGEgZ3JpZCB0byBhbm90aGVyKS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVJlbGVhc2UoaXRlbSkge1xuICAgIHRoaXMuX2l0ZW0gPSBpdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1Bvc2l0aW9uaW5nU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRhaW5lckRpZmZYID0gMDtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtUmVsZWFzZS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2lzQWN0aXZlKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuXG4gICAgLy8gRmxhZyByZWxlYXNlIGFzIGFjdGl2ZS5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAvLyBBZGQgcmVsZWFzZSBjbGFzcyBuYW1lIHRvIHRoZSByZWxlYXNlZCBlbGVtZW50LlxuICAgIGFkZENsYXNzKGl0ZW0uX2VsZW1lbnQsIGdyaWQuX3NldHRpbmdzLml0ZW1SZWxlYXNpbmdDbGFzcyk7XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlU3RhcnQgZXZlbnQuXG4gICAgZ3JpZC5fZW1pdChldmVudERyYWdSZWxlYXNlU3RhcnQsIGl0ZW0pO1xuXG4gICAgLy8gUG9zaXRpb24gdGhlIHJlbGVhc2VkIGl0ZW0uXG4gICAgaXRlbS5fbGF5b3V0LnN0YXJ0KGZhbHNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmQgdGhlIHJlbGVhc2UgcHJvY2VzcyBvZiBhbiBpdGVtLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhYm9ydCBhblxuICAgKiBvbmdvaW5nIHJlbGVhc2UgcHJvY2VzcyAoYW5pbWF0aW9uKSBvciBmaW5pc2ggdGhlIHJlbGVhc2UgcHJvY2Vzcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2Fib3J0PWZhbHNlXVxuICAgKiAgLSBTaG91bGQgdGhlIHJlbGVhc2UgYmUgYWJvcnRlZD8gV2hlbiB0cnVlLCB0aGUgcmVsZWFzZSBlbmQgZXZlbnQgd29uJ3QgYmVcbiAgICogICAgZW1pdHRlZC4gU2V0IHRvIHRydWUgb25seSB3aGVuIHlvdSBuZWVkIHRvIGFib3J0IHRoZSByZWxlYXNlIHByb2Nlc3NcbiAgICogICAgd2hpbGUgdGhlIGl0ZW0gaXMgYW5pbWF0aW5nIHRvIGl0J3MgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY3VycmVudFN0eWxlc11cbiAgICogIC0gT3B0aW9uYWwgY3VycmVudCB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIHN0eWxlcy5cbiAgICogQHJldHVybnMge0l0ZW1SZWxlYXNlfVxuICAgKi9cbiAgSXRlbVJlbGVhc2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihhYm9ydCwgY3VycmVudFN0eWxlcykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhdGhpcy5faXNBY3RpdmUpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgZ3JpZCA9IGl0ZW0uZ2V0R3JpZCgpO1xuICAgIHZhciBjb250YWluZXIgPSBncmlkLl9lbGVtZW50O1xuICAgIHZhciB0cmFuc2xhdGU7XG5cbiAgICAvLyBSZXNldCBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzIG5hbWUgZnJvbSB0aGUgZWxlbWVudC5cbiAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgLy8gSWYgdGhlIHJlbGVhc2VkIGVsZW1lbnQgaXMgb3V0c2lkZSB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50IHB1dCBpdFxuICAgIC8vIGJhY2sgdGhlcmUgYW5kIGFkanVzdCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cbiAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgIGlmICghY3VycmVudFN0eWxlcykge1xuICAgICAgICBpZiAoYWJvcnQpIHtcbiAgICAgICAgICB0cmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUoZWxlbWVudCk7XG4gICAgICAgICAgdGVtcFN0eWxlcyQxLnRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVN0cmluZyhcbiAgICAgICAgICAgIHRyYW5zbGF0ZS54IC0gdGhpcy5fY29udGFpbmVyRGlmZlgsXG4gICAgICAgICAgICB0cmFuc2xhdGUueSAtIHRoaXMuX2NvbnRhaW5lckRpZmZZXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wU3R5bGVzJDEudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKGl0ZW0uX2xlZnQsIGl0ZW0uX3RvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFN0eWxlcyA9IHRlbXBTdHlsZXMkMTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHNldFN0eWxlcyhlbGVtZW50LCBjdXJyZW50U3R5bGVzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGRyYWdSZWxlYXNlRW5kIGV2ZW50LlxuICAgIGlmICghYWJvcnQpIGdyaWQuX2VtaXQoZXZlbnREcmFnUmVsZWFzZUVuZCwgaXRlbSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtUmVsZWFzZX1cbiAgICovXG4gIEl0ZW1SZWxlYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlc2V0IHB1YmxpYyBkYXRhIGFuZCByZW1vdmUgcmVsZWFzaW5nIGNsYXNzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVJlbGVhc2UucHJvdG90eXBlXG4gICAqL1xuICBJdGVtUmVsZWFzZS5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNQb3NpdGlvbmluZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jb250YWluZXJEaWZmWCA9IDA7XG4gICAgdGhpcy5fY29udGFpbmVyRGlmZlkgPSAwO1xuICAgIHJlbW92ZUNsYXNzKGl0ZW0uX2VsZW1lbnQsIGl0ZW0uZ2V0R3JpZCgpLl9zZXR0aW5ncy5pdGVtUmVsZWFzaW5nQ2xhc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIHN0eWxlcyBkZWZpbml0aW9uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVzXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB7fTtcbiAgICBmb3IgKHZhciBwcm9wIGluIHN0eWxlcykge1xuICAgICAgY3VycmVudFtwcm9wXSA9IGdldFN0eWxlKGVsZW1lbnQsIGdldFN0eWxlTmFtZShwcm9wKSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2liaWxpdHkgbWFuYWdlciBmb3IgSXRlbSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgZnVuY3Rpb24gSXRlbVZpc2liaWxpdHkoaXRlbSkge1xuICAgIHZhciBpc0FjdGl2ZSA9IGl0ZW0uX2lzQWN0aXZlO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbS5fZWxlbWVudDtcbiAgICB2YXIgc2V0dGluZ3MgPSBpdGVtLmdldEdyaWQoKS5fc2V0dGluZ3M7XG5cbiAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHVwIHZpc2liaWxpdHkgc3RhdGVzLlxuICAgIHRoaXMuX2lzSGlkZGVuID0gIWlzQWN0aXZlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNTaG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBDYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gICAgLy8gQmluZCBzaG93L2hpZGUgZmluaXNoZXJzLlxuICAgIHRoaXMuX2ZpbmlzaFNob3cgPSB0aGlzLl9maW5pc2hTaG93LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZmluaXNoSGlkZSA9IHRoaXMuX2ZpbmlzaEhpZGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEZvcmNlIGl0ZW0gdG8gYmUgZWl0aGVyIHZpc2libGUgb3IgaGlkZGVuIG9uIGluaXQuXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gaXNBY3RpdmUgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgLy8gU2V0IHZpc2libGUvaGlkZGVuIGNsYXNzLlxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGlzQWN0aXZlID8gc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyA6IHNldHRpbmdzLml0ZW1IaWRkZW5DbGFzcyk7XG5cbiAgICAvLyBTZXQgaW5pdGlhbCBzdHlsZXMgZm9yIHRoZSBjaGlsZCBlbGVtZW50LlxuICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgaXNBY3RpdmUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTaG93IGl0ZW0uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluc3RhbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRmluaXNoXVxuICAgKiBAcmV0dXJucyB7SXRlbVZpc2liaWxpdHl9XG4gICAqL1xuICBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIGNhbGxiYWNrID0gaXNGdW5jdGlvbihvbkZpbmlzaCkgPyBvbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIElmIGl0ZW0gaXMgdmlzaWJsZSBjYWxsIHRoZSBjYWxsYmFjayBhbmQgYmUgZG9uZSB3aXRoIGl0LlxuICAgIGlmICghdGhpcy5faXNTaG93aW5nICYmICF0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBzaG93aW5nIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNob3duIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzU2hvd2luZyAmJiAhaW5zdGFudCkge1xuICAgICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBpdGVtIGlzIGhpZGluZyBvciBoaWRkZW4gcHJvY2VzcyB0aGUgY3VycmVudCB2aXNpYmlsaXR5IGNhbGxiYWNrXG4gICAgLy8gcXVldWUgd2l0aCB0aGUgaW50ZXJydXB0ZWQgZmxhZyBhY3RpdmUsIHVwZGF0ZSBjbGFzc2VzIGFuZCBzZXQgZGlzcGxheVxuICAgIC8vIHRvIGJsb2NrIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoIXRoaXMuX2lzU2hvd2luZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgICBpZiAoIXRoaXMuX2lzSGlkaW5nKSBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlLlxuICAgIGNhbGxiYWNrICYmIHF1ZXVlLmFkZChjYWxsYmFjayk7XG5cbiAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBzdGF0ZXMuXG4gICAgaXRlbS5faXNBY3RpdmUgPSB0aGlzLl9pc1Nob3dpbmcgPSB0cnVlO1xuICAgIHRoaXMuX2lzSGlkaW5nID0gdGhpcy5faXNIaWRkZW4gPSBmYWxzZTtcblxuICAgIC8vIEZpbmFsbHkgbGV0J3Mgc3RhcnQgc2hvdyBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RhcnRBbmltYXRpb24odHJ1ZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoU2hvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSBpdGVtLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBpbnN0YW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICogQHJldHVybnMge0l0ZW1WaXNpYmlsaXR5fVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbihpbnN0YW50LCBvbkZpbmlzaCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtLl9lbGVtZW50O1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24ob25GaW5pc2gpID8gb25GaW5pc2ggOiBudWxsO1xuICAgIHZhciBncmlkID0gaXRlbS5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBJZiBpdGVtIGlzIGFscmVhZHkgaGlkZGVuIGNhbGwgdGhlIGNhbGxiYWNrIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZyAmJiB0aGlzLl9pc0hpZGRlbikge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UsIGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgaXRlbSBpcyBoaWRpbmcgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgaGlkZGVuIGluc3RhbnRseSwgbGV0J3MganVzdFxuICAgIC8vIHB1c2ggY2FsbGJhY2sgdG8gdGhlIGNhbGxiYWNrIHF1ZXVlIGFuZCBiZSBkb25lIHdpdGggaXQuXG4gICAgaWYgKHRoaXMuX2lzSGlkaW5nICYmICFpbnN0YW50KSB7XG4gICAgICBjYWxsYmFjayAmJiBxdWV1ZS5hZGQoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgc2hvd2luZyBvciB2aXNpYmxlIHByb2Nlc3MgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBjYWxsYmFja1xuICAgIC8vIHF1ZXVlIHdpdGggdGhlIGludGVycnVwdGVkIGZsYWcgYWN0aXZlLCB1cGRhdGUgY2xhc3NlcyBhbmQgc2V0IGRpc3BsYXlcbiAgICAvLyB0byBibG9jayBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9pc0hpZGluZykge1xuICAgICAgcXVldWUuZmx1c2godHJ1ZSwgaXRlbSk7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuaXRlbVZpc2libGVDbGFzcyk7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYWxsYmFjayB0byB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgY2FsbGJhY2sgJiYgcXVldWUuYWRkKGNhbGxiYWNrKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IHN0YXRlcy5cbiAgICB0aGlzLl9pc0hpZGRlbiA9IHRoaXMuX2lzSGlkaW5nID0gdHJ1ZTtcbiAgICBpdGVtLl9pc0FjdGl2ZSA9IHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuXG4gICAgLy8gRmluYWxseSBsZXQncyBzdGFydCBoaWRlIGFuaW1hdGlvbi5cbiAgICB0aGlzLl9zdGFydEFuaW1hdGlvbihmYWxzZSwgaW5zdGFudCwgdGhpcy5fZmluaXNoSGlkZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UgYW5kIHN0b3AgY3VycmVudCBhbmltYXRpb24gaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtJdGVtVmlzaWJpbGl0eX1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBpdGVtID0gdGhpcy5faXRlbTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0uX2VsZW1lbnQ7XG4gICAgdmFyIGdyaWQgPSBpdGVtLmdldEdyaWQoKTtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICB2YXIgc2V0dGluZ3MgPSBncmlkLl9zZXR0aW5ncztcblxuICAgIC8vIFN0b3AgdmlzaWJpbGl0eSBhbmltYXRpb24uXG4gICAgdGhpcy5fc3RvcEFuaW1hdGlvbih7fSk7XG5cbiAgICAvLyBGaXJlIGFsbCB1bmNvbXBsZXRlZCBjYWxsYmFja3Mgd2l0aCBpbnRlcnJ1cHRlZCBmbGFnIGFuZCBkZXN0cm95IHRoZSBxdWV1ZS5cbiAgICBxdWV1ZS5mbHVzaCh0cnVlLCBpdGVtKS5kZXN0cm95KCk7XG5cbiAgICAvLyBSZW1vdmUgdmlzaWJsZS9oaWRkZW4gY2xhc3Nlcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtVmlzaWJsZUNsYXNzKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtSGlkZGVuQ2xhc3MpO1xuXG4gICAgLy8gUmVzZXQgc3RhdGUuXG4gICAgdGhpcy5faXRlbSA9IG51bGw7XG4gICAgdGhpcy5faXNIaWRpbmcgPSB0aGlzLl9pc1Nob3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRoaXMuX2lzSGlkZGVuID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXJ0IHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luc3RhbnRdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkZpbmlzaF1cbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbih0b1Zpc2libGUsIGluc3RhbnQsIG9uRmluaXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdmFyIHNldHRpbmdzID0gaXRlbS5nZXRHcmlkKCkuX3NldHRpbmdzO1xuICAgIHZhciB0YXJnZXRTdHlsZXMgPSB0b1Zpc2libGUgPyBzZXR0aW5ncy52aXNpYmxlU3R5bGVzIDogc2V0dGluZ3MuaGlkZGVuU3R5bGVzO1xuICAgIHZhciBkdXJhdGlvbiA9IHBhcnNlSW50KHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dEdXJhdGlvbiA6IHNldHRpbmdzLmhpZGVEdXJhdGlvbikgfHwgMDtcbiAgICB2YXIgZWFzaW5nID0gKHRvVmlzaWJsZSA/IHNldHRpbmdzLnNob3dFYXNpbmcgOiBzZXR0aW5ncy5oaWRlRWFzaW5nKSB8fCAnZWFzZSc7XG4gICAgdmFyIGlzSW5zdGFudCA9IGluc3RhbnQgfHwgZHVyYXRpb24gPD0gMDtcbiAgICB2YXIgY3VycmVudFN0eWxlcztcblxuICAgIC8vIE5vIHRhcmdldCBzdHlsZXM/IExldCdzIHF1aXQgZWFybHkuXG4gICAgaWYgKCF0YXJnZXRTdHlsZXMpIHtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHF1ZXVlZCB2aXNpYmlsaXR5IHRpY2suXG4gICAgY2FuY2VsVmlzaWJpbGl0eVRpY2soaXRlbS5faWQpO1xuXG4gICAgLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgc3R5bGVzIGluc3RhbnRseSB3aXRob3V0IGFuaW1hdGlvbi5cbiAgICBpZiAoaXNJbnN0YW50KSB7XG4gICAgICBpZiAoaXRlbS5fYW5pbWF0ZUNoaWxkLmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgaXRlbS5fYW5pbWF0ZUNoaWxkLnN0b3AodGFyZ2V0U3R5bGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFN0eWxlcyhpdGVtLl9jaGlsZCwgdGFyZ2V0U3R5bGVzKTtcbiAgICAgIH1cbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbiBpbiB0aGUgbmV4dCB0aWNrICh0byBhdm9pZCBsYXlvdXQgdGhyYXNoaW5nKS5cbiAgICBhZGRWaXNpYmlsaXR5VGljayhcbiAgICAgIGl0ZW0uX2lkLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIGN1cnJlbnRTdHlsZXMgPSBnZXRDdXJyZW50U3R5bGVzKGl0ZW0uX2NoaWxkLCB0YXJnZXRTdHlsZXMpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RhcnQoY3VycmVudFN0eWxlcywgdGFyZ2V0U3R5bGVzLCB7XG4gICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogZWFzaW5nLFxuICAgICAgICAgIG9uRmluaXNoOiBvbkZpbmlzaFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIHZpc2liaWxpdHkgYW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0U3R5bGVzXVxuICAgKi9cbiAgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlLl9zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24odGFyZ2V0U3R5bGVzKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLl9pdGVtO1xuICAgIGNhbmNlbFZpc2liaWxpdHlUaWNrKGl0ZW0uX2lkKTtcbiAgICBpdGVtLl9hbmltYXRlQ2hpbGQuc3RvcCh0YXJnZXRTdHlsZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5pc2ggc2hvdyBwcm9jZWR1cmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtVmlzaWJpbGl0eS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoU2hvdyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0hpZGRlbikgcmV0dXJuO1xuICAgIHRoaXMuX2lzU2hvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCB0aGlzLl9pdGVtKTtcbiAgfTtcblxuICAvKipcbiAgICogRmluaXNoIGhpZGUgcHJvY2VkdXJlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbVZpc2liaWxpdHkucHJvdG90eXBlXG4gICAqL1xuICB2YXIgZmluaXNoU3R5bGVzID0ge307XG4gIEl0ZW1WaXNpYmlsaXR5LnByb3RvdHlwZS5fZmluaXNoSGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5faXNIaWRkZW4pIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IHRoaXMuX2l0ZW07XG4gICAgdGhpcy5faXNIaWRpbmcgPSBmYWxzZTtcbiAgICBmaW5pc2hTdHlsZXMudHJhbnNmb3JtID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuICAgIGl0ZW0uX2xheW91dC5zdG9wKHRydWUsIGZpbmlzaFN0eWxlcyk7XG4gICAgaXRlbS5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKGZhbHNlLCBpdGVtKTtcbiAgfTtcblxuICB2YXIgaWQgPSAwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWVyaWMgaWQgKGluY3JlbWVudHMgYSBiYXNlIHZhbHVlIG9uIGV2ZXJ5IGNhbGwpLlxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVWlkKCkge1xuICAgIHJldHVybiArK2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSXRlbSBpbnN0YW5jZSBmb3IgYSBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtHcmlkfSBncmlkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbaXNBY3RpdmVdXG4gICAqL1xuICBmdW5jdGlvbiBJdGVtKGdyaWQsIGVsZW1lbnQsIGlzQWN0aXZlKSB7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2UgaWQuXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcblxuICAgIC8vIFJlZmVyZW5jZSB0byBjb25uZWN0ZWQgR3JpZCBpbnN0YW5jZSdzIGlkLlxuICAgIHRoaXMuX2dyaWRJZCA9IGdyaWQuX2lkO1xuXG4gICAgLy8gRGVzdHJveWVkIGZsYWcuXG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNldCB1cCBpbml0aWFsIHBvc2l0aW9ucy5cbiAgICB0aGlzLl9sZWZ0ID0gMDtcbiAgICB0aGlzLl90b3AgPSAwO1xuXG4gICAgLy8gVGhlIGVsZW1lbnRzLlxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2NoaWxkID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuICAgIC8vIElmIHRoZSBwcm92aWRlZCBpdGVtIGVsZW1lbnQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBncmlkIGNvbnRhaW5lclxuICAgIC8vIGVsZW1lbnQsIGFwcGVuZCBpdCB0byB0aGUgZ3JpZCBjb250YWluZXIuXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gZ3JpZC5fZWxlbWVudCkge1xuICAgICAgZ3JpZC5fZWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgaXRlbSBjbGFzcy5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gSWYgaXNBY3RpdmUgaXMgbm90IGRlZmluZWQsIGxldCdzIHRyeSB0byBhdXRvLWRldGVjdCBpdC5cbiAgICBpZiAodHlwZW9mIGlzQWN0aXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIGlzQWN0aXZlID0gZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBhY3RpdmUgc3RhdGUgKGRlZmluZXMgaWYgdGhlIGl0ZW0gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBsYXlvdXRcbiAgICAvLyBvciBub3QpLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gaXNBY3RpdmU7XG5cbiAgICAvLyBTZXQgZWxlbWVudCdzIGluaXRpYWwgcG9zaXRpb24gc3R5bGVzLlxuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICBlbGVtZW50LnN0eWxlW3RyYW5zZm9ybVByb3BdID0gZ2V0VHJhbnNsYXRlU3RyaW5nKDAsIDApO1xuXG4gICAgLy8gSW5pdGlhdGUgaXRlbSdzIGFuaW1hdGlvbiBjb250cm9sbGVycy5cbiAgICB0aGlzLl9hbmltYXRlID0gbmV3IEl0ZW1BbmltYXRlKGVsZW1lbnQpO1xuICAgIHRoaXMuX2FuaW1hdGVDaGlsZCA9IG5ldyBJdGVtQW5pbWF0ZSh0aGlzLl9jaGlsZCk7XG5cbiAgICAvLyBTZXR1cCB2aXNpYmlsaXR5IGhhbmRsZXIuXG4gICAgdGhpcy5fdmlzaWJpbGl0eSA9IG5ldyBJdGVtVmlzaWJpbGl0eSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBsYXlvdXQgaGFuZGxlci5cbiAgICB0aGlzLl9sYXlvdXQgPSBuZXcgSXRlbUxheW91dCh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBtaWdyYXRpb24gaGFuZGxlciBkYXRhLlxuICAgIHRoaXMuX21pZ3JhdGUgPSBuZXcgSXRlbU1pZ3JhdGUodGhpcyk7XG5cbiAgICAvLyBTZXQgdXAgcmVsZWFzZSBoYW5kbGVyLiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBpcyBmdWxseSBsaW5rZWQgdG8gZHJhZ2dpbmdcbiAgICAvLyB0aGlzIHN0aWxsIG5lZWRzIHRvIGJlIGFsd2F5cyBpbnN0YW50aWF0ZWQgdG8gaGFuZGxlIG1pZ3JhdGlvbiBzY2VuYXJpb3NcbiAgICAvLyBjb3JyZWN0bHkuXG4gICAgdGhpcy5fcmVsZWFzZSA9IG5ldyBJdGVtUmVsZWFzZSh0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIHBsYWNlaG9sZGVyIGhhbmRsZXIuIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGlzIGZ1bGx5IGxpbmtlZCB0b1xuICAgIC8vIGRyYWdnaW5nIHRoaXMgc3RpbGwgbmVlZHMgdG8gYmUgYWx3YXlzIGluc3RhbnRpYXRlZCB0byBoYW5kbGUgbWlncmF0aW9uXG4gICAgLy8gc2NlbmFyaW9zIGNvcnJlY3RseS5cbiAgICB0aGlzLl9kcmFnUGxhY2Vob2xkZXIgPSBuZXcgSXRlbURyYWdQbGFjZWhvbGRlcih0aGlzKTtcblxuICAgIC8vIFNldCB1cCBkcmFnIGhhbmRsZXIuXG4gICAgdGhpcy5fZHJhZyA9IHNldHRpbmdzLmRyYWdFbmFibGVkID8gbmV3IEl0ZW1EcmFnKHRoaXMpIDogbnVsbDtcblxuICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzb3J0IGRhdGEuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGdyaWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZ3JpZEluc3RhbmNlc1t0aGlzLl9ncmlkSWRdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgd2lkdGguXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgaGVpZ2h0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGluc3RhbmNlIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogICAtIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgbGVmdCwgcmlnaHQsIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXNcbiAgICogICAgIHdoaWNoIGluZGljYXRlIHRoZSBpdGVtIGVsZW1lbnQncyBjYWNoZWQgbWFyZ2lucy5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldE1hcmdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiB0aGlzLl9tYXJnaW5MZWZ0LFxuICAgICAgcmlnaHQ6IHRoaXMuX21hcmdpblJpZ2h0LFxuICAgICAgdG9wOiB0aGlzLl9tYXJnaW5Ub3AsXG4gICAgICBib3R0b206IHRoaXMuX21hcmdpbkJvdHRvbVxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSBlbGVtZW50J3MgY2FjaGVkIHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKiAgIC0gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyBsZWZ0IGFuZCB0b3AgcHJvcGVydGllcyB3aGljaCBpbmRpY2F0ZSB0aGVcbiAgICogICAgIGl0ZW0gZWxlbWVudCdzIGNhY2hlZCBwb3NpdGlvbiBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IHRoaXMuX2xlZnQsXG4gICAgICB0b3A6IHRoaXMuX3RvcFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGFjdGl2ZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Zpc2libGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl92aXNpYmlsaXR5ICYmICF0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGRlbjtcbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGl0ZW0gYmVpbmcgYW5pbWF0ZWQgdG8gdmlzaWJsZT9cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBJdGVtLnByb3RvdHlwZS5pc1Nob3dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc1Nob3dpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBhbmltYXRlZCB0byBoaWRkZW4/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNIaWRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fdmlzaWJpbGl0eSAmJiB0aGlzLl92aXNpYmlsaXR5Ll9pc0hpZGluZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIHBvc2l0aW9uaW5nP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUG9zaXRpb25pbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fbGF5b3V0ICYmIHRoaXMuX2xheW91dC5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBiZWluZyBkcmFnZ2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzRHJhZ2dpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISEodGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLl9pc0FjdGl2ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBpdGVtIGJlaW5nIHJlbGVhc2VkP1xuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLmlzUmVsZWFzaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3JlbGVhc2UgJiYgdGhpcy5fcmVsZWFzZS5faXNBY3RpdmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgaXRlbSBkZXN0cm95ZWQ/XG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEl0ZW0ucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuaXNEZXN0cm95ZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZXN0cm95ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvdG90eXBlIG1ldGhvZHNcbiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKi9cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGUgaXRlbSdzIGRpbWVuc2lvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBJdGVtLnByb3RvdHlwZVxuICAgKi9cbiAgSXRlbS5wcm90b3R5cGUuX3JlZnJlc2hEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX3Zpc2liaWxpdHkuX2lzSGlkZGVuKSByZXR1cm47XG5cbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgdmFyIGRyYWdQbGFjZWhvbGRlciA9IHRoaXMuX2RyYWdQbGFjZWhvbGRlcjtcbiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2lucyAoaWdub3JlIG5lZ2F0aXZlIG1hcmdpbnMpLlxuICAgIHRoaXMuX21hcmdpbkxlZnQgPSBNYXRoLm1heCgwLCBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ21hcmdpbi1sZWZ0JykpO1xuICAgIHRoaXMuX21hcmdpblJpZ2h0ID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tcmlnaHQnKSk7XG4gICAgdGhpcy5fbWFyZ2luVG9wID0gTWF0aC5tYXgoMCwgZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdtYXJnaW4tdG9wJykpO1xuICAgIHRoaXMuX21hcmdpbkJvdHRvbSA9IE1hdGgubWF4KDAsIGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnbWFyZ2luLWJvdHRvbScpKTtcblxuICAgIC8vIEtlZXAgZHJhZyBwbGFjZWhvbGRlcidzIGRpbWVuc2lvbnMgc3luY2VkIHdpdGggdGhlIGl0ZW0ncy5cbiAgICBpZiAoZHJhZ1BsYWNlaG9sZGVyKSB7XG4gICAgICBkcmFnUGxhY2Vob2xkZXIudXBkYXRlRGltZW5zaW9ucyh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGFuZCBzdG9yZSBpdGVtJ3Mgc29ydCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9yZWZyZXNoU29ydERhdGEgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBkYXRhID0gKHRoaXMuX3NvcnREYXRhID0ge30pO1xuICAgIHZhciBnZXR0ZXJzID0gdGhpcy5nZXRHcmlkKCkuX3NldHRpbmdzLnNvcnREYXRhO1xuICAgIHZhciBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGdldHRlcnMpIHtcbiAgICAgIGRhdGFbcHJvcF0gPSBnZXR0ZXJzW3Byb3BdKHRoaXMsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSBpdGVtIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgSXRlbS5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcmVtb3ZlRWxlbWVudD1mYWxzZV1cbiAgICovXG4gIEl0ZW0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24ocmVtb3ZlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciBncmlkID0gdGhpcy5nZXRHcmlkKCk7XG4gICAgdmFyIHNldHRpbmdzID0gZ3JpZC5fc2V0dGluZ3M7XG4gICAgdmFyIGluZGV4ID0gZ3JpZC5faXRlbXMuaW5kZXhPZih0aGlzKTtcblxuICAgIC8vIERlc3Ryb3kgaGFuZGxlcnMuXG4gICAgdGhpcy5fcmVsZWFzZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbWlncmF0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF5b3V0LmRlc3Ryb3koKTtcbiAgICB0aGlzLl92aXNpYmlsaXR5LmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9hbmltYXRlQ2hpbGQuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RyYWdQbGFjZWhvbGRlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZHJhZyAmJiB0aGlzLl9kcmFnLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSBhbGwgaW5saW5lIHN0eWxlcy5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICB0aGlzLl9jaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAvLyBSZW1vdmUgaXRlbSBjbGFzcy5cbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5pdGVtQ2xhc3MpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBHcmlkIGluc3RhbmNlIGlmIGl0IHN0aWxsIGV4aXN0cyB0aGVyZS5cbiAgICBpbmRleCA+IC0xICYmIGdyaWQuX2l0ZW1zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZW1vdmUgZWxlbWVudCBmcm9tIERPTS5cbiAgICByZW1vdmVFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcblxuICAgIC8vIFJlc2V0IHN0YXRlLlxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGxheW91dCBhbGdvcml0aG0gZm9yIE11dXJpLiBCYXNlZCBvbiBNQVhSRUNUUyBhcHByb2FjaFxuICAgKiBhcyBkZXNjcmliZWQgYnkgSnVra2EgSnlsw6Rua2kgaW4gaGlzIHN1cnZleTogXCJBIFRob3VzYW5kIFdheXMgdG8gUGFjayB0aGVcbiAgICogQmluIC0gQSBQcmFjdGljYWwgQXBwcm9hY2ggdG8gVHdvLURpbWVuc2lvbmFsIFJlY3RhbmdsZSBCaW4gUGFja2luZy5cIi5cbiAgICpcbiAgICogQGNsYXNzXG4gICAqL1xuICBmdW5jdGlvbiBQYWNrZXIoKSB7XG4gICAgdGhpcy5fc2xvdHMgPSBbXTtcbiAgICB0aGlzLl9zbG90U2l6ZXMgPSBbXTtcbiAgICB0aGlzLl9mcmVlU2xvdHMgPSBbXTtcbiAgICB0aGlzLl9uZXdTbG90cyA9IFtdO1xuICAgIHRoaXMuX3JlY3RJdGVtID0ge307XG4gICAgdGhpcy5fcmVjdFN0b3JlID0gW107XG4gICAgdGhpcy5fcmVjdElkID0gMDtcblxuICAgIC8vIFRoZSBsYXlvdXQgcmV0dXJuIGRhdGEsIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIGdldExheW91dC5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBzbG90czogbnVsbCxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogZmFsc2UsXG4gICAgICBoZWlnaHQ6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEJpbmQgc29ydCBoYW5kbGVycy5cbiAgICB0aGlzLl9zb3J0UmVjdHNMZWZ0VG9wID0gdGhpcy5fc29ydFJlY3RzTGVmdFRvcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3NvcnRSZWN0c1RvcExlZnQgPSB0aGlzLl9zb3J0UmVjdHNUb3BMZWZ0LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0l0ZW1bXX0gaXRlbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICogQHBhcmFtIHtOdW1iZXJbXX0gW3Nsb3RzXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmlsbEdhcHM9ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGlnblJpZ2h0PWZhbHNlXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsaWduQm90dG9tPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7TGF5b3V0RGF0YX1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuZ2V0TGF5b3V0ID0gZnVuY3Rpb24oaXRlbXMsIHdpZHRoLCBoZWlnaHQsIHNsb3RzLCBvcHRpb25zKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgZmlsbEdhcHMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZmlsbEdhcHMpO1xuICAgIHZhciBpc0hvcml6b250YWwgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuaG9yaXpvbnRhbCk7XG4gICAgdmFyIGFsaWduUmlnaHQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxpZ25SaWdodCk7XG4gICAgdmFyIGFsaWduQm90dG9tID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmFsaWduQm90dG9tKTtcbiAgICB2YXIgcm91bmRpbmcgPSAhIShvcHRpb25zICYmIG9wdGlvbnMucm91bmRpbmcpO1xuICAgIHZhciBzbG90U2l6ZXMgPSB0aGlzLl9zbG90U2l6ZXM7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBSZXNldCBsYXlvdXQgZGF0YS5cbiAgICBsYXlvdXQuc2xvdHMgPSBzbG90cyA/IHNsb3RzIDogdGhpcy5fc2xvdHM7XG4gICAgbGF5b3V0LndpZHRoID0gaXNIb3Jpem9udGFsID8gMCA6IHJvdW5kaW5nID8gTWF0aC5yb3VuZCh3aWR0aCkgOiB3aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gIWlzSG9yaXpvbnRhbCA/IDAgOiByb3VuZGluZyA/IE1hdGgucm91bmQoaGVpZ2h0KSA6IGhlaWdodDtcbiAgICBsYXlvdXQuc2V0V2lkdGggPSBpc0hvcml6b250YWw7XG4gICAgbGF5b3V0LnNldEhlaWdodCA9ICFpc0hvcml6b250YWw7XG5cbiAgICAvLyBNYWtlIHN1cmUgc2xvdHMgYW5kIHNsb3Qgc2l6ZSBhcnJheXMgYXJlIHJlc2V0LlxuICAgIGxheW91dC5zbG90cy5sZW5ndGggPSAwO1xuICAgIHNsb3RTaXplcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIGl0ZW1zIGRvIG5vdCBleGlzdC5cbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIGxheW91dDtcblxuICAgIC8vIEZpbmQgc2xvdHMgZm9yIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYWRkU2xvdChpdGVtc1tpXSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIGFsaWduUmlnaHQgfHwgYWxpZ25Cb3R0b20pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIHJpZ2h0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLlxuICAgIGlmIChhbGlnblJpZ2h0KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LnNsb3RzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgIGxheW91dC5zbG90c1tpXSA9IGxheW91dC53aWR0aCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbGlnbm1lbnQgaXMgc2V0IHRvIGJvdHRvbSB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy5cbiAgICBpZiAoYWxpZ25Cb3R0b20pIHtcbiAgICAgIGZvciAoaSA9IDE7IGkgPCBsYXlvdXQuc2xvdHMubGVuZ3RoOyBpID0gaSArIDIpIHtcbiAgICAgICAgbGF5b3V0LnNsb3RzW2ldID0gbGF5b3V0LmhlaWdodCAtIChsYXlvdXQuc2xvdHNbaV0gKyBzbG90U2l6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2V0IHNsb3RzIGFycmF5cyBhbmQgcmVjdCBpZC5cbiAgICBzbG90U2l6ZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmVlU2xvdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9uZXdTbG90cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlY3RJZCA9IDA7XG5cbiAgICByZXR1cm4gbGF5b3V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIHRoZSBsYXlvdXQgaXRlbS4gUmV0dXJucyB0aGUgbGVmdCBhbmQgdG9wIHBvc2l0aW9uXG4gICAqIG9mIHRoZSBpdGVtIGluIHBpeGVscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNIb3Jpem9udGFsXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmlsbEdhcHNcbiAgICogQHBhcmFtIHtCb29sZWFufSByb3VuZGluZ1xuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRTbG90ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBlcHMgPSAwLjAwMTtcbiAgICB2YXIgaXRlbVNsb3QgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSwgaXNIb3Jpem9udGFsLCBmaWxsR2Fwcywgcm91bmRpbmcsIHRyYWNrU2l6ZSkge1xuICAgICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICAgIHZhciBmcmVlU2xvdHMgPSB0aGlzLl9mcmVlU2xvdHM7XG4gICAgICB2YXIgbmV3U2xvdHMgPSB0aGlzLl9uZXdTbG90cztcbiAgICAgIHZhciByZWN0O1xuICAgICAgdmFyIHJlY3RJZDtcbiAgICAgIHZhciBwb3RlbnRpYWxTbG90cztcbiAgICAgIHZhciBpZ25vcmVDdXJyZW50U2xvdHM7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBpaTtcblxuICAgICAgLy8gUmVzZXQgbmV3IHNsb3RzLlxuICAgICAgbmV3U2xvdHMubGVuZ3RoID0gMDtcblxuICAgICAgLy8gU2V0IGl0ZW0gc2xvdCBpbml0aWFsIGRhdGEuXG4gICAgICBpdGVtU2xvdC5sZWZ0ID0gbnVsbDtcbiAgICAgIGl0ZW1TbG90LnRvcCA9IG51bGw7XG4gICAgICBpdGVtU2xvdC53aWR0aCA9IGl0ZW0uX3dpZHRoICsgaXRlbS5fbWFyZ2luTGVmdCArIGl0ZW0uX21hcmdpblJpZ2h0O1xuICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gaXRlbS5faGVpZ2h0ICsgaXRlbS5fbWFyZ2luVG9wICsgaXRlbS5fbWFyZ2luQm90dG9tO1xuXG4gICAgICAvLyBSb3VuZCBpdGVtIHNsb3Qgd2lkdGggYW5kIGhlaWdodCBpZiBuZWVkZWQuXG4gICAgICBpZiAocm91bmRpbmcpIHtcbiAgICAgICAgaXRlbVNsb3Qud2lkdGggPSBNYXRoLnJvdW5kKGl0ZW1TbG90LndpZHRoKTtcbiAgICAgICAgaXRlbVNsb3QuaGVpZ2h0ID0gTWF0aC5yb3VuZChpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gZmluZCBhIHNsb3QgZm9yIHRoZSBpdGVtLlxuICAgICAgZm9yIChpID0gMDsgaSA8IGZyZWVTbG90cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZWN0SWQgPSBmcmVlU2xvdHNbaV07XG4gICAgICAgIGlmICghcmVjdElkKSBjb250aW51ZTtcbiAgICAgICAgcmVjdCA9IHRoaXMuX2dldFJlY3QocmVjdElkKTtcbiAgICAgICAgaWYgKGl0ZW1TbG90LndpZHRoIDw9IHJlY3Qud2lkdGggKyBlcHMgJiYgaXRlbVNsb3QuaGVpZ2h0IDw9IHJlY3QuaGVpZ2h0ICsgZXBzKSB7XG4gICAgICAgICAgaXRlbVNsb3QubGVmdCA9IHJlY3QubGVmdDtcbiAgICAgICAgICBpdGVtU2xvdC50b3AgPSByZWN0LnRvcDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzbG90IHdhcyBmb3VuZCBmb3IgdGhlIGl0ZW0uXG4gICAgICBpZiAoaXRlbVNsb3QubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBQb3NpdGlvbiB0aGUgaXRlbSBpbiB0byB0aGUgYm90dG9tIGxlZnQgKHZlcnRpY2FsIG1vZGUpIG9yIHRvcCByaWdodFxuICAgICAgICAvLyAoaG9yaXpvbnRhbCBtb2RlKSBvZiB0aGUgZ3JpZC5cbiAgICAgICAgaXRlbVNsb3QubGVmdCA9ICFpc0hvcml6b250YWwgPyAwIDogbGF5b3V0LndpZHRoO1xuICAgICAgICBpdGVtU2xvdC50b3AgPSAhaXNIb3Jpem9udGFsID8gbGF5b3V0LmhlaWdodCA6IDA7XG5cbiAgICAgICAgLy8gSWYgZ2FwcyBkb24ndCBuZWVkIGZpbGxpbmcgZG8gbm90IGFkZCBhbnkgY3VycmVudCBzbG90cyB0byB0aGUgbmV3XG4gICAgICAgIC8vIHNsb3RzIGFycmF5LlxuICAgICAgICBpZiAoIWZpbGxHYXBzKSB7XG4gICAgICAgICAgaWdub3JlQ3VycmVudFNsb3RzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJbiB2ZXJ0aWNhbCBtb2RlLCBpZiB0aGUgaXRlbSdzIGJvdHRvbSBvdmVybGFwcyB0aGUgZ3JpZCdzIGJvdHRvbS5cbiAgICAgIGlmICghaXNIb3Jpem9udGFsICYmIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCA+IGxheW91dC5oZWlnaHQpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgbGVmdCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgPiAwKSB7XG4gICAgICAgICAgbmV3U2xvdHMucHVzaCh0aGlzLl9hZGRSZWN0KDAsIGxheW91dC5oZWlnaHQsIGl0ZW1TbG90LmxlZnQsIEluZmluaXR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSByaWdodCBlZGdlLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aCA8IGxheW91dC53aWR0aCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGgsXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQsXG4gICAgICAgICAgICAgIGxheW91dC53aWR0aCAtIGl0ZW1TbG90LmxlZnQgLSBpdGVtU2xvdC53aWR0aCxcbiAgICAgICAgICAgICAgSW5maW5pdHlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgaGVpZ2h0LlxuICAgICAgICBsYXlvdXQuaGVpZ2h0ID0gaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBob3Jpem9udGFsIG1vZGUsIGlmIHRoZSBpdGVtJ3MgcmlnaHQgb3ZlcmxhcHMgdGhlIGdyaWQncyByaWdodCBlZGdlLlxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCAmJiBpdGVtU2xvdC5sZWZ0ICsgaXRlbVNsb3Qud2lkdGggPiBsYXlvdXQud2lkdGgpIHtcbiAgICAgICAgLy8gSWYgaXRlbSBpcyBub3QgYWxpZ25lZCB0byB0aGUgdG9wLCBjcmVhdGUgYSBuZXcgc2xvdC5cbiAgICAgICAgaWYgKGl0ZW1TbG90LnRvcCA+IDApIHtcbiAgICAgICAgICBuZXdTbG90cy5wdXNoKHRoaXMuX2FkZFJlY3QobGF5b3V0LndpZHRoLCAwLCBJbmZpbml0eSwgaXRlbVNsb3QudG9wKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdGVtIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBib3R0b20sIGNyZWF0ZSBhIG5ldyBzbG90LlxuICAgICAgICBpZiAoaXRlbVNsb3QudG9wICsgaXRlbVNsb3QuaGVpZ2h0IDwgbGF5b3V0LmhlaWdodCkge1xuICAgICAgICAgIG5ld1Nsb3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9hZGRSZWN0KFxuICAgICAgICAgICAgICBsYXlvdXQud2lkdGgsXG4gICAgICAgICAgICAgIGl0ZW1TbG90LnRvcCArIGl0ZW1TbG90LmhlaWdodCxcbiAgICAgICAgICAgICAgSW5maW5pdHksXG4gICAgICAgICAgICAgIGxheW91dC5oZWlnaHQgLSBpdGVtU2xvdC50b3AgLSBpdGVtU2xvdC5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGdyaWQgd2lkdGguXG4gICAgICAgIGxheW91dC53aWR0aCA9IGl0ZW1TbG90LmxlZnQgKyBpdGVtU2xvdC53aWR0aDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gdXAgdGhlIGN1cnJlbnQgc2xvdHMgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIG9sZCBzbG90cyB0aGF0XG4gICAgICAvLyBvdmVybGFwIHdpdGggdGhlIGl0ZW0uIElmIGFuIG9sZCBzbG90IG92ZXJsYXBzIHdpdGggdGhlIGl0ZW0sIHNwbGl0IGl0XG4gICAgICAvLyBpbnRvIHNtYWxsZXIgc2xvdHMgaWYgbmVjZXNzYXJ5LlxuICAgICAgZm9yIChpID0gZmlsbEdhcHMgPyAwIDogaWdub3JlQ3VycmVudFNsb3RzID8gZnJlZVNsb3RzLmxlbmd0aCA6IGk7IGkgPCBmcmVlU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVjdElkID0gZnJlZVNsb3RzW2ldO1xuICAgICAgICBpZiAoIXJlY3RJZCkgY29udGludWU7XG4gICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgIHBvdGVudGlhbFNsb3RzID0gdGhpcy5fc3BsaXRSZWN0KHJlY3QsIGl0ZW1TbG90KTtcbiAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcG90ZW50aWFsU2xvdHMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgcmVjdElkID0gcG90ZW50aWFsU2xvdHNbaWldO1xuICAgICAgICAgIHJlY3QgPSB0aGlzLl9nZXRSZWN0KHJlY3RJZCk7XG4gICAgICAgICAgLy8gTGV0J3MgbWFrZSBzdXJlIGhlcmUgdGhhdCB3ZSBoYXZlIGEgYmlnIGVub3VnaCBzbG90XG4gICAgICAgICAgLy8gKHdpZHRoL2hlaWdodCA+IDAuNDlweCkgYW5kIGFsc28gbGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlIHNsb3QgaXNcbiAgICAgICAgICAvLyB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGdyaWQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVjdC53aWR0aCA+IDAuNDkgJiZcbiAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID4gMC40OSAmJlxuICAgICAgICAgICAgKCghaXNIb3Jpem9udGFsICYmIHJlY3QudG9wIDwgbGF5b3V0LmhlaWdodCkgfHxcbiAgICAgICAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiByZWN0LmxlZnQgPCBsYXlvdXQud2lkdGgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbmV3U2xvdHMucHVzaChyZWN0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBuZXcgc2xvdHMuXG4gICAgICBpZiAobmV3U2xvdHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3B1cmdlUmVjdHMobmV3U2xvdHMpLnNvcnQoXG4gICAgICAgICAgaXNIb3Jpem9udGFsID8gdGhpcy5fc29ydFJlY3RzTGVmdFRvcCA6IHRoaXMuX3NvcnRSZWN0c1RvcExlZnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxheW91dCB3aWR0aC9oZWlnaHQuXG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIGxheW91dC53aWR0aCA9IE1hdGgubWF4KGxheW91dC53aWR0aCwgaXRlbVNsb3QubGVmdCArIGl0ZW1TbG90LndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPSBNYXRoLm1heChsYXlvdXQuaGVpZ2h0LCBpdGVtU2xvdC50b3AgKyBpdGVtU2xvdC5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaXRlbSBzbG90IGRhdGEgdG8gbGF5b3V0IHNsb3RzIChhbmQgc3RvcmUgdGhlIHNsb3Qgc2l6ZSBmb3IgbGF0ZXJcbiAgICAgIC8vIHVzYWdlIHRvbyBpZiBuZWNlc3NhcnkpLlxuICAgICAgbGF5b3V0LnNsb3RzLnB1c2goaXRlbVNsb3QubGVmdCwgaXRlbVNsb3QudG9wKTtcbiAgICAgIGlmICh0cmFja1NpemUpIHRoaXMuX3Nsb3RTaXplcy5wdXNoKGl0ZW1TbG90LndpZHRoLCBpdGVtU2xvdC5oZWlnaHQpO1xuXG4gICAgICAvLyBGcmVlL25ldyBzbG90cyBzd2l0Y2hlcm9vIVxuICAgICAgdGhpcy5fZnJlZVNsb3RzID0gbmV3U2xvdHM7XG4gICAgICB0aGlzLl9uZXdTbG90cyA9IGZyZWVTbG90cztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgcmVjdGFuZ2xlIHRvIHRoZSByZWN0YW5nbGUgc3RvcmUuIFJldHVybnMgdGhlIGlkIG9mIHRoZSBuZXdcbiAgICogcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVmdFxuICAgKiBAcGFyYW0ge051bWJlcn0gdG9wXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEByZXR1cm5zIHtSZWN0SWR9XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9hZGRSZWN0ID0gZnVuY3Rpb24obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIHJlY3RJZCA9ICsrdGhpcy5fcmVjdElkO1xuICAgIHZhciByZWN0U3RvcmUgPSB0aGlzLl9yZWN0U3RvcmU7XG5cbiAgICByZWN0U3RvcmVbcmVjdElkXSA9IGxlZnQgfHwgMDtcbiAgICByZWN0U3RvcmVbKyt0aGlzLl9yZWN0SWRdID0gdG9wIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IHdpZHRoIHx8IDA7XG4gICAgcmVjdFN0b3JlWysrdGhpcy5fcmVjdElkXSA9IGhlaWdodCB8fCAwO1xuXG4gICAgcmV0dXJuIHJlY3RJZDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHJlY3RhbmdsZSBkYXRhIGZyb20gdGhlIHJlY3RhbmdsZSBzdG9yZSBieSBpZC4gT3B0aW9uYWxseSB5b3UgY2FuXG4gICAqIHByb3ZpZGUgYSB0YXJnZXQgb2JqZWN0IHdoZXJlIHRoZSByZWN0YW5nbGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gaW4uIEJ5XG4gICAqIGRlZmF1bHQgYW4gaW50ZXJuYWwgb2JqZWN0IGlzIHJldXNlZCBhcyBhIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBpZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF1cbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX2dldFJlY3QgPSBmdW5jdGlvbihpZCwgdGFyZ2V0KSB7XG4gICAgdmFyIHJlY3RJdGVtID0gdGFyZ2V0ID8gdGFyZ2V0IDogdGhpcy5fcmVjdEl0ZW07XG4gICAgdmFyIHJlY3RTdG9yZSA9IHRoaXMuX3JlY3RTdG9yZTtcblxuICAgIHJlY3RJdGVtLmxlZnQgPSByZWN0U3RvcmVbaWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0udG9wID0gcmVjdFN0b3JlWysraWRdIHx8IDA7XG4gICAgcmVjdEl0ZW0ud2lkdGggPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcbiAgICByZWN0SXRlbS5oZWlnaHQgPSByZWN0U3RvcmVbKytpZF0gfHwgMDtcblxuICAgIHJldHVybiByZWN0SXRlbTtcbiAgfTtcblxuICAvKipcbiAgICogUHVuY2ggYSBob2xlIGludG8gYSByZWN0YW5nbGUgYW5kIHNwbGl0IHRoZSByZW1haW5pbmcgYXJlYSBpbnRvIHNtYWxsZXJcbiAgICogcmVjdGFuZ2xlcyAoNCBhdCBtYXgpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gcmVjdFxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gaG9sZVxuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9zcGxpdFJlY3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVjdCwgaG9sZSkge1xuICAgICAgLy8gUmVzZXQgb2xkIHJlc3VsdHMuXG4gICAgICByZXN1bHRzLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIElmIHRoZSByZWN0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgaG9sZSBhZGQgcmVjdCB0byB0aGUgcmV0dXJuIGRhdGFcbiAgICAgIC8vIGFzIGlzLlxuICAgICAgaWYgKCF0aGlzLl9kb1JlY3RzT3ZlcmxhcChyZWN0LCBob2xlKSkge1xuICAgICAgICByZXN1bHRzLnB1c2godGhpcy5fYWRkUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cblxuICAgICAgLy8gTGVmdCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgPCBob2xlLmxlZnQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgaG9sZS5sZWZ0IC0gcmVjdC5sZWZ0LCByZWN0LmhlaWdodCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSaWdodCBzcGxpdC5cbiAgICAgIGlmIChyZWN0LmxlZnQgKyByZWN0LndpZHRoID4gaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCkge1xuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgdGhpcy5fYWRkUmVjdChcbiAgICAgICAgICAgIGhvbGUubGVmdCArIGhvbGUud2lkdGgsXG4gICAgICAgICAgICByZWN0LnRvcCxcbiAgICAgICAgICAgIHJlY3QubGVmdCArIHJlY3Qud2lkdGggLSAoaG9sZS5sZWZ0ICsgaG9sZS53aWR0aCksXG4gICAgICAgICAgICByZWN0LmhlaWdodFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVG9wIHNwbGl0LlxuICAgICAgaWYgKHJlY3QudG9wIDwgaG9sZS50b3ApIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX2FkZFJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgaG9sZS50b3AgLSByZWN0LnRvcCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb3R0b20gc3BsaXQuXG4gICAgICBpZiAocmVjdC50b3AgKyByZWN0LmhlaWdodCA+IGhvbGUudG9wICsgaG9sZS5oZWlnaHQpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX2FkZFJlY3QoXG4gICAgICAgICAgICByZWN0LmxlZnQsXG4gICAgICAgICAgICBob2xlLnRvcCArIGhvbGUuaGVpZ2h0LFxuICAgICAgICAgICAgcmVjdC53aWR0aCxcbiAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLSAoaG9sZS50b3AgKyBob2xlLmhlaWdodClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHR3byByZWN0YW5nbGVzIG92ZXJsYXAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fZG9SZWN0c092ZXJsYXAgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICBhLmxlZnQgKyBhLndpZHRoIDw9IGIubGVmdCB8fFxuICAgICAgYi5sZWZ0ICsgYi53aWR0aCA8PSBhLmxlZnQgfHxcbiAgICAgIGEudG9wICsgYS5oZWlnaHQgPD0gYi50b3AgfHxcbiAgICAgIGIudG9wICsgYi5oZWlnaHQgPD0gYS50b3BcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHJlY3RhbmdsZSBpcyBmdWxseSB3aXRoaW4gYW5vdGhlciByZWN0YW5nbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBhXG4gICAqIEBwYXJhbSB7UmVjdGFuZ2xlfSBiXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5faXNSZWN0V2l0aGluUmVjdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5sZWZ0ID49IGIubGVmdCAmJlxuICAgICAgYS50b3AgPj0gYi50b3AgJiZcbiAgICAgIGEubGVmdCArIGEud2lkdGggPD0gYi5sZWZ0ICsgYi53aWR0aCAmJlxuICAgICAgYS50b3AgKyBhLmhlaWdodCA8PSBiLnRvcCArIGIuaGVpZ2h0XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9vcHMgdGhyb3VnaCBhbiBhcnJheSBvZiByZWN0YW5nbGUgaWRzIGFuZCByZXNldHMgYWxsIHRoYXQgYXJlIGZ1bGx5XG4gICAqIHdpdGhpbiBhbm90aGVyIHJlY3RhbmdsZSBpbiB0aGUgYXJyYXkuIFJlc2V0dGluZyBpbiB0aGlzIGNhc2UgbWVhbnMgdGhhdFxuICAgKiB0aGUgcmVjdGFuZ2xlIGlkIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggemVyby5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIFBhY2tlci5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtSZWN0SWRbXX0gcmVjdElkc1xuICAgKiBAcmV0dXJucyB7UmVjdElkW119XG4gICAqL1xuICBQYWNrZXIucHJvdG90eXBlLl9wdXJnZVJlY3RzID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWN0QSA9IHt9O1xuICAgIHZhciByZWN0QiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbihyZWN0SWRzKSB7XG4gICAgICB2YXIgaSA9IHJlY3RJZHMubGVuZ3RoO1xuICAgICAgdmFyIGlpO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGlpID0gcmVjdElkcy5sZW5ndGg7XG4gICAgICAgIGlmICghcmVjdElkc1tpXSkgY29udGludWU7XG4gICAgICAgIHRoaXMuX2dldFJlY3QocmVjdElkc1tpXSwgcmVjdEEpO1xuICAgICAgICB3aGlsZSAoaWktLSkge1xuICAgICAgICAgIGlmICghcmVjdElkc1tpaV0gfHwgaSA9PT0gaWkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlY3RXaXRoaW5SZWN0KHJlY3RBLCB0aGlzLl9nZXRSZWN0KHJlY3RJZHNbaWldLCByZWN0QikpKSB7XG4gICAgICAgICAgICByZWN0SWRzW2ldID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjdElkcztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBTb3J0IHJlY3RhbmdsZXMgd2l0aCB0b3AtbGVmdCBncmF2aXR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgUGFja2VyLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1JlY3RJZH0gYUlkXG4gICAqIEBwYXJhbSB7UmVjdElkfSBiSWRcbiAgICogQHJldHVybnMge051bWJlcn1cbiAgICovXG4gIFBhY2tlci5wcm90b3R5cGUuX3NvcnRSZWN0c1RvcExlZnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlY3RBID0ge307XG4gICAgdmFyIHJlY3RCID0ge307XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFJZCwgYklkKSB7XG4gICAgICB0aGlzLl9nZXRSZWN0KGFJZCwgcmVjdEEpO1xuICAgICAgdGhpcy5fZ2V0UmVjdChiSWQsIHJlY3RCKTtcbiAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgcmV0dXJuIHJlY3RBLnRvcCA8IHJlY3RCLnRvcCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPiByZWN0Qi50b3AgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0IDwgcmVjdEIubGVmdCA/IC0xIDpcbiAgICAgICAgICAgICByZWN0QS5sZWZ0ID4gcmVjdEIubGVmdCA/IDEgOiAwO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIFNvcnQgcmVjdGFuZ2xlcyB3aXRoIGxlZnQtdG9wIGdyYXZpdHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBQYWNrZXIucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7UmVjdElkfSBhSWRcbiAgICogQHBhcmFtIHtSZWN0SWR9IGJJZFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfVxuICAgKi9cbiAgUGFja2VyLnByb3RvdHlwZS5fc29ydFJlY3RzTGVmdFRvcCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVjdEEgPSB7fTtcbiAgICB2YXIgcmVjdEIgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24oYUlkLCBiSWQpIHtcbiAgICAgIHRoaXMuX2dldFJlY3QoYUlkLCByZWN0QSk7XG4gICAgICB0aGlzLl9nZXRSZWN0KGJJZCwgcmVjdEIpO1xuICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICByZXR1cm4gcmVjdEEubGVmdCA8IHJlY3RCLmxlZnQgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEubGVmdCA+IHJlY3RCLmxlZnQgPyAxIDpcbiAgICAgICAgICAgICByZWN0QS50b3AgPCByZWN0Qi50b3AgPyAtMSA6XG4gICAgICAgICAgICAgcmVjdEEudG9wID4gcmVjdEIudG9wID8gMSA6IDA7XG4gICAgfTtcbiAgfSkoKTtcblxuICB2YXIgaHRtbENvbGxlY3Rpb25UeXBlID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJztcbiAgdmFyIG5vZGVMaXN0VHlwZSA9ICdbb2JqZWN0IE5vZGVMaXN0XSc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWxcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG4gICAgcmV0dXJuIHR5cGUgPT09IGh0bWxDb2xsZWN0aW9uVHlwZSB8fCB0eXBlID09PSBub2RlTGlzdFR5cGU7XG4gIH1cblxuICB2YXIgb2JqZWN0VHlwZSA9ICdvYmplY3QnO1xuICB2YXIgb2JqZWN0VG9TdHJpbmdUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gb2JqZWN0VHlwZSAmJiB0b1N0cmluZy5jYWxsKHZhbCkgPT09IG9iamVjdFRvU3RyaW5nVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGFuIGFycmF5IG9yIGNsb25lcyBhbiBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB0YXJnZXRcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgICByZXR1cm4gaXNOb2RlTGlzdCh0YXJnZXQpID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0KSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQodGFyZ2V0KTtcbiAgfVxuXG4gIHZhciBwYWNrZXIgPSBuZXcgUGFja2VyKCk7XG4gIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuICB2YXIgbnVtYmVyVHlwZSQxID0gJ251bWJlcic7XG4gIHZhciBzdHJpbmdUeXBlID0gJ3N0cmluZyc7XG4gIHZhciBpbnN0YW50TGF5b3V0ID0gJ2luc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEdyaWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTdHJpbmcpfSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHs/KEhUTUxFbGVtZW50W118Tm9kZUxpc3R8U3RyaW5nKX0gW29wdGlvbnMuaXRlbXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zaG93RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc2hvd0Vhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnZpc2libGVTdHlsZXNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaGlkZUVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmhpZGRlblN0eWxlc11cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gW29wdGlvbnMubGF5b3V0XVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dC5maWxsR2Fwcz1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuaG9yaXpvbnRhbD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25SaWdodD1mYWxzZV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5sYXlvdXQuYWxpZ25Cb3R0b209ZmFsc2VdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubGF5b3V0LnJvdW5kaW5nPXRydWVdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TnVtYmVyKX0gW29wdGlvbnMubGF5b3V0T25SZXNpemU9MTAwXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmxheW91dE9uSW5pdD10cnVlXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubGF5b3V0RHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubGF5b3V0RWFzaW5nPVwiZWFzZVwiXVxuICAgKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zLnNvcnREYXRhPW51bGxdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ0VuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P0h0bWxFbGVtZW50fSBbb3B0aW9ucy5kcmFnQ29udGFpbmVyPW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGVdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU3RhcnRQcmVkaWNhdGUuZGlzdGFuY2U9MF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5kZWxheT0wXVxuICAgKiBAcGFyYW0geyhCb29sZWFufFN0cmluZyl9IFtvcHRpb25zLmRyYWdTdGFydFByZWRpY2F0ZS5oYW5kbGU9ZmFsc2VdXG4gICAqIEBwYXJhbSB7P1N0cmluZ30gW29wdGlvbnMuZHJhZ0F4aXNdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58RnVuY3Rpb24pfSBbb3B0aW9ucy5kcmFnU29ydD10cnVlXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLnNvcnRJbnRlcnZhbD0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnU29ydEhldXJpc3RpY3MubWluRHJhZ0Rpc3RhbmNlPTEwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJhZ1NvcnRIZXVyaXN0aWNzLm1pbkJvdW5jZUJhY2tBbmdsZT0xXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBbb3B0aW9ucy5kcmFnU29ydFByZWRpY2F0ZV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLnRocmVzaG9sZD01MF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyYWdTb3J0UHJlZGljYXRlLmFjdGlvbj1cIm1vdmVcIl1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyYWdSZWxlYXNlRHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1JlbGVhc2VFYXNpbmc9XCJlYXNlXCJdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnQ3NzUHJvcHNdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXJdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVuYWJsZWQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIuZHVyYXRpb249MzAwXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJhZ1BsYWNlaG9sZGVyLmVhc2luZz1cImVhc2VcIl1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5jcmVhdGVFbGVtZW50PW51bGxdXG4gICAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBbb3B0aW9ucy5kcmFnUGxhY2Vob2xkZXIub25DcmVhdGU9bnVsbF1cbiAgICogQHBhcmFtIHs/RnVuY3Rpb259IFtvcHRpb25zLmRyYWdQbGFjZWhvbGRlci5vblJlbW92ZT1udWxsXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udGFpbmVyQ2xhc3M9XCJtdXVyaVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUNsYXNzPVwibXV1cmktaXRlbVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVZpc2libGVDbGFzcz1cIm11dXJpLWl0ZW0tdmlzaWJsZVwiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbUhpZGRlbkNsYXNzPVwibXV1cmktaXRlbS1oaWRkZW5cIl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLml0ZW1Qb3NpdGlvbmluZ0NsYXNzPVwibXV1cmktaXRlbS1wb3NpdGlvbmluZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbURyYWdnaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLWRyYWdnaW5nXCJdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pdGVtUmVsZWFzaW5nQ2xhc3M9XCJtdXVyaS1pdGVtLXJlbGVhc2luZ1wiXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaXRlbVBsYWNlaG9sZGVyQ2xhc3M9XCJtdXVyaS1pdGVtLXBsYWNlaG9sZGVyXCJdXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEdyaWQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBpbnN0ID0gdGhpcztcbiAgICB2YXIgc2V0dGluZ3M7XG4gICAgdmFyIGl0ZW1zO1xuICAgIHZhciBsYXlvdXRPblJlc2l6ZTtcblxuICAgIC8vIEFsbG93IHBhc3NpbmcgZWxlbWVudCBhcyBzZWxlY3RvciBzdHJpbmcuIFN0b3JlIGVsZW1lbnQgZm9yIGluc3RhbmNlLlxuICAgIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50ID1cbiAgICAgIHR5cGVvZiBlbGVtZW50ID09PSBzdHJpbmdUeXBlID8gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnRhaW5lciBlbGVtZW50IGlzIG5vdCBib2R5IGVsZW1lbnQgb3IgZG9lcyBub3RcbiAgICAvLyBleGlzdCB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudC5cbiAgICB2YXIgaXNFbGVtZW50SW5Eb20gPSBlbGVtZW50LmdldFJvb3ROb2RlXG4gICAgICA/IGVsZW1lbnQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogdHJ1ZSB9KSA9PT0gZG9jdW1lbnRcbiAgICAgIDogd2luZG93LmRvY3VtZW50LmJvZHkuY29udGFpbnMoZWxlbWVudCk7XG4gICAgaWYgKCFpc0VsZW1lbnRJbkRvbSB8fCBlbGVtZW50ID09PSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhaW5lciBlbGVtZW50IG11c3QgYmUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2Ugc2V0dGluZ3MgYnkgbWVyZ2luZyB0aGUgb3B0aW9ucyB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzID0gbWVyZ2VTZXR0aW5ncyhHcmlkLmRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgIC8vIFNhbml0aXplIGRyYWdTb3J0IHNldHRpbmcuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHNldHRpbmdzLmRyYWdTb3J0KSkge1xuICAgICAgc2V0dGluZ3MuZHJhZ1NvcnQgPSAhIXNldHRpbmdzLmRyYWdTb3J0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbnN0YW5jZSBpZCBhbmQgc3RvcmUgaXQgdG8gdGhlIGdyaWQgaW5zdGFuY2VzIGNvbGxlY3Rpb24uXG4gICAgdGhpcy5faWQgPSBjcmVhdGVVaWQoKTtcbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IGluc3Q7XG5cbiAgICAvLyBEZXN0cm95ZWQgZmxhZy5cbiAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGxheW91dCBvYmplY3QgKG11dGF0ZWQgb24gZXZlcnkgbGF5b3V0KS5cbiAgICB0aGlzLl9sYXlvdXQgPSB7XG4gICAgICBpZDogMCxcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIHNsb3RzOiBbXSxcbiAgICAgIHNldFdpZHRoOiBmYWxzZSxcbiAgICAgIHNldEhlaWdodDogZmFsc2UsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgcHJpdmF0ZSBFbWl0dGVyIGluc3RhbmNlLlxuICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lciBlbGVtZW50J3MgY2xhc3MgbmFtZS5cbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jb250YWluZXJDbGFzcyk7XG5cbiAgICAvLyBDcmVhdGUgaW5pdGlhbCBpdGVtcy5cbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIGl0ZW1zID0gc2V0dGluZ3MuaXRlbXM7XG4gICAgaWYgKHR5cGVvZiBpdGVtcyA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgdG9BcnJheShlbGVtZW50LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIGlmIChpdGVtcyA9PT0gJyonIHx8IGVsZW1lbnRNYXRjaGVzKGl0ZW1FbGVtZW50LCBpdGVtcykpIHtcbiAgICAgICAgICBpbnN0Ll9pdGVtcy5wdXNoKG5ldyBJdGVtKGluc3QsIGl0ZW1FbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykgfHwgaXNOb2RlTGlzdChpdGVtcykpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gdG9BcnJheShpdGVtcykubWFwKGZ1bmN0aW9uKGl0ZW1FbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbShpbnN0LCBpdGVtRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXRPblJlc2l6ZSBvcHRpb24gaXMgYSB2YWxpZCBudW1iZXIgc2FuaXRpemUgaXQgYW5kIGJpbmQgdGhlIHJlc2l6ZVxuICAgIC8vIGhhbmRsZXIuXG4gICAgbGF5b3V0T25SZXNpemUgPSBzZXR0aW5ncy5sYXlvdXRPblJlc2l6ZTtcbiAgICBpZiAodHlwZW9mIGxheW91dE9uUmVzaXplICE9PSBudW1iZXJUeXBlJDEpIHtcbiAgICAgIGxheW91dE9uUmVzaXplID0gbGF5b3V0T25SZXNpemUgPT09IHRydWUgPyAwIDogLTE7XG4gICAgfVxuICAgIGlmIChsYXlvdXRPblJlc2l6ZSA+PSAwKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Jlc2l6ZScsXG4gICAgICAgIChpbnN0Ll9yZXNpemVIYW5kbGVyID0gZGVib3VuY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaW5zdC5yZWZyZXNoSXRlbXMoKS5sYXlvdXQoKTtcbiAgICAgICAgfSwgbGF5b3V0T25SZXNpemUpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMYXlvdXQgb24gaW5pdCBpZiBuZWNlc3NhcnkuXG4gICAgaWYgKHNldHRpbmdzLmxheW91dE9uSW5pdCkge1xuICAgICAgdGhpcy5sYXlvdXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm9wZXJ0aWVzXG4gICAqICoqKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1cbiAgICovXG4gIEdyaWQuSXRlbSA9IEl0ZW07XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUxheW91dFxuICAgKi9cbiAgR3JpZC5JdGVtTGF5b3V0ID0gSXRlbUxheW91dDtcblxuICAvKipcbiAgICogQHNlZSBJdGVtVmlzaWJpbGl0eVxuICAgKi9cbiAgR3JpZC5JdGVtVmlzaWJpbGl0eSA9IEl0ZW1WaXNpYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1NaWdyYXRlXG4gICAqL1xuICBHcmlkLkl0ZW1NaWdyYXRlID0gSXRlbU1pZ3JhdGU7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbUFuaW1hdGVcbiAgICovXG4gIEdyaWQuSXRlbUFuaW1hdGUgPSBJdGVtQW5pbWF0ZTtcblxuICAvKipcbiAgICogQHNlZSBJdGVtRHJhZ1xuICAgKi9cbiAgR3JpZC5JdGVtRHJhZyA9IEl0ZW1EcmFnO1xuXG4gIC8qKlxuICAgKiBAc2VlIEl0ZW1SZWxlYXNlXG4gICAqL1xuICBHcmlkLkl0ZW1SZWxlYXNlID0gSXRlbVJlbGVhc2U7XG5cbiAgLyoqXG4gICAqIEBzZWUgSXRlbURyYWdQbGFjZWhvbGRlclxuICAgKi9cbiAgR3JpZC5JdGVtRHJhZ1BsYWNlaG9sZGVyID0gSXRlbURyYWdQbGFjZWhvbGRlcjtcblxuICAvKipcbiAgICogQHNlZSBFbWl0dGVyXG4gICAqL1xuICBHcmlkLkVtaXR0ZXIgPSBFbWl0dGVyO1xuXG4gIC8qKlxuICAgKiBAc2VlIERyYWdnZXJcbiAgICovXG4gIEdyaWQuRHJhZ2dlciA9IERyYWdnZXI7XG5cbiAgLyoqXG4gICAqIEBzZWUgUGFja2VyXG4gICAqL1xuICBHcmlkLlBhY2tlciA9IFBhY2tlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBvcHRpb25zIGZvciBHcmlkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkXG4gICAqL1xuICBHcmlkLmRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIEl0ZW0gZWxlbWVudHNcbiAgICBpdGVtczogJyonLFxuXG4gICAgLy8gRGVmYXVsdCBzaG93IGFuaW1hdGlvblxuICAgIHNob3dEdXJhdGlvbjogMzAwLFxuICAgIHNob3dFYXNpbmc6ICdlYXNlJyxcblxuICAgIC8vIERlZmF1bHQgaGlkZSBhbmltYXRpb25cbiAgICBoaWRlRHVyYXRpb246IDMwMCxcbiAgICBoaWRlRWFzaW5nOiAnZWFzZScsXG5cbiAgICAvLyBJdGVtJ3MgdmlzaWJsZS9oaWRkZW4gc3RhdGUgc3R5bGVzXG4gICAgdmlzaWJsZVN0eWxlczoge1xuICAgICAgb3BhY2l0eTogJzEnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgfSxcbiAgICBoaWRkZW5TdHlsZXM6IHtcbiAgICAgIG9wYWNpdHk6ICcwJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknXG4gICAgfSxcblxuICAgIC8vIExheW91dFxuICAgIGxheW91dDoge1xuICAgICAgZmlsbEdhcHM6IGZhbHNlLFxuICAgICAgaG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICBhbGlnblJpZ2h0OiBmYWxzZSxcbiAgICAgIGFsaWduQm90dG9tOiBmYWxzZSxcbiAgICAgIHJvdW5kaW5nOiB0cnVlXG4gICAgfSxcbiAgICBsYXlvdXRPblJlc2l6ZTogMTAwLFxuICAgIGxheW91dE9uSW5pdDogdHJ1ZSxcbiAgICBsYXlvdXREdXJhdGlvbjogMzAwLFxuICAgIGxheW91dEVhc2luZzogJ2Vhc2UnLFxuXG4gICAgLy8gU29ydGluZ1xuICAgIHNvcnREYXRhOiBudWxsLFxuXG4gICAgLy8gRHJhZyAmIERyb3BcbiAgICBkcmFnRW5hYmxlZDogZmFsc2UsXG4gICAgZHJhZ0NvbnRhaW5lcjogbnVsbCxcbiAgICBkcmFnU3RhcnRQcmVkaWNhdGU6IHtcbiAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgZGVsYXk6IDAsXG4gICAgICBoYW5kbGU6IGZhbHNlXG4gICAgfSxcbiAgICBkcmFnQXhpczogbnVsbCxcbiAgICBkcmFnU29ydDogdHJ1ZSxcbiAgICBkcmFnU29ydEhldXJpc3RpY3M6IHtcbiAgICAgIHNvcnRJbnRlcnZhbDogMTAwLFxuICAgICAgbWluRHJhZ0Rpc3RhbmNlOiAxMCxcbiAgICAgIG1pbkJvdW5jZUJhY2tBbmdsZTogMVxuICAgIH0sXG4gICAgZHJhZ1NvcnRQcmVkaWNhdGU6IHtcbiAgICAgIHRocmVzaG9sZDogNTAsXG4gICAgICBhY3Rpb246IGFjdGlvbk1vdmVcbiAgICB9LFxuICAgIGRyYWdSZWxlYXNlRHVyYXRpb246IDMwMCxcbiAgICBkcmFnUmVsZWFzZUVhc2luZzogJ2Vhc2UnLFxuICAgIGRyYWdDc3NQcm9wczoge1xuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG4gICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknLFxuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgICBjb250ZW50Wm9vbWluZzogJ25vbmUnXG4gICAgfSxcbiAgICBkcmFnUGxhY2Vob2xkZXI6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2UnLFxuICAgICAgY3JlYXRlRWxlbWVudDogbnVsbCxcbiAgICAgIG9uQ3JlYXRlOiBudWxsLFxuICAgICAgb25SZW1vdmU6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQ2xhc3NuYW1lc1xuICAgIGNvbnRhaW5lckNsYXNzOiAnbXV1cmknLFxuICAgIGl0ZW1DbGFzczogJ211dXJpLWl0ZW0nLFxuICAgIGl0ZW1WaXNpYmxlQ2xhc3M6ICdtdXVyaS1pdGVtLXNob3duJyxcbiAgICBpdGVtSGlkZGVuQ2xhc3M6ICdtdXVyaS1pdGVtLWhpZGRlbicsXG4gICAgaXRlbVBvc2l0aW9uaW5nQ2xhc3M6ICdtdXVyaS1pdGVtLXBvc2l0aW9uaW5nJyxcbiAgICBpdGVtRHJhZ2dpbmdDbGFzczogJ211dXJpLWl0ZW0tZHJhZ2dpbmcnLFxuICAgIGl0ZW1SZWxlYXNpbmdDbGFzczogJ211dXJpLWl0ZW0tcmVsZWFzaW5nJyxcbiAgICBpdGVtUGxhY2Vob2xkZXJDbGFzczogJ211dXJpLWl0ZW0tcGxhY2Vob2xkZXInXG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBwcm90b3R5cGUgbWV0aG9kc1xuICAgKiAqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmJpbmQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIHRoaXMuX2VtaXR0ZXIub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGFsbCBpdGVtcy4gT3B0aW9uYWxseSB5b3UgY2FuIHByb3ZpZGUgc3BlY2lmaWMgdGFyZ2V0cyAoZWxlbWVudHMgYW5kXG4gICAqIGluZGljZXMpLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGlzIG5vdCB0aGUgc2FtZSBvYmplY3QgdXNlZCBieSB0aGVcbiAgICogaW5zdGFuY2Ugc28gbW9kaWZ5aW5nIGl0IHdpbGwgbm90IGFmZmVjdCBpbnN0YW5jZSdzIGl0ZW1zLiBBbGwgaXRlbXMgdGhhdFxuICAgKiBhcmUgbm90IGZvdW5kIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJldHVybmVkIGFycmF5LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW3RhcmdldHNdXG4gICAqIEByZXR1cm5zIHtJdGVtW119XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5nZXRJdGVtcyA9IGZ1bmN0aW9uKHRhcmdldHMpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGl0ZW1zIGltbWVkaWF0ZWx5IGlmIG5vIHRhcmdldHMgd2VyZSBwcm92aWRlZCBvciBpZiB0aGVcbiAgICAvLyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuXG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICghdGFyZ2V0cyAmJiB0YXJnZXRzICE9PSAwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKDApO1xuICAgIH1cblxuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0b0FycmF5KHRhcmdldHMpO1xuICAgIHZhciBpdGVtO1xuICAgIHZhciBpO1xuXG4gICAgLy8gSWYgdGFyZ2V0IGl0ZW1zIGFyZSBkZWZpbmVkIHJldHVybiBmaWx0ZXJlZCByZXN1bHRzLlxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0odGFyZ2V0SXRlbXNbaV0pO1xuICAgICAgaXRlbSAmJiByZXQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNhY2hlZCBkaW1lbnNpb25zIG9mIHRoZSBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gW2l0ZW1zXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlZnJlc2hJdGVtcyA9IGZ1bmN0aW9uKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0YXJnZXRzID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGFyZ2V0c1tpXS5fcmVmcmVzaERpbWVuc2lvbnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzb3J0IGRhdGEgb2YgdGhlIGluc3RhbmNlJ3MgaXRlbXMuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7R3JpZE11bHRpSXRlbVF1ZXJ5fSBbaXRlbXNdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUucmVmcmVzaFNvcnREYXRhID0gZnVuY3Rpb24oaXRlbXMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhcmdldEl0ZW1zW2ldLl9yZWZyZXNoU29ydERhdGEoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIGl0ZW0gZWxlbWVudHMgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpbiB0aGUgRE9NLlxuICAgKiBUaGlzIGNvbWVzIGhhbmR5IGlmIHlvdSBuZWVkIHRvIGtlZXAgdGhlIERPTSBzdHJ1Y3R1cmUgbWF0Y2hlZCB3aXRoIHRoZVxuICAgKiBvcmRlciBvZiB0aGUgaXRlbXMuIE5vdGUgdGhhdCBpZiBhbiBpdGVtJ3MgZWxlbWVudCBpcyBub3QgY3VycmVudGx5IGEgY2hpbGRcbiAgICogb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50IChpZiBpdCBpcyBkcmFnZ2VkIGZvciBleGFtcGxlKSBpdCBpcyBpZ25vcmVkIGFuZFxuICAgKiBsZWZ0IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5zeW5jaHJvbml6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgZnJhZ21lbnQ7XG4gICAgdmFyIGVsZW1lbnQ7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBBcHBlbmQgYWxsIGVsZW1lbnRzIGluIG9yZGVyIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxlbWVudCA9IGl0ZW1zW2ldLl9lbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZyYWdtZW50KSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc3luY2hyb25pemUgZXZlbnQuXG4gICAgdGhpcy5fZW1pdChldmVudFN5bmNocm9uaXplKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYW5kIGFwcGx5IGl0ZW0gcG9zaXRpb25zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge0xheW91dENhbGxiYWNrfSBbb25GaW5pc2hdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oaW5zdGFudCwgb25GaW5pc2gpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGluc3QgPSB0aGlzO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG4gICAgdmFyIGxheW91dElkID0gbGF5b3V0LmlkO1xuICAgIHZhciBpdGVtc0xlbmd0aCA9IGxheW91dC5pdGVtcy5sZW5ndGg7XG4gICAgdmFyIGNvdW50ZXIgPSBpdGVtc0xlbmd0aDtcbiAgICB2YXIgaXNCb3JkZXJCb3g7XG4gICAgdmFyIGl0ZW07XG4gICAgdmFyIGk7XG5cbiAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGNoZWNraW5nIGlmIGFsbCB0aGUgaXRlbXNcbiAgICAvLyBoYXZlIGxhaWQgb3V0IHlldC4gQWZ0ZXIgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsXG4gICAgLy8gY2FsbGJhY2sgYW5kIGVtaXQgbGF5b3V0RW5kIGV2ZW50LiBPbmx5IGVtaXQgbGF5b3V0RW5kIGV2ZW50IGlmIHRoZXJlXG4gICAgLy8gaGFzbid0IGJlZW4gYSBuZXcgbGF5b3V0IGNhbGwgZHVyaW5nIHRoaXMgbGF5b3V0LlxuICAgIGZ1bmN0aW9uIHRyeUZpbmlzaCgpIHtcbiAgICAgIGlmICgtLWNvdW50ZXIgPiAwKSByZXR1cm47XG5cbiAgICAgIHZhciBoYXNMYXlvdXRDaGFuZ2VkID0gaW5zdC5fbGF5b3V0LmlkICE9PSBsYXlvdXRJZDtcbiAgICAgIHZhciBjYWxsYmFjayA9IGlzRnVuY3Rpb24oaW5zdGFudCkgPyBpbnN0YW50IDogb25GaW5pc2g7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICBjYWxsYmFjayhoYXNMYXlvdXRDaGFuZ2VkLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc0xheW91dENoYW5nZWQgJiYgaW5zdC5faGFzTGlzdGVuZXJzKGV2ZW50TGF5b3V0RW5kKSkge1xuICAgICAgICBpbnN0Ll9lbWl0KGV2ZW50TGF5b3V0RW5kLCBsYXlvdXQuaXRlbXMuc2xpY2UoMCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGdyaWQncyB3aWR0aCBvciBoZWlnaHQgd2FzIG1vZGlmaWVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCdzIGNhY2hlZFxuICAgIC8vIGRpbWVuc2lvbnMuIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQgZ3JpZCdzIGNhY2hlZCB3aWR0aC9oZWlnaHQgc2hvdWxkXG4gICAgLy8gYWx3YXlzIGVxdWFsIHRvIHdoYXQgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB3b3VsZCByZXR1cm4sIHNvXG4gICAgLy8gdGhlcmVmb3JlIHdlIG5lZWQgdG8gYWRkIHRoZSBncmlkIGVsZW1lbnQncyBib3JkZXJzIHRvIHRoZSBkaW1lbnNpb25zIGlmXG4gICAgLy8gaXQncyBib3gtc2l6aW5nIGlzIGJvcmRlci1ib3guIE5vdGUgdGhhdCB3ZSBzdXBwb3J0IHByb3ZpZGluZyB0aGVcbiAgICAvLyBkaW1lbnNpb25zIGFzIGEgc3RyaW5nIGhlcmUgdG9vIHNvIHRoYXQgb25lIGNhbiBkZWZpbmUgdGhlIHVuaXQgb2YgdGhlXG4gICAgLy8gZGltZW5zaW9ucywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyB0aGUgYm9yZGVyLWJveCBjaGVjay5cbiAgICBpZiAoXG4gICAgICAobGF5b3V0LnNldEhlaWdodCAmJiB0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB8fFxuICAgICAgKGxheW91dC5zZXRXaWR0aCAmJiB0eXBlb2YgbGF5b3V0LndpZHRoID09PSBudW1iZXJUeXBlJDEpXG4gICAgKSB7XG4gICAgICBpc0JvcmRlckJveCA9IGdldFN0eWxlKGVsZW1lbnQsICdib3gtc2l6aW5nJykgPT09ICdib3JkZXItYm94JztcbiAgICB9XG4gICAgaWYgKGxheW91dC5zZXRIZWlnaHQpIHtcbiAgICAgIGlmICh0eXBlb2YgbGF5b3V0LmhlaWdodCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID1cbiAgICAgICAgICAoaXNCb3JkZXJCb3ggPyBsYXlvdXQuaGVpZ2h0ICsgdGhpcy5fYm9yZGVyVG9wICsgdGhpcy5fYm9yZGVyQm90dG9tIDogbGF5b3V0LmhlaWdodCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBsYXlvdXQuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGF5b3V0LnNldFdpZHRoKSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dC53aWR0aCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgICAgIChpc0JvcmRlckJveCA/IGxheW91dC53aWR0aCArIHRoaXMuX2JvcmRlckxlZnQgKyB0aGlzLl9ib3JkZXJSaWdodCA6IGxheW91dC53aWR0aCkgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGxheW91dC53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0IGxheW91dFN0YXJ0IGV2ZW50LiBOb3RlIHRoYXQgdGhpcyBpcyBpbnRlbnRpb25hbGx5IGVtaXR0ZWQgYWZ0ZXIgdGhlXG4gICAgLy8gY29udGFpbmVyIGVsZW1lbnQncyBkaW1lbnNpb25zIGFyZSBzZXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlXG4gICAgLy8gbm8gaG9vayBmb3IgcmVhY3RpbmcgdG8gY29udGFpbmVyIGRpbWVuc2lvbiBjaGFuZ2VzLlxuICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRMYXlvdXRTdGFydCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRMYXlvdXRTdGFydCwgbGF5b3V0Lml0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgbGV0J3MgZmluaXNoIHF1aWNrbHkuXG4gICAgaWYgKCFpdGVtc0xlbmd0aCkge1xuICAgICAgdHJ5RmluaXNoKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgaXRlbXMgbGV0J3MgcG9zaXRpb24gdGhlbS5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IGxheW91dC5pdGVtc1tpXTtcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgcG9zaXRpb24uXG4gICAgICBpdGVtLl9sZWZ0ID0gbGF5b3V0LnNsb3RzW2kgKiAyXTtcbiAgICAgIGl0ZW0uX3RvcCA9IGxheW91dC5zbG90c1tpICogMiArIDFdO1xuXG4gICAgICAvLyBMYXlvdXQgaXRlbSBpZiBpdCBpcyBub3QgZHJhZ2dlZC5cbiAgICAgIGl0ZW0uaXNEcmFnZ2luZygpID8gdHJ5RmluaXNoKCkgOiBpdGVtLl9sYXlvdXQuc3RhcnQoaW5zdGFudCA9PT0gdHJ1ZSwgdHJ5RmluaXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIG5ldyBpdGVtcyBieSBwcm92aWRpbmcgdGhlIGVsZW1lbnRzIHlvdSB3aXNoIHRvIGFkZCB0byB0aGUgaW5zdGFuY2UgYW5kXG4gICAqIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGUgaW5kZXggd2hlcmUgeW91IHdhbnQgdGhlIGl0ZW1zIHRvIGJlIGluc2VydGVkIGludG8uXG4gICAqIEFsbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWxyZWFkeSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC4gSWYgYW4gZWxlbWVudCBoYXMgaXQncyBDU1NcbiAgICogZGlzcGxheSBwcm9wZXJ0eSBzZXQgdG8gXCJub25lXCIgaXQgd2lsbCBiZSBtYXJrZWQgYXMgaW5hY3RpdmUgZHVyaW5nIHRoZVxuICAgKiBpbml0aWF0aW9uIHByb2Nlc3MuIEFzIGxvbmcgYXMgdGhlIGl0ZW0gaXMgaW5hY3RpdmUgaXQgd2lsbCBub3QgYmUgcGFydCBvZlxuICAgKiB0aGUgbGF5b3V0LCBidXQgaXQgd2lsbCByZXRhaW4gaXQncyBpbmRleC4gWW91IGNhbiBhY3RpdmF0ZSBpdGVtcyBhdCBhbnlcbiAgICogcG9pbnQgd2l0aCBncmlkLnNob3coKSBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBjYWxsXG4gICAqIGdyaWQubGF5b3V0KCkgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGFkZGVkIGVsZW1lbnRzIGFyZSB2aXNpYmxlLiBJZiBvbmx5XG4gICAqIGhpZGRlbiBpdGVtcyBhcmUgYWRkZWQgbm8gbGF5b3V0IHdpbGwgYmUgY2FsbGVkLiBBbGwgdGhlIG5ldyB2aXNpYmxlIGl0ZW1zXG4gICAqIGFyZSBwb3NpdGlvbmVkIHdpdGhvdXQgYW5pbWF0aW9uIGR1cmluZyB0aGVpciBmaXJzdCBsYXlvdXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fEhUTUxFbGVtZW50W10pfSBlbGVtZW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbmRleD0tMV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pc0FjdGl2ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFlbGVtZW50cykgcmV0dXJuIFtdO1xuXG4gICAgdmFyIG5ld0l0ZW1zID0gdG9BcnJheShlbGVtZW50cyk7XG4gICAgaWYgKCFuZXdJdGVtcy5sZW5ndGgpIHJldHVybiBuZXdJdGVtcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIE1hcCBwcm92aWRlZCBlbGVtZW50cyBpbnRvIG5ldyBncmlkIGl0ZW1zLlxuICAgIGZvciAoaSA9IDA7IGkgPCBuZXdJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IG5ldyBJdGVtKHRoaXMsIG5ld0l0ZW1zW2ldLCBvcHRzLmlzQWN0aXZlKTtcbiAgICAgIG5ld0l0ZW1zW2ldID0gaXRlbTtcblxuICAgICAgLy8gSWYgdGhlIGl0ZW0gdG8gYmUgYWRkZWQgaXMgYWN0aXZlLCB3ZSBuZWVkIHRvIGRvIGEgbGF5b3V0LiBBbHNvLCB3ZVxuICAgICAgLy8gbmVlZCB0byBtYXJrIHRoZSBpdGVtIHdpdGggdGhlIHNraXBOZXh0QW5pbWF0aW9uIGZsYWcgdG8gbWFrZSBpdFxuICAgICAgLy8gcG9zaXRpb24gaW5zdGFudGx5ICh3aXRob3V0IGFuaW1hdGlvbikgZHVyaW5nIHRoZSBuZXh0IGxheW91dC4gV2l0aG91dFxuICAgICAgLy8gdGhlIGhhY2sgdGhlIGl0ZW0gd291bGQgYW5pbWF0ZSB0byBpdCdzIG5ldyBwb3NpdGlvbiBmcm9tIHRoZSBub3J0aHdlc3RcbiAgICAgIC8vIGNvcm5lciBvZiB0aGUgZ3JpZCwgd2hpY2ggZmVlbHMgYSBiaXQgYnVnZ3kgKGltaG8pLlxuICAgICAgaWYgKGl0ZW0uX2lzQWN0aXZlKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgICAgaXRlbS5fbGF5b3V0Ll9za2lwTmV4dEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBuZXcgaXRlbXMgdG8gdGhlIGl0ZW1zIGNvbGxlY3Rpb24gdG8gY29ycmVjdCBpbmRleC5cbiAgICBhcnJheUluc2VydChpdGVtcywgbmV3SXRlbXMsIG9wdHMuaW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhZGQgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2hhc0xpc3RlbmVycyhldmVudEFkZCkpIHtcbiAgICAgIHRoaXMuX2VtaXQoZXZlbnRBZGQsIG5ld0l0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgIGlmIChuZWVkc0xheW91dCAmJiBsYXlvdXQpIHtcbiAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3SXRlbXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZW1vdmVFbGVtZW50cz1mYWxzZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0l0ZW1bXX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgdmFyIHRhcmdldEl0ZW1zID0gdGhpcy5nZXRJdGVtcyhpdGVtcyk7XG4gICAgdmFyIGluZGljZXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFJlbW92ZSB0aGUgaW5kaXZpZHVhbCBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0YXJnZXRJdGVtc1tpXTtcbiAgICAgIGluZGljZXMucHVzaChhbGxJdGVtcy5pbmRleE9mKGl0ZW0pKTtcbiAgICAgIGlmIChpdGVtLl9pc0FjdGl2ZSkgbmVlZHNMYXlvdXQgPSB0cnVlO1xuICAgICAgaXRlbS5fZGVzdHJveShvcHRzLnJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHJlbW92ZSBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50UmVtb3ZlKSkge1xuICAgICAgdGhpcy5fZW1pdChldmVudFJlbW92ZSwgdGFyZ2V0SXRlbXMuc2xpY2UoMCksIGluZGljZXMpO1xuICAgIH1cblxuICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgaWYgKG5lZWRzTGF5b3V0ICYmIGxheW91dCkge1xuICAgICAgdGhpcy5sYXlvdXQobGF5b3V0ID09PSBpbnN0YW50TGF5b3V0LCBpc0Z1bmN0aW9uKGxheW91dCkgPyBsYXlvdXQgOiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRJdGVtcztcbiAgfTtcblxuICAvKipcbiAgICogU2hvdyBpbnN0YW5jZSBpdGVtcy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0ge1Nob3dDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLl9zZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsIHRydWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWRlIGluc3RhbmNlIGl0ZW1zLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRNdWx0aUl0ZW1RdWVyeX0gaXRlbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluc3RhbnQ9ZmFsc2VdXG4gICAqIEBwYXJhbSB7SGlkZUNhbGxiYWNrfSBbb3B0aW9ucy5vbkZpbmlzaF1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXQ9dHJ1ZV1cbiAgICogQHJldHVybnMge0dyaWR9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oaXRlbXMsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuX3NldEl0ZW1zVmlzaWJpbGl0eShpdGVtcywgZmFsc2UsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgaXRlbXMuIEV4cGVjdHMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LCBhIHByZWRpY2F0ZSwgd2hpY2ggc2hvdWxkIGJlXG4gICAqIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGZvciBldmVyeVxuICAgKiBpdGVtIGluIHRoZSBpbnN0YW5jZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlIGlzIHRydXRoeSB0aGVcbiAgICogaXRlbSBpbiBxdWVzdGlvbiB3aWxsIGJlIHNob3duIGFuZCBvdGhlcndpc2UgaGlkZGVuLiBUaGUgcHJlZGljYXRlIGNhbGxiYWNrXG4gICAqIHJlY2VpdmVzIHRoZSBpdGVtIGluc3RhbmNlIGFzIGl0J3MgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGUgaXMgYSBzdHJpbmdcbiAgICogaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIHNlbGVjdG9yIGFuZCBpdCBpcyBjaGVja2VkIGFnYWluc3QgZXZlcnkgaXRlbVxuICAgKiBlbGVtZW50IGluIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBuYXRpdmUgZWxlbWVudC5tYXRjaGVzKCkgbWV0aG9kLiBBbGwgdGhlXG4gICAqIG1hdGNoaW5nIGl0ZW1zIHdpbGwgYmUgc2hvd24gYW5kIG90aGVycyBoaWRkZW4uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufFN0cmluZyl9IHByZWRpY2F0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW5zdGFudD1mYWxzZV1cbiAgICogQHBhcmFtIHtGaWx0ZXJDYWxsYmFja30gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ocHJlZGljYXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICF0aGlzLl9pdGVtcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zVG9TaG93ID0gW107XG4gICAgdmFyIGl0ZW1zVG9IaWRlID0gW107XG4gICAgdmFyIGlzUHJlZGljYXRlU3RyaW5nID0gdHlwZW9mIHByZWRpY2F0ZSA9PT0gc3RyaW5nVHlwZTtcbiAgICB2YXIgaXNQcmVkaWNhdGVGbiA9IGlzRnVuY3Rpb24ocHJlZGljYXRlKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBsYXlvdXQgPSBvcHRzLmxheW91dCA/IG9wdHMubGF5b3V0IDogb3B0cy5sYXlvdXQgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgb25GaW5pc2ggPSBpc0Z1bmN0aW9uKG9wdHMub25GaW5pc2gpID8gb3B0cy5vbkZpbmlzaCA6IG51bGw7XG4gICAgdmFyIHRyeUZpbmlzaENvdW50ZXIgPSAtMTtcbiAgICB2YXIgdHJ5RmluaXNoID0gbm9vcDtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHdlIGhhdmUgb25GaW5pc2ggY2FsbGJhY2ssIGxldCdzIGNyZWF0ZSBwcm9wZXIgdHJ5RmluaXNoIGNhbGxiYWNrLlxuICAgIGlmIChvbkZpbmlzaCkge1xuICAgICAgdHJ5RmluaXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICsrdHJ5RmluaXNoQ291bnRlciAmJiBvbkZpbmlzaChpdGVtc1RvU2hvdy5zbGljZSgwKSwgaXRlbXNUb0hpZGUuc2xpY2UoMCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB3aGljaCBpdGVtcyBuZWVkIHRvIGJlIHNob3duIGFuZCB3aGljaCBoaWRkZW4uXG4gICAgaWYgKGlzUHJlZGljYXRlRm4gfHwgaXNQcmVkaWNhdGVTdHJpbmcpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVtID0gdGhpcy5faXRlbXNbaV07XG4gICAgICAgIGlmIChpc1ByZWRpY2F0ZUZuID8gcHJlZGljYXRlKGl0ZW0pIDogZWxlbWVudE1hdGNoZXMoaXRlbS5fZWxlbWVudCwgcHJlZGljYXRlKSkge1xuICAgICAgICAgIGl0ZW1zVG9TaG93LnB1c2goaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbXNUb0hpZGUucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3cgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvdyhpdGVtc1RvU2hvdywge1xuICAgICAgICBpbnN0YW50OiBpc0luc3RhbnQsXG4gICAgICAgIG9uRmluaXNoOiB0cnlGaW5pc2gsXG4gICAgICAgIGxheW91dDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnlGaW5pc2goKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBoaWRkZW4uXG4gICAgaWYgKGl0ZW1zVG9IaWRlLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWRlKGl0ZW1zVG9IaWRlLCB7XG4gICAgICAgIGluc3RhbnQ6IGlzSW5zdGFudCxcbiAgICAgICAgb25GaW5pc2g6IHRyeUZpbmlzaCxcbiAgICAgICAgbGF5b3V0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeUZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgaXRlbXMgdG8gZmlsdGVyLlxuICAgIGlmIChpdGVtc1RvU2hvdy5sZW5ndGggfHwgaXRlbXNUb0hpZGUubGVuZ3RoKSB7XG4gICAgICAvLyBFbWl0IGZpbHRlciBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoZXZlbnRGaWx0ZXIsIGl0ZW1zVG9TaG93LnNsaWNlKDApLCBpdGVtc1RvSGlkZS5zbGljZSgwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU29ydCBpdGVtcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc29ydCB0aGUgaXRlbXMuIFRoZSBmaXJzdCBpcyBzaW1wbHkgYnlcbiAgICogcHJvdmlkaW5nIGEgZnVuY3Rpb24gYXMgdGhlIGNvbXBhcmVyIHdoaWNoIHdvcmtzIGlkZW50aWNhbGx5IHRvIG5hdGl2ZVxuICAgKiBhcnJheSBzb3J0LiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc29ydCBieSB0aGUgc29ydCBkYXRhIHlvdSBoYXZlIHByb3ZpZGVkXG4gICAqIGluIHRoZSBpbnN0YW5jZSdzIG9wdGlvbnMuIEp1c3QgcHJvdmlkZSB0aGUgc29ydCBkYXRhIGtleShzKSBhcyBhIHN0cmluZ1xuICAgKiAoc2VwYXJhdGVkIGJ5IHNwYWNlKSBhbmQgdGhlIGl0ZW1zIHdpbGwgYmUgc29ydGVkIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICAgKiBzb3J0IGRhdGEga2V5cy4gTGFzdGx5IHlvdSBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBwcm92aWRlIGEgcHJlc29ydGVkXG4gICAqIGFycmF5IG9mIGl0ZW1zIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzeW5jIHRoZSBpbnRlcm5hbCBpdGVtcyBhcnJheSBpbiB0aGVcbiAgICogc2FtZSBvcmRlci5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258SXRlbVtdfFN0cmluZ3xTdHJpbmdbXSl9IGNvbXBhcmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZXNjZW5kaW5nPWZhbHNlXVxuICAgKiBAcGFyYW0geyhCb29sZWFufExheW91dENhbGxiYWNrfFN0cmluZyl9IFtvcHRpb25zLmxheW91dD10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNvcnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvcnRDb21wYXJlcjtcbiAgICB2YXIgaXNEZXNjZW5kaW5nO1xuICAgIHZhciBvcmlnSXRlbXM7XG4gICAgdmFyIGluZGV4TWFwO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VDcml0ZXJpYShkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnOicpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJbmRleE1hcChpdGVtcykge1xuICAgICAgdmFyIHJldCA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXRbaXRlbXNbaV0uX2lkXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBhcmVJbmRpY2VzKGl0ZW1BLCBpdGVtQikge1xuICAgICAgdmFyIGluZGV4QSA9IGluZGV4TWFwW2l0ZW1BLl9pZF07XG4gICAgICB2YXIgaW5kZXhCID0gaW5kZXhNYXBbaXRlbUIuX2lkXTtcbiAgICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyBpbmRleEIgLSBpbmRleEEgOiBpbmRleEEgLSBpbmRleEI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmVyKGEsIGIpIHtcbiAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgdmFyIGNyaXRlcmlhTmFtZTtcbiAgICAgIHZhciBjcml0ZXJpYU9yZGVyO1xuICAgICAgdmFyIHZhbEE7XG4gICAgICB2YXIgdmFsQjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsaXN0IG9mIHNvcnQgY3JpdGVyaWEuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRDb21wYXJlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIGNyaXRlcmlhIG5hbWUsIHdoaWNoIHNob3VsZCBtYXRjaCBhbiBpdGVtJ3Mgc29ydCBkYXRhIGtleS5cbiAgICAgICAgY3JpdGVyaWFOYW1lID0gc29ydENvbXBhcmVyW2ldWzBdO1xuICAgICAgICBjcml0ZXJpYU9yZGVyID0gc29ydENvbXBhcmVyW2ldWzFdO1xuXG4gICAgICAgIC8vIEdldCBpdGVtcycgY2FjaGVkIHNvcnQgdmFsdWVzIGZvciB0aGUgY3JpdGVyaWEuIElmIHRoZSBpdGVtIGhhcyBubyBzb3J0XG4gICAgICAgIC8vIGRhdGEgbGV0J3MgdXBkYXRlIHRoZSBpdGVtcyBzb3J0IGRhdGEgKHRoaXMgaXMgYSBsYXp5IGxvYWQgbWVjaGFuaXNtKS5cbiAgICAgICAgdmFsQSA9IChhLl9zb3J0RGF0YSA/IGEgOiBhLl9yZWZyZXNoU29ydERhdGEoKSkuX3NvcnREYXRhW2NyaXRlcmlhTmFtZV07XG4gICAgICAgIHZhbEIgPSAoYi5fc29ydERhdGEgPyBiIDogYi5fcmVmcmVzaFNvcnREYXRhKCkpLl9zb3J0RGF0YVtjcml0ZXJpYU5hbWVdO1xuXG4gICAgICAgIC8vIFNvcnQgdGhlIGl0ZW1zIGluIGRlc2NlbmRpbmcgb3JkZXIgaWYgZGVmaW5lZCBzbyBleHBsaWNpdGx5LiBPdGhlcndpc2VcbiAgICAgICAgLy8gc29ydCBpdGVtcyBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgIGlmIChjcml0ZXJpYU9yZGVyID09PSAnZGVzYycgfHwgKCFjcml0ZXJpYU9yZGVyICYmIGlzRGVzY2VuZGluZykpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxCIDwgdmFsQSA/IC0xIDogdmFsQiA+IHZhbEEgPyAxIDogMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWxBIDwgdmFsQiA/IC0xIDogdmFsQSA+IHZhbEIgPyAxIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgLTEgb3IgMSBhcyB0aGUgcmV0dXJuIHZhbHVlLCBsZXQncyByZXR1cm4gaXQgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHZhbHVlcyBhcmUgZXF1YWwgbGV0J3MgY29tcGFyZSB0aGUgaXRlbSBpbmRpY2VzIHRvIG1ha2Ugc3VyZSB3ZVxuICAgICAgLy8gaGF2ZSBhIHN0YWJsZSBzb3J0LlxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFpbmRleE1hcCkgaW5kZXhNYXAgPSBnZXRJbmRleE1hcChvcmlnSXRlbXMpO1xuICAgICAgICByZXN1bHQgPSBjb21wYXJlSW5kaWNlcyhhLCBiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VzdG9tQ29tcGFyZXIoYSwgYikge1xuICAgICAgdmFyIHJlc3VsdCA9IHNvcnRDb21wYXJlcihhLCBiKTtcbiAgICAgIC8vIElmIGRlc2NlbmRpbmcgbGV0J3MgaW52ZXJ0IHRoZSByZXN1bHQgdmFsdWUuXG4gICAgICBpZiAoaXNEZXNjZW5kaW5nICYmIHJlc3VsdCkgcmVzdWx0ID0gLXJlc3VsdDtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCByZXN1bHQgKG5vdCB6ZXJvKSBsZXQncyByZXR1cm4gaXQgcmlnaHQgYXdheS5cbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAvLyBJZiByZXN1bHQgaXMgemVybyBsZXQncyBjb21wYXJlIHRoZSBpdGVtIGluZGljZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYVxuICAgICAgLy8gc3RhYmxlIHNvcnQuXG4gICAgICBpZiAoIWluZGV4TWFwKSBpbmRleE1hcCA9IGdldEluZGV4TWFwKG9yaWdJdGVtcyk7XG4gICAgICByZXR1cm4gY29tcGFyZUluZGljZXMoYSwgYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBhcmVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgdGhpcy5faXRlbXMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXM7XG5cbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1zO1xuICAgICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgICB2YXIgbGF5b3V0ID0gb3B0cy5sYXlvdXQgPyBvcHRzLmxheW91dCA6IG9wdHMubGF5b3V0ID09PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgaTtcblxuICAgICAgLy8gU2V0dXAgcGFyZW50IHNjb3BlIGRhdGEuXG4gICAgICBzb3J0Q29tcGFyZXIgPSBjb21wYXJlcjtcbiAgICAgIGlzRGVzY2VuZGluZyA9ICEhb3B0cy5kZXNjZW5kaW5nO1xuICAgICAgb3JpZ0l0ZW1zID0gaXRlbXMuc2xpY2UoMCk7XG4gICAgICBpbmRleE1hcCA9IG51bGw7XG5cbiAgICAgIC8vIElmIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGRvIGEgbmF0aXZlIGFycmF5IHNvcnQuXG4gICAgICBpZiAoaXNGdW5jdGlvbihzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGl0ZW1zLnNvcnQoY3VzdG9tQ29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhIHN0cmluZywgbGV0J3Mgc29ydCBieSB0aGUgc29ydCBkYXRhIGFzIHByb3ZpZGVkIGluXG4gICAgICAvLyB0aGUgaW5zdGFuY2UncyBvcHRpb25zLlxuICAgICAgZWxzZSBpZiAodHlwZW9mIHNvcnRDb21wYXJlciA9PT0gc3RyaW5nVHlwZSkge1xuICAgICAgICBzb3J0Q29tcGFyZXIgPSBwYXJzZUNyaXRlcmlhKGNvbXBhcmVyKTtcbiAgICAgICAgaXRlbXMuc29ydChkZWZhdWx0Q29tcGFyZXIpO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlIGlmIHdlIGdvdCBhbiBhcnJheSwgbGV0J3MgYXNzdW1lIGl0J3MgYSBwcmVzb3J0ZWQgYXJyYXkgb2YgdGhlXG4gICAgICAvLyBpdGVtcyBhbmQgb3JkZXIgdGhlIGl0ZW1zIGJhc2VkIG9uIGl0LlxuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3J0Q29tcGFyZXIpKSB7XG4gICAgICAgIGlmIChzb3J0Q29tcGFyZXIubGVuZ3RoICE9PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1snICsgbmFtZXNwYWNlICsgJ10gc29ydCByZWZlcmVuY2UgaXRlbXMgZG8gbm90IG1hdGNoIHdpdGggZ3JpZCBpdGVtcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoc29ydENvbXBhcmVyLmluZGV4T2YoaXRlbXNbaV0pIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbJyArIG5hbWVzcGFjZSArICddIHNvcnQgcmVmZXJlbmNlIGl0ZW1zIGRvIG5vdCBtYXRjaCB3aXRoIGdyaWQgaXRlbXMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGl0ZW1zW2ldID0gc29ydENvbXBhcmVyW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rlc2NlbmRpbmcpIGl0ZW1zLnJldmVyc2UoKTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBsZXQncyBqdXN0IHNraXAgaXQsIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLyoqIEB0b2RvIE1heWJlIHRocm93IGFuIGVycm9yIGhlcmU/ICovXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHNvcnQgZXZlbnQuXG4gICAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKGV2ZW50U29ydCkpIHtcbiAgICAgICAgdGhpcy5fZW1pdChldmVudFNvcnQsIGl0ZW1zLnNsaWNlKDApLCBvcmlnSXRlbXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBsYXlvdXQgaXMgbmVlZGVkLlxuICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIE1vdmUgaXRlbSB0byBhbm90aGVyIGluZGV4IG9yIGluIHBsYWNlIG9mIGFub3RoZXIgaXRlbS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZFNpbmdsZUl0ZW1RdWVyeX0gcG9zaXRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYWN0aW9uPVwibW92ZVwiXVxuICAgKiAgIC0gQWNjZXB0cyBlaXRoZXIgXCJtb3ZlXCIgb3IgXCJzd2FwXCIuXG4gICAqICAgLSBcIm1vdmVcIiBtb3ZlcyB0aGUgaXRlbSBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgaXRlbS5cbiAgICogICAtIFwic3dhcFwiIHN3YXBzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbXMuXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqIEByZXR1cm5zIHtHcmlkfVxuICAgKi9cbiAgR3JpZC5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKGl0ZW0sIHBvc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2l0ZW1zLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IDA7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBpc1N3YXAgPSBvcHRzLmFjdGlvbiA9PT0gYWN0aW9uU3dhcDtcbiAgICB2YXIgYWN0aW9uID0gaXNTd2FwID8gYWN0aW9uU3dhcCA6IGFjdGlvbk1vdmU7XG4gICAgdmFyIGZyb21JdGVtID0gdGhpcy5fZ2V0SXRlbShpdGVtKTtcbiAgICB2YXIgdG9JdGVtID0gdGhpcy5fZ2V0SXRlbShwb3NpdGlvbik7XG4gICAgdmFyIGZyb21JbmRleDtcbiAgICB2YXIgdG9JbmRleDtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbXMgZXhpc3QgYW5kIGFyZSBub3QgdGhlIHNhbWUuXG4gICAgaWYgKGZyb21JdGVtICYmIHRvSXRlbSAmJiBmcm9tSXRlbSAhPT0gdG9JdGVtKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGljZXMgb2YgdGhlIGl0ZW1zLlxuICAgICAgZnJvbUluZGV4ID0gaXRlbXMuaW5kZXhPZihmcm9tSXRlbSk7XG4gICAgICB0b0luZGV4ID0gaXRlbXMuaW5kZXhPZih0b0l0ZW0pO1xuXG4gICAgICAvLyBEbyB0aGUgbW92ZS9zd2FwLlxuICAgICAgaWYgKGlzU3dhcCkge1xuICAgICAgICBhcnJheVN3YXAoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheU1vdmUoaXRlbXMsIGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgbW92ZSBldmVudC5cbiAgICAgIGlmICh0aGlzLl9oYXNMaXN0ZW5lcnMoZXZlbnRNb3ZlKSkge1xuICAgICAgICB0aGlzLl9lbWl0KGV2ZW50TW92ZSwge1xuICAgICAgICAgIGl0ZW06IGZyb21JdGVtLFxuICAgICAgICAgIGZyb21JbmRleDogZnJvbUluZGV4LFxuICAgICAgICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBpcyBuZWVkZWQuXG4gICAgICBpZiAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0KGxheW91dCA9PT0gaW5zdGFudExheW91dCwgaXNGdW5jdGlvbihsYXlvdXQpID8gbGF5b3V0IDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2VuZCBpdGVtIHRvIGFub3RoZXIgR3JpZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkU2luZ2xlSXRlbVF1ZXJ5fSBpdGVtXG4gICAqIEBwYXJhbSB7R3JpZH0gZ3JpZFxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuYXBwZW5kVG89ZG9jdW1lbnQuYm9keV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRTZW5kZXI9dHJ1ZV1cbiAgICogQHBhcmFtIHsoQm9vbGVhbnxMYXlvdXRDYWxsYmFja3xTdHJpbmcpfSBbb3B0aW9ucy5sYXlvdXRSZWNlaXZlcj10cnVlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihpdGVtLCBncmlkLCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCBncmlkLl9pc0Rlc3Ryb3llZCB8fCB0aGlzID09PSBncmlkKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgdGFyZ2V0IGl0ZW0uXG4gICAgaXRlbSA9IHRoaXMuX2dldEl0ZW0oaXRlbSk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCAwO1xuICAgIHZhciBjb250YWluZXIgPSBvcHRzLmFwcGVuZFRvIHx8IHdpbmRvdy5kb2N1bWVudC5ib2R5O1xuICAgIHZhciBsYXlvdXRTZW5kZXIgPSBvcHRzLmxheW91dFNlbmRlciA/IG9wdHMubGF5b3V0U2VuZGVyIDogb3B0cy5sYXlvdXRTZW5kZXIgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbGF5b3V0UmVjZWl2ZXIgPSBvcHRzLmxheW91dFJlY2VpdmVyXG4gICAgICA/IG9wdHMubGF5b3V0UmVjZWl2ZXJcbiAgICAgIDogb3B0cy5sYXlvdXRSZWNlaXZlciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gU3RhcnQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLlxuICAgIGl0ZW0uX21pZ3JhdGUuc3RhcnQoZ3JpZCwgcG9zaXRpb24sIGNvbnRhaW5lcik7XG5cbiAgICAvLyBJZiBtaWdyYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgaXRlbSBpcyBhY3RpdmUsIGxldCdzIGxheW91dFxuICAgIC8vIHRoZSBncmlkcy5cbiAgICBpZiAoaXRlbS5fbWlncmF0ZS5faXNBY3RpdmUgJiYgaXRlbS5faXNBY3RpdmUpIHtcbiAgICAgIGlmIChsYXlvdXRTZW5kZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQoXG4gICAgICAgICAgbGF5b3V0U2VuZGVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0U2VuZGVyKSA/IGxheW91dFNlbmRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGxheW91dFJlY2VpdmVyKSB7XG4gICAgICAgIGdyaWQubGF5b3V0KFxuICAgICAgICAgIGxheW91dFJlY2VpdmVyID09PSBpbnN0YW50TGF5b3V0LFxuICAgICAgICAgIGlzRnVuY3Rpb24obGF5b3V0UmVjZWl2ZXIpID8gbGF5b3V0UmVjZWl2ZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZUVsZW1lbnRzPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7R3JpZH1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihyZW1vdmVFbGVtZW50cykge1xuICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZWxlbWVudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtcy5zbGljZSgwKTtcbiAgICB2YXIgaTtcblxuICAgIC8vIFVuYmluZCB3aW5kb3cgcmVzaXplIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICh0aGlzLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBpdGVtcy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLl9kZXN0cm95KHJlbW92ZUVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGNvbnRhaW5lci5cbiAgICByZW1vdmVDbGFzcyhjb250YWluZXIsIHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lckNsYXNzKTtcbiAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJyc7XG5cbiAgICAvLyBFbWl0IGRlc3Ryb3kgZXZlbnQgYW5kIHVuYmluZCBhbGwgZXZlbnRzLlxuICAgIHRoaXMuX2VtaXQoZXZlbnREZXN0cm95KTtcbiAgICB0aGlzLl9lbWl0dGVyLmRlc3Ryb3koKTtcblxuICAgIC8vIFJlbW92ZSByZWZlcmVuY2UgZnJvbSB0aGUgZ3JpZCBpbnN0YW5jZXMgY29sbGVjdGlvbi5cbiAgICBncmlkSW5zdGFuY2VzW3RoaXMuX2lkXSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEZsYWcgaW5zdGFuY2UgYXMgZGVzdHJveWVkLlxuICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHByb3RvdHlwZSBtZXRob2RzXG4gICAqICoqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCBpbnN0YW5jZSdzIGl0ZW0gYnkgZWxlbWVudCBvciBieSBpbmRleC4gVGFyZ2V0IGNhbiBhbHNvIGJlIGFuIEl0ZW1cbiAgICogaW5zdGFuY2UgaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgaXRlbSBpZiBpdCBleGlzdHMgd2l0aGluXG4gICAqIHJlbGF0ZWQgR3JpZCBpbnN0YW5jZS4gSWYgbm90aGluZyBpcyBmb3VuZCB3aXRoIHRoZSBwcm92aWRlZCB0YXJnZXQsIG51bGxcbiAgICogaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge0dyaWRTaW5nbGVJdGVtUXVlcnl9IFt0YXJnZXRdXG4gICAqIEByZXR1cm5zIHs/SXRlbX1cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9nZXRJdGVtID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgLy8gSWYgbm8gdGFyZ2V0IGlzIHNwZWNpZmllZCBvciB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLCByZXR1cm4gbnVsbC5cbiAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgKCF0YXJnZXQgJiYgdGFyZ2V0ICE9PSAwKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGFyZ2V0IGlzIG51bWJlciByZXR1cm4gdGhlIGl0ZW0gaW4gdGhhdCBpbmRleC4gSWYgdGhlIG51bWJlciBpcyBsb3dlclxuICAgIC8vIHRoYW4gemVybyBsb29rIGZvciB0aGUgaXRlbSBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIGl0ZW1zIGFycmF5LiBGb3JcbiAgICAvLyBleGFtcGxlIC0xIGZvciB0aGUgbGFzdCBpdGVtLCAtMiBmb3IgdGhlIHNlY29uZCBsYXN0IGl0ZW0sIGV0Yy5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gbnVtYmVyVHlwZSQxKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXNbdGFyZ2V0ID4gLTEgPyB0YXJnZXQgOiB0aGlzLl9pdGVtcy5sZW5ndGggKyB0YXJnZXRdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBpcyBhbiBpbnN0YW5jZSBvZiBJdGVtIHJldHVybiBpdCBpZiBpdCBpcyBhdHRhY2hlZCB0byB0aGlzXG4gICAgLy8gR3JpZCBpbnN0YW5jZSwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJdGVtKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Ll9ncmlkSWQgPT09IHRoaXMuX2lkID8gdGFyZ2V0IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJbiBvdGhlciBjYXNlcyBsZXQncyBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzIGFuIGVsZW1lbnQsIHNvIGxldCdzIHRyeVxuICAgIC8vIHRvIGZpbmQgYW4gaXRlbSB0aGF0IG1hdGNoZXMgdGhlIGVsZW1lbnQgYW5kIHJldHVybiBpdC4gSWYgaXRlbSBpcyBub3RcbiAgICAvLyBmb3VuZCByZXR1cm4gbnVsbC5cbiAgICAvKiogQHRvZG8gVGhpcyBjb3VsZCBiZSBtYWRlIGEgbG90IGZhc3RlciBieSB1c2luZyBNYXAvV2Vha01hcCBvZiBlbGVtZW50cy4gKi9cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2VsZW1lbnQgPT09IHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBpbnN0YW5jZSdzIGxheW91dCBkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHJldHVybnMge0xheW91dERhdGF9XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuX2xheW91dDtcbiAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5sYXlvdXQ7XG4gICAgdmFyIHdpZHRoO1xuICAgIHZhciBoZWlnaHQ7XG4gICAgdmFyIG5ld0xheW91dDtcbiAgICB2YXIgaTtcblxuICAgIC8vIExldCdzIGluY3JlbWVudCBsYXlvdXQgaWQuXG4gICAgKytsYXlvdXQuaWQ7XG5cbiAgICAvLyBMZXQncyB1cGRhdGUgbGF5b3V0IGl0ZW1zXG4gICAgbGF5b3V0Lml0ZW1zLmxlbmd0aCA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5faXRlbXNbaV0uX2lzQWN0aXZlKSBsYXlvdXQuaXRlbXMucHVzaCh0aGlzLl9pdGVtc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gTGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgdGhpcy5fcmVmcmVzaERpbWVuc2lvbnMoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjb250YWluZXIgd2lkdGggYW5kIGhlaWdodCAod2l0aG91dCBib3JkZXJzKS5cbiAgICB3aWR0aCA9IHRoaXMuX3dpZHRoIC0gdGhpcy5fYm9yZGVyTGVmdCAtIHRoaXMuX2JvcmRlclJpZ2h0O1xuICAgIGhlaWdodCA9IHRoaXMuX2hlaWdodCAtIHRoaXMuX2JvcmRlclRvcCAtIHRoaXMuX2JvcmRlckJvdHRvbTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgbGF5b3V0LlxuICAgIGlmIChpc0Z1bmN0aW9uKHNldHRpbmdzKSkge1xuICAgICAgbmV3TGF5b3V0ID0gc2V0dGluZ3MobGF5b3V0Lml0ZW1zLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5b3V0ID0gcGFja2VyLmdldExheW91dChsYXlvdXQuaXRlbXMsIHdpZHRoLCBoZWlnaHQsIGxheW91dC5zbG90cywgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8vIExldCdzIHVwZGF0ZSB0aGUgZ3JpZCdzIGxheW91dC5cbiAgICBsYXlvdXQuc2xvdHMgPSBuZXdMYXlvdXQuc2xvdHM7XG4gICAgbGF5b3V0LnNldFdpZHRoID0gQm9vbGVhbihuZXdMYXlvdXQuc2V0V2lkdGgpO1xuICAgIGxheW91dC5zZXRIZWlnaHQgPSBCb29sZWFuKG5ld0xheW91dC5zZXRIZWlnaHQpO1xuICAgIGxheW91dC53aWR0aCA9IG5ld0xheW91dC53aWR0aDtcbiAgICBsYXlvdXQuaGVpZ2h0ID0gbmV3TGF5b3V0LmhlaWdodDtcblxuICAgIHJldHVybiBsYXlvdXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBncmlkIGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7Li4uKn0gW2FyZ11cbiAgICovXG4gIEdyaWQucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5fZW1pdHRlci5lbWl0LmFwcGx5KHRoaXMuX2VtaXR0ZXIsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZXZlbnRzIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJvZiBHcmlkLnByb3RvdHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5faGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZW1pdHRlci5fZXZlbnRzW2V2ZW50XTtcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVycy5sZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29udGFpbmVyJ3Mgd2lkdGgsIGhlaWdodCBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLl93aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgdGhpcy5faGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgdGhpcy5fbGVmdCA9IHJlY3QubGVmdDtcbiAgICB0aGlzLl90b3AgPSByZWN0LnRvcDtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRhaW5lcidzIGJvcmRlciBzaXplcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGVmdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJpZ2h0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9wXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm90dG9tXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fdXBkYXRlQm9yZGVycyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAobGVmdCkgdGhpcy5fYm9yZGVyTGVmdCA9IGdldFN0eWxlQXNGbG9hdChlbGVtZW50LCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICBpZiAocmlnaHQpIHRoaXMuX2JvcmRlclJpZ2h0ID0gZ2V0U3R5bGVBc0Zsb2F0KGVsZW1lbnQsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgICBpZiAodG9wKSB0aGlzLl9ib3JkZXJUb3AgPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICBpZiAoYm90dG9tKSB0aGlzLl9ib3JkZXJCb3R0b20gPSBnZXRTdHlsZUFzRmxvYXQoZWxlbWVudCwgJ2JvcmRlci1ib3R0b20td2lkdGgnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVmcmVzaCBhbGwgb2YgY29udGFpbmVyJ3MgaW50ZXJuYWwgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlcm9mIEdyaWQucHJvdG90eXBlXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fcmVmcmVzaERpbWVuc2lvbnMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl91cGRhdGVCb3VuZGluZ1JlY3QoKTtcbiAgICB0aGlzLl91cGRhdGVCb3JkZXJzKDEsIDEsIDEsIDEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgR3JpZCBpbnN0YW5jZSdzIGl0ZW1zLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgR3JpZC5wcm90b3R5cGVcbiAgICogQHBhcmFtIHtHcmlkTXVsdGlJdGVtUXVlcnl9IGl0ZW1zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9WaXNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnN0YW50PWZhbHNlXVxuICAgKiBAcGFyYW0geyhTaG93Q2FsbGJhY2t8SGlkZUNhbGxiYWNrKX0gW29wdGlvbnMub25GaW5pc2hdXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TGF5b3V0Q2FsbGJhY2t8U3RyaW5nKX0gW29wdGlvbnMubGF5b3V0PXRydWVdXG4gICAqL1xuICBHcmlkLnByb3RvdHlwZS5fc2V0SXRlbXNWaXNpYmlsaXR5ID0gZnVuY3Rpb24oaXRlbXMsIHRvVmlzaWJsZSwgb3B0aW9ucykge1xuICAgIHZhciBncmlkID0gdGhpcztcbiAgICB2YXIgdGFyZ2V0SXRlbXMgPSB0aGlzLmdldEl0ZW1zKGl0ZW1zKTtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwgMDtcbiAgICB2YXIgaXNJbnN0YW50ID0gb3B0cy5pbnN0YW50ID09PSB0cnVlO1xuICAgIHZhciBjYWxsYmFjayA9IG9wdHMub25GaW5pc2g7XG4gICAgdmFyIGxheW91dCA9IG9wdHMubGF5b3V0ID8gb3B0cy5sYXlvdXQgOiBvcHRzLmxheW91dCA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBjb3VudGVyID0gdGFyZ2V0SXRlbXMubGVuZ3RoO1xuICAgIHZhciBzdGFydEV2ZW50ID0gdG9WaXNpYmxlID8gZXZlbnRTaG93U3RhcnQgOiBldmVudEhpZGVTdGFydDtcbiAgICB2YXIgZW5kRXZlbnQgPSB0b1Zpc2libGUgPyBldmVudFNob3dFbmQgOiBldmVudEhpZGVFbmQ7XG4gICAgdmFyIG1ldGhvZCA9IHRvVmlzaWJsZSA/ICdzaG93JyA6ICdoaWRlJztcbiAgICB2YXIgbmVlZHNMYXlvdXQgPSBmYWxzZTtcbiAgICB2YXIgY29tcGxldGVkSXRlbXMgPSBbXTtcbiAgICB2YXIgaGlkZGVuSXRlbXMgPSBbXTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBjYWxsIHRoZSBjYWxsYmFjaywgYnV0IGRvbid0IGVtaXQgYW55IGV2ZW50cy5cbiAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2sodGFyZ2V0SXRlbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVtaXQgc2hvd1N0YXJ0L2hpZGVTdGFydCBldmVudC5cbiAgICBpZiAodGhpcy5faGFzTGlzdGVuZXJzKHN0YXJ0RXZlbnQpKSB7XG4gICAgICB0aGlzLl9lbWl0KHN0YXJ0RXZlbnQsIHRhcmdldEl0ZW1zLnNsaWNlKDApKTtcbiAgICB9XG5cbiAgICAvLyBTaG93L2hpZGUgaXRlbXMuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhcmdldEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gdGFyZ2V0SXRlbXNbaV07XG5cbiAgICAgIC8vIElmIGluYWN0aXZlIGl0ZW0gaXMgc2hvd24gb3IgYWN0aXZlIGl0ZW0gaXMgaGlkZGVuIHdlIG5lZWQgdG8gZG9cbiAgICAgIC8vIGxheW91dC5cbiAgICAgIGlmICgodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkgfHwgKCF0b1Zpc2libGUgJiYgaXRlbS5faXNBY3RpdmUpKSB7XG4gICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaW5hY3RpdmUgaXRlbSBpcyBzaG93biB3ZSBhbHNvIG5lZWQgdG8gZG8gYSBsaXR0bGUgaGFjayB0byBtYWtlIHRoZVxuICAgICAgLy8gaXRlbSBub3QgYW5pbWF0ZSBpdCdzIG5leHQgcG9zaXRpb25pbmcgKGxheW91dCkuXG4gICAgICBpZiAodG9WaXNpYmxlICYmICFpdGVtLl9pc0FjdGl2ZSkge1xuICAgICAgICBpdGVtLl9sYXlvdXQuX3NraXBOZXh0QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSBoaWRkZW4gaXRlbSBpcyBiZWluZyBzaG93biB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGl0ZW0nc1xuICAgICAgLy8gZGltZW5zaW9ucy5cbiAgICAgIGlmICh0b1Zpc2libGUgJiYgaXRlbS5fdmlzaWJpbGl0eS5faXNIaWRkZW4pIHtcbiAgICAgICAgaGlkZGVuSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdy9oaWRlIHRoZSBpdGVtLlxuICAgICAgaXRlbS5fdmlzaWJpbGl0eVttZXRob2RdKGlzSW5zdGFudCwgZnVuY3Rpb24oaW50ZXJydXB0ZWQsIGl0ZW0pIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaXRlbSdzIGFuaW1hdGlvbiB3YXMgbm90IGludGVycnVwdGVkIGFkZCBpdCB0byB0aGVcbiAgICAgICAgLy8gY29tcGxldGVkSXRlbXMgYXJyYXkuXG4gICAgICAgIGlmICghaW50ZXJydXB0ZWQpIGNvbXBsZXRlZEl0ZW1zLnB1c2goaXRlbSk7XG5cbiAgICAgICAgLy8gSWYgYWxsIGl0ZW1zIGhhdmUgZmluaXNoZWQgdGhlaXIgYW5pbWF0aW9ucyBjYWxsIHRoZSBjYWxsYmFja1xuICAgICAgICAvLyBhbmQgZW1pdCBzaG93RW5kL2hpZGVFbmQgZXZlbnQuXG4gICAgICAgIGlmICgtLWNvdW50ZXIgPCAxKSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSBjYWxsYmFjayhjb21wbGV0ZWRJdGVtcy5zbGljZSgwKSk7XG4gICAgICAgICAgaWYgKGdyaWQuX2hhc0xpc3RlbmVycyhlbmRFdmVudCkpIGdyaWQuX2VtaXQoZW5kRXZlbnQsIGNvbXBsZXRlZEl0ZW1zLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBoaWRkZW4gaXRlbXMuXG4gICAgaWYgKGhpZGRlbkl0ZW1zLmxlbmd0aCkgdGhpcy5yZWZyZXNoSXRlbXMoaGlkZGVuSXRlbXMpO1xuXG4gICAgLy8gTGF5b3V0IGlmIG5lZWRlZC5cbiAgICBpZiAobmVlZHNMYXlvdXQgJiYgbGF5b3V0KSB7XG4gICAgICB0aGlzLmxheW91dChsYXlvdXQgPT09IGluc3RhbnRMYXlvdXQsIGlzRnVuY3Rpb24obGF5b3V0KSA/IGxheW91dCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGhlbHBlcnNcbiAgICogKioqKioqKioqKioqKioqXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXJnZSBkZWZhdWx0IHNldHRpbmdzIHdpdGggdXNlciBzZXR0aW5ncy4gVGhlIHJldHVybmVkIG9iamVjdCBpcyBhIG5ld1xuICAgKiBvYmplY3Qgd2l0aCBtZXJnZWQgdmFsdWVzLiBUaGUgbWVyZ2luZyBpcyBhIGRlZXAgbWVyZ2UgbWVhbmluZyB0aGF0IGFsbFxuICAgKiBvYmplY3RzIGFuZCBhcnJheXMgd2l0aGluIHRoZSBwcm92aWRlZCBzZXR0aW5ncyBvYmplY3RzIHdpbGwgYmUgYWxzbyBtZXJnZWRcbiAgICogc28gdGhhdCBtb2RpZnlpbmcgdGhlIHZhbHVlcyBvZiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgaGF2ZSBubyBlZmZlY3Qgb25cbiAgICogdGhlIHJldHVybmVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRTZXR0aW5nc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW3VzZXJTZXR0aW5nc11cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIG5ldyBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZVNldHRpbmdzKGRlZmF1bHRTZXR0aW5ncywgdXNlclNldHRpbmdzKSB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggY29weSBvZiBkZWZhdWx0IHNldHRpbmdzLlxuICAgIHZhciByZXQgPSBtZXJnZU9iamVjdHMoe30sIGRlZmF1bHRTZXR0aW5ncyk7XG5cbiAgICAvLyBNZXJnZSB1c2VyIHNldHRpbmdzIHRvIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgaWYgKHVzZXJTZXR0aW5ncykge1xuICAgICAgcmV0ID0gbWVyZ2VPYmplY3RzKHJldCwgdXNlclNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdmlzaWJsZS9oaWRkZW4gc3R5bGVzIG1hbnVhbGx5IHNvIHRoYXQgdGhlIHdob2xlIG9iamVjdCBpc1xuICAgIC8vIG92ZXJyaWRkZW4gaW5zdGVhZCBvZiB0aGUgcHJvcHMuXG4gICAgcmV0LnZpc2libGVTdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLnZpc2libGVTdHlsZXMgfHwgKGRlZmF1bHRTZXR0aW5ncyB8fCAwKS52aXNpYmxlU3R5bGVzO1xuICAgIHJldC5oaWRkZW5TdHlsZXMgPSAodXNlclNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcyB8fCAoZGVmYXVsdFNldHRpbmdzIHx8IDApLmhpZGRlblN0eWxlcztcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgdHdvIG9iamVjdHMgcmVjdXJzaXZlbHkgKGRlZXAgbWVyZ2UpLiBUaGUgc291cmNlIG9iamVjdCdzIHByb3BlcnRpZXNcbiAgICogYXJlIG1lcmdlZCB0byB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiAgIC0gVGhlIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VcbiAgICogICAtIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKHRhcmdldCwgc291cmNlKSB7XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDtcbiAgICB2YXIgaXNTb3VyY2VPYmplY3Q7XG4gICAgdmFyIHByb3BOYW1lO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9wTmFtZSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpc1NvdXJjZU9iamVjdCA9IGlzUGxhaW5PYmplY3Qoc291cmNlW3Byb3BOYW1lXSk7XG5cbiAgICAgIC8vIElmIHRhcmdldCBhbmQgc291cmNlIHZhbHVlcyBhcmUgYm90aCBvYmplY3RzLCBtZXJnZSB0aGUgb2JqZWN0cyBhbmRcbiAgICAgIC8vIGFzc2lnbiB0aGUgbWVyZ2VkIHZhbHVlIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRbcHJvcE5hbWVdKSAmJiBpc1NvdXJjZU9iamVjdCkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gbWVyZ2VPYmplY3RzKG1lcmdlT2JqZWN0cyh7fSwgdGFyZ2V0W3Byb3BOYW1lXSksIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgb2JqZWN0IGFuZCB0YXJnZXQncyBpcyBub3QgbGV0J3MgY2xvbmUgdGhlIG9iamVjdCBhc1xuICAgICAgLy8gdGhlIHRhcmdldCdzIHZhbHVlLlxuICAgICAgaWYgKGlzU291cmNlT2JqZWN0KSB7XG4gICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBtZXJnZU9iamVjdHMoe30sIHNvdXJjZVtwcm9wTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgc291cmNlJ3MgdmFsdWUgaXMgYW4gYXJyYXkgbGV0J3MgY2xvbmUgdGhlIGFycmF5IGFzIHRoZSB0YXJnZXQnc1xuICAgICAgLy8gdmFsdWUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VbcHJvcE5hbWVdKSkge1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXS5zbGljZSgwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGFsbCBvdGhlciBjYXNlcyBsZXQncyBqdXN0IGRpcmVjdGx5IGFzc2lnbiB0aGUgc291cmNlJ3MgdmFsdWUgYXMgdGhlXG4gICAgICAvLyB0YXJnZXQncyB2YWx1ZS5cbiAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gR3JpZDtcblxufSkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEl0ZW1WYWx1ZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXJcbiAgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZVxuICBpbXBsZW1lbnRzIElWaXN1YWxpemVyV2l0aFNlbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdmlzdWFsaXplcnM6IEFycmF5PFZpc3VhbGl6ZXJCYXNlPixcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0XG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zKTtcbiAgICBpZiAoIXZpc3VhbGl6ZXJzIHx8IHZpc3VhbGl6ZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJWaXN1YWxpemVyQXJyYXlXcmFwcGVyIHdvcmtzIHdpdGggdmlzdWFsaXplcnMgY29sbGVjdGlvbiBvbmx5LlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICBpZiAodmlzdWFsaXplci5zdXBwb3J0U2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N1cHBvcnRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzV2l0aFNlbGVjdGlvbi5wdXNoKFxuICAgICAgICAgIDxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+KDxhbnk+dmlzdWFsaXplcilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZVZpc3VhbGl6ZXJcIiwgKCkgPT5cbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICB0aGlzLnZpc3VhbGl6ZXJzLm1hcCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdmlzdWFsaXplci5uYW1lLFxuICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZpc3VhbGl6ZXJfXCIgKyB2aXN1YWxpemVyLm5hbWUpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IHRoaXMudmlzdWFsaXplci5uYW1lID09PSBvcHRpb24udmFsdWUsXG4gICAgICAgIChlOiBhbnkpID0+IHRoaXMuc2V0VmlzdWFsaXplcihlLnRhcmdldC52YWx1ZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy52aXN1YWxpemVyID0gdmlzdWFsaXplcnNbMF07XG4gICAgdGhpcy52aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmlzdWFsaXplckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxpemVycygpIHtcbiAgICByZXR1cm4gdGhpcy52aXN1YWxpemVycztcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsaXplcnNXaXRoU2VsZWN0aW9uOiBBcnJheTxJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24+ID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWU7XG4gIHByaXZhdGUgdmlzdWFsaXplcjogVmlzdWFsaXplckJhc2U7XG5cbiAgcHJpdmF0ZSBvbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwcml2YXRlIHNldFZpc3VhbGl6ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy52aXN1YWxpemVyKSB7XG4gICAgICB0aGlzLnZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUoXG4gICAgICAgIHRoaXMub25BZnRlclZpc3VhbGl6ZXJSZW5kZXJDYWxsYmFja1xuICAgICAgKTtcbiAgICAgIHRoaXMudmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMudmlzdWFsaXplciA9IHRoaXMudmlzdWFsaXplcnMuZmlsdGVyKCh2KSA9PiB2Lm5hbWUgPT09IG5hbWUpWzBdO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMudmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uQWZ0ZXJWaXN1YWxpemVyUmVuZGVyQ2FsbGJhY2spO1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgb25EYXRhSXRlbVNlbGVjdGVkKFxuICAgIHZhbDogKHNlbGVjdGVkVmFsdWU6IGFueSwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcpID0+IHZvaWRcbiAgKSB7XG4gICAgdGhpcy52aXN1YWxpemVyc1dpdGhTZWxlY3Rpb24uZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB2YWw7XG4gICAgfSk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKSB7XG4gICAgdGhpcy52aXN1YWxpemVyc1dpdGhTZWxlY3Rpb24uZm9yRWFjaCgodmlzdWFsaXplcikgPT4ge1xuICAgICAgdmlzdWFsaXplci5zZXRTZWxlY3Rpb24oaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIHJldHVybiAoPGFueT50aGlzLnZpc3VhbGl6ZXIpLnNlbGVjdGlvbiB8fCB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy52aXN1YWxpemVyLnJlbmRlcih0aGlzLnZpc3VhbGl6ZXJDb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3IpO1xuICAgIHRoaXMudmlzdWFsaXplcnMuZm9yRWFjaCh2aXN1YWxpemVyID0+IHZpc3VhbGl6ZXIuYmFja2dyb3VuZENvbG9yID0gY29sb3IpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5yZW1vdmUodGhpcy5vbkFmdGVyVmlzdWFsaXplclJlbmRlckNhbGxiYWNrKTtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJBbHRlcm5hdGl2ZXNWaXN1YWxpemVyKFxuICBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlclxuKTtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgYXJhYmljU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwi2LLYsdin2LEg2KfZhNmF2KzZhdmI2LnYqVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcItiq2YUg2KfZhNiq2K3Yr9mK2Ksg2YXZhiDYrtmE2KfZhNmJXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLYp9iu2KrYsVwiLFxuICBoaWRlQ29sdW1uOiBcItin2K7Zgdin2KEg2KfZhNi52YXZiNivXCIsXG4gIHNob3dDb2x1bW46IFwi2KfYuNmH2KfYsVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCLYo9is2LnZhCDYp9mE2LnZhdmI2K8g2K7Yp9i1XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwi2KPYrNi52YQg2KfZhNi52YXZiNivINi52KfZhVwiLFxuICBtb3ZlVG9EZXRhaWw6IFwi2KfZhtiq2YLZhCDYpdmE2Ykg2KfZhNiq2YHYp9i12YrZhFwiLFxuICBzaG93QXNDb2x1bW46IFwi2KXYuNmH2KfYsSDZg9i52YXZiNivXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcItio2K3Yqy4uLlwiLFxuICByZW1vdmVSb3dzOiBcItit2LDZgVwiLFxuICBzaG93TGFiZWw6IFwi2KfYuNmH2KfYsVwiLFxuICBlbnRyaWVzTGFiZWw6IFwi2YXYr9iu2YTYp9iqXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCLYrNiv2KfZiNmEXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcItmD2YTZhdin2KpcIixcbiAgdmlzdWFsaXplcl9oaXN0b2dyYW06IFwi2KfZhNix2LPZhSDYp9mE2KjZitin2YbZilwiLFxuICB2aXN1YWxpemVyX251bWJlcjogXCLZhdiq2YjYs9i3XCIsXG4gIHZpc3VhbGl6ZXJfY2hvaWNlczogXCLYrNiv2YjZhFwiLFxuICB2aXN1YWxpemVyX3NlbGVjdEJhc2U6IFwi2LHYs9mFINio2YrYp9mG2YpcIixcbiAgY2hhcnRUeXBlX2JhcjogXCLYtNix2YrYt1wiLFxuICBjaGFydFR5cGVfdmJhcjogXCLYtNix2YrYtyDYudmF2YjYr9mKXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIti02LHZiti3INmF2YPYr9izXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb3VnaG51dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlBpZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJTY2F0dGVyXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxldFwiLFxuICBoaWRlQnV0dG9uOiBcItin2K7Zgdin2KFcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwi2KPYrNi52YQg2K7Yp9i1XCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwi2KPYrNi52YQg2LnYp9mFXCIsXG4gIHNob3dCdXR0b246IFwi2KfYuNmH2KfYsVwiLFxuICBmaWx0ZXI6IFwi2KrYsdi02K1cIixcbiAgcmVzZXRGaWx0ZXI6IFwi2KXYudin2K/YqSDYqti52YrZitmGXCIsXG4gIGNoYW5nZUxvY2FsZTogXCLYqti62YrZitixINin2YTZhNi62KlcIixcbiAgZW46IFwi2KfZhNmE2LrYqSDYp9mE2KfZhtis2YTZitiy2YrYqVwiLFxuICBmcjogXCLYp9mE2YTYutmHINin2YTZgdix2YbYs9mK2KlcIixcbiAgcnU6IFwi2KfZhNmE2LrZhyDYp9mE2LHZiNiz2YrYqVwiLFxuICBkZTogXCLYp9mE2YTYutmHINin2YTYp9mG2KzZhNmK2LLZitipXCIsXG4gIGNsZWFyQnV0dG9uOiBcItmF2LPYrVwiLFxuICBhZGRFbGVtZW50OiBcItin2K7YqtixINiz2KTYp9mE2KfZiyDZhNmE2LnYsdi2IC4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwi2KfZhNiq2LHYqtmK2Kgg2KfZhNin2YHYqtix2KfYttmKXCIsXG4gIGFzY09yZGVyOiBcItiq2LXYp9i52K/ZiVwiLFxuICBkZXNjT3JkZXI6IFwi2KrZhtin2LLZhNmJXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwi2KXYuNmH2KfYsSDYp9mE2KPYudmF2K/YqSDYp9mE2KvYp9mG2YjZitipXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcItio2YbZiNivINmI2KrYudmE2YrZgtin2Kog2KPYrtix2YlcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIti52LHYtiDYp9mE2YbYs9ioINin2YTZhdim2YjZitipXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCLYpdiu2YHYp9ihINin2YTZhtiz2KhcIixcbiAgcGRmRG93bmxvYWRDYXB0aW9uOiBcIlBERlwiLFxuICB4bHN4RG93bmxvYWRDYXB0aW9uOiBcIkV4Y2VsXCIsXG4gIGNzdkRvd25sb2FkQ2FwdGlvbjogXCJDU1ZcIixcbiAgc2F2ZURpYWdyYW1Bc1BORzogXCLYqtmG2LLZitmEINio2LXZiti62KkgcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwi2KXYrtmB2KfYoSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwi2KXYuNmH2KfYsSDYp9mE2KXYrNin2KjYp9iqINin2YTZgdin2LHYutipXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCLYpdiu2YHYp9ihINin2YTYpdis2KfYqNin2Kog2KfZhNmF2YHZgtmI2K/YqVwiLFxuICBzaG93TWlzc2luZ0Fuc3dlcnM6IFwi2LnYsdi2INin2YTYpdis2KfYqNin2Kog2KfZhNmF2YHZgtmI2K/YqVwiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcItij2KzZiNio2Kkg2YXZgdmC2YjYr9ipXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcItmE2YUg2YrYqtmFINin2YTYudix2LYg2KjYudivXCIsXG4gIG5vUmVzdWx0czogXCLZhNinINmK2YjYrNivINmG2KrYp9im2Kwg2YTZhNi52LHYtlwiLFxuICBzaG93UGVyVmFsdWVzOiBcItmE2YPZhCDYp9mE2YLZitmFXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcItmE2YPZhCDYp9mE2KPYudmF2K/YqVwiLFxuICBhbnN3ZXI6IFwi2KXYrNioXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwi2KfZhNin2KzYp9io2Kkg2KfZhNi12K3Zitit2Kk6IFwiLFxuICBwZXJjZW50OiBcItin2YTZhtiz2KjZhyDYp9mE2YXYptmI2YrZh1wiLFxuICByZXNwb25zZXM6IFwi2KfZhNin2LPYqtis2KfYqNin2KpcIixcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcIkFyYWJpY1wiO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBkdXRjaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb2VwIGRvb3IgbWlqXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGVncm9lcGVyZW4gYmlqIG1palwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0ZWVyIG1palwiLFxuICBoaWRlQ29sdW1uOiBcIktvbG9tIHZlcmJlcmdlblwiLFxuICBzaG93Q29sdW1uOiBcIlRvb24ga29sb21cIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiS29sb20gcHJpdsOpIG1ha2VuXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFhayBkZSBrb2xvbSBvcGVuYmFhclwiLFxuICBtb3ZlVG9EZXRhaWw6IFwiR2EgbmFhciBEZXRhaWxcIixcbiAgc2hvd0FzQ29sdW1uOiBcIldlZXJnZXZlbiBhbHMga29sb21cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiWm9la2VuLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiVmVyd2lqZGVyIHJpamVuXCIsXG4gIHNob3dMYWJlbDogXCJUb25lblwiLFxuICBlbnRyaWVzTGFiZWw6IFwiaW56ZW5kaW5nZW5cIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRla3N0ZW4gaW4gdGFiZWxcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiV29yZGNsb3VkXCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkdlc3RhcGVsZGUgQmFyXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJEb251dFwiLFxuICBjaGFydFR5cGVfcGllOiBcIlRhYXJ0XCIsXG4gIGNoYXJ0VHlwZV9zY2F0dGVyOiBcIlZlcnN0cm9vaWVuXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJNZXRlclwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIktvZ2VsXCIsXG4gIGhpZGVCdXR0b246IFwiVmVyYmVyZ2VuXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1hYWsgcHJpdmVcIixcbiAgbWFrZVB1YmxpY0J1dHRvbjogXCJPcGVuYmFhciBtYWtlblwiLFxuICBzaG93QnV0dG9uOiBcIlRvbmVuXCIsXG4gIHJlc2V0RmlsdGVyOiBcIkZpbHRlciByZXNldHRlblwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiV2lqemlnIGRlIGxhbmRpbnN0ZWxsaW5nXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkRvb3J6aWNodGlnXCIsXG4gIGFkZEVsZW1lbnQ6IFwiS2llcyBlZW4gdnJhYWcgb20gd2VlciB0ZSBnZXZlbiAuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYWFyZHZvbGdvcmRlXCIsXG4gIGFzY09yZGVyOiBcIk9wbG9wZW5kXCIsXG4gIGRlc2NPcmRlcjogXCJBZmxvcGVuZFwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlRvb24ga2xlaW5lIGtvbG9tbWVuXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIkFuZGVyZSBpdGVtcyBlbiBvcG1lcmtpbmdlblwiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiUGVyY2VudGFnZXMgd2VlcmdldmVuXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJWZXJiZXJnIHBlcmNlbnRhZ2VzXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiRG93bmxvYWQgcGxvdCBhbHMgZWVuIHBuZ1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIlZlcmJlcmcgbGVnZSBhbnR3b29yZGVuXCIsXG4gIHNob3dFbXB0eUFuc3dlcnM6IFwiVG9vbiBsZWdlIGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGxlIGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlRvcCA1IGFudHdvb3JkZW5cIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJUb3AgMTAgYW50d29vcmRlblwiLFxuICBcInRvcE5WYWx1ZVRleHQyMFwiOiBcIlRvcCAyMCBhbnR3b29yZGVuXCIsXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwiRHV0Y2hcIjtcbiIsIi8vIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3UgY3JlYXRlIGEgY3VzdG9tIGRpY3Rpb25hcnlcbi8vIGltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZW5nbGlzaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwIEJ5IE1lXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiVW5ncm91cCBCeSBNZVwiLFxuICBzZWxlY3RCdXR0b246IFwiU2VsZWN0IE1lXCIsXG4gIGhpZGVDb2x1bW46IFwiSGlkZSBjb2x1bW5cIixcbiAgc2hvd0NvbHVtbjogXCJTaG93IGNvbHVtblwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJNYWtlIGNvbHVtbiBwcml2YXRlXCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHVibGljXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlIHRvIERldGFpbFwiLFxuICBzaG93QXNDb2x1bW46IFwiU2hvdyBhcyBDb2x1bW5cIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmVtb3ZlIHJvd3NcIixcbiAgc2hvd0xhYmVsOiBcIlNob3dcIixcbiAgZW50cmllc0xhYmVsOiBcImVudHJpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRzIGluIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1cIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiQXZlcmFnZVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFibGVcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkNoYXJ0XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiQmFyXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIlZlcnRpY2FsIEJhclwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFja2VkIEJhclwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiU2NhdHRlclwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCJIaWRlXCIsXG4gIG1ha2VQcml2YXRlQnV0dG9uOiBcIk1ha2UgcHJpdmF0ZVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIk1ha2UgcHVibGljXCIsXG4gIHNob3dCdXR0b246IFwiU2hvd1wiLFxuICBmaWx0ZXI6IFwiRmlsdGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJlc2V0IEZpbHRlclwiLFxuICBjaGFuZ2VMb2NhbGU6IFwiQ2hhbmdlIExvY2FsZVwiLFxuICBlbjogXCJFbmdsaXNoXCIsXG4gIGZyOiBcIkZyYW7Dp2Fpc1wiLFxuICBydTogXCLQoNGD0YHRgdC60LjQuVwiLFxuICBkZTogXCJEZXV0c2NoXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNsZWFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvb3NlIHF1ZXN0aW9uIHRvIHNob3cuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIkRlZmF1bHQgT3JkZXJcIixcbiAgYXNjT3JkZXI6IFwiQXNjZW5kaW5nXCIsXG4gIGRlc2NPcmRlcjogXCJEZXNjZW5kaW5nXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiU2hvdyBtaW5vciBjb2x1bW5zXCIsXG4gIG90aGVyQ29tbWVudFRpdGxlOiBcIk90aGVyIGl0ZW1zIGFuZCBjb21tZW50c1wiLFxuICBzaG93UGVyY2VudGFnZXM6IFwiU2hvdyBwZXJjZW50YWdlc1wiLFxuICBoaWRlUGVyY2VudGFnZXM6IFwiSGlkZSBwZXJjZW50YWdlc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkRvd25sb2FkIHBsb3QgYXMgYSBwbmdcIixcbiAgaGlkZUVtcHR5QW5zd2VyczogXCJIaWRlIGVtcHR5IGFuc3dlcnNcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJTaG93IGVtcHR5IGFuc3dlcnNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJBbGwgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgYW5zd2Vyc1wiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlRvcCAxMCBhbnN3ZXJzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiVG9wIDIwIGFuc3dlcnNcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIkhpZGUgbWlzc2luZyBhbnN3ZXJzXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJTaG93IG1pc3NpbmcgYW5zd2Vyc1wiLFxuICBtaXNzaW5nQW5zd2Vyc0xhYmVsOiBcIk1pc3NpbmcgYW5zd2Vyc1wiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJUaGlzIHF1ZXN0aW9uIHR5cGUgaXMgbm90IHZpc3VhbGl6ZWQgeWV0XCIsXG4gIG5vUmVzdWx0czogXCJUaGVyZSBhcmUgbm8gcmVzdWx0cyB5ZXRcIixcbiAgc2hvd1BlclZhbHVlczogXCJQZXIgVmFsdWVzXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBlciBDb2x1bW5zXCIsXG4gIGFuc3dlcjogXCJBbnN3ZXJcIixcbiAgY29ycmVjdEFuc3dlcjogXCJDb3JyZWN0IGFuc3dlcjogXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudFwiLFxuICByZXNwb25zZXM6IFwiUmVzcG9uc2VzXCJcbn07XG5cbi8vIFVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cgaWYgeW91IGNyZWF0ZSBhIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gUmVwbGFjZSBcImVuXCIgd2l0aCBhIGN1c3RvbSBsb2NhbGUgY29kZSAoZm9yIGV4YW1wbGUsIFwiZnJcIiBvciBcImRlXCIpLFxuLy8gUmVwbGFjZSBgZW5nbGlzaFN0cmluZ3NgIHdpdGggdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbSBkaWN0aW9uYXJ5LlxuLy8gbG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuLy8gbG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcIkVuZ2xpc2hcIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgZmFyc2lTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCLar9ix2YjZhyDYqNmG2K/bjCDYqNinXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwi2K3YsNmBINqv2LHZiNmHXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCLYp9mG2KrYrtin2KhcIixcbiAgaGlkZUNvbHVtbjogXCLZhdiu2YHbjCDaqdix2K/ZhiDYs9iq2YjZhlwiLFxuICBzaG93Q29sdW1uOiBcItmG2YXYp9uM2LQg2LPYqtmI2YZcIixcbiAgbW92ZVRvRGV0YWlsOiBcItin2YbYqtmC2KfZhCDYqNmHINis2LLYptuM2KfYqlwiLFxuICBzaG93QXNDb2x1bW46IFwi2YbZhdin24zYtCDYqNmHINi52YbZiNin2YYg2LPYqtmI2YZcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcItmF2KrZiNmGINiv2LEg2KzYr9mI2YRcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwi2KfYqNixINqp2YTZhdin2KpcIixcbiAgY2hhcnRUeXBlX2JhcjogXCLZhduM2YTZhyDYp9uMXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwi2K/Yp9io2LHZhyDYp9uMKHBpZSlcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwi2b7Ysdin2qnZhtiv2q/bjChTY2F0dGVyKVwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwi2LnZgtix2KjZhyDYp9uMXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiQnVsbGV0XCIsXG4gIGhpZGVCdXR0b246IFwi2YXYrtmB24xcIixcbiAgcmVzZXRGaWx0ZXI6IFwi2KjYp9iy2YbYtNin2YbbjCDZgduM2YTYqtix2YfYp1wiLFxuICBjbGVhckJ1dHRvbjogXCLZvtin2qkg2qnYsdiv2YZcIixcbiAgYWRkRWxlbWVudDogXCLYp9mG2KrYrtin2Kgg2LPZiNin2YQg2KjYsdin24wg2YbZhdin24zYtC4uLlwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcImZhXCJdID0gZmFyc2lTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmFcIl0gPSBcIkZhcnNpKFBlcnNpYW4pXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN0cmluZ3MgPSB7XG4gIGdyb3VwQnV0dG9uOiBcIkdyb3VwZXJcIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEaXNzb2NpZXJcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlPDqWxlY3Rpb25uZXJcIixcbiAgaGlkZUNvbHVtbjogXCJNYXNxdWVyIGNvbG9ubmVcIixcbiAgc2hvd0NvbHVtbjogXCJBZmZpY2hlciBjb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHByaXbDqVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIlJlbmRyZSBsYSBjb2xvbm5lIHB1YmxpY1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwiRMOpcGxhY2VyIHZlcnMgZMOpdGFpbHNcIixcbiAgc2hvd0FzQ29sdW1uOiBcIkFmZmljaGVyIGVuIGNvbG9ubmVcIixcbiAgZmlsdGVyUGxhY2Vob2xkZXI6IFwiUmVjaGVyY2hlci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlN1cHByaW1lciBjb2xvbm5lXCIsXG4gIHNob3dMYWJlbDogXCJBZmZpY2hlclwiLFxuICBlbnRyaWVzTGFiZWw6IFwiZW50csOpZXNcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRlcyBlbiB0YWJsZVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdWFnZXMgZGUgbW90c1wiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJlc1wiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJCYXJyZXMgZW1waWzDqWVzXCIsXG4gIGNoYXJ0VHlwZV9kb3VnaG51dDogXCJBbm5lYXVcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJTZWN0ZXVyc1wiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJOdWFnZXMgZGUgcG9pbnRzXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHYXVnZVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJ1bGxlc1wiLFxuICBmaWx0ZXI6IFwiRmlsdHJlXCIsXG4gIGhpZGVCdXR0b246IFwiTWFzcXVlclwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIlNhdXZlciBlbiBwbmdcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiUmVuZHJlIHByaXbDqVwiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlJlbmRyZSBwdWJsaXF1ZVwiLFxuICBzaG93QnV0dG9uOiBcIkFmZmljaGVyXCIsXG4gIHJlc2V0RmlsdGVyOiBcIlJhZnJhaWNoaXIgRmlsdHJlc1wiLFxuICBjbGVhckJ1dHRvbjogXCJSYWZyYWljaGlyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiQ2hvaXNpciBsYSBxdWVzdGlvbiDDoCBhZmZpY2hlci4uLlwiLFxuICBkZWZhdWx0T3JkZXI6IFwiRGVmYXV0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGFudFwiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGFudFwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIkFmZmljaGVyIGxlcyBjb2xvbm5lcyBtaW5ldXJlc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBdXRyZSDDqWzDqW1lbnQgZXQgY29tbWVudGFpcmVzXCIsXG4gIG5vVmlzdWFsaXplckZvclF1ZXN0aW9uOiBcIkNlIHR5cGUgZGUgcXVlc3Rpb24gbidlc3QgcGFzIGVuY29yZSB2aXN1YWxpc8OpXCIsXG4gIG5vUmVzdWx0czogXCJJbCBuJ3kgYSBwYXMgZW5jb3JlIGRlIHLDqXN1bHRhdHNcIixcbiAgc2hvd1BlclZhbHVlczogXCJQYXIgdmFsZXVyXCIsXG4gIHNob3dQZXJDb2x1bW5zOiBcIlBhciBjb2xvbm5lXCIsXG4gIGFuc3dlcjogXCJSw6lwb25zZVwiLFxuICBjb3JyZWN0QW5zd2VyOiBcIlLDqXBvbnNlIGNvcnJlY3RlOiBcIixcbiAgcGVyY2VudDogXCJQb3VyY2VudGFnZVwiLFxuICByZXNwb25zZXM6IFwiUsOpcG9uc2VzXCJcbn07XG5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZnJcIl0gPSBmcmVuY2hTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZnJcIl0gPSBcIkZyZW5jaFwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiUmFnZ3J1cHBhXCIsXG4gIHVuZ3JvdXBCdXR0b246IFwiRGl2aWRpXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJTZWxlemlvbmFtaVwiLFxuICBoaWRlQ29sdW1uOiBcIk5hc2NvbmRpIGNvbG9ubmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmEgY29sb25uYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHByaXZhdGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJSZW5kaSBsYSBjb2xvbm5hIHB1YmJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJTcG9zdGEgaW4gRGV0dGFnbGlvXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmEgY29tZSBDb2xvbm5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIkNlcmNhLi4uXCIsXG4gIHJlbW92ZVJvd3M6IFwiUmltdW92aSByaWdoZVwiLFxuICBzaG93TGFiZWw6IFwiTW9zdHJhXCIsXG4gIGVudHJpZXNMYWJlbDogXCJ2b2NpXCIsXG4gIHZpc3VhbGl6ZXJfdGV4dDogXCJQYXJvbGUgaW4gdGFiZWxsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdXZvbGEgZGkgcGFyb2xlXCIsXG4gIHZpc3VhbGl6ZXJfaGlzdG9ncmFtOiBcIklzdG9ncmFtbWFcIixcbiAgdmlzdWFsaXplcl9udW1iZXI6IFwiTWVkaWFcIixcbiAgdmlzdWFsaXplcl9jaG9pY2VzOiBcIlRhYmVsbGFcIixcbiAgdmlzdWFsaXplcl9zZWxlY3RCYXNlOiBcIkdyYWZpY29cIixcbiAgY2hhcnRUeXBlX2JhcjogXCJHcmFmaWNvIGEgYmFycmVcIixcbiAgY2hhcnRUeXBlX3ZiYXI6IFwiR3JhZmljbyBhIGJhcnJlIHZlcnRpY2FsaVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJHcmFmaWNvIGEgYmFycmUgc292cmFwcG9zdGVcIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkdyYWZpY28gYSBjaWFtYmVsbGFcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJHcmFmaWNvIGEgdG9ydGFcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiR3JhZmljbyBhIGRpc3BlcnNpb25lXCIsXG4gIGNoYXJ0VHlwZV9nYXVnZTogXCJHcmFmaWNvIEdhdWdlXCIsXG4gIGNoYXJ0VHlwZV9idWxsZXQ6IFwiUHVudG9cIixcbiAgaGlkZUJ1dHRvbjogXCJOYXNjb25kaVwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJSZW5kaSBwcml2YXRvXCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiUmVuZGkgcHViYmxpY29cIixcbiAgc2hvd0J1dHRvbjogXCJNb3N0cmFcIixcbiAgZmlsdGVyOiBcIkZpbHRyb1wiLFxuICByZXNldEZpbHRlcjogXCJDYW5jZWxsYSBmaWx0cm9cIixcbiAgY2hhbmdlTG9jYWxlOiBcIkNhbWJpYSBsaW5ndWFcIixcbiAgZW46IFwiSW5nbGVzZVwiLFxuICBmcjogXCJGcmFuY2VzZVwiLFxuICBydTogXCJSdXNzb1wiLFxuICBkZTogXCJUZWRlc2NvXCIsXG4gIGNsZWFyQnV0dG9uOiBcIkNhbmNlbGxhXCIsXG4gIGFkZEVsZW1lbnQ6IFwiU2NlZ2xpIGxhIGRvbWFuZGEgZGEgbW9zdHJhcmUuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIk9yZGluZSBkaSBEZWZhdWx0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRpc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhIGNvbG9ubmUgc2Vjb25kYXJpZVwiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCJBbHRyaSBwdW50aSBlIGNvbW1lbnRpXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJNb3N0cmEgcGVyY2VudHVhbGlcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIk5hc2NvbmRpIHBlcmNlbnR1YWxpXCIsXG4gIHBkZkRvd25sb2FkQ2FwdGlvbjogXCJQREZcIixcbiAgeGxzeERvd25sb2FkQ2FwdGlvbjogXCJFeGNlbFwiLFxuICBjc3ZEb3dubG9hZENhcHRpb246IFwiQ1NWXCIsXG4gIHNhdmVEaWFncmFtQXNQTkc6IFwiU2NhcmljYSBpbCBncmFmaWNvIGluIGZvcm1hdG8gcG5nXCIsXG4gIGhpZGVFbXB0eUFuc3dlcnM6IFwiTmFzY29uZGkgcmlzcG9zdGUgdnVvdGVcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJNb3N0cmEgcmlzcG9zdGUgdnVvdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUdXR0ZSBsZSByaXNwb3N0ZVwiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiVG9wIDUgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MTBcIjogXCJUb3AgMTAgcmlzcG9zdGVcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJUb3AgMjAgcmlzcG9zdGVcIixcbiAgaGlkZU1pc3NpbmdBbnN3ZXJzOiBcIk5hc2NvbmRpIGxlIHJpc3Bvc3RlIG1hbmNhbnRpXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJNb3N0cmEgbGUgcmlzcG9zdGUgbWFuY2FudGlcIixcbiAgbWlzc2luZ0Fuc3dlcnNMYWJlbDogXCJSaXNwb3N0ZSBtYW5jYW50aVwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCJRdWVzdG8gdGlwbyBkaSBkb21hbmRhIG5vbiDDqCBhbmNvcmEgc3RhdG8gdmlzdWFsaXp6YXRvXCIsXG4gIG5vUmVzdWx0czogXCJOb24gY2kgc29ubyBhbmNvcmEgcmlzdWx0YXRpXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUGVyIFZhbG9yaVwiLFxuICBzaG93UGVyQ29sdW1uczogXCJQZXIgQ29sb25uZVwiLFxuICBhbnN3ZXI6IFwiUmlzcG9zdGFcIixcbiAgcGVyY2VudDogXCJQZXJjZW50dWFsZVwiLFxuICByZXNwb25zZXM6IFwiUmlzcG9zdGVcIlxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5TdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaXRcIl0gPSBcIkl0YWxpYW5cIjtcbiIsImltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCB2YXIgbm9yd2VnaWFuU3RyaW5ncyA9IHtcbiAgZ3JvdXBCdXR0b246IFwiR3J1cHBlclwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIk9wcGhldiBncnVwcGVyaW5nXCIsXG4gIHNlbGVjdEJ1dHRvbjogXCJWZWxnXCIsXG4gIGhpZGVDb2x1bW46IFwiU2tqdWwga29sb25uZVwiLFxuICBzaG93Q29sdW1uOiBcIlZpcyBrb2xvbm5lXCIsXG4gIG1ha2VQcml2YXRlQ29sdW1uOiBcIkdqw7hyIGtvbG9ubmUgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNDb2x1bW46IFwiR2rDuHIga29sb25uZSBvZmZlbnRsaWdcIixcbiAgbW92ZVRvRGV0YWlsOiBcIkZseXR0IHRpbCBkZXRhbGplcnQgdmlzbmluZ1wiLFxuICBzaG93QXNDb2x1bW46IFwiVmlzIHNvbSBrb2xvbm5lXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlPDuGsuLi5cIixcbiAgcmVtb3ZlUm93czogXCJGamVybiByYWRlclwiLFxuICBzaG93TGFiZWw6IFwiVmlzXCIsXG4gIGVudHJpZXNMYWJlbDogXCJvcHBmw7hyaW5nZXJcIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRhYmVsbHZpc25pbmdcIixcbiAgdmlzdWFsaXplcl93b3JkY2xvdWQ6IFwiT3Jkc2t5XCIsXG4gIGNoYXJ0VHlwZV9iYXI6IFwiU3RvbHBlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFibGV0IHN0b2xwZWRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2RvdWdobnV0OiBcIkhqdWxkaWFncmFtXCIsXG4gIGNoYXJ0VHlwZV9waWU6IFwiU2VrdG9yZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJQdW5rdGRpYWdyYW1cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIk3DpWxlZGlhZ3JhbVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkt1bGVkaWFncmFtXCIsXG4gIGhpZGVCdXR0b246IFwiU2tqdWxcIixcbiAgbWFrZVByaXZhdGVCdXR0b246IFwiR2rDuHIgcHJpdmF0XCIsXG4gIG1ha2VQdWJsaWNCdXR0b246IFwiR2rDuHIgb2ZmZW50bGlnXCIsXG4gIHNob3dCdXR0b246IFwiVmlzXCIsXG4gIHJlc2V0RmlsdGVyOiBcIk51bGxzdGlsbCBmaWx0ZXJcIixcbiAgY2hhbmdlTG9jYWxlOiBcIkJ5dHQgc3Byw6VrXCIsXG4gIGNsZWFyQnV0dG9uOiBcIlTDuG1cIixcbiAgYWRkRWxlbWVudDogXCJWZWxnIHNww7hyc23DpWwuLi5cIixcbiAgZGVmYXVsdE9yZGVyOiBcIlN0YW5kYXJkXCIsXG4gIGFzY09yZGVyOiBcIlN0aWdlbmRlXCIsXG4gIGRlc2NPcmRlcjogXCJTeW5rZW5kZVwiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlZpcyBtaW5kcmUga29sb25uZXJcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiQW5uZXQgb2cga29tbWVudGFyZXJcIixcbiAgc2hvd1BlcmNlbnRhZ2VzOiBcIlZpcyBwcm9zZW50ZXJcIixcbiAgaGlkZVBlcmNlbnRhZ2VzOiBcIlNranVsIHByb3NlbnRlclwiLFxufTtcblxubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJub1wiXSA9IG5vcndlZ2lhblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJub1wiXSA9IFwiTm9yd2VnaWFuXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJBZ3J1cGFyIFBvciBNaW1cIixcbiAgdW5ncm91cEJ1dHRvbjogXCJEZXNhZ3J1cGFyIFBvciBNaW1cIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjaW9uYXJcIixcbiAgaGlkZUNvbHVtbjogXCJFc2NvbmRlciBjb2x1bmFcIixcbiAgc2hvd0NvbHVtbjogXCJNb3N0cmFyIGNvbHVuYVwiLFxuICBtYWtlUHJpdmF0ZUNvbHVtbjogXCJUb3JuYXIgY29sdW5hIHByaXZhZGFcIixcbiAgbWFrZVB1YmxpY0NvbHVtbjogXCJUb3JuYXIgY29sdW5hIHDDumJsaWNhXCIsXG4gIG1vdmVUb0RldGFpbDogXCJNb3ZlciBwYXJhIERldGFsaGVzXCIsXG4gIHNob3dBc0NvbHVtbjogXCJNb3N0cmFyIGNvbW8gQ29sdW5hXCIsXG4gIGZpbHRlclBsYWNlaG9sZGVyOiBcIlBlc3F1aXNhci4uLlwiLFxuICByZW1vdmVSb3dzOiBcIlJlbW92ZXIgbGluaGFzXCIsXG4gIHNob3dMYWJlbDogXCJNb3N0cmFyXCIsXG4gIGVudHJpZXNMYWJlbDogXCJlbnRyYWRhc1wiLFxuICB2aXN1YWxpemVyX3RleHQ6IFwiVGV4dG9zIGVtIHRhYmVsYVwiLFxuICB2aXN1YWxpemVyX3dvcmRjbG91ZDogXCJOdXZlbSBkZSBwYWxhdnJhc1wiLFxuICB2aXN1YWxpemVyX2hpc3RvZ3JhbTogXCJIaXN0b2dyYW1hXCIsXG4gIHZpc3VhbGl6ZXJfbnVtYmVyOiBcIk3DqWRpYVwiLFxuICB2aXN1YWxpemVyX2Nob2ljZXM6IFwiVGFiZWxhXCIsXG4gIHZpc3VhbGl6ZXJfc2VsZWN0QmFzZTogXCJHcsOhZmljb1wiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhcnJhXCIsXG4gIGNoYXJ0VHlwZV92YmFyOiBcIkJhcnJhIHZlcnRpY2FsXCIsXG4gIGNoYXJ0VHlwZV9zdGFja2VkYmFyOiBcIkJhcnJhIEVtcGlsaGFkYVwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiUm9zY2FcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJUYXJ0ZVwiLFxuICBjaGFydFR5cGVfc2NhdHRlcjogXCJMYXN0cm9cIixcbiAgY2hhcnRUeXBlX2dhdWdlOiBcIkVzY2FsYVwiLFxuICBjaGFydFR5cGVfYnVsbGV0OiBcIkJhbGFcIixcbiAgaGlkZUJ1dHRvbjogXCJFc2NvbmRlclwiLFxuICBtYWtlUHJpdmF0ZUJ1dHRvbjogXCJUb3JuYXIgcHJpdmFkb1wiLFxuICBtYWtlUHVibGljQnV0dG9uOiBcIlRvcm5hciBww7pibGljb1wiLFxuICBzaG93QnV0dG9uOiBcIk1vc3RyYXJcIixcbiAgZmlsdGVyOiBcIkZpbHRyYXJcIixcbiAgcmVzZXRGaWx0ZXI6IFwiUmVzdGF1cmFyIEZpbHRyb1wiLFxuICBjaGFuZ2VMb2NhbGU6IFwiTXVkYXIgTG9jYWxpemHDp8Ojb1wiLFxuICBlbjogXCJJbmdsw6pzXCIsXG4gIGZyOiBcIkZyYW5jw6pzXCIsXG4gIHJ1OiBcIlJ1c3NvXCIsXG4gIGRlOiBcIkFsZW3Do29cIixcbiAgY2xlYXJCdXR0b246IFwiTGltcGFyXCIsXG4gIGFkZEVsZW1lbnQ6IFwiRXNjb2xoZXIgcXVlc3TDo28gcGFyYSBtb3N0cmFyLi4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJPcmRlbmHDp8OjbyBQYWRyw6NvXCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGVudGVcIixcbiAgZGVzY09yZGVyOiBcIkRlc2NlbmRlbnRlXCIsXG4gIHNob3dNaW5vckNvbHVtbnM6IFwiTW9zdHJhciBjb2x1bmFzIG1lbm9yZXNcIixcbiAgb3RoZXJDb21tZW50VGl0bGU6IFwiT3V0cm9zIGl0ZW5zIGUgY29tZW50w6FyaW9zXCIsXG4gIHNob3dQZXJjZW50YWdlczogXCJNb3N0cmFyIHBlcmNlbnR1YWlzXCIsXG4gIGhpZGVQZXJjZW50YWdlczogXCJFc2NvbmRlciBwZXJjZW50dWFpc1wiLFxuICBwZGZEb3dubG9hZENhcHRpb246IFwiUERGXCIsXG4gIHhsc3hEb3dubG9hZENhcHRpb246IFwiRXhjZWxcIixcbiAgY3N2RG93bmxvYWRDYXB0aW9uOiBcIkNTVlwiLFxuICBzYXZlRGlhZ3JhbUFzUE5HOiBcIkJhaXhhciBkaWFncmFtYSBjb21vIFBOR1wiLFxuICBoaWRlRW1wdHlBbnN3ZXJzOiBcIkVzY29uZGVyIHBlcmd1bnRhcyB2YXppYXNcIixcbiAgc2hvd0VtcHR5QW5zd2VyczogXCJNb3N0cmFyIHBlcmd1bnRhcyB2YXppYXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUb2RhcyBhcyByZXNwb3N0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0NVwiOiBcIlByaW1laXJhcyA1IHJlc3Bvc3Rhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIlByaW1laXJhcyAxMCByZXNwb3N0YXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0MjBcIjogXCJQcmltZWlyYXMgMjAgcmVzcG9zdGFzXCIsXG4gIGhpZGVNaXNzaW5nQW5zd2VyczogXCJPY3VsdGFyIHBlcmd1bnRhcyBuw6NvIHJlc3BvbmRpZGFzXCIsXG4gIHNob3dNaXNzaW5nQW5zd2VyczogXCJNb3N0cmFyIHBlcmd1bnRhcyBuw6NvIHJlc3BvbmRpZGFzXCIsXG4gIG1pc3NpbmdBbnN3ZXJzTGFiZWw6IFwiUGVyZ3VudGFzIG7Do28gcmVzcG9uZGlkYXNcIixcbiAgbm9WaXN1YWxpemVyRm9yUXVlc3Rpb246IFwiRXN0ZSB0aXBvIGRlIHBlcmd1bnRhIGFpbmRhIG7Do28gZm9pIHZpc3VhbGl6YWRhXCIsXG4gIG5vUmVzdWx0czogXCJBaW5kYSBuw6NvIHBvc3N1aSByZXN1bHRhZG9zXCIsXG4gIHNob3dQZXJWYWx1ZXM6IFwiUG9yIHZhbG9yZXNcIixcbiAgc2hvd1BlckNvbHVtbnM6IFwiUG9yIGNvbHVuYXNcIixcbiAgYW5zd2VyOiBcIlJlc3Bvc3RhXCIsXG4gIGNvcnJlY3RBbnN3ZXI6IFwiUmVzcG9zdGEgY29ycmV0YTogXCIsXG4gIHBlcmNlbnQ6IFwiUGVyY2VudGFnZW1cIixcbiAgcmVzcG9uc2VzOiBcIlJlc3Bvc3Rhc1wiXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbmxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3RyaW5ncztcbmxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJQb3J0dWd1w6pzXCI7XG4iLCJpbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vbG9jYWxpemF0aW9uTWFuYWdlclwiO1xuXG5leHBvcnQgdmFyIHJ1c3NpYW5TdHJpbmdzID0ge1xuICBncm91cEJ1dHRvbjogXCJHcm91cCBCeSBNZVwiLFxuICB1bmdyb3VwQnV0dG9uOiBcIlVuZ3JvdXAgQnkgTWVcIixcbiAgc2VsZWN0QnV0dG9uOiBcIlNlbGVjdCBNZVwiLFxuICBoaWRlQ29sdW1uOiBcIkhpZGUgY29sdW1uXCIsXG4gIHNob3dDb2x1bW46IFwiU2hvdyBjb2x1bW5cIixcbiAgbWFrZVByaXZhdGVDb2x1bW46IFwiTWFrZSBjb2x1bW4gcHJpdmF0ZVwiLFxuICBtYWtlUHVibGljQ29sdW1uOiBcIk1ha2UgY29sdW1uIHB1YmxpY1wiLFxuICBtb3ZlVG9EZXRhaWw6IFwiTW92ZSB0byBEZXRhaWxcIixcbiAgZmlsdGVyOiBcItCk0LjQu9GM0YLRgFwiLFxuICBzaG93QXNDb2x1bW46IFwiU2hvdyBhcyBDb2x1bW5cIixcbiAgdmlzdWFsaXplcl90ZXh0OiBcIlRleHRzIGluIHRhYmxlXCIsXG4gIHZpc3VhbGl6ZXJfd29yZGNsb3VkOiBcIldvcmRjbG91ZFwiLFxuICBjaGFydFR5cGVfYmFyOiBcIkJhclwiLFxuICBjaGFydFR5cGVfc3RhY2tlZGJhcjogXCJTdGFja2VkIEJhclwiLFxuICBjaGFydFR5cGVfZG91Z2hudXQ6IFwiRG91Z2hudXRcIixcbiAgY2hhcnRUeXBlX3BpZTogXCJQaWVcIixcbiAgY2hhcnRUeXBlX3NjYXR0ZXI6IFwiU2NhdHRlclwiLFxuICBjaGFydFR5cGVfZ2F1Z2U6IFwiR2F1Z2VcIixcbiAgY2hhcnRUeXBlX2J1bGxldDogXCJCdWxsZXRcIixcbiAgaGlkZUJ1dHRvbjogXCLQodC60YDRi9GC0YxcIixcbiAgc2hvd0J1dHRvbjogXCLQn9C+0LrQsNC30LDRgtGMXCIsXG4gIHJlc2V0RmlsdGVyOiBcItCe0YfQuNGB0YLQuNGC0Ywg0YTQuNC70YzRgtGAXCIsXG4gIGNoYW5nZUxvY2FsZTogXCLQodC80LXQvdC40YLRjCDRj9C30YvQulwiLFxuICBjbGVhckJ1dHRvbjogXCJDbGVhclwiLFxuICBhZGRFbGVtZW50OiBcIkNob29zZSBxdWVzdGlvbiB0byBzaG93Li4uXCIsXG4gIGRlZmF1bHRPcmRlcjogXCJEZWZhdWx0XCIsXG4gIGFzY09yZGVyOiBcIkFzY2VuZGluZ1wiLFxuICBkZXNjT3JkZXI6IFwiRGVzY2VuZGluZ1wiLFxuICBzaG93TWlub3JDb2x1bW5zOiBcIlNob3cgbWlub3IgY29sdW1uc1wiLFxuICBvdGhlckNvbW1lbnRUaXRsZTogXCLQlNGA0YPQs9C+0LUg0Lgg0LrQvtC80LzQtdC90YLQsNGA0LjQuFwiLFxuICBub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvbjogXCLQrdGC0L7RgiDRgtC40L8g0LLQvtC/0YDQvtGB0LAg0LXRidC1INC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjyDQsNC90LDQu9C40YLQuNC60L7QuVwiLFxuICBub1Jlc3VsdHM6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Ysg0L7RgtGB0YPRgtGB0YLQstGD0Y7RglwiXG59O1xuXG5sb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN0cmluZ3M7XG5sb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJydVwiXSA9IFwiUnVzc2lhblwiO1xuIiwiaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHZhciBzcGFuaXNoU3RyaW5ncyA9IHtcbiAgXCJ1bmdyb3VwQnV0dG9uXCI6IFwiRGVzYWdydXBhciBwb3IgbcOtXCIsXG4gIFwic2VsZWN0QnV0dG9uXCI6IFwiU2VsZWNjaW9uYXJtZVwiLFxuICBcImhpZGVDb2x1bW5cIjogXCJPY3VsdGFyIGNvbHVtbmFcIixcbiAgXCJzaG93Q29sdW1uXCI6IFwiTW9zdHJhciBjb2x1bW5hXCIsXG4gIFwibWFrZVByaXZhdGVDb2x1bW5cIjogXCJIYWNlciBxdWUgbGEgY29sdW1uYSBzZWEgcHJpdmFkYVwiLFxuICBcIm1ha2VQdWJsaWNDb2x1bW5cIjogXCJIYWNlciBww7pibGljYSBsYSBjb2x1bW5hXCIsXG4gIFwibW92ZVRvRGV0YWlsXCI6IFwiTW92ZXIgYWwgZGV0YWxsZVwiLFxuICBcInNob3dBc0NvbHVtblwiOiBcIk1vc3RyYXIgY29tbyBjb2x1bW5hXCIsXG4gIFwiZmlsdGVyUGxhY2Vob2xkZXJcIjogXCJCdXNjYXIgLi4uXCIsXG4gIFwicmVtb3ZlUm93c1wiOiBcIkVsaW1pbmFyIGZpbGFzXCIsXG4gIFwic2hvd0xhYmVsXCI6IFwiTW9zdHJhclwiLFxuICBcImVudHJ5TGFiZWxcIjogXCJlbnRyYWRhc1wiLFxuICBcInZpc3VhbGl6ZXJfdGV4dFwiOiBcIlRleHRvcyBlbiB0YWJsYVwiLFxuICBcInZpc3VhbGl6ZXJfd29yZGNsb3VkXCI6IFwiV29yZGNsb3VkXCIsXG4gIFwiY2hhcnRUeXBlX2JhclwiOiBcIkJhclwiLFxuICBcImNoYXJ0VHlwZV9zdGFja2VkYmFyXCI6IFwiQmFycmEgYXBpbGFkYVwiLFxuICBcImNoYXJ0VHlwZV9kb3VnaG51dFwiOiBcIkRvbnV0XCIsXG4gIFwiY2hhcnRUeXBlX3BpZVwiOiBcIlBpZVwiLFxuICBcImNoYXJ0VHlwZV9zY2F0dGVyXCI6IFwiRGlzcGVyc2nDs25cIixcbiAgXCJjaGFydFR5cGVfZ2F1Z2VcIjogXCJHYXVnZVwiLFxuICBcImNoYXJ0VHlwZV9idWxsZXRcIjogXCJCdWxsZXRcIixcbiAgXCJoaWRlQnV0dG9uXCI6IFwiT2N1bHRhclwiLFxuICBcIm1ha2VQcml2YXRlQnV0dG9uXCI6IFwiSGFjZXIgcHJpdmFkb1wiLFxuICBcIm1ha2VQdWJsaWNCdXR0b25cIjogXCJIYWNlciBww7pibGljb1wiLFxuICBcInNob3dCdXR0b25cIjogXCJNb3N0cmFyXCIsXG4gIFwiZmlsdGVyXCI6IFwiRmlsdHJvXCIsXG4gIFwicmVzZXRGaWx0ZXJcIjogXCJSZXN0YWJsZWNlciBmaWx0cm9cIixcbiAgXCJjaGFuZ2VMb2NhbGVcIjogXCJDYW1iaWFyIGNvbmZpZ3VyYWNpw7NuIHJlZ2lvbmFsXCIsXG4gIFwiY2xlYXJCdXR0b25cIjogXCJCb3JyYXJcIixcbiAgXCJhZGRFbGVtZW50XCI6IFwiRWxpamEgbGEgcHJlZ3VudGEgcGFyYSBtb3N0cmFyIC4uLlwiLFxuICBcImRlZmF1bHRPcmRlclwiOiBcIk9yZGVuIHByZWRldGVybWluYWRvXCIsXG4gIFwiYXNjT3JkZXJcIjogXCJBc2NlbmRlbnRlXCIsXG4gIFwiZGVzY09yZGVyXCI6IFwiRGVzY2VuZGVudGVcIixcbiAgXCJzaG93TWlub3JDb2x1bW5zXCI6IFwiTW9zdHJhciBjb2x1bW5hcyBzZWN1bmRhcmlhc1wiLFxuICBcIm90aGVyQ29tbWVudFRpdGxlXCI6IFwiT3Ryb3MgZWxlbWVudG9zIHkgY29tZW50YXJpb3NcIixcbiAgXCJzaG93UGVyY2VudGFnZXNcIjogXCJNb3N0cmFyIHBvcmNlbnRhamVzXCIsXG4gIFwiaGlkZVBlcmNlbnRhZ2VzXCI6IFwiT2N1bHRhciBwb3JjZW50YWplc1wiLFxuICBcInBkZkRvd25sb2FkQ2FwdGlvblwiOiBcIlBERlwiLFxuICBcInhsc3hEb3dubG9hZENhcHRpb25cIjogXCJFeGNlbFwiLFxuICBcImNzdkRvd25sb2FkQ2FwdGlvblwiOiBcIkNTVlwiLFxuICBcInNhdmVEaWFncmFtQXNQTkdcIjogXCJEZXNjYXJnYXIgZWwgZ3LDoWZpY28gY29tbyBwbmdcIixcbiAgXCJoaWRlRW1wdHlBbnN3ZXJzXCI6IFwiT2N1bHRhciByZXNwdWVzdGFzIHZhY8OtYXNcIixcbiAgXCJzaG93RW1wdHlBbnN3ZXJzXCI6IFwiTW9zdHJhciByZXNwdWVzdGFzIHZhY8OtYXNcIixcbiAgXCJ0b3BOVmFsdWVUZXh0LTFcIjogXCJUb2RhcyBsYXMgcmVzcHVlc3Rhc1wiLFxuICBcInRvcE5WYWx1ZVRleHQ1XCI6IFwiTGFzIDUgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICBcInRvcE5WYWx1ZVRleHQxMFwiOiBcIkxhcyAxMCByZXNwdWVzdGFzIHByaW5jaXBhbGVzXCIsXG4gIFwidG9wTlZhbHVlVGV4dDIwXCI6IFwiMjAgcmVzcHVlc3RhcyBwcmluY2lwYWxlc1wiLFxuICBcIm5vVmlzdWFsaXplckZvclF1ZXN0aW9uXCI6IFwiRXN0ZSB0aXBvIGRlIHByZWd1bnRhIGHDum4gbm8gc2UgdmlzdWFsaXphXCIsXG4gIFwibm9SZXN1bHRzXCI6IFwiQcO6biBubyBoYXkgcmVzdWx0YWRvc1wiXG59O1xubG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdHJpbmdzO1xubG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXNcIl0gPSBcIlNwYW5pc2hcIjtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuTW9kZWwgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdO1xuICBwdWJsaWMgY2hhcnRUeXBlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwiYm9vbGVhblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJWYWx1ZSA9IHRoaXMuYm9vbGVhblF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXI7XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYm9vbGVhblF1ZXN0aW9uLnZhbHVlVHJ1ZSA9PT0gY29ycmVjdEFuc3dlclZhbHVlIHx8ICEhY29ycmVjdEFuc3dlclZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxUcnVlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZUZhbHNlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZSA9PT0gY29ycmVjdEFuc3dlclZhbHVlIHx8ICFjb3JyZWN0QW5zd2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIHJldHVybiBjb3JyZWN0QW5zd2VyVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJvb2xlYW5RdWVzdGlvbigpIHtcbiAgICByZXR1cm4gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRydWVDb2xvciA9IFwiXCI7XG4gIHB1YmxpYyBzdGF0aWMgZmFsc2VDb2xvciA9IFwiXCI7XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbUJ5VGV4dChpdGVtVGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKHZhbHVlc1tsYWJlbHMuaW5kZXhPZihpdGVtVGV4dCldLCBpdGVtVGV4dCk7XG4gIH1cblxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVUcnVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJvb2xlYW5RdWVzdGlvbi52YWx1ZVRydWVcbiAgICAgICAgOiB0cnVlLFxuICAgICAgdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5ib29sZWFuUXVlc3Rpb24udmFsdWVGYWxzZVxuICAgICAgICA6IGZhbHNlLFxuICAgIF07XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBsYWJlbHMgPSBbXS5jb25jYXQodGhpcy5nZXRWYWx1ZXMoKSk7XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxhYmVsVHJ1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbHNbMF0gPSB0aGlzLmJvb2xlYW5RdWVzdGlvbi5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vbGVhblF1ZXN0aW9uLmxhYmVsRmFsc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGFiZWxzWzFdID0gdGhpcy5ib29sZWFuUXVlc3Rpb24ubG9jTGFiZWxGYWxzZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TWlzc2luZ0Fuc3dlcnMpIHtcbiAgICAgIGxhYmVsc1syXSA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaXNzaW5nQW5zd2Vyc0xhYmVsXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSB9IGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL2Nob2ljZXMtdGFibGUuc2Nzc1wiKTtcblxuZXhwb3J0IGNsYXNzIENob2ljZXNUYWJsZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBDaG9pY2VzVGFibGUpIHt9XG5cbiAgcHVibGljIGNyZWF0ZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IHRoaXMubW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcblxuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuXG4gICAgY29uc3QgZW1wdHlUZXh0Tm9kZSA9IDxIVE1MRWxlbWVudD5Eb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwicFwiLCBcIlwiLCB7XG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YXNldHMubGVuZ3RoID09PSAwIHx8IGRhdGFzZXRzWzBdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGEsIGlkeCkgPT4ge1xuICAgICAgY29uc3QgdGFibGVOb2RlID0gPEhUTUxUYWJsZUVsZW1lbnQ+KFxuICAgICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgXCJzYS1jaG9pY2VzLXRhYmxlXCIpXG4gICAgICApO1xuXG4gICAgICB0YWJsZU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcblxuICAgICAgdmFyIGhlYWRlclJvdyA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgIHZhciBsYWJlbENlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGhcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsLWhlYWRlclwiLCB7XG4gICAgICAgIHRleHRDb250ZW50OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYW5zd2VyXCIpLFxuICAgICAgfSk7XG4gICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQobGFiZWxDZWxsKTtcbiAgICAgIHZhciBzcGFya2xpbmVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogXCJcIixcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHNwYXJrbGluZUNlbGwpO1xuICAgICAgdmFyIHBlcmNlbnRDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlcmNlbnRcIiksXG4gICAgICB9KTtcbiAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChwZXJjZW50Q2VsbCk7XG4gICAgICB2YXIgdmFsdWVDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRoXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbC1oZWFkZXJcIiwge1xuICAgICAgICB0ZXh0Q29udGVudDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlc3BvbnNlc1wiKSxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHZhbHVlQ2VsbCk7XG4gICAgICB0YWJsZU5vZGUuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcblxuICAgICAgZGF0YS5mb3JFYWNoKChyb3dEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgcm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICB2YXIgbGFiZWxDZWxsID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtY2hvaWNlcy10YWJsZV9fY2VsbFwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IGxhYmVsc1tpbmRleF0sXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQobGFiZWxDZWxsKTtcbiAgICAgICAgdmFyIHNwYXJrbGluZUNlbGwgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGRcIiwgXCJzYS1jaG9pY2VzLXRhYmxlX19jZWxsXCIpO1xuICAgICAgICB2YXIgb3V0ZXJCYXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwic2EtY2hvaWNlcy1zcGFya2xpbmVcIik7XG4gICAgICAgIHZhciBpbm5lckJhciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1jaG9pY2VzLXNwYXJrbGluZS12YWx1ZVwiKTtcbiAgICAgICAgaW5uZXJCYXIuc3R5bGUud2lkdGggPSB0ZXh0c1tpZHhdW2luZGV4XSArIFwiJVwiO1xuICAgICAgICBvdXRlckJhci5hcHBlbmRDaGlsZChpbm5lckJhcik7XG4gICAgICAgIHNwYXJrbGluZUNlbGwuYXBwZW5kQ2hpbGQob3V0ZXJCYXIpO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoc3BhcmtsaW5lQ2VsbCk7XG4gICAgICAgIHZhciBwZXJjZW50Q2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwgc2EtY2hvaWNlcy10YWJsZV9fY2VsbC12YWx1ZVwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IFwiXCIgKyB0ZXh0c1tpZHhdW2luZGV4XSArIFwiJVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHBlcmNlbnRDZWxsKTtcbiAgICAgICAgdmFyIHZhbHVlQ2VsbCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBcInNhLWNob2ljZXMtdGFibGVfX2NlbGwgc2EtY2hvaWNlcy10YWJsZV9fY2VsbC12YWx1ZVwiLCB7XG4gICAgICAgICAgdGV4dENvbnRlbnQ6IHJvd0RhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQodmFsdWVDZWxsKTtcbiAgICAgICAgdGFibGVOb2RlLmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic2EtY2hvaWNlcy10YWJsZV9fY29udGFpbmVyXCI7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaG9pY2VzVGFibGUgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJpdmF0ZSBfY2hvaWNlc1RhYmxlQWRhcHRlcjogQ2hvaWNlc1RhYmxlQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJjaG9pY2VzXCIpO1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIgPSBuZXcgQ2hvaWNlc1RhYmxlQWRhcHRlcih0aGlzKTtcbiAgICB0aGlzLmFuc3dlcnNPcmRlciA9IFwiYXNjXCI7XG4gICAgdGhpcy5zaG93UGVyY2VudGFnZXMgPSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2Nob2ljZXNUYWJsZUFkYXB0ZXIuY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9jaG9pY2VzVGFibGVBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cbn1cblxuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFkaW9ncm91cFwiLCBDaG9pY2VzVGFibGUpO1xuLy8gVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwiZHJvcGRvd25cIiwgQ2hvaWNlc1RhYmxlKTtcbi8vIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNoZWNrYm94XCIsIENob2ljZXNUYWJsZSk7XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5cclxuLyoqXHJcbiAqIERlc2NyaWJlcyBkYXRhIGluZm86XHJcbiAqIGRhdGFOYW1lIC0gcXVlc3Rpb24gbmFtZSwgdXNlZCBhcyBhIGtleSB0byBvYnRhaW4gcXVlc3Rpb24gZGF0YVxyXG4gKiBnZXRWYWx1ZXMgLSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIHBvc3NpYmxlIHZhbHVlc1xyXG4gKiBnZXRMYWJlbHMgLSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgaHVtYW4tZnJpZW5kbHkgZGVzY3JpcHRpb25zIGZvciB2YWx1ZXNcclxuICogZ2V0U2VyaWVzVmFsdWVzIC0gZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBwb3NzaWJsZSBzZXJpZXMgdmFsdWVzXHJcbiAqIGdldFNlcmllc0xhYmVscyAtIGZ1bmN0aW9uIHJldHVybmluZyBhbiBhcnJheSBvZiBodW1hbi1mcmllbmRseSBkZXNjcmlwdGlvbnMgZm9yIHNlcmllcyB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFJbmZvIHtcclxuICBkYXRhTmFtZTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PjtcclxuICBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNWYWx1ZXMoKTogQXJyYXk8c3RyaW5nPjtcclxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGFQcm92aWRlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXJpZXNNYXJrZXJLZXkgPSBcIl9fc2Ffc2VyaWVzX25hbWVcIjtcclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+O1xyXG4gIHByaXZhdGUgX3N0YXRpc3RpY3NDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PEFycmF5PG51bWJlcj4+IHwgQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+IH07XHJcbiAgcHJvdGVjdGVkIGZpbHRlclZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvOiBJRGF0YUluZm8pOiBzdHJpbmcge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUluZm8uZGF0YU5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBkYXRhSW5mby5kYXRhTmFtZS5qb2luKFwiLVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhSW5mby5kYXRhTmFtZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGE6IEFycmF5PGFueT4gPSBbXSwgcHJpdmF0ZSBfZ2V0RGF0YUNvcmU6IChkYXRhSW5mbzogSURhdGFJbmZvKSA9PiBudW1iZXJbXVtdID0gdW5kZWZpbmVkKSB7IH1cclxuXHJcbiAgcHVibGljIHJlc2V0KGRhdGFJbmZvPzogSURhdGFJbmZvKSB7XHJcbiAgICBpZighIWRhdGFJbmZvKSB7XHJcbiAgICAgIGlmKHRoaXMuX3N0YXRpc3RpY3NDYWNoZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdldFN0YXRpc3RpY3NDYWNoZUtleShkYXRhSW5mbyk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXRpc3RpY3NDYWNoZVtjYWNoZUtleV07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9zdGF0aXN0aWNzQ2FjaGUgIT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICB0aGlzLl9maWx0ZXJlZERhdGEgIT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnJhaXNlRGF0YUNoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogQXJyYXk8YW55Pikge1xyXG4gICAgdGhpcy5fZGF0YSA9IFtdLmNvbmNhdChkYXRhKTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuX2ZpbHRlcmVkRGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBmaWx0ZXJLZXlzID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJWYWx1ZXMpO1xyXG4gICAgICBpZiAoZmlsdGVyS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICFPYmplY3Qua2V5cyh0aGlzLmZpbHRlclZhbHVlcykuc29tZShcclxuICAgICAgICAgICAgKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJWYWx1ZXNba2V5XTtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZVR5cGUgPSB0eXBlb2YgZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25WYWx1ZSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVzdGlvblZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSAhPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uVmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPT0gLTE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlc3Rpb25WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlVHlwZSAhPT0gXCJvYmplY3RcIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIXF1ZXN0aW9uQ29udGFpbnNWYWx1ZShxdWVzdGlvblZhbHVlLCBmaWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IHNlcmllc1ZhbHVlID0gaXRlbVtEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XTtcclxuICAgICAgICAgICAgICBpZiAoISFzZXJpZXNWYWx1ZSAmJiBmaWx0ZXJWYWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVzdGlvblZhbHVlICE9PSBmaWx0ZXJWYWx1ZVtzZXJpZXNWYWx1ZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZVR5cGUgPT09IFwib2JqZWN0XCIgJiYgZmlsdGVyVmFsdWUuc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZS5lbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRpbmlvaXVzVmFsdWUgPSB0eXBlb2YgcXVlc3Rpb25WYWx1ZSA9PT0gXCJudW1iZXJcIiA/IHF1ZXN0aW9uVmFsdWUgOiBEYXRlLnBhcnNlKHF1ZXN0aW9uVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvbnRpbmlvaXVzVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbmlvaXVzVmFsdWUgPSBwYXJzZUZsb2F0KHF1ZXN0aW9uVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29udGluaW9pdXNWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRpbmlvaXVzVmFsdWUgPCBmaWx0ZXJWYWx1ZS5zdGFydCB8fCBjb250aW5pb2l1c1ZhbHVlID49IGZpbHRlclZhbHVlLmVuZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSAhPT0gdGhpcy5maWx0ZXJWYWx1ZXNba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGZpbHRlciBieSBxdWVzdGlvbiBuYW1lIGFuZCB2YWx1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKHF1ZXN0aW9uTmFtZTogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBhbnkpIHtcclxuICAgIHZhciBmaWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlsdGVyQ2hhbmdlZCA9IHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gIT09IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmlsdGVyQ2hhbmdlZCA9IHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV0gIT09IHVuZGVmaW5lZDtcclxuICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyVmFsdWVzW3F1ZXN0aW9uTmFtZV07XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsdGVyQ2hhbmdlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0RGF0YUNvcmUoZGF0YUluZm86IElEYXRhSW5mbykge1xyXG4gICAgaWYgKCEhdGhpcy5fZ2V0RGF0YUNvcmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2dldERhdGFDb3JlKGRhdGFJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhTmFtZXMgPSBBcnJheS5pc0FycmF5KGRhdGFJbmZvLmRhdGFOYW1lKSA/IGRhdGFJbmZvLmRhdGFOYW1lIDogW2RhdGFJbmZvLmRhdGFOYW1lXTtcclxuICAgIGNvbnN0IHN0YXRpc3RpY3M6IEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+PiA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGFJbmZvLmdldFZhbHVlcygpO1xyXG4gICAgY29uc3QgdmFsdWVzSW5kZXg6IHsgW2luZGV4OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgdmFsdWVzLmZvckVhY2goKHZhbDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHZhbHVlc0luZGV4W3ZhbF0gPSBpbmRleDtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcHJvY2Vzc01pc3NpbmdBbnN3ZXJzID0gdmFsdWVzLmluZGV4T2YodW5kZWZpbmVkKSAhPT0gLTE7XHJcblxyXG4gICAgY29uc3Qgc2VyaWVzID0gZGF0YUluZm8uZ2V0U2VyaWVzVmFsdWVzKCk7XHJcbiAgICBjb25zdCBzZXJpZXNJbmRleDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICBzZXJpZXMuZm9yRWFjaCgodmFsOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgc2VyaWVzSW5kZXhbdmFsXSA9IGluZGV4O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2VyaWVzTGVuZ3RoID0gc2VyaWVzLmxlbmd0aCB8fCAxO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTmFtZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgZGF0YU5hbWVTdGF0aXN0aWNzID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KCk7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VyaWVzTGVuZ3RoOyArK2opIHtcclxuICAgICAgICBkYXRhTmFtZVN0YXRpc3RpY3MucHVzaChuZXcgQXJyYXk8bnVtYmVyPih2YWx1ZXMubGVuZ3RoKS5maWxsKDApKTtcclxuICAgICAgfVxyXG4gICAgICBzdGF0aXN0aWNzLnB1c2goZGF0YU5hbWVTdGF0aXN0aWNzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICBkYXRhTmFtZXMuZm9yRWFjaCgoZGF0YU5hbWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93VmFsdWU6IGFueSA9IHJvd1tkYXRhTmFtZV07XHJcbiAgICAgICAgaWYgKHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgcHJvY2Vzc01pc3NpbmdBbnN3ZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCByb3dWYWx1ZXMgPSBBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSA/IHJvd1ZhbHVlIDogW3Jvd1ZhbHVlXTtcclxuICAgICAgICAgIGlmIChzZXJpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAocm93W0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAvLyBTZXJpZXMgYXJlIGxhYmVsbGVkIGJ5IHNlcmllc01hcmtlcktleSBpbiByb3cgZGF0YVxyXG4gICAgICAgICAgICAgIGNvbnN0IHNlcmllc05vID1cclxuICAgICAgICAgICAgICAgIHNlcmllc0luZGV4W3Jvd1tEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XV0gfHwgMDtcclxuICAgICAgICAgICAgICByb3dWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0aXN0aWNzW2luZGV4XVtzZXJpZXNOb11bdmFsdWVzSW5kZXhbdmFsXV0rKztcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBTZXJpZXMgYXJlIHRoZSBrZXlzIGluIHF1ZXN0aW9uIHZhbHVlIChtYXRyaXggcXVlc3Rpb24pXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgdGhlIGRlLW5vcm1hbGl6YXRpb24gYW5kIGNvbWJpbmUgd2l0aCB0aGUgcHJldmlvdXMgY2FzZVxyXG4gICAgICAgICAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmllcy5mb3JFYWNoKChzZXJpZXNOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2YWxbc2VyaWVzTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllc05vID0gc2VyaWVzSW5kZXhbc2VyaWVzTmFtZV0gfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzW2luZGV4XVtzZXJpZXNOb11bdmFsdWVzSW5kZXhbdmFsW3Nlcmllc05hbWVdXV0rKztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE5vIHNlcmllc1xyXG4gICAgICAgICAgICByb3dWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiBzdGF0aXN0aWNzWzBdWzBdW3ZhbHVlc0luZGV4W3ZhbF1dKyspO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhSW5mby5kYXRhTmFtZSkgPyBzdGF0aXN0aWNzIDogc3RhdGlzdGljc1swXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgY2FsY3VsYXRlZCBzdGF0aXNjdGljcyBmb3IgdGhlIElEYXRhSW5mbyBvYmplY3QuXHJcbiAgICovXHJcbiAgZ2V0RGF0YShkYXRhSW5mbzogSURhdGFJbmZvKSB7XHJcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0U3RhdGlzdGljc0NhY2hlS2V5KGRhdGFJbmZvKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSA9PT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc3RhdGlzdGljc0NhY2hlW2NhY2hlS2V5XSA9IHRoaXMuZ2V0RGF0YUNvcmUoZGF0YUluZm8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdLmNvbmNhdCh0aGlzLl9zdGF0aXN0aWNzQ2FjaGVbY2FjaGVLZXldKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gZGF0YSBoYXMgYmVlbiBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50PFxyXG4gICAgKHNlbmRlcjogRGF0YVByb3ZpZGVyLCBvcHRpb25zOiBhbnkpID0+IGFueSxcclxuICAgIERhdGFQcm92aWRlcixcclxuICAgIGFueVxyXG4gID4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJhaXNlRGF0YUNoYW5nZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMub25EYXRhQ2hhbmdlZC5pc0VtcHR5KSB7XHJcbiAgICAgIHRoaXMub25EYXRhQ2hhbmdlZC5maXJlKHRoaXMsIHt9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHF1ZXN0aW9uQ29udGFpbnNWYWx1ZShxdWVzdGlvblZhbHVlOiBhbnksIGZpbHRlclZhbHVlOiBhbnkpIHtcclxuICBjb25zdCBxdWVzdGlvblZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHF1ZXN0aW9uVmFsdWUpO1xyXG4gIGNvbnN0IGZpbHRlclZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlclZhbHVlKTtcclxuXHJcbiAgaWYgKGZpbHRlclZhbHVlS2V5cy5sZW5ndGggPiBxdWVzdGlvblZhbHVlS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgZm9yICh2YXIga2V5IG9mIGZpbHRlclZhbHVlS2V5cykge1xyXG4gICAgaWYgKGZpbHRlclZhbHVlW2tleV0gIT0gcXVlc3Rpb25WYWx1ZVtrZXldKSByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuLy9sb2NhbGl6YXRpb25cbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZmFyc2lcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZnJlbmNoXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL25vcndlZ2lhblwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9wb3J0dWd1ZXNlXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL3J1c3NpYW5cIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZHV0Y2hcIjtcbmltcG9ydCBcIi4uL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vc3BhbmlzaFwiO1xuaW1wb3J0IFwiLi4vYW5hbHl0aWNzLWxvY2FsaXphdGlvbi9pdGFsaWFuXCI7XG5pbXBvcnQgXCIuLi9hbmFseXRpY3MtbG9jYWxpemF0aW9uL2FyYWJpY1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vZGF0YVByb3ZpZGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9udW1iZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9zZWxlY3RCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vbWF0cml4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYm9vbGVhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3Zpc3VhbGl6ZXJCYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uUGFuZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uUGFuZWxEeW5hbWljXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hdHJpeER5bmFtaWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWF0cml4RHJvcGRvd25cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9hbHRlcm5hdGl2ZVZpenVhbGl6ZXJzV3JhcHBlclwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vcGxvdGx5L2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vd29yZGNsb3VkL3dvcmRjbG91ZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL3dvcmRjbG91ZC9zdG9wd29yZHMvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vY2hvaWNlcy10YWJsZVwiO1xuXG5leHBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlscy9pbmRleFwiO1xuIiwiaW1wb3J0IHsgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJJbmZvIHtcclxuICBwcml2YXRlIF9odG1sRWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB0ZXh0OiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsaXplcjogSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uKSB7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD4oXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJzYS1xdWVzdGlvbl9fZmlsdGVyXCIpXHJcbiAgICApO1xyXG4gICAgdGhpcy50ZXh0ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcclxuICAgICAgXCJzcGFuXCIsXHJcbiAgICAgIFwic2EtcXVlc3Rpb25fX2ZpbHRlci10ZXh0XCJcclxuICAgICk7XHJcbiAgICB0aGlzLl9odG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRleHQpO1xyXG4gICAgY29uc3QgZmlsdGVyQ2xlYXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xyXG4gICAgICB2aXN1YWxpemVyLnNldFNlbGVjdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQnV0dG9uXCIpKTtcclxuICAgIHRoaXMuX2h0bWxFbGVtZW50LmFwcGVuZENoaWxkKGZpbHRlckNsZWFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaHRtbEVsZW1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faHRtbEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlKHNlbGVjdGlvbjogeyB2YWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcgfSkge1xyXG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX2h0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImZpbHRlclwiKSArIFwiOiBbXCIgKyBzZWxlY3Rpb24udGV4dCArIFwiXVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICB0aGlzLnRleHQuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSXRlbVZhbHVlLCBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtTW9kZWwgZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgcHJvdGVjdGVkIHZhbHVlVHlwZTogXCJkYXRlXCIgfCBcIm51bWJlclwiID0gXCJudW1iZXJcIjtcbiAgcHJpdmF0ZSBfY2FjaGVkVmFsdWVzOiBBcnJheTx7IG9yaWdpbmFsOiBhbnksIGNvbnRpbmlvdXM6IG51bWJlciB9PiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29udGluaW91c0RhdGE6IHsgW3Nlcmllczogc3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jYWNoZWRJbnRlcnZhbHM6IEFycmF5PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcgfT4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2ludGVydmFsUHJlY2lzaW9uOiBudW1iZXIgPSAyO1xuICBwcm90ZWN0ZWQgY2hhcnRUeXBlczogc3RyaW5nW107XG4gIHB1YmxpYyBjaGFydFR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgc3RhdGljIEludGVydmFsc0NvdW50ID0gMTA7XG4gIHB1YmxpYyBzdGF0aWMgVXNlSW50ZXJ2YWxzRnJvbSA9IDEwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcImhpc3RvZ3JhbVwiKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmludGVydmFsUHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2ludGVydmFsUHJlY2lzaW9uID0gdGhpcy5vcHRpb25zLmludGVydmFsUHJlY2lzaW9uO1xuICAgIH1cbiAgICBjb25zdCBxdWVzdGlvblR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgaWYgKHF1ZXN0aW9uVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgKHF1ZXN0aW9uW1wiaW5wdXRUeXBlXCJdID09PSBcImRhdGVcIiB8fCBxdWVzdGlvbltcImlucHV0VHlwZVwiXSA9PT0gXCJkYXRldGltZVwiKSkge1xuICAgICAgdGhpcy52YWx1ZVR5cGUgPSBcImRhdGVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZVR5cGUgPSBcIm51bWJlclwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoKSB7XG4gICAgdGhpcy5fY29udGluaW91c0RhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2FjaGVkVmFsdWVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NhY2hlZEludGVydmFscyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250aW5pb3VzVmFsdWUodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmFsdWVUeXBlID09PSBcImRhdGVcIikge1xuICAgICAgcmV0dXJuIERhdGUucGFyc2UodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZhbHVlVHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHRvUHJlY2lzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBiYXNlID0gTWF0aC5wb3coMTAsIHRoaXMuX2ludGVydmFsUHJlY2lzaW9uKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChiYXNlICogdmFsdWUpIC8gYmFzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscyB8fCB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKS5sZW5ndGggPiBIaXN0b2dyYW1Nb2RlbC5Vc2VJbnRlcnZhbHNGcm9tKSB7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuaW50ZXJ2YWxzLmZpbHRlcihpbnRlcnZhbCA9PiBpbnRlcnZhbC5sYWJlbCA9PT0gaXRlbVRleHQpWzBdO1xuICAgICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUoaW50ZXJ2YWwsIGludGVydmFsICE9PSB1bmRlZmluZWQgPyBpbnRlcnZhbC5sYWJlbCA6IFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpO1xuICAgIGNvbnN0IGxhYmVsSW5kZXggPSBsYWJlbHMuaW5kZXhPZihpdGVtVGV4dCk7XG4gICAgcmV0dXJuIG5ldyBJdGVtVmFsdWUodGhpcy5nZXRWYWx1ZXMoKVtsYWJlbEluZGV4XSwgbGFiZWxzW2xhYmVsSW5kZXhdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHZpc3VhbGl6ZXIgZGF0YS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBzdXBlci5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29udGluaW91c1ZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkVmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNlcmllcyA9IHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCk7XG4gICAgICBpZiAoc2VyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzZXJpZXMucHVzaChcIlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhID0ge307XG4gICAgICBzZXJpZXMuZm9yRWFjaChzZXJpZXNWYWx1ZSA9PiB0aGlzLl9jb250aW5pb3VzRGF0YVtzZXJpZXNWYWx1ZV0gPSBbXSk7XG4gICAgICBjb25zdCBoYXNoID0ge307XG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaChkYXRhSXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlckRhdGEgPSBkYXRhSXRlbVt0aGlzLmRhdGFOYW1lIGFzIHN0cmluZ107XG4gICAgICAgIGlmIChhbnN3ZXJEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXNWYWx1ZSA9IGRhdGFJdGVtW0RhdGFQcm92aWRlci5zZXJpZXNNYXJrZXJLZXldIHx8IFwiXCI7XG4gICAgICAgICAgLy8gVE9ETzogX2NvbnRpbmlvdXNEYXRhIHNob3VsZCBiZSBzb3J0ZWQgaW4gb3JkZXIgdG8gc3BlZWQtdXAgc3RhdGlzdGljcyBjYWxjdWxhdGlvbiBpbiB0aGUgZ2V0RGF0YSBmdW5jdGlvblxuICAgICAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1ZhbHVlXS5wdXNoKHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGFuc3dlckRhdGEpKTtcbiAgICAgICAgICBoYXNoW2Fuc3dlckRhdGFdID0gYW5zd2VyRGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZXMgPSBPYmplY3Qua2V5cyhoYXNoKS5tYXAoa2V5ID0+ICh7IG9yaWdpbmFsOiBoYXNoW2tleV0sIGNvbnRpbmlvdXM6IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlKGtleSkgfSkpO1xuICAgICAgdGhpcy5fY2FjaGVkVmFsdWVzLnNvcnQoKGEsIGIpID0+IGEuY29udGluaW91cyAtIGIuY29udGluaW91cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRWYWx1ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBuZWVkVXNlUmF0ZVZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJyYXRpbmdcIiAmJiBBcnJheS5pc0FycmF5KHRoaXMucXVlc3Rpb25bXCJyYXRlVmFsdWVzXCJdKSAmJiB0aGlzLnF1ZXN0aW9uW1wicmF0ZVZhbHVlc1wiXS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzIHx8IGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoID4gSGlzdG9ncmFtTW9kZWwuVXNlSW50ZXJ2YWxzRnJvbSB8fCB0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMubWFwKGludGVydmFsID0+IGludGVydmFsLnN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRpbmlvdXNWYWx1ZXMubWFwKHZhbHVlID0+IHZhbHVlLm9yaWdpbmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgY29udGluaW91c1ZhbHVlcyA9IHRoaXMuZ2V0Q29udGluaW91c1ZhbHVlcygpO1xuICAgIGlmICh0aGlzLmhhc0N1c3RvbUludGVydmFscyB8fCBjb250aW5pb3VzVmFsdWVzLmxlbmd0aCA+IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20gfHwgdGhpcy5uZWVkVXNlUmF0ZVZhbHVlcykge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxzLm1hcChpbnRlcnZhbCA9PiBpbnRlcnZhbC5sYWJlbCk7XG4gICAgfVxuICAgIHJldHVybiBjb250aW5pb3VzVmFsdWVzLm1hcCh2YWx1ZSA9PiBcIlwiICsgdmFsdWUub3JpZ2luYWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDdXN0b21JbnRlcnZhbHMoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbk9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnF1ZXN0aW9uT3B0aW9ucy5pbnRlcnZhbHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcnZhbHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbk9wdGlvbnMuaW50ZXJ2YWxzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBpZih0aGlzLm5lZWRVc2VSYXRlVmFsdWVzKSB7XG4gICAgICBjb25zdCByYXRlVmFsdWVzID0gdGhpcy5xdWVzdGlvbltcInJhdGVWYWx1ZXNcIl0gYXMgSXRlbVZhbHVlW107XG4gICAgICByZXR1cm4gcmF0ZVZhbHVlcy5tYXAoKHJhdGVWYWx1ZSwgaSkgPT4gKHtcbiAgICAgICAgc3RhcnQ6IHJhdGVWYWx1ZS52YWx1ZSxcbiAgICAgICAgZW5kOiBpIDwgcmF0ZVZhbHVlcy5sZW5ndGggLSAxID8gcmF0ZVZhbHVlc1tpICsgMV0udmFsdWUgOiByYXRlVmFsdWUudmFsdWUgKyAxLFxuICAgICAgICBsYWJlbDogcmF0ZVZhbHVlLnRleHRcbiAgICAgIH0pKS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NhY2hlZEludGVydmFscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjb250aW5pb3VzVmFsdWVzID0gdGhpcy5nZXRDb250aW5pb3VzVmFsdWVzKCk7XG4gICAgICB0aGlzLl9jYWNoZWRJbnRlcnZhbHMgPSBbXTtcbiAgICAgIGlmIChjb250aW5pb3VzVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBsZXQgc3RhcnQgPSBjb250aW5pb3VzVmFsdWVzWzBdLmNvbnRpbmlvdXM7XG4gICAgICAgIGNvbnN0IGVuZCA9IGNvbnRpbmlvdXNWYWx1ZXNbY29udGluaW91c1ZhbHVlcy5sZW5ndGggLSAxXS5jb250aW5pb3VzO1xuICAgICAgICBjb25zdCBpbnRlcnZhbHNDb3VudCA9IEhpc3RvZ3JhbU1vZGVsLkludGVydmFsc0NvdW50O1xuICAgICAgICBjb25zdCBkZWx0YSA9IChlbmQgLSBzdGFydCkgLyBpbnRlcnZhbHNDb3VudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcnZhbHNDb3VudDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHN0YXJ0ICsgZGVsdGE7XG4gICAgICAgICAgY29uc3QgaXN0YXJ0ID0gdGhpcy50b1ByZWNpc2lvbihzdGFydCk7XG4gICAgICAgICAgY29uc3QgaW5leHQgPSB0aGlzLnRvUHJlY2lzaW9uKG5leHQpO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0OiBpc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGluZXh0LFxuICAgICAgICAgICAgbGFiZWw6IFwiXCIgKyB0aGlzLmdldFN0cmluZyhpc3RhcnQpICsgXCItXCIgKyB0aGlzLmdldFN0cmluZyhpbmV4dClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdGFydCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZEludGVydmFscztcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhKCkge1xuICAgIGNvbnN0IGNvbnRpbmlvdXNWYWx1ZXMgPSB0aGlzLmdldENvbnRpbmlvdXNWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMuaGFzQ3VzdG9tSW50ZXJ2YWxzICYmIGNvbnRpbmlvdXNWYWx1ZXMubGVuZ3RoIDw9IEhpc3RvZ3JhbU1vZGVsLlVzZUludGVydmFsc0Zyb20pIHtcbiAgICAgIHJldHVybiBzdXBlci5nZXREYXRhKCk7XG4gICAgfVxuICAgIGNvbnN0IGludGVydmFscyA9IHRoaXMuaW50ZXJ2YWxzO1xuICAgIGNvbnN0IHN0YXRpc3RpY3M6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBpZiAoc2VyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VyaWVzLnB1c2goXCJcIik7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBzdGF0aXN0aWNzLnB1c2goaW50ZXJ2YWxzLm1hcChpID0+IDApKTtcbiAgICAgIHRoaXMuX2NvbnRpbmlvdXNEYXRhW3Nlcmllc1tpXV0uZm9yRWFjaChkYXRhVmFsdWUgPT4ge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGludGVydmFscy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIGlmIChpbnRlcnZhbHNbal0uc3RhcnQgPD0gZGF0YVZhbHVlICYmIChkYXRhVmFsdWUgPCBpbnRlcnZhbHNbal0uZW5kIHx8IGogPT0gaW50ZXJ2YWxzLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICBzdGF0aXN0aWNzW2ldW2pdKys7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGlzdGljcztcbiAgfVxufVxuIiwiY29uc3QgTXV1cmkgPSByZXF1aXJlKFwibXV1cmlcIik7XHJcblxyXG5leHBvcnQgY2xhc3MgTGF5b3V0RW5naW5lIHtcclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2FsbG93ZWQ6IGJvb2xlYW4pIHt9XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydENvcmUoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge31cclxuICBwcm90ZWN0ZWQgc3RvcENvcmUoKSB7fVxyXG4gIHByb3RlY3RlZCB1cGRhdGVDb3JlKCkge31cclxuXHJcbiAgZ2V0IGFsbG93ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZDtcclxuICB9XHJcblxyXG4gIHN0YXJ0KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb3JlKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkge1xyXG4gICAgICB0aGlzLnN0b3BDb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29yZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHt9XHJcbiAgcmVtb3ZlKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHt9XHJcblxyXG4gIG9uTW92ZUNhbGxiYWNrOiAoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikgPT4gdm9pZDtcclxuXHJcbiAgZGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3RvcCgpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE11dXJpTGF5b3V0RW5naW5lIGV4dGVuZHMgTGF5b3V0RW5naW5lIHtcclxuICBwcml2YXRlIF9tdXVyaTogYW55ID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2xheW91dGluZ1RpbWVyOiBhbnkgPSB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFsbG93ZWQ6IGJvb2xlYW4sIHByaXZhdGUgX3NlbGVjdG9yOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKGFsbG93ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXJ0Q29yZShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9tdXVyaSA9IG5ldyBNdXVyaShjb250YWluZXIsIHtcclxuICAgICAgZHJhZ1N0YXJ0UHJlZGljYXRlOiB7XHJcbiAgICAgICAgaGFuZGxlOiBcIi5zYS1xdWVzdGlvbl9fdGl0bGUtLWRyYWdnYWJsZVwiLFxyXG4gICAgICB9LFxyXG4gICAgICBpdGVtczogdGhpcy5fc2VsZWN0b3IsXHJcbiAgICAgIGRyYWdFbmFibGVkOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tdXVyaS5vbihcclxuICAgICAgXCJkcmFnUmVsZWFzZUVuZFwiLFxyXG4gICAgICAoZGF0YTogYW55KSA9PlxyXG4gICAgICAgIHRoaXMub25Nb3ZlQ2FsbGJhY2sgJiYgdGhpcy5vbk1vdmVDYWxsYmFjayhkYXRhLmZyb21JbmRleCwgZGF0YS50b0luZGV4KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHN0b3BDb3JlKCkge1xyXG4gICAgdGhpcy5fbXV1cmkub2ZmKFwiZHJhZ1JlbGVhc2VFbmRcIik7XHJcbiAgICB0aGlzLl9tdXVyaS5kZXN0cm95KCk7XHJcbiAgICB0aGlzLl9tdXVyaSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUNvcmUoKSB7XHJcbiAgICBpZiAodGhpcy5fbGF5b3V0aW5nVGltZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fbGF5b3V0aW5nVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fbGF5b3V0aW5nVGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuX211dXJpLnJlZnJlc2hJdGVtcygpO1xyXG4gICAgICB0aGlzLl9tdXVyaS5sYXlvdXQoKTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGFkZChlbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+LCBvcHRpb25zPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZCkgdGhpcy5fbXV1cmkuYWRkKGVsZW1lbnRzLCBvcHRpb25zKTtcclxuICB9XHJcbiAgcmVtb3ZlKGVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4sIG9wdGlvbnM/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9hbGxvd2VkKSB0aGlzLl9tdXVyaS5yZW1vdmUoZWxlbWVudHMsIG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBlbmdsaXNoU3RyaW5ncyB9IGZyb20gXCIuL2FuYWx5dGljcy1sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIGxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgbG9jYWxlTmFtZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIHN1cHBvcnRlZExvY2FsZXM6IDxBcnJheTxhbnk+PltdLFxuICBnZXQgY3VycmVudExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPT09IHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlXG4gICAgICA/IFwiXCJcbiAgICAgIDogdGhpcy5jdXJyZW50TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBjdXJyZW50TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldCBkZWZhdWx0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGRlZmF1bHRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoc3RyTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2FsZVxuICAgICAgPyB0aGlzLmxvY2FsZXNbdGhpcy5jdXJyZW50TG9jYWxlXVxuICAgICAgOiB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICBpZiAoIWxvYyB8fCAhbG9jW3N0ck5hbWVdKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICB2YXIgcmVzdWx0ID0gbG9jW3N0ck5hbWVdO1xuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV0gfHwgc3RyTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24gKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5sb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+bG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJQW5zd2Vyc0RhdGEsIFNlbGVjdEJhc2UgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBTZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibWF0cml4XCIpO1xuICAgIHRoaXMuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbWF0cml4UXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbk1hdHJpeE1vZGVsPnRoaXMucXVlc3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdXBwb3J0TWlzc2luZ0Fuc3dlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLnJvd3MubWFwKChyb3c6IEl0ZW1WYWx1ZSkgPT4gXCJcIiArIHJvdy52YWx1ZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PlxuICAgICAgSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMubWF0cml4UXVlc3Rpb24ucm93cywgcm93LnZhbHVlKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gICAgKVswXTtcbiAgfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICBkYXRhc2V0czogQXJyYXk8QXJyYXk8YW55Pj5cbiAgKTogQXJyYXk8Ym9vbGVhbj4ge1xuICAgIGxldCByZXN1bHQ6IEFycmF5PGJvb2xlYW4+ID0gQXJyYXk8Ym9vbGVhbj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRhdGFzZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChkYXRhc2V0c1tqXVtpXSAhPSAwKSB7XG4gICAgICAgICAgcmVzdWx0W2ldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIYXNBbnN3ZXJzSW5TZXJpZXMoZGF0YXNldDogQXJyYXk8YW55Pikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGRhdGFzZXRbaV0gIT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQW5zd2Vyc0RhdGEgPSB7XG4gICAgICBkYXRhc2V0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgICB0ZXh0czogPEFycmF5PEFycmF5PGFueT4+PltdLFxuICAgICAgc2VyaWVzTGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyID0gdGhpcy5nZXRIYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJheShcbiAgICAgIGFuc3dlcnNEYXRhLmRhdGFzZXRzXG4gICAgKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBoYXNBbnN3ZXJzSW5TZXJpZXMgPSB0aGlzLmdldEhhc0Fuc3dlcnNJblNlcmllcyhcbiAgICAgICAgYW5zd2Vyc0RhdGEuZGF0YXNldHNbaV1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luU2VyaWVzKSB7XG4gICAgICAgIHJlc3VsdC5sYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5sYWJlbHNbaV0pO1xuICAgICAgICByZXN1bHQuY29sb3JzLnB1c2goYW5zd2Vyc0RhdGEuY29sb3JzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldHMgPSBbXTtcbiAgICAgIGNvbnN0IHRleHRzID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChoYXNBbnN3ZXJzSW5BbGxTZXJpZXNBcnJbal0pIHtcbiAgICAgICAgICBkYXRhc2V0cy5wdXNoKGFuc3dlcnNEYXRhLmRhdGFzZXRzW2ldW2pdKTtcbiAgICAgICAgICB0ZXh0cy5wdXNoKGFuc3dlcnNEYXRhLnRleHRzW2ldW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LmRhdGFzZXRzLnB1c2goZGF0YXNldHMpO1xuICAgICAgcmVzdWx0LnRleHRzLnB1c2godGV4dHMpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQW5zd2Vyc0luQWxsU2VyaWVzQXJyW2ldKSB7XG4gICAgICAgIHJlc3VsdC5zZXJpZXNMYWJlbHMucHVzaChhbnN3ZXJzRGF0YS5zZXJpZXNMYWJlbHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldERhdGEoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsLCB2YWx1ZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAgIChzZXJpZXNOYW1lLCBzZXJpZXNJbmRleCkgPT4gc3RhdGlzdGljc1tzZXJpZXNJbmRleF1bdmFsdWVJbmRleF1cbiAgICAgICAgKTtcbiAgICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcmVwYXJlZERhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aXN0aWNzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCwgUXVlc3Rpb24sIE1hdHJpeERyb3Bkb3duQ29sdW1uLCBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSUFuc3dlcnNEYXRhLCBTZWxlY3RCYXNlIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Hcm91cGVkIGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIm1hdHJpeERyb3Bkb3duR3JvdXBlZFwiKTtcbiAgICB0aGlzLmdldEFuc3dlcnNEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG1hdHJpeFF1ZXN0aW9uKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpcy5xdWVzdGlvbjtcbiAgfVxuXG4gIGdldCBkYXRhTmFtZSgpOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgZ2V0U2VyaWVzVmFsdWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeFF1ZXN0aW9uLmNvbHVtbnMubWFwKChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBnZXRTZXJpZXNMYWJlbHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IGNvbHVtbi50aXRsZSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jb2x1bW5zLmZpbHRlcihcbiAgLy8gICAgIChjb2x1bW46IEl0ZW1WYWx1ZSkgPT4gY29sdW1uLnRleHQgPT09IGl0ZW1UZXh0XG4gIC8vICAgKVswXTtcbiAgLy8gfVxuXG4gIHZhbHVlc1NvdXJjZSgpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhRdWVzdGlvbi5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5tYXRyaXhRdWVzdGlvbi5yb3dzLm1hcChyb3cgPT4gcm93LnZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRpc3RpY3MgPSB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHtcbiAgICAgIGRhdGFOYW1lOiBzZXJpZXMsXG4gICAgICBnZXRWYWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICAgIGdldExhYmVsczogKCkgPT4gdmFsdWVzLFxuICAgICAgZ2V0U2VyaWVzVmFsdWVzOiAoKSA9PiByb3dzLFxuICAgICAgZ2V0U2VyaWVzTGFiZWxzOiAoKSA9PiByb3dzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJlcGFyZWREYXRhOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwsIHZhbHVlSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAoc2VyaWVzTmFtZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdWzBdW3ZhbHVlSW5kZXhdXG4gICAgICApO1xuICAgICAgcHJlcGFyZWREYXRhLnB1c2goc2VyaWVzRGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXBhcmVkRGF0YTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNsYXNzIE51bWJlck1vZGVsIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcml2YXRlIF9yZXN1bHRBdmVyYWdlOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jlc3VsdE1pbjogbnVtYmVyO1xuICBwcml2YXRlIF9yZXN1bHRNYXg6IG51bWJlcjtcblxuICBwdWJsaWMgc3RhdGljIHN0ZXBzQ291bnQgPSA1O1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlVGV4dHNDYWxsYmFjazogKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgc3RlcHNDb3VudDogbnVtYmVyLFxuICAgIHRleHRzOiBzdHJpbmdbXVxuICApID0+IHN0cmluZ1tdO1xuXG4gIHByb3RlY3RlZCBjaGFydFR5cGVzOiBBcnJheTxzdHJpbmc+O1xuICBjaGFydFR5cGU6IFN0cmluZztcblxuICBwdWJsaWMgc3RhdGljIHNob3dBc1BlcmNlbnRhZ2UgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwibnVtYmVyXCIpO1xuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImNoYW5nZUNoYXJ0VHlwZVwiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgIHRoaXMuY2hhcnRUeXBlcy5tYXAoKGNoYXJ0VHlwZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGNoYXJ0VHlwZSxcbiAgICAgICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNoYXJ0VHlwZV9cIiArIGNoYXJ0VHlwZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIChvcHRpb246IGFueSkgPT4gdGhpcy5jaGFydFR5cGUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldENoYXJ0VHlwZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLl9yZXN1bHRBdmVyYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1pbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZXN1bHRNYXggPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIub25EYXRhQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2hhcnRUeXBlQ2hhbmdlZCgpIHt9XG5cbiAgcHJvdGVjdGVkIHNldENoYXJ0VHlwZShjaGFydFR5cGU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhcnRUeXBlcy5pbmRleE9mKGNoYXJ0VHlwZSkgIT09IC0xICYmXG4gICAgICB0aGlzLmNoYXJ0VHlwZSAhPT0gY2hhcnRUeXBlXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYXJ0VHlwZSA9IGNoYXJ0VHlwZTtcbiAgICAgIHRoaXMub25DaGFydFR5cGVDaGFuZ2VkKCk7XG4gICAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVzdWx0TWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3VsdE1heCA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gIH1cblxuICBnZW5lcmF0ZVRleHQobWF4VmFsdWU6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgc3RlcHNDb3VudDogbnVtYmVyKSB7XG4gICAgbGV0IHRleHRzOiBhbnkgPSBbXTtcblxuICAgIGlmIChzdGVwc0NvdW50ID09PSA1KSB7XG4gICAgICB0ZXh0cyA9IFtcbiAgICAgICAgXCJ2ZXJ5IGhpZ2ggKFwiICsgbWF4VmFsdWUgKyBcIilcIixcbiAgICAgICAgXCJoaWdoXCIsXG4gICAgICAgIFwibWVkaXVtXCIsXG4gICAgICAgIFwibG93XCIsXG4gICAgICAgIFwidmVyeSBsb3cgKFwiICsgbWluVmFsdWUgKyBcIilcIixcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHRzLnB1c2gobWF4VmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwc0NvdW50IC0gMjsgaSsrKSB7XG4gICAgICAgIHRleHRzLnB1c2goXCJcIik7XG4gICAgICB9XG4gICAgICB0ZXh0cy5wdXNoKG1pblZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoISFOdW1iZXJNb2RlbC5nZW5lcmF0ZVRleHRzQ2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBOdW1iZXJNb2RlbC5nZW5lcmF0ZVRleHRzQ2FsbGJhY2soXG4gICAgICAgIHRoaXMucXVlc3Rpb24sXG4gICAgICAgIG1heFZhbHVlLFxuICAgICAgICBtaW5WYWx1ZSxcbiAgICAgICAgc3RlcHNDb3VudCxcbiAgICAgICAgdGV4dHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHRzO1xuICB9XG5cbiAgZ2VuZXJhdGVWYWx1ZXMobWF4VmFsdWU6IG51bWJlciwgc3RlcHNDb3VudDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQ7IGkrKykge1xuICAgICAgdmFsdWVzLnB1c2gobWF4VmFsdWUgLyBzdGVwc0NvdW50KTtcbiAgICB9XG5cbiAgICB2YWx1ZXMucHVzaChtYXhWYWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2VuZXJhdGVDb2xvcnMobWF4VmFsdWU6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgc3RlcHNDb3VudDogbnVtYmVyKSB7XG4gICAgY29uc3QgcGFsZXR0ZSA9IHRoaXMuZ2V0Q29sb3JzKCk7XG4gICAgY29uc3QgY29sb3JzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzQ291bnQ7IGkrKykge1xuICAgICAgY29sb3JzLnB1c2gocGFsZXR0ZVtpXSk7XG4gICAgfVxuXG4gICAgY29sb3JzLnB1c2goXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDApXCIpO1xuXG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9yZXN1bHRNaW4gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fcmVzdWx0TWF4ID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuX3Jlc3VsdE1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB0aGlzLl9yZXN1bHRNYXggPSAtTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSAwO1xuICAgICAgbGV0IGFjdHVhbEFuc3dlckNvdW50ID0gMDtcblxuICAgICAgdGhpcy5kYXRhLmZvckVhY2goKHJvd0RhdGEpID0+IHtcbiAgICAgICAgaWYocm93RGF0YVt0aGlzLnF1ZXN0aW9uLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvblZhbHVlOiBudW1iZXIgPSArcm93RGF0YVt0aGlzLnF1ZXN0aW9uLm5hbWVdO1xuICAgICAgICAgIGFjdHVhbEFuc3dlckNvdW50Kys7XG4gICAgICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSArPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIGlmICh0aGlzLl9yZXN1bHRNaW4gPiBxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHRNaW4gPSBxdWVzdGlvblZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fcmVzdWx0TWF4IDwgcXVlc3Rpb25WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzdWx0TWF4ID0gcXVlc3Rpb25WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZihhY3R1YWxBbnN3ZXJDb3VudCA+IDApIHtcbiAgICAgICAgdGhpcy5fcmVzdWx0QXZlcmFnZSA9IHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgLyBhY3R1YWxBbnN3ZXJDb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jlc3VsdEF2ZXJhZ2UgPSBNYXRoLmNlaWwodGhpcy5fcmVzdWx0QXZlcmFnZSAqIDEwMCkgLyAxMDA7XG4gICAgfVxuICAgIHJldHVybiBbdGhpcy5fcmVzdWx0QXZlcmFnZSwgdGhpcy5fcmVzdWx0TWluLCB0aGlzLl9yZXN1bHRNYXhdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBCb29sZWFuTW9kZWwgfSBmcm9tIFwiLi4vYm9vbGVhblwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUJvb2xDaGFydEFkYXB0ZXIgZXh0ZW5kcyBQbG90bHlDaGFydEFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihtb2RlbDogQm9vbGVhblBsb3RseSkge1xuICAgIHN1cGVyKG1vZGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXRjaENvbmZpZ1BhcmFtZXRlcnMoXG4gICAgY2hhcnROb2RlOiBvYmplY3QsXG4gICAgdHJhY2VzOiBBcnJheTxvYmplY3Q+LFxuICAgIGxheW91dDogb2JqZWN0LFxuICAgIGNvbmZpZzogb2JqZWN0XG4gICkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMubW9kZWwuZ2V0Q29sb3JzKCk7XG4gICAgY29uc3QgYm9vbENvbG9ycyA9IFtcbiAgICAgIEJvb2xlYW5QbG90bHkudHJ1ZUNvbG9yIHx8IGNvbG9yc1swXSxcbiAgICAgIEJvb2xlYW5QbG90bHkuZmFsc2VDb2xvciB8fCBjb2xvcnNbMV0sXG4gICAgXTtcbiAgICBpZih0aGlzLm1vZGVsLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgYm9vbENvbG9ycy5wdXNoKGNvbG9yc1syXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcInBpZVwiIHx8IHRoaXMubW9kZWwuY2hhcnRUeXBlID09PSBcImRvdWdobnV0XCIpIHtcbiAgICAgIHRyYWNlcy5mb3JFYWNoKCh0cmFjZTogYW55KSA9PiB7XG4gICAgICAgIHRyYWNlLm1hcmtlci5jb2xvcnMgPSBib29sQ29sb3JzO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIikge1xuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlOiBhbnkpID0+IHtcbiAgICAgICAgdHJhY2UubWFya2VyLmNvbG9yID0gYm9vbENvbG9ycztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhblBsb3RseSBleHRlbmRzIEJvb2xlYW5Nb2RlbCB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wicGllXCIsIFwiYmFyXCIsIFwiZG91Z2hudXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBCb29sZWFuUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlCb29sQ2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImJvb2xlYW5cIiwgQm9vbGVhblBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IEhpc3RvZ3JhbU1vZGVsIH0gZnJvbSBcIi4uL2hpc3RvZ3JhbVwiO1xuaW1wb3J0IHsgUGxvdGx5Q2hhcnRBZGFwdGVyIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVBsb3RseSBleHRlbmRzIEhpc3RvZ3JhbU1vZGVsIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJ2YmFyXCIsIFwiYmFyXCIsIFwic2NhdHRlclwiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zPzogT2JqZWN0LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUpO1xuICAgIHRoaXMuY2hhcnRUeXBlcyA9IEhpc3RvZ3JhbVBsb3RseS50eXBlcztcbiAgICB0aGlzLmNoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIgPSBuZXcgUGxvdGx5Q2hhcnRBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+KFxuICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldERhdGEoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsLCB2YWx1ZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAgIChzZXJpZXNWYWx1ZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICAgICk7XG4gICAgICAgIHByZXBhcmVkRGF0YS5wdXNoKHNlcmllc0RhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGlzdGljcztcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkYXRlXCIsIEhpc3RvZ3JhbVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJudW1iZXJcIiwgSGlzdG9ncmFtUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhdGluZ1wiLCBIaXN0b2dyYW1QbG90bHkpO1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vc2V0dXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdEJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdHJpeFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYm9vbGVhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmFua2luZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGlzdG9ncmFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYXRpbmdcIjtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiLi4vbWF0cml4XCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4UGxvdGx5IGV4dGVuZHMgTWF0cml4IHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJiYXJcIiwgXCJzdGFja2VkYmFyXCIsIFwicGllXCIsIFwiZG91Z2hudXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBNYXRyaXhQbG90bHkudHlwZXM7XG4gICAgdGhpcy5jaGFydFR5cGUgPSB0aGlzLmNoYXJ0VHlwZXNbMF07XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyID0gbmV3IFBsb3RseUNoYXJ0QWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmRlc3Ryb3koPEhUTUxFbGVtZW50PmNvbnRhaW5lci5jaGlsZHJlblswXSk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGFydE5vZGU6IEhUTUxFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2hhcnROb2RlKTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuY3JlYXRlKGNoYXJ0Tm9kZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwibWF0cml4XCIsIE1hdHJpeFBsb3RseSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYXRyaXhEcm9wZG93bkdyb3VwZWQgfSBmcm9tIFwiLi4vbWF0cml4RHJvcGRvd25Hcm91cGVkXCI7XG5pbXBvcnQgeyBQbG90bHlDaGFydEFkYXB0ZXIgfSBmcm9tIFwiLi9zZWxlY3RCYXNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Hcm91cGVkUGxvdGx5IGV4dGVuZHMgTWF0cml4RHJvcGRvd25Hcm91cGVkIHtcbiAgcHJpdmF0ZSBfY2hhcnRBZGFwdGVyOiBQbG90bHlDaGFydEFkYXB0ZXI7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXMgPSBbXCJzdGFja2VkYmFyXCIsIFwiYmFyXCIsIFwicGllXCIsIFwiZG91Z2hudXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3QsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSk7XG4gICAgdGhpcy5jaGFydFR5cGVzID0gTWF0cml4RHJvcGRvd25Hcm91cGVkUGxvdGx5LnR5cGVzO1xuICAgIHRoaXMuY2hhcnRUeXBlID0gdGhpcy5jaGFydFR5cGVzWzBdO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm1hdHJpeGRyb3Bkb3duLWdyb3VwZWRcIiwgTWF0cml4RHJvcGRvd25Hcm91cGVkUGxvdGx5KTtcbiIsImltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBTZWxlY3RCYXNlUGxvdGx5IH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUmFua2luZ1Bsb3RseSBleHRlbmRzIFNlbGVjdEJhc2VQbG90bHkge1xuICBnZXRRdWVzdGlvblJlc3VsdHMoKSB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoZGF0YUl0ZW0pID0+IGRhdGFJdGVtW25hbWVdKTtcbiAgfVxuXG4gIGdldEVtcHR5RGF0YSgpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICBsZXQgZGF0YTogYW55ID0gW107XG5cbiAgICBkYXRhLmxlbmd0aCA9IGNob2ljZXMubGVuZ3RoO1xuICAgIGRhdGEuZmlsbCgwKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0UXVlc3Rpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG5cbiAgICBsZXQgcGxvdGx5RGF0YSA9IHRoaXMuZ2V0RW1wdHlEYXRhKCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5hcHBseVJlc3VsdFRvUGxvdGx5RGF0YShyZXN1bHQsIHBsb3RseURhdGEsIGNob2ljZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtwbG90bHlEYXRhXTtcbiAgfVxuXG4gIGFwcGx5UmVzdWx0VG9QbG90bHlEYXRhKHJlc3VsdDogYW55W10sIHBsb3RseURhdGE6IGFueSwgY2hvaWNlczogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQgfHwgIXBsb3RseURhdGEgfHwgIWNob2ljZXMpIHJldHVybjtcblxuICAgIHJlc3VsdC5mb3JFYWNoKChyZXN1bHRWYWx1ZTogYW55LCByZXN1bHRWYWx1ZUluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55W10pID0+IHtcbiAgICAgIGxldCBpbmRleCA9IGNob2ljZXMuaW5kZXhPZihyZXN1bHRWYWx1ZSk7XG4gICAgICBwbG90bHlEYXRhW2luZGV4XSA9XG4gICAgICAgICtwbG90bHlEYXRhW2luZGV4XSArIChyZXN1bHQubGVuZ3RoIC0gcmVzdWx0VmFsdWVJbmRleCk7XG4gICAgfSk7XG4gIH1cbn1cblxuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmFua2luZ1wiLCBSYW5raW5nUGxvdGx5KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBOdW1iZXJNb2RlbCB9IGZyb20gXCIuLi9udW1iZXJcIjtcbmltcG9ydCB7IFZpc3VhbGl6YXRpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBhbGxvd0RvbVJlbmRlcmluZywgRGF0YUhlbHBlciwgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBQbG90bHlTZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgUGxvdGx5IGZyb20gXCJwbG90bHkuanMtZGlzdC1taW5cIjtcblxuZXhwb3J0IGNsYXNzIFBsb3RseUdhdWdlQWRhcHRlciB7XG4gIHByaXZhdGUgX2NoYXJ0OiBQcm9taXNlPFBsb3RseS5QbG90bHlIVE1MRWxlbWVudD4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogR2F1Z2VQbG90bHkpIHt9XG5cbiAgcHVibGljIGdldCBjaGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhcnQ7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IHRoaXMubW9kZWwucXVlc3Rpb247XG4gICAgbGV0IFtsZXZlbCwgbWluVmFsdWUsIG1heFZhbHVlXSA9IHRoaXMubW9kZWwuZ2V0RGF0YSgpO1xuXG4gICAgaWYgKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJyYXRpbmdcIikge1xuICAgICAgY29uc3QgcmF0ZVZhbHVlcyA9ICg8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbikudmlzaWJsZVJhdGVWYWx1ZXM7XG4gICAgICBtYXhWYWx1ZSA9IHJhdGVWYWx1ZXNbcmF0ZVZhbHVlcy5sZW5ndGggLSAxXS52YWx1ZTtcbiAgICAgIG1pblZhbHVlID0gcmF0ZVZhbHVlc1swXS52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLm1vZGVsLmdlbmVyYXRlQ29sb3JzKFxuICAgICAgbWF4VmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIEdhdWdlUGxvdGx5LnN0ZXBzQ291bnRcbiAgICApO1xuXG4gICAgaWYgKEdhdWdlUGxvdGx5LnNob3dBc1BlcmNlbnRhZ2UpIHtcbiAgICAgIGxldmVsID0gRGF0YUhlbHBlci50b1BlcmNlbnRhZ2UobGV2ZWwsIG1heFZhbHVlKTtcbiAgICAgIG1pblZhbHVlID0gRGF0YUhlbHBlci50b1BlcmNlbnRhZ2UobWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgIG1heFZhbHVlID0gRGF0YUhlbHBlci50b1BlcmNlbnRhZ2UobWF4VmFsdWUsIG1heFZhbHVlKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YTogYW55ID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcImluZGljYXRvclwiLFxuICAgICAgICBtb2RlOiBcImdhdWdlK251bWJlclwiLFxuICAgICAgICBnYXVnZToge1xuICAgICAgICAgIGF4aXM6IHsgcmFuZ2U6IFttaW5WYWx1ZSwgbWF4VmFsdWVdIH0sXG4gICAgICAgICAgc2hhcGU6IHRoaXMubW9kZWwuY2hhcnRUeXBlLFxuICAgICAgICAgIGJnY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICBiYXI6IHsgY29sb3I6IGNvbG9yc1swXSB9LFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogbGV2ZWwsXG4gICAgICAgIHRleHQ6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICAgIGRvbWFpbjogeyB4OiBbMCwgMV0sIHk6IFswLCAxXSB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdmFyIGxheW91dDphbnkgPSB7XG4gICAgICBwbG90X2JnY29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgcGFwZXJfYmdjb2xvcjogdGhpcy5tb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJidWxsZXRcIikge1xuICAgICAgbGF5b3V0LmhlaWdodCA9IDI1MDtcbiAgICAgIGxheW91dC53aWR0aCA9IDYwMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBkaXNwbGF5TW9kZUJhcjogZmFsc2UsXG4gICAgICBzdGF0aWNQbG90OiB0cnVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWVcbiAgICB9O1xuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgbGF5b3V0OiBsYXlvdXQsXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICB9O1xuICAgIFBsb3RseVNldHVwLm9uUGxvdENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gKDxhbnk+UGxvdGx5KS5uZXdQbG90KFxuICAgICAgY2hhcnROb2RlLFxuICAgICAgb3B0aW9ucy5kYXRhLFxuICAgICAgb3B0aW9ucy5sYXlvdXQsXG4gICAgICBvcHRpb25zLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICg8YW55PlBsb3RseSkucHVyZ2Uobm9kZSk7XG4gICAgdGhpcy5fY2hhcnQgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUGxvdGx5IGV4dGVuZHMgTnVtYmVyTW9kZWwge1xuICBwcml2YXRlIF9jaGFydEFkYXB0ZXI6IFBsb3RseUdhdWdlQWRhcHRlcjtcblxuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wiZ2F1Z2VcIiwgXCJidWxsZXRcIl07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lKTtcbiAgICB0aGlzLmNoYXJ0VHlwZXMgPSBHYXVnZVBsb3RseS50eXBlcztcbiAgICB0aGlzLmNoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIgPSBuZXcgUGxvdGx5R2F1Z2VBZGFwdGVyKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9jaGFydEFkYXB0ZXIuZGVzdHJveSg8SFRNTEVsZW1lbnQ+Y29udGFpbmVyLmNoaWxkcmVuWzBdKTtcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGFydE5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5jcmVhdGUoY2hhcnROb2RlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJudW1iZXJcIiwgR2F1Z2VQbG90bHkpO1xuVmlzdWFsaXphdGlvbk1hbmFnZXIucmVnaXN0ZXJWaXN1YWxpemVyKFwicmF0aW5nXCIsIEdhdWdlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImV4cHJlc3Npb25cIiwgR2F1Z2VQbG90bHkpO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IGFsbG93RG9tUmVuZGVyaW5nLCBEYXRhSGVscGVyLCBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCBQbG90bHkgZnJvbSBcInBsb3RseS5qcy1kaXN0LW1pblwiO1xuaW1wb3J0IHsgUGxvdGx5U2V0dXAgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgY2xhc3MgUGxvdGx5Q2hhcnRBZGFwdGVyIHtcbiAgcHJpdmF0ZSBfY2hhcnQ6IFByb21pc2U8UGxvdGx5LlBsb3RseUhUTUxFbGVtZW50PiA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbW9kZWw6IFNlbGVjdEJhc2UpIHsgfVxuXG4gIHByb3RlY3RlZCBwYXRjaENvbmZpZ1BhcmFtZXRlcnMoXG4gICAgY2hhcnROb2RlOiBvYmplY3QsXG4gICAgdHJhY2VzOiBBcnJheTxvYmplY3Q+LFxuICAgIGxheW91dDogb2JqZWN0LFxuICAgIGNvbmZpZzogb2JqZWN0XG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBjaGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhcnQ7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKGNoYXJ0Tm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICB2YXIgcGxvdGx5T3B0aW9ucyA9IFBsb3RseVNldHVwLnNldHVwKHRoaXMubW9kZWwuY2hhcnRUeXBlLCB0aGlzLm1vZGVsKTtcblxuICAgIGxldCBjb25maWc6IGFueSA9IHtcbiAgICAgIGRpc3BsYXlsb2dvOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICBsb2NhbGU6IGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlLFxuICAgICAgbW9kZUJhckJ1dHRvbnNUb1JlbW92ZTogW1widG9JbWFnZVwiXSxcbiAgICAgIG1vZGVCYXJCdXR0b25zVG9BZGQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidG9JbWFnZVNqc1wiLFxuICAgICAgICAgIHRpdGxlOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2F2ZURpYWdyYW1Bc1BOR1wiKSxcbiAgICAgICAgICBpY29uOiAoPGFueT5QbG90bHkpLkljb25zLmNhbWVyYSxcbiAgICAgICAgICBjbGljazogKGdkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICBmb3JtYXQ6IFBsb3RseVNldHVwLmltYWdlRXhwb3J0Rm9ybWF0LFxuICAgICAgICAgICAgICAvLyB3aWR0aDogODAwLFxuICAgICAgICAgICAgICAvLyBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMubW9kZWwucXVlc3Rpb24ubmFtZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBQbG90bHlTZXR1cC5vbkltYWdlU2F2aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAoPGFueT5QbG90bHkpLmRvd25sb2FkSW1hZ2UoZ2QsIG9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgaWYgKFNlbGVjdEJhc2VQbG90bHkuZGlzcGxheU1vZGVCYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmRpc3BsYXlNb2RlQmFyID0gU2VsZWN0QmFzZVBsb3RseS5kaXNwbGF5TW9kZUJhcjtcbiAgICB9XG5cbiAgICB0aGlzLnBhdGNoQ29uZmlnUGFyYW1ldGVycyhcbiAgICAgIGNoYXJ0Tm9kZSxcbiAgICAgIHBsb3RseU9wdGlvbnMudHJhY2VzLFxuICAgICAgcGxvdGx5T3B0aW9ucy5sYXlvdXQsXG4gICAgICBjb25maWdcbiAgICApO1xuXG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICB0cmFjZXM6IHBsb3RseU9wdGlvbnMudHJhY2VzLFxuICAgICAgbGF5b3V0OiBwbG90bHlPcHRpb25zLmxheW91dCxcbiAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgIH07XG4gICAgUGxvdGx5U2V0dXAub25QbG90Q3JlYXRpbmcuZmlyZSh0aGlzLm1vZGVsLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHBsb3QgPSAoPGFueT5QbG90bHkpLm5ld1Bsb3QoXG4gICAgICBjaGFydE5vZGUsXG4gICAgICBvcHRpb25zLnRyYWNlcyxcbiAgICAgIG9wdGlvbnMubGF5b3V0LFxuICAgICAgb3B0aW9ucy5jb25maWdcbiAgICApO1xuXG4gICAgKDxhbnk+Y2hhcnROb2RlKVtcIm9uXCJdKFwicGxvdGx5X2NsaWNrXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhLnBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpdGVtVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmICghcGxvdGx5T3B0aW9ucy5oYXNTZXJpZXMpIHtcbiAgICAgICAgICBpdGVtVGV4dCA9IEFycmF5LmlzQXJyYXkoZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YSlcbiAgICAgICAgICAgID8gZGF0YS5wb2ludHNbMF0uY3VzdG9tZGF0YVswXVxuICAgICAgICAgICAgOiBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhO1xuICAgICAgICAgIGNvbnN0IGl0ZW06IEl0ZW1WYWx1ZSA9IHRoaXMubW9kZWwuZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0KTtcbiAgICAgICAgICB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtVGV4dCA9IGRhdGEucG9pbnRzWzBdLmRhdGEubmFtZTtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eUxhYmVsID0gZGF0YS5wb2ludHNbMF0ubGFiZWw7XG4gICAgICAgICAgY29uc3Qgc2VyaWVzVmFsdWVzID0gdGhpcy5tb2RlbC5nZXRTZXJpZXNWYWx1ZXMoKTtcbiAgICAgICAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSB0aGlzLm1vZGVsLmdldFNlcmllc0xhYmVscygpO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBzZXJpZXNWYWx1ZXNbc2VyaWVzTGFiZWxzLmluZGV4T2YocHJvcGVydHlMYWJlbCldO1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbTogSXRlbVZhbHVlID0gdGhpcy5tb2RlbC5nZXRTZWxlY3RlZEl0ZW1CeVRleHQoaXRlbVRleHQpO1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgSXRlbVZhbHVlKHsgW3Byb3BlcnR5VmFsdWVdOiBzZWxlY3RlZEl0ZW0udmFsdWUgfSwgcHJvcGVydHlMYWJlbCArIFwiOiBcIiArIHNlbGVjdGVkSXRlbS50ZXh0KTtcbiAgICAgICAgICB0aGlzLm1vZGVsLnNldFNlbGVjdGlvbihpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0IGl0ZW1UZXh0ID0gcGxvdGx5T3B0aW9ucy5oYXNTZXJpZXNcbiAgICAgICAgLy8gICA/IGRhdGEucG9pbnRzWzBdLmRhdGEubmFtZVxuICAgICAgICAvLyAgIDogQXJyYXkuaXNBcnJheShkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhKVxuICAgICAgICAvLyAgICAgPyBkYXRhLnBvaW50c1swXS5jdXN0b21kYXRhWzBdXG4gICAgICAgIC8vICAgICA6IGRhdGEucG9pbnRzWzBdLmN1c3RvbWRhdGE7XG4gICAgICAgIC8vIGNvbnN0IGl0ZW06IEl0ZW1WYWx1ZSA9IHRoaXMubW9kZWwuZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0KTtcbiAgICAgICAgLy8gdGhpcy5tb2RlbC5zZXRTZWxlY3Rpb24oaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0RHJhZ0xheWVyID0gKCkgPT5cbiAgICAgIDxIVE1MRWxlbWVudD5jaGFydE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIm5zZXdkcmFnXCIpWzBdO1xuICAgICg8YW55PmNoYXJ0Tm9kZSlbXCJvblwiXShcInBsb3RseV9ob3ZlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnTGF5ZXIgPSBnZXREcmFnTGF5ZXIoKTtcbiAgICAgIGRyYWdMYXllciAmJiAoZHJhZ0xheWVyLnN0eWxlLmN1cnNvciA9IFwicG9pbnRlclwiKTtcbiAgICB9KTtcbiAgICAoPGFueT5jaGFydE5vZGUpW1wib25cIl0oXCJwbG90bHlfdW5ob3ZlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnTGF5ZXIgPSBnZXREcmFnTGF5ZXIoKTtcbiAgICAgIGRyYWdMYXllciAmJiAoZHJhZ0xheWVyLnN0eWxlLmN1cnNvciA9IFwiXCIpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY2hhcnQgPSBwbG90O1xuICAgIHJldHVybiBwbG90O1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICAoPGFueT5QbG90bHkpLnB1cmdlKG5vZGUpO1xuICAgIHRoaXMuX2NoYXJ0ID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RCYXNlUGxvdGx5IGV4dGVuZHMgU2VsZWN0QmFzZSB7XG4gIHByaXZhdGUgX2NoYXJ0QWRhcHRlcjogUGxvdGx5Q2hhcnRBZGFwdGVyO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzID0gW1wiYmFyXCIsIFwicGllXCIsIFwiZG91Z2hudXRcIiwgXCJzY2F0dGVyXCJdO1xuICBwdWJsaWMgc3RhdGljIGRpc3BsYXlNb2RlQmFyOiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSk7XG4gICAgdGhpcy5jaGFydFR5cGVzID0gW10uY29uY2F0KFNlbGVjdEJhc2VQbG90bHkudHlwZXMpO1xuICAgIGlmICh0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA+IDAgJiYgdGhpcy5jaGFydFR5cGVzLmluZGV4T2YoXCJzdGFja2VkYmFyXCIpID09PSAtMSkge1xuICAgICAgdGhpcy5jaGFydFR5cGVzLnB1c2goXCJzdGFja2VkYmFyXCIpO1xuICAgIH1cbiAgICBpZihvcHRpb25zLmFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuY2hhcnRUeXBlcy5zcGxpY2UoMSwgMCwgXCJ2YmFyXCIpO1xuICAgIH1cbiAgICB0aGlzLmNoYXJ0VHlwZSA9IHRoaXMuY2hhcnRUeXBlc1swXTtcbiAgICBpZih0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihvcHRpb25zLmRlZmF1bHRDaGFydFR5cGUpICE9PSAtMSkge1xuICAgICAgdGhpcy5jaGFydFR5cGUgPSBvcHRpb25zLmRlZmF1bHRDaGFydFR5cGU7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJ0QWRhcHRlciA9IG5ldyBQbG90bHlDaGFydEFkYXB0ZXIodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NoYXJ0QWRhcHRlci5kZXN0cm95KDxIVE1MRWxlbWVudD5jb250YWluZXIuY2hpbGRyZW5bMF0pO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hhcnROb2RlOiBIVE1MRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNoYXJ0Tm9kZSk7XG4gICAgdGhpcy5fY2hhcnRBZGFwdGVyLmNyZWF0ZShjaGFydE5vZGUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlcih0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3RhdGlzdGljcyA9IHN1cGVyLmdldERhdGEoKTtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKCk7XG4gICAgaWYgKHNlcmllcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZERhdGE6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsLCB2YWx1ZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBzZXJpZXMubWFwKFxuICAgICAgICAgIChzZXJpZXNWYWx1ZSwgc2VyaWVzSW5kZXgpID0+IHN0YXRpc3RpY3Nbc2VyaWVzSW5kZXhdW3ZhbHVlSW5kZXhdXG4gICAgICAgICk7XG4gICAgICAgIHByZXBhcmVkRGF0YS5wdXNoKHNlcmllc0RhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJlcGFyZWREYXRhO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGlzdGljcztcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJjaGVja2JveFwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInJhZGlvZ3JvdXBcIiwgU2VsZWN0QmFzZVBsb3RseSk7XG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXCJkcm9wZG93blwiLCBTZWxlY3RCYXNlUGxvdGx5KTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImltYWdlcGlja2VyXCIsIFNlbGVjdEJhc2VQbG90bHkpO1xuIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlbGVjdEJhc2UgfSBmcm9tIFwiLi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi4vdmlzdWFsaXplckJhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQbG90bHlPcHRpb25zIHtcbiAgdHJhY2VzOiBBcnJheTxhbnk+O1xuICBsYXlvdXQ6IGFueTtcbiAgaGFzU2VyaWVzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUGxvdGx5U2V0dXAge1xuICBwdWJsaWMgc3RhdGljIGltYWdlRXhwb3J0Rm9ybWF0ID0gXCJwbmdcIjtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gZW5kIHVzZXIgY2xpY2tzIG9uIHRoZSAnc2F2ZSBhcyBpbWFnZScgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvbkltYWdlU2F2aW5nID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFNlbGVjdEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFNlbGVjdEJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgYmVmb3JlIHBsb3Qgd2lsbCBiZSBjcmVhdGVkLiBVc2VyIGNhbiBjaGFuZ2UgdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICogT3B0aW9ucyBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczogdHJhY2VzLCBsYXlvdXQgYW5kIGNvbmZpZyBvZiB0aGUgcGxvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb25QbG90Q3JlYXRpbmcgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIFZpc3VhbGl6ZXJCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgc3RhdGljIHNldHVwczogeyBbdHlwZTogc3RyaW5nXTogKG1vZGVsOiBTZWxlY3RCYXNlKSA9PiBQbG90bHlPcHRpb25zIH0gPSB7XG4gICAgYmFyOiBQbG90bHlTZXR1cC5zZXR1cEJhcixcbiAgICB2YmFyOiBQbG90bHlTZXR1cC5zZXR1cFZCYXIsXG4gICAgc3RhY2tlZGJhcjogUGxvdGx5U2V0dXAuc2V0dXBCYXIsXG4gICAgZG91Z2hudXQ6IFBsb3RseVNldHVwLnNldHVwUGllLFxuICAgIHBpZTogUGxvdGx5U2V0dXAuc2V0dXBQaWUsXG4gICAgc2NhdHRlcjogUGxvdGx5U2V0dXAuc2V0dXBTY2F0dGVyLFxuICB9O1xuXG4gIHN0YXRpYyBzZXR1cChjaGFyVHlwZTogc3RyaW5nLCBtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnNldHVwc1tjaGFyVHlwZV0obW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGdldFRydW5jYXRlZExhYmVsID0gKGxhYmVsOiBzdHJpbmcsIGxhYmVsVHJ1bmNhdGVMZW5ndGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHRydW5jYXRlU3ltYm9scyA9IFwiLi4uXCI7XG4gICAgY29uc3QgdHJ1bmNhdGVTeW1ib2xzTGVuZ3RoID0gdHJ1bmNhdGVTeW1ib2xzLmxlbmd0aDtcblxuICAgIGlmICghbGFiZWxUcnVuY2F0ZUxlbmd0aCkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbFRydW5jYXRlTGVuZ3RoID09PSAtMSkgcmV0dXJuIGxhYmVsO1xuICAgIGlmIChsYWJlbC5sZW5ndGggPD0gbGFiZWxUcnVuY2F0ZUxlbmd0aCArIHRydW5jYXRlU3ltYm9sc0xlbmd0aClcbiAgICAgIHJldHVybiBsYWJlbDtcblxuICAgIHJldHVybiBsYWJlbC5zdWJzdHJpbmcoMCwgbGFiZWxUcnVuY2F0ZUxlbmd0aCkgKyB0cnVuY2F0ZVN5bWJvbHM7XG4gIH07XG5cbiAgc3RhdGljIHNldHVwUGllKG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgbGV0IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfSA9IG1vZGVsLmdldEFuc3dlcnNEYXRhKCk7XG5cbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGhhc1NlcmllcyA9IHNlcmllc0xhYmVscy5sZW5ndGggPiAxO1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IG1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgIHk6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIHRleHQ6IChoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMpLm1hcCgobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gUGxvdGx5U2V0dXAuZ2V0VHJ1bmNhdGVkTGFiZWwoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbW9kZWwubGFiZWxUcnVuY2F0ZUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBob3ZlcmluZm86IFwieCt5XCIsXG4gICAgICBtb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuXG4gICAgdHJhY2VDb25maWcuaG92ZXJpbmZvID0gXCJsYWJlbCt2YWx1ZStwZXJjZW50XCI7XG4gICAgdHJhY2VDb25maWcubWFya2VyLmNvbG9ycyA9IGNvbG9ycztcbiAgICB0cmFjZUNvbmZpZy50ZXh0cG9zaXRpb24gPSBcImluc2lkZVwiO1xuXG4gICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PT0gXCJkb3VnaG51dFwiKSB7XG4gICAgICB0cmFjZUNvbmZpZy50eXBlID0gXCJwaWVcIjtcbiAgICAgIHRyYWNlQ29uZmlnLmhvbGUgPSAwLjQ7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNTZXJpZXMpIHtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zeW1ib2wgPSBcImNpcmNsZVwiO1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnNpemUgPSAxNjtcbiAgICB9XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBBcnJheTxudW1iZXI+LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICB0cmFjZXMucHVzaChcbiAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgdHJhY2VDb25maWcsIHtcbiAgICAgICAgICB2YWx1ZXM6IGRhdGFzZXQsXG4gICAgICAgICAgbGFiZWxzOiBoYXNTZXJpZXMgPyBzZXJpZXNMYWJlbHMgOiBsYWJlbHMsXG4gICAgICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCByYWRpdXMgPSBsYWJlbHMubGVuZ3RoIDwgMTAgPyBsYWJlbHMubGVuZ3RoICogNTAgKyAxMDAgOiA1NTA7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmFkaXVzICogTWF0aC5yb3VuZCh0cmFjZXMubGVuZ3RoIC8gMikgKyAyNTtcbiAgICBjb25zdCBsYXlvdXQ6IGFueSA9IHtcbiAgICAgIGZvbnQ6IHtcbiAgICAgICAgZmFtaWx5OiBcIlNlZ29lIFVJLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgIHNpemU6IDE0LFxuICAgICAgICB3ZWlnaHQ6IFwibm9ybWFsXCIsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQwNDBcIixcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICBsOiAwLFxuICAgICAgICB0OiAyNSxcbiAgICAgICAgYjogMCxcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoaGFzU2VyaWVzKSB7XG4gICAgICBsYXlvdXQuZ3JpZCA9IHtcbiAgICAgICAgcm93czogTWF0aC5yb3VuZCh0cmFjZXMubGVuZ3RoIC8gMiksXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICB9O1xuICAgICAgbGF5b3V0LmFubm90YXRpb25zID0gW107XG4gICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0uZG9tYWluID0ge1xuICAgICAgICAgIGNvbHVtbjogaW5kZXggJSAyLFxuICAgICAgICAgIHJvdzogTWF0aC5mbG9vcihpbmRleCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgICB0cmFjZXNbaW5kZXhdLnRpdGxlID0geyBwb3NpdGlvbjogXCJib3R0b20gY2VudGVyXCIsIHRleHQ6IGxhYmVsIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwQmFyKG1vZGVsOiBTZWxlY3RCYXNlKTogUGxvdGx5T3B0aW9ucyB7XG4gICAgbGV0IGxpbmVIZWlnaHQgPSAzMDtcbiAgICBsZXQgdG9wTWFyZ2luID0gMzA7XG4gICAgbGV0IGJvdHRvbU1hcmdpbiA9IDMwO1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSBtb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMTtcbiAgICBjb25zdCB5RnVsbFRleHRzID0gaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzO1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IG1vZGVsLmNoYXJ0VHlwZSxcbiAgICAgIHk6IHlGdWxsVGV4dHMsXG4gICAgICB0ZXh0OiB5RnVsbFRleHRzLFxuICAgICAgY3VzdG9tZGF0YTogaGFzU2VyaWVzID8gc2VyaWVzTGFiZWxzIDogbGFiZWxzLFxuICAgICAgaG92ZXJpbmZvOiBcInRleHRcIixcbiAgICAgIG9yaWVudGF0aW9uOiBcImhcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGRhdGFzZXQsXG4gICAgICAgIHRleHQ6IHRleHRzW2luZGV4XSxcbiAgICAgICAgaG92ZXJ0ZXh0OiB5RnVsbFRleHRzLm1hcCgobGFiZWw6IHN0cmluZywgbGFiZWxJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAke3RleHRzW2luZGV4XVtsYWJlbEluZGV4XX0sICR7bGFiZWx9YDtcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMpIHtcbiAgICAgICAgbGV0IHRleHR0ZW1wbGF0ZSA9IG1vZGVsLnNob3dPbmx5UGVyY2VudGFnZXMgPyBcIiV7dGV4dH0lXCIgOiBcIiV7dmFsdWV9ICgle3RleHR9JSlcIjtcbiAgICAgICAgdHJhY2UudGV4dHBvc2l0aW9uID0gXCJpbnNpZGVcIjtcbiAgICAgICAgdHJhY2UudGV4dHRlbXBsYXRlID0gdGV4dHRlbXBsYXRlO1xuICAgICAgICB0cmFjZS5iYXJnYXAgPSAwLjE7XG4gICAgICB9XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWlnaHQgPSAobGFiZWxzLmxlbmd0aCArIDEpICogbGluZUhlaWdodCArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbjtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB7XG4gICAgICAgIHQ6IHRvcE1hcmdpbixcbiAgICAgICAgYjogYm90dG9tTWFyZ2luLFxuICAgICAgICByOiAxMCxcbiAgICAgIH0sXG4gICAgICBjb2xvcndheTogY29sb3JzLFxuICAgICAgaG92ZXJtb2RlOiBcImNsb3Nlc3RcIixcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgb3JpZW50YXRpb246IFwiaFwiLFxuICAgICAgICB0aWNrbW9kZTogXCJhcnJheVwiLFxuICAgICAgICB0aWNrdmFsczogeUZ1bGxUZXh0cyxcbiAgICAgICAgdGlja3RleHQ6IHlGdWxsVGV4dHMubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFBsb3RseVNldHVwLmdldFRydW5jYXRlZExhYmVsKFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICAgKSArIFwiICBcIjtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgeGF4aXM6IHtcbiAgICAgICAgcmFuZ2Vtb2RlOiBcIm5vbm5lZ2F0aXZlXCIsXG4gICAgICAgIGF1dG9tYXJnaW46IHRydWUsXG4gICAgICAgIC8vIGR0aWNrOiAxXG4gICAgICB9LFxuICAgICAgcGxvdF9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwYXBlcl9iZ2NvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKGhhc1Nlcmllcykge1xuICAgICAgbGF5b3V0LnNob3dsZWdlbmQgPSB0cnVlO1xuICAgICAgaWYgKG1vZGVsLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICBsYXlvdXQuYmFybW9kZSA9IFwic3RhY2tcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dC5oZWlnaHQgPVxuICAgICAgICAgIChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICogc2VyaWVzTGFiZWxzLmxlbmd0aCArXG4gICAgICAgICAgdG9wTWFyZ2luICtcbiAgICAgICAgICBib3R0b21NYXJnaW47XG4gICAgICB9XG5cbiAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5tYXJrZXIuY29sb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubmFtZSA9IGxhYmVsO1xuXG4gICAgICAgIGlmIChtb2RlbC5jaGFydFR5cGUgPT09IFwic3RhY2tlZGJhclwiKSB7XG4gICAgICAgICAgdHJhY2VzW2luZGV4XS50eXBlID0gXCJiYXJcIjtcbiAgICAgICAgICB0cmFjZXNbaW5kZXhdLndpZHRoID0gMC41O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyYWNlc1tpbmRleF0ud2lkdGggPVxuICAgICAgICAgICAgKG1vZGVsLnNob3dQZXJjZW50YWdlcyA/IDAuNyA6IDAuNSkgLyB0cmFjZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJhY2VzLmZvckVhY2goKHRyYWNlLCB0cmFjZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRTdHJpbmcgPSBtb2RlbC5zaG93UGVyY2VudGFnZXMgPyBcIiVcIiA6IFwiXCI7XG4gICAgICAgIHRyYWNlc1t0cmFjZUluZGV4XS5ob3ZlcnRleHQgPSBbXTtcbiAgICAgICAgeUZ1bGxUZXh0cy5mb3JFYWNoKCh5RnVsbFRleHQsIHlGdWxsVGV4dEluZGV4KSA9PiB7XG4gICAgICAgICAgdHJhY2VzW3RyYWNlSW5kZXhdLmhvdmVydGV4dC5wdXNoKGAke3RyYWNlLnlbeUZ1bGxUZXh0SW5kZXhdfSA6ICR7dHJhY2UubmFtZX0sICR7dHJhY2UudGV4dFt5RnVsbFRleHRJbmRleF19JHtwZXJjZW50U3RyaW5nfWApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cFZCYXIobW9kZWw6IFNlbGVjdEJhc2UpOiBQbG90bHlPcHRpb25zIHtcbiAgICBsZXQgdG9wTWFyZ2luID0gMzA7XG4gICAgbGV0IGJvdHRvbU1hcmdpbiA9IDMwO1xuICAgIGxldCB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxhYmVscyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIHRleHRzLFxuICAgICAgc2VyaWVzTGFiZWxzLFxuICAgIH0gPSBtb2RlbC5nZXRBbnN3ZXJzRGF0YSgpO1xuXG4gICAgY29uc3QgdHJhY2VzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMTtcblxuICAgIGNvbnN0IGxheW91dDogYW55ID0ge1xuICAgICAgZm9udDoge1xuICAgICAgICBmYW1pbHk6IFwiU2Vnb2UgVUksIHNhbnMtc2VyaWZcIixcbiAgICAgICAgc2l6ZTogMTQsXG4gICAgICAgIHdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgY29sb3I6IFwiIzQwNDA0MFwiLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjoge1xuICAgICAgICB0OiB0b3BNYXJnaW4sXG4gICAgICAgIGI6IGJvdHRvbU1hcmdpbixcbiAgICAgICAgcjogMTAsXG4gICAgICB9LFxuICAgICAgY29sb3J3YXk6IGNvbG9ycyxcbiAgICAgIGhvdmVybW9kZTogXCJjbG9zZXN0XCIsXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCB0cmFjZUNvbmZpZzogYW55ID0ge1xuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgdGV4dHBvc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiAwLjUsXG4gICAgICBiYXJnYXA6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuICAgIHRyYWNlQ29uZmlnLm1hcmtlci5jb2xvciA9IGNvbG9ycztcblxuICAgIGRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQ6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgIHg6IGxhYmVscyxcbiAgICAgICAgeTogbW9kZWwuc2hvd1BlcmNlbnRhZ2VzID8gdGV4dHNbaW5kZXhdLm1hcCh5ID0+IHkgLyAxMDApIDogZGF0YXNldCxcbiAgICAgICAgdGV4dDogdGV4dHNbaW5kZXhdLFxuICAgICAgfSk7XG4gICAgICBpZiAobW9kZWwuc2hvd1BlcmNlbnRhZ2VzKSB7XG4gICAgICAgIGxldCB0ZXh0dGVtcGxhdGUgPSBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gXCIle3RleHR9JVwiIDogXCIle3ZhbHVlfSAoJXt0ZXh0fSUpXCI7XG4gICAgICAgIHRyYWNlLnRleHRwb3NpdGlvbiA9IFwiaW5zaWRlXCI7XG4gICAgICAgIHRyYWNlLnRleHR0ZW1wbGF0ZSA9IHRleHR0ZW1wbGF0ZTtcbiAgICAgICAgdHJhY2Uud2lkdGggPSAwLjk7XG4gICAgICAgIHRyYWNlLmJhcmdhcCA9IDAuMTtcbiAgICAgIH1cbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbC5zaG93UGVyY2VudGFnZXMgJiYgbW9kZWwuc2hvd09ubHlQZXJjZW50YWdlcykge1xuICAgICAgbGF5b3V0LnlheGlzID0ge1xuICAgICAgICBhdXRvbWFyZ2luOiB0cnVlLFxuICAgICAgICB0aWNrZm9ybWF0OiBcIi4wJVwiLFxuICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICB0aWNrbGVuOiBtb2RlbC5zaG93T25seVBlcmNlbnRhZ2VzID8gMjUgOiA1LFxuICAgICAgICB0aWNrY29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhY2VzLCBsYXlvdXQsIGhhc1NlcmllcyB9O1xuICB9XG5cbiAgc3RhdGljIHNldHVwU2NhdHRlcihtb2RlbDogU2VsZWN0QmFzZSk6IFBsb3RseU9wdGlvbnMge1xuICAgIGxldCBsaW5lSGVpZ2h0ID0gMzA7XG4gICAgbGV0IHRvcE1hcmdpbiA9IDMwO1xuICAgIGxldCBib3R0b21NYXJnaW4gPSAzMDtcbiAgICBsZXQge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBjb2xvcnMsXG4gICAgICB0ZXh0cyxcbiAgICAgIHNlcmllc0xhYmVscyxcbiAgICB9ID0gbW9kZWwuZ2V0QW5zd2Vyc0RhdGEoKTtcbiAgICBjb25zdCBoYXNTZXJpZXMgPSBzZXJpZXNMYWJlbHMubGVuZ3RoID4gMTtcbiAgICBjb25zdCB0cmFjZXM6IGFueSA9IFtdO1xuXG4gICAgY29uc3QgdHJhY2VDb25maWc6IGFueSA9IHtcbiAgICAgIHR5cGU6IFwic2NhdHRlclwiLFxuICAgICAgeTogKGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscykubWFwKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBQbG90bHlTZXR1cC5nZXRUcnVuY2F0ZWRMYWJlbChcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtb2RlbC5sYWJlbFRydW5jYXRlTGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGN1c3RvbWRhdGE6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIHRleHQ6IGhhc1NlcmllcyA/IHNlcmllc0xhYmVscyA6IGxhYmVscyxcbiAgICAgIGhvdmVyaW5mbzogXCJ4K3lcIixcbiAgICAgIG9yaWVudGF0aW9uOiBcImhcIixcbiAgICAgIG1vZGU6IFwibWFya2Vyc1wiLFxuICAgICAgd2lkdGg6IDAuNSxcbiAgICAgIG1hcmtlcjogPGFueT57fSxcbiAgICB9O1xuXG4gICAgaWYgKCFoYXNTZXJpZXMpIHtcbiAgICAgIHRyYWNlQ29uZmlnLm1hcmtlci5zeW1ib2wgPSBcImNpcmNsZVwiO1xuICAgICAgdHJhY2VDb25maWcubWFya2VyLnNpemUgPSAxNjtcbiAgICB9XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBBcnJheTxudW1iZXI+KSA9PiB7XG4gICAgICB7XG4gICAgICAgIHZhciB0cmFjZSA9IE9iamVjdC5hc3NpZ24oe30sIHRyYWNlQ29uZmlnLCB7XG4gICAgICAgICAgeDogZGF0YXNldCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGhlaWdodCA9IChsYWJlbHMubGVuZ3RoICsgMSkgKiBsaW5lSGVpZ2h0ICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luO1xuXG4gICAgY29uc3QgbGF5b3V0OiBhbnkgPSB7XG4gICAgICBmb250OiB7XG4gICAgICAgIGZhbWlseTogXCJTZWdvZSBVSSwgc2Fucy1zZXJpZlwiLFxuICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgd2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBjb2xvcjogXCIjNDA0MDQwXCIsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgdDogdG9wTWFyZ2luLFxuICAgICAgICBiOiBib3R0b21NYXJnaW4sXG4gICAgICAgIHI6IDEwLFxuICAgICAgfSxcbiAgICAgIGNvbG9yd2F5OiBjb2xvcnMsXG4gICAgICBob3Zlcm1vZGU6IFwiY2xvc2VzdFwiLFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICB0aWNrbGVuOiA1LFxuICAgICAgICB0aWNrY29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIH0sXG4gICAgICB4YXhpczoge1xuICAgICAgICByYW5nZW1vZGU6IFwibm9ubmVnYXRpdmVcIixcbiAgICAgICAgYXV0b21hcmdpbjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwbG90X2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHBhcGVyX2JnY29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoaGFzU2VyaWVzKSB7XG4gICAgICBsYXlvdXQuc2hvd2xlZ2VuZCA9IHRydWU7XG4gICAgICBsYXlvdXQuaGVpZ2h0ID0gdW5kZWZpbmVkO1xuXG4gICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIHRyYWNlc1tpbmRleF0uaG92ZXJpbmZvID0gXCJ4K25hbWVcIjtcbiAgICAgICAgdHJhY2VzW2luZGV4XS5tYXJrZXIuY29sb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyYWNlc1tpbmRleF0ubmFtZSA9IGxhYmVsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHRyYWNlcywgbGF5b3V0LCBoYXNTZXJpZXMgfTtcbiAgfVxufSIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvblNlbGVjdEJhc2UsIEl0ZW1WYWx1ZSwgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFIZWxwZXIsIERvY3VtZW50SGVscGVyIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24ge1xuICBzZWxlY3Rpb246IEl0ZW1WYWx1ZTtcbiAgb25EYXRhSXRlbVNlbGVjdGVkOiAoc2VsZWN0ZWRWYWx1ZTogYW55LCBzZWxlY3RlZFRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc2V0U2VsZWN0aW9uKGl0ZW06IEl0ZW1WYWx1ZSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFuc3dlcnNEYXRhIHtcbiAgZGF0YXNldHM6IEFycmF5PEFycmF5PGFueT4+O1xuICBsYWJlbHM6IEFycmF5PHN0cmluZz47XG4gIGNvbG9yczogQXJyYXk8c3RyaW5nPjtcbiAgdGV4dHM6IEFycmF5PEFycmF5PGFueT4+O1xuICBzZXJpZXNMYWJlbHM6IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RCYXNlXG4gIGV4dGVuZHMgVmlzdWFsaXplckJhc2VcbiAgaW1wbGVtZW50cyBJVmlzdWFsaXplcldpdGhTZWxlY3Rpb24ge1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVtOiBJdGVtVmFsdWUgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2hvaWNlc09yZGVyU2VsZWN0b3I6IEhUTUxEaXZFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHNob3dQZXJjZW50YWdlQnRuOiBIVE1MRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBlbXB0eUFuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRyYW5zcG9zZURhdGFCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIHRvcE5TZWxlY3RvcjogSFRNTERpdkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Nob3dQZXJjZW50YWdlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zaG93T25seVBlcmNlbnRhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3BlcmNlbnRhZ2VQcmVjaXNpb246IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBfYW5zd2Vyc09yZGVyOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcbiAgcHJvdGVjdGVkIF9zdXBwb3J0U2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfaGlkZUVtcHR5QW5zd2VycyA9IGZhbHNlO1xuICBwcml2YXRlIF90b3BOID0gLTE7XG4gIHB1YmxpYyBzdGF0aWMgdG9wTlZhbHVlc0RlZmF1bHRzID0gWy0xLCA1LCAxMCwgMjBdO1xuICBwdWJsaWMgdG9wTlZhbHVlcyA9IFtdLmNvbmNhdChTZWxlY3RCYXNlLnRvcE5WYWx1ZXNEZWZhdWx0cyk7XG4gIHByaXZhdGUgX3RyYW5zcG9zZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd01pc3NpbmdBbnN3ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbWlzc2luZ0Fuc3dlcnNCdG46IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBhbnksXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcInNlbGVjdEJhc2VcIik7XG4gICAgKDxhbnk+cXVlc3Rpb24pLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhUHJvdmlkZXIucmVzZXQoKTtcbiAgICB9O1xuICAgIHRoaXMuX3Nob3dQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93UGVyY2VudGFnZXMgPT09IHRydWU7XG4gICAgdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcyA9IHRoaXMub3B0aW9ucy5zaG93T25seVBlcmNlbnRhZ2VzID09PSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wZXJjZW50YWdlUHJlY2lzaW9uKSB7XG4gICAgICB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uID0gdGhpcy5vcHRpb25zLnBlcmNlbnRhZ2VQcmVjaXNpb247XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZUVtcHR5QW5zd2VycyA9IHRoaXMub3B0aW9ucy5oaWRlRW1wdHlBbnN3ZXJzID09PSB0cnVlO1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHRoaXMub3B0aW9ucy5hbnN3ZXJzT3JkZXIgfHwgXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHRoaXMub3B0aW9ucy5zaG93TWlzc2luZ0Fuc3dlcnMgPT09IHRydWU7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlQ2hhcnRUeXBlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0VHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy5jaGFydFR5cGVzLm1hcCgoY2hhcnRUeXBlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogY2hhcnRUeXBlLFxuICAgICAgICAgICAgICB0ZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hhcnRUeXBlX1wiICsgY2hhcnRUeXBlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiB0aGlzLmNoYXJ0VHlwZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcnRUeXBlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJjaGFuZ2VBbnN3ZXJzT3JkZXJcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5vcHRpb25zLmFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXIpICYmXG4gICAgICAgIHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaG9pY2VzT3JkZXJTZWxlY3RvciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlZmF1bHRPcmRlclwiKSwgdmFsdWU6IFwiZGVmYXVsdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhc2NPcmRlclwiKSwgdmFsdWU6IFwiYXNjXCIgfSxcbiAgICAgICAgICAgIHsgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImRlc2NPcmRlclwiKSwgdmFsdWU6IFwiZGVzY1wiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAob3B0aW9uKSA9PiBmYWxzZSxcbiAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd1BlcmNlbnRhZ2VzXCIsICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93U2hvd1BlcmNlbnRhZ2VzICYmXG4gICAgICAgICh0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcImJhclwiKSAhPT0gLTEgfHxcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihcInN0YWNrZWRiYXJcIikgIT09IC0xKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VzID0gIXRoaXMuc2hvd1BlcmNlbnRhZ2VzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93UGVyY2VudGFnZUJ0bjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJoaWRlRW1wdHlBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dIaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGVFbXB0eUFuc3dlcnMgPSAhdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbXB0eUFuc3dlcnNCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidG9wTkFuc3dlcnNcIiwgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dUb3BOQW5zd2VycyAmJlxuICAgICAgICB0aGlzLmdldFNlcmllc1ZhbHVlcygpLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudG9wTlNlbGVjdG9yID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgdGhpcy50b3BOVmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ0b3BOVmFsdWVUZXh0XCIgKyB2YWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgKG9wdGlvbikgPT4gZmFsc2UsXG4gICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9wTiA9IHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50b3BOU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwidHJhbnNwb3NlRGF0YVwiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93VHJhbnNwb3NlRGF0YSkge1xuICAgICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNwb3NlRGF0YSA9ICF0aGlzLnRyYW5zcG9zZURhdGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9zZURhdGFCdG47XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCkgJiYgdGhpcy5vcHRpb25zLmFsbG93U2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICAgIHRoaXMubWlzc2luZ0Fuc3dlcnNCdG4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzID0gIXRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYXJ0VHlwZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBjaGFydFR5cGU6IHN0cmluZyA9IFwiYmFyXCI7XG5cbiAgcHJpdmF0ZSB1cGRhdGVFbXB0eUFuc3dlcnNCdG4oKSB7XG4gICAgaWYgKCEhdGhpcy5lbXB0eUFuc3dlcnNCdG4pIHtcbiAgICAgIHRoaXMuZW1wdHlBbnN3ZXJzQnRuLmlubmVyVGV4dCA9IHRoaXMuX2hpZGVFbXB0eUFuc3dlcnNcbiAgICAgICAgPyBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd0VtcHR5QW5zd2Vyc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlRW1wdHlBbnN3ZXJzXCIpO1xuICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlID09IFwiYmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJ2YmFyXCIgfHwgdGhpcy5jaGFydFR5cGUgPT0gXCJzY2F0dGVyXCIpIHtcbiAgICAgICAgdGhpcy5lbXB0eUFuc3dlcnNCdG4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtcHR5QW5zd2Vyc0J0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUcmFuc3Bvc2VEYXRhQnRuKCkge1xuICAgIGlmICghIXRoaXMudHJhbnNwb3NlRGF0YUJ0bikge1xuICAgICAgdGhpcy50cmFuc3Bvc2VEYXRhQnRuLmlubmVyVGV4dCA9IHRoaXMudHJhbnNwb3NlRGF0YVxuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93UGVyQ29sdW1uc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93UGVyVmFsdWVzXCIpO1xuICAgICAgaWYgKHRoaXMuZ2V0U2VyaWVzVmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyYW5zcG9zZURhdGFCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT3JkZXJTZWxlY3RvcigpIHtcbiAgICBpZiAoISF0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY2hhcnRUeXBlID09IFwiYmFyXCIgfHxcbiAgICAgICAgdGhpcy5jaGFydFR5cGUgPT0gXCJ2YmFyXCIgfHxcbiAgICAgICAgdGhpcy5jaGFydFR5cGUgPT0gXCJzY2F0dGVyXCIgfHxcbiAgICAgICAgKCh0aGlzLmNoYXJ0VHlwZSA9PSBcInBpZVwiIHx8IHRoaXMuY2hhcnRUeXBlID09IFwiZG91Z2hudXRcIikgJiZcbiAgICAgICAgICB0aGlzLnRvcE4gPiAwKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3Iuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNob2ljZXNPcmRlclNlbGVjdG9yLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlc09yZGVyU2VsZWN0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICAgIFwic2VsZWN0XCJcbiAgICAgIClbMF0udmFsdWUgPSB0aGlzLmFuc3dlcnNPcmRlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNob3dQZXJjZW50YWdlQnRuKCkge1xuICAgIGlmICghIXRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4pIHtcbiAgICAgIHRoaXMuc2hvd1BlcmNlbnRhZ2VCdG4uaW5uZXJUZXh0ID0gdGhpcy5fc2hvd1BlcmNlbnRhZ2VzXG4gICAgICAgID8gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImhpZGVQZXJjZW50YWdlc1wiKVxuICAgICAgICA6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93UGVyY2VudGFnZXNcIik7XG4gICAgICBpZiAodGhpcy5jaGFydFR5cGUgPT0gXCJiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInZiYXJcIiB8fCB0aGlzLmNoYXJ0VHlwZSA9PSBcInN0YWNrZWRiYXJcIikge1xuICAgICAgICB0aGlzLnNob3dQZXJjZW50YWdlQnRuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93UGVyY2VudGFnZUJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb3BOU2VsZWN0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy50b3BOU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMudG9wTlNlbGVjdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2VsZWN0XCIpWzBdLnZhbHVlID0gPGFueT4oXG4gICAgICAgIHRoaXMuX3RvcE5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaXNzaW5nQW5zd2Vyc0J0bigpIHtcbiAgICBpZiAoISF0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuKSB7XG4gICAgICB0aGlzLm1pc3NpbmdBbnN3ZXJzQnRuLmlubmVyVGV4dCA9IHRoaXMuX3Nob3dNaXNzaW5nQW5zd2Vyc1xuICAgICAgICA/IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlTWlzc2luZ0Fuc3dlcnNcIilcbiAgICAgICAgOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2hvd01pc3NpbmdBbnN3ZXJzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNoYXJ0VHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgdGhpcy51cGRhdGVTaG93UGVyY2VudGFnZUJ0bigpO1xuICAgIHRoaXMudXBkYXRlRW1wdHlBbnN3ZXJzQnRuKCk7XG4gICAgdGhpcy51cGRhdGVUb3BOU2VsZWN0b3IoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRDaGFydFR5cGUoY2hhcnRUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYXJ0VHlwZXMuaW5kZXhPZihjaGFydFR5cGUpICE9PSAtMSAmJlxuICAgICAgdGhpcy5jaGFydFR5cGUgIT09IGNoYXJ0VHlwZVxuICAgICkge1xuICAgICAgdGhpcy5jaGFydFR5cGUgPSBjaGFydFR5cGU7XG4gICAgICB0aGlzLm9uQ2hhcnRUeXBlQ2hhbmdlZCgpO1xuICAgICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvcnJlY3RBbnN3ZXJWYWx1ZSA9IHN1cGVyLmdldENvcnJlY3RBbnN3ZXJUZXh0KCk7XG4gICAgY29uc3QgcmVzdWx0VmFsdWVzID0gQXJyYXkuaXNBcnJheShjb3JyZWN0QW5zd2VyVmFsdWUpID8gY29ycmVjdEFuc3dlclZhbHVlIDogW2NvcnJlY3RBbnN3ZXJWYWx1ZV07XG4gICAgY29uc3Qgc2VsZWN0QmFzZVF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbiBhcyBRdWVzdGlvblNlbGVjdEJhc2U7XG4gICAgcmV0dXJuIHJlc3VsdFZhbHVlcy5tYXAoKHZhbHVlOiBhbnkpID0+IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShzZWxlY3RCYXNlUXVlc3Rpb24uY2hvaWNlcywgdmFsdWUpKS5qb2luKFwiLCBcIik7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRJdGVtQnlUZXh0KGl0ZW1UZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZWxCYXNlID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc090aGVyICYmIGl0ZW1UZXh0ID09IHNlbEJhc2Uub3RoZXJUZXh0KSB7XG4gICAgICByZXR1cm4gc2VsQmFzZS5vdGhlckl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxCYXNlLmNob2ljZXMuZmlsdGVyKFxuICAgICAgICAoY2hvaWNlOiBJdGVtVmFsdWUpID0+IGNob2ljZS50ZXh0ID09PSBpdGVtVGV4dFxuICAgICAgKVswXTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oaXRlbTogSXRlbVZhbHVlKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtICE9PSBpdGVtKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5vbkRhdGFJdGVtU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9uRGF0YUl0ZW1TZWxlY3RlZChcbiAgICAgICAgICBpdGVtICE9PSB1bmRlZmluZWQgPyBpdGVtLnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGl0ZW0gIT09IHVuZGVmaW5lZCA/IGl0ZW0udGV4dCA6IFwiXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW07XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dPbmx5UGVyY2VudGFnZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dPbmx5UGVyY2VudGFnZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dPbmx5UGVyY2VudGFnZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd09ubHlQZXJjZW50YWdlcyA9IHZhbDtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dQZXJjZW50YWdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd1BlcmNlbnRhZ2VzO1xuICB9XG5cbiAgcHVibGljIHNldCBzaG93UGVyY2VudGFnZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd1BlcmNlbnRhZ2VzID0gdmFsO1xuICAgIHRoaXMudXBkYXRlU2hvd1BlcmNlbnRhZ2VCdG4oKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuc3dlcnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5zd2Vyc09yZGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBhbnN3ZXJzT3JkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Fuc3dlcnNPcmRlciA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlT3JkZXJTZWxlY3RvcigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlkZUVtcHR5QW5zd2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUVtcHR5QW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaGlkZUVtcHR5QW5zd2Vycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVFbXB0eUFuc3dlcnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5QW5zd2Vyc0J0bigpO1xuICAgIHRoaXMucmVmcmVzaENvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNwb3NlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3NlRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdHJhbnNwb3NlRGF0YSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3RyYW5zcG9zZURhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRyYW5zcG9zZURhdGFCdG4oKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvcE4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG9wTjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdG9wTih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG9wTiA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVG9wTlNlbGVjdG9yKCk7XG4gICAgdGhpcy51cGRhdGVPcmRlclNlbGVjdG9yKCk7XG4gICAgdGhpcy5yZWZyZXNoQ29udGVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydE1pc3NpbmdBbnN3ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93TWlzc2luZ0Fuc3dlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dNaXNzaW5nQW5zd2VycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd01pc3NpbmdBbnN3ZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd01pc3NpbmdBbnN3ZXJzID0gdGhpcy5pc1N1cHBvcnRNaXNzaW5nQW5zd2VycygpICYmIHZhbHVlO1xuICAgIHRoaXMudXBkYXRlTWlzc2luZ0Fuc3dlcnNCdG4oKTtcbiAgICB0aGlzLmRhdGFQcm92aWRlci5yZXNldCh0aGlzKTtcbiAgICB0aGlzLnJlZnJlc2hDb250ZW50KCk7XG4gIH1cblxuICByZWZyZXNoQ29udGVudCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gIH1cblxuICBvbkRhdGFJdGVtU2VsZWN0ZWQ6IChzZWxlY3RlZFZhbHVlOiBhbnksIHNlbGVjdGVkVGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIGdldCBzaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2hvd1ZhbHVlc0luT3JpZ2luYWxPcmRlciAhPT0gZmFsc2U7XG4gIH1cblxuICB2YWx1ZXNTb3VyY2UoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSA8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb247XG4gICAgcmV0dXJuIHF1ZXN0aW9uW1wiYWN0aXZlQ2hvaWNlc1wiXTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PGFueT4gPSB0aGlzLnZhbHVlc1NvdXJjZSgpLm1hcChcbiAgICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNPdGhlcikge1xuICAgICAgdmFsdWVzLnB1c2goXCJvdGhlclwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd01pc3NpbmdBbnN3ZXJzKSB7XG4gICAgICB2YWx1ZXMudW5zaGlmdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWVzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGdldExhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVZhbHVlc0FzTGFiZWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWxzOiBBcnJheTxzdHJpbmc+ID0gdGhpcy52YWx1ZXNTb3VyY2UoKS5tYXAoKGNob2ljZSkgPT5cbiAgICAgIEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnZhbHVlc1NvdXJjZSgpLCBjaG9pY2UudmFsdWUpXG4gICAgKTtcbiAgICBjb25zdCBzZWxCYXNlID0gPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uO1xuICAgIGlmIChzZWxCYXNlLmhhc090aGVyKSB7XG4gICAgICBsYWJlbHMucHVzaChzZWxCYXNlLm90aGVyVGV4dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dNaXNzaW5nQW5zd2Vycykge1xuICAgICAgbGFiZWxzLnVuc2hpZnQobG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1pc3NpbmdBbnN3ZXJzTGFiZWxcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VmFsdWVzSW5PcmlnaW5hbE9yZGVyKSB7XG4gICAgICByZXR1cm4gbGFiZWxzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2VzKCk6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICB2YXIgZGF0YTogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSB0aGlzLmdldERhdGEoKTtcbiAgICB2YXIgcGVyY2VudGFnZXM6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgdmFyIHBlcmNlbnRhZ2VQcmVjaXNpb24gPSB0aGlzLl9wZXJjZW50YWdlUHJlY2lzaW9uO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgMikge1xuICAgICAgZGF0YS5mb3JFYWNoKChyZXMsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciBzdW0gPSByZXMucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcbiAgICAgICAgcGVyY2VudGFnZXNbaW5kZXhdID0gcmVzLm1hcCgodmFsKSA9PiB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGVyY2VudGFnZVByZWNpc2lvbiA/ICsodmFsIC8gc3VtKS50b0ZpeGVkKHBlcmNlbnRhZ2VQcmVjaXNpb24pIDogTWF0aC5yb3VuZCgodmFsIC8gc3VtKSAqIDEwMDAwKTtcbiAgICAgICAgICByZXR1cm4gc3VtICYmICh2YWx1ZSAvIDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVswXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc3VtICs9IGRhdGFbal1baV07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlcmNlbnRhZ2VzW2pdKSkgcGVyY2VudGFnZXNbal0gPSBbXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBwZXJjZW50YWdlUHJlY2lzaW9uID8gKygoZGF0YVtqXVtpXSAvIHN1bSkgKiAxMDApLnRvRml4ZWQocGVyY2VudGFnZVByZWNpc2lvbikgOiBNYXRoLnJvdW5kKChkYXRhW2pdW2ldIC8gc3VtKSAqIDEwMCk7XG4gICAgICAgICAgcGVyY2VudGFnZXNbal1baV0gPSBzdW0gJiYgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGE6IElBbnN3ZXJzRGF0YSk6IElBbnN3ZXJzRGF0YSB7XG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgIGRhdGFzZXRzOiA8QXJyYXk8YW55Pj5bW11dLFxuICAgICAgbGFiZWxzOiA8QXJyYXk8c3RyaW5nPj5bXSxcbiAgICAgIGNvbG9yczogPEFycmF5PHN0cmluZz4+W10sXG4gICAgICB0ZXh0czogPEFycmF5PGFueT4+W1tdXSxcbiAgICAgIHNlcmllc0xhYmVsczogYW5zd2Vyc0RhdGEuc2VyaWVzTGFiZWxzLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbnN3ZXJzRGF0YS5kYXRhc2V0c1swXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFuc3dlcnNEYXRhLmRhdGFzZXRzWzBdW2ldICE9IDApIHtcbiAgICAgICAgcmVzdWx0LmRhdGFzZXRzWzBdLnB1c2goYW5zd2Vyc0RhdGEuZGF0YXNldHNbMF1baV0pO1xuICAgICAgICByZXN1bHQubGFiZWxzLnB1c2goYW5zd2Vyc0RhdGEubGFiZWxzW2ldKTtcbiAgICAgICAgcmVzdWx0LmNvbG9ycy5wdXNoKGFuc3dlcnNEYXRhLmNvbG9yc1tpXSk7XG4gICAgICAgIHJlc3VsdC50ZXh0c1swXS5wdXNoKGFuc3dlcnNEYXRhLnRleHRzWzBdW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhbnN3ZXJzRGF0YVJlYWR5KGFuc3dlcnNEYXRhOiBJQW5zd2Vyc0RhdGEpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5oaWRlRW1wdHlBbnN3ZXJzKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmhpZGVFbXB0eUFuc3dlcnNJbkRhdGEoYW5zd2Vyc0RhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhbnN3ZXJzRGF0YTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9wTiA+IDApIHtcbiAgICAgIHJlc3VsdC5kYXRhc2V0c1swXSA9IHJlc3VsdC5kYXRhc2V0c1swXS5zbGljZSgtdGhpcy50b3BOKTtcbiAgICAgIHJlc3VsdC5sYWJlbHMgPSByZXN1bHQubGFiZWxzLnNsaWNlKC10aGlzLnRvcE4pO1xuICAgICAgcmVzdWx0LmNvbG9ycyA9IHJlc3VsdC5jb2xvcnMuc2xpY2UoLXRoaXMudG9wTik7XG4gICAgICByZXN1bHQudGV4dHNbMF0gPSByZXN1bHQudGV4dHNbMF0uc2xpY2UoLXRoaXMudG9wTik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbnN3ZXIgZGF0YSBoYXMgYmVlbiBjb21iaW5lZCBiZWZvcmUgdGhleSBwYXNzZWQgdG8gZHJhdyBncmFwaC5cbiAgICogb3B0aW9ucyAtIHRoZSBhbnN3ZXJzIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmc6IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqIG9wdGlvbnMgZmllbGRzIGNhbiBiZSBtb2RpZmllZFxuICAgKi9cbiAgcHVibGljIG9uQW5zd2Vyc0RhdGFSZWFkeSA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTZWxlY3RCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBTZWxlY3RCYXNlLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2JqZWN0IHdpdGggYWxsIGluZm90bWF0aW9uIGZvciBkYXRhIHZpc3VhbGl6YXRpb246IGRhdGFzZXRzLCBsYWJlbHMsIGNvbG9ycywgYWRkaXRpb25hbCB0ZXh0cyAocGVyY2VudGFnZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0QW5zd2Vyc0RhdGEoKTogSUFuc3dlcnNEYXRhIHtcbiAgICBsZXQgc2VyaWVzTGFiZWxzID0gdGhpcy5nZXRTZXJpZXNMYWJlbHMoKTtcbiAgICBsZXQgZGF0YXNldHMgPSB0aGlzLmdldERhdGEoKTtcbiAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBsZXQgY29sb3JzID0gdGhpcy5nZXRDb2xvcnMoKTtcbiAgICB2YXIgdGV4dHMgPSB0aGlzLnNob3dQZXJjZW50YWdlcyA/IHRoaXMuZ2V0UGVyY2VudGFnZXMoKSA6IGRhdGFzZXRzO1xuXG4gICAgaWYgKHRoaXMudHJhbnNwb3NlRGF0YSkge1xuICAgICAgZGF0YXNldHMgPSB0aGlzLnRyYW5zcG9zZShkYXRhc2V0cyk7XG4gICAgICB0ZXh0cyA9IHRoaXMudHJhbnNwb3NlKHRleHRzKTtcbiAgICAgIGNvbnN0IHRlbXAgPSBzZXJpZXNMYWJlbHM7XG4gICAgICBzZXJpZXNMYWJlbHMgPSBsYWJlbHM7XG4gICAgICBsYWJlbHMgPSB0ZW1wO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFuc3dlcnNPcmRlciA9PSBcImFzY1wiIHx8IHRoaXMuYW5zd2Vyc09yZGVyID09IFwiZGVzY1wiKSB7XG4gICAgICB2YXIgemlwcGVkQXJyYXkgPSB0aGlzLnNob3dQZXJjZW50YWdlc1xuICAgICAgICA/IERhdGFIZWxwZXIuemlwQXJyYXlzKGxhYmVscywgY29sb3JzLCB0ZXh0c1swXSlcbiAgICAgICAgOiBEYXRhSGVscGVyLnppcEFycmF5cyhsYWJlbHMsIGNvbG9ycyk7XG4gICAgICBsZXQgZGljdCA9IERhdGFIZWxwZXIuc29ydERpY3Rpb25hcnkoXG4gICAgICAgIHppcHBlZEFycmF5LFxuICAgICAgICBkYXRhc2V0c1swXSxcbiAgICAgICAgdGhpcy5hbnN3ZXJzT3JkZXIgPT0gXCJkZXNjXCJcbiAgICAgICk7XG4gICAgICBsZXQgdW56aXBwZWRBcnJheSA9IERhdGFIZWxwZXIudW56aXBBcnJheXMoZGljdC5rZXlzKTtcbiAgICAgIGxhYmVscyA9IHVuemlwcGVkQXJyYXlbMF07XG4gICAgICBjb2xvcnMgPSB1bnppcHBlZEFycmF5WzFdO1xuICAgICAgaWYgKHRoaXMuc2hvd1BlcmNlbnRhZ2VzKSB0ZXh0c1swXSA9IHVuemlwcGVkQXJyYXlbMl07XG4gICAgICBkYXRhc2V0c1swXSA9IGRpY3QudmFsdWVzO1xuICAgIH1cblxuICAgIGxldCBhbnN3ZXJzRGF0YSA9IHtcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGFiZWxzLFxuICAgICAgY29sb3JzLFxuICAgICAgdGV4dHMsXG4gICAgICBzZXJpZXNMYWJlbHMsXG4gICAgfTtcbiAgICBhbnN3ZXJzRGF0YSA9IHRoaXMuYW5zd2Vyc0RhdGFSZWFkeShhbnN3ZXJzRGF0YSk7XG4gICAgdGhpcy5vbkFuc3dlcnNEYXRhUmVhZHkuZmlyZSh0aGlzLCBhbnN3ZXJzRGF0YSk7XG5cbiAgICByZXR1cm4gYW5zd2Vyc0RhdGE7XG4gIH1cbiAgcHJvdGVjdGVkIHRyYW5zcG9zZShkYXRhOiBBcnJheTxBcnJheTxudW1iZXI+Pik6IEFycmF5PEFycmF5PG51bWJlcj4+IHtcbiAgICBjb25zdCBkaW0yID0gZGF0YVswXS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PEFycmF5PG51bWJlcj4+KGRpbTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltMjsgKytpKVxuICAgICAgcmVzdWx0W2ldID0gbmV3IEFycmF5PG51bWJlcj4oZGF0YS5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaW0yOyArK2opIHtcbiAgICAgICAgcmVzdWx0W2pdW2ldID0gZGF0YVtpXVtqXTtcbiAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3N0YXRlUHJvcGVydGllcyA9IFtcImNoYXJ0VHlwZVwiLCBcImFuc3dlcnNPcmRlclwiLCBcImhpZGVFbXB0eUFuc3dlcnNcIiwgXCJ0b3BOXCJdO1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogYW55IHtcbiAgICBsZXQgc3RhdGU6IGFueSA9IHt9O1xuICAgIFNlbGVjdEJhc2UuX3N0YXRlUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgICBzdGF0ZVtwcm9wZXJ0eU5hbWVdID0gKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBTZWxlY3RCYXNlLl9zdGF0ZVByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgaWYgKHN0YXRlW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdID0gc3RhdGVbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcclxuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xyXG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XHJcbmltcG9ydCB7IGxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxudmFyIHN0eWxlcyA9IHJlcXVpcmUoXCIuL3RleHQuc2Nzc1wiKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0VGFibGVBZGFwdGVyIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBUZXh0KSB7fVxyXG5cclxuICBwdWJsaWMgY3JlYXRlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHsgY29sdW1uc0NvdW50LCBkYXRhIH0gPSB0aGlzLm1vZGVsLmdldERhdGEoKTtcclxuICAgIGNvbnN0IGVtcHR5VGV4dE5vZGUgPSA8SFRNTEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInBcIiwgXCJcIiwge1xyXG4gICAgICBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Jlc3VsdHNcIiksXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFibGVOb2RlID0gPEhUTUxUYWJsZUVsZW1lbnQ+KFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgXCJzYS10ZXh0LXRhYmxlXCIpXHJcbiAgICApO1xyXG5cclxuICAgIHRhYmxlTm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmJhY2tncm91bmRDb2xvcjtcclxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZU5vZGUpO1xyXG5cclxuICAgIGRhdGEuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xyXG4gICAgICB2YXIgcm93ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRyXCIpO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIHRkID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInRkXCIsIFwic2EtdGV4dC10YWJsZV9fY2VsbFwiLCB7XHJcbiAgICAgICAgICB0ZXh0Q29udGVudDogcm93RGF0YVtpXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQodGQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlTm9kZS5hcHBlbmRDaGlsZChyb3cpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IFwic2EtdGV4dC10YWJsZV9fY29udGFpbmVyXCI7XHJcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGVOb2RlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBub2RlLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dCBleHRlbmRzIFZpc3VhbGl6ZXJCYXNlIHtcclxuICBwcml2YXRlIF90ZXh0VGFibGVBZGFwdGVyOiBUZXh0VGFibGVBZGFwdGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcclxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXHJcbiAgICBvcHRpb25zPzogT2JqZWN0LFxyXG4gICAgbmFtZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMsIG5hbWUgfHwgXCJ0ZXh0XCIpO1xyXG4gICAgdGhpcy5fdGV4dFRhYmxlQWRhcHRlciA9IG5ldyBUZXh0VGFibGVBZGFwdGVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YSgpIHtcclxuICAgIGxldCByZXN1bHQ6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XHJcbiAgICBsZXQgY29sdW1uc0NvdW50ID0gMDtcclxuXHJcbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvd1ZhbHVlOiBhbnkgPSByb3dbdGhpcy5xdWVzdGlvbi5uYW1lXTtcclxuICAgICAgY29uc3QgZGF0YVN0cmluZ3M6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgaWYgKCEhcm93VmFsdWUpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dWYWx1ZSkpIHtcclxuICAgICAgICAgIGRhdGFTdHJpbmdzLmNvbmNhdChyb3dWYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMocm93VmFsdWUpLmZvckVhY2goKGtleSkgPT5cclxuICAgICAgICAgICAgICBkYXRhU3RyaW5ncy5wdXNoKHJvd1ZhbHVlW2tleV0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhU3RyaW5ncy5wdXNoKHJvd1ZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnB1c2goZGF0YVN0cmluZ3MpO1xyXG4gICAgICAgIGlmIChkYXRhU3RyaW5ncy5sZW5ndGggPiBjb2x1bW5zQ291bnQpIHtcclxuICAgICAgICAgIGNvbHVtbnNDb3VudCA9IGRhdGFTdHJpbmdzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IGNvbHVtbnNDb3VudCwgZGF0YTogcmVzdWx0IH07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGhpcy5fdGV4dFRhYmxlQWRhcHRlci5kZXN0cm95KGNvbnRhaW5lcik7XHJcbiAgICBzdXBlci5kZXN0cm95Q29udGVudChjb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGhpcy5fdGV4dFRhYmxlQWRhcHRlci5jcmVhdGUoY29udGFpbmVyKTtcclxuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl90ZXh0VGFibGVBZGFwdGVyLmRlc3Ryb3kodGhpcy5jb250ZW50Q29udGFpbmVyKTtcclxuICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICB9XHJcbn1cclxuXHJcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInRleHRcIiwgVGV4dCk7XHJcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNvbW1lbnRcIiwgVGV4dCk7XHJcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm11bHRpcGxldGV4dFwiLCBUZXh0KTtcclxuIiwiZXhwb3J0IHZhciBfX2Fzc2lnbiA9XG4gICg8YW55Pk9iamVjdClbXCJhc3NpZ25cIl0gfHxcbiAgZnVuY3Rpb24odGFyZ2V0OiBhbnkpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBwIGluIHMpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRhcmdldFtwXSA9IHNbcF07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHModGhpc0NsYXNzOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gIGZvciAodmFyIHAgaW4gYmFzZUNsYXNzKVxuICAgIGlmIChiYXNlQ2xhc3MuaGFzT3duUHJvcGVydHkocCkpIHRoaXNDbGFzc1twXSA9IGJhc2VDbGFzc1twXTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IHRoaXNDbGFzcztcbiAgfVxuICB0aGlzQ2xhc3MucHJvdG90eXBlID1cbiAgICBiYXNlQ2xhc3MgPT09IG51bGxcbiAgICAgID8gT2JqZWN0LmNyZWF0ZShiYXNlQ2xhc3MpXG4gICAgICA6ICgoX18ucHJvdG90eXBlID0gYmFzZUNsYXNzLnByb3RvdHlwZSksIG5ldyAoPGFueT5fXykoKSk7XG59XG5cbmV4cG9ydCB2YXIgX19yZXN0ID0gZnVuY3Rpb24oc291cmNlOiBhbnksIGU6IGFueSkge1xuICB2YXIgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHNvdXJjZSlcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBwcm9wZXJ0eU5hbWUpICYmXG4gICAgICBlLmluZGV4T2YocHJvcGVydHlOYW1lKSA8IDBcbiAgICApXG4gICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IHNvdXJjZVtwcm9wZXJ0eU5hbWVdO1xuICBpZiAoXG4gICAgc291cmNlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgKDxhbnk+T2JqZWN0KVtcImdldE93blByb3BlcnR5U3ltYm9sc1wiXSA9PT0gXCJmdW5jdGlvblwiXG4gIClcbiAgICBmb3IgKFxuICAgICAgdmFyIGkgPSAwLFxuICAgICAgICBwcm9wZXJ0eVN5bWJvbHMgPSAoPGFueT5PYmplY3QpW1wiZ2V0T3duUHJvcGVydHlTeW1ib2xzXCJdKHNvdXJjZSk7XG4gICAgICBpIDwgcHJvcGVydHlTeW1ib2xzLmxlbmd0aDtcbiAgICAgIGkrK1xuICAgIClcbiAgICAgIGlmIChlLmluZGV4T2YocHJvcGVydHlTeW1ib2xzW2ldKSA8IDApXG4gICAgICAgIHJlc3VsdFtwcm9wZXJ0eVN5bWJvbHNbaV1dID0gc291cmNlW3Byb3BlcnR5U3ltYm9sc1tpXV07XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5kZWNsYXJlIHZhciBSZWZsZWN0OiBhbnk7XG5cbmV4cG9ydCB2YXIgX19kZWNvcmF0ZSA9IGZ1bmN0aW9uKFxuICBkZWNvcmF0b3JzOiBhbnksXG4gIHRhcmdldDogYW55LFxuICBrZXk6IGFueSxcbiAgZGVzYzogYW55XG4pIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgIHIgPVxuICAgICAgYyA8IDNcbiAgICAgICAgPyB0YXJnZXRcbiAgICAgICAgOiBkZXNjID09PSBudWxsXG4gICAgICAgICAgPyAoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpKVxuICAgICAgICAgIDogZGVzYyxcbiAgICBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIilcbiAgICByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2VcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIGlmICgoZCA9IGRlY29yYXRvcnNbaV0pKVxuICAgICAgICByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG4iLCJleHBvcnQgY2xhc3MgRG9jdW1lbnRIZWxwZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VsZWN0b3IoXHJcbiAgICBvcHRpb25zOiBBcnJheTx7IHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyB9PixcclxuICAgIGlzU2VsZWN0ZWQ6IChvcHRpb246IHsgdmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0pID0+IGJvb2xlYW4sXHJcbiAgICBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzZWxlY3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIHNlbGVjdFdyYXBwZXIuY2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvbl9fc2VsZWN0LXdyYXBwZXJcIjtcclxuICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XHJcbiAgICBzZWxlY3QuY2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvbl9fc2VsZWN0XCI7XHJcbiAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICBsZXQgb3B0aW9uRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIiwgXCJcIiwge1xyXG4gICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsXHJcbiAgICAgICAgdGV4dDogb3B0aW9uLnRleHQsXHJcbiAgICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQob3B0aW9uKSxcclxuICAgICAgfSk7XHJcbiAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gICAgc2VsZWN0Lm9uY2hhbmdlID0gaGFuZGxlcjtcclxuICAgIHNlbGVjdFdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VsZWN0KTtcclxuICAgIHJldHVybiBzZWxlY3RXcmFwcGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVCdXR0b24oXHJcbiAgICBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkLFxyXG4gICAgdGV4dCA9IFwiXCIsXHJcbiAgICBjbGFzc05hbWUgPSBcInNhLXRvb2xiYXJfX2J1dHRvblwiXHJcbiAgKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBjbGFzc05hbWUsIHtcclxuICAgICAgaW5uZXJUZXh0OiB0ZXh0LFxyXG4gICAgICBvbmNsaWNrOiBoYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYnV0dG9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVFbGVtZW50KFxyXG4gICAgdGFnTmFtZTogc3RyaW5nLFxyXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiLFxyXG4gICAgYXR0cnM/OiBhbnlcclxuICApOiBIVE1MRWxlbWVudCB7XHJcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xyXG4gICAgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgaWYgKCEhYXR0cnMpIHtcclxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICg8YW55PmVsKVtrZXldID0gYXR0cnNba2V5XTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z0VsZW1lbnQocGF0aDogc3RyaW5nKTogU1ZHU1ZHRWxlbWVudCB7XHJcbiAgICBjb25zdCBzdmdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxyXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICAgIFwic3ZnXCJcclxuICAgICk7XHJcbiAgICBjb25zdCB1c2VFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxyXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICAgIFwidXNlXCJcclxuICAgICk7XHJcbiAgICB1c2VFbGVtLnNldEF0dHJpYnV0ZU5TKFxyXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcclxuICAgICAgXCJocmVmXCIsXHJcbiAgICAgIFwiI3NhLXN2Zy1cIiArIHBhdGhcclxuICAgICk7XHJcbiAgICBzdmdFbGVtLmFwcGVuZENoaWxkKHVzZUVsZW0pO1xyXG4gICAgcmV0dXJuIHN2Z0VsZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z0J1dHRvbihwYXRoOiBzdHJpbmcpOiBIVE1MQnV0dG9uRWxlbWVudCB7XHJcbiAgICBjb25zdCBidG4gPSA8SFRNTEJ1dHRvbkVsZW1lbnQ+KFxyXG4gICAgICBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIFwic2EtdGFibGVfX3N2Zy1idXR0b25cIilcclxuICAgICk7XHJcbiAgICBidG4uYXBwZW5kQ2hpbGQoRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChwYXRoKSk7XHJcbiAgICByZXR1cm4gYnRuO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdUb2dnbGVCdXR0b24oXHJcbiAgICBzdmdQYXRoMTogc3RyaW5nLFxyXG4gICAgc3ZQcGF0aDI6IHN0cmluZyxcclxuICAgIHRleHQxOiBzdHJpbmcsXHJcbiAgICB0ZXh0Mjogc3RyaW5nLFxyXG4gICAgaGFuZGxlcjE6IChlOiBhbnkpID0+IGFueSxcclxuICAgIGhhbmRsZXIyOiAoZTogYW55KSA9PiBhbnksXHJcbiAgICBzdGF0ZSA9IFwiZmlyc3RcIixcclxuICAgIGNsYXNzTmFtZSA9IFwic2EtdG9vbGJhcl9fYnV0dG9uIHNhLXRvb2xiYXJfX3N2Zy1idXR0b25cIlxyXG4gICk6IEhUTUxFbGVtZW50IHtcclxuICAgIGNvbnN0IHN2ZzEgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KHN2Z1BhdGgxKTtcclxuICAgIGNvbnN0IHN2ZzIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdFbGVtZW50KHN2UHBhdGgyKTtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgY2xhc3NOYW1lKTtcclxuXHJcbiAgICBjb25zdCB0b2dnbGUgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJmaXJzdFwiKSB7XHJcbiAgICAgICAgc3RhdGUgPSBcInNlY29uZFwiO1xyXG4gICAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQyO1xyXG4gICAgICAgIGJ1dHRvbi5yZW1vdmVDaGlsZChzdmcxKTtcclxuICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMik7XHJcbiAgICAgICAgaGFuZGxlcjIoZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFwic2Vjb25kXCIpIHtcclxuICAgICAgICBzdGF0ZSA9IFwiZmlyc3RcIjtcclxuICAgICAgICBidXR0b24udGl0bGUgPSB0ZXh0MTtcclxuICAgICAgICBidXR0b24ucmVtb3ZlQ2hpbGQoc3ZnMik7XHJcbiAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHN2ZzEpO1xyXG4gICAgICAgIGhhbmRsZXIxKGUpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChzdGF0ZSA9PT0gXCJmaXJzdFwiKSB7XHJcbiAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQxO1xyXG4gICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMSk7XHJcbiAgICB9IGVsc2UgaWYgKChzdGF0ZSA9IFwic2Vjb25kXCIpKSB7XHJcbiAgICAgIGJ1dHRvbi50aXRsZSA9IHRleHQyO1xyXG4gICAgICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnMik7XHJcbiAgICB9XHJcblxyXG4gICAgYnV0dG9uLm9uY2xpY2sgPSB0b2dnbGU7XHJcblxyXG4gICAgcmV0dXJuIGJ1dHRvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSW5wdXQoXHJcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcclxuICAgIHBsYWNlaG9sZGVyID0gXCJcIixcclxuICAgIGRlZmF1bHRWYWx1ZSA9IFwiXCJcclxuICApOiBIVE1MSW5wdXRFbGVtZW50IHtcclxuICAgIHZhciBlbCA9IDxIVE1MSW5wdXRFbGVtZW50PkRvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgIFwiaW5wdXRcIixcclxuICAgICAgY2xhc3NOYW1lLFxyXG4gICAgICB7XHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGVsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBvcHRpb25zID0ge1xyXG4gIHJ1bm5pbmdJbkJyb3dzZXI6IHR5cGVvZiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiLFxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93RG9tUmVuZGVyaW5nKCkge1xyXG4gIHJldHVybiBvcHRpb25zLnJ1bm5pbmdJbkJyb3dzZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21tZXJjaWFsTGljZW5zZUxpbmsoKSB7XHJcbiAgY29uc3QgY29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLWNvbW1lcmNpYWxcIik7XHJcbiAgY29uc3QgbGluayA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIFwic2EtY29tbWVyY2lhbF9fdGV4dFwiLCB7XHJcbiAgICBocmVmOiBcImh0dHBzOi8vd3d3LnN1cnZleWpzLmlvL0J1eVwiLFxyXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxyXG4gIH0pO1xyXG4gIGNvbnN0IGNvbnRhaW5lclNwYW4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBcIlwiKTtcclxuICBjb25zdCBpY29uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU3ZnRWxlbWVudChcIm5vbmNvbW1lcmNpYWxcIik7XHJcbiAgY29uc3QgdGV4dFNwYW4gPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxyXG4gICAgXCJzcGFuXCIsXHJcbiAgICBcInNhLWNvbW1lcmNpYWxfX3Byb2R1Y3RcIixcclxuICAgIHtcclxuICAgICAgaW5uZXJUZXh0OiBcIlBsZWFzZSBwdXJjaGFzZSBhIFN1cnZleUpTIEFuYWx5dGljcyBkZXZlbG9wZXIgbGljZW5zZSB0byB1c2UgaXQgaW4geW91ciBhcHAuXCIsXHJcbiAgICB9XHJcbiAgKTtcclxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGluaykuYXBwZW5kQ2hpbGQoY29udGFpbmVyU3Bhbik7XHJcbiAgY29udGFpbmVyU3Bhbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICBjb250YWluZXJTcGFuLmFwcGVuZENoaWxkKHRleHRTcGFuKTtcclxuICByZXR1cm4gY29udGFpbmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0YUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyB6aXBBcnJheXMoLi4uYXJyYXlzOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gICAgbGV0IHppcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgemlwQXJyYXlbaV0gPSBbXTtcclxuICAgICAgYXJyYXlzLmZvckVhY2goKGFycikgPT4ge1xyXG4gICAgICAgIHppcEFycmF5W2ldLnB1c2goYXJyW2ldKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gemlwQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHVuemlwQXJyYXlzKHppcEFycmF5OiBhbnlbXVtdKTogYW55W11bXSB7XHJcbiAgICBsZXQgYXJyYXlzOiBhbnlbXVtdID0gW107XHJcbiAgICB6aXBBcnJheS5mb3JFYWNoKCh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICB2YWx1ZS5mb3JFYWNoKCh2YWwsIGopID0+IHtcclxuICAgICAgICBpZiAoIWFycmF5c1tqXSkgYXJyYXlzW2pdID0gW107XHJcbiAgICAgICAgYXJyYXlzW2pdW2ldID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFycmF5cztcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBzb3J0RGljdGlvbmFyeShcclxuICAgIGtleXM6IGFueVtdLFxyXG4gICAgdmFsdWVzOiBhbnlbXSxcclxuICAgIGRlc2M6IGJvb2xlYW5cclxuICApOiB7IGtleXM6IGFueVtdLCB2YWx1ZXM6IGFueVtdIH0ge1xyXG4gICAgbGV0IGRpY3Rpb25hcnkgPSB0aGlzLnppcEFycmF5cyhrZXlzLCB2YWx1ZXMpO1xyXG4gICAgbGV0IGNvbXBhcmF0b3IgPSAoYTogYW55W10sIGI6IGFueVtdLCBhc2M6IGJvb2xlYW4gPSB0cnVlKSA9PiB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBhWzFdIDwgYlsxXSA/IDEgOiBhWzFdID09IGJbMV0gPyAwIDogLTE7XHJcbiAgICAgIHJldHVybiBhc2MgPyByZXN1bHQgOiByZXN1bHQgKiAtMTtcclxuICAgIH07XHJcbiAgICBkaWN0aW9uYXJ5LnNvcnQoKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGVzYyA/IGNvbXBhcmF0b3IoYSwgYiwgZmFsc2UpIDogY29tcGFyYXRvcihhLCBiKTtcclxuICAgIH0pO1xyXG4gICAgbGV0IGtleXNBbmRWYWx1ZXMgPSB0aGlzLnVuemlwQXJyYXlzKGRpY3Rpb25hcnkpO1xyXG4gICAgcmV0dXJuIHsga2V5czoga2V5c0FuZFZhbHVlc1swXSwgdmFsdWVzOiBrZXlzQW5kVmFsdWVzWzFdIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRvUGVyY2VudGFnZSh2YWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHZhbHVlIC8gbWF4VmFsdWUpICogMTAwO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmtzQ29udGFpbmVyKFxyXG4gIGxpbmtzOiBBcnJheTx7IG5hbWU6IHN0cmluZywgY29udGVudDogYW55IH0+XHJcbik6IEhUTUxFbGVtZW50IHtcclxuICBjb25zdCBsaW5rc0NvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xyXG4gICAgbGlua3NDb250YWluZXIuYXBwZW5kQ2hpbGQoXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIFwiXCIsIHtcclxuICAgICAgICBpbm5lclRleHQ6IGxpbmsubmFtZSxcclxuICAgICAgICBkb3dubG9hZDogbGluay5uYW1lLFxyXG4gICAgICAgIGhyZWY6IGxpbmsuY29udGVudCxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGxpbmtzQ29udGFpbmVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW1hZ2VzQ29udGFpbmVyKFxyXG4gIGxpbmtzOiBBcnJheTx7IG5hbWU6IHN0cmluZywgY29udGVudDogYW55IH0+XHJcbik6IEhUTUxFbGVtZW50IHtcclxuICBjb25zdCBsaW5rc0NvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xyXG4gICAgbGlua3NDb250YWluZXIuYXBwZW5kQ2hpbGQoXHJcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgXCJcIiwge1xyXG4gICAgICAgIGFsdDogbGluay5uYW1lLFxyXG4gICAgICAgIHNyYzogbGluay5jb250ZW50LFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gbGlua3NDb250YWluZXI7XHJcbn1cclxuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4vdmlzdWFsaXplckJhc2VcIjtcblxuZGVjbGFyZSB0eXBlIFZpc3VhbGl6ZXJDb25zdHJ1Y3RvciA9IG5ldyAoXG4gIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgb3B0aW9ucz86IE9iamVjdFxuKSA9PiBhbnk7XG5cbi8qKlxuICogVmlzdWFsaXplcnMgcmVwb3NpdG9yeS4gWW91IG5lZWQgdG8gcmVnaXN0ZXIgYSB2aXN1YWxpemVyLCBsaW5rIGl0IHRvIHRoZSBxdWVzdGlvbiB0eXBlIG5hbWUgaW4gb3JkZXIgdG8gdmlzdWFsaXplIHRoZSBxdWVzdGlvbiBhbnN3ZXJzIHdpdGggdGhlIGNlcnRhaW4gcmVwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uTWFuYWdlciB7XG4gIHN0YXRpYyBhbHRlcm5hdGl2ZXNWaXN1YWxpemVyOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHN0YXRpYyB2aXp1YWxpemVyczogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PFZpc3VhbGl6ZXJDb25zdHJ1Y3Rvcj4gfSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXIgdmlzdWFsaXplciAoY29uc3RydWN0b3IpIGZvciBxdWVzdGlvbiB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclZpc3VhbGl6ZXIoXG4gICAgdHlwZU5hbWU6IHN0cmluZyxcbiAgICBjb25zdHJ1Y3RvcjogVmlzdWFsaXplckNvbnN0cnVjdG9yXG4gICkge1xuICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3R5cGVOYW1lXTtcbiAgICBpZiAoIXZpc3VhbGl6ZXJzKSB7XG4gICAgICB2aXN1YWxpemVycyA9IFtdO1xuICAgICAgVmlzdWFsaXphdGlvbk1hbmFnZXIudml6dWFsaXplcnNbdHlwZU5hbWVdID0gdmlzdWFsaXplcnM7XG4gICAgfVxuICAgIHZpc3VhbGl6ZXJzLnB1c2goY29uc3RydWN0b3IpO1xuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHZpc3VhbGl6ZXIgKGNvbnN0cnVjdG9yKSBmb3IgcXVlc3Rpb24gdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gICAgdHlwZU5hbWU6IHN0cmluZyxcbiAgICBjb25zdHJ1Y3RvcjogVmlzdWFsaXplckNvbnN0cnVjdG9yXG4gICkge1xuICAgIGxldCB2aXN1YWxpemVycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLnZpenVhbGl6ZXJzW3R5cGVOYW1lXTtcbiAgICBpZiAoISF2aXN1YWxpemVycykge1xuICAgICAgbGV0IGluZGV4ID0gdmlzdWFsaXplcnMuaW5kZXhPZihjb25zdHJ1Y3Rvcik7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHZpc3VhbGl6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHZpc3VhbGl6ZXIgKGNvbnN0cnVjdG9yKSBmb3IgYWxsIHF1ZXN0aW9uIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyVmlzdWFsaXplckZvckFsbChjb25zdHJ1Y3RvcjogVmlzdWFsaXplckNvbnN0cnVjdG9yKSB7XG4gICAgT2JqZWN0LmtleXMoVmlzdWFsaXphdGlvbk1hbmFnZXIudml6dWFsaXplcnMpLmZvckVhY2goKGtleSkgPT5cbiAgICAgIFZpc3VhbGl6YXRpb25NYW5hZ2VyLnVucmVnaXN0ZXJWaXN1YWxpemVyKGtleSwgY29uc3RydWN0b3IpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHZpc3VhbGl6ZXJzIChjb25zdHJ1Y3RvcnMpIGZvciBxdWVzdGlvbiB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRWaXN1YWxpemVyc0J5VHlwZShcbiAgICB0eXBlTmFtZTogc3RyaW5nXG4gICk6IFZpc3VhbGl6ZXJDb25zdHJ1Y3RvcltdIHtcbiAgICBsZXQgdmlzdWFsaXplcnMgPSBWaXN1YWxpemF0aW9uTWFuYWdlci52aXp1YWxpemVyc1t0eXBlTmFtZV07XG4gICAgaWYgKCF2aXN1YWxpemVycykge1xuICAgICAgcmV0dXJuIFtWaXN1YWxpemVyQmFzZV07XG4gICAgfVxuICAgIHJldHVybiB2aXN1YWxpemVycztcbiAgfVxuICAvKipcbiAgICogR2V0IHZpc3VhbGl6ZXJzIChjb25zdHJ1Y3RvcnMpIGZvciBxdWVzdGlvbiB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbHRlcm5hdGl2ZXNWaXN1YWxpemVyKCkge1xuICAgIHJldHVybiBWaXN1YWxpemF0aW9uTWFuYWdlci5hbHRlcm5hdGl2ZXNWaXN1YWxpemVyIHx8IFZpc3VhbGl6ZXJCYXNlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciB2aXN1YWxpemVyIChjb25zdHJ1Y3RvcikgZm9yIHF1ZXN0aW9uIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyQWx0ZXJuYXRpdmVzVmlzdWFsaXplcihjb25zdHJ1Y3RvcjogYW55KSB7XG4gICAgVmlzdWFsaXphdGlvbk1hbmFnZXIuYWx0ZXJuYXRpdmVzVmlzdWFsaXplciA9IGNvbnN0cnVjdG9yO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG4gIE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICBJdGVtVmFsdWUsXG4gIEhlbHBlcnMsXG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbn0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uUGFuZWwgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uUGFuZWxcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcm90ZWN0ZWQgX21hdHJpeERyb3Bkb3duVmlzdWFsaXplcjogVmlzdWFsaXplckJhc2UgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZGF0YSwgb3B0aW9ucywgbmFtZSB8fCBcIm1hdHJpeERyb3Bkb3duXCIpO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5kaXNhYmxlTG9jYWxlU3dpdGNoID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuZGF0YVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5hbGxvd0R5bmFtaWNMYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzVmFsdWVzID0gcXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiByb3cudmFsdWUpO1xuICAgIHRoaXMuX2NoaWxkT3B0aW9ucy5zZXJpZXNMYWJlbHMgPSBxdWVzdGlvbi5yb3dzLm1hcCgocm93OiBJdGVtVmFsdWUpID0+IHJvdy50ZXh0KTtcblxuICAgIGNvbnN0IGlubmVyUXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnMoKTtcbiAgICBjb25zdCBjYW5Hcm91cENvbHVtbnMgPSB0aGlzLl9jaGlsZE9wdGlvbnMuc2VyaWVzVmFsdWVzLmxlbmd0aCA9PSAxICYmIGlubmVyUXVlc3Rpb25zLmV2ZXJ5KGlubmVyUXVlc3Rpb24gPT4gSGVscGVycy5pc0FycmF5c0VxdWFsKGlubmVyUXVlc3Rpb24uY2hvaWNlcywgKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikuY2hvaWNlcykpO1xuICAgIGlmIChjYW5Hcm91cENvbHVtbnMpIHtcbiAgICAgIHZhciBjcmVhdG9ycyA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLmdldFZpc3VhbGl6ZXJzQnlUeXBlKFwibWF0cml4ZHJvcGRvd24tZ3JvdXBlZFwiKTtcbiAgICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplciA9IG5ldyBjcmVhdG9yc1swXSh0aGlzLnF1ZXN0aW9uLCBbXSwgdGhpcy5fY2hpbGRPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyID0gbmV3IFZpc3VhbGl6YXRpb25QYW5lbChpbm5lclF1ZXN0aW9ucywgW10sIHRoaXMuX2NoaWxkT3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLmFkZCh0aGlzLm9uUGFuZWxBZnRlclJlbmRlckNhbGxiYWNrKTtcbiAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TG9jYWxlKG5ld0xvY2FsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5fY2hpbGRPcHRpb25zLnNlcmllc0xhYmVscyA9IHRoaXMucXVlc3Rpb24ucm93cy5tYXAoKHJvdzogSXRlbVZhbHVlKSA9PiByb3cudGV4dCk7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLmxvY2FsZSA9IG5ld0xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF0cml4RHJvcGRvd25WaXN1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXRyaXhEcm9wZG93blZpc3VhbGl6ZXI7XG4gIH1cblxuICBwcml2YXRlIG9uUGFuZWxBZnRlclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duVmlzdWFsaXplckRhdGEoKSB7XG4gICAgbGV0IHBhbmVsRGF0YTogQXJyYXk8YW55PiA9IFtdO1xuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChkYXRhSXRlbSkgPT4ge1xuICAgICAgbGV0IHJhd0RhdGFJdGVtID0gZGF0YUl0ZW1bdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgICAgIGlmICghIXJhd0RhdGFJdGVtKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHJhd0RhdGFJdGVtKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICB2YXIgbmVzdGVkRGF0YUl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCByYXdEYXRhSXRlbVtrZXldKTtcbiAgICAgICAgICBuZXN0ZWREYXRhSXRlbVtEYXRhUHJvdmlkZXIuc2VyaWVzTWFya2VyS2V5XSA9IGtleTtcbiAgICAgICAgICBwYW5lbERhdGEucHVzaChuZXN0ZWREYXRhSXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci51cGRhdGVEYXRhKHBhbmVsRGF0YSk7XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4pIHtcbiAgICBzdXBlci51cGRhdGVEYXRhKGRhdGEpO1xuICAgIHRoaXMudXBkYXRlRHJvcGRvd25WaXN1YWxpemVyRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVEcm9wZG93blZpc3VhbGl6ZXJEYXRhKCk7XG4gICAgc3VwZXIub25EYXRhQ2hhbmdlZCgpO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25zKCkge1xuICAgIGNvbnN0IG1hdHJpeGRyb3Bkb3duOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgPSA8YW55PnRoaXMucXVlc3Rpb247XG4gICAgcmV0dXJuIG1hdHJpeGRyb3Bkb3duLmNvbHVtbnMubWFwKFxuICAgICAgKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgY2VsbFF1ZXN0aW9uOiBhbnkgPSBjb2x1bW4udGVtcGxhdGVRdWVzdGlvbjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2VsbFF1ZXN0aW9uLmNob2ljZXMpICYmIGNlbGxRdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzID0gbWF0cml4ZHJvcGRvd24uY2hvaWNlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbFF1ZXN0aW9uO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fbWF0cml4RHJvcGRvd25WaXN1YWxpemVyLmNsZWFyKCk7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5yZW5kZXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX21hdHJpeERyb3Bkb3duVmlzdWFsaXplci5vbkFmdGVyUmVuZGVyLnJlbW92ZSh0aGlzLm9uUGFuZWxBZnRlclJlbmRlckNhbGxiYWNrKTtcbiAgfVxufVxuXG5WaXN1YWxpemF0aW9uTWFuYWdlci5yZWdpc3RlclZpc3VhbGl6ZXIoXG4gIFwibWF0cml4ZHJvcGRvd25cIixcbiAgVmlzdWFsaXphdGlvbk1hdHJpeERyb3Bkb3duXG4pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25QYW5lbER5bmFtaWNcIjtcblxuZXhwb3J0IGNsYXNzIFZpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pYyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiBPYmplY3RcbiAgKSB7XG4gICAgc3VwZXIocXVlc3Rpb24sIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBcIm1hdHJpeER5bmFtaWNcIjtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucygpIHtcbiAgICBjb25zdCBtYXRyaXhkeW5hbWljOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgPSA8YW55PnRoaXMucXVlc3Rpb247XG4gICAgY29uc3QgdmlzaWJsZVJvd3MgPSBtYXRyaXhkeW5hbWljLnZpc2libGVSb3dzO1xuXG4gICAgaWYgKHZpc2libGVSb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIHZpc2libGVSb3dzWzBdLmNlbGxzLm1hcChjID0+IGMucXVlc3Rpb24pO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgXCJtYXRyaXhkeW5hbWljXCIsXG4gIFZpc3VhbGl6YXRpb25NYXRyaXhEeW5hbWljXG4pO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgRXZlbnQsIFF1ZXN0aW9uLCBTdXJ2ZXlNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgU2VsZWN0QmFzZSwgSVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uIH0gZnJvbSBcIi4vc2VsZWN0QmFzZVwiO1xuaW1wb3J0IHsgQWx0ZXJuYXRpdmVWaXN1YWxpemVyc1dyYXBwZXIgfSBmcm9tIFwiLi9hbHRlcm5hdGl2ZVZpenVhbGl6ZXJzV3JhcHBlclwiO1xuaW1wb3J0IHsgRG9jdW1lbnRIZWxwZXIsIGNyZWF0ZUNvbW1lcmNpYWxMaWNlbnNlTGluayB9IGZyb20gXCIuL3V0aWxzL2luZGV4XCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBJVmlzdWFsaXplclBhbmVsRWxlbWVudCwgSVN0YXRlLCBJUGVybWlzc2lvbiB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgRmlsdGVySW5mbyB9IGZyb20gXCIuL2ZpbHRlckluZm9cIjtcbmltcG9ydCB7IExheW91dEVuZ2luZSwgTXV1cmlMYXlvdXRFbmdpbmUgfSBmcm9tIFwiLi9sYXlvdXRFbmdpbmVcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2RhdGFQcm92aWRlclwiO1xuXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vdmlzdWFsaXphdGlvblBhbmVsLnNjc3NcIik7XG5cbmNvbnN0IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSA9IFwic2EtcXVlc3Rpb25cIjtcbmNvbnN0IHF1ZXN0aW9uTGF5b3V0ZWRFbGVtZW50Q2xhc3NOYW1lID0gXCJzYS1xdWVzdGlvbi1sYXlvdXRlZFwiO1xuXG5pZiAoISFkb2N1bWVudCkge1xuICBjb25zdCBzdmdUZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vc3ZnYnVuZGxlLmh0bWxcIik7XG4gIGNvbnN0IHRlbXBsYXRlSG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdGVtcGxhdGVIb2xkZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICB0ZW1wbGF0ZUhvbGRlci5pbm5lckhUTUwgPSBzdmdUZW1wbGF0ZTtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZUhvbGRlcik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJQYW5lbFJlbmRlcmVkRWxlbWVudFxuICBleHRlbmRzIElWaXN1YWxpemVyUGFuZWxFbGVtZW50IHtcbiAgcmVuZGVyZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogVmlzdWFsaXphdGlvbiBQYW5lbCBjb25maWd1cmF0aW9uLiBQYXNzIGl0IGFzIHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgYFZpc3VhbGl6YXRpb25QYW5lbGAgY29uc3RydWN0b3I6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoc3VydmV5UXVlc3Rpb25zLCBzdXJ2ZXlSZXN1bHRzLCB2aXpQYW5lbE9wdGlvbnMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnMge1xuICAvLyBBbiBvYmplY3QgbmFtZWQgYWZ0ZXIgYSBxdWVzdGlvbiB0aGF0IGl0IGNvbmZpZ3VyZXMuXG4gIC8vIHF1ZXN0aW9uTmFtZToge1xuICAvLyAgIGludGVydmFsczogW11cbiAgLy8gfSxcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBsYWJlbCBjaGFyYWN0ZXJzIGFmdGVyIHdoaWNoIHRydW5jYXRpb24gc3RhcnRzLlxuICAgKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAtMSB0byBkaXNhYmxlIHRydW5jYXRpb24uXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IDI3XG4gICAqL1xuICBsYWJlbFRydW5jYXRlTGVuZ3RoPzogbnVtYmVyO1xuXG4gIGFsbG93TWFrZVF1ZXN0aW9uc1ByaXZhdGU/OiBib29sZWFuO1xuXG4gIHNlcmllc1ZhbHVlcz86IHN0cmluZ1tdO1xuICBzZXJpZXNMYWJlbHM/OiBzdHJpbmdbXTtcbiAgdXNlVmFsdWVzQXNMYWJlbHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXNzIGEgc3VydmV5IGluc3RhbmNlIHRvIHVzZSBzdXJ2ZXkgbG9jYWxlcyBpbiB0aGUgVmlzdWFsaXphdGlvbiBQYW5lbC5cbiAgICovXG4gIHN1cnZleT86IFN1cnZleU1vZGVsO1xuICAvKipcbiAgICogQSBjb21tb24gZGF0YSBwcm92aWRlciBmb3IgYWxsIHZpc3VhbGl6ZXJzLlxuICAgKi9cbiAgZGF0YVByb3ZpZGVyPzogRGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiBpbmRpdmlkdWFsIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBhbGxvd0hpZGVRdWVzdGlvbnM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXJyYW5nZSBjaGFydHMgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBzY3JlZW4gc3BhY2UgYW5kIGFsbG93IHVzZXJzIHRvIHJlb3JkZXIgdGhlbSB2aWEgZHJhZyBhbmQgZHJvcC5cbiAgICpcbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBkaXNhYmxlZCwgY2hhcnRzIGFyZSBkaXNwbGF5ZWQgb25lIHVuZGVyIHRoZSBvdGhlciBhbmQgdXNlcnMgY2Fubm90IHJlb3JkZXIgdGhlbS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqXG4gICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vRXhhbXBsZXMvQW5hbHl0aWNzP2lkPWN1c3RvbS1sYXlvdXQgKGxpbmtTdHlsZSkpXG4gICAqXG4gICAqIEBzZWUgbGF5b3V0RW5naW5lXG4gICAqL1xuICBhbGxvd0R5bmFtaWNMYXlvdXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQSBsYXlvdXQgZW5naW5lIHVzZWQgdG8gYXJyYW5nZSBjaGFydHMgb24gdGhlIFZpc3VhbGl6YXRpb24gUGFuZWwuXG4gICAqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gaW50ZWdyYXRlIGEgdGhpcmQtcGFydHkgbGF5b3V0IGVuZ2luZSB3aXRoIFN1cnZleUpTIERhc2hib2FyZC5cbiAgICpcbiAgICogQHNlZSBhbGxvd0R5bmFtaWNMYXlvdXRcbiAgICovXG4gIGxheW91dEVuZ2luZT86IExheW91dEVuZ2luZTtcbiAgLyoqXG4gICAqIEFsbG93cyB1c2VycyB0byBzd2l0Y2ggYmV0d2VlbiBhYnNvbHV0ZSBhbmQgcGVyY2VudGFnZSB2YWx1ZXMgaW4gYmFyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgU2hvdyBQZXJjZW50YWdlcyBidXR0b24gdG8gZWFjaCBiYXIgY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBzaG93UGVyY2VudGFnZXNcbiAgICogQHNlZSBzaG93T25seVBlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgYWxsb3dTaG93UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgYmFyIGNoYXJ0cyBkaXNwbGF5IHBlcmNlbnRhZ2VzIGluIGFkZGl0aW9uIHRvIGFic29sdXRlIHZhbHVlcy5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd1Nob3dQZXJjZW50YWdlc2AgcHJvcGVydHkuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dPbmx5UGVyY2VudGFnZXNcbiAgICogQHNlZSBwZXJjZW50YWdlUHJlY2lzaW9uXG4gICAqL1xuICBzaG93UGVyY2VudGFnZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgYmFyIGNoYXJ0cyBkaXNwbGF5IG9ubHkgcGVyY2VudGFnZXMsIHdpdGhvdXQgYWJzb2x1dGUgdmFsdWVzLlxuICAgKlxuICAgKiBBcHBsaWVzIG9ubHkgaWYgdGhlIGBhbGxvd1Nob3dQZXJjZW50YWdlc2Agb3IgYHNob3dQZXJjZW50YWdlc2AgcHJvcGVydHkgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93U2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgc2hvd1BlcmNlbnRhZ2VzXG4gICAqIEBzZWUgcGVyY2VudGFnZVByZWNpc2lvblxuICAgKi9cbiAgc2hvd09ubHlQZXJjZW50YWdlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgcGVyY2VudGFnZSBwcmVjaXNpb24uXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IDBcbiAgICpcbiAgICogQHNlZSBhbGxvd1Nob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dQZXJjZW50YWdlc1xuICAgKiBAc2VlIHNob3dPbmx5UGVyY2VudGFnZXNcbiAgICovXG4gIHBlcmNlbnRhZ2VQcmVjaXNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBGcmVlIFRyaWFsIGJhci5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiA+IFlvdSBjYW4gZW5hYmxlIHRoaXMgcHJvcGVydHkgb25seSBpZiB5b3UgaGF2ZSBhIFN1cnZleUpTIERhc2hib2FyZCBjb21tZXJjaWFsIGxpY2Vuc2UuIEl0IGlzIGlsbGVnYWwgdG8gZW5hYmxlIHRoaXMgcHJvcGVydHkgd2l0aG91dCBhIGxpY2Vuc2UuXG4gICAqL1xuICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNvcnQgYW5zd2VycyBieSBhbnN3ZXIgY291bnQuIEFwcGxpZXMgb25seSB0byBiYXIgYW5kIHNjYXR0ZXIgY2hhcnRzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTb3J0aW5nIGRyb3Bkb3duIHRvIGVhY2ggYmFyIGFuZCBzY2F0dGVyIGNoYXJ0LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICpcbiAgICogQHNlZSBhbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFsbG93Q2hhbmdlQW5zd2Vyc09yZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gc29ydCBhbnN3ZXJzIGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqIEFjY2VwdGVkIHZhbHVlczpcbiAgICpcbiAgICogLSBgXCJkZWZhdWx0XCJgIChkZWZhdWx0KSAtIERvIG5vdCBzb3J0IGFuc3dlcnMuXG4gICAqIC0gYFwiYXNjXCJgIC0gU29ydCBhbnN3ZXJzIGJ5IGFzY2VuZGluZyBhbnN3ZXIgY291bnQuXG4gICAqIC0gYFwiZGVzY1wiYCAtIFNvcnQgYW5zd2VycyBieSBkZXNjZW5kaW5nIGFuc3dlciBjb3VudC5cbiAgICpcbiAgICogVXNlcnMgY2FuIGNoYW5nZSB0aGlzIHByb3BlcnR5IHZhbHVlIGlmIHlvdSBlbmFibGUgdGhlIGBhbGxvd0NoYW5nZUFuc3dlcnNPcmRlcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgYWxsb3dDaGFuZ2VBbnN3ZXJzT3JkZXJcbiAgICovXG4gIGFuc3dlcnNPcmRlcj86IFwiZGVmYXVsdFwiIHwgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIGhpZGUgYW5zd2VycyB3aXRoIHplcm8gY291bnQgaW4gYmFyIGFuZCBzY2F0dGVyIGNoYXJ0cy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBhZGRzIGEgSGlkZSBFbXB0eSBBbnN3ZXJzIGJ1dHRvbiB0byBlYWNoIGJhciBhbmQgc2NhdHRlciBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhpZGVzIGFuc3dlcnMgd2l0aCB6ZXJvIGNvdW50IGluIGJhciBhbmQgc2NhdHRlciBjaGFydHMuXG4gICAqXG4gICAqIFVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB2YWx1ZSBpZiB5b3UgZW5hYmxlIHRoZSBgYWxsb3dIaWRlRW1wdHlBbnN3ZXJzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKlxuICAgKiBAc2VlIGFsbG93SGlkZUVtcHR5QW5zd2Vyc1xuICAgKi9cbiAgaGlkZUVtcHR5QW5zd2Vycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoZXRoZXIgdG8gc2hvdyB0b3AgNSwgMTAsIG9yIDIwIGFuc3dlcnMgYnkgYW5zd2VyIGNvdW50LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUb3AgTiBBbnN3ZXJzIGRyb3Bkb3duIHRvIGVhY2ggY2hhcnQuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VG9wTkFuc3dlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHNob3cgdGhlIG51bWJlciBvZiByZXNwb25kZW50cyB3aG8gZGlkIG5vdCBhbnN3ZXIgYSBwYXJ0aWN1bGFyIHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBTaG93IE1pc3NpbmcgQW5zd2VycyBidXR0b24gdG8gZWFjaCBjaGFydC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgKi9cbiAgYWxsb3dTaG93TWlzc2luZ0Fuc3dlcnM/OiBib29sZWFuO1xuXG4gIGFsbG93RXhwZXJpbWVudGFsRmVhdHVyZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmYXVsdCBjaGFydCB0eXBlLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBxdWVzdGlvbiB0eXBlIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIC0gQm9vbGVhbjogYFwiYmFyXCJgIHwgYFwicGllXCJgIHwgYFwiZG91Z2hudXRcImBcbiAgICogLSBEYXRlLCBOdW1iZXI6IGBcImJhclwiYCB8IGBcInNjYXR0ZXJcImBcbiAgICogLSBNYXRyaXg6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic3RhY2tlZGJhclwiYFxuICAgKiAtIFJhdGluZzogYFwiYmFyXCJgIHwgYFwic2NhdHRlclwiYCB8IGBcImdhdWdlXCJgIHwgYFwiYnVsbGV0XCJgXG4gICAqIC0gUmFkaW9ncm91cCwgQ2hlY2tib3gsIERyb3Bkb3duLCBJbWFnZSBQaWNrZXI6IGBcImJhclwiYCB8IGBcInBpZVwiYCB8IGBcImRvdWdobnV0XCJgIHwgYFwic2NhdHRlclwiYFxuICAgKlxuICAgKiBUbyBzZXQgYSB0eXBlIGZvciBhbiBpbmRpdmlkdWFsIGNoYXJ0LCBhY2Nlc3MgdGhpcyBjaGFydCBpbiB0aGUgYHZpc3VhbGl6ZXJzYCBhcnJheSBhbmQgc2V0IGl0cyBgY2hhcnRUeXBlYCBwcm9wZXJ0eSB0byBvbmUgb2YgdGhlIHZhbHVlcyBkZXNjcmliZWQgYWJvdmU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHZpelBhbmVsID0gbmV3IFN1cnZleUFuYWx5dGljcy5WaXN1YWxpemF0aW9uUGFuZWwoIC4uLiApO1xuICAgKiB2aXpQYW5lbC52aXN1YWxpemVyc1swXS5jaGFydFR5cGUgPSBcInN0YWNrZWRiYXJcIjtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBkZWZhdWx0Q2hhcnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb3dzIHVzZXJzIHRvIHRyYW5zcG9zZSBhIHZpc3VhbGl6ZWQgbWF0cml4IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGFkZHMgYSBUcmFuc3Bvc2UgYnV0dG9uIHRvIGNoYXJ0cyB0aGF0IHZpc3VhbGl6ZSBtYXRyaXhlcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIFZhbHVlcywgbWF0cml4IHJvd3MgZ28gdG8gY2hhcnQgYXJndW1lbnRzIGFuZCBtYXRyaXggY29sdW1ucyBmb3JtIGNoYXJ0IHNlcmllcy4gV2hlbiB1c2VycyBzZWxlY3QgUGVyIENvbHVtbnMsIG1hdHJpeCByb3dzIGZvcm0gY2hhcnQgc2VyaWVzIGFuZCBtYXRyaXggY29sdW1ucyBnbyB0byBjaGFydCBhcmd1bWVudHMuXG4gICAqXG4gICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICovXG4gIGFsbG93VHJhbnNwb3NlRGF0YT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gY3Jvc3MtZmlsdGVyIGNoYXJ0cy4gVGhlIGZpbHRlciBhcHBsaWVzIHdoZW4gdXNlcnMgc2VsZWN0IGEgc2VyaWVzIHBvaW50LlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlOiBgdHJ1ZWBcbiAgICovXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbjtcblxuICByZW5kZXJDb250ZW50PzogRnVuY3Rpb247XG4gIGRlc3Ryb3lDb250ZW50PzogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgSFRNTCB0YWdzIGZyb20gc3VydmV5IGVsZW1lbnQgdGl0bGVzLlxuICAgKlxuICAgKiBTdXJ2ZXkgZWxlbWVudCB0aXRsZXMgY2FuIGNvbnRhaW4gSFRNTCBtYXJrdXAgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdXNlcnMuIEFuIGF0dGFja2VyIGNhbiBpbmplY3QgbWFsaWNpb3VzIGNvZGUgaW50byB0aGUgdGl0bGVzLiBUbyBndWFyZCBhZ2FpbnN0IGl0LCBrZWVwIHRoaXMgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZTogYHRydWVgXG4gICAqL1xuICBzdHJpcEh0bWxGcm9tVGl0bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBWaXN1YWxpemF0aW9uUGFuZWwgaXMgcmVzcG9uc2libGUgZm9yIHZpc3VhbGl6aW5nIGFuIGFycmF5IG9mIHN1cnZleSBxdWVzdGlvbnNcbiAqIDxici8+XG4gKiA8YnIvPiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzOlxuICogPGJyLz4gcXVlc3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VydmV5IHF1ZXN0aW9ucyB0byB2aXN1YWxpemUsXG4gKiA8YnIvPiBkYXRhIC0gYW4gYXJyYXkgb2YgYW5zd2VycyBpbiBmb3JtYXQgb2Ygc3VydmV5IHJlc3VsdCxcbiAqIDxici8+IG9wdGlvbnMgLSBvYmplY3Qgb2YgdGhlIElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zIHR5cGUsIEBzZWUgSVZpc3VhbGl6YXRpb25QYW5lbE9wdGlvbnNcbiAqIDxici8+IGVsZW1lbnRzIC0gbGlzdCBvZiB2aXN1YWwgZWxlbWVudCBkZXNjcmlwdGlvbnNcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uUGFuZWwgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB2aXN1YWxpemVyczogQXJyYXk8VmlzdWFsaXplckJhc2U+ID0gW107XG4gIHByaXZhdGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVuZGVyZWRRdWVzdGlvbnNDb3VudDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uczogQXJyYXk8YW55PixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM6IElWaXN1YWxpemF0aW9uUGFuZWxPcHRpb25zID0ge30sXG4gICAgcHJpdmF0ZSBfZWxlbWVudHM6IEFycmF5PElWaXN1YWxpemVyUGFuZWxSZW5kZXJlZEVsZW1lbnQ+ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGRhdGEsIG9wdGlvbnMsIFwicGFuZWxcIik7XG5cbiAgICB0aGlzLl9sYXlvdXRFbmdpbmUgPVxuICAgICAgb3B0aW9ucy5sYXlvdXRFbmdpbmUgfHxcbiAgICAgIG5ldyBNdXVyaUxheW91dEVuZ2luZShcbiAgICAgICAgdGhpcy5hbGxvd0R5bmFtaWNMYXlvdXQsXG4gICAgICAgIFwiLlwiICsgcXVlc3Rpb25MYXlvdXRlZEVsZW1lbnRDbGFzc05hbWVcbiAgICAgICk7XG4gICAgdGhpcy5fbGF5b3V0RW5naW5lLm9uTW92ZUNhbGxiYWNrID0gKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+XG4gICAgICB0aGlzLm1vdmVWaXNpYmxlRWxlbWVudChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgdGhpcy5zaG93SGVhZGVyID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkge1xuICAgICAgbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB0aGlzLm9wdGlvbnMuc3VydmV5LmxvY2FsZTtcbiAgICB9XG5cbiAgICBpZiAoX2VsZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRzID0gdGhpcy5idWlsZEVsZW1lbnRzKHF1ZXN0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgPVxuICAgICAgVmlzdWFsaXphdGlvblBhbmVsLmhhdmVDb21tZXJjaWFsTGljZW5zZSB8fFxuICAgICAgKHR5cGVvZiBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IG9wdGlvbnMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlXG4gICAgICAgIDogZmFsc2UpO1xuXG4gICAgdGhpcy5idWlsZFZpc3VhbGl6ZXJzKHF1ZXN0aW9ucyk7XG4gICAgaWYgKCF0aGlzLmhhdmVDb21tZXJjaWFsTGljZW5zZSkge1xuICAgICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY29tbWVyY2lhbExpY2Vuc2VcIiwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlQ29tbWVyY2lhbExpY2Vuc2VMaW5rKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJyZXNldEZpbHRlclwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKCh2aXN1YWxpemVyKSA9PiB7XG4gICAgICAgICAgaWYgKHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBTZWxlY3RCYXNlIHx8IHZpc3VhbGl6ZXIgaW5zdGFuY2VvZiBBbHRlcm5hdGl2ZVZpc3VhbGl6ZXJzV3JhcHBlcikge1xuICAgICAgICAgICAgdmlzdWFsaXplci5zZXRTZWxlY3Rpb24odW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgbG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlc2V0RmlsdGVyXCIpKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJUb29sYmFySXRlbShcImFkZEVsZW1lbnRcIiwgKHRvb2xiYXI6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5hbGxvd0hpZGVRdWVzdGlvbnMpIHtcbiAgICAgICAgbGV0IGFkZEVsZW1lbnRTZWxlY3RvcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFkZEVsZW1lbnRTZWxlY3RvclVwZGF0ZXIgPSAoXG4gICAgICAgICAgcGFuZWw6IFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICAgICAgICBvcHRpb25zOiBhbnlcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGlkZGVuRWxlbWVudHMgPSB0aGlzLmhpZGRlbkVsZW1lbnRzO1xuICAgICAgICAgIGlmIChoaWRkZW5FbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RXcmFwcGVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICA8YW55PntcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYWRkRWxlbWVudFwiKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmNvbmNhdChoaWRkZW5FbGVtZW50cylcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWxlbWVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlbGVtZW50LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKG9wdGlvbjogYW55KSA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnQoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgKGFkZEVsZW1lbnRTZWxlY3RvciAmJlxuICAgICAgICAgICAgICB0b29sYmFyLnJlcGxhY2VDaGlsZChzZWxlY3RXcmFwcGVyLCBhZGRFbGVtZW50U2VsZWN0b3IpKSB8fFxuICAgICAgICAgICAgICB0b29sYmFyLmFwcGVuZENoaWxkKHNlbGVjdFdyYXBwZXIpO1xuICAgICAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yID0gc2VsZWN0V3JhcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkRWxlbWVudFNlbGVjdG9yICYmIHRvb2xiYXIucmVtb3ZlQ2hpbGQoYWRkRWxlbWVudFNlbGVjdG9yKTtcbiAgICAgICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFkZEVsZW1lbnRTZWxlY3RvclVwZGF0ZXIodGhpcywge30pO1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUVsZW1lbnRzQ2hhbmdlZC5hZGQoYWRkRWxlbWVudFNlbGVjdG9yVXBkYXRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGlmICghdGhpcy5vcHRpb25zLmRpc2FibGVMb2NhbGVTd2l0Y2ggJiYgdGhpcy5sb2NhbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGxvY2FsZUNob2ljZXMgPSB0aGlzLmxvY2FsZXMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICAgICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhlbGVtZW50KVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICAvLyBsb2NhbGVDaG9pY2VzLnVuc2hpZnQoe1xuICAgICAgLy8gICB2YWx1ZTogXCJcIixcbiAgICAgIC8vICAgdGV4dDogbG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNoYW5nZUxvY2FsZVwiKSxcbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5yZWdpc3RlclRvb2xiYXJJdGVtKFwiY2hhbmdlTG9jYWxlXCIsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIERvY3VtZW50SGVscGVyLmNyZWF0ZVNlbGVjdG9yKGxvY2FsZUNob2ljZXMsXG4gICAgICAgICAgKG9wdGlvbjogYW55KSA9PiAhIW9wdGlvbi52YWx1ZSAmJiB0aGlzLmxvY2FsZSA9PT0gb3B0aW9uLnZhbHVlLFxuICAgICAgICAgIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHZhciBuZXdMb2NhbGUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlID0gbmV3TG9jYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgc2VuZGVyOiBWaXN1YWxpemVyQmFzZSxcbiAgICBvcHRpb25zOiBhbnlcbiAgKSA9PiB7XG4gICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uc0NvdW50Kys7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9PSB0aGlzLnF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbnNDb3VudCA9IDA7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgfVxuICB9O1xuXG4gIHByb3RlY3RlZCBzaG93RWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgY29uc3QgZWxlbWVudEluZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgICBlbGVtZW50LmlzVmlzaWJsZSA9IHRydWU7XG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lbEVsZW1lbnQoXG4gICAgICBlbGVtZW50LFxuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyXG4gICAgKTtcbiAgICB0aGlzLmxheW91dEVuZ2luZS5hZGQoW3F1ZXN0aW9uRWxlbWVudF0sIHsgaW5kZXg6IGVsZW1lbnRJbmRleCB9KTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQoZWxlbWVudCwgXCJBRERFRFwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlRWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudChlbGVtZW50TmFtZSk7XG4gICAgZWxlbWVudC5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpZiAoISFlbGVtZW50LnJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5sYXlvdXRFbmdpbmUucmVtb3ZlKFtlbGVtZW50LnJlbmRlcmVkRWxlbWVudF0pO1xuICAgICAgdGhpcy5jb250ZW50Q29udGFpbmVyLnJlbW92ZUNoaWxkKGVsZW1lbnQucmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQoZWxlbWVudCwgXCJSRU1PVkVEXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1ha2VFbGVtZW50UHJpdmF0ZShlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkge1xuICAgIGVsZW1lbnQuaXNQdWJsaWMgPSBmYWxzZTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkLmZpcmUodGhpcywgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFrZUVsZW1lbnRQdWJsaWMoZWxlbWVudDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmlzUHVibGljID0gdHJ1ZTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkLmZpcmUodGhpcywgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICB0aGlzLm9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2sodGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW92ZVZpc2libGVFbGVtZW50KFxuICAgIGZyb21WaXNpYmxlSW5kZXg6IG51bWJlcixcbiAgICB0b1Zpc2libGVJbmRleDogbnVtYmVyXG4gICkge1xuICAgIGxldCBmcm9tSW5kZXgsIHRvSW5kZXg7XG5cbiAgICBsZXQgZnJvbVZpc2libGVJbmRleEVsZW1lbnQgPSB0aGlzLnZpc2libGVFbGVtZW50c1tmcm9tVmlzaWJsZUluZGV4XTtcbiAgICBsZXQgdG9WaXNpYmxlSW5kZXhFbGVtZW50ID0gdGhpcy52aXNpYmxlRWxlbWVudHNbdG9WaXNpYmxlSW5kZXhdO1xuXG4gICAgZnJvbUluZGV4ID0gdGhpcy5fZWxlbWVudHMuaW5kZXhPZihmcm9tVmlzaWJsZUluZGV4RWxlbWVudCk7XG4gICAgdG9JbmRleCA9IHRoaXMuX2VsZW1lbnRzLmluZGV4T2YodG9WaXNpYmxlSW5kZXhFbGVtZW50KTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnQoZnJvbUluZGV4LCB0b0luZGV4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb3ZlRWxlbWVudChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5fZWxlbWVudHMuc3BsaWNlKGZyb21JbmRleCwgMSk7XG4gICAgdGhpcy5fZWxlbWVudHMuc3BsaWNlKHRvSW5kZXgsIDAsIGVsZW1lbnRzWzBdKTtcbiAgICB0aGlzLnZpc2libGVFbGVtZW50c0NoYW5nZWQoZWxlbWVudHNbMF0sIFwiTU9WRURcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcjogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yQ29yZShjb2xvcik7XG4gICAgdGhpcy52aXN1YWxpemVycy5mb3JFYWNoKHZpc3VhbGl6ZXIgPT4gdmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVmlzdWFsaXplcnMocXVlc3Rpb25zOiBBcnJheTxRdWVzdGlvbj4pIHtcbiAgICBxdWVzdGlvbnMuZm9yRWFjaCgocXVlc3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmNyZWF0ZVZpc3VhbGl6ZXIocXVlc3Rpb24pO1xuXG4gICAgICBpZiAodGhpcy5hbGxvd0hpZGVRdWVzdGlvbnMpIHtcbiAgICAgICAgdmlzdWFsaXplci5yZWdpc3RlclRvb2xiYXJJdGVtKFwicmVtb3ZlUXVlc3Rpb25cIiwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVCdXR0b24oKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVFbGVtZW50KHF1ZXN0aW9uLm5hbWUpLCAwKTtcbiAgICAgICAgICB9LCBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaGlkZUJ1dHRvblwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hbGxvd01ha2VRdWVzdGlvbnNQcml2YXRlKSB7XG4gICAgICAgIHZpc3VhbGl6ZXIucmVnaXN0ZXJUb29sYmFySXRlbShcIm1ha2VQcml2YXRlUHVibGljXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHF1ZXN0aW9uLm5hbWUpO1xuXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBlbGVtZW50LmlzUHVibGljID8gXCJmaXJzdFwiIDogXCJzZWNvbmRcIjtcblxuICAgICAgICAgIGNvbnN0IHBhdGhNYWtlUHJpdmF0ZVN2ZyA9IFwibWFrZXByaXZhdGVcIjtcbiAgICAgICAgICBjb25zdCBwYXRoTWFrZVB1YmxpY1N2ZyA9IFwibWFrZXB1YmxpY1wiO1xuICAgICAgICAgIGNvbnN0IG1ha2VQcml2YXRlVGl0bGUgPSBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWFrZVByaXZhdGVCdXR0b25cIik7XG4gICAgICAgICAgY29uc3QgbWFrZVB1YmxpY1RpdGxlID0gbG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1ha2VQdWJsaWNCdXR0b25cIik7XG4gICAgICAgICAgY29uc3QgZG9Qcml2YXRlID0gKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm1ha2VFbGVtZW50UHJpdmF0ZShlbGVtZW50KSwgMCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBkb1B1YmxpYyA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tYWtlRWxlbWVudFB1YmxpYyhlbGVtZW50KSwgMCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBEb2N1bWVudEhlbHBlci5jcmVhdGVTdmdUb2dnbGVCdXR0b24oXG4gICAgICAgICAgICBwYXRoTWFrZVB1YmxpY1N2ZyxcbiAgICAgICAgICAgIHBhdGhNYWtlUHJpdmF0ZVN2ZyxcbiAgICAgICAgICAgIG1ha2VQcml2YXRlVGl0bGUsXG4gICAgICAgICAgICBtYWtlUHVibGljVGl0bGUsXG4gICAgICAgICAgICBkb1B1YmxpYyxcbiAgICAgICAgICAgIGRvUHJpdmF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2aXN1YWxpemVyLnN1cHBvcnRTZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgdmlzdWFsaXplcldpdGhTZWxlY3Rpb24gPSA8SVZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uPihcbiAgICAgICAgICAoPGFueT52aXN1YWxpemVyKVxuICAgICAgICApO1xuICAgICAgICBsZXQgZmlsdGVySW5mbyA9IG5ldyBGaWx0ZXJJbmZvKHZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uKTtcblxuICAgICAgICB2aXN1YWxpemVyLnJlZ2lzdGVyVG9vbGJhckl0ZW0oXCJxdWVzdGlvbkZpbHRlckluZm9cIiwgKCkgPT4ge1xuICAgICAgICAgIGZpbHRlckluZm8udXBkYXRlKHZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uLnNlbGVjdGlvbik7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlckluZm8uaHRtbEVsZW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZpc3VhbGl6ZXJXaXRoU2VsZWN0aW9uLm9uRGF0YUl0ZW1TZWxlY3RlZCA9IChcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlOiBhbnksXG4gICAgICAgICAgc2VsZWN0ZWRUZXh0OiBzdHJpbmdcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgZmlsdGVySW5mby51cGRhdGUoeyB2YWx1ZTogc2VsZWN0ZWRWYWx1ZSwgdGV4dDogc2VsZWN0ZWRUZXh0IH0pO1xuICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKHF1ZXN0aW9uLm5hbWUsIHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2aXN1YWxpemVyLm9uVXBkYXRlID0gKCkgPT4gdGhpcy5sYXlvdXQoKTtcbiAgICAgIHZpc3VhbGl6ZXIub25BZnRlclJlbmRlci5hZGQodGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayk7XG4gICAgICB0aGlzLnZpc3VhbGl6ZXJzLnB1c2godmlzdWFsaXplcik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaXN1YWxpemVycygpIHtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2goKHZpc3VhbGl6ZXIpID0+IHtcbiAgICAgIHZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodmlzdWFsaXplciBpbnN0YW5jZW9mIFNlbGVjdEJhc2UpIHtcbiAgICAgICAgdmlzdWFsaXplci5vbkRhdGFJdGVtU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2aXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2spO1xuICAgICAgdmlzdWFsaXplci5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy52aXN1YWxpemVycyA9IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHN1cGVyLnNldExvY2FsZShuZXdMb2NhbGUpO1xuICAgICh0aGlzLnF1ZXN0aW9ucyB8fCBbXSkuZm9yRWFjaCgocXVlc3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQocXVlc3Rpb24ubmFtZSk7XG4gICAgICBpZiAoISFlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZGlzcGxheU5hbWUgPSB0aGlzLnByb2Nlc3NUZXh0KHF1ZXN0aW9uLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc3VhbGl6ZXJzLmZvckVhY2godiA9PiB7XG4gICAgICB2Lm9wdGlvbnMuc2VyaWVzTGFiZWxzID0gdGhpcy5vcHRpb25zLnNlcmllc0xhYmVscztcbiAgICAgIHYubG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIH0pO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFZpc3VhbGl6YXRpb25QYW5lbCBhbGxvd3MgZHluYW1pYyBsYXlvdXRpbmcgLSByZWFycmFuZ2UgaXRlbXMgdmlhIGRyYXAvZHJvcC4gU2V0IHZpYSBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0R5bmFtaWNMYXlvdXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0R5bmFtaWNMYXlvdXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93RHluYW1pY0xheW91dCA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBWaXN1YWxpemF0aW9uUGFuZWwgYWxsb3dzIHRvIGhpZGUvc2hvdyBpbmRpdmlkdWFsIGlubmVyIHZpc3VhbGl6ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0hpZGVRdWVzdGlvbnMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0hpZGVRdWVzdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5vcHRpb25zLmFsbG93SGlkZVF1ZXN0aW9ucyA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBWaXN1YWxpemF0aW9uUGFuZWwgYWxsb3dzIHRvIG1ha2UgcHJpdmF0ZS9wdWJsaWMgaW5kaXZpZHVhbCBpbm5lciB2aXN1YWxpemVycyBmb3Igd29yayB3aXRoIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd01ha2VRdWVzdGlvbnNQcml2YXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dNYWtlUXVlc3Rpb25zUHJpdmF0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2xheW91dEVuZ2luZTogTGF5b3V0RW5naW5lO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF5b3V0IGVuZ2luZSBpbnN0YW5jZSBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxheW91dEVuZ2luZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRWxlbWVudHMocXVlc3Rpb25zOiBhbnlbXSk6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50W10ge1xuICAgIHJldHVybiAocXVlc3Rpb25zIHx8IFtdKS5tYXAoKHF1ZXN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5wcm9jZXNzVGV4dChxdWVzdGlvbi50aXRsZSksXG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgaXNQdWJsaWM6IHRydWUsXG4gICAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYW5lbCBlbGVtZW50cyBkZXNjcmlwdGlvbnMgYXJyYXkuXG4gICAqIElubmVyIHZpc3VhbGl6ZXJzIGFyZSByZW5kZXJlZCBpbiB0aGUgb3JkZXIgb2YgdGhpcyBhcnJheSBhbmQgd2l0aCB0aXRsZXMgZnJvbSB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHlcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50cygpOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2VsZW1lbnRzIHx8IFtdKS5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IGVsZW1lbnQuZGlzcGxheU5hbWUsXG4gICAgICAgIGlzVmlzaWJsZTogZWxlbWVudC5pc1Zpc2libGUsXG4gICAgICAgIGlzUHVibGljOiBlbGVtZW50LmlzUHVibGljLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFuZWwncyB2aXNpYmxlIGVsZW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiBlbC5pc1Zpc2libGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFuZWwncyBoaWRkZW4gZWxlbWVudHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGRlbkVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoXG4gICAgICAoZWw6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50KSA9PiAhZWwuaXNWaXNpYmxlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhbmVsJ3MgcHVibGljIGVsZW1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldCBwdWJsaWNFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudHMuZmlsdGVyKChlbDogSVZpc3VhbGl6ZXJQYW5lbEVsZW1lbnQpID0+IGVsLmlzUHVibGljKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhbmVsJ3MgcHJpdmF0ZSBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpdmF0ZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50cy5maWx0ZXIoKGVsOiBJVmlzdWFsaXplclBhbmVsRWxlbWVudCkgPT4gIWVsLmlzUHVibGljKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbG9jYWxlcygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnN1cnZleSkgcmV0dXJuIHRoaXMub3B0aW9ucy5zdXJ2ZXkuZ2V0VXNlZExvY2FsZXMoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYW5lbCBlbGVtZW50IGRlc2NyaXB0aW9uIGJ5IHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRzLmZpbHRlcigoZWwpID0+IGVsLm5hbWUgPT09IG5hbWUpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFuZWwgZWxlbWVudCB2aXN1YWxpemVyIGJ5IHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKi9cbiAgcHVibGljIGdldFZpc3VhbGl6ZXIodmlzdWFsaXplck5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnZpc3VhbGl6ZXJzLmZpbHRlcigodikgPT4gdi5xdWVzdGlvbi5uYW1lID09PSB2aXN1YWxpemVyTmFtZSlbMF07XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBlbGVtZW50IHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogb3B0aW9uczpcbiAgICogZWxlbWVudHMgLSBwYW5lbCBlbGVtZW50cyBhcnJheVxuICAgKiBjaGFuZ2VkIC0gY2hhbmdlZCBlbGVtZW50XG4gICAqIHJlYXNvbiAtIHJlYXNvbiAoc3RyaW5nKSB3aHkgZXZlbnQgZmlyZWQ6IFwiQURERURcIiwgXCJNT1ZFRFwiIG9yIFwiUkVNT1ZFRFwiXG4gICAqL1xuICBwdWJsaWMgb25WaXNpYmxlRWxlbWVudHNDaGFuZ2VkID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFZpc3VhbGl6YXRpb25QYW5lbCwgb3B0aW9uczogYW55KSA9PiBhbnksIFZpc3VhbGl6YXRpb25QYW5lbCxcbiAgICBhbnlcbiAgPigpO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlRWxlbWVudHNDaGFuZ2VkKFxuICAgIGVsZW1lbnQ6IElWaXN1YWxpemVyUGFuZWxFbGVtZW50LFxuICAgIHJlYXNvbjogc3RyaW5nXG4gICkge1xuICAgIGlmICghdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuaXNFbXB0eSkge1xuICAgICAgdGhpcy5vblZpc2libGVFbGVtZW50c0NoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLl9lbGVtZW50cyxcbiAgICAgICAgY2hhbmdlZDogZWxlbWVudCxcbiAgICAgICAgcmVhc29uOiByZWFzb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHRoaXMuc3RhdGUpO1xuICAgIHRoaXMubGF5b3V0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB2aXp1YWxpemF0aW9uIHBhbmVsIHN0YXRlIGNoYW5nZWQuXG4gICAqIHNlbmRlciAtIHRoaXMgcGFuZWxcbiAgICogc3RhdGUgLSBuZXcgc3RhdGUgb2YgdGhlIHBhbmVsXG4gICAqL1xuICBwdWJsaWMgb25TdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogVmlzdWFsaXphdGlvblBhbmVsLCBzdGF0ZTogSVN0YXRlKSA9PiBhbnksXG4gICAgVmlzdWFsaXphdGlvblBhbmVsLFxuICAgIGFueVxuICA+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gcGVybWlzc2lvbnMgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIG9uUGVybWlzc2lvbnNDaGFuZ2VkQ2FsbGJhY2s6IGFueTtcblxuICAvKipcbiAgICogUmVuZGVycyBnaXZlbiBwYW5lbCBlbGVtZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlclBhbmVsRWxlbWVudChcbiAgICBlbGVtZW50OiBJVmlzdWFsaXplclBhbmVsUmVuZGVyZWRFbGVtZW50LFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgKSB7XG4gICAgY29uc3QgdmlzdWFsaXplciA9IHRoaXMuZ2V0VmlzdWFsaXplcihlbGVtZW50Lm5hbWUpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChxdWVzdGlvbkVsZW1lbnQpO1xuXG4gICAgY29uc3QgcXVlc3Rpb25Db250ZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiaDNcIik7XG4gICAgY29uc3Qgdml6dWFsaXplckVsZW1lbnQgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgdGl0bGVFbGVtZW50LmlubmVyVGV4dCA9IGVsZW1lbnQuZGlzcGxheU5hbWU7XG5cbiAgICBxdWVzdGlvbkVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5hbGxvd0R5bmFtaWNMYXlvdXRcbiAgICAgID8gcXVlc3Rpb25FbGVtZW50Q2xhc3NOYW1lICsgXCIgXCIgKyBxdWVzdGlvbkxheW91dGVkRWxlbWVudENsYXNzTmFtZVxuICAgICAgOiBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWU7XG4gICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9IHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArIFwiX190aXRsZVwiO1xuICAgIGlmICh0aGlzLmFsbG93RHluYW1pY0xheW91dCkge1xuICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTmFtZSA9XG4gICAgICAgIHRpdGxlRWxlbWVudC5jbGFzc05hbWUgK1xuICAgICAgICBcIiBcIiArXG4gICAgICAgIHF1ZXN0aW9uRWxlbWVudENsYXNzTmFtZSArXG4gICAgICAgIFwiX190aXRsZS0tZHJhZ2dhYmxlXCI7XG4gICAgfVxuICAgIHF1ZXN0aW9uQ29udGVudC5jbGFzc05hbWUgPSBxdWVzdGlvbkVsZW1lbnRDbGFzc05hbWUgKyBcIl9fY29udGVudFwiO1xuICAgIHF1ZXN0aW9uQ29udGVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcblxuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuICAgIHF1ZXN0aW9uQ29udGVudC5hcHBlbmRDaGlsZCh2aXp1YWxpemVyRWxlbWVudCk7XG4gICAgcXVlc3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHF1ZXN0aW9uQ29udGVudCk7XG5cbiAgICB2aXN1YWxpemVyLnJlbmRlcih2aXp1YWxpemVyRWxlbWVudCk7XG5cbiAgICBlbGVtZW50LnJlbmRlcmVkRWxlbWVudCA9IHF1ZXN0aW9uRWxlbWVudDtcbiAgICByZXR1cm4gcXVlc3Rpb25FbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlclRvb2xiYXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgKz0gXCIgc2EtcGFuZWxfX2hlYWRlclwiO1xuICAgIHN1cGVyLnJlbmRlclRvb2xiYXIoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGFsbCBxdWVzdGlvbnMgaW50byBnaXZlbiBIVE1MIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKiBjb250YWluZXIgLSBIVE1MIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSBwYW5lbFxuICAgKi9cbiAgcHVibGljIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgKz0gXCIgc2EtcGFuZWxfX2NvbnRlbnQgc2EtZ3JpZFwiO1xuXG4gICAgdGhpcy52aXNpYmxlRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IHF1ZXN0aW9uRWxlbWVudCA9IHRoaXMucmVuZGVyUGFuZWxFbGVtZW50KGVsZW1lbnQsIGNvbnRhaW5lcik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxheW91dEVuZ2luZS5zdGFydChjb250YWluZXIpO1xuICAgIC8vICEhd2luZG93ICYmIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBVSUV2ZW50KFwicmVzaXplXCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB2aXN1YWxpemVyIGFuZCBhbGwgaW5uZXIgY29udGVudC5cbiAgICovXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5sYXlvdXRFbmdpbmUuc3RvcCgpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KGNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3cyB2aXN1YWxpemVyIHRvb2JhciBhbmQgYWxsIGlubmVyIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICBpZiAoISF0aGlzLnRvb2xiYXJDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgIHRoaXMucmVuZGVyVG9vbGJhcih0aGlzLnRvb2xiYXJDb250YWluZXIpO1xuICAgIH1cbiAgICBzdXBlci5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBsYXlvdXQgb2YgdmlzdWFsaXplciBpbm5lciBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIGxheW91dCgpIHtcbiAgICB0aGlzLmxheW91dEVuZ2luZS51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGZpbHRlciBieSBxdWVzdGlvbiBuYW1lIGFuZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXIocXVlc3Rpb25OYW1lOiBzdHJpbmcsIHNlbGVjdGVkVmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGF0YVByb3ZpZGVyLnNldEZpbHRlcihxdWVzdGlvbk5hbWUsIHNlbGVjdGVkVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdml6dWFsaXphdGlvbiBwYW5lbCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogSVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgIGVsZW1lbnRzOiBbXS5jb25jYXQodGhpcy5fZWxlbWVudHMubWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy5nZXRWaXN1YWxpemVyKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRTdGF0ZSA9IHsgLi4uZWxlbWVudCwgLi4udmlzdWFsaXplcj8uZ2V0U3RhdGUoKSB9O1xuICAgICAgICBpZiAoZWxlbWVudFN0YXRlLnJlbmRlcmVkRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnRTdGF0ZS5yZW5kZXJlZEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRTdGF0ZTtcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHZpenVhbGl6YXRpb24gcGFuZWwgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgc2V0IHN0YXRlKG5ld1N0YXRlOiBJU3RhdGUpIHtcbiAgICBpZiAoIW5ld1N0YXRlKSByZXR1cm47XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdTdGF0ZS5lbGVtZW50cykpIHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uTmFtZXMgPSB0aGlzLnF1ZXN0aW9ucy5tYXAocSA9PiBxLm5hbWUpO1xuICAgICAgdGhpcy5fZWxlbWVudHMgPSBbXS5jb25jYXQobmV3U3RhdGUuZWxlbWVudHMuZmlsdGVyKGUgPT4gKHF1ZXN0aW9uTmFtZXMuaW5kZXhPZihlLm5hbWUpICE9PSAtMSkpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld1N0YXRlLmxvY2FsZSAhPT0gXCJ1bmRlZmluZWRcIikgdGhpcy5zZXRMb2NhbGUobmV3U3RhdGUubG9jYWxlKTtcblxuICAgIHRoaXMuX2VsZW1lbnRzLmZvckVhY2goZWxlbWVudFN0YXRlID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbGl6ZXIgPSB0aGlzLmdldFZpc3VhbGl6ZXIoZWxlbWVudFN0YXRlLm5hbWUpO1xuICAgICAgaWYgKHZpc3VhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aXN1YWxpemVyLnNldFN0YXRlKGVsZW1lbnRTdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHZpenVhbGl6YXRpb24gcGFuZWwgcGVybWlzc2lvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBlcm1pc3Npb25zKCk6IElQZXJtaXNzaW9uW10ge1xuICAgIHJldHVybiA8YW55PnRoaXMuX2VsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLFxuICAgICAgICBpc1B1YmxpYzogZWxlbWVudC5pc1B1YmxpYyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdml6dWFsaXphdGlvbiBwYW5lbCBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGVybWlzc2lvbnMocGVybWlzc2lvbnM6IElQZXJtaXNzaW9uW10pIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudHMgPSB0aGlzLl9lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgaWYgKHBlcm1pc3Npb24ubmFtZSA9PT0gZWxlbWVudC5uYW1lKVxuICAgICAgICAgIGVsZW1lbnQuaXNQdWJsaWMgPSBwZXJtaXNzaW9uLmlzUHVibGljO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IC4uLmVsZW1lbnQgfTtcbiAgICB9KTtcbiAgICB0aGlzLl9lbGVtZW50cyA9IFtdLmNvbmNhdCh1cGRhdGVkRWxlbWVudHMpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMub25QZXJtaXNzaW9uc0NoYW5nZWRDYWxsYmFjayAmJlxuICAgICAgdGhpcy5vblBlcm1pc3Npb25zQ2hhbmdlZENhbGxiYWNrKHRoaXMpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95VmlzdWFsaXplcnMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmlzdWFsaXplckJhc2UgfSBmcm9tIFwiLi92aXN1YWxpemVyQmFzZVwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgVmlzdWFsaXphdGlvblBhbmVsIH0gZnJvbSBcIi4vdmlzdWFsaXphdGlvblBhbmVsXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCwgSVF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemF0aW9uUGFuZWxEeW5hbWljIGV4dGVuZHMgVmlzdWFsaXplckJhc2Uge1xuICBwcm90ZWN0ZWQgX3BhbmVsVmlzdWFsaXplcjogVmlzdWFsaXphdGlvblBhbmVsID0gdW5kZWZpbmVkO1xuICBjb25zdHJ1Y3RvcihcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwicGFuZWxEeW5hbWljXCIpO1xuICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgb3B0aW9ucy5hbGxvd0R5bmFtaWNMYXlvdXQgPSBmYWxzZTtcbiAgICBvcHRpb25zLmRhdGFQcm92aWRlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIgPSBuZXcgVmlzdWFsaXphdGlvblBhbmVsKFxuICAgICAgdGhpcy5nZXRRdWVzdGlvbnMoKSxcbiAgICAgIFtdLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIuYWRkKHRoaXMub25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2spO1xuICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRMb2NhbGUobmV3TG9jYWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRMb2NhbGUobmV3TG9jYWxlKTtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIubG9jYWxlID0gbmV3TG9jYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkFmdGVyUmVuZGVyUGFuZWxDYWxsYmFjayA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyKHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBcInBhbmVsRHluYW1pY1wiO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYW5lbFZpc3VhbGl6ZXJEYXRhKCkge1xuICAgIGxldCBwYW5lbERhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgoZGF0YUl0ZW0pID0+IHtcbiAgICAgIGlmIChkYXRhSXRlbVt0aGlzLnF1ZXN0aW9uLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFuZWxEYXRhID0gcGFuZWxEYXRhLmNvbmNhdChkYXRhSXRlbVt0aGlzLnF1ZXN0aW9uLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIudXBkYXRlRGF0YShwYW5lbERhdGEpO1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+KSB7XG4gICAgc3VwZXIudXBkYXRlRGF0YShkYXRhKTtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsVmlzdWFsaXplckRhdGEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlUGFuZWxWaXN1YWxpemVyRGF0YSgpO1xuICAgIHN1cGVyLm9uRGF0YUNoYW5nZWQoKTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucygpOiBJUXVlc3Rpb25bXSB7XG4gICAgY29uc3QgcGFuZWxkeW5hbWljOiBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsID0gPGFueT50aGlzLnF1ZXN0aW9uO1xuICAgIHJldHVybiBwYW5lbGR5bmFtaWMudGVtcGxhdGUucXVlc3Rpb25zO1xuICB9XG5cbiAgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3BhbmVsVmlzdWFsaXplci5jbGVhcigpO1xuICAgIHN1cGVyLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gIH1cblxuICByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9wYW5lbFZpc3VhbGl6ZXIucmVuZGVyKGNvbnRhaW5lcik7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fcGFuZWxWaXN1YWxpemVyLm9uQWZ0ZXJSZW5kZXIucmVtb3ZlKHRoaXMub25BZnRlclJlbmRlclBhbmVsQ2FsbGJhY2spO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcbiAgXCJwYW5lbGR5bmFtaWNcIixcbiAgVmlzdWFsaXphdGlvblBhbmVsRHluYW1pY1xuKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCwgc2V0dGluZ3MgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IElEYXRhSW5mbywgRGF0YVByb3ZpZGVyIH0gZnJvbSBcIi4vZGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyRmFjdG9yeSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJGYWN0b3J5XCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9sb2NhbGl6YXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG52YXIgc3R5bGVzID0gcmVxdWlyZShcIi4vdmlzdWFsaXplckJhc2Uuc2Nzc1wiKTtcblxuLyoqXG4gKiBWaXN1YWxpemVyQmFzZSBpcyBhIGJhc2Ugb2JqZWN0IGZvciBhbGwgdmlzdXpsaXplcnMuIEl0IHJlc3BvbnNpYmxlIGZvciB0aGUgcmVuZGVyaW5nIGFuZCBkZXN0cm95aW5nIHZpc3VhbGl6ZXIuXG4gKlxuICogY29uc3RydWN0b3IgcGFyYW1ldGVyczpcbiAqIHF1ZXN0aW9uIC0gYSBzdXJ2ZXkgcXVlc3Rpb24gdG8gdmlzdWFsaXplLFxuICogZGF0YSAtIGFuIGFycmF5IG9mIGFuc3dlcnMgaW4gZm9ybWF0IG9mIHN1cnZleSByZXN1bHQsXG4gKiBvcHRpb25zIC0gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zLFxuICogbmFtZSAtIHZpc3VhbGl6ZXIgbmFtZVxuICpcbiAqIG9wdGlvbnM6XG4gKiBzZXJpZXNWYWx1ZXMgLSBhbiBhcnJheSBvZiBzZXJpZXMgdmFsdWVzIGluIGRhdGEgdG8gZ3JvdXAgZGF0YSBieSBzZXJpZXMsXG4gKiBzZXJpZXNMYWJlbHMgLSBsYWJlbHMgZm9yIHNlcmllcyB0byBkaXNwbGF5LCBpZiBub3QgcGFzc2VkIHRoZSBzZXJpZXNWYWx1ZXMgYXJlIHVzZWQgYXMgbGFiZWxzLFxuICogc3VydmV5IC0gcGFzcyBzdXJ2ZXkgaW5zdGFuY2UgdG8gdXNlIGxvY2Fsc2VzIGZyb20gdGhlIHN1cnZleSBKU09OLFxuICogZGF0YVByb3ZpZGVyIC0gZGF0YVByb3ZpZGVyIGZvciB0aGlzIHZpc3VhbGl6ZXIsXG4gKlxuICovXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckJhc2UgaW1wbGVtZW50cyBJRGF0YUluZm8ge1xuICBwcml2YXRlIF9zaG93SGVhZGVyID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZm9vdGVyVmlzdWFsaXplcjogVmlzdWFsaXplckJhc2UgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2RhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbGFiZWxUcnVuY2F0ZUxlbmd0aDogbnVtYmVyID0gMjc7XG4gIHByb3RlY3RlZCByZW5kZXJSZXN1bHQ6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdG9vbGJhckNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBoZWFkZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgY29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBmb290ZXJDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3N1cHBvcnRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gcHVibGljIHN0YXRpYyBvdGhlckNvbW1lbnRRdWVzdGlvblR5cGUgPSBcImNvbW1lbnRcIjsgLy8gVE9ETzogbWFrZSBpdCBjb25maWd1cmVhYmxlIC0gYWxsb3cgY2hvb3NlIHdoYXQga2luZCBvZiBxdWVzdGlvbi92aXN1YWxpemVyIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMvb3RoZXJzXG4gIHB1YmxpYyBzdGF0aWMgb3RoZXJDb21tZW50Q29sbGFwc2VkID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgdmlzdWFsaXplcidzIGNvbnRlbnQgaXMgcmVuZGVyZWQgaW4gRE9NLlxuICAgKiovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyOiBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogVmlzdWFsaXplckJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBWaXN1YWxpemVyQmFzZSwgYW55PigpO1xuXG4gIHByb3RlY3RlZCBhZnRlclJlbmRlcihjb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMub25BZnRlclJlbmRlci5maXJlKHRoaXMsIHsgaHRtbEVsZW1lbnQ6IGNvbnRlbnRDb250YWluZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB2aXN1YWxpemVyIGxvY2FsZSBjaGFuZ2VkLlxuICAgKiBzZW5kZXIgLSB0aGlzIHZpc3VhbGl6ZXJcbiAgICogbG9jYWxlIC0gbmV3IGxvY2FsZSBvZiB0aGUgdmlzdWFsaXplclxuICAgKi9cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBWaXN1YWxpemVyQmFzZSwgb3B0aW9uczogeyBsb2NhbGU6IHN0cmluZyB9KSA9PiBhbnksXG4gICAgVmlzdWFsaXplckJhc2UsXG4gICAgYW55XG4gID4oKTtcblxuICBwcm90ZWN0ZWQgdG9vbGJhckl0ZW1DcmVhdG9yczogeyBbbmFtZTogc3RyaW5nXTogKHRvb2xiYXI/OiBIVE1MRGl2RWxlbWVudCkgPT4gSFRNTEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9PixcbiAgICBwdWJsaWMgb3B0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBvcHRpb25zLmRhdGFQcm92aWRlciB8fCBuZXcgRGF0YVByb3ZpZGVyKGRhdGEpO1xuICAgIHRoaXMuX2RhdGFQcm92aWRlci5vbkRhdGFDaGFuZ2VkLmFkZCgoKSA9PiB0aGlzLm9uRGF0YUNoYW5nZWQoKSk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubGFiZWxUcnVuY2F0ZUxlbmd0aCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5sYWJlbFRydW5jYXRlTGVuZ3RoID0gb3B0aW9ucy5sYWJlbFRydW5jYXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlbiBkYXRhIGhhcyBiZWVuIGNoYW5nZWQgZm9yIHNvbWUgcmVhc29uLCBlLmcuIGZpbHRlciB3YXMgc2V0LlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGVuIGlmIGRlc2NlbmRhbnQgY29tcHV0ZXMgb3duIHN0YXRpc3RpY3Mgb3IgcHJvY2VzcyBkYXRhIHNvbWVob3cuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25EYXRhQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhIGZpZWxkIG9mIGRhdGEgb2JqZWN0IGZyb20gdGhlIGRhdGEgYXJyYXkuXG4gICAqL1xuICBnZXQgZGF0YU5hbWUoKTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWVOYW1lIHx8IHRoaXMucXVlc3Rpb24ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB2aXN1YWxpemVyIGhhcyBoZWFkZXIuIFVzdWFsbHkgaXQgaXMgdHJ1ZSB0aGVuIGEgcXVlc3Rpb24gaGFzIGNvcnJlY3QgYW5zd2VyLlxuICAgKi9cbiAgZ2V0IGhhc0hlYWRlcigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCAhdGhpcy5vcHRpb25zLnNob3dDb3JyZWN0QW5zd2Vycykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uICYmICEhdGhpcy5xdWVzdGlvbi5jb3JyZWN0QW5zd2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHZpc3VhbGl6ZXIgaGFzIGZvb3Rlci4gVXN1YWxseSBpdCBpcyB0cnVlIHRoZW4gYSBxdWVzdGlvbiBoYXMgY29tbWVudCBvciBjaG9pY2VzIHF1ZXN0aW9uIGhhcyBvdGhlciBpdGVtLlxuICAgKi9cbiAgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnF1ZXN0aW9uICYmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQgfHwgdGhpcy5xdWVzdGlvbi5oYXNPdGhlcilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVZpc3VhbGl6ZXI8VCA9IFZpc3VhbGl6ZXJCYXNlPihxdWVzdGlvbjogUXVlc3Rpb24pOiBUIHtcbiAgICBsZXQgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuZGF0YVByb3ZpZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMuZGF0YVByb3ZpZGVyID0gdGhpcy5kYXRhUHJvdmlkZXI7XG4gICAgfVxuICAgIHJldHVybiBWaXN1YWxpemVyRmFjdG9yeS5jcmVhdGVWaXN1YWxpemVyKHF1ZXN0aW9uLCB0aGlzLmRhdGEsIG9wdGlvbnMpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogRm9vdGVyIHZpc3VhbGl6ZXIgZ2V0dGVyLlxuICAgKi9cbiAgZ2V0IGZvb3RlclZpc3VhbGl6ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0Zvb3Rlcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5uYW1lICsgKHNldHRpbmdzIHx8IHt9KS5jb21tZW50UHJlZml4XG4gICAgICApO1xuICAgICAgcXVlc3Rpb24udGl0bGUgPSB0aGlzLnByb2Nlc3NUZXh0KHRoaXMucXVlc3Rpb24udGl0bGUpO1xuXG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyID0gdGhpcy5jcmVhdGVWaXN1YWxpemVyKHF1ZXN0aW9uKTtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSAoKSA9PiB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb290ZXJWaXN1YWxpemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHZpc3VhbGl6ZXIgc3VwcG9ydHMgc2VsZWN0aW9uLiBWaXN1YWxpemVycyBvZiBxdWVzdGlvbnMgd2l0aCBjaG9pY2VzIGFsbG93IHRvIHNlbGVjdCBjaG9pY2UgYnkgY2xpY2tpbmcgb24gdGhlIGRpYWdyYW0gYmFyIGFuZCBmaWx0ZXIgb3RoZXIgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1cHBvcnRTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLm9wdGlvbnMuYWxsb3dTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dTZWxlY3Rpb24pICYmXG4gICAgICB0aGlzLl9zdXBwb3J0U2VsZWN0aW9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpZXMgdmFsdWVzIGdldHRlci4gU29tZSBxdWVzdGlvbnMgKHVzZWQgaW4gbWF0cmljZXMpIHNob3VsZCBiZSBncm91cGVkIGJ5IG1hdHJpeCByb3dzLiBUaGlzIGdyb3VwcyBhcmUgY2FsbGVkIHNlcmllcy5cbiAgICovXG4gIGdldFNlcmllc1ZhbHVlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNlcmllc1ZhbHVlcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpZXMgbGFiZWxzIGdldHRlci4gU29tZSBxdWVzdGlvbnMgKHVzZWQgaW4gbWF0cmljZXMpIHNob3VsZCBiZSBncm91cGVkIGJ5IG1hdHJpeCByb3dzLiBUaGlzIGdyb3VwcyBhcmUgY2FsbGVkIHNlcmllcy5cbiAgICovXG4gIGdldFNlcmllc0xhYmVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNlcmllc0xhYmVscyB8fCB0aGlzLmdldFNlcmllc1ZhbHVlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YWlsYWJsZSB2YWx1ZXMgb2YgcXVlc3Rpb24gYW5zd2VycyAoYXZhaWxhYmxlIGNob2ljZXMpLlxuICAgKi9cbiAgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YWlsYWJsZSBsYWJlbHMgb2YgcXVlc3Rpb24gYW5zd2VycyAoaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYXZhaWxhYmxlIGNob2ljZXMpLlxuICAgKi9cbiAgZ2V0TGFiZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjcmVhdG9yIG9mIHZpc3VhbGl6ZXIgdG9vbGJhciBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVG9vbGJhckl0ZW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6ICh0b29sYmFyPzogSFRNTERpdkVsZW1lbnQpID0+IEhUTUxFbGVtZW50XG4gICkge1xuICAgIHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1tuYW1lXSA9IGNyZWF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHZpc2F1bGl6ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWUgfHwgXCJ2aXN1YWxpemVyXCI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdHVhbCBkYXRhIG9mIHRoZSB2aXNhdWxpemVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5maWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRhdGEgcHJvdmlkZXIgaXMgdXNlZCBieSB0aGUgdmlzYXVsaXplci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGF0YVByb3ZpZGVyKCk6IERhdGFQcm92aWRlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHZpc3VhbGl6ZXIgZGF0YS5cbiAgICovXG4gIHVwZGF0ZURhdGEoZGF0YTogQXJyYXk8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pikge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmRhdGFQcm92aWRlcikge1xuICAgICAgdGhpcy5kYXRhUHJvdmlkZXIuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Zvb3Rlcikge1xuICAgICAgdGhpcy5mb290ZXJWaXN1YWxpemVyLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgb25VcGRhdGU6ICgpID0+IHZvaWQ7XG5cbiAgaW52b2tlT25VcGRhdGUoKSB7XG4gICAgdGhpcy5vblVwZGF0ZSAmJiB0aGlzLm9uVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdmlzdWFsaXplci5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKCEhdGhpcy5yZW5kZXJSZXN1bHQpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHRoaXMudG9vbGJhckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZm9vdGVyQ29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5yZW5kZXJSZXN1bHQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMucmVuZGVyUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLl9mb290ZXJWaXN1YWxpemVyKSB7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2Zvb3RlclZpc3VhbGl6ZXIub25VcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mb290ZXJWaXN1YWxpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgZm9yIGNsZWFyaW5nIGFsbCByZW5kZXJlZCBlbGVtZW50cyBmcm9tIG91dHNpZGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgaWYgKCEhdGhpcy50b29sYmFyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmICghIXRoaXMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Q29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmZvb3RlckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kZXN0cm95Rm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVG9vbGJhckl0ZW1zKHRvb2xiYXI6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgT2JqZWN0LmtleXModGhpcy50b29sYmFySXRlbUNyZWF0b3JzIHx8IHt9KS5mb3JFYWNoKCh0b29sYmFySXRlbU5hbWUpID0+IHtcbiAgICAgIGxldCB0b29sYmFySXRlbSA9IHRoaXMudG9vbGJhckl0ZW1DcmVhdG9yc1t0b29sYmFySXRlbU5hbWVdKHRvb2xiYXIpO1xuICAgICAgaWYgKCEhdG9vbGJhckl0ZW0pIHtcbiAgICAgICAgdG9vbGJhci5hcHBlbmRDaGlsZCh0b29sYmFySXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdEFuc3dlclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi5jb3JyZWN0QW5zd2VyIDogXCJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB2aXN1YWxpemVyIHRvb2xiYXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVzdHJveVRvb2xiYXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnNzIHZpc3VhbGl6ZXIgdG9vbGJhci5cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJUb29sYmFyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5zaG93SGVhZGVyKSB7XG4gICAgICBjb25zdCB0b29sYmFyID0gPEhUTUxEaXZFbGVtZW50PihcbiAgICAgICAgRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCBcInNhLXRvb2xiYXJcIilcbiAgICAgICk7XG4gICAgICB0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtcyh0b29sYmFyKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b29sYmFyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdmlzdWFsaXplciBoZWFkZXIuXG4gICAqIFVzdWFsbHkgb3ZlcnJpZGVuIGluIGRlc2NlbmRhbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlc3Ryb3lIZWFkZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLmRlc3Ryb3lIZWFkZXIoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHZpc3VhbGl6ZXIgY29udGVudC5cbiAgICogVXN1YWxseSBvdmVycmlkZW4gaW4gZGVzY2VuZGFudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVzdHJveUNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmRlc3Ryb3lDb250ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0cm95Q29udGVudChjb250YWluZXIsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB2aXN1YWxpemVyIGhlYWRlci5cbiAgICogVXN1YWxseSBvdmVycmlkZW4gaW4gZGVzY2VuZGFudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVySGVhZGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5yZW5kZXJIZWFkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckhlYWRlcihjb250YWluZXIsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb3JyZWN0QW5zd2VyRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIFwic2EtdmlzdWFsaXplcl9fY29ycmVjdC1hbnN3ZXJcIlxuICAgICAgKTtcbiAgICAgIGNvcnJlY3RBbnN3ZXJFbGVtZW50LmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb3JyZWN0QW5zd2VyXCIpICsgdGhpcy5nZXRDb3JyZWN0QW5zd2VyVGV4dCgpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvcnJlY3RBbnN3ZXJFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB2aXN1YWxpemVyIGNvbnRlbnQuXG4gICAqIFVzdWFsbHkgb3ZlcnJpZGVuIGluIGRlc2NlbmRhbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIXRoaXMub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckNvbnRlbnQoY29udGFpbmVyLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub1Zpc3VhbGl6ZXJGb3JRdWVzdGlvblwiKTtcbiAgICB9XG4gICAgdGhpcy5hZnRlclJlbmRlcihjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHZpc3VhbGl6ZXIgZm9vdGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlc3Ryb3lGb290ZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdmlzdWFsaXplciBmb290ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyRm9vdGVyKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBpZiAodGhpcy5oYXNGb290ZXIpIHtcbiAgICAgIGNvbnN0IGZvb3RlclRpdGxlRWxlbWVudCA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiaDRcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19mb290ZXItdGl0bGVcIixcbiAgICAgICAgeyBpbm5lclRleHQ6IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckNvbW1lbnRUaXRsZVwiKSB9XG4gICAgICApO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZvb3RlclRpdGxlRWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGZvb3RlckNvbnRlbnRFbGVtZW50ID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgXCJzYS12aXN1YWxpemVyX19mb290ZXItY29udGVudFwiXG4gICAgICApO1xuICAgICAgZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFZpc3VhbGl6ZXJCYXNlLm90aGVyQ29tbWVudENvbGxhcHNlZFxuICAgICAgICA/IFwibm9uZVwiXG4gICAgICAgIDogXCJibG9ja1wiO1xuXG4gICAgICBjb25zdCB2aXNpYmlsaXR5QnV0dG9uID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlQnV0dG9uKCgpID0+IHtcbiAgICAgICAgaWYgKGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgZm9vdGVyQ29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICB2aXNpYmlsaXR5QnV0dG9uLmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJoaWRlQnV0dG9uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvb3RlckNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICB2aXNpYmlsaXR5QnV0dG9uLmlubmVyVGV4dCA9IGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXG4gICAgICAgICAgICBWaXN1YWxpemVyQmFzZS5vdGhlckNvbW1lbnRDb2xsYXBzZWQgPyBcInNob3dCdXR0b25cIiA6IFwiaGlkZUJ1dHRvblwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvb3RlclZpc3VhbGl6ZXIuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0sIGxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzaG93QnV0dG9uXCIpIC8qLCBcInNhLXRvb2xiYXJfX2J1dHRvbi0tcmlnaHRcIiovKTtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh2aXNpYmlsaXR5QnV0dG9uKTtcblxuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZvb3RlckNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgdGhpcy5mb290ZXJWaXN1YWxpemVyLnJlbmRlcihmb290ZXJDb250ZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdmlzdWFsaXplciBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLlxuICAgKi9cbiAgcmVuZGVyKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0YXJnZXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0RWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyUmVzdWx0ID0gdGFyZ2V0RWxlbWVudDtcblxuICAgIHRoaXMudG9vbGJhckNvbnRhaW5lciA9IERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImRpdlwiLFxuICAgICAgXCJzYS12aXN1YWxpemVyX190b29sYmFyXCJcbiAgICApO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICB0aGlzLnJlbmRlclRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcblxuICAgIGlmICh0aGlzLmhhc0hlYWRlcikge1xuICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICBcInNhLXZpc3VhbGl6ZXJfX2hlYWRlclwiXG4gICAgICApO1xuICAgICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICB0aGlzLnJlbmRlckhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50Q29udGFpbmVyID0gRG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcbiAgICAgIFwiZGl2XCIsXG4gICAgICBcInNhLXZpc3VhbGl6ZXJfX2NvbnRlbnRcIlxuICAgICk7XG4gICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuXG4gICAgdGhpcy5mb290ZXJDb250YWluZXIgPSBEb2N1bWVudEhlbHBlci5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJkaXZcIixcbiAgICAgIFwic2EtdmlzdWFsaXplcl9fZm9vdGVyXCJcbiAgICApO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgIHRoaXMucmVuZGVyRm9vdGVyKHRoaXMuZm9vdGVyQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXdzIHZpc3VhbGl6ZXIgYW5kIGFsbCBpbm5lciBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKCEhdGhpcy5oZWFkZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lIZWFkZXIodGhpcy5oZWFkZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckhlYWRlcih0aGlzLmhlYWRlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb250ZW50KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCh0aGlzLmNvbnRlbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLmludm9rZU9uVXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5mb290ZXJDb250YWluZXIpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lGb290ZXIodGhpcy5mb290ZXJDb250YWluZXIpO1xuICAgICAgICB0aGlzLnJlbmRlckZvb3Rlcih0aGlzLmZvb3RlckNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaW52b2tlT25VcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaXBIdG1sRnJvbVRpdGxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGxldCBvcmlnaW5hbFRleHQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgICBsZXQgcHJvY2Vzc2VkVGV4dCA9IG9yaWdpbmFsVGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgXCJcIik7XG4gICAgICByZXR1cm4gcHJvY2Vzc2VkVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBnZXRSYW5kb21Db2xvcigpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldENvbG9ycygpO1xuICAgIHJldHVybiBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yID0gXCIjZjdmN2Y3XCI7XG5cbiAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuZ2V0QmFja2dyb3VuZENvbG9yQ29yZSgpOyB9XG4gIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsdWUpIHsgdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKHZhbHVlKTsgfVxuXG4gIHByb3RlY3RlZCBnZXRCYWNrZ3JvdW5kQ29sb3JDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEJhY2tncm91bmRDb2xvckNvcmUoY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgIGlmICh0aGlzLmZvb3RlclZpc3VhbGl6ZXIpIHRoaXMuZm9vdGVyVmlzdWFsaXplci5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgfVxuXG4gIHN0YXRpYyBjdXN0b21Db2xvcnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgc3RhdGljIGNvbG9ycyA9IFtcbiAgICBcIiM4NmUxZmJcIixcbiAgICBcIiMzOTk5ZmJcIixcbiAgICBcIiNmZjY3NzFcIixcbiAgICBcIiMxZWI0OTZcIixcbiAgICBcIiNmZmMxNTJcIixcbiAgICBcIiNhYmExZmZcIixcbiAgICBcIiM3ZDhkYTVcIixcbiAgICBcIiM0ZWM0NmNcIixcbiAgICBcIiNjZjM3YTZcIixcbiAgICBcIiM0ZTYxOThcIixcbiAgXTtcblxuICBnZXRDb2xvcnMoY291bnQgPSAxMCkge1xuICAgIGNvbnN0IGNvbG9ycyA9XG4gICAgICBBcnJheS5pc0FycmF5KFZpc3VhbGl6ZXJCYXNlLmN1c3RvbUNvbG9ycykgJiZcbiAgICAgICAgVmlzdWFsaXplckJhc2UuY3VzdG9tQ29sb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBWaXN1YWxpemVyQmFzZS5jdXN0b21Db2xvcnNcbiAgICAgICAgOiBWaXN1YWxpemVyQmFzZS5jb2xvcnM7XG5cbiAgICBsZXQgbWFueUNvbG9yczogYW55ID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIG1hbnlDb2xvcnMgPSBtYW55Q29sb3JzLmNvbmNhdChjb2xvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBtYW55Q29sb3JzO1xuICB9XG5cbiAgZ2V0IHNob3dIZWFkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dIZWFkZXI7XG4gIH1cbiAgc2V0IHNob3dIZWFkZXIobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAobmV3VmFsdWUgIT0gdGhpcy5fc2hvd0hlYWRlcikge1xuICAgICAgdGhpcy5fc2hvd0hlYWRlciA9IG5ld1ZhbHVlO1xuICAgICAgaWYgKCEhdGhpcy50b29sYmFyQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVRvb2xiYXIodGhpcy50b29sYmFyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXJUb29sYmFyKHRoaXMudG9vbGJhckNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGF0YSB0byBiZSB1c2VkIGluIHRoZSB2aXN1YWxpemVyLlxuICAgKi9cbiAgZ2V0RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlKCk6IGFueSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHB1YmxpYyBzZXRTdGF0ZShzdGF0ZTogYW55KTogdm9pZCB7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGxvY2FsZSBvZiB0aGUgdmlzdWFsaXplci5cbiAgICogSWYgbG9jYWxlcyBtb3JlIHRoYW4gb25lLCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0aW9uIGRyb3Bkb3duIHdpbGwgYmUgYWRkZWQgaW4gdGhlIHRvb2xiYXJcbiAgICogSW4gb3JkZXIgdG8gdXNlIHN1cnZleSBsb2NhbGVzIHRoZSBzdXJ2ZXkgaW5zdGFuY2Ugb2JqZWN0IHNob3VsZCBiZSBwYXNzZWQgYXMgJ3N1cnZleScgb3B0aW9uIGZvciB2aXN1YWxpemVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5vcHRpb25zLnN1cnZleTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXkubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBsb2NhbGUgZm9yIHZpc3VhbGl6YXRpb24gcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgc2V0IGxvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxlKG5ld0xvY2FsZSk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IGxvY2FsZTogbmV3TG9jYWxlIH0pO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldExvY2FsZShuZXdMb2NhbGU6IHN0cmluZykge1xuICAgIGxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gbmV3TG9jYWxlO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLm9wdGlvbnMuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSAmJiBzdXJ2ZXkubG9jYWxlICE9PSBuZXdMb2NhbGUpIHtcbiAgICAgIHN1cnZleS5sb2NhbGUgPSBuZXdMb2NhbGU7XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyQmFzZSB9IGZyb20gXCIuL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuL3Zpc3VhbGl6YXRpb25NYW5hZ2VyXCI7XG5cbi8qKlxuICogVmlzdWFsaXplcnMgZmFjdG9yeS4gQ3JlYXRlcyB2aXN1YWxpemVyIGZvciB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgdmlzdWFsaXplciBieSBxdWVzdGlvbi4gWW91IGNhbiBwYXNzIGRhdGEgYW5kIG9wdGlvbnMgdG8gdGhlIGNyZWF0ZWQgdmlzdWFsaXplciBhcyB3ZWxsLlxuICAgKiBJZiBtb3JlIHRoZW4gb25lIHZpc3VhbGl6ZXIgYXJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBxdWVzdGlvbiwgdGhlbiB0aGV5IGFyZSBjb21iaW5lZCB1c2luZyB3cmFwcGVyIGZvciBzaG93aW5nIGFsdGVybmF0aXZlIHZpYXVhbGl6ZXJzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVWaXN1YWxpemVyKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBBcnJheTx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+LFxuICAgIG9wdGlvbnM/OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH1cbiAgKTogVmlzdWFsaXplckJhc2Uge1xuICAgIGxldCB0eXBlO1xuXG4gICAgaWYgKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJ0ZXh0XCIgJiYgKDxhbnk+cXVlc3Rpb24pLmlucHV0VHlwZSkge1xuICAgICAgdHlwZSA9ICg8YW55PnF1ZXN0aW9uKS5pbnB1dFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0b3JzID0gVmlzdWFsaXphdGlvbk1hbmFnZXIuZ2V0VmlzdWFsaXplcnNCeVR5cGUodHlwZSk7XG4gICAgdmFyIHZpc3VhbGl6ZXJzID0gY3JlYXRvcnMubWFwKFxuICAgICAgKGNyZWF0b3IpID0+IG5ldyBjcmVhdG9yKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zKVxuICAgICk7XG4gICAgaWYgKHZpc3VhbGl6ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXJDb25zdHJ1Y3RvciA9IFZpc3VhbGl6YXRpb25NYW5hZ2VyLmdldEFsdGVybmF0aXZlc1Zpc3VhbGl6ZXIoKTtcbiAgICAgIGxldCB2aXN1YWxpemVyID0gbmV3IGFsdGVybmF0aXZlc1Zpc3VhbGl6ZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgdmlzdWFsaXplcnMsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBkYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZpc3VhbGl6ZXI7XG4gICAgfVxuICAgIHJldHVybiB2aXN1YWxpemVyc1swXTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiZGVcIixcbiAgXCJlblwiLFxuICBcInZhblwiLFxuICBcImlrXCIsXG4gIFwidGVcIixcbiAgXCJkYXRcIixcbiAgXCJkaWVcIixcbiAgXCJpblwiLFxuICBcImVlblwiLFxuICBcImhpalwiLFxuICBcImhldFwiLFxuICBcIm5pZXRcIixcbiAgXCJ6aWpuXCIsXG4gIFwiaXNcIixcbiAgXCJ3YXNcIixcbiAgXCJvcFwiLFxuICBcImFhblwiLFxuICBcIm1ldFwiLFxuICBcImFsc1wiLFxuICBcInZvb3JcIixcbiAgXCJoYWRcIixcbiAgXCJlclwiLFxuICBcIm1hYXJcIixcbiAgXCJvbVwiLFxuICBcImhlbVwiLFxuICBcImRhblwiLFxuICBcInpvdVwiLFxuICBcIm9mXCIsXG4gIFwid2F0XCIsXG4gIFwibWlqblwiLFxuICBcIm1lblwiLFxuICBcImRpdFwiLFxuICBcInpvXCIsXG4gIFwiZG9vclwiLFxuICBcIm92ZXJcIixcbiAgXCJ6ZVwiLFxuICBcInppY2hcIixcbiAgXCJiaWpcIixcbiAgXCJvb2tcIixcbiAgXCJ0b3RcIixcbiAgXCJqZVwiLFxuICBcIm1palwiLFxuICBcInVpdFwiLFxuICBcImRlclwiLFxuICBcImRhYXJcIixcbiAgXCJoYWFyXCIsXG4gIFwibmFhclwiLFxuICBcImhlYlwiLFxuICBcImhvZVwiLFxuICBcImhlZWZ0XCIsXG4gIFwiaGViYmVuXCIsXG4gIFwiZGV6ZVwiLFxuICBcInVcIixcbiAgXCJ3YW50XCIsXG4gIFwibm9nXCIsXG4gIFwiemFsXCIsXG4gIFwibWVcIixcbiAgXCJ6aWpcIixcbiAgXCJudVwiLFxuICBcImdlXCIsXG4gIFwiZ2VlblwiLFxuICBcIm9tZGF0XCIsXG4gIFwiaWV0c1wiLFxuICBcIndvcmRlblwiLFxuICBcInRvY2hcIixcbiAgXCJhbFwiLFxuICBcIndhcmVuXCIsXG4gIFwidmVlbFwiLFxuICBcIm1lZXJcIixcbiAgXCJkb2VuXCIsXG4gIFwidG9lblwiLFxuICBcIm1vZXRcIixcbiAgXCJiZW5cIixcbiAgXCJ6b25kZXJcIixcbiAgXCJrYW5cIixcbiAgXCJodW5cIixcbiAgXCJkdXNcIixcbiAgXCJhbGxlc1wiLFxuICBcIm9uZGVyXCIsXG4gIFwiamFcIixcbiAgXCJlZW5zXCIsXG4gIFwiaGllclwiLFxuICBcIndpZVwiLFxuICBcIndlcmRcIixcbiAgXCJhbHRpamRcIixcbiAgXCJkb2NoXCIsXG4gIFwid29yZHRcIixcbiAgXCJ3ZXplblwiLFxuICBcImt1bm5lblwiLFxuICBcIm9uc1wiLFxuICBcInplbGZcIixcbiAgXCJ0ZWdlblwiLFxuICBcIm5hXCIsXG4gIFwicmVlZHNcIixcbiAgXCJ3aWxcIixcbiAgXCJrb25cIixcbiAgXCJuaWV0c1wiLFxuICBcInV3XCIsXG4gIFwiaWVtYW5kXCIsXG4gIFwiZ2V3ZWVzdFwiLFxuICBcImFuZGVyZVwiXG5dO1xuIiwiZXhwb3J0IHZhciBzdG9wV29yZHMgPSBbXG4gIFwiLi4uXCIsXG4gIFwiYVwiLFxuICBcImFib3V0XCIsXG4gIFwiYWJvdmVcIixcbiAgXCJhY3Jvc3NcIixcbiAgXCJhZnRlclwiLFxuICBcImFnYWluXCIsXG4gIFwiYWdhaW5zdFwiLFxuICBcImFsbFwiLFxuICBcImFsbW9zdFwiLFxuICBcImFsb25lXCIsXG4gIFwiYWxvbmdcIixcbiAgXCJhbHJlYWR5XCIsXG4gIFwiYWxzb1wiLFxuICBcImFsdGhvdWdoXCIsXG4gIFwiYWx3YXlzXCIsXG4gIFwiYW1vbmdcIixcbiAgXCJhblwiLFxuICBcImFuZFwiLFxuICBcImFub3RoZXJcIixcbiAgXCJhbnlcIixcbiAgXCJhbnlib2R5XCIsXG4gIFwiYW55b25lXCIsXG4gIFwiYW55dGhpbmdcIixcbiAgXCJhbnl3aGVyZVwiLFxuICBcImFyZVwiLFxuICBcImFyZWFcIixcbiAgXCJhcmVhc1wiLFxuICBcImFyb3VuZFwiLFxuICBcImFzXCIsXG4gIFwiYXNrXCIsXG4gIFwiYXNrZWRcIixcbiAgXCJhc2tpbmdcIixcbiAgXCJhc2tzXCIsXG4gIFwiYXRcIixcbiAgXCJhd2F5XCIsXG4gIFwiYlwiLFxuICBcImJhY2tcIixcbiAgXCJiYWNrZWRcIixcbiAgXCJiYWNraW5nXCIsXG4gIFwiYmFja3NcIixcbiAgXCJiZVwiLFxuICBcImJlY2FtZVwiLFxuICBcImJlY2F1c2VcIixcbiAgXCJiZWNvbWVcIixcbiAgXCJiZWNvbWVzXCIsXG4gIFwiYmVlblwiLFxuICBcImJlZm9yZVwiLFxuICBcImJlZ2FuXCIsXG4gIFwiYmVoaW5kXCIsXG4gIFwiYmVpbmdcIixcbiAgXCJiZWluZ3NcIixcbiAgXCJiZXN0XCIsXG4gIFwiYmV0dGVyXCIsXG4gIFwiYmV0d2VlblwiLFxuICBcImJpZ1wiLFxuICBcImJvdGhcIixcbiAgXCJidXRcIixcbiAgXCJieVwiLFxuICBcImNcIixcbiAgXCJjYW1lXCIsXG4gIFwiY2FuXCIsXG4gIFwiY2Fubm90XCIsXG4gIFwiY2FzZVwiLFxuICBcImNhc2VzXCIsXG4gIFwiY2VydGFpblwiLFxuICBcImNlcnRhaW5seVwiLFxuICBcImNsZWFyXCIsXG4gIFwiY2xlYXJseVwiLFxuICBcImNvbWVcIixcbiAgXCJjb3VsZFwiLFxuICBcImRcIixcbiAgXCJkaWRcIixcbiAgXCJkaWZmZXJcIixcbiAgXCJkaWZmZXJlbnRcIixcbiAgXCJkaWZmZXJlbnRseVwiLFxuICBcImRvXCIsXG4gIFwiZG9lc1wiLFxuICBcImRvbmVcIixcbiAgXCJkb3duXCIsXG4gIFwiZG93blwiLFxuICBcImRvd25lZFwiLFxuICBcImRvd25pbmdcIixcbiAgXCJkb3duc1wiLFxuICBcImR1cmluZ1wiLFxuICBcImVcIixcbiAgXCJlYWNoXCIsXG4gIFwiZWFybHlcIixcbiAgXCJlaXRoZXJcIixcbiAgXCJlbmRcIixcbiAgXCJlbmRlZFwiLFxuICBcImVuZGluZ1wiLFxuICBcImVuZHNcIixcbiAgXCJlbm91Z2hcIixcbiAgXCJldmVuXCIsXG4gIFwiZXZlbmx5XCIsXG4gIFwiZXZlclwiLFxuICBcImV2ZXJ5XCIsXG4gIFwiZXZlcnlib2R5XCIsXG4gIFwiZXZlcnlvbmVcIixcbiAgXCJldmVyeXRoaW5nXCIsXG4gIFwiZXZlcnl3aGVyZVwiLFxuICBcImZcIixcbiAgXCJmYWNlXCIsXG4gIFwiZmFjZXNcIixcbiAgXCJmYWN0XCIsXG4gIFwiZmFjdHNcIixcbiAgXCJmYXJcIixcbiAgXCJmZWx0XCIsXG4gIFwiZmV3XCIsXG4gIFwiZmluZFwiLFxuICBcImZpbmRzXCIsXG4gIFwiZmlyc3RcIixcbiAgXCJmb3JcIixcbiAgXCJmb3VyXCIsXG4gIFwiZnJvbVwiLFxuICBcImZ1bGxcIixcbiAgXCJmdWxseVwiLFxuICBcImZ1cnRoZXJcIixcbiAgXCJmdXJ0aGVyZWRcIixcbiAgXCJmdXJ0aGVyaW5nXCIsXG4gIFwiZnVydGhlcnNcIixcbiAgXCJnXCIsXG4gIFwiZ2F2ZVwiLFxuICBcImdlbmVyYWxcIixcbiAgXCJnZW5lcmFsbHlcIixcbiAgXCJnZXRcIixcbiAgXCJnZXRzXCIsXG4gIFwiZ2l2ZVwiLFxuICBcImdpdmVuXCIsXG4gIFwiZ2l2ZXNcIixcbiAgXCJnb1wiLFxuICBcImdvaW5nXCIsXG4gIFwiZ29vZFwiLFxuICBcImdvb2RzXCIsXG4gIFwiZ290XCIsXG4gIFwiZ3JlYXRcIixcbiAgXCJncmVhdGVyXCIsXG4gIFwiZ3JlYXRlc3RcIixcbiAgXCJncm91cFwiLFxuICBcImdyb3VwZWRcIixcbiAgXCJncm91cGluZ1wiLFxuICBcImdyb3Vwc1wiLFxuICBcImhcIixcbiAgXCJoYWRcIixcbiAgXCJoYXNcIixcbiAgXCJoYXZlXCIsXG4gIFwiaGF2aW5nXCIsXG4gIFwiaGVcIixcbiAgXCJoZXJcIixcbiAgXCJoZXJlXCIsXG4gIFwiaGVyc2VsZlwiLFxuICBcImhpZ2hcIixcbiAgXCJoaWdoXCIsXG4gIFwiaGlnaFwiLFxuICBcImhpZ2hlclwiLFxuICBcImhpZ2hlc3RcIixcbiAgXCJoaW1cIixcbiAgXCJoaW1zZWxmXCIsXG4gIFwiaGlzXCIsXG4gIFwiaG93XCIsXG4gIFwiaG93ZXZlclwiLFxuICBcImlcIixcbiAgXCJpZlwiLFxuICBcImltcG9ydGFudFwiLFxuICBcImluXCIsXG4gIFwiaW50ZXJlc3RcIixcbiAgXCJpbnRlcmVzdGVkXCIsXG4gIFwiaW50ZXJlc3RpbmdcIixcbiAgXCJpbnRlcmVzdHNcIixcbiAgXCJpbnRvXCIsXG4gIFwiaXNcIixcbiAgXCJpdFwiLFxuICBcIml0c1wiLFxuICBcIml0c2VsZlwiLFxuICBcImpcIixcbiAgXCJqdXN0XCIsXG4gIFwia1wiLFxuICBcImtlZXBcIixcbiAgXCJrZWVwc1wiLFxuICBcImtpbmRcIixcbiAgXCJrbmV3XCIsXG4gIFwia25vd1wiLFxuICBcImtub3duXCIsXG4gIFwia25vd3NcIixcbiAgXCJsXCIsXG4gIFwibGFyZ2VcIixcbiAgXCJsYXJnZWx5XCIsXG4gIFwibGFzdFwiLFxuICBcImxhdGVyXCIsXG4gIFwibGF0ZXN0XCIsXG4gIFwibGVhc3RcIixcbiAgXCJsZXNzXCIsXG4gIFwibGV0XCIsXG4gIFwibGV0c1wiLFxuICBcImxpa2VcIixcbiAgXCJsaWtlbHlcIixcbiAgXCJsb25nXCIsXG4gIFwibG9uZ2VyXCIsXG4gIFwibG9uZ2VzdFwiLFxuICBcIm1cIixcbiAgXCJtYWRlXCIsXG4gIFwibWFrZVwiLFxuICBcIm1ha2luZ1wiLFxuICBcIm1hblwiLFxuICBcIm1hbnlcIixcbiAgXCJtYXlcIixcbiAgXCJtZVwiLFxuICBcIm1lbWJlclwiLFxuICBcIm1lbWJlcnNcIixcbiAgXCJtZW5cIixcbiAgXCJtaWdodFwiLFxuICBcIm1vcmVcIixcbiAgXCJtb3N0XCIsXG4gIFwibW9zdGx5XCIsXG4gIFwibXJcIixcbiAgXCJtcnNcIixcbiAgXCJtdWNoXCIsXG4gIFwibXVzdFwiLFxuICBcIm15XCIsXG4gIFwibXlzZWxmXCIsXG4gIFwiblwiLFxuICBcIm5lY2Vzc2FyeVwiLFxuICBcIm5lZWRcIixcbiAgXCJuZWVkZWRcIixcbiAgXCJuZWVkaW5nXCIsXG4gIFwibmVlZHNcIixcbiAgXCJuZXZlclwiLFxuICBcIm5ld1wiLFxuICBcIm5ld1wiLFxuICBcIm5ld2VyXCIsXG4gIFwibmV3ZXN0XCIsXG4gIFwibmV4dFwiLFxuICBcIm5vXCIsXG4gIFwibm9ib2R5XCIsXG4gIFwibm9uXCIsXG4gIFwibm9vbmVcIixcbiAgXCJub3RcIixcbiAgXCJub3RoaW5nXCIsXG4gIFwibm93XCIsXG4gIFwibm93aGVyZVwiLFxuICBcIm51bWJlclwiLFxuICBcIm51bWJlcnNcIixcbiAgXCJvXCIsXG4gIFwib2ZcIixcbiAgXCJvZmZcIixcbiAgXCJvZnRlblwiLFxuICBcIm9sZFwiLFxuICBcIm9sZGVyXCIsXG4gIFwib2xkZXN0XCIsXG4gIFwib25cIixcbiAgXCJvbmNlXCIsXG4gIFwib25lXCIsXG4gIFwib25seVwiLFxuICBcIm9wZW5cIixcbiAgXCJvcGVuZWRcIixcbiAgXCJvcGVuaW5nXCIsXG4gIFwib3BlbnNcIixcbiAgXCJvclwiLFxuICBcIm9yZGVyXCIsXG4gIFwib3JkZXJlZFwiLFxuICBcIm9yZGVyaW5nXCIsXG4gIFwib3JkZXJzXCIsXG4gIFwib3RoZXJcIixcbiAgXCJvdGhlcnNcIixcbiAgXCJvdXJcIixcbiAgXCJvdXRcIixcbiAgXCJvdmVyXCIsXG4gIFwicFwiLFxuICBcInBhcnRcIixcbiAgXCJwYXJ0ZWRcIixcbiAgXCJwYXJ0aW5nXCIsXG4gIFwicGFydHNcIixcbiAgXCJwZXJcIixcbiAgXCJwZXJoYXBzXCIsXG4gIFwicGxhY2VcIixcbiAgXCJwbGFjZXNcIixcbiAgXCJwb2ludFwiLFxuICBcInBvaW50ZWRcIixcbiAgXCJwb2ludGluZ1wiLFxuICBcInBvaW50c1wiLFxuICBcInBvc3NpYmxlXCIsXG4gIFwicHJlc2VudFwiLFxuICBcInByZXNlbnRlZFwiLFxuICBcInByZXNlbnRpbmdcIixcbiAgXCJwcmVzZW50c1wiLFxuICBcInByb2JsZW1cIixcbiAgXCJwcm9ibGVtc1wiLFxuICBcInB1dFwiLFxuICBcInB1dHNcIixcbiAgXCJxXCIsXG4gIFwicXVpdGVcIixcbiAgXCJyXCIsXG4gIFwicmF0aGVyXCIsXG4gIFwicmVhbGx5XCIsXG4gIFwicmlnaHRcIixcbiAgXCJyaWdodFwiLFxuICBcInJvb21cIixcbiAgXCJyb29tc1wiLFxuICBcInNcIixcbiAgXCJzYWlkXCIsXG4gIFwic2FtZVwiLFxuICBcInNhd1wiLFxuICBcInNheVwiLFxuICBcInNheXNcIixcbiAgXCJzZWNvbmRcIixcbiAgXCJzZWNvbmRzXCIsXG4gIFwic2VlXCIsXG4gIFwic2VlbVwiLFxuICBcInNlZW1lZFwiLFxuICBcInNlZW1pbmdcIixcbiAgXCJzZWVtc1wiLFxuICBcInNlZXNcIixcbiAgXCJzZXZlcmFsXCIsXG4gIFwic2hhbGxcIixcbiAgXCJzaGVcIixcbiAgXCJzaG91bGRcIixcbiAgXCJzaG93XCIsXG4gIFwic2hvd2VkXCIsXG4gIFwic2hvd2luZ1wiLFxuICBcInNob3dzXCIsXG4gIFwic2lkZVwiLFxuICBcInNpZGVzXCIsXG4gIFwic2luY2VcIixcbiAgXCJzbWFsbFwiLFxuICBcInNtYWxsZXJcIixcbiAgXCJzbWFsbGVzdFwiLFxuICBcInNvXCIsXG4gIFwic29tZVwiLFxuICBcInNvbWVib2R5XCIsXG4gIFwic29tZW9uZVwiLFxuICBcInNvbWV0aGluZ1wiLFxuICBcInNvbWV3aGVyZVwiLFxuICBcInN0YXRlXCIsXG4gIFwic3RhdGVzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJzdGlsbFwiLFxuICBcInN1Y2hcIixcbiAgXCJzdXJlXCIsXG4gIFwidFwiLFxuICBcInRha2VcIixcbiAgXCJ0YWtlblwiLFxuICBcInRoYW5cIixcbiAgXCJ0aGF0XCIsXG4gIFwidGhlXCIsXG4gIFwidGhlaXJcIixcbiAgXCJ0aGVtXCIsXG4gIFwidGhlblwiLFxuICBcInRoZXJlXCIsXG4gIFwidGhlcmVmb3JlXCIsXG4gIFwidGhlc2VcIixcbiAgXCJ0aGV5XCIsXG4gIFwidGhpbmdcIixcbiAgXCJ0aGluZ3NcIixcbiAgXCJ0aGlua1wiLFxuICBcInRoaW5rc1wiLFxuICBcInRoaXNcIixcbiAgXCJ0aG9zZVwiLFxuICBcInRob3VnaFwiLFxuICBcInRob3VnaHRcIixcbiAgXCJ0aG91Z2h0c1wiLFxuICBcInRocmVlXCIsXG4gIFwidGhyb3VnaFwiLFxuICBcInRodXNcIixcbiAgXCJ0b1wiLFxuICBcInRvZGF5XCIsXG4gIFwidG9nZXRoZXJcIixcbiAgXCJ0b29cIixcbiAgXCJ0b29rXCIsXG4gIFwidG93YXJkXCIsXG4gIFwidHVyblwiLFxuICBcInR1cm5lZFwiLFxuICBcInR1cm5pbmdcIixcbiAgXCJ0dXJuc1wiLFxuICBcInR3b1wiLFxuICBcInVcIixcbiAgXCJ1bmRlclwiLFxuICBcInVudGlsXCIsXG4gIFwidXBcIixcbiAgXCJ1cG9uXCIsXG4gIFwidXNcIixcbiAgXCJ1c2VcIixcbiAgXCJ1c2VkXCIsXG4gIFwidXNlc1wiLFxuICBcInZcIixcbiAgXCJ2ZXJ5XCIsXG4gIFwid1wiLFxuICBcIndhbnRcIixcbiAgXCJ3YW50ZWRcIixcbiAgXCJ3YW50aW5nXCIsXG4gIFwid2FudHNcIixcbiAgXCJ3YXNcIixcbiAgXCJ3YXlcIixcbiAgXCJ3YXlzXCIsXG4gIFwid2VcIixcbiAgXCJ3ZWxsXCIsXG4gIFwid2VsbHNcIixcbiAgXCJ3ZW50XCIsXG4gIFwid2VyZVwiLFxuICBcIndoYXRcIixcbiAgXCJ3aGVuXCIsXG4gIFwid2hlcmVcIixcbiAgXCJ3aGV0aGVyXCIsXG4gIFwid2hpY2hcIixcbiAgXCJ3aGlsZVwiLFxuICBcIndob1wiLFxuICBcIndob2xlXCIsXG4gIFwid2hvc2VcIixcbiAgXCJ3aHlcIixcbiAgXCJ3aWxsXCIsXG4gIFwid2l0aFwiLFxuICBcIndpdGhpblwiLFxuICBcIndpdGhvdXRcIixcbiAgXCJ3b3JrXCIsXG4gIFwid29ya2VkXCIsXG4gIFwid29ya2luZ1wiLFxuICBcIndvcmtzXCIsXG4gIFwid291bGRcIixcbiAgXCJ4XCIsXG4gIFwieVwiLFxuICBcInllYXJcIixcbiAgXCJ5ZWFyc1wiLFxuICBcInlldFwiLFxuICBcInlvdVwiLFxuICBcInlvdW5nXCIsXG4gIFwieW91bmdlclwiLFxuICBcInlvdW5nZXN0XCIsXG4gIFwieW91clwiLFxuICBcInlvdXJzXCIsXG4gIFwielwiXG5dO1xuIiwiaW1wb3J0IHsgc3RvcFdvcmRzIH0gZnJvbSBcIi4vZW5nbGlzaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIG5vU3RvcFdvcmRzIH0gZnJvbSBcIi4vbm9yd2VnaWFuXCI7XG5pbXBvcnQgeyBzdG9wV29yZHMgYXMgbmxTdG9wV29yZHMgfSBmcm9tIFwiLi9kdXRjaFwiO1xuaW1wb3J0IHsgc3RvcFdvcmRzIGFzIGVzU3RvcFdvcmRzIH0gZnJvbSBcIi4vc3BhbmlzaFwiO1xuXG52YXIgc3RvcFdvcmRzRGljdGlvbmFyeTogeyBbaW5kZXg6IHN0cmluZ106IEFycmF5PHN0cmluZz4gfSA9IHt9O1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcImVuXCJdID0gc3RvcFdvcmRzO1xuc3RvcFdvcmRzRGljdGlvbmFyeVtcIm5vXCJdID0gbm9TdG9wV29yZHM7XG5zdG9wV29yZHNEaWN0aW9uYXJ5W1wibmxcIl0gPSBubFN0b3BXb3JkcztcbnN0b3BXb3Jkc0RpY3Rpb25hcnlbXCJlc1wiXSA9IGVzU3RvcFdvcmRzO1xuXG5leHBvcnQgdmFyIHRleHRIZWxwZXIgPSB7XG4gIGdldFN0b3BXb3JkczogKGxvY2FsZTogc3RyaW5nID0gXCJcIikgPT4ge1xuICAgIHJldHVybiBzdG9wV29yZHNEaWN0aW9uYXJ5W2xvY2FsZSB8fCBcImVuXCJdIHx8IFtdO1xuICB9LFxufTtcbiIsImV4cG9ydCB2YXIgc3RvcFdvcmRzID0gW1xuICBcIi4uLlwiLFxuICBcImFsbGVcIixcbiAgXCJhbmRyZVwiLFxuICBcImFyYmVpZFwiLFxuICBcImF0XCIsXG4gIFwiYXZcIixcbiAgXCJiYXJlXCIsXG4gIFwiYmVnZ2VcIixcbiAgXCJibGVcIixcbiAgXCJibGVpXCIsXG4gIFwiYmxpXCIsXG4gIFwiYmxpclwiLFxuICBcImJsaXR0XCIsXG4gIFwiYm9ydFwiLFxuICBcImJydWtlXCIsXG4gIFwiYsOlZGVcIixcbiAgXCJiw6VlXCIsXG4gIFwiZGFcIixcbiAgXCJkZVwiLFxuICBcImRlZ1wiLFxuICBcImRlaVwiLFxuICBcImRlaW1cIixcbiAgXCJkZWlyYVwiLFxuICBcImRlaXJlc1wiLFxuICBcImRlbVwiLFxuICBcImRlblwiLFxuICBcImRlbm5lXCIsXG4gIFwiZGVyXCIsXG4gIFwiZGVyZVwiLFxuICBcImRlcmVzXCIsXG4gIFwiZGV0XCIsXG4gIFwiZGV0dGVcIixcbiAgXCJkaVwiLFxuICBcImRpblwiLFxuICBcImRpc3NlXCIsXG4gIFwiZGl0dFwiLFxuICBcImR1XCIsXG4gIFwiZHlra1wiLFxuICBcImR5a2thclwiLFxuICBcImTDpVwiLFxuICBcImVnXCIsXG4gIFwiZWluXCIsXG4gIFwiZWl0XCIsXG4gIFwiZWl0dFwiLFxuICBcImVsbGVyXCIsXG4gIFwiZWxsZXNcIixcbiAgXCJlblwiLFxuICBcImVuZVwiLFxuICBcImVuZXN0ZVwiLFxuICBcImVuaHZlclwiLFxuICBcImVublwiLFxuICBcImVyXCIsXG4gIFwiZXRcIixcbiAgXCJldHRcIixcbiAgXCJldHRlclwiLFxuICBcImZvbGtcIixcbiAgXCJmb3JcIixcbiAgXCJmb3JkaVwiLFxuICBcImZvcnPDuGtlXCIsXG4gIFwiZnJhXCIsXG4gIFwiZsOlXCIsXG4gIFwiZsO4clwiLFxuICBcImbDuHJcIixcbiAgXCJmw7hyc3RcIixcbiAgXCJnam9yZGVcIixcbiAgXCJnasO4cmVcIixcbiAgXCJnb2RcIixcbiAgXCJnw6VcIixcbiAgXCJoYVwiLFxuICBcImhhZGRlXCIsXG4gIFwiaGFuXCIsXG4gIFwiaGFuc1wiLFxuICBcImhhclwiLFxuICBcImhlbm5hclwiLFxuICBcImhlbm5lXCIsXG4gIFwiaGVubmVzXCIsXG4gIFwiaGVyXCIsXG4gIFwiaGrDpVwiLFxuICBcImhvXCIsXG4gIFwiaG9lXCIsXG4gIFwiaG9ub21cIixcbiAgXCJob3NzXCIsXG4gIFwiaG9zc2VuXCIsXG4gIFwiaHVuXCIsXG4gIFwiaHZhXCIsXG4gIFwiaHZlbVwiLFxuICBcImh2ZXJcIixcbiAgXCJodmlsa2VcIixcbiAgXCJodmlsa2VuXCIsXG4gIFwiaHZpc1wiLFxuICBcImh2b3JcIixcbiAgXCJodm9yZGFuXCIsXG4gIFwiaHZvcmZvclwiLFxuICBcImlcIixcbiAgXCJpa2tlXCIsXG4gIFwiaWtramVcIixcbiAgXCJpbmdlblwiLFxuICBcImluZ2lcIixcbiAgXCJpbmtqZVwiLFxuICBcImlublwiLFxuICBcImlubmVuXCIsXG4gIFwiaW5uaVwiLFxuICBcImphXCIsXG4gIFwiamVnXCIsXG4gIFwia2FuXCIsXG4gIFwia29tXCIsXG4gIFwia29ybGVpc1wiLFxuICBcImtvcnNvXCIsXG4gIFwia3VuXCIsXG4gIFwia3VubmVcIixcbiAgXCJrdmFcIixcbiAgXCJrdmFyXCIsXG4gIFwia3ZhcmhlbHN0XCIsXG4gIFwia3ZlblwiLFxuICBcImt2aVwiLFxuICBcImt2aWZvclwiLFxuICBcImxhZ2VcIixcbiAgXCJsYW5nXCIsXG4gIFwibGlrXCIsXG4gIFwibGlrZVwiLFxuICBcIm1ha3RcIixcbiAgXCJtYW5cIixcbiAgXCJtYW5nZVwiLFxuICBcIm1lXCIsXG4gIFwibWVkXCIsXG4gIFwibWVkYW5cIixcbiAgXCJtZWdcIixcbiAgXCJtZWdldFwiLFxuICBcIm1lbGxvbVwiLFxuICBcIm1lblwiLFxuICBcIm1lbnNcIixcbiAgXCJtZXJcIixcbiAgXCJtZXN0XCIsXG4gIFwibWlcIixcbiAgXCJtaW5cIixcbiAgXCJtaW5lXCIsXG4gIFwibWl0dFwiLFxuICBcIm1vdFwiLFxuICBcIm15ZVwiLFxuICBcIm15a2plXCIsXG4gIFwibcOlXCIsXG4gIFwibcOldGVcIixcbiAgXCJuYXZuXCIsXG4gIFwibmVkXCIsXG4gIFwibmVpXCIsXG4gIFwibm9cIixcbiAgXCJub2VcIixcbiAgXCJub2VuXCIsXG4gIFwibm9rYVwiLFxuICBcIm5va29cIixcbiAgXCJub2tvblwiLFxuICBcIm5va29yXCIsXG4gIFwibm9rcmVcIixcbiAgXCJueVwiLFxuICBcIm7DpVwiLFxuICBcIm7DpXJcIixcbiAgXCJvZ1wiLFxuICBcIm9nc8OlXCIsXG4gIFwib21cIixcbiAgXCJvcHBcIixcbiAgXCJvc3NcIixcbiAgXCJvdmVyXCIsXG4gIFwicGFydFwiLFxuICBcInB1bmt0XCIsXG4gIFwicMOlXCIsXG4gIFwic2FtbWVcIixcbiAgXCJzZWdcIixcbiAgXCJzZWx2XCIsXG4gIFwic2lcIixcbiAgXCJzaWFcIixcbiAgXCJzaWRhblwiLFxuICBcInNpZGVuXCIsXG4gIFwic2luXCIsXG4gIFwic2luZVwiLFxuICBcInNpc3RcIixcbiAgXCJzaXR0XCIsXG4gIFwic2rDuGxcIixcbiAgXCJza2FsXCIsXG4gIFwic2t1bGxlXCIsXG4gIFwic2xpa1wiLFxuICBcInNsdXR0XCIsXG4gIFwic29cIixcbiAgXCJzb21cIixcbiAgXCJzb21tZVwiLFxuICBcInNvbXRcIixcbiAgXCJzdGFydFwiLFxuICBcInN0aWxsZVwiLFxuICBcInPDpVwiLFxuICBcInPDpW5uXCIsXG4gIFwidGlkXCIsXG4gIFwidGlsXCIsXG4gIFwidGlsYmFrZVwiLFxuICBcInRpbHN0YW5kXCIsXG4gIFwidW1cIixcbiAgXCJ1bmRlclwiLFxuICBcInVwcFwiLFxuICBcInV0XCIsXG4gIFwidXRlblwiLFxuICBcInZhclwiLFxuICBcInZhcnRcIixcbiAgXCJ2YXJ0ZVwiLFxuICBcInZlZFwiLFxuICBcInZlcmRpXCIsXG4gIFwidmVyZVwiLFxuICBcInZlcnRlXCIsXG4gIFwidmlcIixcbiAgXCJ2aWxcIixcbiAgXCJ2aWxsZVwiLFxuICBcInZpdGVcIixcbiAgXCJ2b3JlXCIsXG4gIFwidm9yc1wiLFxuICBcInZvcnRcIixcbiAgXCJ2w6VyXCIsXG4gIFwidsOmcmVcIixcbiAgXCJ2w6ZydFwiLFxuICBcInbDuHJlXCIsXG4gIFwidsO4cnRcIixcbiAgXCLDplwiLFxuICBcIsOlXCJcbl07XG4iLCJleHBvcnQgdmFyIHN0b3BXb3JkcyA9IFtcbiAgXCIuLi5cIixcbiAgXCJhXCIsXG4gIFwiYWN0dWFsbWVudGVcIixcbiAgXCJhZGVsYW50ZVwiLFxuICBcImFkZW3DoXNcIixcbiAgXCJhZmlybcOzXCIsXG4gIFwiYWdyZWfDs1wiLFxuICBcImFob3JhXCIsXG4gIFwiYWjDrVwiLFxuICBcImFsXCIsXG4gIFwiYWxnb1wiLFxuICBcImFsZ3VuYVwiLFxuICBcImFsZ3VuYXNcIixcbiAgXCJhbGd1bm9cIixcbiAgXCJhbGd1bm9zXCIsXG4gIFwiYWxnw7puXCIsXG4gIFwiYWxyZWRlZG9yXCIsXG4gIFwiYW1ib3NcIixcbiAgXCJhbXBsZWFtb3NcIixcbiAgXCJhbnRlXCIsXG4gIFwiYW50ZXJpb3JcIixcbiAgXCJhbnRlc1wiLFxuICBcImFwZW5hc1wiLFxuICBcImFwcm94aW1hZGFtZW50ZVwiLFxuICBcImFxdWVsXCIsXG4gIFwiYXF1ZWxsYXNcIixcbiAgXCJhcXVlbGxvc1wiLFxuICBcImFxdWlcIixcbiAgXCJhcXXDrVwiLFxuICBcImFycmliYVwiLFxuICBcImFzZWd1csOzXCIsXG4gIFwiYXPDrVwiLFxuICBcImF0cmFzXCIsXG4gIFwiYXVucXVlXCIsXG4gIFwiYXllclwiLFxuICBcImHDsWFkacOzXCIsXG4gIFwiYcO6blwiLFxuICBcImJham9cIixcbiAgXCJiYXN0YW50ZVwiLFxuICBcImJpZW5cIixcbiAgXCJidWVuXCIsXG4gIFwiYnVlbmFcIixcbiAgXCJidWVuYXNcIixcbiAgXCJidWVub1wiLFxuICBcImJ1ZW5vc1wiLFxuICBcImNhZGFcIixcbiAgXCJjYXNpXCIsXG4gIFwiY2VyY2FcIixcbiAgXCJjaWVydGFcIixcbiAgXCJjaWVydGFzXCIsXG4gIFwiY2llcnRvXCIsXG4gIFwiY2llcnRvc1wiLFxuICBcImNpbmNvXCIsXG4gIFwiY29tZW50w7NcIixcbiAgXCJjb21vXCIsXG4gIFwiY29uXCIsXG4gIFwiY29ub2NlclwiLFxuICBcImNvbnNlZ3VpbW9zXCIsXG4gIFwiY29uc2VndWlyXCIsXG4gIFwiY29uc2lkZXJhXCIsXG4gIFwiY29uc2lkZXLDs1wiLFxuICBcImNvbnNpZ29cIixcbiAgXCJjb25zaWd1ZVwiLFxuICBcImNvbnNpZ3VlblwiLFxuICBcImNvbnNpZ3Vlc1wiLFxuICBcImNvbnRyYVwiLFxuICBcImNvc2FzXCIsXG4gIFwiY3Jlb1wiLFxuICBcImN1YWxcIixcbiAgXCJjdWFsZXNcIixcbiAgXCJjdWFscXVpZXJcIixcbiAgXCJjdWFuZG9cIixcbiAgXCJjdWFudG9cIixcbiAgXCJjdWF0cm9cIixcbiAgXCJjdWVudGFcIixcbiAgXCJjw7Ntb1wiLFxuICBcImRhXCIsXG4gIFwiZGFkb1wiLFxuICBcImRhblwiLFxuICBcImRhclwiLFxuICBcImRlXCIsXG4gIFwiZGViZVwiLFxuICBcImRlYmVuXCIsXG4gIFwiZGViaWRvXCIsXG4gIFwiZGVjaXJcIixcbiAgXCJkZWrDs1wiLFxuICBcImRlbFwiLFxuICBcImRlbcOhc1wiLFxuICBcImRlbnRyb1wiLFxuICBcImRlc2RlXCIsXG4gIFwiZGVzcHXDqXNcIixcbiAgXCJkaWNlXCIsXG4gIFwiZGljZW5cIixcbiAgXCJkaWNob1wiLFxuICBcImRpZXJvblwiLFxuICBcImRpZmVyZW50ZVwiLFxuICBcImRpZmVyZW50ZXNcIixcbiAgXCJkaWplcm9uXCIsXG4gIFwiZGlqb1wiLFxuICBcImRpb1wiLFxuICBcImRvbmRlXCIsXG4gIFwiZG9zXCIsXG4gIFwiZHVyYW50ZVwiLFxuICBcImVcIixcbiAgXCJlamVtcGxvXCIsXG4gIFwiZWxcIixcbiAgXCJlbGxhXCIsXG4gIFwiZWxsYXNcIixcbiAgXCJlbGxvXCIsXG4gIFwiZWxsb3NcIixcbiAgXCJlbWJhcmdvXCIsXG4gIFwiZW1wbGVhaXNcIixcbiAgXCJlbXBsZWFuXCIsXG4gIFwiZW1wbGVhclwiLFxuICBcImVtcGxlYXNcIixcbiAgXCJlbXBsZW9cIixcbiAgXCJlblwiLFxuICBcImVuY2ltYVwiLFxuICBcImVuY3VlbnRyYVwiLFxuICBcImVudG9uY2VzXCIsXG4gIFwiZW50cmVcIixcbiAgXCJlcmFcIixcbiAgXCJlcmFpc1wiLFxuICBcImVyYW1vc1wiLFxuICBcImVyYW5cIixcbiAgXCJlcmFzXCIsXG4gIFwiZXJlc1wiLFxuICBcImVzXCIsXG4gIFwiZXNhXCIsXG4gIFwiZXNhc1wiLFxuICBcImVzZVwiLFxuICBcImVzb1wiLFxuICBcImVzb3NcIixcbiAgXCJlc3RhXCIsXG4gIFwiZXN0YWJhXCIsXG4gIFwiZXN0YWJhaXNcIixcbiAgXCJlc3RhYmFuXCIsXG4gIFwiZXN0YWJhc1wiLFxuICBcImVzdGFkXCIsXG4gIFwiZXN0YWRhXCIsXG4gIFwiZXN0YWRhc1wiLFxuICBcImVzdGFkb1wiLFxuICBcImVzdGFkb3NcIixcbiAgXCJlc3RhaXNcIixcbiAgXCJlc3RhbW9zXCIsXG4gIFwiZXN0YW5cIixcbiAgXCJlc3RhbmRvXCIsXG4gIFwiZXN0YXJcIixcbiAgXCJlc3RhcmVtb3NcIixcbiAgXCJlc3RhcsOhXCIsXG4gIFwiZXN0YXLDoW5cIixcbiAgXCJlc3RhcsOhc1wiLFxuICBcImVzdGFyw6lcIixcbiAgXCJlc3RhcsOpaXNcIixcbiAgXCJlc3RhcsOtYVwiLFxuICBcImVzdGFyw61haXNcIixcbiAgXCJlc3RhcsOtYW1vc1wiLFxuICBcImVzdGFyw61hblwiLFxuICBcImVzdGFyw61hc1wiLFxuICBcImVzdGFzXCIsXG4gIFwiZXN0ZVwiLFxuICBcImVzdGVtb3NcIixcbiAgXCJlc3RvXCIsXG4gIFwiZXN0b3NcIixcbiAgXCJlc3RveVwiLFxuICBcImVzdHV2ZVwiLFxuICBcImVzdHV2aWVyYVwiLFxuICBcImVzdHV2aWVyYWlzXCIsXG4gIFwiZXN0dXZpZXJhblwiLFxuICBcImVzdHV2aWVyYXNcIixcbiAgXCJlc3R1dmllcm9uXCIsXG4gIFwiZXN0dXZpZXNlXCIsXG4gIFwiZXN0dXZpZXNlaXNcIixcbiAgXCJlc3R1dmllc2VuXCIsXG4gIFwiZXN0dXZpZXNlc1wiLFxuICBcImVzdHV2aW1vc1wiLFxuICBcImVzdHV2aXN0ZVwiLFxuICBcImVzdHV2aXN0ZWlzXCIsXG4gIFwiZXN0dXZpw6lyYW1vc1wiLFxuICBcImVzdHV2acOpc2Vtb3NcIixcbiAgXCJlc3R1dm9cIixcbiAgXCJlc3TDoVwiLFxuICBcImVzdMOhYmFtb3NcIixcbiAgXCJlc3TDoWlzXCIsXG4gIFwiZXN0w6FuXCIsXG4gIFwiZXN0w6FzXCIsXG4gIFwiZXN0w6lcIixcbiAgXCJlc3TDqWlzXCIsXG4gIFwiZXN0w6luXCIsXG4gIFwiZXN0w6lzXCIsXG4gIFwiZXhcIixcbiAgXCJleGlzdGVcIixcbiAgXCJleGlzdGVuXCIsXG4gIFwiZXhwbGljw7NcIixcbiAgXCJleHByZXPDs1wiLFxuICBcImZpblwiLFxuICBcImZ1ZVwiLFxuICBcImZ1ZXJhXCIsXG4gIFwiZnVlcmFpc1wiLFxuICBcImZ1ZXJhblwiLFxuICBcImZ1ZXJhc1wiLFxuICBcImZ1ZXJvblwiLFxuICBcImZ1ZXNlXCIsXG4gIFwiZnVlc2Vpc1wiLFxuICBcImZ1ZXNlblwiLFxuICBcImZ1ZXNlc1wiLFxuICBcImZ1aVwiLFxuICBcImZ1aW1vc1wiLFxuICBcImZ1aXN0ZVwiLFxuICBcImZ1aXN0ZWlzXCIsXG4gIFwiZnXDqXJhbW9zXCIsXG4gIFwiZnXDqXNlbW9zXCIsXG4gIFwiZ3JhblwiLFxuICBcImdyYW5kZXNcIixcbiAgXCJndWVub1wiLFxuICBcImhhXCIsXG4gIFwiaGFiZXJcIixcbiAgXCJoYWJpZGFcIixcbiAgXCJoYWJpZGFzXCIsXG4gIFwiaGFiaWRvXCIsXG4gIFwiaGFiaWRvc1wiLFxuICBcImhhYmllbmRvXCIsXG4gIFwiaGFicmVtb3NcIixcbiAgXCJoYWJyw6FcIixcbiAgXCJoYWJyw6FuXCIsXG4gIFwiaGFicsOhc1wiLFxuICBcImhhYnLDqVwiLFxuICBcImhhYnLDqWlzXCIsXG4gIFwiaGFicsOtYVwiLFxuICBcImhhYnLDrWFpc1wiLFxuICBcImhhYnLDrWFtb3NcIixcbiAgXCJoYWJyw61hblwiLFxuICBcImhhYnLDrWFzXCIsXG4gIFwiaGFiw6lpc1wiLFxuICBcImhhYsOtYVwiLFxuICBcImhhYsOtYWlzXCIsXG4gIFwiaGFiw61hbW9zXCIsXG4gIFwiaGFiw61hblwiLFxuICBcImhhYsOtYXNcIixcbiAgXCJoYWNlXCIsXG4gIFwiaGFjZWlzXCIsXG4gIFwiaGFjZW1vc1wiLFxuICBcImhhY2VuXCIsXG4gIFwiaGFjZXJcIixcbiAgXCJoYWNlcmxvXCIsXG4gIFwiaGFjZXNcIixcbiAgXCJoYWNpYVwiLFxuICBcImhhY2llbmRvXCIsXG4gIFwiaGFnb1wiLFxuICBcImhhblwiLFxuICBcImhhc1wiLFxuICBcImhhc3RhXCIsXG4gIFwiaGF5XCIsXG4gIFwiaGF5YVwiLFxuICBcImhheWFtb3NcIixcbiAgXCJoYXlhblwiLFxuICBcImhheWFzXCIsXG4gIFwiaGF5w6Fpc1wiLFxuICBcImhlXCIsXG4gIFwiaGVjaG9cIixcbiAgXCJoZW1vc1wiLFxuICBcImhpY2llcm9uXCIsXG4gIFwiaGl6b1wiLFxuICBcImhveVwiLFxuICBcImh1YmVcIixcbiAgXCJodWJpZXJhXCIsXG4gIFwiaHViaWVyYWlzXCIsXG4gIFwiaHViaWVyYW5cIixcbiAgXCJodWJpZXJhc1wiLFxuICBcImh1Ymllcm9uXCIsXG4gIFwiaHViaWVzZVwiLFxuICBcImh1Ymllc2Vpc1wiLFxuICBcImh1Ymllc2VuXCIsXG4gIFwiaHViaWVzZXNcIixcbiAgXCJodWJpbW9zXCIsXG4gIFwiaHViaXN0ZVwiLFxuICBcImh1YmlzdGVpc1wiLFxuICBcImh1YmnDqXJhbW9zXCIsXG4gIFwiaHViacOpc2Vtb3NcIixcbiAgXCJodWJvXCIsXG4gIFwiaWd1YWxcIixcbiAgXCJpbmNsdXNvXCIsXG4gIFwiaW5kaWPDs1wiLFxuICBcImluZm9ybcOzXCIsXG4gIFwiaW50ZW50YVwiLFxuICBcImludGVudGFpc1wiLFxuICBcImludGVudGFtb3NcIixcbiAgXCJpbnRlbnRhblwiLFxuICBcImludGVudGFyXCIsXG4gIFwiaW50ZW50YXNcIixcbiAgXCJpbnRlbnRvXCIsXG4gIFwiaXJcIixcbiAgXCJqdW50b1wiLFxuICBcImxhXCIsXG4gIFwibGFkb1wiLFxuICBcImxhcmdvXCIsXG4gIFwibGFzXCIsXG4gIFwibGVcIixcbiAgXCJsZXNcIixcbiAgXCJsbGVnw7NcIixcbiAgXCJsbGV2YVwiLFxuICBcImxsZXZhclwiLFxuICBcImxvXCIsXG4gIFwibG9zXCIsXG4gIFwibHVlZ29cIixcbiAgXCJsdWdhclwiLFxuICBcIm1hbmVyYVwiLFxuICBcIm1hbmlmZXN0w7NcIixcbiAgXCJtYXlvclwiLFxuICBcIm1lXCIsXG4gIFwibWVkaWFudGVcIixcbiAgXCJtZWpvclwiLFxuICBcIm1lbmNpb27Ds1wiLFxuICBcIm1lbm9zXCIsXG4gIFwibWlcIixcbiAgXCJtaWVudHJhc1wiLFxuICBcIm1pb1wiLFxuICBcIm1pc1wiLFxuICBcIm1pc21hXCIsXG4gIFwibWlzbWFzXCIsXG4gIFwibWlzbW9cIixcbiAgXCJtaXNtb3NcIixcbiAgXCJtb2RvXCIsXG4gIFwibW9tZW50b1wiLFxuICBcIm11Y2hhXCIsXG4gIFwibXVjaGFzXCIsXG4gIFwibXVjaG9cIixcbiAgXCJtdWNob3NcIixcbiAgXCJtdXlcIixcbiAgXCJtw6FzXCIsXG4gIFwibcOtXCIsXG4gIFwibcOtYVwiLFxuICBcIm3DrWFzXCIsXG4gIFwibcOtb1wiLFxuICBcIm3DrW9zXCIsXG4gIFwibmFkYVwiLFxuICBcIm5hZGllXCIsXG4gIFwibmlcIixcbiAgXCJuaW5ndW5hXCIsXG4gIFwibmluZ3VuYXNcIixcbiAgXCJuaW5ndW5vXCIsXG4gIFwibmluZ3Vub3NcIixcbiAgXCJuaW5nw7puXCIsXG4gIFwibm9cIixcbiAgXCJub3NcIixcbiAgXCJub3NvdHJhc1wiLFxuICBcIm5vc290cm9zXCIsXG4gIFwibnVlc3RyYVwiLFxuICBcIm51ZXN0cmFzXCIsXG4gIFwibnVlc3Ryb1wiLFxuICBcIm51ZXN0cm9zXCIsXG4gIFwibnVldmFcIixcbiAgXCJudWV2YXNcIixcbiAgXCJudWV2b1wiLFxuICBcIm51ZXZvc1wiLFxuICBcIm51bmNhXCIsXG4gIFwib1wiLFxuICBcIm9jaG9cIixcbiAgXCJvc1wiLFxuICBcIm90cmFcIixcbiAgXCJvdHJhc1wiLFxuICBcIm90cm9cIixcbiAgXCJvdHJvc1wiLFxuICBcInBhcmFcIixcbiAgXCJwYXJlY2VcIixcbiAgXCJwYXJ0ZVwiLFxuICBcInBhcnRpclwiLFxuICBcInBhc2FkYVwiLFxuICBcInBhc2Fkb1wiLFxuICBcInBlcm9cIixcbiAgXCJwZXNhclwiLFxuICBcInBvY2FcIixcbiAgXCJwb2Nhc1wiLFxuICBcInBvY29cIixcbiAgXCJwb2Nvc1wiLFxuICBcInBvZGVpc1wiLFxuICBcInBvZGVtb3NcIixcbiAgXCJwb2RlclwiLFxuICBcInBvZHJpYVwiLFxuICBcInBvZHJpYWlzXCIsXG4gIFwicG9kcmlhbW9zXCIsXG4gIFwicG9kcmlhblwiLFxuICBcInBvZHJpYXNcIixcbiAgXCJwb2Ryw6FcIixcbiAgXCJwb2Ryw6FuXCIsXG4gIFwicG9kcsOtYVwiLFxuICBcInBvZHLDrWFuXCIsXG4gIFwicG9uZXJcIixcbiAgXCJwb3JcIixcbiAgXCJwb3IgcXXDqVwiLFxuICBcInBvcnF1ZVwiLFxuICBcInBvc2libGVcIixcbiAgXCJwcmltZXJcIixcbiAgXCJwcmltZXJhXCIsXG4gIFwicHJpbWVyb1wiLFxuICBcInByaW1lcm9zXCIsXG4gIFwicHJpbmNpcGFsbWVudGVcIixcbiAgXCJwcm9waWFcIixcbiAgXCJwcm9waWFzXCIsXG4gIFwicHJvcGlvXCIsXG4gIFwicHJvcGlvc1wiLFxuICBcInByw7N4aW1vXCIsXG4gIFwicHLDs3hpbW9zXCIsXG4gIFwicHVkb1wiLFxuICBcInB1ZWRhXCIsXG4gIFwicHVlZGVcIixcbiAgXCJwdWVkZW5cIixcbiAgXCJwdWVkb1wiLFxuICBcInB1ZXNcIixcbiAgXCJxdWVcIixcbiAgXCJxdWVkw7NcIixcbiAgXCJxdWVyZW1vc1wiLFxuICBcInF1aWVuXCIsXG4gIFwicXVpZW5lc1wiLFxuICBcInF1aWVyZVwiLFxuICBcInF1acOpblwiLFxuICBcInF1w6lcIixcbiAgXCJyZWFsaXphZG9cIixcbiAgXCJyZWFsaXphclwiLFxuICBcInJlYWxpesOzXCIsXG4gIFwicmVzcGVjdG9cIixcbiAgXCJzYWJlXCIsXG4gIFwic2FiZWlzXCIsXG4gIFwic2FiZW1vc1wiLFxuICBcInNhYmVuXCIsXG4gIFwic2FiZXJcIixcbiAgXCJzYWJlc1wiLFxuICBcInNlXCIsXG4gIFwic2VhXCIsXG4gIFwic2VhbW9zXCIsXG4gIFwic2VhblwiLFxuICBcInNlYXNcIixcbiAgXCJzZWd1bmRhXCIsXG4gIFwic2VndW5kb1wiLFxuICBcInNlZ8O6blwiLFxuICBcInNlaXNcIixcbiAgXCJzZXJcIixcbiAgXCJzZXJlbW9zXCIsXG4gIFwic2Vyw6FcIixcbiAgXCJzZXLDoW5cIixcbiAgXCJzZXLDoXNcIixcbiAgXCJzZXLDqVwiLFxuICBcInNlcsOpaXNcIixcbiAgXCJzZXLDrWFcIixcbiAgXCJzZXLDrWFpc1wiLFxuICBcInNlcsOtYW1vc1wiLFxuICBcInNlcsOtYW5cIixcbiAgXCJzZXLDrWFzXCIsXG4gIFwic2XDoWlzXCIsXG4gIFwic2XDsWFsw7NcIixcbiAgXCJzaVwiLFxuICBcInNpZG9cIixcbiAgXCJzaWVtcHJlXCIsXG4gIFwic2llbmRvXCIsXG4gIFwic2lldGVcIixcbiAgXCJzaWd1ZVwiLFxuICBcInNpZ3VpZW50ZVwiLFxuICBcInNpblwiLFxuICBcInNpbm9cIixcbiAgXCJzb2JyZVwiLFxuICBcInNvaXNcIixcbiAgXCJzb2xhXCIsXG4gIFwic29sYW1lbnRlXCIsXG4gIFwic29sYXNcIixcbiAgXCJzb2xvXCIsXG4gIFwic29sb3NcIixcbiAgXCJzb21vc1wiLFxuICBcInNvblwiLFxuICBcInNveVwiLFxuICBcInN1XCIsXG4gIFwic3VzXCIsXG4gIFwic3V5YVwiLFxuICBcInN1eWFzXCIsXG4gIFwic3V5b1wiLFxuICBcInN1eW9zXCIsXG4gIFwic8OtXCIsXG4gIFwic8OzbG9cIixcbiAgXCJ0YWxcIixcbiAgXCJ0YW1iacOpblwiLFxuICBcInRhbXBvY29cIixcbiAgXCJ0YW5cIixcbiAgXCJ0YW50b1wiLFxuICBcInRlXCIsXG4gIFwidGVuZHJlbW9zXCIsXG4gIFwidGVuZHLDoVwiLFxuICBcInRlbmRyw6FuXCIsXG4gIFwidGVuZHLDoXNcIixcbiAgXCJ0ZW5kcsOpXCIsXG4gIFwidGVuZHLDqWlzXCIsXG4gIFwidGVuZHLDrWFcIixcbiAgXCJ0ZW5kcsOtYWlzXCIsXG4gIFwidGVuZHLDrWFtb3NcIixcbiAgXCJ0ZW5kcsOtYW5cIixcbiAgXCJ0ZW5kcsOtYXNcIixcbiAgXCJ0ZW5lZFwiLFxuICBcInRlbmVpc1wiLFxuICBcInRlbmVtb3NcIixcbiAgXCJ0ZW5lclwiLFxuICBcInRlbmdhXCIsXG4gIFwidGVuZ2Ftb3NcIixcbiAgXCJ0ZW5nYW5cIixcbiAgXCJ0ZW5nYXNcIixcbiAgXCJ0ZW5nb1wiLFxuICBcInRlbmfDoWlzXCIsXG4gIFwidGVuaWRhXCIsXG4gIFwidGVuaWRhc1wiLFxuICBcInRlbmlkb1wiLFxuICBcInRlbmlkb3NcIixcbiAgXCJ0ZW5pZW5kb1wiLFxuICBcInRlbsOpaXNcIixcbiAgXCJ0ZW7DrWFcIixcbiAgXCJ0ZW7DrWFpc1wiLFxuICBcInRlbsOtYW1vc1wiLFxuICBcInRlbsOtYW5cIixcbiAgXCJ0ZW7DrWFzXCIsXG4gIFwidGVyY2VyYVwiLFxuICBcInRpXCIsXG4gIFwidGllbXBvXCIsXG4gIFwidGllbmVcIixcbiAgXCJ0aWVuZW5cIixcbiAgXCJ0aWVuZXNcIixcbiAgXCJ0b2RhXCIsXG4gIFwidG9kYXNcIixcbiAgXCJ0b2RhdsOtYVwiLFxuICBcInRvZG9cIixcbiAgXCJ0b2Rvc1wiLFxuICBcInRvdGFsXCIsXG4gIFwidHJhYmFqYVwiLFxuICBcInRyYWJhamFpc1wiLFxuICBcInRyYWJhamFtb3NcIixcbiAgXCJ0cmFiYWphblwiLFxuICBcInRyYWJhamFyXCIsXG4gIFwidHJhYmFqYXNcIixcbiAgXCJ0cmFiYWpvXCIsXG4gIFwidHJhc1wiLFxuICBcInRyYXRhXCIsXG4gIFwidHJhdsOpc1wiLFxuICBcInRyZXNcIixcbiAgXCJ0dVwiLFxuICBcInR1c1wiLFxuICBcInR1dmVcIixcbiAgXCJ0dXZpZXJhXCIsXG4gIFwidHV2aWVyYWlzXCIsXG4gIFwidHV2aWVyYW5cIixcbiAgXCJ0dXZpZXJhc1wiLFxuICBcInR1dmllcm9uXCIsXG4gIFwidHV2aWVzZVwiLFxuICBcInR1dmllc2Vpc1wiLFxuICBcInR1dmllc2VuXCIsXG4gIFwidHV2aWVzZXNcIixcbiAgXCJ0dXZpbW9zXCIsXG4gIFwidHV2aXN0ZVwiLFxuICBcInR1dmlzdGVpc1wiLFxuICBcInR1dmnDqXJhbW9zXCIsXG4gIFwidHV2acOpc2Vtb3NcIixcbiAgXCJ0dXZvXCIsXG4gIFwidHV5YVwiLFxuICBcInR1eWFzXCIsXG4gIFwidHV5b1wiLFxuICBcInR1eW9zXCIsXG4gIFwidMO6XCIsXG4gIFwidWx0aW1vXCIsXG4gIFwidW5cIixcbiAgXCJ1bmFcIixcbiAgXCJ1bmFzXCIsXG4gIFwidW5vXCIsXG4gIFwidW5vc1wiLFxuICBcInVzYVwiLFxuICBcInVzYWlzXCIsXG4gIFwidXNhbW9zXCIsXG4gIFwidXNhblwiLFxuICBcInVzYXJcIixcbiAgXCJ1c2FzXCIsXG4gIFwidXNvXCIsXG4gIFwidXN0ZWRcIixcbiAgXCJ2YVwiLFxuICBcInZhaXNcIixcbiAgXCJ2YWxvclwiLFxuICBcInZhbW9zXCIsXG4gIFwidmFuXCIsXG4gIFwidmFyaWFzXCIsXG4gIFwidmFyaW9zXCIsXG4gIFwidmF5YVwiLFxuICBcInZlY2VzXCIsXG4gIFwidmVyXCIsXG4gIFwidmVyZGFkXCIsXG4gIFwidmVyZGFkZXJhXCIsXG4gIFwidmVyZGFkZXJvXCIsXG4gIFwidmV6XCIsXG4gIFwidm9zb3RyYXNcIixcbiAgXCJ2b3NvdHJvc1wiLFxuICBcInZveVwiLFxuICBcInZ1ZXN0cmFcIixcbiAgXCJ2dWVzdHJhc1wiLFxuICBcInZ1ZXN0cm9cIixcbiAgXCJ2dWVzdHJvc1wiLFxuICBcInlcIixcbiAgXCJ5YVwiLFxuICBcInlvXCIsXG4gIFwiw6lsXCIsXG4gIFwiw6lyYW1vc1wiLFxuICBcIsOpc3RhXCIsXG4gIFwiw6lzdGFzXCIsXG4gIFwiw6lzdGVcIixcbiAgXCLDqXN0b3NcIixcbiAgXCLDumx0aW1hXCIsXG4gIFwiw7psdGltYXNcIixcbiAgXCLDumx0aW1vXCIsXG4gIFwiw7psdGltb3NcIlxuXTsiLCJpbXBvcnQgeyBRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFZpc3VhbGl6ZXJCYXNlIH0gZnJvbSBcIi4uL3Zpc3VhbGl6ZXJCYXNlXCI7XG5pbXBvcnQgeyBWaXN1YWxpemF0aW9uTWFuYWdlciB9IGZyb20gXCIuLi92aXN1YWxpemF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHsgdGV4dEhlbHBlciB9IGZyb20gXCIuL3N0b3B3b3Jkcy9pbmRleFwiO1xuaW1wb3J0IFdvcmRDbG91ZExpYiBmcm9tIFwid29yZGNsb3VkXCI7XG5pbXBvcnQgeyBEb2N1bWVudEhlbHBlciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmRDbG91ZEFkYXB0ZXIge1xuICBwcml2YXRlIF93b3JkY2xvdWQ6IGFueTtcblxuICBwdWJsaWMgc3RhdGljIGRyYXdPdXRPZkJvdW5kID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgc2hyaW5rVG9GaXQgPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIGFib3J0VGhyZXNob2xkOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzdGF0aWMgd2VpZ2h0RmFjdG9yID0gMjA7XG5cbiAgcHVibGljIHN0YXRpYyBvbldvcmRjbG91ZENyZWF0aW5nID0gbmV3IEV2ZW50PFxuICAgICAgKHNlbmRlcjogV29yZENsb3VkLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICAgIFdvcmRDbG91ZCxcbiAgICAgIGFueVxuICAgID4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBXb3JkQ2xvdWQpIHt9XG5cbiAgcHVibGljIGdldCB3b3JkY2xvdWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5tb2RlbC5nZXREYXRhKCk7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5tb2RlbC5nZXRDb2xvcnMoKTtcbiAgICBjb25zdCBjYW52YXNOb2RlID0gPEhUTUxDYW52YXNFbGVtZW50PihcbiAgICAgIERvY3VtZW50SGVscGVyLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiwgXCJcIilcbiAgICApO1xuICAgIGNvbnN0IGVtcHR5VGV4dE5vZGUgPSA8SFRNTEVsZW1lbnQ+RG9jdW1lbnRIZWxwZXIuY3JlYXRlRWxlbWVudChcInBcIiwgXCJcIiwge1xuICAgICAgaW5uZXJUZXh0OiBsb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9SZXN1bHRzXCIpLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKGVtcHR5VGV4dE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2FudmFzTm9kZSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBsaXN0OiBkYXRhLFxuICAgICAgd2VpZ2h0RmFjdG9yOiBXb3JkQ2xvdWRBZGFwdGVyLndlaWdodEZhY3RvcixcbiAgICAgIGFib3J0VGhyZXNob2xkOiBXb3JkQ2xvdWRBZGFwdGVyLmFib3J0VGhyZXNob2xkLFxuICAgICAgZHJhd091dE9mQm91bmQ6IFdvcmRDbG91ZEFkYXB0ZXIuZHJhd091dE9mQm91bmQsXG4gICAgICBzaHJpbmtUb0ZpdDogV29yZENsb3VkQWRhcHRlci5zaHJpbmtUb0ZpdCxcbiAgICAgIGZvbnRGYW1pbHk6IFwiU2Vnb2UgVUkgQm9sZCwgc2Fucy1zZXJpZlwiLFxuICAgICAgY29sb3I6ICh3b3JkOiBzdHJpbmcsIHdlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmdldFJhbmRvbUNvbG9yKCk7XG4gICAgICB9LFxuICAgICAgcm90YXRlUmF0aW86IDAuNSxcbiAgICAgIHJvdGF0aW9uU3RlcHM6IDIsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMubW9kZWwuYmFja2dyb3VuZENvbG9yLFxuICAgICAgY2xpY2s6IGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coaXRlbVswXSArIFwiOiBcIiArIGl0ZW1bMV0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNhbnZhczogY2FudmFzTm9kZSxcbiAgICAgIGNvbmZpZ1xuICAgIH07XG4gICAgV29yZENsb3VkQWRhcHRlci5vbldvcmRjbG91ZENyZWF0aW5nLmZpcmUodGhpcy5tb2RlbCwgb3B0aW9ucyk7XG4gICAgdGhpcy5fd29yZGNsb3VkID0gV29yZENsb3VkTGliKG9wdGlvbnMuY2FudmFzLCBvcHRpb25zLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRjbG91ZDtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KG5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fd29yZGNsb3VkID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JkQ2xvdWQgZXh0ZW5kcyBWaXN1YWxpemVyQmFzZSB7XG4gIHByaXZhdGUgX3dvcmRjbG91ZEFkYXB0ZXI6IFdvcmRDbG91ZEFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IEFycmF5PHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT4sXG4gICAgb3B0aW9ucz86IE9iamVjdCxcbiAgICBuYW1lPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHF1ZXN0aW9uLCBkYXRhLCBvcHRpb25zLCBuYW1lIHx8IFwid29yZGNsb3VkXCIpO1xuICAgIHRoaXMuX3dvcmRjbG91ZEFkYXB0ZXIgPSBuZXcgV29yZENsb3VkQWRhcHRlcih0aGlzKTtcbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgbGV0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gICAgbGV0IHN0b3BXb3Jkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBsb2NhbGUgPSBsb2NhbGl6YXRpb24uY3VycmVudExvY2FsZTtcbiAgICBpZiAobG9jYWxlKSB7XG4gICAgICBzdG9wV29yZHMgPSB0ZXh0SGVscGVyLmdldFN0b3BXb3Jkcyhsb2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9wV29yZHMgPSB0ZXh0SGVscGVyLmdldFN0b3BXb3JkcygpO1xuICAgIH1cblxuICAgIGxldCBzdG9wVGhlV29yZCA9ICh3b3JkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChzdG9wV29yZHMuaW5kZXhPZih3b3JkKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yZDtcbiAgICB9O1xuXG4gICAgbGV0IHByb2Nlc3NTdHJpbmcgPSAocm93OiBzdHJpbmcpID0+IHtcbiAgICAgIHJvdyA9IFwiXCIgKyByb3c7XG5cbiAgICAgIGlmIChyb3cubGVuZ3RoID4gMTUpIHJvdyA9IHJvdy5zdWJzdHJpbmcoMCwgMTQpICsgXCIuLi5cIjtcblxuICAgICAgaWYgKCEhcm93KSB7XG4gICAgICAgIHJvdy5zcGxpdChcIiBcIikuZm9yRWFjaCgod29yZCkgPT4ge1xuICAgICAgICAgIHdvcmQgPSBzdG9wVGhlV29yZCh3b3JkLnRvTG93ZXJDYXNlKCkgfHwgXCJcIik7XG4gICAgICAgICAgaWYgKCEhd29yZCkge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHRbd29yZF0pIHtcbiAgICAgICAgICAgICAgcmVzdWx0W3dvcmRdID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdFt3b3JkXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IHJvd1ZhbHVlOiBhbnkgPSByb3dbdGhpcy5xdWVzdGlvbi5uYW1lXTtcbiAgICAgIGlmICghIXJvd1ZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1ZhbHVlKSkge1xuICAgICAgICAgIHJvd1ZhbHVlLmZvckVhY2gocHJvY2Vzc1N0cmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocm93VmFsdWUpLmZvckVhY2goKGtleSkgPT5cbiAgICAgICAgICAgICAgcHJvY2Vzc1N0cmluZyhyb3dWYWx1ZVtrZXldKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzc1N0cmluZyhyb3dWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIFtrZXksIHJlc3VsdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXN0cm95Q29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fd29yZGNsb3VkQWRhcHRlci5kZXN0cm95KGNvbnRhaW5lcik7XG4gICAgc3VwZXIuZGVzdHJveUNvbnRlbnQoY29udGFpbmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl93b3JkY2xvdWRBZGFwdGVyLmNyZWF0ZShjb250YWluZXIpO1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250ZW50Q29udGFpbmVyKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fd29yZGNsb3VkQWRhcHRlci5kZXN0cm95KHRoaXMuY29udGVudENvbnRhaW5lcik7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG59XG5cblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcInRleHRcIiwgV29yZENsb3VkKTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcImNvbW1lbnRcIiwgV29yZENsb3VkKTtcblZpc3VhbGl6YXRpb25NYW5hZ2VyLnJlZ2lzdGVyVmlzdWFsaXplcihcIm11bHRpcGxldGV4dFwiLCBXb3JkQ2xvdWQpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3Bsb3RseV9qc19kaXN0X21pbl9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9zdXJ2ZXlfY29yZV9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV93b3JkY2xvdWRfXzsiXSwic291cmNlUm9vdCI6IiJ9
|