@valbuild/ui 0.43.0 → 0.43.1
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/dist/valbuild-ui.cjs.js +1 -1
- package/dist/valbuild-ui.esm.js +1 -1
- package/package.json +3 -3
- package/server/.tmp/assets/{index-3OuTk_rp.js → index-ytYjbYsf.js} +1 -1
- package/server/.tmp/index.html +1 -1
- package/server/dist/valbuild-ui-main.cjs.js +1 -1
- package/server/dist/valbuild-ui-main.esm.js +1 -1
- package/server/dist/valbuild-ui-server.cjs.js +1 -1
- package/server/dist/valbuild-ui-server.esm.js +1 -1
|
@@ -17,7 +17,7 @@ function getServerMimeType(path) {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
const files = JSON.parse(
|
|
20
|
-
`{"/assets/index-3OuTk_rp.js":"dmFyIHZiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeWI9KHQsZSxuKT0+ZSBpbiB0P3ZiKHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjt2YXIgSmU9KHQsZSxuKT0+KHliKHQsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSxuKSxuKSx4Yj0odCxlLG4pPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciB0aD0odCxlLG4pPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxuKX07dmFyIEd1PSh0LGUsbik9Pih4Yih0LGUsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIGtfKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9ZVtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgaSBpbiByKWlmKGkhPT0iZGVmYXVsdCImJiEoaSBpbiB0KSl7Y29uc3Qgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSk7byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltpXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKGUmJmUuc3VwcG9ydHMmJmUuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIoaSk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoaT0+e2Zvcihjb25zdCBvIG9mIGkpaWYoby50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2Ygby5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4oaSl7Y29uc3Qgbz17fTtyZXR1cm4gaS5pbnRlZ3JpdHkmJihvLmludGVncml0eT1pLmludGVncml0eSksaS5yZWZlcnJlclBvbGljeSYmKG8ucmVmZXJyZXJQb2xpY3k9aS5yZWZlcnJlclBvbGljeSksaS5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP28uY3JlZGVudGlhbHM9ImluY2x1ZGUiOmkuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9vLmNyZWRlbnRpYWxzPSJvbWl0IjpvLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsb31mdW5jdGlvbiByKGkpe2lmKGkuZXApcmV0dXJuO2kuZXA9ITA7Y29uc3Qgbz1uKGkpO2ZldGNoKGkuaHJlZixvKX19KSgpO2Z1bmN0aW9uIFR1KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIGJfPXtleHBvcnRzOnt9fSxQZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBOdT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksX2I9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksd2I9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxTYj1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLEViPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksQ2I9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxrYj1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksYmI9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSwkYj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFRiPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxOYj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksY3k9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFJiKHQpe3JldHVybiB0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiP251bGw6KHQ9Y3kmJnRbY3ldfHx0WyJAQGl0ZXJhdG9yIl0sdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dDpudWxsKX12YXIgJF89e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LFRfPU9iamVjdC5hc3NpZ24sTl89e307ZnVuY3Rpb24geXModCxlLG4pe3RoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLnJlZnM9Tl8sdGhpcy51cGRhdGVyPW58fCRffXlzLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O3lzLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiImJnQhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyx0LGUsInNldFN0YXRlIil9O3lzLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsdCwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gUl8oKXt9Ul8ucHJvdG90eXBlPXlzLnByb3RvdHlwZTtmdW5jdGlvbiBKZyh0LGUsbil7dGhpcy5wcm9wcz10LHRoaXMuY29udGV4dD1lLHRoaXMucmVmcz1OXyx0aGlzLnVwZGF0ZXI9bnx8JF99dmFyIHFnPUpnLnByb3RvdHlwZT1uZXcgUl87cWcuY29uc3RydWN0b3I9Smc7VF8ocWcseXMucHJvdG90eXBlKTtxZy5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgZHk9QXJyYXkuaXNBcnJheSxPXz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGVtPXtjdXJyZW50Om51bGx9LFBfPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gQV8odCxlLG4pe3ZhciByLGk9e30sbz1udWxsLGw9bnVsbDtpZihlIT1udWxsKWZvcihyIGluIGUucmVmIT09dm9pZCAwJiYobD1lLnJlZiksZS5rZXkhPT12b2lkIDAmJihvPSIiK2Uua2V5KSxlKU9fLmNhbGwoZSxyKSYmIVBfLmhhc093blByb3BlcnR5KHIpJiYoaVtyXT1lW3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpaS5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtpLmNoaWxkcmVuPWF9aWYodCYmdC5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz10LmRlZmF1bHRQcm9wcyxzKWlbcl09PT12b2lkIDAmJihpW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpOdSx0eXBlOnQsa2V5Om8scmVmOmwscHJvcHM6aSxfb3duZXI6ZW0uY3VycmVudH19ZnVuY3Rpb24gT2IodCxlKXtyZXR1cm57JCR0eXBlb2Y6TnUsdHlwZTp0LnR5cGUsa2V5OmUscmVmOnQucmVmLHByb3BzOnQucHJvcHMsX293bmVyOnQuX293bmVyfX1mdW5jdGlvbiB0bSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmdC4kJHR5cGVvZj09PU51fWZ1bmN0aW9uIFBiKHQpe3ZhciBlPXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK3QucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfSl9dmFyIGZ5PS9cLysvZztmdW5jdGlvbiBuaCh0LGUpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsJiZ0LmtleSE9bnVsbD9QYigiIit0LmtleSk6ZS50b1N0cmluZygzNil9ZnVuY3Rpb24gVGModCxlLG4scixpKXt2YXIgbz10eXBlb2YgdDsobz09PSJ1bmRlZmluZWQifHxvPT09ImJvb2xlYW4iKSYmKHQ9bnVsbCk7dmFyIGw9ITE7aWYodD09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChvKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIE51OmNhc2UgX2I6bD0hMH19aWYobClyZXR1cm4gbD10LGk9aShsKSx0PXI9PT0iIj8iLiIrbmgobCwwKTpyLGR5KGkpPyhuPSIiLHQhPW51bGwmJihuPXQucmVwbGFjZShmeSwiJCYvIikrIi8iKSxUYyhpLGUsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTppIT1udWxsJiYodG0oaSkmJihpPU9iKGksbisoIWkua2V5fHxsJiZsLmtleT09PWkua2V5PyIiOigiIitpLmtleSkucmVwbGFjZShmeSwiJCYvIikrIi8iKSt0KSksZS5wdXNoKGkpKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsZHkodCkpZm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKyspe289dFtzXTt2YXIgYT1yK25oKG8scyk7bCs9VGMobyxlLG4sYSxpKX1lbHNlIGlmKGE9UmIodCksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKHQ9YS5jYWxsKHQpLHM9MDshKG89dC5uZXh0KCkpLmRvbmU7KW89by52YWx1ZSxhPXIrbmgobyxzKyspLGwrPVRjKG8sZSxuLGEsaSk7ZWxzZSBpZihvPT09Im9iamVjdCIpdGhyb3cgZT1TdHJpbmcodCksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisoZT09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQpLmpvaW4oIiwgIikrIn0iOmUpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gWXUodCxlLG4pe2lmKHQ9PW51bGwpcmV0dXJuIHQ7dmFyIHI9W10saT0wO3JldHVybiBUYyh0LHIsIiIsIiIsZnVuY3Rpb24obyl7cmV0dXJuIGUuY2FsbChuLG8saSsrKX0pLHJ9ZnVuY3Rpb24gQWIodCl7aWYodC5fc3RhdHVzPT09LTEpe3ZhciBlPXQuX3Jlc3VsdDtlPWUoKSxlLnRoZW4oZnVuY3Rpb24obil7KHQuX3N0YXR1cz09PTB8fHQuX3N0YXR1cz09PS0xKSYmKHQuX3N0YXR1cz0xLHQuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KHQuX3N0YXR1cz09PTB8fHQuX3N0YXR1cz09PS0xKSYmKHQuX3N0YXR1cz0yLHQuX3Jlc3VsdD1uKX0pLHQuX3N0YXR1cz09PS0xJiYodC5fc3RhdHVzPTAsdC5fcmVzdWx0PWUpfWlmKHQuX3N0YXR1cz09PTEpcmV0dXJuIHQuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IHQuX3Jlc3VsdH12YXIgeG49e2N1cnJlbnQ6bnVsbH0sTmM9e3RyYW5zaXRpb246bnVsbH0sTWI9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6eG4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6TmMsUmVhY3RDdXJyZW50T3duZXI6ZW19O1BlLkNoaWxkcmVuPXttYXA6WXUsZm9yRWFjaDpmdW5jdGlvbih0LGUsbil7WXUodCxmdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm4gWXUodCxmdW5jdGlvbigpe2UrK30pLGV9LHRvQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIFl1KHQsZnVuY3Rpb24oZSl7cmV0dXJuIGV9KXx8W119LG9ubHk6ZnVuY3Rpb24odCl7aWYoIXRtKHQpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gdH19O1BlLkNvbXBvbmVudD15cztQZS5GcmFnbWVudD13YjtQZS5Qcm9maWxlcj1FYjtQZS5QdXJlQ29tcG9uZW50PUpnO1BlLlN0cmljdE1vZGU9U2I7UGUuU3VzcGVuc2U9JGI7UGUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9TWI7UGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXtpZih0PT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK3QrIi4iKTt2YXIgcj1UXyh7fSx0LnByb3BzKSxpPXQua2V5LG89dC5yZWYsbD10Ll9vd25lcjtpZihlIT1udWxsKXtpZihlLnJlZiE9PXZvaWQgMCYmKG89ZS5yZWYsbD1lbS5jdXJyZW50KSxlLmtleSE9PXZvaWQgMCYmKGk9IiIrZS5rZXkpLHQudHlwZSYmdC50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz10LnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIGUpT18uY2FsbChlLGEpJiYhUF8uaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPWVbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTplW2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOk51LHR5cGU6dC50eXBlLGtleTppLHJlZjpvLHByb3BzOnIsX293bmVyOmx9fTtQZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXskJHR5cGVvZjprYixfY3VycmVudFZhbHVlOnQsX2N1cnJlbnRWYWx1ZTI6dCxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LHQuUHJvdmlkZXI9eyQkdHlwZW9mOkNiLF9jb250ZXh0OnR9LHQuQ29uc3VtZXI9dH07UGUuY3JlYXRlRWxlbWVudD1BXztQZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKHQpe3ZhciBlPUFfLmJpbmQobnVsbCx0KTtyZXR1cm4gZS50eXBlPXQsZX07UGUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1BlLmZvcndhcmRSZWY9ZnVuY3Rpb24odCl7cmV0dXJueyQkdHlwZW9mOmJiLHJlbmRlcjp0fX07UGUuaXNWYWxpZEVsZW1lbnQ9dG07UGUubGF6eT1mdW5jdGlvbih0KXtyZXR1cm57JCR0eXBlb2Y6TmIsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDp0fSxfaW5pdDpBYn19O1BlLm1lbW89ZnVuY3Rpb24odCxlKXtyZXR1cm57JCR0eXBlb2Y6VGIsdHlwZTp0LGNvbXBhcmU6ZT09PXZvaWQgMD9udWxsOmV9fTtQZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9TmMudHJhbnNpdGlvbjtOYy50cmFuc2l0aW9uPXt9O3RyeXt0KCl9ZmluYWxseXtOYy50cmFuc2l0aW9uPWV9fTtQZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07UGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4geG4uY3VycmVudC51c2VDYWxsYmFjayh0LGUpfTtQZS51c2VDb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jdXJyZW50LnVzZUNvbnRleHQodCl9O1BlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1BlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZSh0KX07UGUudXNlRWZmZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRWZmZWN0KHQsZSl9O1BlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlSWQoKX07UGUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZSh0LGUsbil9O1BlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB4bi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdCh0LGUpfTtQZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geG4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QodCxlKX07UGUudXNlTWVtbz1mdW5jdGlvbih0LGUpe3JldHVybiB4bi5jdXJyZW50LnVzZU1lbW8odCxlKX07UGUudXNlUmVkdWNlcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlUmVkdWNlcih0LGUsbil9O1BlLnVzZVJlZj1mdW5jdGlvbih0KXtyZXR1cm4geG4uY3VycmVudC51c2VSZWYodCl9O1BlLnVzZVN0YXRlPWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jdXJyZW50LnVzZVN0YXRlKHQpfTtQZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUodCxlLG4pfTtQZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtQZS52ZXJzaW9uPSIxOC4yLjAiO2JfLmV4cG9ydHM9UGU7dmFyIHA9Yl8uZXhwb3J0cztjb25zdCByZT1UdShwKSxNXz1rXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpyZX0sW3BdKTt2YXIgWGg9e30sTF89e2V4cG9ydHM6e319LFZuPXt9LElfPXtleHBvcnRzOnt9fSxEXz17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShFLEEpe3ZhciBOPUUubGVuZ3RoO0UucHVzaChBKTtlOmZvcig7MDxOOyl7dmFyIEY9Ti0xPj4+MSxLPUVbRl07aWYoMDxpKEssQSkpRVtGXT1BLEVbTl09SyxOPUY7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBuKEUpe3JldHVybiBFLmxlbmd0aD09PTA/bnVsbDpFWzBdfWZ1bmN0aW9uIHIoRSl7aWYoRS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciBBPUVbMF0sTj1FLnBvcCgpO2lmKE4hPT1BKXtFWzBdPU47ZTpmb3IodmFyIEY9MCxLPUUubGVuZ3RoLGRlPUs+Pj4xO0Y8ZGU7KXt2YXIgc2U9MiooRisxKS0xLEFlPUVbc2VdLE5lPXNlKzEsUT1FW05lXTtpZigwPmkoQWUsTikpTmU8SyYmMD5pKFEsQWUpPyhFW0ZdPVEsRVtOZV09TixGPU5lKTooRVtGXT1BZSxFW3NlXT1OLEY9c2UpO2Vsc2UgaWYoTmU8SyYmMD5pKFEsTikpRVtGXT1RLEVbTmVdPU4sRj1OZTtlbHNlIGJyZWFrIGV9fXJldHVybiBBfWZ1bmN0aW9uIGkoRSxBKXt2YXIgTj1FLnNvcnRJbmRleC1BLnNvcnRJbmRleDtyZXR1cm4gTiE9PTA/TjpFLmlkLUEuaWR9aWYodHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIG89cGVyZm9ybWFuY2U7dC51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gby5ub3coKX19ZWxzZXt2YXIgbD1EYXRlLHM9bC5ub3coKTt0LnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpLXN9fXZhciBhPVtdLHU9W10sYz0xLGQ9bnVsbCxmPTMsaD0hMSxtPSExLGc9ITEsdz10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHk9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24geChFKXtmb3IodmFyIEE9bih1KTtBIT09bnVsbDspe2lmKEEuY2FsbGJhY2s9PT1udWxsKXIodSk7ZWxzZSBpZihBLnN0YXJ0VGltZTw9RSlyKHUpLEEuc29ydEluZGV4PUEuZXhwaXJhdGlvblRpbWUsZShhLEEpO2Vsc2UgYnJlYWs7QT1uKHUpfX1mdW5jdGlvbiBTKEUpe2lmKGc9ITEseChFKSwhbSlpZihuKGEpIT09bnVsbCltPSEwLEMoYik7ZWxzZXt2YXIgQT1uKHUpO0EhPT1udWxsJiZrKFMsQS5zdGFydFRpbWUtRSl9fWZ1bmN0aW9uIGIoRSxBKXttPSExLGcmJihnPSExLHYoTyksTz0tMSksaD0hMDt2YXIgTj1mO3RyeXtmb3IoeChBKSxkPW4oYSk7ZCE9PW51bGwmJighKGQuZXhwaXJhdGlvblRpbWU+QSl8fEUmJiFEKCkpOyl7dmFyIEY9ZC5jYWxsYmFjaztpZih0eXBlb2YgRj09ImZ1bmN0aW9uIil7ZC5jYWxsYmFjaz1udWxsLGY9ZC5wcmlvcml0eUxldmVsO3ZhciBLPUYoZC5leHBpcmF0aW9uVGltZTw9QSk7QT10LnVuc3RhYmxlX25vdygpLHR5cGVvZiBLPT0iZnVuY3Rpb24iP2QuY2FsbGJhY2s9SzpkPT09bihhKSYmcihhKSx4KEEpfWVsc2UgcihhKTtkPW4oYSl9aWYoZCE9PW51bGwpdmFyIGRlPSEwO2Vsc2V7dmFyIHNlPW4odSk7c2UhPT1udWxsJiZrKFMsc2Uuc3RhcnRUaW1lLUEpLGRlPSExfXJldHVybiBkZX1maW5hbGx5e2Q9bnVsbCxmPU4saD0hMX19dmFyIFQ9ITEsJD1udWxsLE89LTEsTD01LFA9LTE7ZnVuY3Rpb24gRCgpe3JldHVybiEodC51bnN0YWJsZV9ub3coKS1QPEwpfWZ1bmN0aW9uIEIoKXtpZigkIT09bnVsbCl7dmFyIEU9dC51bnN0YWJsZV9ub3coKTtQPUU7dmFyIEE9ITA7dHJ5e0E9JCghMCxFKX1maW5hbGx5e0E/b2UoKTooVD0hMSwkPW51bGwpfX1lbHNlIFQ9ITF9dmFyIG9lO2lmKHR5cGVvZiB5PT0iZnVuY3Rpb24iKW9lPWZ1bmN0aW9uKCl7eShCKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgSD1uZXcgTWVzc2FnZUNoYW5uZWwsWj1ILnBvcnQyO0gucG9ydDEub25tZXNzYWdlPUIsb2U9ZnVuY3Rpb24oKXtaLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIG9lPWZ1bmN0aW9uKCl7dyhCLDApfTtmdW5jdGlvbiBDKEUpeyQ9RSxUfHwoVD0hMCxvZSgpKX1mdW5jdGlvbiBrKEUsQSl7Tz13KGZ1bmN0aW9uKCl7RSh0LnVuc3RhYmxlX25vdygpKX0sQSl9dC51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSx0LnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsdC51bnN0YWJsZV9Mb3dQcmlvcml0eT00LHQudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9Myx0LnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLHQudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9Mix0LnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKEUpe0UuY2FsbGJhY2s9bnVsbH0sdC51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe218fGh8fChtPSEwLEMoYikpfSx0LnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKEUpezA+RXx8MTI1PEU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6TD0wPEU/TWF0aC5mbG9vcigxZTMvRSk6NX0sdC51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBmfSx0LnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oYSl9LHQudW5zdGFibGVfbmV4dD1mdW5jdGlvbihFKXtzd2l0Y2goZil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIEE9MzticmVhaztkZWZhdWx0OkE9Zn12YXIgTj1mO2Y9QTt0cnl7cmV0dXJuIEUoKX1maW5hbGx5e2Y9Tn19LHQudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9LHQudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fSx0LnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihFLEEpe3N3aXRjaChFKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6RT0zfXZhciBOPWY7Zj1FO3RyeXtyZXR1cm4gQSgpfWZpbmFsbHl7Zj1OfX0sdC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKEUsQSxOKXt2YXIgRj10LnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgTj09Im9iamVjdCImJk4hPT1udWxsPyhOPU4uZGVsYXksTj10eXBlb2YgTj09Im51bWJlciImJjA8Tj9GK046Rik6Tj1GLEUpe2Nhc2UgMTp2YXIgSz0tMTticmVhaztjYXNlIDI6Sz0yNTA7YnJlYWs7Y2FzZSA1Oks9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6Sz0xZTQ7YnJlYWs7ZGVmYXVsdDpLPTVlM31yZXR1cm4gSz1OK0ssRT17aWQ6YysrLGNhbGxiYWNrOkEscHJpb3JpdHlMZXZlbDpFLHN0YXJ0VGltZTpOLGV4cGlyYXRpb25UaW1lOkssc29ydEluZGV4Oi0xfSxOPkY/KEUuc29ydEluZGV4PU4sZSh1LEUpLG4oYSk9PT1udWxsJiZFPT09bih1KSYmKGc/KHYoTyksTz0tMSk6Zz0hMCxrKFMsTi1GKSkpOihFLnNvcnRJbmRleD1LLGUoYSxFKSxtfHxofHwobT0hMCxDKGIpKSksRX0sdC51bnN0YWJsZV9zaG91bGRZaWVsZD1ELHQudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKEUpe3ZhciBBPWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIE49ZjtmPUE7dHJ5e3JldHVybiBFLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2Y9Tn19fX0pKERfKTtJXy5leHBvcnRzPURfO3ZhciBMYj1JXy5leHBvcnRzOy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBqXz1wLEJuPUxiO2Z1bmN0aW9uIFcodCl7Zm9yKHZhciBlPSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK3Qsbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZSs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrdCsiOyB2aXNpdCAiK2UrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgel89bmV3IFNldCxJYT17fTtmdW5jdGlvbiBlbCh0LGUpe2VzKHQsZSksZXModCsiQ2FwdHVyZSIsZSl9ZnVuY3Rpb24gZXModCxlKXtmb3IoSWFbdF09ZSx0PTA7dDxlLmxlbmd0aDt0Kyspel8uYWRkKGVbdF0pfXZhciBkaT0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksUWg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJYj0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGh5PXt9LHB5PXt9O2Z1bmN0aW9uIERiKHQpe3JldHVybiBRaC5jYWxsKHB5LHQpPyEwOlFoLmNhbGwoaHksdCk/ITE6SWIudGVzdCh0KT9weVt0XT0hMDooaHlbdF09ITAsITEpfWZ1bmN0aW9uIGpiKHQsZSxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOih0PXQudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLHQhPT0iZGF0YS0iJiZ0IT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gemIodCxlLG4scil7aWYoZT09PW51bGx8fHR5cGVvZiBlPiJ1Inx8amIodCxlLG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIWU7Y2FzZSA0OnJldHVybiBlPT09ITE7Y2FzZSA1OnJldHVybiBpc05hTihlKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGUpfHwxPmV9cmV0dXJuITF9ZnVuY3Rpb24gX24odCxlLG4scixpLG8sbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9ZT09PTJ8fGU9PT0zfHxlPT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1pLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9dCx0aGlzLnR5cGU9ZSx0aGlzLnNhbml0aXplVVJMPW8sdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBHdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsMCwhMSx0LG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF07R3RbZV09bmV3IF9uKGUsMSwhMSx0WzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0d0W3RdPW5ldyBfbih0LDIsITEsdC50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwyLCExLHQsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0d0W3RdPW5ldyBfbih0LDMsITEsdC50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwzLCEwLHQsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsNCwhMSx0LG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCw2LCExLHQsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsNSwhMSx0LnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgbm09L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHJtKHQpe3JldHVybiB0WzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwxLCExLHQudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0d0LnhsaW5rSHJlZj1uZXcgX24oInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwxLCExLHQudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIGltKHQsZSxuLHIpe3ZhciBpPUd0Lmhhc093blByb3BlcnR5KGUpP0d0W2VdOm51bGw7KGkhPT1udWxsP2kudHlwZSE9PTA6cnx8ISgyPGUubGVuZ3RoKXx8ZVswXSE9PSJvIiYmZVswXSE9PSJPInx8ZVsxXSE9PSJuIiYmZVsxXSE9PSJOIikmJih6YihlLG4saSxyKSYmKG49bnVsbCkscnx8aT09PW51bGw/RGIoZSkmJihuPT09bnVsbD90LnJlbW92ZUF0dHJpYnV0ZShlKTp0LnNldEF0dHJpYnV0ZShlLCIiK24pKTppLm11c3RVc2VQcm9wZXJ0eT90W2kucHJvcGVydHlOYW1lXT1uPT09bnVsbD9pLnR5cGU9PT0zPyExOiIiOm46KGU9aS5hdHRyaWJ1dGVOYW1lLHI9aS5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/dC5yZW1vdmVBdHRyaWJ1dGUoZSk6KGk9aS50eXBlLG49aT09PTN8fGk9PT00JiZuPT09ITA/IiI6IiIrbixyP3Quc2V0QXR0cmlidXRlTlMocixlLG4pOnQuc2V0QXR0cmlidXRlKGUsbikpKSl9dmFyIHhpPWpfLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELFh1PVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxibD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSwkbD1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLG9tPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksSmg9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxGXz1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLEJfPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxsbT1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLHFoPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksZXA9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLHNtPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxBaT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksVV89U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIiksZ3k9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEZzKHQpe3JldHVybiB0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiP251bGw6KHQ9Z3kmJnRbZ3ldfHx0WyJAQGl0ZXJhdG9yIl0sdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dDpudWxsKX12YXIgZ3Q9T2JqZWN0LmFzc2lnbixyaDtmdW5jdGlvbiBvYSh0KXtpZihyaD09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgZT1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7cmg9ZSYmZVsxXXx8IiJ9cmV0dXJuYApgK3JoK3R9dmFyIGloPSExO2Z1bmN0aW9uIG9oKHQsZSl7aWYoIXR8fGloKXJldHVybiIiO2loPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoZSlpZihlPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KGUsW10pfWNhdGNoKHUpe3ZhciByPXV9UmVmbGVjdC5jb25zdHJ1Y3QodCxbXSxlKX1lbHNle3RyeXtlLmNhbGwoKX1jYXRjaCh1KXtyPXV9dC5jYWxsKGUucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3I9dX10KCl9fWNhdGNoKHUpe2lmKHUmJnImJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBpPXUuc3RhY2suc3BsaXQoYApgKSxvPXIuc3RhY2suc3BsaXQoYApgKSxsPWkubGVuZ3RoLTEscz1vLmxlbmd0aC0xOzE8PWwmJjA8PXMmJmlbbF0hPT1vW3NdOylzLS07Zm9yKDsxPD1sJiYwPD1zO2wtLSxzLS0paWYoaVtsXSE9PW9bc10pe2lmKGwhPT0xfHxzIT09MSlkbyBpZihsLS0scy0tLDA+c3x8aVtsXSE9PW9bc10pe3ZhciBhPWAKYCtpW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiB0LmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+Iix0LmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7aWg9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4odD10P3QuZGlzcGxheU5hbWV8fHQubmFtZToiIik/b2EodCk6IiJ9ZnVuY3Rpb24gRmIodCl7c3dpdGNoKHQudGFnKXtjYXNlIDU6cmV0dXJuIG9hKHQudHlwZSk7Y2FzZSAxNjpyZXR1cm4gb2EoIkxhenkiKTtjYXNlIDEzOnJldHVybiBvYSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBvYSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiB0PW9oKHQudHlwZSwhMSksdDtjYXNlIDExOnJldHVybiB0PW9oKHQudHlwZS5yZW5kZXIsITEpLHQ7Y2FzZSAxOnJldHVybiB0PW9oKHQudHlwZSwhMCksdDtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiB0cCh0KXtpZih0PT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fG51bGw7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlICRsOnJldHVybiJGcmFnbWVudCI7Y2FzZSBibDpyZXR1cm4iUG9ydGFsIjtjYXNlIEpoOnJldHVybiJQcm9maWxlciI7Y2FzZSBvbTpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBxaDpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgZXA6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIHQ9PSJvYmplY3QiKXN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIEJfOnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgRl86cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBsbTp2YXIgZT10LnJlbmRlcjtyZXR1cm4gdD10LmRpc3BsYXlOYW1lLHR8fCh0PWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdD10IT09IiI/IkZvcndhcmRSZWYoIit0KyIpIjoiRm9yd2FyZFJlZiIpLHQ7Y2FzZSBzbTpyZXR1cm4gZT10LmRpc3BsYXlOYW1lfHxudWxsLGUhPT1udWxsP2U6dHAodC50eXBlKXx8Ik1lbW8iO2Nhc2UgQWk6ZT10Ll9wYXlsb2FkLHQ9dC5faW5pdDt0cnl7cmV0dXJuIHRwKHQoZSkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gQmIodCl7dmFyIGU9dC50eXBlO3N3aXRjaCh0LnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4oZS5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybihlLl9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gdD1lLnJlbmRlcix0PXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZS5kaXNwbGF5TmFtZXx8KHQhPT0iIj8iRm9yd2FyZFJlZigiK3QrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiBlO2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gdHAoZSk7Y2FzZSA4OnJldHVybiBlPT09b20/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8bnVsbDtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdG8odCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiB0O2Nhc2Uib2JqZWN0IjpyZXR1cm4gdDtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBXXyh0KXt2YXIgZT10LnR5cGU7cmV0dXJuKHQ9dC5ub2RlTmFtZSkmJnQudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihlPT09ImNoZWNrYm94Inx8ZT09PSJyYWRpbyIpfWZ1bmN0aW9uIFViKHQpe3ZhciBlPVdfKHQpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSxlKSxyPSIiK3RbZV07aWYoIXQuaGFzT3duUHJvcGVydHkoZSkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBpPW4uZ2V0LG89bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7cj0iIitsLG8uY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGwpe3I9IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7dC5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIHRbZV19fX19ZnVuY3Rpb24gUXUodCl7dC5fdmFsdWVUcmFja2VyfHwodC5fdmFsdWVUcmFja2VyPVViKHQpKX1mdW5jdGlvbiBWXyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10Ll92YWx1ZVRyYWNrZXI7aWYoIWUpcmV0dXJuITA7dmFyIG49ZS5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIHQmJihyPVdfKHQpP3QuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjp0LnZhbHVlKSx0PXIsdCE9PW4/KGUuc2V0VmFsdWUodCksITApOiExfWZ1bmN0aW9uIFljKHQpe2lmKHQ9dHx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgdD4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiB0LmFjdGl2ZUVsZW1lbnR8fHQuYm9keX1jYXRjaHtyZXR1cm4gdC5ib2R5fX1mdW5jdGlvbiBucCh0LGUpe3ZhciBuPWUuY2hlY2tlZDtyZXR1cm4gZ3Qoe30sZSx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/dC5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gbXkodCxlKXt2YXIgbj1lLmRlZmF1bHRWYWx1ZT09bnVsbD8iIjplLmRlZmF1bHRWYWx1ZSxyPWUuY2hlY2tlZCE9bnVsbD9lLmNoZWNrZWQ6ZS5kZWZhdWx0Q2hlY2tlZDtuPXRvKGUudmFsdWUhPW51bGw/ZS52YWx1ZTpuKSx0Ll93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDplLnR5cGU9PT0iY2hlY2tib3gifHxlLnR5cGU9PT0icmFkaW8iP2UuY2hlY2tlZCE9bnVsbDplLnZhbHVlIT1udWxsfX1mdW5jdGlvbiBIXyh0LGUpe2U9ZS5jaGVja2VkLGUhPW51bGwmJmltKHQsImNoZWNrZWQiLGUsITEpfWZ1bmN0aW9uIHJwKHQsZSl7SF8odCxlKTt2YXIgbj10byhlLnZhbHVlKSxyPWUudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJnQudmFsdWU9PT0iInx8dC52YWx1ZSE9bikmJih0LnZhbHVlPSIiK24pOnQudmFsdWUhPT0iIituJiYodC52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe3QucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn1lLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP2lwKHQsZS50eXBlLG4pOmUuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZpcCh0LGUudHlwZSx0byhlLmRlZmF1bHRWYWx1ZSkpLGUuY2hlY2tlZD09bnVsbCYmZS5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKHQuZGVmYXVsdENoZWNrZWQ9ISFlLmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiB2eSh0LGUsbil7aWYoZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8ZS5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPWUudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fGUudmFsdWUhPT12b2lkIDAmJmUudmFsdWUhPT1udWxsKSlyZXR1cm47ZT0iIit0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fGU9PT10LnZhbHVlfHwodC52YWx1ZT1lKSx0LmRlZmF1bHRWYWx1ZT1lfW49dC5uYW1lLG4hPT0iIiYmKHQubmFtZT0iIiksdC5kZWZhdWx0Q2hlY2tlZD0hIXQuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJih0Lm5hbWU9bil9ZnVuY3Rpb24gaXAodCxlLG4peyhlIT09Im51bWJlciJ8fFljKHQub3duZXJEb2N1bWVudCkhPT10KSYmKG49PW51bGw/dC5kZWZhdWx0VmFsdWU9IiIrdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTp0LmRlZmF1bHRWYWx1ZSE9PSIiK24mJih0LmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIGxhPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gVWwodCxlLG4scil7aWYodD10Lm9wdGlvbnMsZSl7ZT17fTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyllWyIkIituW2ldXT0hMDtmb3Iobj0wO248dC5sZW5ndGg7bisrKWk9ZS5oYXNPd25Qcm9wZXJ0eSgiJCIrdFtuXS52YWx1ZSksdFtuXS5zZWxlY3RlZCE9PWkmJih0W25dLnNlbGVjdGVkPWkpLGkmJnImJih0W25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIit0byhuKSxlPW51bGwsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZih0W2ldLnZhbHVlPT09bil7dFtpXS5zZWxlY3RlZD0hMCxyJiYodFtpXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1lIT09bnVsbHx8dFtpXS5kaXNhYmxlZHx8KGU9dFtpXSl9ZSE9PW51bGwmJihlLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gb3AodCxlKXtpZihlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKFcoOTEpKTtyZXR1cm4gZ3Qoe30sZSx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIHl5KHQsZSl7dmFyIG49ZS52YWx1ZTtpZihuPT1udWxsKXtpZihuPWUuY2hpbGRyZW4sZT1lLmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZihlIT1udWxsKXRocm93IEVycm9yKFcoOTIpKTtpZihsYShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihXKDkzKSk7bj1uWzBdfWU9bn1lPT1udWxsJiYoZT0iIiksbj1lfXQuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOnRvKG4pfX1mdW5jdGlvbiBLXyh0LGUpe3ZhciBuPXRvKGUudmFsdWUpLHI9dG8oZS5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PXQudmFsdWUmJih0LnZhbHVlPW4pLGUuZGVmYXVsdFZhbHVlPT1udWxsJiZ0LmRlZmF1bHRWYWx1ZSE9PW4mJih0LmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKHQuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIHh5KHQpe3ZhciBlPXQudGV4dENvbnRlbnQ7ZT09PXQuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJmUhPT0iIiYmZSE9PW51bGwmJih0LnZhbHVlPWUpfWZ1bmN0aW9uIFpfKHQpe3N3aXRjaCh0KXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gbHAodCxlKXtyZXR1cm4gdD09bnVsbHx8dD09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9aXyhlKTp0PT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmZT09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6dH12YXIgSnUsR189ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGUsbixyLGkpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIHQoZSxuLHIsaSl9KX06dH0oZnVuY3Rpb24odCxlKXtpZih0Lm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gdCl0LmlubmVySFRNTD1lO2Vsc2V7Zm9yKEp1PUp1fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKdS5pbm5lckhUTUw9Ijxzdmc+IitlLnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLGU9SnUuZmlyc3RDaGlsZDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtmb3IoO2UuZmlyc3RDaGlsZDspdC5hcHBlbmRDaGlsZChlLmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIERhKHQsZSl7aWYoZSl7dmFyIG49dC5maXJzdENoaWxkO2lmKG4mJm49PT10Lmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPWU7cmV0dXJufX10LnRleHRDb250ZW50PWV9dmFyIGhhPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxXYj1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGhhKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1diLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSksaGFbZV09aGFbdF19KX0pO2Z1bmN0aW9uIFlfKHQsZSxuKXtyZXR1cm4gZT09bnVsbHx8dHlwZW9mIGU9PSJib29sZWFuInx8ZT09PSIiPyIiOm58fHR5cGVvZiBlIT0ibnVtYmVyInx8ZT09PTB8fGhhLmhhc093blByb3BlcnR5KHQpJiZoYVt0XT8oIiIrZSkudHJpbSgpOmUrInB4In1mdW5jdGlvbiBYXyh0LGUpe3Q9dC5zdHlsZTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLGk9WV8obixlW25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP3Quc2V0UHJvcGVydHkobixpKTp0W25dPWl9fXZhciBWYj1ndCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBzcCh0LGUpe2lmKGUpe2lmKFZiW3RdJiYoZS5jaGlsZHJlbiE9bnVsbHx8ZS5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoVygxMzcsdCkpO2lmKGUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKGUuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoVyg2MCkpO2lmKHR5cGVvZiBlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIGUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKFcoNjEpKX1pZihlLnN0eWxlIT1udWxsJiZ0eXBlb2YgZS5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoVyg2MikpfX1mdW5jdGlvbiBhcCh0LGUpe2lmKHQuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiBlLmlzPT0ic3RyaW5nIjtzd2l0Y2godCl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgdXA9bnVsbDtmdW5jdGlvbiBhbSh0KXtyZXR1cm4gdD10LnRhcmdldHx8dC5zcmNFbGVtZW50fHx3aW5kb3csdC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKHQ9dC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksdC5ub2RlVHlwZT09PTM/dC5wYXJlbnROb2RlOnR9dmFyIGNwPW51bGwsV2w9bnVsbCxWbD1udWxsO2Z1bmN0aW9uIF95KHQpe2lmKHQ9UHUodCkpe2lmKHR5cGVvZiBjcCE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihXKDI4MCkpO3ZhciBlPXQuc3RhdGVOb2RlO2UmJihlPWFmKGUpLGNwKHQuc3RhdGVOb2RlLHQudHlwZSxlKSl9fWZ1bmN0aW9uIFFfKHQpe1dsP1ZsP1ZsLnB1c2godCk6Vmw9W3RdOldsPXR9ZnVuY3Rpb24gSl8oKXtpZihXbCl7dmFyIHQ9V2wsZT1WbDtpZihWbD1XbD1udWxsLF95KHQpLGUpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylfeShlW3RdKX19ZnVuY3Rpb24gcV8odCxlKXtyZXR1cm4gdChlKX1mdW5jdGlvbiBlMSgpe312YXIgbGg9ITE7ZnVuY3Rpb24gdDEodCxlLG4pe2lmKGxoKXJldHVybiB0KGUsbik7bGg9ITA7dHJ5e3JldHVybiBxXyh0LGUsbil9ZmluYWxseXtsaD0hMSwoV2whPT1udWxsfHxWbCE9PW51bGwpJiYoZTEoKSxKXygpKX19ZnVuY3Rpb24gamEodCxlKXt2YXIgbj10LnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj1hZihuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbZV07ZTpzd2l0Y2goZSl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KHQ9dC50eXBlLHI9ISh0PT09ImJ1dHRvbiJ8fHQ9PT0iaW5wdXQifHx0PT09InNlbGVjdCJ8fHQ9PT0idGV4dGFyZWEiKSksdD0hcjticmVhayBlO2RlZmF1bHQ6dD0hMX1pZih0KXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMjMxLGUsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgZHA9ITE7aWYoZGkpdHJ5e3ZhciBCcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQnMsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtkcD0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsQnMsQnMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixCcyxCcyl9Y2F0Y2h7ZHA9ITF9ZnVuY3Rpb24gSGIodCxlLG4scixpLG8sbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7ZS5hcHBseShuLHUpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIHBhPSExLFhjPW51bGwsUWM9ITEsZnA9bnVsbCxLYj17b25FcnJvcjpmdW5jdGlvbih0KXtwYT0hMCxYYz10fX07ZnVuY3Rpb24gWmIodCxlLG4scixpLG8sbCxzLGEpe3BhPSExLFhjPW51bGwsSGIuYXBwbHkoS2IsYXJndW1lbnRzKX1mdW5jdGlvbiBHYih0LGUsbixyLGksbyxsLHMsYSl7aWYoWmIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHBhKXtpZihwYSl7dmFyIHU9WGM7cGE9ITEsWGM9bnVsbH1lbHNlIHRocm93IEVycm9yKFcoMTk4KSk7UWN8fChRYz0hMCxmcD11KX19ZnVuY3Rpb24gdGwodCl7dmFyIGU9dCxuPXQ7aWYodC5hbHRlcm5hdGUpZm9yKDtlLnJldHVybjspZT1lLnJldHVybjtlbHNle3Q9ZTtkbyBlPXQsZS5mbGFncyY0MDk4JiYobj1lLnJldHVybiksdD1lLnJldHVybjt3aGlsZSh0KX1yZXR1cm4gZS50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBuMSh0KXtpZih0LnRhZz09PTEzKXt2YXIgZT10Lm1lbW9pemVkU3RhdGU7aWYoZT09PW51bGwmJih0PXQuYWx0ZXJuYXRlLHQhPT1udWxsJiYoZT10Lm1lbW9pemVkU3RhdGUpKSxlIT09bnVsbClyZXR1cm4gZS5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIHd5KHQpe2lmKHRsKHQpIT09dCl0aHJvdyBFcnJvcihXKDE4OCkpfWZ1bmN0aW9uIFliKHQpe3ZhciBlPXQuYWx0ZXJuYXRlO2lmKCFlKXtpZihlPXRsKHQpLGU9PT1udWxsKXRocm93IEVycm9yKFcoMTg4KSk7cmV0dXJuIGUhPT10P251bGw6dH1mb3IodmFyIG49dCxyPWU7Oyl7dmFyIGk9bi5yZXR1cm47aWYoaT09PW51bGwpYnJlYWs7dmFyIG89aS5hbHRlcm5hdGU7aWYobz09PW51bGwpe2lmKHI9aS5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihpLmNoaWxkPT09by5jaGlsZCl7Zm9yKG89aS5jaGlsZDtvOyl7aWYobz09PW4pcmV0dXJuIHd5KGkpLHQ7aWYobz09PXIpcmV0dXJuIHd5KGkpLGU7bz1vLnNpYmxpbmd9dGhyb3cgRXJyb3IoVygxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49aSxyPW87ZWxzZXtmb3IodmFyIGw9ITEscz1pLmNoaWxkO3M7KXtpZihzPT09bil7bD0hMCxuPWkscj1vO2JyZWFrfWlmKHM9PT1yKXtsPSEwLHI9aSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihXKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoVygxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoVygxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/dDplfWZ1bmN0aW9uIHIxKHQpe3JldHVybiB0PVliKHQpLHQhPT1udWxsP2kxKHQpOm51bGx9ZnVuY3Rpb24gaTEodCl7aWYodC50YWc9PT01fHx0LnRhZz09PTYpcmV0dXJuIHQ7Zm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspe3ZhciBlPWkxKHQpO2lmKGUhPT1udWxsKXJldHVybiBlO3Q9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBvMT1Cbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFN5PUJuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFhiPUJuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFFiPUJuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxDdD1Cbi51bnN0YWJsZV9ub3csSmI9Qm4udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsdW09Qm4udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksbDE9Qm4udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksSmM9Qm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscWI9Qm4udW5zdGFibGVfTG93UHJpb3JpdHksczE9Qm4udW5zdGFibGVfSWRsZVByaW9yaXR5LHJmPW51bGwsenI9bnVsbDtmdW5jdGlvbiBlJCh0KXtpZih6ciYmdHlwZW9mIHpyLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt6ci5vbkNvbW1pdEZpYmVyUm9vdChyZix0LHZvaWQgMCwodC5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIHhyPU1hdGguY2x6MzI/TWF0aC5jbHozMjpyJCx0JD1NYXRoLmxvZyxuJD1NYXRoLkxOMjtmdW5jdGlvbiByJCh0KXtyZXR1cm4gdD4+Pj0wLHQ9PT0wPzMyOjMxLSh0JCh0KS9uJHwwKXwwfXZhciBxdT02NCxlYz00MTk0MzA0O2Z1bmN0aW9uIHNhKHQpe3N3aXRjaCh0Ji10KXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gdCY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIHQmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBxYyh0LGUpe3ZhciBuPXQucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsaT10LnN1c3BlbmRlZExhbmVzLG89dC5waW5nZWRMYW5lcyxsPW4mMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5pO3MhPT0wP3I9c2Eocyk6KG8mPWwsbyE9PTAmJihyPXNhKG8pKSl9ZWxzZSBsPW4mfmksbCE9PTA/cj1zYShsKTpvIT09MCYmKHI9c2EobykpO2lmKHI9PT0wKXJldHVybiAwO2lmKGUhPT0wJiZlIT09ciYmIShlJmkpJiYoaT1yJi1yLG89ZSYtZSxpPj1vfHxpPT09MTYmJihvJjQxOTQyNDApIT09MCkpcmV0dXJuIGU7aWYociY0JiYocnw9biYxNiksZT10LmVudGFuZ2xlZExhbmVzLGUhPT0wKWZvcih0PXQuZW50YW5nbGVtZW50cyxlJj1yOzA8ZTspbj0zMS14cihlKSxpPTE8PG4scnw9dFtuXSxlJj1+aTtyZXR1cm4gcn1mdW5jdGlvbiBpJCh0LGUpe3N3aXRjaCh0KXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gZSsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBlKzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBvJCh0LGUpe2Zvcih2YXIgbj10LnN1c3BlbmRlZExhbmVzLHI9dC5waW5nZWRMYW5lcyxpPXQuZXhwaXJhdGlvblRpbWVzLG89dC5wZW5kaW5nTGFuZXM7MDxvOyl7dmFyIGw9MzEteHIobykscz0xPDxsLGE9aVtsXTthPT09LTE/KCEocyZuKXx8cyZyKSYmKGlbbF09aSQocyxlKSk6YTw9ZSYmKHQuZXhwaXJlZExhbmVzfD1zKSxvJj1+c319ZnVuY3Rpb24gaHAodCl7cmV0dXJuIHQ9dC5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsdCE9PTA/dDp0JjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIGExKCl7dmFyIHQ9cXU7cmV0dXJuIHF1PDw9MSwhKHF1JjQxOTQyNDApJiYocXU9NjQpLHR9ZnVuY3Rpb24gc2godCl7Zm9yKHZhciBlPVtdLG49MDszMT5uO24rKyllLnB1c2godCk7cmV0dXJuIGV9ZnVuY3Rpb24gUnUodCxlLG4pe3QucGVuZGluZ0xhbmVzfD1lLGUhPT01MzY4NzA5MTImJih0LnN1c3BlbmRlZExhbmVzPTAsdC5waW5nZWRMYW5lcz0wKSx0PXQuZXZlbnRUaW1lcyxlPTMxLXhyKGUpLHRbZV09bn1mdW5jdGlvbiBsJCh0LGUpe3ZhciBuPXQucGVuZGluZ0xhbmVzJn5lO3QucGVuZGluZ0xhbmVzPWUsdC5zdXNwZW5kZWRMYW5lcz0wLHQucGluZ2VkTGFuZXM9MCx0LmV4cGlyZWRMYW5lcyY9ZSx0Lm11dGFibGVSZWFkTGFuZXMmPWUsdC5lbnRhbmdsZWRMYW5lcyY9ZSxlPXQuZW50YW5nbGVtZW50czt2YXIgcj10LmV2ZW50VGltZXM7Zm9yKHQ9dC5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIGk9MzEteHIobiksbz0xPDxpO2VbaV09MCxyW2ldPS0xLHRbaV09LTEsbiY9fm99fWZ1bmN0aW9uIGNtKHQsZSl7dmFyIG49dC5lbnRhbmdsZWRMYW5lc3w9ZTtmb3IodD10LmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLXhyKG4pLGk9MTw8cjtpJmV8dFtyXSZlJiYodFtyXXw9ZSksbiY9fml9fXZhciBXZT0wO2Z1bmN0aW9uIHUxKHQpe3JldHVybiB0Jj0tdCwxPHQ/NDx0P3QmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIGMxLGRtLGQxLGYxLGgxLHBwPSExLHRjPVtdLFZpPW51bGwsSGk9bnVsbCxLaT1udWxsLHphPW5ldyBNYXAsRmE9bmV3IE1hcCxJaT1bXSxzJD0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBFeSh0LGUpe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOlZpPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpIaT1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjpLaT1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6emEuZGVsZXRlKGUucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6RmEuZGVsZXRlKGUucG9pbnRlcklkKX19ZnVuY3Rpb24gVXModCxlLG4scixpLG8pe3JldHVybiB0PT09bnVsbHx8dC5uYXRpdmVFdmVudCE9PW8/KHQ9e2Jsb2NrZWRPbjplLGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDpvLHRhcmdldENvbnRhaW5lcnM6W2ldfSxlIT09bnVsbCYmKGU9UHUoZSksZSE9PW51bGwmJmRtKGUpKSx0KToodC5ldmVudFN5c3RlbUZsYWdzfD1yLGU9dC50YXJnZXRDb250YWluZXJzLGkhPT1udWxsJiZlLmluZGV4T2YoaSk9PT0tMSYmZS5wdXNoKGkpLHQpfWZ1bmN0aW9uIGEkKHQsZSxuLHIsaSl7c3dpdGNoKGUpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIFZpPVVzKFZpLHQsZSxuLHIsaSksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBIaT1VcyhIaSx0LGUsbixyLGkpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gS2k9VXMoS2ksdCxlLG4scixpKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgbz1pLnBvaW50ZXJJZDtyZXR1cm4gemEuc2V0KG8sVXMoemEuZ2V0KG8pfHxudWxsLHQsZSxuLHIsaSkpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBvPWkucG9pbnRlcklkLEZhLnNldChvLFVzKEZhLmdldChvKXx8bnVsbCx0LGUsbixyLGkpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBwMSh0KXt2YXIgZT1Ubyh0LnRhcmdldCk7aWYoZSE9PW51bGwpe3ZhciBuPXRsKGUpO2lmKG4hPT1udWxsKXtpZihlPW4udGFnLGU9PT0xMyl7aWYoZT1uMShuKSxlIT09bnVsbCl7dC5ibG9ja2VkT249ZSxoMSh0LnByaW9yaXR5LGZ1bmN0aW9uKCl7ZDEobil9KTtyZXR1cm59fWVsc2UgaWYoZT09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3QuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19dC5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBSYyh0KXtpZih0LmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciBlPXQudGFyZ2V0Q29udGFpbmVyczswPGUubGVuZ3RoOyl7dmFyIG49Z3AodC5kb21FdmVudE5hbWUsdC5ldmVudFN5c3RlbUZsYWdzLGVbMF0sdC5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249dC5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7dXA9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLHVwPW51bGx9ZWxzZSByZXR1cm4gZT1QdShuKSxlIT09bnVsbCYmZG0oZSksdC5ibG9ja2VkT249biwhMTtlLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gQ3kodCxlLG4pe1JjKHQpJiZuLmRlbGV0ZShlKX1mdW5jdGlvbiB1JCgpe3BwPSExLFZpIT09bnVsbCYmUmMoVmkpJiYoVmk9bnVsbCksSGkhPT1udWxsJiZSYyhIaSkmJihIaT1udWxsKSxLaSE9PW51bGwmJlJjKEtpKSYmKEtpPW51bGwpLHphLmZvckVhY2goQ3kpLEZhLmZvckVhY2goQ3kpfWZ1bmN0aW9uIFdzKHQsZSl7dC5ibG9ja2VkT249PT1lJiYodC5ibG9ja2VkT249bnVsbCxwcHx8KHBwPSEwLEJuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soQm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksdSQpKSl9ZnVuY3Rpb24gQmEodCl7ZnVuY3Rpb24gZShpKXtyZXR1cm4gV3MoaSx0KX1pZigwPHRjLmxlbmd0aCl7V3ModGNbMF0sdCk7Zm9yKHZhciBuPTE7bjx0Yy5sZW5ndGg7bisrKXt2YXIgcj10Y1tuXTtyLmJsb2NrZWRPbj09PXQmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKFZpIT09bnVsbCYmV3MoVmksdCksSGkhPT1udWxsJiZXcyhIaSx0KSxLaSE9PW51bGwmJldzKEtpLHQpLHphLmZvckVhY2goZSksRmEuZm9yRWFjaChlKSxuPTA7bjxJaS5sZW5ndGg7bisrKXI9SWlbbl0sci5ibG9ja2VkT249PT10JiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPElpLmxlbmd0aCYmKG49SWlbMF0sbi5ibG9ja2VkT249PT1udWxsKTspcDEobiksbi5ibG9ja2VkT249PT1udWxsJiZJaS5zaGlmdCgpfXZhciBIbD14aS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxlZD0hMDtmdW5jdGlvbiBjJCh0LGUsbixyKXt2YXIgaT1XZSxvPUhsLnRyYW5zaXRpb247SGwudHJhbnNpdGlvbj1udWxsO3RyeXtXZT0xLGZtKHQsZSxuLHIpfWZpbmFsbHl7V2U9aSxIbC50cmFuc2l0aW9uPW99fWZ1bmN0aW9uIGQkKHQsZSxuLHIpe3ZhciBpPVdlLG89SGwudHJhbnNpdGlvbjtIbC50cmFuc2l0aW9uPW51bGw7dHJ5e1dlPTQsZm0odCxlLG4scil9ZmluYWxseXtXZT1pLEhsLnRyYW5zaXRpb249b319ZnVuY3Rpb24gZm0odCxlLG4scil7aWYoZWQpe3ZhciBpPWdwKHQsZSxuLHIpO2lmKGk9PT1udWxsKXZoKHQsZSxyLHRkLG4pLEV5KHQscik7ZWxzZSBpZihhJChpLHQsZSxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihFeSh0LHIpLGUmNCYmLTE8cyQuaW5kZXhPZih0KSl7Zm9yKDtpIT09bnVsbDspe3ZhciBvPVB1KGkpO2lmKG8hPT1udWxsJiZjMShvKSxvPWdwKHQsZSxuLHIpLG89PT1udWxsJiZ2aCh0LGUscix0ZCxuKSxvPT09aSlicmVhaztpPW99aSE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSB2aCh0LGUscixudWxsLG4pfX12YXIgdGQ9bnVsbDtmdW5jdGlvbiBncCh0LGUsbixyKXtpZih0ZD1udWxsLHQ9YW0ociksdD1Ubyh0KSx0IT09bnVsbClpZihlPXRsKHQpLGU9PT1udWxsKXQ9bnVsbDtlbHNlIGlmKG49ZS50YWcsbj09PTEzKXtpZih0PW4xKGUpLHQhPT1udWxsKXJldHVybiB0O3Q9bnVsbH1lbHNlIGlmKG49PT0zKXtpZihlLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiBlLnRhZz09PTM/ZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3Q9bnVsbH1lbHNlIGUhPT10JiYodD1udWxsKTtyZXR1cm4gdGQ9dCxudWxsfWZ1bmN0aW9uIGcxKHQpe3N3aXRjaCh0KXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChKYigpKXtjYXNlIHVtOnJldHVybiAxO2Nhc2UgbDE6cmV0dXJuIDQ7Y2FzZSBKYzpjYXNlIHFiOnJldHVybiAxNjtjYXNlIHMxOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBGaT1udWxsLGhtPW51bGwsT2M9bnVsbDtmdW5jdGlvbiBtMSgpe2lmKE9jKXJldHVybiBPYzt2YXIgdCxlPWhtLG49ZS5sZW5ndGgscixpPSJ2YWx1ZSJpbiBGaT9GaS52YWx1ZTpGaS50ZXh0Q29udGVudCxvPWkubGVuZ3RoO2Zvcih0PTA7dDxuJiZlW3RdPT09aVt0XTt0KyspO3ZhciBsPW4tdDtmb3Iocj0xO3I8PWwmJmVbbi1yXT09PWlbby1yXTtyKyspO3JldHVybiBPYz1pLnNsaWNlKHQsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIFBjKHQpe3ZhciBlPXQua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gdD8odD10LmNoYXJDb2RlLHQ9PT0wJiZlPT09MTMmJih0PTEzKSk6dD1lLHQ9PT0xMCYmKHQ9MTMpLDMyPD10fHx0PT09MTM/dDowfWZ1bmN0aW9uIG5jKCl7cmV0dXJuITB9ZnVuY3Rpb24ga3koKXtyZXR1cm4hMX1mdW5jdGlvbiBIbih0KXtmdW5jdGlvbiBlKG4scixpLG8sbCl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1pLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9byx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiB0KXQuaGFzT3duUHJvcGVydHkocykmJihuPXRbc10sdGhpc1tzXT1uP24obyk6b1tzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShvLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/by5kZWZhdWx0UHJldmVudGVkOm8ucmV0dXJuVmFsdWU9PT0hMSk/bmM6a3ksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1reSx0aGlzfXJldHVybiBndChlLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPW5jKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPW5jKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50Om5jfSksZX12YXIgeHM9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbih0KXtyZXR1cm4gdC50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0scG09SG4oeHMpLE91PWd0KHt9LHhzLHt2aWV3OjAsZGV0YWlsOjB9KSxmJD1IbihPdSksYWgsdWgsVnMsb2Y9Z3Qoe30sT3Use3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6Z20sYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVsYXRlZFRhcmdldD09PXZvaWQgMD90LmZyb21FbGVtZW50PT09dC5zcmNFbGVtZW50P3QudG9FbGVtZW50OnQuZnJvbUVsZW1lbnQ6dC5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24odCl7cmV0dXJuIm1vdmVtZW50WCJpbiB0P3QubW92ZW1lbnRYOih0IT09VnMmJihWcyYmdC50eXBlPT09Im1vdXNlbW92ZSI/KGFoPXQuc2NyZWVuWC1Wcy5zY3JlZW5YLHVoPXQuc2NyZWVuWS1Wcy5zY3JlZW5ZKTp1aD1haD0wLFZzPXQpLGFoKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKHQpe3JldHVybiJtb3ZlbWVudFkiaW4gdD90Lm1vdmVtZW50WTp1aH19KSxieT1IbihvZiksaCQ9Z3Qoe30sb2Yse2RhdGFUcmFuc2ZlcjowfSkscCQ9SG4oaCQpLGckPWd0KHt9LE91LHtyZWxhdGVkVGFyZ2V0OjB9KSxjaD1IbihnJCksbSQ9Z3Qoe30seHMse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHYkPUhuKG0kKSx5JD1ndCh7fSx4cyx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiB0P3QuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSx4JD1Ibih5JCksXyQ9Z3Qoe30seHMse2RhdGE6MH0pLCR5PUhuKF8kKSx3JD17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sUyQ9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxFJD17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIEMkKHQpe3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGUuZ2V0TW9kaWZpZXJTdGF0ZT9lLmdldE1vZGlmaWVyU3RhdGUodCk6KHQ9RSRbdF0pPyEhZVt0XTohMX1mdW5jdGlvbiBnbSgpe3JldHVybiBDJH12YXIgayQ9Z3Qoe30sT3Use2tleTpmdW5jdGlvbih0KXtpZih0LmtleSl7dmFyIGU9dyRbdC5rZXldfHx0LmtleTtpZihlIT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIGV9cmV0dXJuIHQudHlwZT09PSJrZXlwcmVzcyI/KHQ9UGModCksdD09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSk6dC50eXBlPT09ImtleWRvd24ifHx0LnR5cGU9PT0ia2V5dXAiP1MkW3Qua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpnbSxjaGFyQ29kZTpmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT09ImtleXByZXNzIj9QYyh0KTowfSxrZXlDb2RlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PT0ia2V5ZG93biJ8fHQudHlwZT09PSJrZXl1cCI/dC5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PT0ia2V5cHJlc3MiP1BjKHQpOnQudHlwZT09PSJrZXlkb3duInx8dC50eXBlPT09ImtleXVwIj90LmtleUNvZGU6MH19KSxiJD1IbihrJCksJCQ9Z3Qoe30sb2Yse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksVHk9SG4oJCQpLFQkPWd0KHt9LE91LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6Z219KSxOJD1IbihUJCksUiQ9Z3Qoe30seHMse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksTyQ9SG4oUiQpLFAkPWd0KHt9LG9mLHtkZWx0YVg6ZnVuY3Rpb24odCl7cmV0dXJuImRlbHRhWCJpbiB0P3QuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiB0Py10LndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbih0KXtyZXR1cm4iZGVsdGFZImluIHQ/dC5kZWx0YVk6IndoZWVsRGVsdGFZImluIHQ/LXQud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gdD8tdC53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksQSQ9SG4oUCQpLE0kPVs5LDEzLDI3LDMyXSxtbT1kaSYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGdhPW51bGw7ZGkmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihnYT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBMJD1kaSYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFnYSx2MT1kaSYmKCFtbXx8Z2EmJjg8Z2EmJjExPj1nYSksTnk9IiAiLFJ5PSExO2Z1bmN0aW9uIHkxKHQsZSl7c3dpdGNoKHQpe2Nhc2Uia2V5dXAiOnJldHVybiBNJC5pbmRleE9mKGUua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiBlLmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHgxKHQpe3JldHVybiB0PXQuZGV0YWlsLHR5cGVvZiB0PT0ib2JqZWN0IiYmImRhdGEiaW4gdD90LmRhdGE6bnVsbH12YXIgVGw9ITE7ZnVuY3Rpb24gSSQodCxlKXtzd2l0Y2godCl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHgxKGUpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiBlLndoaWNoIT09MzI/bnVsbDooUnk9ITAsTnkpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gdD1lLmRhdGEsdD09PU55JiZSeT9udWxsOnQ7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gRCQodCxlKXtpZihUbClyZXR1cm4gdD09PSJjb21wb3NpdGlvbmVuZCJ8fCFtbSYmeTEodCxlKT8odD1tMSgpLE9jPWhtPUZpPW51bGwsVGw9ITEsdCk6bnVsbDtzd2l0Y2godCl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoIShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpfHxlLmN0cmxLZXkmJmUuYWx0S2V5KXtpZihlLmNoYXImJjE8ZS5jaGFyLmxlbmd0aClyZXR1cm4gZS5jaGFyO2lmKGUud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHYxJiZlLmxvY2FsZSE9PSJrbyI/bnVsbDplLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIGokPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBPeSh0KXt2YXIgZT10JiZ0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGU9PT0iaW5wdXQiPyEhaiRbdC50eXBlXTplPT09InRleHRhcmVhIn1mdW5jdGlvbiBfMSh0LGUsbixyKXtRXyhyKSxlPW5kKGUsIm9uQ2hhbmdlIiksMDxlLmxlbmd0aCYmKG49bmV3IHBtKCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLHIpLHQucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6ZX0pKX12YXIgbWE9bnVsbCxVYT1udWxsO2Z1bmN0aW9uIHokKHQpe08xKHQsMCl9ZnVuY3Rpb24gbGYodCl7dmFyIGU9T2wodCk7aWYoVl8oZSkpcmV0dXJuIHR9ZnVuY3Rpb24gRiQodCxlKXtpZih0PT09ImNoYW5nZSIpcmV0dXJuIGV9dmFyIHcxPSExO2lmKGRpKXt2YXIgZGg7aWYoZGkpe3ZhciBmaD0ib25pbnB1dCJpbiBkb2N1bWVudDtpZighZmgpe3ZhciBQeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQeS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCJyZXR1cm47IiksZmg9dHlwZW9mIFB5Lm9uaW5wdXQ9PSJmdW5jdGlvbiJ9ZGg9Zmh9ZWxzZSBkaD0hMTt3MT1kaCYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiBBeSgpe21hJiYobWEuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLFMxKSxVYT1tYT1udWxsKX1mdW5jdGlvbiBTMSh0KXtpZih0LnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJmxmKFVhKSl7dmFyIGU9W107XzEoZSxVYSx0LGFtKHQpKSx0MSh6JCxlKX19ZnVuY3Rpb24gQiQodCxlLG4pe3Q9PT0iZm9jdXNpbiI/KEF5KCksbWE9ZSxVYT1uLG1hLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixTMSkpOnQ9PT0iZm9jdXNvdXQiJiZBeSgpfWZ1bmN0aW9uIFUkKHQpe2lmKHQ9PT0ic2VsZWN0aW9uY2hhbmdlInx8dD09PSJrZXl1cCJ8fHQ9PT0ia2V5ZG93biIpcmV0dXJuIGxmKFVhKX1mdW5jdGlvbiBXJCh0LGUpe2lmKHQ9PT0iY2xpY2siKXJldHVybiBsZihlKX1mdW5jdGlvbiBWJCh0LGUpe2lmKHQ9PT0iaW5wdXQifHx0PT09ImNoYW5nZSIpcmV0dXJuIGxmKGUpfWZ1bmN0aW9uIEgkKHQsZSl7cmV0dXJuIHQ9PT1lJiYodCE9PTB8fDEvdD09PTEvZSl8fHQhPT10JiZlIT09ZX12YXIgRXI9dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6SCQ7ZnVuY3Rpb24gV2EodCxlKXtpZihFcih0LGUpKXJldHVybiEwO2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXModCkscj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoIVFoLmNhbGwoZSxpKXx8IUVyKHRbaV0sZVtpXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gTXkodCl7Zm9yKDt0JiZ0LmZpcnN0Q2hpbGQ7KXQ9dC5maXJzdENoaWxkO3JldHVybiB0fWZ1bmN0aW9uIEx5KHQsZSl7dmFyIG49TXkodCk7dD0wO2Zvcih2YXIgcjtuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKHI9dCtuLnRleHRDb250ZW50Lmxlbmd0aCx0PD1lJiZyPj1lKXJldHVybntub2RlOm4sb2Zmc2V0OmUtdH07dD1yfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49TXkobil9fWZ1bmN0aW9uIEUxKHQsZSl7cmV0dXJuIHQmJmU/dD09PWU/ITA6dCYmdC5ub2RlVHlwZT09PTM/ITE6ZSYmZS5ub2RlVHlwZT09PTM/RTEodCxlLnBhcmVudE5vZGUpOiJjb250YWlucyJpbiB0P3QuY29udGFpbnMoZSk6dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hISh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpJjE2KTohMTohMX1mdW5jdGlvbiBDMSgpe2Zvcih2YXIgdD13aW5kb3csZT1ZYygpO2UgaW5zdGFuY2VvZiB0LkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiBlLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKXQ9ZS5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7ZT1ZYyh0LmRvY3VtZW50KX1yZXR1cm4gZX1mdW5jdGlvbiB2bSh0KXt2YXIgZT10JiZ0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihlPT09ImlucHV0IiYmKHQudHlwZT09PSJ0ZXh0Inx8dC50eXBlPT09InNlYXJjaCJ8fHQudHlwZT09PSJ0ZWwifHx0LnR5cGU9PT0idXJsInx8dC50eXBlPT09InBhc3N3b3JkIil8fGU9PT0idGV4dGFyZWEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gSyQodCl7dmFyIGU9QzEoKSxuPXQuZm9jdXNlZEVsZW0scj10LnNlbGVjdGlvblJhbmdlO2lmKGUhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJkUxKG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKHIhPT1udWxsJiZ2bShuKSl7aWYoZT1yLnN0YXJ0LHQ9ci5lbmQsdD09PXZvaWQgMCYmKHQ9ZSksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD1lLG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKHQsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYodD0oZT1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmZS5kZWZhdWx0Vmlld3x8d2luZG93LHQuZ2V0U2VsZWN0aW9uKXt0PXQuZ2V0U2VsZWN0aW9uKCk7dmFyIGk9bi50ZXh0Q29udGVudC5sZW5ndGgsbz1NYXRoLm1pbihyLnN0YXJ0LGkpO3I9ci5lbmQ9PT12b2lkIDA/bzpNYXRoLm1pbihyLmVuZCxpKSwhdC5leHRlbmQmJm8+ciYmKGk9cixyPW8sbz1pKSxpPUx5KG4sbyk7dmFyIGw9THkobixyKTtpJiZsJiYodC5yYW5nZUNvdW50IT09MXx8dC5hbmNob3JOb2RlIT09aS5ub2RlfHx0LmFuY2hvck9mZnNldCE9PWkub2Zmc2V0fHx0LmZvY3VzTm9kZSE9PWwubm9kZXx8dC5mb2N1c09mZnNldCE9PWwub2Zmc2V0KSYmKGU9ZS5jcmVhdGVSYW5nZSgpLGUuc2V0U3RhcnQoaS5ub2RlLGkub2Zmc2V0KSx0LnJlbW92ZUFsbFJhbmdlcygpLG8+cj8odC5hZGRSYW5nZShlKSx0LmV4dGVuZChsLm5vZGUsbC5vZmZzZXQpKTooZS5zZXRFbmQobC5ub2RlLGwub2Zmc2V0KSx0LmFkZFJhbmdlKGUpKSl9fWZvcihlPVtdLHQ9bjt0PXQucGFyZW50Tm9kZTspdC5ub2RlVHlwZT09PTEmJmUucHVzaCh7ZWxlbWVudDp0LGxlZnQ6dC5zY3JvbGxMZWZ0LHRvcDp0LnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPGUubGVuZ3RoO24rKyl0PWVbbl0sdC5lbGVtZW50LnNjcm9sbExlZnQ9dC5sZWZ0LHQuZWxlbWVudC5zY3JvbGxUb3A9dC50b3B9fXZhciBaJD1kaSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxObD1udWxsLG1wPW51bGwsdmE9bnVsbCx2cD0hMTtmdW5jdGlvbiBJeSh0LGUsbil7dmFyIHI9bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7dnB8fE5sPT1udWxsfHxObCE9PVljKHIpfHwocj1ObCwic2VsZWN0aW9uU3RhcnQiaW4gciYmdm0ocik/cj17c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxyPXthbmNob3JOb2RlOnIuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9KSx2YSYmV2EodmEscil8fCh2YT1yLHI9bmQobXAsIm9uU2VsZWN0IiksMDxyLmxlbmd0aCYmKGU9bmV3IHBtKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCxlLG4pLHQucHVzaCh7ZXZlbnQ6ZSxsaXN0ZW5lcnM6cn0pLGUudGFyZ2V0PU5sKSkpfWZ1bmN0aW9uIHJjKHQsZSl7dmFyIG49e307cmV0dXJuIG5bdC50b0xvd2VyQ2FzZSgpXT1lLnRvTG93ZXJDYXNlKCksblsiV2Via2l0Iit0XT0id2Via2l0IitlLG5bIk1veiIrdF09Im1veiIrZSxufXZhciBSbD17YW5pbWF0aW9uZW5kOnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cmMoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6cmMoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LGhoPXt9LGsxPXt9O2RpJiYoazE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBSbC5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgUmwudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBzZih0KXtpZihoaFt0XSlyZXR1cm4gaGhbdF07aWYoIVJsW3RdKXJldHVybiB0O3ZhciBlPVJsW3RdLG47Zm9yKG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pJiZuIGluIGsxKXJldHVybiBoaFt0XT1lW25dO3JldHVybiB0fXZhciBiMT1zZigiYW5pbWF0aW9uZW5kIiksJDE9c2YoImFuaW1hdGlvbml0ZXJhdGlvbiIpLFQxPXNmKCJhbmltYXRpb25zdGFydCIpLE4xPXNmKCJ0cmFuc2l0aW9uZW5kIiksUjE9bmV3IE1hcCxEeT0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gZ28odCxlKXtSMS5zZXQodCxlKSxlbChlLFt0XSl9Zm9yKHZhciBwaD0wO3BoPER5Lmxlbmd0aDtwaCsrKXt2YXIgZ2g9RHlbcGhdLEckPWdoLnRvTG93ZXJDYXNlKCksWSQ9Z2hbMF0udG9VcHBlckNhc2UoKStnaC5zbGljZSgxKTtnbyhHJCwib24iK1kkKX1nbyhiMSwib25BbmltYXRpb25FbmQiKTtnbygkMSwib25BbmltYXRpb25JdGVyYXRpb24iKTtnbyhUMSwib25BbmltYXRpb25TdGFydCIpO2dvKCJkYmxjbGljayIsIm9uRG91YmxlQ2xpY2siKTtnbygiZm9jdXNpbiIsIm9uRm9jdXMiKTtnbygiZm9jdXNvdXQiLCJvbkJsdXIiKTtnbyhOMSwib25UcmFuc2l0aW9uRW5kIik7ZXMoIm9uTW91c2VFbnRlciIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtlcygib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO2VzKCJvblBvaW50ZXJFbnRlciIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7ZXMoIm9uUG9pbnRlckxlYXZlIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtlbCgib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7ZWwoIm9uU2VsZWN0IiwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtlbCgib25CZWZvcmVJbnB1dCIsWyJjb21wb3NpdGlvbmVuZCIsImtleXByZXNzIiwidGV4dElucHV0IiwicGFzdGUiXSk7ZWwoIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7ZWwoIm9uQ29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO2VsKCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3ZhciBhYT0iYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIiksWCQ9bmV3IFNldCgiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdChhYSkpO2Z1bmN0aW9uIGp5KHQsZSxuKXt2YXIgcj10LnR5cGV8fCJ1bmtub3duLWV2ZW50Ijt0LmN1cnJlbnRUYXJnZXQ9bixHYihyLGUsdm9pZCAwLHQpLHQuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIE8xKHQsZSl7ZT0oZSY0KSE9PTA7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl0saT1yLmV2ZW50O3I9ci5saXN0ZW5lcnM7ZTp7dmFyIG89dm9pZCAwO2lmKGUpZm9yKHZhciBsPXIubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0O2lmKHM9cy5saXN0ZW5lcixhIT09byYmaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7ankoaSxzLHUpLG89YX1lbHNlIGZvcihsPTA7bDxyLmxlbmd0aDtsKyspe2lmKHM9cltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQscz1zLmxpc3RlbmVyLGEhPT1vJiZpLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtqeShpLHMsdSksbz1hfX19aWYoUWMpdGhyb3cgdD1mcCxRYz0hMSxmcD1udWxsLHR9ZnVuY3Rpb24gZXQodCxlKXt2YXIgbj1lW1NwXTtuPT09dm9pZCAwJiYobj1lW1NwXT1uZXcgU2V0KTt2YXIgcj10KyJfX2J1YmJsZSI7bi5oYXMocil8fChQMShlLHQsMiwhMSksbi5hZGQocikpfWZ1bmN0aW9uIG1oKHQsZSxuKXt2YXIgcj0wO2UmJihyfD00KSxQMShuLHQscixlKX12YXIgaWM9Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gVmEodCl7aWYoIXRbaWNdKXt0W2ljXT0hMCx6Xy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24hPT0ic2VsZWN0aW9uY2hhbmdlIiYmKFgkLmhhcyhuKXx8bWgobiwhMSx0KSxtaChuLCEwLHQpKX0pO3ZhciBlPXQubm9kZVR5cGU9PT05P3Q6dC5vd25lckRvY3VtZW50O2U9PT1udWxsfHxlW2ljXXx8KGVbaWNdPSEwLG1oKCJzZWxlY3Rpb25jaGFuZ2UiLCExLGUpKX19ZnVuY3Rpb24gUDEodCxlLG4scil7c3dpdGNoKGcxKGUpKXtjYXNlIDE6dmFyIGk9YyQ7YnJlYWs7Y2FzZSA0Omk9ZCQ7YnJlYWs7ZGVmYXVsdDppPWZtfW49aS5iaW5kKG51bGwsZSxuLHQpLGk9dm9pZCAwLCFkcHx8ZSE9PSJ0b3VjaHN0YXJ0IiYmZSE9PSJ0b3VjaG1vdmUiJiZlIT09IndoZWVsInx8KGk9ITApLHI/aSE9PXZvaWQgMD90LmFkZEV2ZW50TGlzdGVuZXIoZSxuLHtjYXB0dXJlOiEwLHBhc3NpdmU6aX0pOnQuYWRkRXZlbnRMaXN0ZW5lcihlLG4sITApOmkhPT12b2lkIDA/dC5hZGRFdmVudExpc3RlbmVyKGUsbix7cGFzc2l2ZTppfSk6dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhMSl9ZnVuY3Rpb24gdmgodCxlLG4scixpKXt2YXIgbz1yO2lmKCEoZSYxKSYmIShlJjIpJiZyIT09bnVsbCllOmZvcig7Oyl7aWYocj09PW51bGwpcmV0dXJuO3ZhciBsPXIudGFnO2lmKGw9PT0zfHxsPT09NCl7dmFyIHM9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihzPT09aXx8cy5ub2RlVHlwZT09PTgmJnMucGFyZW50Tm9kZT09PWkpYnJlYWs7aWYobD09PTQpZm9yKGw9ci5yZXR1cm47bCE9PW51bGw7KXt2YXIgYT1sLnRhZztpZigoYT09PTN8fGE9PT00KSYmKGE9bC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxhPT09aXx8YS5ub2RlVHlwZT09PTgmJmEucGFyZW50Tm9kZT09PWkpKXJldHVybjtsPWwucmV0dXJufWZvcig7cyE9PW51bGw7KXtpZihsPVRvKHMpLGw9PT1udWxsKXJldHVybjtpZihhPWwudGFnLGE9PT01fHxhPT09Nil7cj1vPWw7Y29udGludWUgZX1zPXMucGFyZW50Tm9kZX19cj1yLnJldHVybn10MShmdW5jdGlvbigpe3ZhciB1PW8sYz1hbShuKSxkPVtdO2U6e3ZhciBmPVIxLmdldCh0KTtpZihmIT09dm9pZCAwKXt2YXIgaD1wbSxtPXQ7c3dpdGNoKHQpe2Nhc2Uia2V5cHJlc3MiOmlmKFBjKG4pPT09MClicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6aD1iJDticmVhaztjYXNlImZvY3VzaW4iOm09ImZvY3VzIixoPWNoO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOm09ImJsdXIiLGg9Y2g7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6aD1jaDticmVhaztjYXNlImNsaWNrIjppZihuLmJ1dHRvbj09PTIpYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOmg9Ynk7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6aD1wJDticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpoPU4kO2JyZWFrO2Nhc2UgYjE6Y2FzZSAkMTpjYXNlIFQxOmg9diQ7YnJlYWs7Y2FzZSBOMTpoPU8kO2JyZWFrO2Nhc2Uic2Nyb2xsIjpoPWYkO2JyZWFrO2Nhc2Uid2hlZWwiOmg9QSQ7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6aD14JDticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpoPVR5fXZhciBnPShlJjQpIT09MCx3PSFnJiZ0PT09InNjcm9sbCIsdj1nP2YhPT1udWxsP2YrIkNhcHR1cmUiOm51bGw6ZjtnPVtdO2Zvcih2YXIgeT11LHg7eSE9PW51bGw7KXt4PXk7dmFyIFM9eC5zdGF0ZU5vZGU7aWYoeC50YWc9PT01JiZTIT09bnVsbCYmKHg9Uyx2IT09bnVsbCYmKFM9amEoeSx2KSxTIT1udWxsJiZnLnB1c2goSGEoeSxTLHgpKSkpLHcpYnJlYWs7eT15LnJldHVybn0wPGcubGVuZ3RoJiYoZj1uZXcgaChmLG0sbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6ZixsaXN0ZW5lcnM6Z30pKX19aWYoIShlJjcpKXtlOntpZihmPXQ9PT0ibW91c2VvdmVyInx8dD09PSJwb2ludGVyb3ZlciIsaD10PT09Im1vdXNlb3V0Inx8dD09PSJwb2ludGVyb3V0IixmJiZuIT09dXAmJihtPW4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkmJihUbyhtKXx8bVtmaV0pKWJyZWFrIGU7aWYoKGh8fGYpJiYoZj1jLndpbmRvdz09PWM/YzooZj1jLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdyxoPyhtPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQsaD11LG09bT9UbyhtKTpudWxsLG0hPT1udWxsJiYodz10bChtKSxtIT09d3x8bS50YWchPT01JiZtLnRhZyE9PTYpJiYobT1udWxsKSk6KGg9bnVsbCxtPXUpLGghPT1tKSl7aWYoZz1ieSxTPSJvbk1vdXNlTGVhdmUiLHY9Im9uTW91c2VFbnRlciIseT0ibW91c2UiLCh0PT09InBvaW50ZXJvdXQifHx0PT09InBvaW50ZXJvdmVyIikmJihnPVR5LFM9Im9uUG9pbnRlckxlYXZlIix2PSJvblBvaW50ZXJFbnRlciIseT0icG9pbnRlciIpLHc9aD09bnVsbD9mOk9sKGgpLHg9bT09bnVsbD9mOk9sKG0pLGY9bmV3IGcoUyx5KyJsZWF2ZSIsaCxuLGMpLGYudGFyZ2V0PXcsZi5yZWxhdGVkVGFyZ2V0PXgsUz1udWxsLFRvKGMpPT09dSYmKGc9bmV3IGcodix5KyJlbnRlciIsbSxuLGMpLGcudGFyZ2V0PXgsZy5yZWxhdGVkVGFyZ2V0PXcsUz1nKSx3PVMsaCYmbSl0Ontmb3IoZz1oLHY9bSx5PTAseD1nO3g7eD1wbCh4KSl5Kys7Zm9yKHg9MCxTPXY7UztTPXBsKFMpKXgrKztmb3IoOzA8eS14OylnPXBsKGcpLHktLTtmb3IoOzA8eC15Oyl2PXBsKHYpLHgtLTtmb3IoO3ktLTspe2lmKGc9PT12fHx2IT09bnVsbCYmZz09PXYuYWx0ZXJuYXRlKWJyZWFrIHQ7Zz1wbChnKSx2PXBsKHYpfWc9bnVsbH1lbHNlIGc9bnVsbDtoIT09bnVsbCYmenkoZCxmLGgsZywhMSksbSE9PW51bGwmJnchPT1udWxsJiZ6eShkLHcsbSxnLCEwKX19ZTp7aWYoZj11P09sKHUpOndpbmRvdyxoPWYubm9kZU5hbWUmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxoPT09InNlbGVjdCJ8fGg9PT0iaW5wdXQiJiZmLnR5cGU9PT0iZmlsZSIpdmFyIGI9RiQ7ZWxzZSBpZihPeShmKSlpZih3MSliPVYkO2Vsc2V7Yj1VJDt2YXIgVD1CJH1lbHNlKGg9Zi5ub2RlTmFtZSkmJmgudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihmLnR5cGU9PT0iY2hlY2tib3gifHxmLnR5cGU9PT0icmFkaW8iKSYmKGI9VyQpO2lmKGImJihiPWIodCx1KSkpe18xKGQsYixuLGMpO2JyZWFrIGV9VCYmVCh0LGYsdSksdD09PSJmb2N1c291dCImJihUPWYuX3dyYXBwZXJTdGF0ZSkmJlQuY29udHJvbGxlZCYmZi50eXBlPT09Im51bWJlciImJmlwKGYsIm51bWJlciIsZi52YWx1ZSl9c3dpdGNoKFQ9dT9PbCh1KTp3aW5kb3csdCl7Y2FzZSJmb2N1c2luIjooT3koVCl8fFQuY29udGVudEVkaXRhYmxlPT09InRydWUiKSYmKE5sPVQsbXA9dSx2YT1udWxsKTticmVhaztjYXNlImZvY3Vzb3V0Ijp2YT1tcD1ObD1udWxsO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp2cD0hMDticmVhaztjYXNlImNvbnRleHRtZW51IjpjYXNlIm1vdXNldXAiOmNhc2UiZHJhZ2VuZCI6dnA9ITEsSXkoZCxuLGMpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uY2hhbmdlIjppZihaJClicmVhaztjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOkl5KGQsbixjKX12YXIgJDtpZihtbSllOntzd2l0Y2godCl7Y2FzZSJjb21wb3NpdGlvbnN0YXJ0Ijp2YXIgTz0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOk89Im9uQ29tcG9zaXRpb25FbmQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Tz0ib25Db21wb3NpdGlvblVwZGF0ZSI7YnJlYWsgZX1PPXZvaWQgMH1lbHNlIFRsP3kxKHQsbikmJihPPSJvbkNvbXBvc2l0aW9uRW5kIik6dD09PSJrZXlkb3duIiYmbi5rZXlDb2RlPT09MjI5JiYoTz0ib25Db21wb3NpdGlvblN0YXJ0Iik7TyYmKHYxJiZuLmxvY2FsZSE9PSJrbyImJihUbHx8TyE9PSJvbkNvbXBvc2l0aW9uU3RhcnQiP089PT0ib25Db21wb3NpdGlvbkVuZCImJlRsJiYoJD1tMSgpKTooRmk9YyxobT0idmFsdWUiaW4gRmk/RmkudmFsdWU6RmkudGV4dENvbnRlbnQsVGw9ITApKSxUPW5kKHUsTyksMDxULmxlbmd0aCYmKE89bmV3ICR5KE8sdCxudWxsLG4sYyksZC5wdXNoKHtldmVudDpPLGxpc3RlbmVyczpUfSksJD9PLmRhdGE9JDooJD14MShuKSwkIT09bnVsbCYmKE8uZGF0YT0kKSkpKSwoJD1MJD9JJCh0LG4pOkQkKHQsbikpJiYodT1uZCh1LCJvbkJlZm9yZUlucHV0IiksMDx1Lmxlbmd0aCYmKGM9bmV3ICR5KCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOnV9KSxjLmRhdGE9JCkpfU8xKGQsZSl9KX1mdW5jdGlvbiBIYSh0LGUsbil7cmV0dXJue2luc3RhbmNlOnQsbGlzdGVuZXI6ZSxjdXJyZW50VGFyZ2V0Om59fWZ1bmN0aW9uIG5kKHQsZSl7Zm9yKHZhciBuPWUrIkNhcHR1cmUiLHI9W107dCE9PW51bGw7KXt2YXIgaT10LG89aS5zdGF0ZU5vZGU7aS50YWc9PT01JiZvIT09bnVsbCYmKGk9byxvPWphKHQsbiksbyE9bnVsbCYmci51bnNoaWZ0KEhhKHQsbyxpKSksbz1qYSh0LGUpLG8hPW51bGwmJnIucHVzaChIYSh0LG8saSkpKSx0PXQucmV0dXJufXJldHVybiByfWZ1bmN0aW9uIHBsKHQpe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2RvIHQ9dC5yZXR1cm47d2hpbGUodCYmdC50YWchPT01KTtyZXR1cm4gdHx8bnVsbH1mdW5jdGlvbiB6eSh0LGUsbixyLGkpe2Zvcih2YXIgbz1lLl9yZWFjdE5hbWUsbD1bXTtuIT09bnVsbCYmbiE9PXI7KXt2YXIgcz1uLGE9cy5hbHRlcm5hdGUsdT1zLnN0YXRlTm9kZTtpZihhIT09bnVsbCYmYT09PXIpYnJlYWs7cy50YWc9PT01JiZ1IT09bnVsbCYmKHM9dSxpPyhhPWphKG4sbyksYSE9bnVsbCYmbC51bnNoaWZ0KEhhKG4sYSxzKSkpOml8fChhPWphKG4sbyksYSE9bnVsbCYmbC5wdXNoKEhhKG4sYSxzKSkpKSxuPW4ucmV0dXJufWwubGVuZ3RoIT09MCYmdC5wdXNoKHtldmVudDplLGxpc3RlbmVyczpsfSl9dmFyIFEkPS9cclxuPy9nLEokPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gRnkodCl7cmV0dXJuKHR5cGVvZiB0PT0ic3RyaW5nIj90OiIiK3QpLnJlcGxhY2UoUSQsYApgKS5yZXBsYWNlKEokLCIiKX1mdW5jdGlvbiBvYyh0LGUsbil7aWYoZT1GeShlKSxGeSh0KSE9PWUmJm4pdGhyb3cgRXJyb3IoVyg0MjUpKX1mdW5jdGlvbiByZCgpe312YXIgeXA9bnVsbCx4cD1udWxsO2Z1bmN0aW9uIF9wKHQsZSl7cmV0dXJuIHQ9PT0idGV4dGFyZWEifHx0PT09Im5vc2NyaXB0Inx8dHlwZW9mIGUuY2hpbGRyZW49PSJzdHJpbmcifHx0eXBlb2YgZS5jaGlsZHJlbj09Im51bWJlciJ8fHR5cGVvZiBlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT0ib2JqZWN0IiYmZS5kYW5nZXJvdXNseVNldElubmVySFRNTCE9PW51bGwmJmUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIT1udWxsfXZhciB3cD10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0OnZvaWQgMCxxJD10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDp2b2lkIDAsQnk9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZTp2b2lkIDAsZVQ9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOnR5cGVvZiBCeTwidSI/ZnVuY3Rpb24odCl7cmV0dXJuIEJ5LnJlc29sdmUobnVsbCkudGhlbih0KS5jYXRjaCh0VCl9OndwO2Z1bmN0aW9uIHRUKHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9ZnVuY3Rpb24geWgodCxlKXt2YXIgbj1lLHI9MDtkb3t2YXIgaT1uLm5leHRTaWJsaW5nO2lmKHQucmVtb3ZlQ2hpbGQobiksaSYmaS5ub2RlVHlwZT09PTgpaWYobj1pLmRhdGEsbj09PSIvJCIpe2lmKHI9PT0wKXt0LnJlbW92ZUNoaWxkKGkpLEJhKGUpO3JldHVybn1yLS19ZWxzZSBuIT09IiQiJiZuIT09IiQ/IiYmbiE9PSIkISJ8fHIrKztuPWl9d2hpbGUobik7QmEoZSl9ZnVuY3Rpb24gWmkodCl7Zm9yKDt0IT1udWxsO3Q9dC5uZXh0U2libGluZyl7dmFyIGU9dC5ub2RlVHlwZTtpZihlPT09MXx8ZT09PTMpYnJlYWs7aWYoZT09PTgpe2lmKGU9dC5kYXRhLGU9PT0iJCJ8fGU9PT0iJCEifHxlPT09IiQ/IilicmVhaztpZihlPT09Ii8kIilyZXR1cm4gbnVsbH19cmV0dXJuIHR9ZnVuY3Rpb24gVXkodCl7dD10LnByZXZpb3VzU2libGluZztmb3IodmFyIGU9MDt0Oyl7aWYodC5ub2RlVHlwZT09PTgpe3ZhciBuPXQuZGF0YTtpZihuPT09IiQifHxuPT09IiQhInx8bj09PSIkPyIpe2lmKGU9PT0wKXJldHVybiB0O2UtLX1lbHNlIG49PT0iLyQiJiZlKyt9dD10LnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgX3M9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksTXI9Il9fcmVhY3RGaWJlciQiK19zLEthPSJfX3JlYWN0UHJvcHMkIitfcyxmaT0iX19yZWFjdENvbnRhaW5lciQiK19zLFNwPSJfX3JlYWN0RXZlbnRzJCIrX3MsblQ9Il9fcmVhY3RMaXN0ZW5lcnMkIitfcyxyVD0iX19yZWFjdEhhbmRsZXMkIitfcztmdW5jdGlvbiBUbyh0KXt2YXIgZT10W01yXTtpZihlKXJldHVybiBlO2Zvcih2YXIgbj10LnBhcmVudE5vZGU7bjspe2lmKGU9bltmaV18fG5bTXJdKXtpZihuPWUuYWx0ZXJuYXRlLGUuY2hpbGQhPT1udWxsfHxuIT09bnVsbCYmbi5jaGlsZCE9PW51bGwpZm9yKHQ9VXkodCk7dCE9PW51bGw7KXtpZihuPXRbTXJdKXJldHVybiBuO3Q9VXkodCl9cmV0dXJuIGV9dD1uLG49dC5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIFB1KHQpe3JldHVybiB0PXRbTXJdfHx0W2ZpXSwhdHx8dC50YWchPT01JiZ0LnRhZyE9PTYmJnQudGFnIT09MTMmJnQudGFnIT09Mz9udWxsOnR9ZnVuY3Rpb24gT2wodCl7aWYodC50YWc9PT01fHx0LnRhZz09PTYpcmV0dXJuIHQuc3RhdGVOb2RlO3Rocm93IEVycm9yKFcoMzMpKX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdFtLYV18fG51bGx9dmFyIEVwPVtdLFBsPS0xO2Z1bmN0aW9uIG1vKHQpe3JldHVybntjdXJyZW50OnR9fWZ1bmN0aW9uIGl0KHQpezA+UGx8fCh0LmN1cnJlbnQ9RXBbUGxdLEVwW1BsXT1udWxsLFBsLS0pfWZ1bmN0aW9uIFhlKHQsZSl7UGwrKyxFcFtQbF09dC5jdXJyZW50LHQuY3VycmVudD1lfXZhciBubz17fSxybj1tbyhubyksJG49bW8oITEpLEZvPW5vO2Z1bmN0aW9uIHRzKHQsZSl7dmFyIG49dC50eXBlLmNvbnRleHRUeXBlcztpZighbilyZXR1cm4gbm87dmFyIHI9dC5zdGF0ZU5vZGU7aWYociYmci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09ZSlyZXR1cm4gci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgaT17fSxvO2ZvcihvIGluIG4paVtvXT1lW29dO3JldHVybiByJiYodD10LnN0YXRlTm9kZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLGl9ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQ9dC5jaGlsZENvbnRleHRUeXBlcyx0IT1udWxsfWZ1bmN0aW9uIGlkKCl7aXQoJG4pLGl0KHJuKX1mdW5jdGlvbiBXeSh0LGUsbil7aWYocm4uY3VycmVudCE9PW5vKXRocm93IEVycm9yKFcoMTY4KSk7WGUocm4sZSksWGUoJG4sbil9ZnVuY3Rpb24gQTEodCxlLG4pe3ZhciByPXQuc3RhdGVOb2RlO2lmKGU9ZS5jaGlsZENvbnRleHRUeXBlcyx0eXBlb2Ygci5nZXRDaGlsZENvbnRleHQhPSJmdW5jdGlvbiIpcmV0dXJuIG47cj1yLmdldENoaWxkQ29udGV4dCgpO2Zvcih2YXIgaSBpbiByKWlmKCEoaSBpbiBlKSl0aHJvdyBFcnJvcihXKDEwOCxCYih0KXx8IlVua25vd24iLGkpKTtyZXR1cm4gZ3Qoe30sbixyKX1mdW5jdGlvbiBvZCh0KXtyZXR1cm4gdD0odD10LnN0YXRlTm9kZSkmJnQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fG5vLEZvPXJuLmN1cnJlbnQsWGUocm4sdCksWGUoJG4sJG4uY3VycmVudCksITB9ZnVuY3Rpb24gVnkodCxlLG4pe3ZhciByPXQuc3RhdGVOb2RlO2lmKCFyKXRocm93IEVycm9yKFcoMTY5KSk7bj8odD1BMSh0LGUsRm8pLHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ9dCxpdCgkbiksaXQocm4pLFhlKHJuLHQpKTppdCgkbiksWGUoJG4sbil9dmFyIGlpPW51bGwsdWY9ITEseGg9ITE7ZnVuY3Rpb24gTTEodCl7aWk9PT1udWxsP2lpPVt0XTppaS5wdXNoKHQpfWZ1bmN0aW9uIGlUKHQpe3VmPSEwLE0xKHQpfWZ1bmN0aW9uIHZvKCl7aWYoIXhoJiZpaSE9PW51bGwpe3hoPSEwO3ZhciB0PTAsZT1XZTt0cnl7dmFyIG49aWk7Zm9yKFdlPTE7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ZG8gcj1yKCEwKTt3aGlsZShyIT09bnVsbCl9aWk9bnVsbCx1Zj0hMX1jYXRjaChpKXt0aHJvdyBpaSE9PW51bGwmJihpaT1paS5zbGljZSh0KzEpKSxvMSh1bSx2byksaX1maW5hbGx5e1dlPWUseGg9ITF9fXJldHVybiBudWxsfXZhciBBbD1bXSxNbD0wLGxkPW51bGwsc2Q9MCxZbj1bXSxYbj0wLEJvPW51bGwsc2k9MSxhaT0iIjtmdW5jdGlvbiBDbyh0LGUpe0FsW01sKytdPXNkLEFsW01sKytdPWxkLGxkPXQsc2Q9ZX1mdW5jdGlvbiBMMSh0LGUsbil7WW5bWG4rK109c2ksWW5bWG4rK109YWksWW5bWG4rK109Qm8sQm89dDt2YXIgcj1zaTt0PWFpO3ZhciBpPTMyLXhyKHIpLTE7ciY9figxPDxpKSxuKz0xO3ZhciBvPTMyLXhyKGUpK2k7aWYoMzA8byl7dmFyIGw9aS1pJTU7bz0ociYoMTw8bCktMSkudG9TdHJpbmcoMzIpLHI+Pj1sLGktPWwsc2k9MTw8MzIteHIoZSkraXxuPDxpfHIsYWk9byt0fWVsc2Ugc2k9MTw8b3xuPDxpfHIsYWk9dH1mdW5jdGlvbiB5bSh0KXt0LnJldHVybiE9PW51bGwmJihDbyh0LDEpLEwxKHQsMSwwKSl9ZnVuY3Rpb24geG0odCl7Zm9yKDt0PT09bGQ7KWxkPUFsWy0tTWxdLEFsW01sXT1udWxsLHNkPUFsWy0tTWxdLEFsW01sXT1udWxsO2Zvcig7dD09PUJvOylCbz1ZblstLVhuXSxZbltYbl09bnVsbCxhaT1ZblstLVhuXSxZbltYbl09bnVsbCxzaT1ZblstLVhuXSxZbltYbl09bnVsbH12YXIgRG49bnVsbCxJbj1udWxsLG90PSExLGdyPW51bGw7ZnVuY3Rpb24gSTEodCxlKXt2YXIgbj1xbig1LG51bGwsbnVsbCwwKTtuLmVsZW1lbnRUeXBlPSJERUxFVEVEIixuLnN0YXRlTm9kZT1lLG4ucmV0dXJuPXQsZT10LmRlbGV0aW9ucyxlPT09bnVsbD8odC5kZWxldGlvbnM9W25dLHQuZmxhZ3N8PTE2KTplLnB1c2gobil9ZnVuY3Rpb24gSHkodCxlKXtzd2l0Y2godC50YWcpe2Nhc2UgNTp2YXIgbj10LnR5cGU7cmV0dXJuIGU9ZS5ub2RlVHlwZSE9PTF8fG4udG9Mb3dlckNhc2UoKSE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmUsZSE9PW51bGw/KHQuc3RhdGVOb2RlPWUsRG49dCxJbj1aaShlLmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIGU9dC5wZW5kaW5nUHJvcHM9PT0iInx8ZS5ub2RlVHlwZSE9PTM/bnVsbDplLGUhPT1udWxsPyh0LnN0YXRlTm9kZT1lLERuPXQsSW49bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gZT1lLm5vZGVUeXBlIT09OD9udWxsOmUsZSE9PW51bGw/KG49Qm8hPT1udWxsP3tpZDpzaSxvdmVyZmxvdzphaX06bnVsbCx0Lm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6ZSx0cmVlQ29udGV4dDpuLHJldHJ5TGFuZToxMDczNzQxODI0fSxuPXFuKDE4LG51bGwsbnVsbCwwKSxuLnN0YXRlTm9kZT1lLG4ucmV0dXJuPXQsdC5jaGlsZD1uLERuPXQsSW49bnVsbCwhMCk6ITE7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gQ3AodCl7cmV0dXJuKHQubW9kZSYxKSE9PTAmJih0LmZsYWdzJjEyOCk9PT0wfWZ1bmN0aW9uIGtwKHQpe2lmKG90KXt2YXIgZT1JbjtpZihlKXt2YXIgbj1lO2lmKCFIeSh0LGUpKXtpZihDcCh0KSl0aHJvdyBFcnJvcihXKDQxOCkpO2U9Wmkobi5uZXh0U2libGluZyk7dmFyIHI9RG47ZSYmSHkodCxlKT9JMShyLG4pOih0LmZsYWdzPXQuZmxhZ3MmLTQwOTd8MixvdD0hMSxEbj10KX19ZWxzZXtpZihDcCh0KSl0aHJvdyBFcnJvcihXKDQxOCkpO3QuZmxhZ3M9dC5mbGFncyYtNDA5N3wyLG90PSExLERuPXR9fX1mdW5jdGlvbiBLeSh0KXtmb3IodD10LnJldHVybjt0IT09bnVsbCYmdC50YWchPT01JiZ0LnRhZyE9PTMmJnQudGFnIT09MTM7KXQ9dC5yZXR1cm47RG49dH1mdW5jdGlvbiBsYyh0KXtpZih0IT09RG4pcmV0dXJuITE7aWYoIW90KXJldHVybiBLeSh0KSxvdD0hMCwhMTt2YXIgZTtpZigoZT10LnRhZyE9PTMpJiYhKGU9dC50YWchPT01KSYmKGU9dC50eXBlLGU9ZSE9PSJoZWFkIiYmZSE9PSJib2R5IiYmIV9wKHQudHlwZSx0Lm1lbW9pemVkUHJvcHMpKSxlJiYoZT1Jbikpe2lmKENwKHQpKXRocm93IEQxKCksRXJyb3IoVyg0MTgpKTtmb3IoO2U7KUkxKHQsZSksZT1aaShlLm5leHRTaWJsaW5nKX1pZihLeSh0KSx0LnRhZz09PTEzKXtpZih0PXQubWVtb2l6ZWRTdGF0ZSx0PXQhPT1udWxsP3QuZGVoeWRyYXRlZDpudWxsLCF0KXRocm93IEVycm9yKFcoMzE3KSk7ZTp7Zm9yKHQ9dC5uZXh0U2libGluZyxlPTA7dDspe2lmKHQubm9kZVR5cGU9PT04KXt2YXIgbj10LmRhdGE7aWYobj09PSIvJCIpe2lmKGU9PT0wKXtJbj1aaSh0Lm5leHRTaWJsaW5nKTticmVhayBlfWUtLX1lbHNlIG4hPT0iJCImJm4hPT0iJCEiJiZuIT09IiQ/Inx8ZSsrfXQ9dC5uZXh0U2libGluZ31Jbj1udWxsfX1lbHNlIEluPURuP1ppKHQuc3RhdGVOb2RlLm5leHRTaWJsaW5nKTpudWxsO3JldHVybiEwfWZ1bmN0aW9uIEQxKCl7Zm9yKHZhciB0PUluO3Q7KXQ9WmkodC5uZXh0U2libGluZyl9ZnVuY3Rpb24gbnMoKXtJbj1Ebj1udWxsLG90PSExfWZ1bmN0aW9uIF9tKHQpe2dyPT09bnVsbD9ncj1bdF06Z3IucHVzaCh0KX12YXIgb1Q9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gZnIodCxlKXtpZih0JiZ0LmRlZmF1bHRQcm9wcyl7ZT1ndCh7fSxlKSx0PXQuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09PT12b2lkIDAmJihlW25dPXRbbl0pO3JldHVybiBlfXJldHVybiBlfXZhciBhZD1tbyhudWxsKSx1ZD1udWxsLExsPW51bGwsd209bnVsbDtmdW5jdGlvbiBTbSgpe3dtPUxsPXVkPW51bGx9ZnVuY3Rpb24gRW0odCl7dmFyIGU9YWQuY3VycmVudDtpdChhZCksdC5fY3VycmVudFZhbHVlPWV9ZnVuY3Rpb24gYnAodCxlLG4pe2Zvcig7dCE9PW51bGw7KXt2YXIgcj10LmFsdGVybmF0ZTtpZigodC5jaGlsZExhbmVzJmUpIT09ZT8odC5jaGlsZExhbmVzfD1lLHIhPT1udWxsJiYoci5jaGlsZExhbmVzfD1lKSk6ciE9PW51bGwmJihyLmNoaWxkTGFuZXMmZSkhPT1lJiYoci5jaGlsZExhbmVzfD1lKSx0PT09bilicmVhazt0PXQucmV0dXJufX1mdW5jdGlvbiBLbCh0LGUpe3VkPXQsd209TGw9bnVsbCx0PXQuZGVwZW5kZW5jaWVzLHQhPT1udWxsJiZ0LmZpcnN0Q29udGV4dCE9PW51bGwmJih0LmxhbmVzJmUmJihibj0hMCksdC5maXJzdENvbnRleHQ9bnVsbCl9ZnVuY3Rpb24gbnIodCl7dmFyIGU9dC5fY3VycmVudFZhbHVlO2lmKHdtIT09dClpZih0PXtjb250ZXh0OnQsbWVtb2l6ZWRWYWx1ZTplLG5leHQ6bnVsbH0sTGw9PT1udWxsKXtpZih1ZD09PW51bGwpdGhyb3cgRXJyb3IoVygzMDgpKTtMbD10LHVkLmRlcGVuZGVuY2llcz17bGFuZXM6MCxmaXJzdENvbnRleHQ6dH19ZWxzZSBMbD1MbC5uZXh0PXQ7cmV0dXJuIGV9dmFyIE5vPW51bGw7ZnVuY3Rpb24gQ20odCl7Tm89PT1udWxsP05vPVt0XTpOby5wdXNoKHQpfWZ1bmN0aW9uIGoxKHQsZSxuLHIpe3ZhciBpPWUuaW50ZXJsZWF2ZWQ7cmV0dXJuIGk9PT1udWxsPyhuLm5leHQ9bixDbShlKSk6KG4ubmV4dD1pLm5leHQsaS5uZXh0PW4pLGUuaW50ZXJsZWF2ZWQ9bixoaSh0LHIpfWZ1bmN0aW9uIGhpKHQsZSl7dC5sYW5lc3w9ZTt2YXIgbj10LmFsdGVybmF0ZTtmb3IobiE9PW51bGwmJihuLmxhbmVzfD1lKSxuPXQsdD10LnJldHVybjt0IT09bnVsbDspdC5jaGlsZExhbmVzfD1lLG49dC5hbHRlcm5hdGUsbiE9PW51bGwmJihuLmNoaWxkTGFuZXN8PWUpLG49dCx0PXQucmV0dXJuO3JldHVybiBuLnRhZz09PTM/bi5zdGF0ZU5vZGU6bnVsbH12YXIgTWk9ITE7ZnVuY3Rpb24ga20odCl7dC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOnQubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1mdW5jdGlvbiB6MSh0LGUpe3Q9dC51cGRhdGVRdWV1ZSxlLnVwZGF0ZVF1ZXVlPT09dCYmKGUudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTp0LmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6dC5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6dC5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6dC5zaGFyZWQsZWZmZWN0czp0LmVmZmVjdHN9KX1mdW5jdGlvbiB1aSh0LGUpe3JldHVybntldmVudFRpbWU6dCxsYW5lOmUsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBHaSh0LGUsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtpZihyPXIuc2hhcmVkLExlJjIpe3ZhciBpPXIucGVuZGluZztyZXR1cm4gaT09PW51bGw/ZS5uZXh0PWU6KGUubmV4dD1pLm5leHQsaS5uZXh0PWUpLHIucGVuZGluZz1lLGhpKHQsbil9cmV0dXJuIGk9ci5pbnRlcmxlYXZlZCxpPT09bnVsbD8oZS5uZXh0PWUsQ20ocikpOihlLm5leHQ9aS5uZXh0LGkubmV4dD1lKSxyLmludGVybGVhdmVkPWUsaGkodCxuKX1mdW5jdGlvbiBBYyh0LGUsbil7aWYoZT1lLnVwZGF0ZVF1ZXVlLGUhPT1udWxsJiYoZT1lLnNoYXJlZCwobiY0MTk0MjQwKSE9PTApKXt2YXIgcj1lLmxhbmVzO3ImPXQucGVuZGluZ0xhbmVzLG58PXIsZS5sYW5lcz1uLGNtKHQsbil9fWZ1bmN0aW9uIFp5KHQsZSl7dmFyIG49dC51cGRhdGVRdWV1ZSxyPXQuYWx0ZXJuYXRlO2lmKHIhPT1udWxsJiYocj1yLnVwZGF0ZVF1ZXVlLG49PT1yKSl7dmFyIGk9bnVsbCxvPW51bGw7aWYobj1uLmZpcnN0QmFzZVVwZGF0ZSxuIT09bnVsbCl7ZG97dmFyIGw9e2V2ZW50VGltZTpuLmV2ZW50VGltZSxsYW5lOm4ubGFuZSx0YWc6bi50YWcscGF5bG9hZDpuLnBheWxvYWQsY2FsbGJhY2s6bi5jYWxsYmFjayxuZXh0Om51bGx9O289PT1udWxsP2k9bz1sOm89by5uZXh0PWwsbj1uLm5leHR9d2hpbGUobiE9PW51bGwpO289PT1udWxsP2k9bz1lOm89by5uZXh0PWV9ZWxzZSBpPW89ZTtuPXtiYXNlU3RhdGU6ci5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmksbGFzdEJhc2VVcGRhdGU6byxzaGFyZWQ6ci5zaGFyZWQsZWZmZWN0czpyLmVmZmVjdHN9LHQudXBkYXRlUXVldWU9bjtyZXR1cm59dD1uLmxhc3RCYXNlVXBkYXRlLHQ9PT1udWxsP24uZmlyc3RCYXNlVXBkYXRlPWU6dC5uZXh0PWUsbi5sYXN0QmFzZVVwZGF0ZT1lfWZ1bmN0aW9uIGNkKHQsZSxuLHIpe3ZhciBpPXQudXBkYXRlUXVldWU7TWk9ITE7dmFyIG89aS5maXJzdEJhc2VVcGRhdGUsbD1pLmxhc3RCYXNlVXBkYXRlLHM9aS5zaGFyZWQucGVuZGluZztpZihzIT09bnVsbCl7aS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBhPXMsdT1hLm5leHQ7YS5uZXh0PW51bGwsbD09PW51bGw/bz11OmwubmV4dD11LGw9YTt2YXIgYz10LmFsdGVybmF0ZTtjIT09bnVsbCYmKGM9Yy51cGRhdGVRdWV1ZSxzPWMubGFzdEJhc2VVcGRhdGUscyE9PWwmJihzPT09bnVsbD9jLmZpcnN0QmFzZVVwZGF0ZT11OnMubmV4dD11LGMubGFzdEJhc2VVcGRhdGU9YSkpfWlmKG8hPT1udWxsKXt2YXIgZD1pLmJhc2VTdGF0ZTtsPTAsYz11PWE9bnVsbCxzPW87ZG97dmFyIGY9cy5sYW5lLGg9cy5ldmVudFRpbWU7aWYoKHImZik9PT1mKXtjIT09bnVsbCYmKGM9Yy5uZXh0PXtldmVudFRpbWU6aCxsYW5lOjAsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSk7ZTp7dmFyIG09dCxnPXM7c3dpdGNoKGY9ZSxoPW4sZy50YWcpe2Nhc2UgMTppZihtPWcucGF5bG9hZCx0eXBlb2YgbT09ImZ1bmN0aW9uIil7ZD1tLmNhbGwoaCxkLGYpO2JyZWFrIGV9ZD1tO2JyZWFrIGU7Y2FzZSAzOm0uZmxhZ3M9bS5mbGFncyYtNjU1Mzd8MTI4O2Nhc2UgMDppZihtPWcucGF5bG9hZCxmPXR5cGVvZiBtPT0iZnVuY3Rpb24iP20uY2FsbChoLGQsZik6bSxmPT1udWxsKWJyZWFrIGU7ZD1ndCh7fSxkLGYpO2JyZWFrIGU7Y2FzZSAyOk1pPSEwfX1zLmNhbGxiYWNrIT09bnVsbCYmcy5sYW5lIT09MCYmKHQuZmxhZ3N8PTY0LGY9aS5lZmZlY3RzLGY9PT1udWxsP2kuZWZmZWN0cz1bc106Zi5wdXNoKHMpKX1lbHNlIGg9e2V2ZW50VGltZTpoLGxhbmU6Zix0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9LGM9PT1udWxsPyh1PWM9aCxhPWQpOmM9Yy5uZXh0PWgsbHw9ZjtpZihzPXMubmV4dCxzPT09bnVsbCl7aWYocz1pLnNoYXJlZC5wZW5kaW5nLHM9PT1udWxsKWJyZWFrO2Y9cyxzPWYubmV4dCxmLm5leHQ9bnVsbCxpLmxhc3RCYXNlVXBkYXRlPWYsaS5zaGFyZWQucGVuZGluZz1udWxsfX13aGlsZSghMCk7aWYoYz09PW51bGwmJihhPWQpLGkuYmFzZVN0YXRlPWEsaS5maXJzdEJhc2VVcGRhdGU9dSxpLmxhc3RCYXNlVXBkYXRlPWMsZT1pLnNoYXJlZC5pbnRlcmxlYXZlZCxlIT09bnVsbCl7aT1lO2RvIGx8PWkubGFuZSxpPWkubmV4dDt3aGlsZShpIT09ZSl9ZWxzZSBvPT09bnVsbCYmKGkuc2hhcmVkLmxhbmVzPTApO1dvfD1sLHQubGFuZXM9bCx0Lm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gR3kodCxlLG4pe2lmKHQ9ZS5lZmZlY3RzLGUuZWZmZWN0cz1udWxsLHQhPT1udWxsKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciByPXRbZV0saT1yLmNhbGxiYWNrO2lmKGkhPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTkxLGkpKTtpLmNhbGwocil9fX12YXIgRjE9bmV3IGpfLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gJHAodCxlLG4scil7ZT10Lm1lbW9pemVkU3RhdGUsbj1uKHIsZSksbj1uPT1udWxsP2U6Z3Qoe30sZSxuKSx0Lm1lbW9pemVkU3RhdGU9bix0LmxhbmVzPT09MCYmKHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBjZj17aXNNb3VudGVkOmZ1bmN0aW9uKHQpe3JldHVybih0PXQuX3JlYWN0SW50ZXJuYWxzKT90bCh0KT09PXQ6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbih0LGUsbil7dD10Ll9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkodCksbz11aShyLGkpO28ucGF5bG9hZD1lLG4hPW51bGwmJihvLmNhbGxiYWNrPW4pLGU9R2kodCxvLGkpLGUhPT1udWxsJiYoX3IoZSx0LGksciksQWMoZSx0LGkpKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUsbil7dD10Ll9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkodCksbz11aShyLGkpO28udGFnPTEsby5wYXlsb2FkPWUsbiE9bnVsbCYmKG8uY2FsbGJhY2s9biksZT1HaSh0LG8saSksZSE9PW51bGwmJihfcihlLHQsaSxyKSxBYyhlLHQsaSkpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24odCxlKXt0PXQuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPXZuKCkscj1YaSh0KSxpPXVpKG4scik7aS50YWc9MixlIT1udWxsJiYoaS5jYWxsYmFjaz1lKSxlPUdpKHQsaSxyKSxlIT09bnVsbCYmKF9yKGUsdCxyLG4pLEFjKGUsdCxyKSl9fTtmdW5jdGlvbiBZeSh0LGUsbixyLGksbyxsKXtyZXR1cm4gdD10LnN0YXRlTm9kZSx0eXBlb2YgdC5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/dC5zaG91bGRDb21wb25lbnRVcGRhdGUocixvLGwpOmUucHJvdG90eXBlJiZlLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hV2EobixyKXx8IVdhKGksbyk6ITB9ZnVuY3Rpb24gQjEodCxlLG4pe3ZhciByPSExLGk9bm8sbz1lLmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP289bnIobyk6KGk9VG4oZSk/Rm86cm4uY3VycmVudCxyPWUuY29udGV4dFR5cGVzLG89KHI9ciE9bnVsbCk/dHModCxpKTpubyksZT1uZXcgZShuLG8pLHQubWVtb2l6ZWRTdGF0ZT1lLnN0YXRlIT09bnVsbCYmZS5zdGF0ZSE9PXZvaWQgMD9lLnN0YXRlOm51bGwsZS51cGRhdGVyPWNmLHQuc3RhdGVOb2RlPWUsZS5fcmVhY3RJbnRlcm5hbHM9dCxyJiYodD10LnN0YXRlTm9kZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9aSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PW8pLGV9ZnVuY3Rpb24gWHkodCxlLG4scil7dD1lLnN0YXRlLHR5cGVvZiBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJmUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksZS5zdGF0ZSE9PXQmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpfWZ1bmN0aW9uIFRwKHQsZSxuLHIpe3ZhciBpPXQuc3RhdGVOb2RlO2kucHJvcHM9bixpLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxpLnJlZnM9RjEsa20odCk7dmFyIG89ZS5jb250ZXh0VHlwZTt0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP2kuY29udGV4dD1ucihvKToobz1UbihlKT9Gbzpybi5jdXJyZW50LGkuY29udGV4dD10cyh0LG8pKSxpLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxvPWUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBvPT0iZnVuY3Rpb24iJiYoJHAodCxlLG8sbiksaS5zdGF0ZT10Lm1lbW9pemVkU3RhdGUpLHR5cGVvZiBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KGU9aS5zdGF0ZSx0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksZSE9PWkuc3RhdGUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoaSxpLnN0YXRlLG51bGwpLGNkKHQsbixpLHIpLGkuc3RhdGU9dC5tZW1vaXplZFN0YXRlKSx0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIEhzKHQsZSxuKXtpZih0PW4ucmVmLHQhPT1udWxsJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVygzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihXKDE0Nyx0KSk7dmFyIGk9cixvPSIiK3Q7cmV0dXJuIGUhPT1udWxsJiZlLnJlZiE9PW51bGwmJnR5cGVvZiBlLnJlZj09ImZ1bmN0aW9uIiYmZS5yZWYuX3N0cmluZ1JlZj09PW8/ZS5yZWY6KGU9ZnVuY3Rpb24obCl7dmFyIHM9aS5yZWZzO3M9PT1GMSYmKHM9aS5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tvXTpzW29dPWx9LGUuX3N0cmluZ1JlZj1vLGUpfWlmKHR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBFcnJvcihXKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihXKDI5MCx0KSl9cmV0dXJuIHR9ZnVuY3Rpb24gc2ModCxlKXt0aHJvdyB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSxFcnJvcihXKDMxLHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSl9ZnVuY3Rpb24gUXkodCl7dmFyIGU9dC5faW5pdDtyZXR1cm4gZSh0Ll9wYXlsb2FkKX1mdW5jdGlvbiBVMSh0KXtmdW5jdGlvbiBlKHYseSl7aWYodCl7dmFyIHg9di5kZWxldGlvbnM7eD09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6eC5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIXQpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspZSh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBpKHYseSl7cmV0dXJuIHY9UWkodix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBvKHYseSx4KXtyZXR1cm4gdi5pbmRleD14LHQ/KHg9di5hbHRlcm5hdGUseCE9PW51bGw/KHg9eC5pbmRleCx4PHk/KHYuZmxhZ3N8PTIseSk6eCk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIHQmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHkseCxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT1iaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHkpOih5PWkoeSx4KSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LHgsUyl7dmFyIGI9eC50eXBlO3JldHVybiBiPT09JGw/Yyh2LHkseC5wcm9wcy5jaGlsZHJlbixTLHgua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1ifHx0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsJiZiLiQkdHlwZW9mPT09QWkmJlF5KGIpPT09eS50eXBlKT8oUz1pKHkseC5wcm9wcyksUy5yZWY9SHModix5LHgpLFMucmV0dXJuPXYsUyk6KFM9emMoeC50eXBlLHgua2V5LHgucHJvcHMsbnVsbCx2Lm1vZGUsUyksUy5yZWY9SHModix5LHgpLFMucmV0dXJuPXYsUyl9ZnVuY3Rpb24gdSh2LHkseCxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXguY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT14LmltcGxlbWVudGF0aW9uPyh5PSRoKHgsdi5tb2RlLFMpLHkucmV0dXJuPXYseSk6KHk9aSh5LHguY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LHgsUyxiKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1Nbyh4LHYubW9kZSxTLGIpLHkucmV0dXJuPXYseSk6KHk9aSh5LHgpLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHkseCl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT1iaCgiIit5LHYubW9kZSx4KSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIHg9emMoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUseCkseC5yZWY9SHModixudWxsLHkpLHgucmV0dXJuPXYseDtjYXNlIGJsOnJldHVybiB5PSRoKHksdi5tb2RlLHgpLHkucmV0dXJuPXYseTtjYXNlIEFpOnZhciBTPXkuX2luaXQ7cmV0dXJuIGQodixTKHkuX3BheWxvYWQpLHgpfWlmKGxhKHkpfHxGcyh5KSlyZXR1cm4geT1Nbyh5LHYubW9kZSx4LG51bGwpLHkucmV0dXJuPXYseTtzYyh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LHgsUyl7dmFyIGI9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiKXJldHVybiBiIT09bnVsbD9udWxsOnModix5LCIiK3gsUyk7aWYodHlwZW9mIHg9PSJvYmplY3QiJiZ4IT09bnVsbCl7c3dpdGNoKHguJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIHgua2V5PT09Yj9hKHYseSx4LFMpOm51bGw7Y2FzZSBibDpyZXR1cm4geC5rZXk9PT1iP3Uodix5LHgsUyk6bnVsbDtjYXNlIEFpOnJldHVybiBiPXguX2luaXQsZih2LHksYih4Ll9wYXlsb2FkKSxTKX1pZihsYSh4KXx8RnMoeCkpcmV0dXJuIGIhPT1udWxsP251bGw6Yyh2LHkseCxTLG51bGwpO3NjKHYseCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHkseCxTLGIpe2lmKHR5cGVvZiBTPT0ic3RyaW5nIiYmUyE9PSIifHx0eXBlb2YgUz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoeCl8fG51bGwscyh5LHYsIiIrUyxiKTtpZih0eXBlb2YgUz09Im9iamVjdCImJlMhPT1udWxsKXtzd2l0Y2goUy4kJHR5cGVvZil7Y2FzZSBYdTpyZXR1cm4gdj12LmdldChTLmtleT09PW51bGw/eDpTLmtleSl8fG51bGwsYSh5LHYsUyxiKTtjYXNlIGJsOnJldHVybiB2PXYuZ2V0KFMua2V5PT09bnVsbD94OlMua2V5KXx8bnVsbCx1KHksdixTLGIpO2Nhc2UgQWk6dmFyIFQ9Uy5faW5pdDtyZXR1cm4gaCh2LHkseCxUKFMuX3BheWxvYWQpLGIpfWlmKGxhKFMpfHxGcyhTKSlyZXR1cm4gdj12LmdldCh4KXx8bnVsbCxjKHksdixTLGIsbnVsbCk7c2MoeSxTKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtKHYseSx4LFMpe2Zvcih2YXIgYj1udWxsLFQ9bnVsbCwkPXksTz15PTAsTD1udWxsOyQhPT1udWxsJiZPPHgubGVuZ3RoO08rKyl7JC5pbmRleD5PPyhMPSQsJD1udWxsKTpMPSQuc2libGluZzt2YXIgUD1mKHYsJCx4W09dLFMpO2lmKFA9PT1udWxsKXskPT09bnVsbCYmKCQ9TCk7YnJlYWt9dCYmJCYmUC5hbHRlcm5hdGU9PT1udWxsJiZlKHYsJCkseT1vKFAseSxPKSxUPT09bnVsbD9iPVA6VC5zaWJsaW5nPVAsVD1QLCQ9TH1pZihPPT09eC5sZW5ndGgpcmV0dXJuIG4odiwkKSxvdCYmQ28odixPKSxiO2lmKCQ9PT1udWxsKXtmb3IoO088eC5sZW5ndGg7TysrKSQ9ZCh2LHhbT10sUyksJCE9PW51bGwmJih5PW8oJCx5LE8pLFQ9PT1udWxsP2I9JDpULnNpYmxpbmc9JCxUPSQpO3JldHVybiBvdCYmQ28odixPKSxifWZvcigkPXIodiwkKTtPPHgubGVuZ3RoO08rKylMPWgoJCx2LE8seFtPXSxTKSxMIT09bnVsbCYmKHQmJkwuYWx0ZXJuYXRlIT09bnVsbCYmJC5kZWxldGUoTC5rZXk9PT1udWxsP086TC5rZXkpLHk9byhMLHksTyksVD09PW51bGw/Yj1MOlQuc2libGluZz1MLFQ9TCk7cmV0dXJuIHQmJiQuZm9yRWFjaChmdW5jdGlvbihEKXtyZXR1cm4gZSh2LEQpfSksb3QmJkNvKHYsTyksYn1mdW5jdGlvbiBnKHYseSx4LFMpe3ZhciBiPUZzKHgpO2lmKHR5cGVvZiBiIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTUwKSk7aWYoeD1iLmNhbGwoeCkseD09bnVsbCl0aHJvdyBFcnJvcihXKDE1MSkpO2Zvcih2YXIgVD1iPW51bGwsJD15LE89eT0wLEw9bnVsbCxQPXgubmV4dCgpOyQhPT1udWxsJiYhUC5kb25lO08rKyxQPXgubmV4dCgpKXskLmluZGV4Pk8/KEw9JCwkPW51bGwpOkw9JC5zaWJsaW5nO3ZhciBEPWYodiwkLFAudmFsdWUsUyk7aWYoRD09PW51bGwpeyQ9PT1udWxsJiYoJD1MKTticmVha310JiYkJiZELmFsdGVybmF0ZT09PW51bGwmJmUodiwkKSx5PW8oRCx5LE8pLFQ9PT1udWxsP2I9RDpULnNpYmxpbmc9RCxUPUQsJD1MfWlmKFAuZG9uZSlyZXR1cm4gbih2LCQpLG90JiZDbyh2LE8pLGI7aWYoJD09PW51bGwpe2Zvcig7IVAuZG9uZTtPKyssUD14Lm5leHQoKSlQPWQodixQLnZhbHVlLFMpLFAhPT1udWxsJiYoeT1vKFAseSxPKSxUPT09bnVsbD9iPVA6VC5zaWJsaW5nPVAsVD1QKTtyZXR1cm4gb3QmJkNvKHYsTyksYn1mb3IoJD1yKHYsJCk7IVAuZG9uZTtPKyssUD14Lm5leHQoKSlQPWgoJCx2LE8sUC52YWx1ZSxTKSxQIT09bnVsbCYmKHQmJlAuYWx0ZXJuYXRlIT09bnVsbCYmJC5kZWxldGUoUC5rZXk9PT1udWxsP086UC5rZXkpLHk9byhQLHksTyksVD09PW51bGw/Yj1QOlQuc2libGluZz1QLFQ9UCk7cmV0dXJuIHQmJiQuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gZSh2LEIpfSksb3QmJkNvKHYsTyksYn1mdW5jdGlvbiB3KHYseSx4LFMpe2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJngudHlwZT09PSRsJiZ4LmtleT09PW51bGwmJih4PXgucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwpe3N3aXRjaCh4LiQkdHlwZW9mKXtjYXNlIFh1OmU6e2Zvcih2YXIgYj14LmtleSxUPXk7VCE9PW51bGw7KXtpZihULmtleT09PWIpe2lmKGI9eC50eXBlLGI9PT0kbCl7aWYoVC50YWc9PT03KXtuKHYsVC5zaWJsaW5nKSx5PWkoVCx4LnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKFQuZWxlbWVudFR5cGU9PT1ifHx0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsJiZiLiQkdHlwZW9mPT09QWkmJlF5KGIpPT09VC50eXBlKXtuKHYsVC5zaWJsaW5nKSx5PWkoVCx4LnByb3BzKSx5LnJlZj1Icyh2LFQseCkseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsVCk7YnJlYWt9ZWxzZSBlKHYsVCk7VD1ULnNpYmxpbmd9eC50eXBlPT09JGw/KHk9TW8oeC5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsUyx4LmtleSkseS5yZXR1cm49dix2PXkpOihTPXpjKHgudHlwZSx4LmtleSx4LnByb3BzLG51bGwsdi5tb2RlLFMpLFMucmVmPUhzKHYseSx4KSxTLnJldHVybj12LHY9Uyl9cmV0dXJuIGwodik7Y2FzZSBibDplOntmb3IoVD14LmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09VClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT14LmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09eC5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1pKHkseC5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSBlKHYseSk7eT15LnNpYmxpbmd9eT0kaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIEFpOnJldHVybiBUPXguX2luaXQsdyh2LHksVCh4Ll9wYXlsb2FkKSxTKX1pZihsYSh4KSlyZXR1cm4gbSh2LHkseCxTKTtpZihGcyh4KSlyZXR1cm4gZyh2LHkseCxTKTtzYyh2LHgpfXJldHVybiB0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiPyh4PSIiK3gseSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1pKHkseCkseS5yZXR1cm49dix2PXkpOihuKHYseSkseT1iaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiB3fXZhciBycz1VMSghMCksVzE9VTEoITEpLEF1PXt9LEZyPW1vKEF1KSxaYT1tbyhBdSksR2E9bW8oQXUpO2Z1bmN0aW9uIFJvKHQpe2lmKHQ9PT1BdSl0aHJvdyBFcnJvcihXKDE3NCkpO3JldHVybiB0fWZ1bmN0aW9uIGJtKHQsZSl7c3dpdGNoKFhlKEdhLGUpLFhlKFphLHQpLFhlKEZyLEF1KSx0PWUubm9kZVR5cGUsdCl7Y2FzZSA5OmNhc2UgMTE6ZT0oZT1lLmRvY3VtZW50RWxlbWVudCk/ZS5uYW1lc3BhY2VVUkk6bHAobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDp0PXQ9PT04P2UucGFyZW50Tm9kZTplLGU9dC5uYW1lc3BhY2VVUkl8fG51bGwsdD10LnRhZ05hbWUsZT1scChlLHQpfWl0KEZyKSxYZShGcixlKX1mdW5jdGlvbiBpcygpe2l0KEZyKSxpdChaYSksaXQoR2EpfWZ1bmN0aW9uIFYxKHQpe1JvKEdhLmN1cnJlbnQpO3ZhciBlPVJvKEZyLmN1cnJlbnQpLG49bHAoZSx0LnR5cGUpO2UhPT1uJiYoWGUoWmEsdCksWGUoRnIsbikpfWZ1bmN0aW9uICRtKHQpe1phLmN1cnJlbnQ9PT10JiYoaXQoRnIpLGl0KFphKSl9dmFyIGR0PW1vKDApO2Z1bmN0aW9uIGRkKHQpe2Zvcih2YXIgZT10O2UhPT1udWxsOyl7aWYoZS50YWc9PT0xMyl7dmFyIG49ZS5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiBlfWVsc2UgaWYoZS50YWc9PT0xOSYmZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZihlLmZsYWdzJjEyOClyZXR1cm4gZX1lbHNlIGlmKGUuY2hpbGQhPT1udWxsKXtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZDtjb250aW51ZX1pZihlPT09dClicmVhaztmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClyZXR1cm4gbnVsbDtlPWUucmV0dXJufWUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIF9oPVtdO2Z1bmN0aW9uIFRtKCl7Zm9yKHZhciB0PTA7dDxfaC5sZW5ndGg7dCsrKV9oW3RdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7X2gubGVuZ3RoPTB9dmFyIE1jPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsd2g9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsVW89MCxodD1udWxsLFJ0PW51bGwsSXQ9bnVsbCxmZD0hMSx5YT0hMSxZYT0wLGxUPTA7ZnVuY3Rpb24gWXQoKXt0aHJvdyBFcnJvcihXKDMyMSkpfWZ1bmN0aW9uIE5tKHQsZSl7aWYoZT09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aCYmbjx0Lmxlbmd0aDtuKyspaWYoIUVyKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUm0odCxlLG4scixpLG8pe2lmKFVvPW8saHQ9ZSxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGwsZS5sYW5lcz0wLE1jLmN1cnJlbnQ9dD09PW51bGx8fHQubWVtb2l6ZWRTdGF0ZT09PW51bGw/Y1Q6ZFQsdD1uKHIsaSkseWEpe289MDtkb3tpZih5YT0hMSxZYT0wLDI1PD1vKXRocm93IEVycm9yKFcoMzAxKSk7bys9MSxJdD1SdD1udWxsLGUudXBkYXRlUXVldWU9bnVsbCxNYy5jdXJyZW50PWZULHQ9bihyLGkpfXdoaWxlKHlhKX1pZihNYy5jdXJyZW50PWhkLGU9UnQhPT1udWxsJiZSdC5uZXh0IT09bnVsbCxVbz0wLEl0PVJ0PWh0PW51bGwsZmQ9ITEsZSl0aHJvdyBFcnJvcihXKDMwMCkpO3JldHVybiB0fWZ1bmN0aW9uIE9tKCl7dmFyIHQ9WWEhPT0wO3JldHVybiBZYT0wLHR9ZnVuY3Rpb24gUHIoKXt2YXIgdD17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gSXQ9PT1udWxsP2h0Lm1lbW9pemVkU3RhdGU9SXQ9dDpJdD1JdC5uZXh0PXQsSXR9ZnVuY3Rpb24gcnIoKXtpZihSdD09PW51bGwpe3ZhciB0PWh0LmFsdGVybmF0ZTt0PXQhPT1udWxsP3QubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgdD1SdC5uZXh0O3ZhciBlPUl0PT09bnVsbD9odC5tZW1vaXplZFN0YXRlOkl0Lm5leHQ7aWYoZSE9PW51bGwpSXQ9ZSxSdD10O2Vsc2V7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoVygzMTApKTtSdD10LHQ9e21lbW9pemVkU3RhdGU6UnQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6UnQuYmFzZVN0YXRlLGJhc2VRdWV1ZTpSdC5iYXNlUXVldWUscXVldWU6UnQucXVldWUsbmV4dDpudWxsfSxJdD09PW51bGw/aHQubWVtb2l6ZWRTdGF0ZT1JdD10Okl0PUl0Lm5leHQ9dH1yZXR1cm4gSXR9ZnVuY3Rpb24gWGEodCxlKXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplfWZ1bmN0aW9uIFNoKHQpe3ZhciBlPXJyKCksbj1lLnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPXQ7dmFyIHI9UnQsaT1yLmJhc2VRdWV1ZSxvPW4ucGVuZGluZztpZihvIT09bnVsbCl7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9by5uZXh0LG8ubmV4dD1sfXIuYmFzZVF1ZXVlPWk9byxuLnBlbmRpbmc9bnVsbH1pZihpIT09bnVsbCl7bz1pLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9bztkb3t2YXIgYz11LmxhbmU7aWYoKFVvJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTp0KHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLGh0LmxhbmVzfD1jLFdvfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09byk7YT09PW51bGw/bD1yOmEubmV4dD1zLEVyKHIsZS5tZW1vaXplZFN0YXRlKXx8KGJuPSEwKSxlLm1lbW9pemVkU3RhdGU9cixlLmJhc2VTdGF0ZT1sLGUuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKHQ9bi5pbnRlcmxlYXZlZCx0IT09bnVsbCl7aT10O2RvIG89aS5sYW5lLGh0LmxhbmVzfD1vLFdvfD1vLGk9aS5uZXh0O3doaWxlKGkhPT10KX1lbHNlIGk9PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bZS5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIEVoKHQpe3ZhciBlPXJyKCksbj1lLnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPXQ7dmFyIHI9bi5kaXNwYXRjaCxpPW4ucGVuZGluZyxvPWUubWVtb2l6ZWRTdGF0ZTtpZihpIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9aT1pLm5leHQ7ZG8gbz10KG8sbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1pKTtFcihvLGUubWVtb2l6ZWRTdGF0ZSl8fChibj0hMCksZS5tZW1vaXplZFN0YXRlPW8sZS5iYXNlUXVldWU9PT1udWxsJiYoZS5iYXNlU3RhdGU9byksbi5sYXN0UmVuZGVyZWRTdGF0ZT1vfXJldHVybltvLHJdfWZ1bmN0aW9uIEgxKCl7fWZ1bmN0aW9uIEsxKHQsZSl7dmFyIG49aHQscj1ycigpLGk9ZSgpLG89IUVyKHIubWVtb2l6ZWRTdGF0ZSxpKTtpZihvJiYoci5tZW1vaXplZFN0YXRlPWksYm49ITApLHI9ci5xdWV1ZSxQbShZMS5iaW5kKG51bGwsbixyLHQpLFt0XSksci5nZXRTbmFwc2hvdCE9PWV8fG98fEl0IT09bnVsbCYmSXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxRYSg5LEcxLmJpbmQobnVsbCxuLHIsaSxlKSx2b2lkIDAsbnVsbCksQnQ9PT1udWxsKXRocm93IEVycm9yKFcoMzQ5KSk7VW8mMzB8fFoxKG4sZSxpKX1yZXR1cm4gaX1mdW5jdGlvbiBaMSh0LGUsbil7dC5mbGFnc3w9MTYzODQsdD17Z2V0U25hcHNob3Q6ZSx2YWx1ZTpufSxlPWh0LnVwZGF0ZVF1ZXVlLGU9PT1udWxsPyhlPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGh0LnVwZGF0ZVF1ZXVlPWUsZS5zdG9yZXM9W3RdKToobj1lLnN0b3JlcyxuPT09bnVsbD9lLnN0b3Jlcz1bdF06bi5wdXNoKHQpKX1mdW5jdGlvbiBHMSh0LGUsbixyKXtlLnZhbHVlPW4sZS5nZXRTbmFwc2hvdD1yLFgxKGUpJiZRMSh0KX1mdW5jdGlvbiBZMSh0LGUsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtYMShlKSYmUTEodCl9KX1mdW5jdGlvbiBYMSh0KXt2YXIgZT10LmdldFNuYXBzaG90O3Q9dC52YWx1ZTt0cnl7dmFyIG49ZSgpO3JldHVybiFFcih0LG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBRMSh0KXt2YXIgZT1oaSh0LDEpO2UhPT1udWxsJiZfcihlLHQsMSwtMSl9ZnVuY3Rpb24gSnkodCl7dmFyIGU9UHIoKTtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiImJih0PXQoKSksZS5tZW1vaXplZFN0YXRlPWUuYmFzZVN0YXRlPXQsdD17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6WGEsbGFzdFJlbmRlcmVkU3RhdGU6dH0sZS5xdWV1ZT10LHQ9dC5kaXNwYXRjaD11VC5iaW5kKG51bGwsaHQsdCksW2UubWVtb2l6ZWRTdGF0ZSx0XX1mdW5jdGlvbiBRYSh0LGUsbixyKXtyZXR1cm4gdD17dGFnOnQsY3JlYXRlOmUsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LGU9aHQudXBkYXRlUXVldWUsZT09PW51bGw/KGU9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0saHQudXBkYXRlUXVldWU9ZSxlLmxhc3RFZmZlY3Q9dC5uZXh0PXQpOihuPWUubGFzdEVmZmVjdCxuPT09bnVsbD9lLmxhc3RFZmZlY3Q9dC5uZXh0PXQ6KHI9bi5uZXh0LG4ubmV4dD10LHQubmV4dD1yLGUubGFzdEVmZmVjdD10KSksdH1mdW5jdGlvbiBKMSgpe3JldHVybiBycigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gTGModCxlLG4scil7dmFyIGk9UHIoKTtodC5mbGFnc3w9dCxpLm1lbW9pemVkU3RhdGU9UWEoMXxlLG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBkZih0LGUsbixyKXt2YXIgaT1ycigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIG89dm9pZCAwO2lmKFJ0IT09bnVsbCl7dmFyIGw9UnQubWVtb2l6ZWRTdGF0ZTtpZihvPWwuZGVzdHJveSxyIT09bnVsbCYmTm0ocixsLmRlcHMpKXtpLm1lbW9pemVkU3RhdGU9UWEoZSxuLG8scik7cmV0dXJufX1odC5mbGFnc3w9dCxpLm1lbW9pemVkU3RhdGU9UWEoMXxlLG4sbyxyKX1mdW5jdGlvbiBxeSh0LGUpe3JldHVybiBMYyg4MzkwNjU2LDgsdCxlKX1mdW5jdGlvbiBQbSh0LGUpe3JldHVybiBkZigyMDQ4LDgsdCxlKX1mdW5jdGlvbiBxMSh0LGUpe3JldHVybiBkZig0LDIsdCxlKX1mdW5jdGlvbiBldyh0LGUpe3JldHVybiBkZig0LDQsdCxlKX1mdW5jdGlvbiB0dyh0LGUpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiB0PXQoKSxlKHQpLGZ1bmN0aW9uKCl7ZShudWxsKX07aWYoZSE9bnVsbClyZXR1cm4gdD10KCksZS5jdXJyZW50PXQsZnVuY3Rpb24oKXtlLmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gbncodCxlLG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW3RdKTpudWxsLGRmKDQsNCx0dy5iaW5kKG51bGwsZSx0KSxuKX1mdW5jdGlvbiBBbSgpe31mdW5jdGlvbiBydyh0LGUpe3ZhciBuPXJyKCk7ZT1lPT09dm9pZCAwP251bGw6ZTt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZlIT09bnVsbCYmTm0oZSxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W3QsZV0sdCl9ZnVuY3Rpb24gaXcodCxlKXt2YXIgbj1ycigpO2U9ZT09PXZvaWQgMD9udWxsOmU7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmZSE9PW51bGwmJk5tKGUsclsxXSk/clswXToodD10KCksbi5tZW1vaXplZFN0YXRlPVt0LGVdLHQpfWZ1bmN0aW9uIG93KHQsZSxuKXtyZXR1cm4gVW8mMjE/KEVyKG4sZSl8fChuPWExKCksaHQubGFuZXN8PW4sV298PW4sdC5iYXNlU3RhdGU9ITApLGUpOih0LmJhc2VTdGF0ZSYmKHQuYmFzZVN0YXRlPSExLGJuPSEwKSx0Lm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gc1QodCxlKXt2YXIgbj1XZTtXZT1uIT09MCYmND5uP246NCx0KCEwKTt2YXIgcj13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249e307dHJ5e3QoITEpLGUoKX1maW5hbGx5e1dlPW4sd2gudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBsdygpe3JldHVybiBycigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYVQodCxlLG4pe3ZhciByPVhpKHQpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LHN3KHQpKWF3KGUsbik7ZWxzZSBpZihuPWoxKHQsZSxuLHIpLG4hPT1udWxsKXt2YXIgaT12bigpO19yKG4sdCxyLGkpLHV3KG4sZSxyKX19ZnVuY3Rpb24gdVQodCxlLG4pe3ZhciByPVhpKHQpLGk9e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKHN3KHQpKWF3KGUsaSk7ZWxzZXt2YXIgbz10LmFsdGVybmF0ZTtpZih0LmxhbmVzPT09MCYmKG89PT1udWxsfHxvLmxhbmVzPT09MCkmJihvPWUubGFzdFJlbmRlcmVkUmVkdWNlcixvIT09bnVsbCkpdHJ5e3ZhciBsPWUubGFzdFJlbmRlcmVkU3RhdGUscz1vKGwsbik7aWYoaS5oYXNFYWdlclN0YXRlPSEwLGkuZWFnZXJTdGF0ZT1zLEVyKHMsbCkpe3ZhciBhPWUuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KGkubmV4dD1pLENtKGUpKTooaS5uZXh0PWEubmV4dCxhLm5leHQ9aSksZS5pbnRlcmxlYXZlZD1pO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49ajEodCxlLGksciksbiE9PW51bGwmJihpPXZuKCksX3Iobix0LHIsaSksdXcobixlLHIpKX19ZnVuY3Rpb24gc3codCl7dmFyIGU9dC5hbHRlcm5hdGU7cmV0dXJuIHQ9PT1odHx8ZSE9PW51bGwmJmU9PT1odH1mdW5jdGlvbiBhdyh0LGUpe3lhPWZkPSEwO3ZhciBuPXQucGVuZGluZztuPT09bnVsbD9lLm5leHQ9ZTooZS5uZXh0PW4ubmV4dCxuLm5leHQ9ZSksdC5wZW5kaW5nPWV9ZnVuY3Rpb24gdXcodCxlLG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9ZS5sYW5lcztyJj10LnBlbmRpbmdMYW5lcyxufD1yLGUubGFuZXM9bixjbSh0LG4pfX12YXIgaGQ9e3JlYWRDb250ZXh0Om5yLHVzZUNhbGxiYWNrOll0LHVzZUNvbnRleHQ6WXQsdXNlRWZmZWN0Oll0LHVzZUltcGVyYXRpdmVIYW5kbGU6WXQsdXNlSW5zZXJ0aW9uRWZmZWN0Oll0LHVzZUxheW91dEVmZmVjdDpZdCx1c2VNZW1vOll0LHVzZVJlZHVjZXI6WXQsdXNlUmVmOll0LHVzZVN0YXRlOll0LHVzZURlYnVnVmFsdWU6WXQsdXNlRGVmZXJyZWRWYWx1ZTpZdCx1c2VUcmFuc2l0aW9uOll0LHVzZU11dGFibGVTb3VyY2U6WXQsdXNlU3luY0V4dGVybmFsU3RvcmU6WXQsdXNlSWQ6WXQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxjVD17cmVhZENvbnRleHQ6bnIsdXNlQ2FsbGJhY2s6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUHIoKS5tZW1vaXplZFN0YXRlPVt0LGU9PT12b2lkIDA/bnVsbDplXSx0fSx1c2VDb250ZXh0Om5yLHVzZUVmZmVjdDpxeSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFt0XSk6bnVsbCxMYyg0MTk0MzA4LDQsdHcuYmluZChudWxsLGUsdCksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiBMYyg0MTk0MzA4LDQsdCxlKX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExjKDQsMix0LGUpfSx1c2VNZW1vOmZ1bmN0aW9uKHQsZSl7dmFyIG49UHIoKTtyZXR1cm4gZT1lPT09dm9pZCAwP251bGw6ZSx0PXQoKSxuLm1lbW9pemVkU3RhdGU9W3QsZV0sdH0sdXNlUmVkdWNlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9UHIoKTtyZXR1cm4gZT1uIT09dm9pZCAwP24oZSk6ZSxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9ZSx0PXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjp0LGxhc3RSZW5kZXJlZFN0YXRlOmV9LHIucXVldWU9dCx0PXQuZGlzcGF0Y2g9YVQuYmluZChudWxsLGh0LHQpLFtyLm1lbW9pemVkU3RhdGUsdF19LHVzZVJlZjpmdW5jdGlvbih0KXt2YXIgZT1QcigpO3JldHVybiB0PXtjdXJyZW50OnR9LGUubWVtb2l6ZWRTdGF0ZT10fSx1c2VTdGF0ZTpKeSx1c2VEZWJ1Z1ZhbHVlOkFtLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIFByKCkubWVtb2l6ZWRTdGF0ZT10fSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9SnkoITEpLGU9dFswXTtyZXR1cm4gdD1zVC5iaW5kKG51bGwsdFsxXSksUHIoKS5tZW1vaXplZFN0YXRlPXQsW2UsdF19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1odCxpPVByKCk7aWYob3Qpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVyg0MDcpKTtuPW4oKX1lbHNle2lmKG49ZSgpLEJ0PT09bnVsbCl0aHJvdyBFcnJvcihXKDM0OSkpO1VvJjMwfHxaMShyLGUsbil9aS5tZW1vaXplZFN0YXRlPW47dmFyIG89e3ZhbHVlOm4sZ2V0U25hcHNob3Q6ZX07cmV0dXJuIGkucXVldWU9byxxeShZMS5iaW5kKG51bGwscixvLHQpLFt0XSksci5mbGFnc3w9MjA0OCxRYSg5LEcxLmJpbmQobnVsbCxyLG8sbixlKSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgdD1QcigpLGU9QnQuaWRlbnRpZmllclByZWZpeDtpZihvdCl7dmFyIG49YWkscj1zaTtuPShyJn4oMTw8MzIteHIociktMSkpLnRvU3RyaW5nKDMyKStuLGU9IjoiK2UrIlIiK24sbj1ZYSsrLDA8biYmKGUrPSJIIituLnRvU3RyaW5nKDMyKSksZSs9IjoifWVsc2Ugbj1sVCsrLGU9IjoiK2UrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gdC5tZW1vaXplZFN0YXRlPWV9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZFQ9e3JlYWRDb250ZXh0Om5yLHVzZUNhbGxiYWNrOnJ3LHVzZUNvbnRleHQ6bnIsdXNlRWZmZWN0OlBtLHVzZUltcGVyYXRpdmVIYW5kbGU6bncsdXNlSW5zZXJ0aW9uRWZmZWN0OnExLHVzZUxheW91dEVmZmVjdDpldyx1c2VNZW1vOml3LHVzZVJlZHVjZXI6U2gsdXNlUmVmOkoxLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIFNoKFhhKX0sdXNlRGVidWdWYWx1ZTpBbSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXJyKCk7cmV0dXJuIG93KGUsUnQubWVtb2l6ZWRTdGF0ZSx0KX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciB0PVNoKFhhKVswXSxlPXJyKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bdCxlXX0sdXNlTXV0YWJsZVNvdXJjZTpIMSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpLMSx1c2VJZDpsdyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGZUPXtyZWFkQ29udGV4dDpucix1c2VDYWxsYmFjazpydyx1c2VDb250ZXh0Om5yLHVzZUVmZmVjdDpQbSx1c2VJbXBlcmF0aXZlSGFuZGxlOm53LHVzZUluc2VydGlvbkVmZmVjdDpxMSx1c2VMYXlvdXRFZmZlY3Q6ZXcsdXNlTWVtbzppdyx1c2VSZWR1Y2VyOkVoLHVzZVJlZjpKMSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBFaChYYSl9LHVzZURlYnVnVmFsdWU6QW0sdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1ycigpO3JldHVybiBSdD09PW51bGw/ZS5tZW1vaXplZFN0YXRlPXQ6b3coZSxSdC5tZW1vaXplZFN0YXRlLHQpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9RWgoWGEpWzBdLGU9cnIoKS5tZW1vaXplZFN0YXRlO3JldHVyblt0LGVdfSx1c2VNdXRhYmxlU291cmNlOkgxLHVzZVN5bmNFeHRlcm5hbFN0b3JlOksxLHVzZUlkOmx3LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gb3ModCxlKXt0cnl7dmFyIG49IiIscj1lO2RvIG4rPUZiKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIGk9bn1jYXRjaChvKXtpPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtvLm1lc3NhZ2UrYApgK28uc3RhY2t9cmV0dXJue3ZhbHVlOnQsc291cmNlOmUsc3RhY2s6aSxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gQ2godCxlLG4pe3JldHVybnt2YWx1ZTp0LHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OmU/P251bGx9fWZ1bmN0aW9uIE5wKHQsZSl7dHJ5e2NvbnNvbGUuZXJyb3IoZS52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGhUPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGN3KHQsZSxuKXtuPXVpKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPWUudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtnZHx8KGdkPSEwLHpwPXIpLE5wKHQsZSl9LG59ZnVuY3Rpb24gZHcodCxlLG4pe249dWkoLTEsbiksbi50YWc9Mzt2YXIgcj10LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgaT1lLnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKGkpfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7TnAodCxlKX19dmFyIG89dC5zdGF0ZU5vZGU7cmV0dXJuIG8hPT1udWxsJiZ0eXBlb2Ygby5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtOcCh0LGUpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsP1lpPW5ldyBTZXQoW3RoaXNdKTpZaS5hZGQodGhpcykpO3ZhciBsPWUuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChlLnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIGUwKHQsZSxuKXt2YXIgcj10LnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj10LnBpbmdDYWNoZT1uZXcgaFQ7dmFyIGk9bmV3IFNldDtyLnNldChlLGkpfWVsc2UgaT1yLmdldChlKSxpPT09dm9pZCAwJiYoaT1uZXcgU2V0LHIuc2V0KGUsaSkpO2kuaGFzKG4pfHwoaS5hZGQobiksdD0kVC5iaW5kKG51bGwsdCxlLG4pLGUudGhlbih0LHQpKX1mdW5jdGlvbiB0MCh0KXtkb3t2YXIgZTtpZigoZT10LnRhZz09PTEzKSYmKGU9dC5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkIT09bnVsbDohMCksZSlyZXR1cm4gdDt0PXQucmV0dXJufXdoaWxlKHQhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBuMCh0LGUsbixyLGkpe3JldHVybiB0Lm1vZGUmMT8odC5mbGFnc3w9NjU1MzYsdC5sYW5lcz1pLHQpOih0PT09ZT90LmZsYWdzfD02NTUzNjoodC5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3OihlPXVpKC0xLDEpLGUudGFnPTIsR2kobixlLDEpKSksbi5sYW5lc3w9MSksdCl9dmFyIHBUPXhpLlJlYWN0Q3VycmVudE93bmVyLGJuPSExO2Z1bmN0aW9uIHVuKHQsZSxuLHIpe2UuY2hpbGQ9dD09PW51bGw/VzEoZSxudWxsLG4scik6cnMoZSx0LmNoaWxkLG4scil9ZnVuY3Rpb24gcjAodCxlLG4scixpKXtuPW4ucmVuZGVyO3ZhciBvPWUucmVmO3JldHVybiBLbChlLGkpLHI9Um0odCxlLG4scixvLGkpLG49T20oKSx0IT09bnVsbCYmIWJuPyhlLnVwZGF0ZVF1ZXVlPXQudXBkYXRlUXVldWUsZS5mbGFncyY9LTIwNTMsdC5sYW5lcyY9fmkscGkodCxlLGkpKToob3QmJm4mJnltKGUpLGUuZmxhZ3N8PTEsdW4odCxlLHIsaSksZS5jaGlsZCl9ZnVuY3Rpb24gaTAodCxlLG4scixpKXtpZih0PT09bnVsbCl7dmFyIG89bi50eXBlO3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIiYmIUJtKG8pJiZvLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KGUudGFnPTE1LGUudHlwZT1vLGZ3KHQsZSxvLHIsaSkpOih0PXpjKG4udHlwZSxudWxsLHIsZSxlLm1vZGUsaSksdC5yZWY9ZS5yZWYsdC5yZXR1cm49ZSxlLmNoaWxkPXQpfWlmKG89dC5jaGlsZCwhKHQubGFuZXMmaSkpe3ZhciBsPW8ubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246V2EsbihsLHIpJiZ0LnJlZj09PWUucmVmKXJldHVybiBwaSh0LGUsaSl9cmV0dXJuIGUuZmxhZ3N8PTEsdD1RaShvLHIpLHQucmVmPWUucmVmLHQucmV0dXJuPWUsZS5jaGlsZD10fWZ1bmN0aW9uIGZ3KHQsZSxuLHIsaSl7aWYodCE9PW51bGwpe3ZhciBvPXQubWVtb2l6ZWRQcm9wcztpZihXYShvLHIpJiZ0LnJlZj09PWUucmVmKWlmKGJuPSExLGUucGVuZGluZ1Byb3BzPXI9bywodC5sYW5lcyZpKSE9PTApdC5mbGFncyYxMzEwNzImJihibj0hMCk7ZWxzZSByZXR1cm4gZS5sYW5lcz10LmxhbmVzLHBpKHQsZSxpKX1yZXR1cm4gUnAodCxlLG4scixpKX1mdW5jdGlvbiBodyh0LGUsbil7dmFyIHI9ZS5wZW5kaW5nUHJvcHMsaT1yLmNoaWxkcmVuLG89dCE9PW51bGw/dC5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoIShlLm1vZGUmMSkpZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxYZShEbCxBbiksQW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIHQ9byE9PW51bGw/by5iYXNlTGFuZXN8bjpuLGUubGFuZXM9ZS5jaGlsZExhbmVzPTEwNzM3NDE4MjQsZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6dCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxlLnVwZGF0ZVF1ZXVlPW51bGwsWGUoRGwsQW4pLEFufD10LG51bGw7ZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPW8hPT1udWxsP28uYmFzZUxhbmVzOm4sWGUoRGwsQW4pLEFufD1yfWVsc2UgbyE9PW51bGw/KHI9by5iYXNlTGFuZXN8bixlLm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFhlKERsLEFuKSxBbnw9cjtyZXR1cm4gdW4odCxlLGksbiksZS5jaGlsZH1mdW5jdGlvbiBwdyh0LGUpe3ZhciBuPWUucmVmOyh0PT09bnVsbCYmbiE9PW51bGx8fHQhPT1udWxsJiZ0LnJlZiE9PW4pJiYoZS5mbGFnc3w9NTEyLGUuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIFJwKHQsZSxuLHIsaSl7dmFyIG89VG4obik/Rm86cm4uY3VycmVudDtyZXR1cm4gbz10cyhlLG8pLEtsKGUsaSksbj1SbSh0LGUsbixyLG8saSkscj1PbSgpLHQhPT1udWxsJiYhYm4/KGUudXBkYXRlUXVldWU9dC51cGRhdGVRdWV1ZSxlLmZsYWdzJj0tMjA1Myx0LmxhbmVzJj1+aSxwaSh0LGUsaSkpOihvdCYmciYmeW0oZSksZS5mbGFnc3w9MSx1bih0LGUsbixpKSxlLmNoaWxkKX1mdW5jdGlvbiBvMCh0LGUsbixyLGkpe2lmKFRuKG4pKXt2YXIgbz0hMDtvZChlKX1lbHNlIG89ITE7aWYoS2woZSxpKSxlLnN0YXRlTm9kZT09PW51bGwpSWModCxlKSxCMShlLG4sciksVHAoZSxuLHIsaSkscj0hMDtlbHNlIGlmKHQ9PT1udWxsKXt2YXIgbD1lLnN0YXRlTm9kZSxzPWUubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9bnIodSk6KHU9VG4obik/Rm86cm4uY3VycmVudCx1PXRzKGUsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmWHkoZSxsLHIsdSksTWk9ITE7dmFyIGY9ZS5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixjZChlLHIsbCxpKSxhPWUubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fCRuLmN1cnJlbnR8fE1pPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKCRwKGUsbixjLHIpLGE9ZS5tZW1vaXplZFN0YXRlKSwocz1NaXx8WXkoZSxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpLGUubWVtb2l6ZWRQcm9wcz1yLGUubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPWUuc3RhdGVOb2RlLHoxKHQsZSkscz1lLm1lbW9pemVkUHJvcHMsdT1lLnR5cGU9PT1lLmVsZW1lbnRUeXBlP3M6ZnIoZS50eXBlLHMpLGwucHJvcHM9dSxkPWUucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9bnIoYSk6KGE9VG4obik/Rm86cm4uY3VycmVudCxhPXRzKGUsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmWHkoZSxsLHIsYSksTWk9ITEsZj1lLm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLGNkKGUscixsLGkpO3ZhciBtPWUubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PW18fCRuLmN1cnJlbnR8fE1pPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKCRwKGUsbixoLHIpLG09ZS5tZW1vaXplZFN0YXRlKSwodT1NaXx8WXkoZSxuLHUscixmLG0sYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixtLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsbSxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJihlLmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PXQubWVtb2l6ZWRQcm9wcyYmZj09PXQubWVtb2l6ZWRTdGF0ZXx8KGUuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09dC5tZW1vaXplZFByb3BzJiZmPT09dC5tZW1vaXplZFN0YXRlfHwoZS5mbGFnc3w9MTAyNCksZS5tZW1vaXplZFByb3BzPXIsZS5tZW1vaXplZFN0YXRlPW0pLGwucHJvcHM9cixsLnN0YXRlPW0sbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09dC5tZW1vaXplZFByb3BzJiZmPT09dC5tZW1vaXplZFN0YXRlfHwoZS5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT10Lm1lbW9pemVkUHJvcHMmJmY9PT10Lm1lbW9pemVkU3RhdGV8fChlLmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gT3AodCxlLG4scixvLGkpfWZ1bmN0aW9uIE9wKHQsZSxuLHIsaSxvKXtwdyh0LGUpO3ZhciBsPShlLmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gaSYmVnkoZSxuLCExKSxwaSh0LGUsbyk7cj1lLnN0YXRlTm9kZSxwVC5jdXJyZW50PWU7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gZS5mbGFnc3w9MSx0IT09bnVsbCYmbD8oZS5jaGlsZD1ycyhlLHQuY2hpbGQsbnVsbCxvKSxlLmNoaWxkPXJzKGUsbnVsbCxzLG8pKTp1bih0LGUscyxvKSxlLm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxpJiZWeShlLG4sITApLGUuY2hpbGR9ZnVuY3Rpb24gZ3codCl7dmFyIGU9dC5zdGF0ZU5vZGU7ZS5wZW5kaW5nQ29udGV4dD9XeSh0LGUucGVuZGluZ0NvbnRleHQsZS5wZW5kaW5nQ29udGV4dCE9PWUuY29udGV4dCk6ZS5jb250ZXh0JiZXeSh0LGUuY29udGV4dCwhMSksYm0odCxlLmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIGwwKHQsZSxuLHIsaSl7cmV0dXJuIG5zKCksX20oaSksZS5mbGFnc3w9MjU2LHVuKHQsZSxuLHIpLGUuY2hpbGR9dmFyIFBwPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gQXAodCl7cmV0dXJue2Jhc2VMYW5lczp0LGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIG13KHQsZSxuKXt2YXIgcj1lLnBlbmRpbmdQcm9wcyxpPWR0LmN1cnJlbnQsbz0hMSxsPShlLmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPXQhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihpJjIpIT09MCkscz8obz0hMCxlLmZsYWdzJj0tMTI5KToodD09PW51bGx8fHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYoaXw9MSksWGUoZHQsaSYxKSx0PT09bnVsbClyZXR1cm4ga3AoZSksdD1lLm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJih0PXQuZGVoeWRyYXRlZCx0IT09bnVsbCk/KGUubW9kZSYxP3QuZGF0YT09PSIkISI/ZS5sYW5lcz04OmUubGFuZXM9MTA3Mzc0MTgyNDplLmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbix0PXIuZmFsbGJhY2ssbz8ocj1lLm1vZGUsbz1lLmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZvIT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5wZW5kaW5nUHJvcHM9bCk6bz1wZihsLHIsMCxudWxsKSx0PU1vKHQscixuLG51bGwpLG8ucmV0dXJuPWUsdC5yZXR1cm49ZSxvLnNpYmxpbmc9dCxlLmNoaWxkPW8sZS5jaGlsZC5tZW1vaXplZFN0YXRlPUFwKG4pLGUubWVtb2l6ZWRTdGF0ZT1QcCx0KTpNbShlLGwpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKHM9aS5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gZ1QodCxlLGwscixzLGksbik7aWYobyl7bz1yLmZhbGxiYWNrLGw9ZS5tb2RlLGk9dC5jaGlsZCxzPWkuc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJmUuY2hpbGQhPT1pPyhyPWUuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSxlLmRlbGV0aW9ucz1udWxsKToocj1RaShpLGEpLHIuc3VidHJlZUZsYWdzPWkuc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9vPVFpKHMsbyk6KG89TW8obyxsLG4sbnVsbCksby5mbGFnc3w9Miksby5yZXR1cm49ZSxyLnJldHVybj1lLHIuc2libGluZz1vLGUuY2hpbGQ9cixyPW8sbz1lLmNoaWxkLGw9dC5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/QXAobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LG8ubWVtb2l6ZWRTdGF0ZT1sLG8uY2hpbGRMYW5lcz10LmNoaWxkTGFuZXMmfm4sZS5tZW1vaXplZFN0YXRlPVBwLHJ9cmV0dXJuIG89dC5jaGlsZCx0PW8uc2libGluZyxyPVFpKG8se21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKGUubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49ZSxyLnNpYmxpbmc9bnVsbCx0IT09bnVsbCYmKG49ZS5kZWxldGlvbnMsbj09PW51bGw/KGUuZGVsZXRpb25zPVt0XSxlLmZsYWdzfD0xNik6bi5wdXNoKHQpKSxlLmNoaWxkPXIsZS5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBNbSh0LGUpe3JldHVybiBlPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjplfSx0Lm1vZGUsMCxudWxsKSxlLnJldHVybj10LHQuY2hpbGQ9ZX1mdW5jdGlvbiBhYyh0LGUsbixyKXtyZXR1cm4gciE9PW51bGwmJl9tKHIpLHJzKGUsdC5jaGlsZCxudWxsLG4pLHQ9TW0oZSxlLnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksdC5mbGFnc3w9MixlLm1lbW9pemVkU3RhdGU9bnVsbCx0fWZ1bmN0aW9uIGdUKHQsZSxuLHIsaSxvLGwpe2lmKG4pcmV0dXJuIGUuZmxhZ3MmMjU2PyhlLmZsYWdzJj0tMjU3LHI9Q2goRXJyb3IoVyg0MjIpKSksYWModCxlLGwscikpOmUubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KGUuY2hpbGQ9dC5jaGlsZCxlLmZsYWdzfD0xMjgsbnVsbCk6KG89ci5mYWxsYmFjayxpPWUubW9kZSxyPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxpLDAsbnVsbCksbz1NbyhvLGksbCxudWxsKSxvLmZsYWdzfD0yLHIucmV0dXJuPWUsby5yZXR1cm49ZSxyLnNpYmxpbmc9byxlLmNoaWxkPXIsZS5tb2RlJjEmJnJzKGUsdC5jaGlsZCxudWxsLGwpLGUuY2hpbGQubWVtb2l6ZWRTdGF0ZT1BcChsKSxlLm1lbW9pemVkU3RhdGU9UHAsbyk7aWYoIShlLm1vZGUmMSkpcmV0dXJuIGFjKHQsZSxsLG51bGwpO2lmKGkuZGF0YT09PSIkISIpe2lmKHI9aS5uZXh0U2libGluZyYmaS5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsbz1FcnJvcihXKDQxOSkpLHI9Q2gobyxyLHZvaWQgMCksYWModCxlLGwscil9aWYocz0obCZ0LmNoaWxkTGFuZXMpIT09MCxibnx8cyl7aWYocj1CdCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDppPTI7YnJlYWs7Y2FzZSAxNjppPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Omk9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6aT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDppPTB9aT1pJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6aSxpIT09MCYmaSE9PW8ucmV0cnlMYW5lJiYoby5yZXRyeUxhbmU9aSxoaSh0LGkpLF9yKHIsdCxpLC0xKSl9cmV0dXJuIEZtKCkscj1DaChFcnJvcihXKDQyMSkpKSxhYyh0LGUsbCxyKX1yZXR1cm4gaS5kYXRhPT09IiQ/Ij8oZS5mbGFnc3w9MTI4LGUuY2hpbGQ9dC5jaGlsZCxlPVRULmJpbmQobnVsbCx0KSxpLl9yZWFjdFJldHJ5PWUsbnVsbCk6KHQ9by50cmVlQ29udGV4dCxJbj1aaShpLm5leHRTaWJsaW5nKSxEbj1lLG90PSEwLGdyPW51bGwsdCE9PW51bGwmJihZbltYbisrXT1zaSxZbltYbisrXT1haSxZbltYbisrXT1CbyxzaT10LmlkLGFpPXQub3ZlcmZsb3csQm89ZSksZT1NbShlLHIuY2hpbGRyZW4pLGUuZmxhZ3N8PTQwOTYsZSl9ZnVuY3Rpb24gczAodCxlLG4pe3QubGFuZXN8PWU7dmFyIHI9dC5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD1lKSxicCh0LnJldHVybixlLG4pfWZ1bmN0aW9uIGtoKHQsZSxuLHIsaSl7dmFyIG89dC5tZW1vaXplZFN0YXRlO289PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6ZSxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOml9OihvLmlzQmFja3dhcmRzPWUsby5yZW5kZXJpbmc9bnVsbCxvLnJlbmRlcmluZ1N0YXJ0VGltZT0wLG8ubGFzdD1yLG8udGFpbD1uLG8udGFpbE1vZGU9aSl9ZnVuY3Rpb24gdncodCxlLG4pe3ZhciByPWUucGVuZGluZ1Byb3BzLGk9ci5yZXZlYWxPcmRlcixvPXIudGFpbDtpZih1bih0LGUsci5jaGlsZHJlbixuKSxyPWR0LmN1cnJlbnQsciYyKXI9ciYxfDIsZS5mbGFnc3w9MTI4O2Vsc2V7aWYodCE9PW51bGwmJnQuZmxhZ3MmMTI4KWU6Zm9yKHQ9ZS5jaGlsZDt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpdC5tZW1vaXplZFN0YXRlIT09bnVsbCYmczAodCxuLGUpO2Vsc2UgaWYodC50YWc9PT0xOSlzMCh0LG4sZSk7ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWsgZTtmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlicmVhayBlO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ31yJj0xfWlmKFhlKGR0LHIpLCEoZS5tb2RlJjEpKWUubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKGkpe2Nhc2UiZm9yd2FyZHMiOmZvcihuPWUuY2hpbGQsaT1udWxsO24hPT1udWxsOyl0PW4uYWx0ZXJuYXRlLHQhPT1udWxsJiZkZCh0KT09PW51bGwmJihpPW4pLG49bi5zaWJsaW5nO249aSxuPT09bnVsbD8oaT1lLmNoaWxkLGUuY2hpbGQ9bnVsbCk6KGk9bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxraChlLCExLGksbixvKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxpPWUuY2hpbGQsZS5jaGlsZD1udWxsO2khPT1udWxsOyl7aWYodD1pLmFsdGVybmF0ZSx0IT09bnVsbCYmZGQodCk9PT1udWxsKXtlLmNoaWxkPWk7YnJlYWt9dD1pLnNpYmxpbmcsaS5zaWJsaW5nPW4sbj1pLGk9dH1raChlLCEwLG4sbnVsbCxvKTticmVhaztjYXNlInRvZ2V0aGVyIjpraChlLCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6ZS5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGUuY2hpbGR9ZnVuY3Rpb24gSWModCxlKXshKGUubW9kZSYxKSYmdCE9PW51bGwmJih0LmFsdGVybmF0ZT1udWxsLGUuYWx0ZXJuYXRlPW51bGwsZS5mbGFnc3w9Mil9ZnVuY3Rpb24gcGkodCxlLG4pe2lmKHQhPT1udWxsJiYoZS5kZXBlbmRlbmNpZXM9dC5kZXBlbmRlbmNpZXMpLFdvfD1lLmxhbmVzLCEobiZlLmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKHQhPT1udWxsJiZlLmNoaWxkIT09dC5jaGlsZCl0aHJvdyBFcnJvcihXKDE1MykpO2lmKGUuY2hpbGQhPT1udWxsKXtmb3IodD1lLmNoaWxkLG49UWkodCx0LnBlbmRpbmdQcm9wcyksZS5jaGlsZD1uLG4ucmV0dXJuPWU7dC5zaWJsaW5nIT09bnVsbDspdD10LnNpYmxpbmcsbj1uLnNpYmxpbmc9UWkodCx0LnBlbmRpbmdQcm9wcyksbi5yZXR1cm49ZTtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gZS5jaGlsZH1mdW5jdGlvbiBtVCh0LGUsbil7c3dpdGNoKGUudGFnKXtjYXNlIDM6Z3coZSksbnMoKTticmVhaztjYXNlIDU6VjEoZSk7YnJlYWs7Y2FzZSAxOlRuKGUudHlwZSkmJm9kKGUpO2JyZWFrO2Nhc2UgNDpibShlLGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9ZS50eXBlLl9jb250ZXh0LGk9ZS5tZW1vaXplZFByb3BzLnZhbHVlO1hlKGFkLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWk7YnJlYWs7Y2FzZSAxMzppZihyPWUubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oWGUoZHQsZHQuY3VycmVudCYxKSxlLmZsYWdzfD0xMjgsbnVsbCk6biZlLmNoaWxkLmNoaWxkTGFuZXM/bXcodCxlLG4pOihYZShkdCxkdC5jdXJyZW50JjEpLHQ9cGkodCxlLG4pLHQhPT1udWxsP3Quc2libGluZzpudWxsKTtYZShkdCxkdC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZlLmNoaWxkTGFuZXMpIT09MCx0LmZsYWdzJjEyOCl7aWYocilyZXR1cm4gdncodCxlLG4pO2UuZmxhZ3N8PTEyOH1pZihpPWUubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKGkucmVuZGVyaW5nPW51bGwsaS50YWlsPW51bGwsaS5sYXN0RWZmZWN0PW51bGwpLFhlKGR0LGR0LmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBlLmxhbmVzPTAsaHcodCxlLG4pfXJldHVybiBwaSh0LGUsbil9dmFyIHl3LE1wLHh3LF93O3l3PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09Nil0LmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT1lKWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT1lKXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtNcD1mdW5jdGlvbigpe307eHc9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC5tZW1vaXplZFByb3BzO2lmKGkhPT1yKXt0PWUuc3RhdGVOb2RlLFJvKEZyLmN1cnJlbnQpO3ZhciBvPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOmk9bnAodCxpKSxyPW5wKHQsciksbz1bXTticmVhaztjYXNlInNlbGVjdCI6aT1ndCh7fSxpLHt2YWx1ZTp2b2lkIDB9KSxyPWd0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLG89W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aT1vcCh0LGkpLHI9b3AodCxyKSxvPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKHQub25jbGljaz1yZCl9c3AobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gaSlpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmaS5oYXNPd25Qcm9wZXJ0eSh1KSYmaVt1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9aVt1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihJYS5oYXNPd25Qcm9wZXJ0eSh1KT9vfHwobz1bXSk6KG89b3x8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPWkhPW51bGw/aVt1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChvfHwobz1bXSksby5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihvPW98fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwobz1vfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoSWEuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIix0KSxvfHxzPT09YXx8KG89W10pKToobz1vfHxbXSkucHVzaCh1LGEpKX1uJiYobz1vfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PW87KGUudXBkYXRlUXVldWU9dSkmJihlLmZsYWdzfD00KX19O193PWZ1bmN0aW9uKHQsZSxuLHIpe24hPT1yJiYoZS5mbGFnc3w9NCl9O2Z1bmN0aW9uIEtzKHQsZSl7aWYoIW90KXN3aXRjaCh0LnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6ZT10LnRhaWw7Zm9yKHZhciBuPW51bGw7ZSE9PW51bGw7KWUuYWx0ZXJuYXRlIT09bnVsbCYmKG49ZSksZT1lLnNpYmxpbmc7bj09PW51bGw/dC50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49dC50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP2V8fHQudGFpbD09PW51bGw/dC50YWlsPW51bGw6dC50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gWHQodCl7dmFyIGU9dC5hbHRlcm5hdGUhPT1udWxsJiZ0LmFsdGVybmF0ZS5jaGlsZD09PXQuY2hpbGQsbj0wLHI9MDtpZihlKWZvcih2YXIgaT10LmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1pLmZsYWdzJjE0NjgwMDY0LGkucmV0dXJuPXQsaT1pLnNpYmxpbmc7ZWxzZSBmb3IoaT10LmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyxyfD1pLmZsYWdzLGkucmV0dXJuPXQsaT1pLnNpYmxpbmc7cmV0dXJuIHQuc3VidHJlZUZsYWdzfD1yLHQuY2hpbGRMYW5lcz1uLGV9ZnVuY3Rpb24gdlQodCxlLG4pe3ZhciByPWUucGVuZGluZ1Byb3BzO3N3aXRjaCh4bShlKSxlLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFh0KGUpLG51bGw7Y2FzZSAxOnJldHVybiBUbihlLnR5cGUpJiZpZCgpLFh0KGUpLG51bGw7Y2FzZSAzOnJldHVybiByPWUuc3RhdGVOb2RlLGlzKCksaXQoJG4pLGl0KHJuKSxUbSgpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLCh0PT09bnVsbHx8dC5jaGlsZD09PW51bGwpJiYobGMoZSk/ZS5mbGFnc3w9NDp0PT09bnVsbHx8dC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmIShlLmZsYWdzJjI1Nil8fChlLmZsYWdzfD0xMDI0LGdyIT09bnVsbCYmKFVwKGdyKSxncj1udWxsKSkpLE1wKHQsZSksWHQoZSksbnVsbDtjYXNlIDU6JG0oZSk7dmFyIGk9Um8oR2EuY3VycmVudCk7aWYobj1lLnR5cGUsdCE9PW51bGwmJmUuc3RhdGVOb2RlIT1udWxsKXh3KHQsZSxuLHIsaSksdC5yZWYhPT1lLnJlZiYmKGUuZmxhZ3N8PTUxMixlLmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZihlLnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVygxNjYpKTtyZXR1cm4gWHQoZSksbnVsbH1pZih0PVJvKEZyLmN1cnJlbnQpLGxjKGUpKXtyPWUuc3RhdGVOb2RlLG49ZS50eXBlO3ZhciBvPWUubWVtb2l6ZWRQcm9wcztzd2l0Y2gocltNcl09ZSxyW0thXT1vLHQ9KGUubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOmV0KCJjYW5jZWwiLHIpLGV0KCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpldCgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPGFhLmxlbmd0aDtpKyspZXQoYWFbaV0scik7YnJlYWs7Y2FzZSJzb3VyY2UiOmV0KCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6ZXQoImVycm9yIixyKSxldCgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpteShyLG8pLGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIW8ubXVsdGlwbGV9LGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjp5eShyLG8pLGV0KCJpbnZhbGlkIixyKX1zcChuLG8pLGk9bnVsbDtmb3IodmFyIGwgaW4gbylpZihvLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1vW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKG8uc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm9jKHIudGV4dENvbnRlbnQscyx0KSxpPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoby5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci50ZXh0Q29udGVudCxzLHQpLGk9WyJjaGlsZHJlbiIsIiIrc10pOklhLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmZXQoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHIpLHZ5KHIsbywhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUocikseHkocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9cmQpfXI9aSxlLnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJihlLmZsYWdzfD00KX1lbHNle2w9aS5ub2RlVHlwZT09PTk/aTppLm93bmVyRG9jdW1lbnQsdD09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKHQ9Wl8obikpLHQ9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyh0PWwuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsdD10LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj90PWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KHQ9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9dCxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTp0PWwuY3JlYXRlRWxlbWVudE5TKHQsbiksdFtNcl09ZSx0W0thXT1yLHl3KHQsZSwhMSwhMSksZS5zdGF0ZU5vZGU9dDtlOntzd2l0Y2gobD1hcChuLHIpLG4pe2Nhc2UiZGlhbG9nIjpldCgiY2FuY2VsIix0KSxldCgiY2xvc2UiLHQpLGk9cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOmV0KCJsb2FkIix0KSxpPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPGFhLmxlbmd0aDtpKyspZXQoYWFbaV0sdCk7aT1yO2JyZWFrO2Nhc2Uic291cmNlIjpldCgiZXJyb3IiLHQpLGk9cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpldCgiZXJyb3IiLHQpLGV0KCJsb2FkIix0KSxpPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIix0KSxpPXI7YnJlYWs7Y2FzZSJpbnB1dCI6bXkodCxyKSxpPW5wKHQsciksZXQoImludmFsaWQiLHQpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOnQuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxpPWd0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGV0KCJpbnZhbGlkIix0KTticmVhaztjYXNlInRleHRhcmVhIjp5eSh0LHIpLGk9b3AodCxyKSxldCgiaW52YWxpZCIsdCk7YnJlYWs7ZGVmYXVsdDppPXJ9c3AobixpKSxzPWk7Zm9yKG8gaW4gcylpZihzLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1zW29dO289PT0ic3R5bGUiP1hfKHQsYSk6bz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmR18odCxhKSk6bz09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmRGEodCxhKTp0eXBlb2YgYT09Im51bWJlciImJkRhKHQsIiIrYSk6byE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZvIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJm8hPT0iYXV0b0ZvY3VzIiYmKElhLmhhc093blByb3BlcnR5KG8pP2EhPW51bGwmJm89PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIix0KTphIT1udWxsJiZpbSh0LG8sYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHQpLHZ5KHQsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUodCkseHkodCk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp0Lm11bHRpcGxlPSEhci5tdWx0aXBsZSxvPXIudmFsdWUsbyE9bnVsbD9VbCh0LCEhci5tdWx0aXBsZSxvLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmVWwodCwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljaz09ImZ1bmN0aW9uIiYmKHQub25jbGljaz1yZCl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJihlLmZsYWdzfD00KX1lLnJlZiE9PW51bGwmJihlLmZsYWdzfD01MTIsZS5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIFh0KGUpLG51bGw7Y2FzZSA2OmlmKHQmJmUuc3RhdGVOb2RlIT1udWxsKV93KHQsZSx0Lm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJmUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2NikpO2lmKG49Um8oR2EuY3VycmVudCksUm8oRnIuY3VycmVudCksbGMoZSkpe2lmKHI9ZS5zdGF0ZU5vZGUsbj1lLm1lbW9pemVkUHJvcHMscltNcl09ZSwobz1yLm5vZGVWYWx1ZSE9PW4pJiYodD1Ebix0IT09bnVsbCkpc3dpdGNoKHQudGFnKXtjYXNlIDM6b2Moci5ub2RlVmFsdWUsbiwodC5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OnQubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci5ub2RlVmFsdWUsbiwodC5tb2RlJjEpIT09MCl9byYmKGUuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbTXJdPWUsZS5zdGF0ZU5vZGU9cn1yZXR1cm4gWHQoZSksbnVsbDtjYXNlIDEzOmlmKGl0KGR0KSxyPWUubWVtb2l6ZWRTdGF0ZSx0PT09bnVsbHx8dC5tZW1vaXplZFN0YXRlIT09bnVsbCYmdC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihvdCYmSW4hPT1udWxsJiZlLm1vZGUmMSYmIShlLmZsYWdzJjEyOCkpRDEoKSxucygpLGUuZmxhZ3N8PTk4NTYwLG89ITE7ZWxzZSBpZihvPWxjKGUpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0PT09bnVsbCl7aWYoIW8pdGhyb3cgRXJyb3IoVygzMTgpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvPW8hPT1udWxsP28uZGVoeWRyYXRlZDpudWxsLCFvKXRocm93IEVycm9yKFcoMzE3KSk7b1tNcl09ZX1lbHNlIG5zKCksIShlLmZsYWdzJjEyOCkmJihlLm1lbW9pemVkU3RhdGU9bnVsbCksZS5mbGFnc3w9NDtYdChlKSxvPSExfWVsc2UgZ3IhPT1udWxsJiYoVXAoZ3IpLGdyPW51bGwpLG89ITA7aWYoIW8pcmV0dXJuIGUuZmxhZ3MmNjU1MzY/ZTpudWxsfXJldHVybiBlLmZsYWdzJjEyOD8oZS5sYW5lcz1uLGUpOihyPXIhPT1udWxsLHIhPT0odCE9PW51bGwmJnQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYoZS5jaGlsZC5mbGFnc3w9ODE5MixlLm1vZGUmMSYmKHQ9PT1udWxsfHxkdC5jdXJyZW50JjE/UHQ9PT0wJiYoUHQ9Myk6Rm0oKSkpLGUudXBkYXRlUXVldWUhPT1udWxsJiYoZS5mbGFnc3w9NCksWHQoZSksbnVsbCk7Y2FzZSA0OnJldHVybiBpcygpLE1wKHQsZSksdD09PW51bGwmJlZhKGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFh0KGUpLG51bGw7Y2FzZSAxMDpyZXR1cm4gRW0oZS50eXBlLl9jb250ZXh0KSxYdChlKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFRuKGUudHlwZSkmJmlkKCksWHQoZSksbnVsbDtjYXNlIDE5OmlmKGl0KGR0KSxvPWUubWVtb2l6ZWRTdGF0ZSxvPT09bnVsbClyZXR1cm4gWHQoZSksbnVsbDtpZihyPShlLmZsYWdzJjEyOCkhPT0wLGw9by5yZW5kZXJpbmcsbD09PW51bGwpaWYocilLcyhvLCExKTtlbHNle2lmKFB0IT09MHx8dCE9PW51bGwmJnQuZmxhZ3MmMTI4KWZvcih0PWUuY2hpbGQ7dCE9PW51bGw7KXtpZihsPWRkKHQpLGwhPT1udWxsKXtmb3IoZS5mbGFnc3w9MTI4LEtzKG8sITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKGUudXBkYXRlUXVldWU9cixlLmZsYWdzfD00KSxlLnN1YnRyZWVGbGFncz0wLHI9bixuPWUuY2hpbGQ7biE9PW51bGw7KW89bix0PXIsby5mbGFncyY9MTQ2ODAwNjYsbD1vLmFsdGVybmF0ZSxsPT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5sYW5lcz10LG8uY2hpbGQ9bnVsbCxvLnN1YnRyZWVGbGFncz0wLG8ubWVtb2l6ZWRQcm9wcz1udWxsLG8ubWVtb2l6ZWRTdGF0ZT1udWxsLG8udXBkYXRlUXVldWU9bnVsbCxvLmRlcGVuZGVuY2llcz1udWxsLG8uc3RhdGVOb2RlPW51bGwpOihvLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLG8ubGFuZXM9bC5sYW5lcyxvLmNoaWxkPWwuY2hpbGQsby5zdWJ0cmVlRmxhZ3M9MCxvLmRlbGV0aW9ucz1udWxsLG8ubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsby5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxvLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsby50eXBlPWwudHlwZSx0PWwuZGVwZW5kZW5jaWVzLG8uZGVwZW5kZW5jaWVzPXQ9PT1udWxsP251bGw6e2xhbmVzOnQubGFuZXMsZmlyc3RDb250ZXh0OnQuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIFhlKGR0LGR0LmN1cnJlbnQmMXwyKSxlLmNoaWxkfXQ9dC5zaWJsaW5nfW8udGFpbCE9PW51bGwmJkN0KCk+bHMmJihlLmZsYWdzfD0xMjgscj0hMCxLcyhvLCExKSxlLmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYodD1kZChsKSx0IT09bnVsbCl7aWYoZS5mbGFnc3w9MTI4LHI9ITAsbj10LnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYoZS51cGRhdGVRdWV1ZT1uLGUuZmxhZ3N8PTQpLEtzKG8sITApLG8udGFpbD09PW51bGwmJm8udGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhb3QpcmV0dXJuIFh0KGUpLG51bGx9ZWxzZSAyKkN0KCktby5yZW5kZXJpbmdTdGFydFRpbWU+bHMmJm4hPT0xMDczNzQxODI0JiYoZS5mbGFnc3w9MTI4LHI9ITAsS3MobywhMSksZS5sYW5lcz00MTk0MzA0KTtvLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9ZS5jaGlsZCxlLmNoaWxkPWwpOihuPW8ubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDplLmNoaWxkPWwsby5sYXN0PWwpfXJldHVybiBvLnRhaWwhPT1udWxsPyhlPW8udGFpbCxvLnJlbmRlcmluZz1lLG8udGFpbD1lLnNpYmxpbmcsby5yZW5kZXJpbmdTdGFydFRpbWU9Q3QoKSxlLnNpYmxpbmc9bnVsbCxuPWR0LmN1cnJlbnQsWGUoZHQscj9uJjF8MjpuJjEpLGUpOihYdChlKSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHptKCkscj1lLm1lbW9pemVkU3RhdGUhPT1udWxsLHQhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKGUuZmxhZ3N8PTgxOTIpLHImJmUubW9kZSYxP0FuJjEwNzM3NDE4MjQmJihYdChlKSxlLnN1YnRyZWVGbGFncyY2JiYoZS5mbGFnc3w9ODE5MikpOlh0KGUpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFcoMTU2LGUudGFnKSl9ZnVuY3Rpb24geVQodCxlKXtzd2l0Y2goeG0oZSksZS50YWcpe2Nhc2UgMTpyZXR1cm4gVG4oZS50eXBlKSYmaWQoKSx0PWUuZmxhZ3MsdCY2NTUzNj8oZS5mbGFncz10Ji02NTUzN3wxMjgsZSk6bnVsbDtjYXNlIDM6cmV0dXJuIGlzKCksaXQoJG4pLGl0KHJuKSxUbSgpLHQ9ZS5mbGFncyx0JjY1NTM2JiYhKHQmMTI4KT8oZS5mbGFncz10Ji02NTUzN3wxMjgsZSk6bnVsbDtjYXNlIDU6cmV0dXJuICRtKGUpLG51bGw7Y2FzZSAxMzppZihpdChkdCksdD1lLm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJnQuZGVoeWRyYXRlZCE9PW51bGwpe2lmKGUuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MCkpO25zKCl9cmV0dXJuIHQ9ZS5mbGFncyx0JjY1NTM2PyhlLmZsYWdzPXQmLTY1NTM3fDEyOCxlKTpudWxsO2Nhc2UgMTk6cmV0dXJuIGl0KGR0KSxudWxsO2Nhc2UgNDpyZXR1cm4gaXMoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIEVtKGUudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHptKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB1Yz0hMSxKdD0hMSx4VD10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxuZT1udWxsO2Z1bmN0aW9uIElsKHQsZSl7dmFyIG49dC5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7dnQodCxlLHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24gTHAodCxlLG4pe3RyeXtuKCl9Y2F0Y2gocil7dnQodCxlLHIpfX12YXIgYTA9ITE7ZnVuY3Rpb24gX1QodCxlKXtpZih5cD1lZCx0PUMxKCksdm0odCkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiB0KXZhciBuPXtzdGFydDp0LnNlbGVjdGlvblN0YXJ0LGVuZDp0LnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPXQub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgaT1yLmFuY2hvck9mZnNldCxvPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxvLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBsPTAscz0tMSxhPS0xLHU9MCxjPTAsZD10LGY9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBoO2QhPT1ufHxpIT09MCYmZC5ub2RlVHlwZSE9PTN8fChzPWwraSksZCE9PW98fHIhPT0wJiZkLm5vZGVUeXBlIT09M3x8KGE9bCtyKSxkLm5vZGVUeXBlPT09MyYmKGwrPWQubm9kZVZhbHVlLmxlbmd0aCksKGg9ZC5maXJzdENoaWxkKSE9PW51bGw7KWY9ZCxkPWg7Zm9yKDs7KXtpZihkPT09dClicmVhayB0O2lmKGY9PT1uJiYrK3U9PT1pJiYocz1sKSxmPT09byYmKytjPT09ciYmKGE9bCksKGg9ZC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO2Q9ZixmPWQucGFyZW50Tm9kZX1kPWh9bj1zPT09LTF8fGE9PT0tMT9udWxsOntzdGFydDpzLGVuZDphfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoeHA9e2ZvY3VzZWRFbGVtOnQsc2VsZWN0aW9uUmFuZ2U6bn0sZWQ9ITEsbmU9ZTtuZSE9PW51bGw7KWlmKGU9bmUsdD1lLmNoaWxkLChlLnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJnQhPT1udWxsKXQucmV0dXJuPWUsbmU9dDtlbHNlIGZvcig7bmUhPT1udWxsOyl7ZT1uZTt0cnl7dmFyIG09ZS5hbHRlcm5hdGU7aWYoZS5mbGFncyYxMDI0KXN3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyx3PW0ubWVtb2l6ZWRTdGF0ZSx2PWUuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShlLmVsZW1lbnRUeXBlPT09ZS50eXBlP2c6ZnIoZS50eXBlLGcpLHcpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIHg9ZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzt4Lm5vZGVUeXBlPT09MT94LnRleHRDb250ZW50PSIiOngubm9kZVR5cGU9PT05JiZ4LmRvY3VtZW50RWxlbWVudCYmeC5yZW1vdmVDaGlsZCh4LmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYzKSl9fWNhdGNoKFMpe3Z0KGUsZS5yZXR1cm4sUyl9aWYodD1lLnNpYmxpbmcsdCE9PW51bGwpe3QucmV0dXJuPWUucmV0dXJuLG5lPXQ7YnJlYWt9bmU9ZS5yZXR1cm59cmV0dXJuIG09YTAsYTA9ITEsbX1mdW5jdGlvbiB4YSh0LGUsbil7dmFyIHI9ZS51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgaT1yPXIubmV4dDtkb3tpZigoaS50YWcmdCk9PT10KXt2YXIgbz1pLmRlc3Ryb3k7aS5kZXN0cm95PXZvaWQgMCxvIT09dm9pZCAwJiZMcChlLG4sbyl9aT1pLm5leHR9d2hpbGUoaSE9PXIpfX1mdW5jdGlvbiBmZih0LGUpe2lmKGU9ZS51cGRhdGVRdWV1ZSxlPWUhPT1udWxsP2UubGFzdEVmZmVjdDpudWxsLGUhPT1udWxsKXt2YXIgbj1lPWUubmV4dDtkb3tpZigobi50YWcmdCk9PT10KXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT1lKX19ZnVuY3Rpb24gSXAodCl7dmFyIGU9dC5yZWY7aWYoZSE9PW51bGwpe3ZhciBuPXQuc3RhdGVOb2RlO3N3aXRjaCh0LnRhZyl7Y2FzZSA1OnQ9bjticmVhaztkZWZhdWx0OnQ9bn10eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUuY3VycmVudD10fX1mdW5jdGlvbiB3dyh0KXt2YXIgZT10LmFsdGVybmF0ZTtlIT09bnVsbCYmKHQuYWx0ZXJuYXRlPW51bGwsd3coZSkpLHQuY2hpbGQ9bnVsbCx0LmRlbGV0aW9ucz1udWxsLHQuc2libGluZz1udWxsLHQudGFnPT09NSYmKGU9dC5zdGF0ZU5vZGUsZSE9PW51bGwmJihkZWxldGUgZVtNcl0sZGVsZXRlIGVbS2FdLGRlbGV0ZSBlW1NwXSxkZWxldGUgZVtuVF0sZGVsZXRlIGVbclRdKSksdC5zdGF0ZU5vZGU9bnVsbCx0LnJldHVybj1udWxsLHQuZGVwZW5kZW5jaWVzPW51bGwsdC5tZW1vaXplZFByb3BzPW51bGwsdC5tZW1vaXplZFN0YXRlPW51bGwsdC5wZW5kaW5nUHJvcHM9bnVsbCx0LnN0YXRlTm9kZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBTdyh0KXtyZXR1cm4gdC50YWc9PT01fHx0LnRhZz09PTN8fHQudGFnPT09NH1mdW5jdGlvbiB1MCh0KXtlOmZvcig7Oyl7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHxTdyh0LnJldHVybikpcmV0dXJuIG51bGw7dD10LnJldHVybn1mb3IodC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZzt0LnRhZyE9PTUmJnQudGFnIT09NiYmdC50YWchPT0xODspe2lmKHQuZmxhZ3MmMnx8dC5jaGlsZD09PW51bGx8fHQudGFnPT09NCljb250aW51ZSBlO3QuY2hpbGQucmV0dXJuPXQsdD10LmNoaWxkfWlmKCEodC5mbGFncyYyKSlyZXR1cm4gdC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIERwKHQsZSxuKXt2YXIgcj10LnRhZztpZihyPT09NXx8cj09PTYpdD10LnN0YXRlTm9kZSxlP24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCxlKTpuLmluc2VydEJlZm9yZSh0LGUpOihuLm5vZGVUeXBlPT09OD8oZT1uLnBhcmVudE5vZGUsZS5pbnNlcnRCZWZvcmUodCxuKSk6KGU9bixlLmFwcGVuZENoaWxkKHQpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHxlLm9uY2xpY2shPT1udWxsfHwoZS5vbmNsaWNrPXJkKSk7ZWxzZSBpZihyIT09NCYmKHQ9dC5jaGlsZCx0IT09bnVsbCkpZm9yKERwKHQsZSxuKSx0PXQuc2libGluZzt0IT09bnVsbDspRHAodCxlLG4pLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIGpwKHQsZSxuKXt2YXIgcj10LnRhZztpZihyPT09NXx8cj09PTYpdD10LnN0YXRlTm9kZSxlP24uaW5zZXJ0QmVmb3JlKHQsZSk6bi5hcHBlbmRDaGlsZCh0KTtlbHNlIGlmKHIhPT00JiYodD10LmNoaWxkLHQhPT1udWxsKSlmb3IoanAodCxlLG4pLHQ9dC5zaWJsaW5nO3QhPT1udWxsOylqcCh0LGUsbiksdD10LnNpYmxpbmd9dmFyIEh0PW51bGwsaHI9ITE7ZnVuY3Rpb24gYmkodCxlLG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KUV3KHQsZSxuKSxuPW4uc2libGluZ31mdW5jdGlvbiBFdyh0LGUsbil7aWYoenImJnR5cGVvZiB6ci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7enIub25Db21taXRGaWJlclVubW91bnQocmYsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1Okp0fHxJbChuLGUpO2Nhc2UgNjp2YXIgcj1IdCxpPWhyO0h0PW51bGwsYmkodCxlLG4pLEh0PXIsaHI9aSxIdCE9PW51bGwmJihocj8odD1IdCxuPW4uc3RhdGVOb2RlLHQubm9kZVR5cGU9PT04P3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTp0LnJlbW92ZUNoaWxkKG4pKTpIdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6SHQhPT1udWxsJiYoaHI/KHQ9SHQsbj1uLnN0YXRlTm9kZSx0Lm5vZGVUeXBlPT09OD95aCh0LnBhcmVudE5vZGUsbik6dC5ub2RlVHlwZT09PTEmJnloKHQsbiksQmEodCkpOnloKEh0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9SHQsaT1ocixIdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGhyPSEwLGJpKHQsZSxuKSxIdD1yLGhyPWk7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFKdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe2k9cj1yLm5leHQ7ZG97dmFyIG89aSxsPW8uZGVzdHJveTtvPW8udGFnLGwhPT12b2lkIDAmJihvJjJ8fG8mNCkmJkxwKG4sZSxsKSxpPWkubmV4dH13aGlsZShpIT09cil9YmkodCxlLG4pO2JyZWFrO2Nhc2UgMTppZighSnQmJihJbChuLGUpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7dnQobixlLHMpfWJpKHQsZSxuKTticmVhaztjYXNlIDIxOmJpKHQsZSxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhKdD0ocj1KdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsYmkodCxlLG4pLEp0PXIpOmJpKHQsZSxuKTticmVhaztkZWZhdWx0OmJpKHQsZSxuKX19ZnVuY3Rpb24gYzAodCl7dmFyIGU9dC51cGRhdGVRdWV1ZTtpZihlIT09bnVsbCl7dC51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPXQuc3RhdGVOb2RlO249PT1udWxsJiYobj10LnN0YXRlTm9kZT1uZXcgeFQpLGUuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgaT1OVC5iaW5kKG51bGwsdCxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihpLGkpKX0pfX1mdW5jdGlvbiBhcih0LGUpe3ZhciBuPWUuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO3RyeXt2YXIgbz10LGw9ZSxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6SHQ9cy5zdGF0ZU5vZGUsaHI9ITE7YnJlYWsgZTtjYXNlIDM6SHQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxocj0hMDticmVhayBlO2Nhc2UgNDpIdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGhyPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihIdD09PW51bGwpdGhyb3cgRXJyb3IoVygxNjApKTtFdyhvLGwsaSksSHQ9bnVsbCxocj0hMTt2YXIgYT1pLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLGkucmV0dXJuPW51bGx9Y2F0Y2godSl7dnQoaSxlLHUpfX1pZihlLnN1YnRyZWVGbGFncyYxMjg1NClmb3IoZT1lLmNoaWxkO2UhPT1udWxsOylDdyhlLHQpLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIEN3KHQsZSl7dmFyIG49dC5hbHRlcm5hdGUscj10LmZsYWdzO3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKGFyKGUsdCksT3IodCksciY0KXt0cnl7eGEoMyx0LHQucmV0dXJuKSxmZigzLHQpfWNhdGNoKGcpe3Z0KHQsdC5yZXR1cm4sZyl9dHJ5e3hhKDUsdCx0LnJldHVybil9Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19YnJlYWs7Y2FzZSAxOmFyKGUsdCksT3IodCksciY1MTImJm4hPT1udWxsJiZJbChuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoYXIoZSx0KSxPcih0KSxyJjUxMiYmbiE9PW51bGwmJklsKG4sbi5yZXR1cm4pLHQuZmxhZ3MmMzIpe3ZhciBpPXQuc3RhdGVOb2RlO3RyeXtEYShpLCIiKX1jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfX1pZihyJjQmJihpPXQuc3RhdGVOb2RlLGkhPW51bGwpKXt2YXIgbz10Lm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6byxzPXQudHlwZSxhPXQudXBkYXRlUXVldWU7aWYodC51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmby50eXBlPT09InJhZGlvIiYmby5uYW1lIT1udWxsJiZIXyhpLG8pLGFwKHMsbCk7dmFyIHU9YXAocyxvKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9YXyhpLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP0dfKGksZCk6Yz09PSJjaGlsZHJlbiI/RGEoaSxkKTppbShpLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6cnAoaSxvKTticmVhaztjYXNlInRleHRhcmVhIjpLXyhpLG8pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1pLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7aS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhby5tdWx0aXBsZTt2YXIgaD1vLnZhbHVlO2ghPW51bGw/VWwoaSwhIW8ubXVsdGlwbGUsaCwhMSk6ZiE9PSEhby5tdWx0aXBsZSYmKG8uZGVmYXVsdFZhbHVlIT1udWxsP1VsKGksISFvLm11bHRpcGxlLG8uZGVmYXVsdFZhbHVlLCEwKTpVbChpLCEhby5tdWx0aXBsZSxvLm11bHRpcGxlP1tdOiIiLCExKSl9aVtLYV09b31jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfX1icmVhaztjYXNlIDY6aWYoYXIoZSx0KSxPcih0KSxyJjQpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2MikpO2k9dC5zdGF0ZU5vZGUsbz10Lm1lbW9pemVkUHJvcHM7dHJ5e2kubm9kZVZhbHVlPW99Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19YnJlYWs7Y2FzZSAzOmlmKGFyKGUsdCksT3IodCksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7QmEoZS5jb250YWluZXJJbmZvKX1jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfWJyZWFrO2Nhc2UgNDphcihlLHQpLE9yKHQpO2JyZWFrO2Nhc2UgMTM6YXIoZSx0KSxPcih0KSxpPXQuY2hpbGQsaS5mbGFncyY4MTkyJiYobz1pLm1lbW9pemVkU3RhdGUhPT1udWxsLGkuc3RhdGVOb2RlLmlzSGlkZGVuPW8sIW98fGkuYWx0ZXJuYXRlIT09bnVsbCYmaS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChEbT1DdCgpKSksciY0JiZjMCh0KTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsdC5tb2RlJjE/KEp0PSh1PUp0KXx8YyxhcihlLHQpLEp0PXUpOmFyKGUsdCksT3IodCksciY4MTkyKXtpZih1PXQubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKHQuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmdC5tb2RlJjEpZm9yKG5lPXQsYz10LmNoaWxkO2MhPT1udWxsOyl7Zm9yKGQ9bmU9YztuZSE9PW51bGw7KXtzd2l0Y2goZj1uZSxoPWYuY2hpbGQsZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTp4YSg0LGYsZi5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpJbChmLGYucmV0dXJuKTt2YXIgbT1mLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj1mLG49Zi5yZXR1cm47dHJ5e2U9cixtLnByb3BzPWUubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7dnQocixuLGcpfX1icmVhaztjYXNlIDU6SWwoZixmLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihmLm1lbW9pemVkU3RhdGUhPT1udWxsKXtmMChkKTtjb250aW51ZX19aCE9PW51bGw/KGgucmV0dXJuPWYsbmU9aCk6ZjAoZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9dDs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e2k9ZC5zdGF0ZU5vZGUsdT8obz1pLnN0eWxlLHR5cGVvZiBvLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP28uc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6by5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsYT1kLm1lbW9pemVkUHJvcHMuc3R5bGUsbD1hIT1udWxsJiZhLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/YS5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PVlfKCJkaXNwbGF5IixsKSl9Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKGcpe3Z0KHQsdC5yZXR1cm4sZyl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT10KSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT10KWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PXQpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTphcihlLHQpLE9yKHQpLHImNCYmYzAodCk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmFyKGUsdCksT3IodCl9fWZ1bmN0aW9uIE9yKHQpe3ZhciBlPXQuZmxhZ3M7aWYoZSYyKXt0cnl7ZTp7Zm9yKHZhciBuPXQucmV0dXJuO24hPT1udWxsOyl7aWYoU3cobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKFcoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIGk9ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKERhKGksIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIG89dTAodCk7anAodCxvLGkpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGw9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPXUwKHQpO0RwKHQscyxsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYxKSl9fWNhdGNoKGEpe3Z0KHQsdC5yZXR1cm4sYSl9dC5mbGFncyY9LTN9ZSY0MDk2JiYodC5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIHdUKHQsZSxuKXtuZT10LGt3KHQpfWZ1bmN0aW9uIGt3KHQsZSxuKXtmb3IodmFyIHI9KHQubW9kZSYxKSE9PTA7bmUhPT1udWxsOyl7dmFyIGk9bmUsbz1pLmNoaWxkO2lmKGkudGFnPT09MjImJnIpe3ZhciBsPWkubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fHVjO2lmKCFsKXt2YXIgcz1pLmFsdGVybmF0ZSxhPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxKdDtzPXVjO3ZhciB1PUp0O2lmKHVjPWwsKEp0PWEpJiYhdSlmb3IobmU9aTtuZSE9PW51bGw7KWw9bmUsYT1sLmNoaWxkLGwudGFnPT09MjImJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGw/aDAoaSk6YSE9PW51bGw/KGEucmV0dXJuPWwsbmU9YSk6aDAoaSk7Zm9yKDtvIT09bnVsbDspbmU9byxrdyhvKSxvPW8uc2libGluZztuZT1pLHVjPXMsSnQ9dX1kMCh0KX1lbHNlIGkuc3VidHJlZUZsYWdzJjg3NzImJm8hPT1udWxsPyhvLnJldHVybj1pLG5lPW8pOmQwKHQpfX1mdW5jdGlvbiBkMCh0KXtmb3IoO25lIT09bnVsbDspe3ZhciBlPW5lO2lmKGUuZmxhZ3MmODc3Mil7dmFyIG49ZS5hbHRlcm5hdGU7dHJ5e2lmKGUuZmxhZ3MmODc3Milzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6SnR8fGZmKDUsZSk7YnJlYWs7Y2FzZSAxOnZhciByPWUuc3RhdGVOb2RlO2lmKGUuZmxhZ3MmNCYmIUp0KWlmKG49PT1udWxsKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBpPWUuZWxlbWVudFR5cGU9PT1lLnR5cGU/bi5tZW1vaXplZFByb3BzOmZyKGUudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKGksbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBvPWUudXBkYXRlUXVldWU7byE9PW51bGwmJkd5KGUsbyxyKTticmVhaztjYXNlIDM6dmFyIGw9ZS51cGRhdGVRdWV1ZTtpZihsIT09bnVsbCl7aWYobj1udWxsLGUuY2hpbGQhPT1udWxsKXN3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1Om49ZS5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49ZS5jaGlsZC5zdGF0ZU5vZGV9R3koZSxsLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz1lLnN0YXRlTm9kZTtpZihuPT09bnVsbCYmZS5mbGFncyY0KXtuPXM7dmFyIGE9ZS5tZW1vaXplZFByb3BzO3N3aXRjaChlLnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6YS5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6YS5zcmMmJihuLnNyYz1hLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKGUubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciB1PWUuYWx0ZXJuYXRlO2lmKHUhPT1udWxsKXt2YXIgYz11Lm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciBkPWMuZGVoeWRyYXRlZDtkIT09bnVsbCYmQmEoZCl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYzKSl9SnR8fGUuZmxhZ3MmNTEyJiZJcChlKX1jYXRjaChmKXt2dChlLGUucmV0dXJuLGYpfX1pZihlPT09dCl7bmU9bnVsbDticmVha31pZihuPWUuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49ZS5yZXR1cm4sbmU9bjticmVha31uZT1lLnJldHVybn19ZnVuY3Rpb24gZjAodCl7Zm9yKDtuZSE9PW51bGw7KXt2YXIgZT1uZTtpZihlPT09dCl7bmU9bnVsbDticmVha312YXIgbj1lLnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPWUucmV0dXJuLG5lPW47YnJlYWt9bmU9ZS5yZXR1cm59fWZ1bmN0aW9uIGgwKHQpe2Zvcig7bmUhPT1udWxsOyl7dmFyIGU9bmU7dHJ5e3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj1lLnJldHVybjt0cnl7ZmYoNCxlKX1jYXRjaChhKXt2dChlLG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPWUuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgaT1lLnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe3Z0KGUsaSxhKX19dmFyIG89ZS5yZXR1cm47dHJ5e0lwKGUpfWNhdGNoKGEpe3Z0KGUsbyxhKX1icmVhaztjYXNlIDU6dmFyIGw9ZS5yZXR1cm47dHJ5e0lwKGUpfWNhdGNoKGEpe3Z0KGUsbCxhKX19fWNhdGNoKGEpe3Z0KGUsZS5yZXR1cm4sYSl9aWYoZT09PXQpe25lPW51bGw7YnJlYWt9dmFyIHM9ZS5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj1lLnJldHVybixuZT1zO2JyZWFrfW5lPWUucmV0dXJufX12YXIgU1Q9TWF0aC5jZWlsLHBkPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTG09eGkuUmVhY3RDdXJyZW50T3duZXIsdHI9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsTGU9MCxCdD1udWxsLGJ0PW51bGwsWnQ9MCxBbj0wLERsPW1vKDApLFB0PTAsSmE9bnVsbCxXbz0wLGhmPTAsSW09MCxfYT1udWxsLGtuPW51bGwsRG09MCxscz0xLzAsdGk9bnVsbCxnZD0hMSx6cD1udWxsLFlpPW51bGwsY2M9ITEsQmk9bnVsbCxtZD0wLHdhPTAsRnA9bnVsbCxEYz0tMSxqYz0wO2Z1bmN0aW9uIHZuKCl7cmV0dXJuIExlJjY/Q3QoKTpEYyE9PS0xP0RjOkRjPUN0KCl9ZnVuY3Rpb24gWGkodCl7cmV0dXJuIHQubW9kZSYxP0xlJjImJlp0IT09MD9adCYtWnQ6b1QudHJhbnNpdGlvbiE9PW51bGw/KGpjPT09MCYmKGpjPWExKCkpLGpjKToodD1XZSx0IT09MHx8KHQ9d2luZG93LmV2ZW50LHQ9dD09PXZvaWQgMD8xNjpnMSh0LnR5cGUpKSx0KToxfWZ1bmN0aW9uIF9yKHQsZSxuLHIpe2lmKDUwPHdhKXRocm93IHdhPTAsRnA9bnVsbCxFcnJvcihXKDE4NSkpO1J1KHQsbixyKSwoIShMZSYyKXx8dCE9PUJ0KSYmKHQ9PT1CdCYmKCEoTGUmMikmJihoZnw9biksUHQ9PT00JiZEaSh0LFp0KSksTm4odCxyKSxuPT09MSYmTGU9PT0wJiYhKGUubW9kZSYxKSYmKGxzPUN0KCkrNTAwLHVmJiZ2bygpKSl9ZnVuY3Rpb24gTm4odCxlKXt2YXIgbj10LmNhbGxiYWNrTm9kZTtvJCh0LGUpO3ZhciByPXFjKHQsdD09PUJ0P1p0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZTeShuKSx0LmNhbGxiYWNrTm9kZT1udWxsLHQuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYoZT1yJi1yLHQuY2FsbGJhY2tQcmlvcml0eSE9PWUpe2lmKG4hPW51bGwmJlN5KG4pLGU9PT0xKXQudGFnPT09MD9pVChwMC5iaW5kKG51bGwsdCkpOk0xKHAwLmJpbmQobnVsbCx0KSksZVQoZnVuY3Rpb24oKXshKExlJjYpJiZ2bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKHUxKHIpKXtjYXNlIDE6bj11bTticmVhaztjYXNlIDQ6bj1sMTticmVhaztjYXNlIDE2Om49SmM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1zMTticmVhaztkZWZhdWx0Om49SmN9bj1BdyhuLGJ3LmJpbmQobnVsbCx0KSl9dC5jYWxsYmFja1ByaW9yaXR5PWUsdC5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gYncodCxlKXtpZihEYz0tMSxqYz0wLExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTt2YXIgbj10LmNhbGxiYWNrTm9kZTtpZihabCgpJiZ0LmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9cWModCx0PT09QnQ/WnQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZ0LmV4cGlyZWRMYW5lc3x8ZSllPXZkKHQscik7ZWxzZXtlPXI7dmFyIGk9TGU7TGV8PTI7dmFyIG89VHcoKTsoQnQhPT10fHxadCE9PWUpJiYodGk9bnVsbCxscz1DdCgpKzUwMCxBbyh0LGUpKTtkbyB0cnl7a1QoKTticmVha31jYXRjaChzKXskdyh0LHMpfXdoaWxlKCEwKTtTbSgpLHBkLmN1cnJlbnQ9byxMZT1pLGJ0IT09bnVsbD9lPTA6KEJ0PW51bGwsWnQ9MCxlPVB0KX1pZihlIT09MCl7aWYoZT09PTImJihpPWhwKHQpLGkhPT0wJiYocj1pLGU9QnAodCxpKSkpLGU9PT0xKXRocm93IG49SmEsQW8odCwwKSxEaSh0LHIpLE5uKHQsQ3QoKSksbjtpZihlPT09NilEaSh0LHIpO2Vsc2V7aWYoaT10LmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFFVChpKSYmKGU9dmQodCxyKSxlPT09MiYmKG89aHAodCksbyE9PTAmJihyPW8sZT1CcCh0LG8pKSksZT09PTEpKXRocm93IG49SmEsQW8odCwwKSxEaSh0LHIpLE5uKHQsQ3QoKSksbjtzd2l0Y2godC5maW5pc2hlZFdvcms9aSx0LmZpbmlzaGVkTGFuZXM9cixlKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFcoMzQ1KSk7Y2FzZSAyOmtvKHQsa24sdGkpO2JyZWFrO2Nhc2UgMzppZihEaSh0LHIpLChyJjEzMDAyMzQyNCk9PT1yJiYoZT1EbSs1MDAtQ3QoKSwxMDxlKSl7aWYocWModCwwKSE9PTApYnJlYWs7aWYoaT10LnN1c3BlbmRlZExhbmVzLChpJnIpIT09cil7dm4oKSx0LnBpbmdlZExhbmVzfD10LnN1c3BlbmRlZExhbmVzJmk7YnJlYWt9dC50aW1lb3V0SGFuZGxlPXdwKGtvLmJpbmQobnVsbCx0LGtuLHRpKSxlKTticmVha31rbyh0LGtuLHRpKTticmVhaztjYXNlIDQ6aWYoRGkodCxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKGU9dC5ldmVudFRpbWVzLGk9LTE7MDxyOyl7dmFyIGw9MzEteHIocik7bz0xPDxsLGw9ZVtsXSxsPmkmJihpPWwpLHImPX5vfWlmKHI9aSxyPUN0KCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKlNUKHIvMTk2MCkpLXIsMTA8cil7dC50aW1lb3V0SGFuZGxlPXdwKGtvLmJpbmQobnVsbCx0LGtuLHRpKSxyKTticmVha31rbyh0LGtuLHRpKTticmVhaztjYXNlIDU6a28odCxrbix0aSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDMyOSkpfX19cmV0dXJuIE5uKHQsQ3QoKSksdC5jYWxsYmFja05vZGU9PT1uP2J3LmJpbmQobnVsbCx0KTpudWxsfWZ1bmN0aW9uIEJwKHQsZSl7dmFyIG49X2E7cmV0dXJuIHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKEFvKHQsZSkuZmxhZ3N8PTI1NiksdD12ZCh0LGUpLHQhPT0yJiYoZT1rbixrbj1uLGUhPT1udWxsJiZVcChlKSksdH1mdW5jdGlvbiBVcCh0KXtrbj09PW51bGw/a249dDprbi5wdXNoLmFwcGx5KGtuLHQpfWZ1bmN0aW9uIEVUKHQpe2Zvcih2YXIgZT10Ozspe2lmKGUuZmxhZ3MmMTYzODQpe3ZhciBuPWUudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXSxvPWkuZ2V0U25hcHNob3Q7aT1pLnZhbHVlO3RyeXtpZighRXIobygpLGkpKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj1lLmNoaWxkLGUuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj1lLGU9bjtlbHNle2lmKGU9PT10KWJyZWFrO2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8ZS5yZXR1cm49PT10KXJldHVybiEwO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gRGkodCxlKXtmb3IoZSY9fkltLGUmPX5oZix0LnN1c3BlbmRlZExhbmVzfD1lLHQucGluZ2VkTGFuZXMmPX5lLHQ9dC5leHBpcmF0aW9uVGltZXM7MDxlOyl7dmFyIG49MzEteHIoZSkscj0xPDxuO3Rbbl09LTEsZSY9fnJ9fWZ1bmN0aW9uIHAwKHQpe2lmKExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtabCgpO3ZhciBlPXFjKHQsMCk7aWYoIShlJjEpKXJldHVybiBObih0LEN0KCkpLG51bGw7dmFyIG49dmQodCxlKTtpZih0LnRhZyE9PTAmJm49PT0yKXt2YXIgcj1ocCh0KTtyIT09MCYmKGU9cixuPUJwKHQscikpfWlmKG49PT0xKXRocm93IG49SmEsQW8odCwwKSxEaSh0LGUpLE5uKHQsQ3QoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihXKDM0NSkpO3JldHVybiB0LmZpbmlzaGVkV29yaz10LmN1cnJlbnQuYWx0ZXJuYXRlLHQuZmluaXNoZWRMYW5lcz1lLGtvKHQsa24sdGkpLE5uKHQsQ3QoKSksbnVsbH1mdW5jdGlvbiBqbSh0LGUpe3ZhciBuPUxlO0xlfD0xO3RyeXtyZXR1cm4gdChlKX1maW5hbGx5e0xlPW4sTGU9PT0wJiYobHM9Q3QoKSs1MDAsdWYmJnZvKCkpfX1mdW5jdGlvbiBWbyh0KXtCaSE9PW51bGwmJkJpLnRhZz09PTAmJiEoTGUmNikmJlpsKCk7dmFyIGU9TGU7TGV8PTE7dmFyIG49dHIudHJhbnNpdGlvbixyPVdlO3RyeXtpZih0ci50cmFuc2l0aW9uPW51bGwsV2U9MSx0KXJldHVybiB0KCl9ZmluYWxseXtXZT1yLHRyLnRyYW5zaXRpb249bixMZT1lLCEoTGUmNikmJnZvKCl9fWZ1bmN0aW9uIHptKCl7QW49RGwuY3VycmVudCxpdChEbCl9ZnVuY3Rpb24gQW8odCxlKXt0LmZpbmlzaGVkV29yaz1udWxsLHQuZmluaXNoZWRMYW5lcz0wO3ZhciBuPXQudGltZW91dEhhbmRsZTtpZihuIT09LTEmJih0LnRpbWVvdXRIYW5kbGU9LTEscSQobikpLGJ0IT09bnVsbClmb3Iobj1idC5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaCh4bShyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmlkKCk7YnJlYWs7Y2FzZSAzOmlzKCksaXQoJG4pLGl0KHJuKSxUbSgpO2JyZWFrO2Nhc2UgNTokbShyKTticmVhaztjYXNlIDQ6aXMoKTticmVhaztjYXNlIDEzOml0KGR0KTticmVhaztjYXNlIDE5Oml0KGR0KTticmVhaztjYXNlIDEwOkVtKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOnptKCl9bj1uLnJldHVybn1pZihCdD10LGJ0PXQ9UWkodC5jdXJyZW50LG51bGwpLFp0PUFuPWUsUHQ9MCxKYT1udWxsLEltPWhmPVdvPTAsa249X2E9bnVsbCxObyE9PW51bGwpe2ZvcihlPTA7ZTxOby5sZW5ndGg7ZSsrKWlmKG49Tm9bZV0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIGk9ci5uZXh0LG89bi5wZW5kaW5nO2lmKG8hPT1udWxsKXt2YXIgbD1vLm5leHQ7by5uZXh0PWksci5uZXh0PWx9bi5wZW5kaW5nPXJ9Tm89bnVsbH1yZXR1cm4gdH1mdW5jdGlvbiAkdyh0LGUpe2Rve3ZhciBuPWJ0O3RyeXtpZihTbSgpLE1jLmN1cnJlbnQ9aGQsZmQpe2Zvcih2YXIgcj1odC5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIGk9ci5xdWV1ZTtpIT09bnVsbCYmKGkucGVuZGluZz1udWxsKSxyPXIubmV4dH1mZD0hMX1pZihVbz0wLEl0PVJ0PWh0PW51bGwseWE9ITEsWWE9MCxMbS5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7UHQ9MSxKYT1lLGJ0PW51bGw7YnJlYWt9ZTp7dmFyIG89dCxsPW4ucmV0dXJuLHM9bixhPWU7aWYoZT1adCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIGY9Yy5hbHRlcm5hdGU7Zj8oYy51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1mLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgaD10MChsKTtpZihoIT09bnVsbCl7aC5mbGFncyY9LTI1NyxuMChoLGwscyxvLGUpLGgubW9kZSYxJiZlMChvLHUsZSksZT1oLGE9dTt2YXIgbT1lLnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgZz1uZXcgU2V0O2cuYWRkKGEpLGUudXBkYXRlUXVldWU9Z31lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKGUmMSkpe2UwKG8sdSxlKSxGbSgpO2JyZWFrIGV9YT1FcnJvcihXKDQyNikpfX1lbHNlIGlmKG90JiZzLm1vZGUmMSl7dmFyIHc9dDAobCk7aWYodyE9PW51bGwpeyEody5mbGFncyY2NTUzNikmJih3LmZsYWdzfD0yNTYpLG4wKHcsbCxzLG8sZSksX20ob3MoYSxzKSk7YnJlYWsgZX19bz1hPW9zKGEscyksUHQhPT00JiYoUHQ9MiksX2E9PT1udWxsP19hPVtvXTpfYS5wdXNoKG8pLG89bDtkb3tzd2l0Y2goby50YWcpe2Nhc2UgMzpvLmZsYWdzfD02NTUzNixlJj0tZSxvLmxhbmVzfD1lO3ZhciB2PWN3KG8sYSxlKTtaeShvLHYpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgeT1vLnR5cGUseD1vLnN0YXRlTm9kZTtpZighKG8uZmxhZ3MmMTI4KSYmKHR5cGVvZiB5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8eCE9PW51bGwmJnR5cGVvZiB4LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsfHwhWWkuaGFzKHgpKSkpe28uZmxhZ3N8PTY1NTM2LGUmPS1lLG8ubGFuZXN8PWU7dmFyIFM9ZHcobyxzLGUpO1p5KG8sUyk7YnJlYWsgZX19bz1vLnJldHVybn13aGlsZShvIT09bnVsbCl9Uncobil9Y2F0Y2goYil7ZT1iLGJ0PT09biYmbiE9PW51bGwmJihidD1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gVHcoKXt2YXIgdD1wZC5jdXJyZW50O3JldHVybiBwZC5jdXJyZW50PWhkLHQ9PT1udWxsP2hkOnR9ZnVuY3Rpb24gRm0oKXsoUHQ9PT0wfHxQdD09PTN8fFB0PT09MikmJihQdD00KSxCdD09PW51bGx8fCEoV28mMjY4NDM1NDU1KSYmIShoZiYyNjg0MzU0NTUpfHxEaShCdCxadCl9ZnVuY3Rpb24gdmQodCxlKXt2YXIgbj1MZTtMZXw9Mjt2YXIgcj1UdygpOyhCdCE9PXR8fFp0IT09ZSkmJih0aT1udWxsLEFvKHQsZSkpO2RvIHRyeXtDVCgpO2JyZWFrfWNhdGNoKGkpeyR3KHQsaSl9d2hpbGUoITApO2lmKFNtKCksTGU9bixwZC5jdXJyZW50PXIsYnQhPT1udWxsKXRocm93IEVycm9yKFcoMjYxKSk7cmV0dXJuIEJ0PW51bGwsWnQ9MCxQdH1mdW5jdGlvbiBDVCgpe2Zvcig7YnQhPT1udWxsOylOdyhidCl9ZnVuY3Rpb24ga1QoKXtmb3IoO2J0IT09bnVsbCYmIVhiKCk7KU53KGJ0KX1mdW5jdGlvbiBOdyh0KXt2YXIgZT1Qdyh0LmFsdGVybmF0ZSx0LEFuKTt0Lm1lbW9pemVkUHJvcHM9dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/UncodCk6YnQ9ZSxMbS5jdXJyZW50PW51bGx9ZnVuY3Rpb24gUncodCl7dmFyIGU9dDtkb3t2YXIgbj1lLmFsdGVybmF0ZTtpZih0PWUucmV0dXJuLGUuZmxhZ3MmMzI3Njgpe2lmKG49eVQobixlKSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsYnQ9bjtyZXR1cm59aWYodCE9PW51bGwpdC5mbGFnc3w9MzI3NjgsdC5zdWJ0cmVlRmxhZ3M9MCx0LmRlbGV0aW9ucz1udWxsO2Vsc2V7UHQ9NixidD1udWxsO3JldHVybn19ZWxzZSBpZihuPXZUKG4sZSxBbiksbiE9PW51bGwpe2J0PW47cmV0dXJufWlmKGU9ZS5zaWJsaW5nLGUhPT1udWxsKXtidD1lO3JldHVybn1idD1lPXR9d2hpbGUoZSE9PW51bGwpO1B0PT09MCYmKFB0PTUpfWZ1bmN0aW9uIGtvKHQsZSxuKXt2YXIgcj1XZSxpPXRyLnRyYW5zaXRpb247dHJ5e3RyLnRyYW5zaXRpb249bnVsbCxXZT0xLGJUKHQsZSxuLHIpfWZpbmFsbHl7dHIudHJhbnNpdGlvbj1pLFdlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gYlQodCxlLG4scil7ZG8gWmwoKTt3aGlsZShCaSE9PW51bGwpO2lmKExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtuPXQuZmluaXNoZWRXb3JrO3ZhciBpPXQuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZih0LmZpbmlzaGVkV29yaz1udWxsLHQuZmluaXNoZWRMYW5lcz0wLG49PT10LmN1cnJlbnQpdGhyb3cgRXJyb3IoVygxNzcpKTt0LmNhbGxiYWNrTm9kZT1udWxsLHQuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBvPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGwkKHQsbyksdD09PUJ0JiYoYnQ9QnQ9bnVsbCxadD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGNjfHwoY2M9ITAsQXcoSmMsZnVuY3Rpb24oKXtyZXR1cm4gWmwoKSxudWxsfSkpLG89KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8byl7bz10ci50cmFuc2l0aW9uLHRyLnRyYW5zaXRpb249bnVsbDt2YXIgbD1XZTtXZT0xO3ZhciBzPUxlO0xlfD00LExtLmN1cnJlbnQ9bnVsbCxfVCh0LG4pLEN3KG4sdCksSyQoeHApLGVkPSEheXAseHA9eXA9bnVsbCx0LmN1cnJlbnQ9bix3VChuKSxRYigpLExlPXMsV2U9bCx0ci50cmFuc2l0aW9uPW99ZWxzZSB0LmN1cnJlbnQ9bjtpZihjYyYmKGNjPSExLEJpPXQsbWQ9aSksbz10LnBlbmRpbmdMYW5lcyxvPT09MCYmKFlpPW51bGwpLGUkKG4uc3RhdGVOb2RlKSxObih0LEN0KCkpLGUhPT1udWxsKWZvcihyPXQub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPGUubGVuZ3RoO24rKylpPWVbbl0scihpLnZhbHVlLHtjb21wb25lbnRTdGFjazppLnN0YWNrLGRpZ2VzdDppLmRpZ2VzdH0pO2lmKGdkKXRocm93IGdkPSExLHQ9enAsenA9bnVsbCx0O3JldHVybiBtZCYxJiZ0LnRhZyE9PTAmJlpsKCksbz10LnBlbmRpbmdMYW5lcyxvJjE/dD09PUZwP3dhKys6KHdhPTAsRnA9dCk6d2E9MCx2bygpLG51bGx9ZnVuY3Rpb24gWmwoKXtpZihCaSE9PW51bGwpe3ZhciB0PXUxKG1kKSxlPXRyLnRyYW5zaXRpb24sbj1XZTt0cnl7aWYodHIudHJhbnNpdGlvbj1udWxsLFdlPTE2PnQ/MTY6dCxCaT09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZih0PUJpLEJpPW51bGwsbWQ9MCxMZSY2KXRocm93IEVycm9yKFcoMzMxKSk7dmFyIGk9TGU7Zm9yKExlfD00LG5lPXQuY3VycmVudDtuZSE9PW51bGw7KXt2YXIgbz1uZSxsPW8uY2hpbGQ7aWYobmUuZmxhZ3MmMTYpe3ZhciBzPW8uZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IobmU9dTtuZSE9PW51bGw7KXt2YXIgYz1uZTtzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eGEoOCxjLG8pfXZhciBkPWMuY2hpbGQ7aWYoZCE9PW51bGwpZC5yZXR1cm49YyxuZT1kO2Vsc2UgZm9yKDtuZSE9PW51bGw7KXtjPW5lO3ZhciBmPWMuc2libGluZyxoPWMucmV0dXJuO2lmKHd3KGMpLGM9PT11KXtuZT1udWxsO2JyZWFrfWlmKGYhPT1udWxsKXtmLnJldHVybj1oLG5lPWY7YnJlYWt9bmU9aH19fXZhciBtPW8uYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgZz1tLmNoaWxkO2lmKGchPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIHc9Zy5zaWJsaW5nO2cuc2libGluZz1udWxsLGc9d313aGlsZShnIT09bnVsbCl9fW5lPW99fWlmKG8uc3VidHJlZUZsYWdzJjIwNjQmJmwhPT1udWxsKWwucmV0dXJuPW8sbmU9bDtlbHNlIGU6Zm9yKDtuZSE9PW51bGw7KXtpZihvPW5lLG8uZmxhZ3MmMjA0OClzd2l0Y2goby50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eGEoOSxvLG8ucmV0dXJuKX12YXIgdj1vLnNpYmxpbmc7aWYodiE9PW51bGwpe3YucmV0dXJuPW8ucmV0dXJuLG5lPXY7YnJlYWsgZX1uZT1vLnJldHVybn19dmFyIHk9dC5jdXJyZW50O2ZvcihuZT15O25lIT09bnVsbDspe2w9bmU7dmFyIHg9bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZ4IT09bnVsbCl4LnJldHVybj1sLG5lPXg7ZWxzZSBlOmZvcihsPXk7bmUhPT1udWxsOyl7aWYocz1uZSxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpmZig5LHMpfX1jYXRjaChiKXt2dChzLHMucmV0dXJuLGIpfWlmKHM9PT1sKXtuZT1udWxsO2JyZWFrIGV9dmFyIFM9cy5zaWJsaW5nO2lmKFMhPT1udWxsKXtTLnJldHVybj1zLnJldHVybixuZT1TO2JyZWFrIGV9bmU9cy5yZXR1cm59fWlmKExlPWksdm8oKSx6ciYmdHlwZW9mIHpyLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7enIub25Qb3N0Q29tbWl0RmliZXJSb290KHJmLHQpfWNhdGNoe31yPSEwfXJldHVybiByfWZpbmFsbHl7V2U9bix0ci50cmFuc2l0aW9uPWV9fXJldHVybiExfWZ1bmN0aW9uIGcwKHQsZSxuKXtlPW9zKG4sZSksZT1jdyh0LGUsMSksdD1HaSh0LGUsMSksZT12bigpLHQhPT1udWxsJiYoUnUodCwxLGUpLE5uKHQsZSkpfWZ1bmN0aW9uIHZ0KHQsZSxuKXtpZih0LnRhZz09PTMpZzAodCx0LG4pO2Vsc2UgZm9yKDtlIT09bnVsbDspe2lmKGUudGFnPT09Myl7ZzAoZSx0LG4pO2JyZWFrfWVsc2UgaWYoZS50YWc9PT0xKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0eXBlb2YgZS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIHIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihZaT09PW51bGx8fCFZaS5oYXMocikpKXt0PW9zKG4sdCksdD1kdyhlLHQsMSksZT1HaShlLHQsMSksdD12bigpLGUhPT1udWxsJiYoUnUoZSwxLHQpLE5uKGUsdCkpO2JyZWFrfX1lPWUucmV0dXJufX1mdW5jdGlvbiAkVCh0LGUsbil7dmFyIHI9dC5waW5nQ2FjaGU7ciE9PW51bGwmJnIuZGVsZXRlKGUpLGU9dm4oKSx0LnBpbmdlZExhbmVzfD10LnN1c3BlbmRlZExhbmVzJm4sQnQ9PT10JiYoWnQmbik9PT1uJiYoUHQ9PT00fHxQdD09PTMmJihadCYxMzAwMjM0MjQpPT09WnQmJjUwMD5DdCgpLURtP0FvKHQsMCk6SW18PW4pLE5uKHQsZSl9ZnVuY3Rpb24gT3codCxlKXtlPT09MCYmKHQubW9kZSYxPyhlPWVjLGVjPDw9MSwhKGVjJjEzMDAyMzQyNCkmJihlYz00MTk0MzA0KSk6ZT0xKTt2YXIgbj12bigpO3Q9aGkodCxlKSx0IT09bnVsbCYmKFJ1KHQsZSxuKSxObih0LG4pKX1mdW5jdGlvbiBUVCh0KXt2YXIgZT10Lm1lbW9pemVkU3RhdGUsbj0wO2UhPT1udWxsJiYobj1lLnJldHJ5TGFuZSksT3codCxuKX1mdW5jdGlvbiBOVCh0LGUpe3ZhciBuPTA7c3dpdGNoKHQudGFnKXtjYXNlIDEzOnZhciByPXQuc3RhdGVOb2RlLGk9dC5tZW1vaXplZFN0YXRlO2khPT1udWxsJiYobj1pLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPXQuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVygzMTQpKX1yIT09bnVsbCYmci5kZWxldGUoZSksT3codCxuKX12YXIgUHc7UHc9ZnVuY3Rpb24odCxlLG4pe2lmKHQhPT1udWxsKWlmKHQubWVtb2l6ZWRQcm9wcyE9PWUucGVuZGluZ1Byb3BzfHwkbi5jdXJyZW50KWJuPSEwO2Vsc2V7aWYoISh0LmxhbmVzJm4pJiYhKGUuZmxhZ3MmMTI4KSlyZXR1cm4gYm49ITEsbVQodCxlLG4pO2JuPSEhKHQuZmxhZ3MmMTMxMDcyKX1lbHNlIGJuPSExLG90JiZlLmZsYWdzJjEwNDg1NzYmJkwxKGUsc2QsZS5pbmRleCk7c3dpdGNoKGUubGFuZXM9MCxlLnRhZyl7Y2FzZSAyOnZhciByPWUudHlwZTtJYyh0LGUpLHQ9ZS5wZW5kaW5nUHJvcHM7dmFyIGk9dHMoZSxybi5jdXJyZW50KTtLbChlLG4pLGk9Um0obnVsbCxlLHIsdCxpLG4pO3ZhciBvPU9tKCk7cmV0dXJuIGUuZmxhZ3N8PTEsdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbCYmdHlwZW9mIGkucmVuZGVyPT0iZnVuY3Rpb24iJiZpLiQkdHlwZW9mPT09dm9pZCAwPyhlLnRhZz0xLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbCxUbihyKT8obz0hMCxvZChlKSk6bz0hMSxlLm1lbW9pemVkU3RhdGU9aS5zdGF0ZSE9PW51bGwmJmkuc3RhdGUhPT12b2lkIDA/aS5zdGF0ZTpudWxsLGttKGUpLGkudXBkYXRlcj1jZixlLnN0YXRlTm9kZT1pLGkuX3JlYWN0SW50ZXJuYWxzPWUsVHAoZSxyLHQsbiksZT1PcChudWxsLGUsciwhMCxvLG4pKTooZS50YWc9MCxvdCYmbyYmeW0oZSksdW4obnVsbCxlLGksbiksZT1lLmNoaWxkKSxlO2Nhc2UgMTY6cj1lLmVsZW1lbnRUeXBlO2U6e3N3aXRjaChJYyh0LGUpLHQ9ZS5wZW5kaW5nUHJvcHMsaT1yLl9pbml0LHI9aShyLl9wYXlsb2FkKSxlLnR5cGU9cixpPWUudGFnPU9UKHIpLHQ9ZnIocix0KSxpKXtjYXNlIDA6ZT1ScChudWxsLGUscix0LG4pO2JyZWFrIGU7Y2FzZSAxOmU9bzAobnVsbCxlLHIsdCxuKTticmVhayBlO2Nhc2UgMTE6ZT1yMChudWxsLGUscix0LG4pO2JyZWFrIGU7Y2FzZSAxNDplPWkwKG51bGwsZSxyLGZyKHIudHlwZSx0KSxuKTticmVhayBlfXRocm93IEVycm9yKFcoMzA2LHIsIiIpKX1yZXR1cm4gZTtjYXNlIDA6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksUnAodCxlLHIsaSxuKTtjYXNlIDE6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksbzAodCxlLHIsaSxuKTtjYXNlIDM6ZTp7aWYoZ3coZSksdD09PW51bGwpdGhyb3cgRXJyb3IoVygzODcpKTtyPWUucGVuZGluZ1Byb3BzLG89ZS5tZW1vaXplZFN0YXRlLGk9by5lbGVtZW50LHoxKHQsZSksY2QoZSxyLG51bGwsbik7dmFyIGw9ZS5tZW1vaXplZFN0YXRlO2lmKHI9bC5lbGVtZW50LG8uaXNEZWh5ZHJhdGVkKWlmKG89e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSxlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1vLGUubWVtb2l6ZWRTdGF0ZT1vLGUuZmxhZ3MmMjU2KXtpPW9zKEVycm9yKFcoNDIzKSksZSksZT1sMCh0LGUscixuLGkpO2JyZWFrIGV9ZWxzZSBpZihyIT09aSl7aT1vcyhFcnJvcihXKDQyNCkpLGUpLGU9bDAodCxlLHIsbixpKTticmVhayBlfWVsc2UgZm9yKEluPVppKGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksRG49ZSxvdD0hMCxncj1udWxsLG49VzEoZSxudWxsLHIsbiksZS5jaGlsZD1uO247KW4uZmxhZ3M9bi5mbGFncyYtM3w0MDk2LG49bi5zaWJsaW5nO2Vsc2V7aWYobnMoKSxyPT09aSl7ZT1waSh0LGUsbik7YnJlYWsgZX11bih0LGUscixuKX1lPWUuY2hpbGR9cmV0dXJuIGU7Y2FzZSA1OnJldHVybiBWMShlKSx0PT09bnVsbCYma3AoZSkscj1lLnR5cGUsaT1lLnBlbmRpbmdQcm9wcyxvPXQhPT1udWxsP3QubWVtb2l6ZWRQcm9wczpudWxsLGw9aS5jaGlsZHJlbixfcChyLGkpP2w9bnVsbDpvIT09bnVsbCYmX3AocixvKSYmKGUuZmxhZ3N8PTMyKSxwdyh0LGUpLHVuKHQsZSxsLG4pLGUuY2hpbGQ7Y2FzZSA2OnJldHVybiB0PT09bnVsbCYma3AoZSksbnVsbDtjYXNlIDEzOnJldHVybiBtdyh0LGUsbik7Y2FzZSA0OnJldHVybiBibShlLGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLHI9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/ZS5jaGlsZD1ycyhlLG51bGwscixuKTp1bih0LGUscixuKSxlLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSkscjAodCxlLHIsaSxuKTtjYXNlIDc6cmV0dXJuIHVuKHQsZSxlLnBlbmRpbmdQcm9wcyxuKSxlLmNoaWxkO2Nhc2UgODpyZXR1cm4gdW4odCxlLGUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLGUuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gdW4odCxlLGUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLGUuY2hpbGQ7Y2FzZSAxMDplOntpZihyPWUudHlwZS5fY29udGV4dCxpPWUucGVuZGluZ1Byb3BzLG89ZS5tZW1vaXplZFByb3BzLGw9aS52YWx1ZSxYZShhZCxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1sLG8hPT1udWxsKWlmKEVyKG8udmFsdWUsbCkpe2lmKG8uY2hpbGRyZW49PT1pLmNoaWxkcmVuJiYhJG4uY3VycmVudCl7ZT1waSh0LGUsbik7YnJlYWsgZX19ZWxzZSBmb3Iobz1lLmNoaWxkLG8hPT1udWxsJiYoby5yZXR1cm49ZSk7byE9PW51bGw7KXt2YXIgcz1vLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1vLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PXIpe2lmKG8udGFnPT09MSl7YT11aSgtMSxuJi1uKSxhLnRhZz0yO3ZhciB1PW8udXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIGM9dS5wZW5kaW5nO2M9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9Yy5uZXh0LGMubmV4dD1hKSx1LnBlbmRpbmc9YX19by5sYW5lc3w9bixhPW8uYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9biksYnAoby5yZXR1cm4sbixlKSxzLmxhbmVzfD1uO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKG8udGFnPT09MTApbD1vLnR5cGU9PT1lLnR5cGU/bnVsbDpvLmNoaWxkO2Vsc2UgaWYoby50YWc9PT0xOCl7aWYobD1vLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MSkpO2wubGFuZXN8PW4scz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PW4pLGJwKGwsbixlKSxsPW8uc2libGluZ31lbHNlIGw9by5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1vO2Vsc2UgZm9yKGw9bztsIT09bnVsbDspe2lmKGw9PT1lKXtsPW51bGw7YnJlYWt9aWYobz1sLnNpYmxpbmcsbyE9PW51bGwpe28ucmV0dXJuPWwucmV0dXJuLGw9bzticmVha31sPWwucmV0dXJufW89bH11bih0LGUsaS5jaGlsZHJlbixuKSxlPWUuY2hpbGR9cmV0dXJuIGU7Y2FzZSA5OnJldHVybiBpPWUudHlwZSxyPWUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLEtsKGUsbiksaT1ucihpKSxyPXIoaSksZS5mbGFnc3w9MSx1bih0LGUscixuKSxlLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIHI9ZS50eXBlLGk9ZnIocixlLnBlbmRpbmdQcm9wcyksaT1mcihyLnR5cGUsaSksaTAodCxlLHIsaSxuKTtjYXNlIDE1OnJldHVybiBmdyh0LGUsZS50eXBlLGUucGVuZGluZ1Byb3BzLG4pO2Nhc2UgMTc6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksSWModCxlKSxlLnRhZz0xLFRuKHIpPyh0PSEwLG9kKGUpKTp0PSExLEtsKGUsbiksQjEoZSxyLGkpLFRwKGUscixpLG4pLE9wKG51bGwsZSxyLCEwLHQsbik7Y2FzZSAxOTpyZXR1cm4gdncodCxlLG4pO2Nhc2UgMjI6cmV0dXJuIGh3KHQsZSxuKX10aHJvdyBFcnJvcihXKDE1NixlLnRhZykpfTtmdW5jdGlvbiBBdyh0LGUpe3JldHVybiBvMSh0LGUpfWZ1bmN0aW9uIFJUKHQsZSxuLHIpe3RoaXMudGFnPXQsdGhpcy5rZXk9bix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPWUsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXIsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIHFuKHQsZSxuLHIpe3JldHVybiBuZXcgUlQodCxlLG4scil9ZnVuY3Rpb24gQm0odCl7cmV0dXJuIHQ9dC5wcm90b3R5cGUsISghdHx8IXQuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gT1QodCl7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIEJtKHQpPzE6MDtpZih0IT1udWxsKXtpZih0PXQuJCR0eXBlb2YsdD09PWxtKXJldHVybiAxMTtpZih0PT09c20pcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIFFpKHQsZSl7dmFyIG49dC5hbHRlcm5hdGU7cmV0dXJuIG49PT1udWxsPyhuPXFuKHQudGFnLGUsdC5rZXksdC5tb2RlKSxuLmVsZW1lbnRUeXBlPXQuZWxlbWVudFR5cGUsbi50eXBlPXQudHlwZSxuLnN0YXRlTm9kZT10LnN0YXRlTm9kZSxuLmFsdGVybmF0ZT10LHQuYWx0ZXJuYXRlPW4pOihuLnBlbmRpbmdQcm9wcz1lLG4udHlwZT10LnR5cGUsbi5mbGFncz0wLG4uc3VidHJlZUZsYWdzPTAsbi5kZWxldGlvbnM9bnVsbCksbi5mbGFncz10LmZsYWdzJjE0NjgwMDY0LG4uY2hpbGRMYW5lcz10LmNoaWxkTGFuZXMsbi5sYW5lcz10LmxhbmVzLG4uY2hpbGQ9dC5jaGlsZCxuLm1lbW9pemVkUHJvcHM9dC5tZW1vaXplZFByb3BzLG4ubWVtb2l6ZWRTdGF0ZT10Lm1lbW9pemVkU3RhdGUsbi51cGRhdGVRdWV1ZT10LnVwZGF0ZVF1ZXVlLGU9dC5kZXBlbmRlbmNpZXMsbi5kZXBlbmRlbmNpZXM9ZT09PW51bGw/bnVsbDp7bGFuZXM6ZS5sYW5lcyxmaXJzdENvbnRleHQ6ZS5maXJzdENvbnRleHR9LG4uc2libGluZz10LnNpYmxpbmcsbi5pbmRleD10LmluZGV4LG4ucmVmPXQucmVmLG59ZnVuY3Rpb24gemModCxlLG4scixpLG8pe3ZhciBsPTI7aWYocj10LHR5cGVvZiB0PT0iZnVuY3Rpb24iKUJtKHQpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiB0PT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaCh0KXtjYXNlICRsOnJldHVybiBNbyhuLmNoaWxkcmVuLGksbyxlKTtjYXNlIG9tOmw9OCxpfD04O2JyZWFrO2Nhc2UgSmg6cmV0dXJuIHQ9cW4oMTIsbixlLGl8MiksdC5lbGVtZW50VHlwZT1KaCx0LmxhbmVzPW8sdDtjYXNlIHFoOnJldHVybiB0PXFuKDEzLG4sZSxpKSx0LmVsZW1lbnRUeXBlPXFoLHQubGFuZXM9byx0O2Nhc2UgZXA6cmV0dXJuIHQ9cW4oMTksbixlLGkpLHQuZWxlbWVudFR5cGU9ZXAsdC5sYW5lcz1vLHQ7Y2FzZSBVXzpyZXR1cm4gcGYobixpLG8sZSk7ZGVmYXVsdDppZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIEZfOmw9MTA7YnJlYWsgZTtjYXNlIEJfOmw9OTticmVhayBlO2Nhc2UgbG06bD0xMTticmVhayBlO2Nhc2Ugc206bD0xNDticmVhayBlO2Nhc2UgQWk6bD0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihXKDEzMCx0PT1udWxsP3Q6dHlwZW9mIHQsIiIpKX1yZXR1cm4gZT1xbihsLG4sZSxpKSxlLmVsZW1lbnRUeXBlPXQsZS50eXBlPXIsZS5sYW5lcz1vLGV9ZnVuY3Rpb24gTW8odCxlLG4scil7cmV0dXJuIHQ9cW4oNyx0LHIsZSksdC5sYW5lcz1uLHR9ZnVuY3Rpb24gcGYodCxlLG4scil7cmV0dXJuIHQ9cW4oMjIsdCxyLGUpLHQuZWxlbWVudFR5cGU9VV8sdC5sYW5lcz1uLHQuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sdH1mdW5jdGlvbiBiaCh0LGUsbil7cmV0dXJuIHQ9cW4oNix0LG51bGwsZSksdC5sYW5lcz1uLHR9ZnVuY3Rpb24gJGgodCxlLG4pe3JldHVybiBlPXFuKDQsdC5jaGlsZHJlbiE9PW51bGw/dC5jaGlsZHJlbjpbXSx0LmtleSxlKSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86dC5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOnQuaW1wbGVtZW50YXRpb259LGV9ZnVuY3Rpb24gUFQodCxlLG4scixpKXt0aGlzLnRhZz1lLHRoaXMuY29udGFpbmVySW5mbz10LHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1zaCgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1zaCgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1zaCgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1pLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIFVtKHQsZSxuLHIsaSxvLGwscyxhKXtyZXR1cm4gdD1uZXcgUFQodCxlLG4scyxhKSxlPT09MT8oZT0xLG89PT0hMCYmKGV8PTgpKTplPTAsbz1xbigzLG51bGwsbnVsbCxlKSx0LmN1cnJlbnQ9byxvLnN0YXRlTm9kZT10LG8ubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LGttKG8pLHR9ZnVuY3Rpb24gQVQodCxlLG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpibCxrZXk6cj09bnVsbD9udWxsOiIiK3IsY2hpbGRyZW46dCxjb250YWluZXJJbmZvOmUsaW1wbGVtZW50YXRpb246bn19ZnVuY3Rpb24gTXcodCl7aWYoIXQpcmV0dXJuIG5vO3Q9dC5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYodGwodCkhPT10fHx0LnRhZyE9PTEpdGhyb3cgRXJyb3IoVygxNzApKTt2YXIgZT10O2Rve3N3aXRjaChlLnRhZyl7Y2FzZSAzOmU9ZS5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihUbihlLnR5cGUpKXtlPWUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fWU9ZS5yZXR1cm59d2hpbGUoZSE9PW51bGwpO3Rocm93IEVycm9yKFcoMTcxKSl9aWYodC50YWc9PT0xKXt2YXIgbj10LnR5cGU7aWYoVG4obikpcmV0dXJuIEExKHQsbixlKX1yZXR1cm4gZX1mdW5jdGlvbiBMdyh0LGUsbixyLGksbyxsLHMsYSl7cmV0dXJuIHQ9VW0obixyLCEwLHQsaSxvLGwscyxhKSx0LmNvbnRleHQ9TXcobnVsbCksbj10LmN1cnJlbnQscj12bigpLGk9WGkobiksbz11aShyLGkpLG8uY2FsbGJhY2s9ZT8/bnVsbCxHaShuLG8saSksdC5jdXJyZW50LmxhbmVzPWksUnUodCxpLHIpLE5uKHQsciksdH1mdW5jdGlvbiBnZih0LGUsbixyKXt2YXIgaT1lLmN1cnJlbnQsbz12bigpLGw9WGkoaSk7cmV0dXJuIG49TXcobiksZS5jb250ZXh0PT09bnVsbD9lLmNvbnRleHQ9bjplLnBlbmRpbmdDb250ZXh0PW4sZT11aShvLGwpLGUucGF5bG9hZD17ZWxlbWVudDp0fSxyPXI9PT12b2lkIDA/bnVsbDpyLHIhPT1udWxsJiYoZS5jYWxsYmFjaz1yKSx0PUdpKGksZSxsKSx0IT09bnVsbCYmKF9yKHQsaSxsLG8pLEFjKHQsaSxsKSksbH1mdW5jdGlvbiB5ZCh0KXtpZih0PXQuY3VycmVudCwhdC5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gdC5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gdC5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIG0wKHQsZSl7aWYodD10Lm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJnQuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBuPXQucmV0cnlMYW5lO3QucmV0cnlMYW5lPW4hPT0wJiZuPGU/bjplfX1mdW5jdGlvbiBXbSh0LGUpe20wKHQsZSksKHQ9dC5hbHRlcm5hdGUpJiZtMCh0LGUpfWZ1bmN0aW9uIE1UKCl7cmV0dXJuIG51bGx9dmFyIEl3PXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbih0KXtjb25zb2xlLmVycm9yKHQpfTtmdW5jdGlvbiBWbSh0KXt0aGlzLl9pbnRlcm5hbFJvb3Q9dH1tZi5wcm90b3R5cGUucmVuZGVyPVZtLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGU9PT1udWxsKXRocm93IEVycm9yKFcoNDA5KSk7Z2YodCxlLG51bGwsbnVsbCl9O21mLnByb3RvdHlwZS51bm1vdW50PVZtLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgZT10LmNvbnRhaW5lckluZm87Vm8oZnVuY3Rpb24oKXtnZihudWxsLHQsbnVsbCxudWxsKX0pLGVbZmldPW51bGx9fTtmdW5jdGlvbiBtZih0KXt0aGlzLl9pbnRlcm5hbFJvb3Q9dH1tZi5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9ZjEoKTt0PXtibG9ja2VkT246bnVsbCx0YXJnZXQ6dCxwcmlvcml0eTplfTtmb3IodmFyIG49MDtuPElpLmxlbmd0aCYmZSE9PTAmJmU8SWlbbl0ucHJpb3JpdHk7bisrKTtJaS5zcGxpY2UobiwwLHQpLG49PT0wJiZwMSh0KX19O2Z1bmN0aW9uIEhtKHQpe3JldHVybiEoIXR8fHQubm9kZVR5cGUhPT0xJiZ0Lm5vZGVUeXBlIT09OSYmdC5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiB2Zih0KXtyZXR1cm4hKCF0fHx0Lm5vZGVUeXBlIT09MSYmdC5ub2RlVHlwZSE9PTkmJnQubm9kZVR5cGUhPT0xMSYmKHQubm9kZVR5cGUhPT04fHx0Lm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIHYwKCl7fWZ1bmN0aW9uIExUKHQsZSxuLHIsaSl7aWYoaSl7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBvPXI7cj1mdW5jdGlvbigpe3ZhciB1PXlkKGwpO28uY2FsbCh1KX19dmFyIGw9THcoZSxyLHQsMCxudWxsLCExLCExLCIiLHYwKTtyZXR1cm4gdC5fcmVhY3RSb290Q29udGFpbmVyPWwsdFtmaV09bC5jdXJyZW50LFZhKHQubm9kZVR5cGU9PT04P3QucGFyZW50Tm9kZTp0KSxWbygpLGx9Zm9yKDtpPXQubGFzdENoaWxkOyl0LnJlbW92ZUNoaWxkKGkpO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgdT15ZChhKTtzLmNhbGwodSl9fXZhciBhPVVtKHQsMCwhMSxudWxsLG51bGwsITEsITEsIiIsdjApO3JldHVybiB0Ll9yZWFjdFJvb3RDb250YWluZXI9YSx0W2ZpXT1hLmN1cnJlbnQsVmEodC5ub2RlVHlwZT09PTg/dC5wYXJlbnROb2RlOnQpLFZvKGZ1bmN0aW9uKCl7Z2YoZSxhLG4scil9KSxhfWZ1bmN0aW9uIHlmKHQsZSxuLHIsaSl7dmFyIG89bi5fcmVhY3RSb290Q29udGFpbmVyO2lmKG8pe3ZhciBsPW87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe3ZhciBzPWk7aT1mdW5jdGlvbigpe3ZhciBhPXlkKGwpO3MuY2FsbChhKX19Z2YoZSxsLHQsaSl9ZWxzZSBsPUxUKG4sZSx0LGkscik7cmV0dXJuIHlkKGwpfWMxPWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnZhciBlPXQuc3RhdGVOb2RlO2lmKGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIG49c2EoZS5wZW5kaW5nTGFuZXMpO24hPT0wJiYoY20oZSxufDEpLE5uKGUsQ3QoKSksIShMZSY2KSYmKGxzPUN0KCkrNTAwLHZvKCkpKX1icmVhaztjYXNlIDEzOlZvKGZ1bmN0aW9uKCl7dmFyIHI9aGkodCwxKTtpZihyIT09bnVsbCl7dmFyIGk9dm4oKTtfcihyLHQsMSxpKX19KSxXbSh0LDEpfX07ZG09ZnVuY3Rpb24odCl7aWYodC50YWc9PT0xMyl7dmFyIGU9aGkodCwxMzQyMTc3MjgpO2lmKGUhPT1udWxsKXt2YXIgbj12bigpO19yKGUsdCwxMzQyMTc3Mjgsbil9V20odCwxMzQyMTc3MjgpfX07ZDE9ZnVuY3Rpb24odCl7aWYodC50YWc9PT0xMyl7dmFyIGU9WGkodCksbj1oaSh0LGUpO2lmKG4hPT1udWxsKXt2YXIgcj12bigpO19yKG4sdCxlLHIpfVdtKHQsZSl9fTtmMT1mdW5jdGlvbigpe3JldHVybiBXZX07aDE9ZnVuY3Rpb24odCxlKXt2YXIgbj1XZTt0cnl7cmV0dXJuIFdlPXQsZSgpfWZpbmFsbHl7V2U9bn19O2NwPWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2goZSl7Y2FzZSJpbnB1dCI6aWYocnAodCxuKSxlPW4ubmFtZSxuLnR5cGU9PT0icmFkaW8iJiZlIT1udWxsKXtmb3Iobj10O24ucGFyZW50Tm9kZTspbj1uLnBhcmVudE5vZGU7Zm9yKG49bi5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrZSkrJ11bdHlwZT0icmFkaW8iXScpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtpZihyIT09dCYmci5mb3JtPT09dC5mb3JtKXt2YXIgaT1hZihyKTtpZighaSl0aHJvdyBFcnJvcihXKDkwKSk7Vl8ocikscnAocixpKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOktfKHQsbik7YnJlYWs7Y2FzZSJzZWxlY3QiOmU9bi52YWx1ZSxlIT1udWxsJiZVbCh0LCEhbi5tdWx0aXBsZSxlLCExKX19O3FfPWptO2UxPVZvO3ZhciBJVD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbUHUsT2wsYWYsUV8sSl8sam1dfSxacz17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6VG8sYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sRFQ9e2J1bmRsZVR5cGU6WnMuYnVuZGxlVHlwZSx2ZXJzaW9uOlpzLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpacy5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOlpzLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9cjEodCksdD09PW51bGw/bnVsbDp0LnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6WnMuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fE1ULGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiKXt2YXIgZGM9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKCFkYy5pc0Rpc2FibGVkJiZkYy5zdXBwb3J0c0ZpYmVyKXRyeXtyZj1kYy5pbmplY3QoRFQpLHpyPWRjfWNhdGNoe319Vm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9SVQ7Vm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIUhtKGUpKXRocm93IEVycm9yKFcoMjAwKSk7cmV0dXJuIEFUKHQsZSxudWxsLG4pfTtWbi5jcmVhdGVSb290PWZ1bmN0aW9uKHQsZSl7aWYoIUhtKHQpKXRocm93IEVycm9yKFcoMjk5KSk7dmFyIG49ITEscj0iIixpPUl3O3JldHVybiBlIT1udWxsJiYoZS51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSxlLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPWUuaWRlbnRpZmllclByZWZpeCksZS5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPWUub25SZWNvdmVyYWJsZUVycm9yKSksZT1VbSh0LDEsITEsbnVsbCxudWxsLG4sITEscixpKSx0W2ZpXT1lLmN1cnJlbnQsVmEodC5ub2RlVHlwZT09PTg/dC5wYXJlbnROb2RlOnQpLG5ldyBWbShlKX07Vm4uZmluZERPTU5vZGU9ZnVuY3Rpb24odCl7aWYodD09bnVsbClyZXR1cm4gbnVsbDtpZih0Lm5vZGVUeXBlPT09MSlyZXR1cm4gdDt2YXIgZT10Ll9yZWFjdEludGVybmFscztpZihlPT09dm9pZCAwKXRocm93IHR5cGVvZiB0LnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihXKDE4OCkpOih0PU9iamVjdC5rZXlzKHQpLmpvaW4oIiwiKSxFcnJvcihXKDI2OCx0KSkpO3JldHVybiB0PXIxKGUpLHQ9dD09PW51bGw/bnVsbDp0LnN0YXRlTm9kZSx0fTtWbi5mbHVzaFN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIFZvKHQpfTtWbi5oeWRyYXRlPWZ1bmN0aW9uKHQsZSxuKXtpZighdmYoZSkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4geWYobnVsbCx0LGUsITAsbil9O1ZuLmh5ZHJhdGVSb290PWZ1bmN0aW9uKHQsZSxuKXtpZighSG0odCkpdGhyb3cgRXJyb3IoVyg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxpPSExLG89IiIsbD1JdztpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihpPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihvPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihsPW4ub25SZWNvdmVyYWJsZUVycm9yKSksZT1MdyhlLG51bGwsdCwxLG4/P251bGwsaSwhMSxvLGwpLHRbZmldPWUuY3VycmVudCxWYSh0KSxyKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspbj1yW3RdLGk9bi5fZ2V0VmVyc2lvbixpPWkobi5fc291cmNlKSxlLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/ZS5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLGldOmUubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4saSk7cmV0dXJuIG5ldyBtZihlKX07Vm4ucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXtpZighdmYoZSkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4geWYobnVsbCx0LGUsITEsbil9O1ZuLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24odCl7aWYoIXZmKHQpKXRocm93IEVycm9yKFcoNDApKTtyZXR1cm4gdC5fcmVhY3RSb290Q29udGFpbmVyPyhWbyhmdW5jdGlvbigpe3lmKG51bGwsbnVsbCx0LCExLGZ1bmN0aW9uKCl7dC5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsdFtmaV09bnVsbH0pfSksITApOiExfTtWbi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1qbTtWbi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixyKXtpZighdmYobikpdGhyb3cgRXJyb3IoVygyMDApKTtpZih0PT1udWxsfHx0Ll9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihXKDM4KSk7cmV0dXJuIHlmKHQsZSxuLCExLHIpfTtWbi52ZXJzaW9uPSIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDgiO2Z1bmN0aW9uIER3KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShEdyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX19RHcoKSxMXy5leHBvcnRzPVZuO3ZhciBHcj1MXy5leHBvcnRzO2NvbnN0IGp3PVR1KEdyKSxqVD1rXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpqd30sW0dyXSk7dmFyIHkwPUdyO1hoLmNyZWF0ZVJvb3Q9eTAuY3JlYXRlUm9vdCxYaC5oeWRyYXRlUm9vdD15MC5oeWRyYXRlUm9vdDt2YXIgenc9e2V4cG9ydHM6e319LHhmPXt9Oy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHpUPXAsRlQ9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEJUPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksVVQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxXVD16VC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcixWVD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIEZ3KHQsZSxuKXt2YXIgcixpPXt9LG89bnVsbCxsPW51bGw7biE9PXZvaWQgMCYmKG89IiIrbiksZS5rZXkhPT12b2lkIDAmJihvPSIiK2Uua2V5KSxlLnJlZiE9PXZvaWQgMCYmKGw9ZS5yZWYpO2ZvcihyIGluIGUpVVQuY2FsbChlLHIpJiYhVlQuaGFzT3duUHJvcGVydHkocikmJihpW3JdPWVbcl0pO2lmKHQmJnQuZGVmYXVsdFByb3BzKWZvcihyIGluIGU9dC5kZWZhdWx0UHJvcHMsZSlpW3JdPT09dm9pZCAwJiYoaVtyXT1lW3JdKTtyZXR1cm57JCR0eXBlb2Y6RlQsdHlwZTp0LGtleTpvLHJlZjpsLHByb3BzOmksX293bmVyOldULmN1cnJlbnR9fXhmLkZyYWdtZW50PUJUO3hmLmpzeD1Gdzt4Zi5qc3hzPUZ3O3p3LmV4cG9ydHM9eGY7dmFyIF89encuZXhwb3J0cztmdW5jdGlvbiBXcCh0LGUpeyhlPT1udWxsfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIEttKHQsZSl7aWYodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiBXcCh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20odCk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gV3AodCxlKX19ZnVuY3Rpb24gWm0odCxlKXt2YXIgbj10eXBlb2YgU3ltYm9sPCJ1IiYmdFtTeW1ib2wuaXRlcmF0b3JdfHx0WyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkodCl8fChuPUttKHQpKXx8ZSYmdCYmdHlwZW9mIHQubGVuZ3RoPT0ibnVtYmVyIil7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYX0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgbz0hMCxsPSExLHM7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbCh0KX0sbjpmdW5jdGlvbigpe3ZhciBhPW4ubmV4dCgpO3JldHVybiBvPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2w9ITAscz1hfSxmOmZ1bmN0aW9uKCl7dHJ5eyFvJiZuLnJldHVybiE9bnVsbCYmbi5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgc319fX1mdW5jdGlvbiBCdyh0KXtyZXR1cm4gdC5sZW5ndGg+MH12YXIgTXU9T2JqZWN0LmZyZWV6ZSh7a2luZDoib2siLHZhbHVlOnZvaWQgMH0pO2Z1bmN0aW9uIEx1KHQpe3JldHVybiB0PT09dm9pZCAwP011OntraW5kOiJvayIsdmFsdWU6dH19ZnVuY3Rpb24gQnIodCl7cmV0dXJue2tpbmQ6ImVyciIsZXJyb3I6dH19ZnVuY3Rpb24gd3ModCl7cmV0dXJuIHQ9PT1NdXx8dC5raW5kPT09Im9rIn1mdW5jdGlvbiBHbSh0KXtyZXR1cm4gdCE9PU11JiZ0LmtpbmQ9PT0iZXJyIn1mdW5jdGlvbiBVdyh0KXt2YXIgZT1bXSxuPVtdLHI9Wm0odCksaTt0cnl7Zm9yKHIucygpOyEoaT1yLm4oKSkuZG9uZTspe3ZhciBvPWkudmFsdWU7d3Mobyk/ZS5wdXNoKG8udmFsdWUpOm4ucHVzaChvLmVycm9yKX19Y2F0Y2gobCl7ci5lKGwpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIEJ3KG4pP0JyKG4pOkx1KGUpfWZ1bmN0aW9uIEhUKHQpe3JldHVybiBVdyh0KX1mdW5jdGlvbiBLVCh0KXt2YXIgZT1bXSxuPVptKHQpLHI7dHJ5e2ZvcihuLnMoKTshKHI9bi5uKCkpLmRvbmU7KXt2YXIgaT1yLnZhbHVlO0dtKGkpJiZlLnB1c2goaS5lcnJvcil9fWNhdGNoKG8pe24uZShvKX1maW5hbGx5e24uZigpfXJldHVybiBCdyhlKT9CcihlKTpNdX1mdW5jdGlvbiBaVCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHI9THUoZSksaT0wO2k8bi5sZW5ndGgmJndzKHIpOysraSlyPXQoci52YWx1ZSxuW2ldLGkpO3JldHVybiByfX1mdW5jdGlvbiBHVCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHdzKGUpP0x1KHQoZS52YWx1ZSkpOmV9fWZ1bmN0aW9uIFlUKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gd3MoZSk/dChlLnZhbHVlKTplfX1mdW5jdGlvbiBYVCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEdtKGUpP0JyKHQoZS5lcnJvcikpOmV9fWZ1bmN0aW9uIFFUKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pP0x1KG4pOkJyKGUobikpfX12YXIgSlQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHdzKHIpP2Uoci52YWx1ZSk/cjpCcihuKHIudmFsdWUpKTpyfX0sTG89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdm9pZE9rOk11LG9rOkx1LGVycjpCcixpc09rOndzLGlzRXJyOkdtLGFsbFQ6VXcsYWxsOkhULGFsbFY6S1QsZmxhdE1hcFJlZHVjZTpaVCxtYXA6R1QsZmxhdE1hcDpZVCxtYXBFcnI6WFQsZnJvbVByZWRpY2F0ZTpRVCxmaWx0ZXJPckVsc2U6SlR9KTtmdW5jdGlvbiBxVCh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBXcCh0KX1mdW5jdGlvbiBlTih0KXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmdFtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHx0WyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20odCl9ZnVuY3Rpb24gdE4oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIG5OKHQpe3JldHVybiBxVCh0KXx8ZU4odCl8fEttKHQpfHx0TigpfWZ1bmN0aW9uIEVlKHQpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIEVlPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxFZSh0KX1mdW5jdGlvbiByTih0LGUpe2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuIHQ7dmFyIG49dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKG4hPT12b2lkIDApe3ZhciByPW4uY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYodHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKGU9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKSh0KX1mdW5jdGlvbiBXdyh0KXt2YXIgZT1yTih0LCJzdHJpbmciKTtyZXR1cm4gdHlwZW9mIGU9PSJzeW1ib2wiP2U6U3RyaW5nKGUpfWZ1bmN0aW9uIFVlKHQsZSxuKXtyZXR1cm4gZT1XdyhlKSxlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHgwKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gc3ModCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/eDAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe1VlKHQscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOngwKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gdH1mdW5jdGlvbiBpTih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIG9OKHQsZSl7dmFyIG49dD09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl18fHRbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwodCkpLm5leHQsZT09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09ZSk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBsTigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBKaSh0LGUpe3JldHVybiBpTih0KXx8b04odCxlKXx8S20odCxlKXx8bE4oKX1mdW5jdGlvbiBicih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF8wKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxXdyhyLmtleSkscil9fWZ1bmN0aW9uICRyKHQsZSxuKXtyZXR1cm4gZSYmXzAodC5wcm90b3R5cGUsZSksbiYmXzAodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIFZwKHQsZSl7cmV0dXJuIFZwPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHIsaSl7cmV0dXJuIHIuX19wcm90b19fPWkscn0sVnAodCxlKX1mdW5jdGlvbiBubCh0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZWcCh0LGUpfWZ1bmN0aW9uIHhkKHQpe3JldHVybiB4ZD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuKXtyZXR1cm4gbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihuKX0seGQodCl9ZnVuY3Rpb24gc04oKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVncodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fWZ1bmN0aW9uIGFOKHQsZSl7aWYoZSYmKHR5cGVvZiBlPT0ib2JqZWN0Inx8dHlwZW9mIGU9PSJmdW5jdGlvbiIpKXJldHVybiBlO2lmKGUhPT12b2lkIDApdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gVncodCl9ZnVuY3Rpb24gcmwodCl7dmFyIGU9c04oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj14ZCh0KSxpO2lmKGUpe3ZhciBvPXhkKHRoaXMpLmNvbnN0cnVjdG9yO2k9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsbyl9ZWxzZSBpPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBhTih0aGlzLGkpfX12YXIgaWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YnIodGhpcyx0KX1yZXR1cm4gJHIodCxbe2tleToiYXBwZW5kVmFsaWRhdGlvbkVycm9yIix2YWx1ZTpmdW5jdGlvbihuLHIsaSxvKXtyZXR1cm4gbj8obltyXT9uW3JdLnB1c2goe21lc3NhZ2U6aSx2YWx1ZTpvfSk6bltyXT1be21lc3NhZ2U6aSx2YWx1ZTpvfV0sbik6VWUoe30scixbe21lc3NhZ2U6aSx2YWx1ZTpvfV0pfX1dKSx0fSgpLEZjPVN5bWJvbCgiR2V0U2NoZW1hIikscG49U3ltYm9sKCJQYXRoIiksT3Q9U3ltYm9sKCJHZXRTb3VyY2UiKTtmdW5jdGlvbiB1Tih0KXtyZXR1cm4gdFtGY119dmFyIFltPSRyKGZ1bmN0aW9uIHQoZSl7YnIodGhpcyx0KSx0aGlzLnNwYW49ZX0pLGNOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvO3JldHVybiBicih0aGlzLG4pLG89ZS5jYWxsKHRoaXMsaSksVWUoVncobyksInR5cGUiLCJTeW0iKSxvLnZhbHVlPXIsb31yZXR1cm4gJHIobixbe2tleToidHJhbnNwaWxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfX1dKSxufShZbSk7bmV3IGNOKCIoKSIpO3ZhciBubj0iX3R5cGUiLFJuPSJfcmVmIixkTj1mdW5jdGlvbih0KXtubChuLHQpO3ZhciBlPXJsKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGJyKHRoaXMsbiksaT1lLmNhbGwodGhpcyksaS5vcHRpb25zPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6bz09bnVsbD9VZSh7fSxpLFt7bWVzc2FnZToiTm9uLW9wdGlvbmFsIGltYWdlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iLHZhbHVlOm99XSk6dHlwZW9mIG9bUm5dIT0ic3RyaW5nIj9VZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIGEgZmlsZSByZWZlcmVuY2Ugc3RyaW5nLiBHb3Q6ICIuY29uY2F0KEVlKG9bUm5dKSksdmFsdWU6b31dKTpvW25uXSE9PSJmaWxlIj9VZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIHRoZSB2YWxpZCBmaWxlIGV4dGVuc2lvbiB0eXBlLiBHb3Q6ICIuY29uY2F0KG9bbm5dKSx2YWx1ZTpvfV0pOm8ubWV0YWRhdGE/VWUoe30saSxbe21lc3NhZ2U6IkZvdW5kIG1ldGFkYXRhLCBidXQgaXQgY291bGQgbm90IGJlIHZhbGlkYXRlZC4gSW1hZ2UgbWV0YWRhdGEgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgcmVxdWlyZWQgcHJvcHM6IHdpZHRoIChwb3NpdGl2ZSBudW1iZXIpLCBoZWlnaHQgKHBvc2l0aXZlIG51bWJlcikgYW5kIHNoYTI1NiAoc3RyaW5nIG9mIGxlbmd0aCA2NCBvZiB0aGUgYmFzZTE2IGhhc2gpLiIsdmFsdWU6byxmaXhlczpbImltYWdlOnJlcGxhY2UtbWV0YWRhdGEiXX1dKTpVZSh7fSxpLFt7bWVzc2FnZToiQ291bGQgbm90IHZhbGlkYXRlIEltYWdlIG1ldGFkYXRhLiIsdmFsdWU6byxmaXhlczpbImltYWdlOmFkZC1tZXRhZGF0YSJdfV0pfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITA6KGk9PW51bGw/dm9pZCAwOmlbUm5dKT09PSJpbWFnZSImJihpPT1udWxsP3ZvaWQgMDppW25uXSk9PT0iZmlsZSJ9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiaW1hZ2UiLG9wdGlvbnM6dGhpcy5vcHRpb25zLG9wdDp0aGlzLm9wdH19fV0pLG59KGlsKSxIdz1mdW5jdGlvbihlKXt2YXIgbjtpZighZVtSbl0uc3RhcnRzV2l0aCgiL3B1YmxpYyIpKXt2YXIgcjtyZXR1cm57dXJsOmVbUm5dKyI/c2hhMjU2PSIuY29uY2F0KChyPWUubWV0YWRhdGEpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zaGEyNTYpLG1ldGFkYXRhOmUubWV0YWRhdGF9fXJldHVybnt1cmw6ZVtSbl0uc2xpY2UoNykrIj9zaGEyNTY9Ii5jb25jYXQoKG49ZS5tZXRhZGF0YSk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLnNoYTI1NiksbWV0YWRhdGE6ZS5tZXRhZGF0YX19O2Z1bmN0aW9uIEt3KHQpe3JldHVybiBFZSh0KT09PSJvYmplY3QiJiZ0IT09bnVsbCYmdCE9PXZvaWQgMCYmKCJ2YWwiaW4gdHx8InZhbFBhdGgiaW4gdCl9ZnVuY3Rpb24gZk4odCl7cmV0dXJuIEVlKHQpPT09Im9iamVjdCImJnQhPT1udWxsJiZ0IT09dm9pZCAwJiZwbiBpbiB0JiYidmFsImluIHR9ZnVuY3Rpb24gaE4odCl7cmV0dXJuIHRbcG5dfWZ1bmN0aW9uIHBOKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIHcwKHQsZSxuKXtyZXR1cm4gZT9NdCh0KE10KGUsbikpKTpNdChlLG4pfWZ1bmN0aW9uIHFpKHQpe3JldHVybiBFZSh0KT09PSJvYmplY3QiJiZ0IT09bnVsbCYmKE90IGluIHR8fHBuIGluIHQpfWZ1bmN0aW9uIE10KHQsZSxuKXtpZihFZSh0KT09PSJvYmplY3QiKXtpZihxaSh0KSlyZXR1cm4gdDtpZihLdyh0KSlyZXR1cm4gTXQodC52YWwsdC52YWxQYXRoKX1pZih0JiZ0W1JuXSYmdFtubl09PT0iZmlsZSIpe3ZhciByPXRbUm5dO2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBmaWxlIHJlZjogIityKTtyZXR1cm4gTXQoSHcodCksZSxuKX1zd2l0Y2goRWUodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCBzZWxlY3RvciB0eXBlOiAiLmNvbmNhdChFZSh0KSwiOiAiKS5jb25jYXQodCkpO2Nhc2Uib2JqZWN0IjppZih0IT09bnVsbClyZXR1cm4gbmV3IFByb3h5KHQse2hhczpmdW5jdGlvbihvLGwpe3JldHVybiBsPT09T3R8fGw9PT1wbnx8bD09PSJhbmRUaGVuInx8bD09PUZjPyEwOmwgaW4gb30sZ2V0OmZ1bmN0aW9uKG8sbCl7aWYobD09PU90KXJldHVybiB0O2lmKGw9PT1wbilyZXR1cm4gZTtpZihsPT09RmMpcmV0dXJuIG47aWYobD09PSJhbmRUaGVuIilyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIHcwKGEsdCxlKX07aWYoQXJyYXkuaXNBcnJheShvKSl7aWYobD09PSJmaWx0ZXIiKXJldHVybiBmdW5jdGlvbihhKXt2YXIgdT1vLm1hcChmdW5jdGlvbihjLGQpe3JldHVybiBNdChjLG1yKGUsZCksbj09bnVsbD92b2lkIDA6bi5pdGVtKX0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIGlsP2EuYXNzZXJ0KFMwKGMpKTpTMChhKGMpKX0pO3JldHVybiBNdCh1LGUsbil9O2lmKGw9PT0ibWFwIilyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIHU9by5tYXAoZnVuY3Rpb24oYyxkKXt2YXIgZj1hKE10KGMsbXIoZSxkKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pLE10KGQpKTtyZXR1cm4gcWkoZik/ZjpNdChmKX0pO3JldHVybiBNdCh1LGUsbil9fWlmKEFycmF5LmlzQXJyYXkobykmJmw9PT0ibGVuZ3RoIilyZXR1cm4gTXQoby5sZW5ndGgpO3ZhciBzPVJlZmxlY3QuZ2V0KG8sbCk7cmV0dXJuIHBOKHQsbCk/TnVtYmVyLmlzTmFOKE51bWJlcihsKSk/TXQocyxtcihlLGwpLG49PW51bGw/dm9pZCAwOm4uaXRlbXNbbF0pOk10KHMsbXIoZSxOdW1iZXIobCkpLG49PW51bGw/dm9pZCAwOm4uaXRlbSk6c319KTtkZWZhdWx0OnJldHVybiBVZShVZShVZSh7ZXE6ZnVuY3Rpb24obyl7dmFyIGw9bztpZihxaShvKSYmKGw9b1tPdF0sbCBpbnN0YW5jZW9mIFltKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBNdCh0PT09bCx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKG8pe3JldHVybiB3MChvLHQ9PT12b2lkIDA/bnVsbDp0LGUpfX0sT3QsdD09PXZvaWQgMD9udWxsOnQpLHBuLGUpLEZjLG4pfX1mdW5jdGlvbiBtcih0LGUpe2lmKEVlKGUpPT09InN5bWJvbCIpdGhyb3cgRXJyb3IoIkNhbm5vdCBjcmVhdGUgdmFsIHBhdGggb2YgYXJyYXkgaXRlbSB3aXRoIHN5bWJvbCBwcm9wOiAiLmNvbmNhdChlLnRvU3RyaW5nKCkpKTtyZXR1cm4gdCYmIiIuY29uY2F0KHQsIi4iKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZSkpfWZ1bmN0aW9uIFMwKHQpe2lmKEVlKHQpPT09Im9iamVjdCImJihPdCBpbiB0fHxwbiBpbiB0KSl7dmFyIGU9dFtPdF07cmV0dXJuIGV9cmV0dXJuIHR9dmFyIGdOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLml0ZW1zPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOkVlKG8pIT09Im9iamVjdCI/VWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KEVlKG8pLCInIil9XSk6QXJyYXkuaXNBcnJheShvKT9VZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXModGhpcy5pdGVtcykuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1KaShhLDIpLGM9dVswXSxkPXVbMV0sZj1tcihpLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxpLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFpJiZ0eXBlb2YgaT09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjppLCIgYXQga2V5ICIpLmNvbmNhdChjKSxvKTtlbHNle3ZhciBoPWQudmFsaWRhdGUoZixvW2NdKTtoJiZzP3M9c3Moc3Moe30saCkscyk6aCYmKHM9aCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO2Zvcih2YXIgbz0wLGw9T2JqZWN0LmVudHJpZXModGhpcy5pdGVtcyk7bzxsLmxlbmd0aDtvKyspe3ZhciBzPUppKGxbb10sMiksYT1zWzBdLHU9c1sxXTtpZighdS5hc3NlcnQoaVthXSkpcmV0dXJuITF9cmV0dXJuIEVlKGkpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJvYmplY3QiLGl0ZW1zOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5tYXAoZnVuY3Rpb24oaSl7dmFyIG89SmkoaSwyKSxsPW9bMF0scz1vWzFdO3JldHVybltsLHMuc2VyaWFsaXplKCldfSkpLG9wdDp0aGlzLm9wdH19fV0pLG59KGlsKSxtTj1mdW5jdGlvbih0KXtubChuLHQpO3ZhciBlPXJsKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGJyKHRoaXMsbiksaT1lLmNhbGwodGhpcyksaS5pdGVtPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOkVlKG8pIT09Im9iamVjdCJ8fCFBcnJheS5pc0FycmF5KG8pP1VlKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnYXJyYXknLCBnb3QgJyIuY29uY2F0KEVlKG8pLCInIil9XSk6KG8uZm9yRWFjaChmdW5jdGlvbihhLHUpe3ZhciBjPW1yKGksdSk7aWYoIWMpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBpbmRleCAiKS5jb25jYXQodSksbyk7ZWxzZXt2YXIgZD1sLml0ZW0udmFsaWRhdGUoYyxhKTtkJiZzP3M9c3Moc3Moe30sZCkscyk6ZCYmKHM9ZCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO3ZhciBvPVptKGkpLGw7dHJ5e2ZvcihvLnMoKTshKGw9by5uKCkpLmRvbmU7KXt2YXIgcz1sLnZhbHVlO2lmKCF0aGlzLml0ZW0uYXNzZXJ0KHMpKXJldHVybiExfX1jYXRjaChhKXtvLmUoYSl9ZmluYWxseXtvLmYoKX1yZXR1cm4gRWUoaSk9PT0ib2JqZWN0IiYmQXJyYXkuaXNBcnJheShpKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLml0ZW0sITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJhcnJheSIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHZOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvLGw9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExO3JldHVybiBicih0aGlzLG4pLG89ZS5jYWxsKHRoaXMpLG8ua2V5PXIsby5pdGVtcz1pLG8ub3B0PWwsb31yZXR1cm4gJHIobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKGksbyl7cmV0dXJuITF9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe3JldHVybiEwfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMua2V5LHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgdGhpcy5rZXk9PSJzdHJpbmciP3t0eXBlOiJ1bmlvbiIsa2V5OnRoaXMua2V5LGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fTp7dHlwZToidW5pb24iLGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHlOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLm9wdGlvbnM9cixpLm9wdD1vLGl9cmV0dXJuICRyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3JldHVybiExfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4hMH19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLm9wdGlvbnMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJyaWNodGV4dCIsb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHhOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLml0ZW09cixpLm9wdD1vLGl9cmV0dXJuICRyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6RWUobykhPT0ib2JqZWN0Ij9VZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQoRWUobyksIiciKX1dKTpBcnJheS5pc0FycmF5KG8pP1VlKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PUppKGEsMiksYz11WzBdLGQ9dVsxXSxmPW1yKGksYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBrZXkgIikuY29uY2F0KGQpLG8pO2Vsc2V7dmFyIGg9bC5pdGVtLnZhbGlkYXRlKGYsZCk7aCYmcz9zPXNzKHNzKHt9LGgpLHMpOmgmJihzPWgpfX0pLHMpfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtpZih0aGlzLm9wdCYmaT09bnVsbClyZXR1cm4hMDtpZighaSlyZXR1cm4hMTtmb3IodmFyIG89MCxsPU9iamVjdC5lbnRyaWVzKGkpO288bC5sZW5ndGg7bysrKXt2YXIgcz1KaShsW29dLDIpLGE9c1sxXTtpZighdGhpcy5pdGVtLmFzc2VydChhKSlyZXR1cm4hMX1yZXR1cm4gRWUoaSk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmVjb3JkIixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShpbCk7ZnVuY3Rpb24gX04odCl7dmFyIGU9dFtPdF07aWYoZSBpbnN0YW5jZW9mIFltKXRocm93IEVycm9yKCJDYW5ub3QgZ2V0IHJhdyBzb3VyY2Ugb2YgYW4gRXhwciIpO3ZhciBuPWU7cmV0dXJuIG59ZnVuY3Rpb24gd04odCl7cmV0dXJuIHQuaW5kZXhPZigiLiIpPT09LTE/W3QsIiJdOlt0LnNsaWNlKDAsdC5pbmRleE9mKCIuIikpLHQuc2xpY2UodC5pbmRleE9mKCIuIikrMSldfWZ1bmN0aW9uIFNOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZ058fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJvYmplY3QifWZ1bmN0aW9uIEVOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgeE58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJyZWNvcmQifWZ1bmN0aW9uIENOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbU58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJhcnJheSJ9ZnVuY3Rpb24ga04odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2Tnx8RWUodCk9PT0ib2JqZWN0IiYmInR5cGUiaW4gdCYmdC50eXBlPT09InVuaW9uIn1mdW5jdGlvbiBiTih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHlOfHxFZSh0KT09PSJvYmplY3QiJiYidHlwZSJpbiB0JiZ0LnR5cGU9PT0icmljaHRleHQifWZ1bmN0aW9uICROKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZE58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJpbWFnZSJ9ZnVuY3Rpb24gVE4odCxlLG4pe2Zvcih2YXIgcj1OTih0KSxpPW5OKHIpLG89bixsPWUscz1mdW5jdGlvbigpe3ZhciBjPXIuc2hpZnQoKTtpZihjPT09dm9pZCAwKXRocm93IEVycm9yKCJVbmV4cGVjdGVkIHVuZGVmaW5lZCBwYXJ0Iik7aWYoQ04obykpe2lmKE51bWJlci5pc05hTihOdW1iZXIoYykpKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IGFycmF5IHNjaGVtYSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShvKSwiIG11c3QgaGF2ZSBhIG51bWJlciBhcyBwYXRoLCBidXQgZ290ICIpLmNvbmNhdChjLCIuIFBhdGg6ICIpLmNvbmNhdCh0KSk7aWYoRWUobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBhcnJheSwgYnV0IGdvdCAiLmNvbmNhdChFZShsKSkpO2lmKCFsW2NdKXt2YXIgZDt0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzb3VyY2UgKGxlbmd0aDogIi5jb25jYXQoKGQ9bCk9PT1udWxsfHxkPT09dm9pZCAwP3ZvaWQgMDpkLmxlbmd0aCwiKSBkaWQgbm90IGhhdmUgaW5kZXggIikuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdCh0KSl9bD1sW2NdLG89by5pdGVtfWVsc2UgaWYoRU4obykpe2lmKHR5cGVvZiBjIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc2NoZW1hICIuY29uY2F0KG8sIiBtdXN0IGhhdmUgcGF0aDogIikuY29uY2F0KGMsIiBhcyBzdHJpbmciKSk7aWYoRWUobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiByZWNvcmQsIGJ1dCBnb3QgIi5jb25jYXQoRWUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KHQpKTtsPWxbY10sbz1vLml0ZW19ZWxzZSBpZihTTihvKSl7aWYoRWUobCkhPT0ib2JqZWN0Iil0aHJvdyBFcnJvcigiU2NoZW1hIHR5cGUgZXJyb3I6IGV4cGVjdGVkIHNvdXJjZSB0byBiZSB0eXBlIG9mIG9iamVjdCwgYnV0IGdvdCAiLmNvbmNhdChFZShsKSkpO2lmKCFsW2NdKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IG9iamVjdCBzb3VyY2UgZGlkIG5vdCBoYXZlIGtleSAiLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQodCkpO2w9bFtjXSxvPW8uaXRlbXNbY119ZWxzZXtpZigkTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O2lmKGtOKG8pKXt2YXIgZj1vLmtleTtpZighZilyZXR1cm57djp7cGF0aDppLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcihnKSk/SlNPTi5zdHJpbmdpZnkoZyk6Z30pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3ZhciBoPWxbZl07aWYoIWgpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogdW5pb24gc291cmNlICIuY29uY2F0KG8sIiBkaWQgbm90IGhhdmUgcmVxdWlyZWQga2V5ICIpLmNvbmNhdChmLCIgaW4gcGF0aDogIikuY29uY2F0KHQpKTt2YXIgbT1vLml0ZW1zLmZpbmQoZnVuY3Rpb24oZyl7dmFyIHc7cmV0dXJuKGc9PW51bGx8fCh3PWcuaXRlbXMpPT09bnVsbHx8dz09PXZvaWQgMHx8KHc9d1tmXSk9PT1udWxsfHx3PT09dm9pZCAwP3ZvaWQgMDp3LnZhbHVlKT09PWh9KTtpZighbSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQobywiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQodCkpO289bS5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihiTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkobykpKX19fSxhO3IubGVuZ3RoPjA7KWlmKGE9cygpLGEpcmV0dXJuIGEudjtpZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDppLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19ZnVuY3Rpb24gTk4odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOyl7dmFyIHI9IiI7aWYodFtuXT09PSciJyl7Zm9yKG4rKztuPHQubGVuZ3RoJiZ0W25dIT09JyInOyl0W25dPT09IlxcIiYmdFtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz10W25dLG4rKztpZih0W25dIT09JyInKXt2YXIgaTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKGk9dFtuXSkhPT1udWxsJiZpIT09dm9pZCAwP2k6ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KHQubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjx0Lmxlbmd0aCYmdFtuXSE9PSIuIjspcis9dFtuXSxuKys7ciE9PSIiJiZlLnB1c2gociksbisrfXJldHVybiBlfWZ1bmN0aW9uIFJOKHQpe3JldHVybiBadyhBTih0KSl9ZnVuY3Rpb24gT04odCl7cmV0dXJuIHFpKHQpP0VlKHRbT3RdKT09PSJvYmplY3QiJiZ0W090XSE9PW51bGwmJkFycmF5LmlzQXJyYXkodFtPdF0pOkFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gUE4odCl7cmV0dXJuIHFpKHQpP0VlKHRbT3RdKT09PSJvYmplY3QiJiZ0W090XSE9PW51bGwmJiFBcnJheS5pc0FycmF5KHRbT3RdKTpFZSh0KT09PSJvYmplY3QifWZ1bmN0aW9uIEFOKHQpe3ZhciBlPU10KHQpO2Z1bmN0aW9uIG4ocil7dmFyIGk9T04ociksbz1QTihyKTtpZihpKXt2YXIgbD1PdCBpbiByP3JbT3RdOnIscz1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmwubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG4ocWkoYyk/YzpNdChjLG1yKHMsZCkpKX0pLHZhbFBhdGg6c319ZWxzZSBpZihvKXt2YXIgYT1PdCBpbiByP3JbT3RdOnIsdT1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmEhPT1udWxsJiZPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYSkubWFwKGZ1bmN0aW9uKGMpe3ZhciBkPUppKGMsMiksZj1kWzBdLGg9ZFsxXTtyZXR1cm5bZixuKHFpKGgpP2g6TXQoaCxtcih1LGYpKSldfSkpLHZhbFBhdGg6dX19ZWxzZSByZXR1cm4gcWkocik/e3ZhbDpuKHJbT3RdKSx2YWxQYXRoOnJbcG5dfTpyfXJldHVybiBuKGUpfWZ1bmN0aW9uIEhwKHQpe3ZhciBlPUt3KHQpP3QudmFsOnQ7c3dpdGNoKEVlKGUpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KEVlKGUpKSk7Y2FzZSJvYmplY3QiOnJldHVybiBlPT09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoSHApOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhlKS5tYXAoZnVuY3Rpb24obil7dmFyIHI9SmkobiwyKSxpPXJbMF0sbz1yWzFdO3JldHVybltpLG8mJkhwKG8pXX0pKTtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBadyh0KXt2YXIgZT10LnZhbDtzd2l0Y2goRWUoZSkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQoRWUoZSkpKTtjYXNlIm9iamVjdCI6aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm94eShlLHtoYXM6ZnVuY3Rpb24ocixpKXtyZXR1cm4gaT09PSJ2YWwifHxpPT09cG4/ITA6RTAocixpKX0sZ2V0OmZ1bmN0aW9uKHIsaSl7aWYoaT09PXBuKXJldHVybiB0LnZhbFBhdGg7aWYoaT09PSJ2YWwiKXJldHVybiBIcCh0KTtpZihBcnJheS5pc0FycmF5KHIpJiZpPT09Imxlbmd0aCIpcmV0dXJuIHIubGVuZ3RoO2lmKEUwKGUsaSkpe3ZhciBvLGw7cmV0dXJuIFp3KHt2YWw6UmVmbGVjdC5nZXQocixpKS52YWwsdmFsUGF0aDoobz0obD1SZWZsZWN0LmdldChyLGkpKT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwudmFsUGF0aCkhPT1udWxsJiZvIT09dm9pZCAwP286bXIodC52YWxQYXRoLEFycmF5LmlzQXJyYXkocik/TnVtYmVyKGkpOmkpfSl9cmV0dXJuIFJlZmxlY3QuZ2V0KHIsaSl9fSk7ZGVmYXVsdDpyZXR1cm4gVWUoVWUoe30scG4sdC52YWxQYXRoKSwidmFsIix0LnZhbCl9fWZ1bmN0aW9uIEUwKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXZhciBNTj1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLC0xMjQ1NjQzODI1LC0zNzM5NTc3MjMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsLTE4NDEzMzE1NDgsLTE0MjQyMDQwNzUsLTY3MDU4NjIxNiwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwtMjEzMjg4OTA5MCwtMTY4MDA3OTE5MywtMTA0Njc0NDcxNiwtNDU5NTc2ODk1LC0yNzI3NDI1MjIsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsLTE3NDA3NDY0MTQsLTE0NzMxMzI5NDcsLTEzNDE5NzA0ODgsLTEwODQ2NTM2MjUsLTk1ODM5NTQwNSwtNzEwNDM4NTg1LDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLC0yMTE3OTQwOTQ2LC0xODM4MDExMjU5LC0xNTY0NDgxMzc1LC0xNDc0NjY0ODg1LC0xMDM1MjM2NDk2LC05NDkyMDI1MjUsLTc3ODkwMTQ3OSwtNjk0NjE0NDkyLC0yMDAzOTUzODcsMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LC0yMDY3MjM2ODQ0LC0xOTMzMTE0ODcyLC0xODY2NTMwODIyLC0xNTM4MjMzMTA5LC0xMDkwOTM1ODE3LC05NjU2NDE5OThdLFZlPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuaW5wdXRCeXRlcz02NF09ImlucHV0Qnl0ZXMiLHRbdC5pbnB1dFdvcmRzPTE2XT0iaW5wdXRXb3JkcyIsdFt0LmhpZ2hJbmRleD0xNF09ImhpZ2hJbmRleCIsdFt0Lmxvd0luZGV4PTE1XT0ibG93SW5kZXgiLHRbdC53b3JrV29yZHM9NjRdPSJ3b3JrV29yZHMiLHRbdC5hbGxvY0J5dGVzPTgwXT0iYWxsb2NCeXRlcyIsdFt0LmFsbG9jV29yZHM9MjBdPSJhbGxvY1dvcmRzIix0W3QuYWxsb2NUb3RhbD04ZTNdPSJhbGxvY1RvdGFsIix0fShWZXx8e30pLEMwPXtzaGEyNTY6MX07ZnVuY3Rpb24gTE4odCl7aWYodCYmIUMwW3RdJiYhQzBbdC50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBtZXRob2Qgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgSU59dmFyIElOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2JyKHRoaXMsdCksVWUodGhpcywiQSIsMTc3OTAzMzcwMyksVWUodGhpcywiQiIsLTExNTA4MzMwMTkpLFVlKHRoaXMsIkMiLDEwMTM5MDQyNDIpLFVlKHRoaXMsIkQiLC0xNTIxNDg2NTM0KSxVZSh0aGlzLCJFIiwxMzU5ODkzMTE5KSxVZSh0aGlzLCJGIiwtMTY5NDE0NDM3MiksVWUodGhpcywiRyIsNTI4NzM0NjM1KSxVZSh0aGlzLCJIIiwxNTQxNDU5MjI1KSxVZSh0aGlzLCJfc2l6ZSIsMCksVWUodGhpcywiX3NwIiwwKSwoIWZjfHxHcz49VmUuYWxsb2NUb3RhbCkmJihmYz1uZXcgQXJyYXlCdWZmZXIoVmUuYWxsb2NUb3RhbCksR3M9MCksdGhpcy5fYnl0ZT1uZXcgVWludDhBcnJheShmYyxHcyxWZS5hbGxvY0J5dGVzKSx0aGlzLl93b3JkPW5ldyBJbnQzMkFycmF5KGZjLEdzLFZlLmFsbG9jV29yZHMpLEdzKz1WZS5hbGxvY0J5dGVzfXJldHVybiAkcih0LFt7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5fdXRmOChuKTtpZihuPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdHlwZTogIitFZShuKSk7dmFyIHI9bi5ieXRlT2Zmc2V0LGk9bi5ieXRlTGVuZ3RoLG89aS9WZS5pbnB1dEJ5dGVzfDAsbD0wO2lmKG8mJiEociYzKSYmISh0aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMpKXtmb3IodmFyIHM9bmV3IEludDMyQXJyYXkobi5idWZmZXIscixvKlZlLmlucHV0V29yZHMpO28tLTspdGhpcy5faW50MzIocyxsPj4yKSxsKz1WZS5pbnB1dEJ5dGVzO3RoaXMuX3NpemUrPWx9dmFyIGE9bi5CWVRFU19QRVJfRUxFTUVOVDtpZihhIT09MSYmbi5idWZmZXIpe3ZhciB1PW5ldyBVaW50OEFycmF5KG4uYnVmZmVyLHIrbCxpLWwpO3JldHVybiB0aGlzLl91aW50OCh1KX1yZXR1cm4gbD09PWk/dGhpczp0aGlzLl91aW50OChuLGwpfX0se2tleToiX3VpbnQ4Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBpPXRoaXMuX2J5dGUsbz10aGlzLl93b3JkLGw9bi5sZW5ndGg7Zm9yKHI9cnwwO3I8bDspe2Zvcih2YXIgcz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMsYT1zO3I8bCYmYTxWZS5pbnB1dEJ5dGVzOylpW2ErK109bltyKytdO2E+PVZlLmlucHV0Qnl0ZXMmJnRoaXMuX2ludDMyKG8pLHRoaXMuX3NpemUrPWEtc31yZXR1cm4gdGhpc319LHtrZXk6Il91dGY4Iix2YWx1ZTpmdW5jdGlvbihuKXtmb3IodmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz1uLmxlbmd0aCxsPXRoaXMuX3NwLHM9MDtzPG87KXtmb3IodmFyIGE9dGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzLHU9YTtzPG8mJnU8VmUuaW5wdXRCeXRlczspe3ZhciBjPW4uY2hhckNvZGVBdChzKyspfDA7YzwxMjg/clt1KytdPWM6YzwyMDQ4PyhyW3UrK109MTkyfGM+Pj42LHJbdSsrXT0xMjh8YyY2Myk6Yzw1NTI5Nnx8Yz41NzM0Mz8oclt1KytdPTIyNHxjPj4+MTIsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMpOmw/KGM9KChsJjEwMjMpPDwxMCkrKGMmMTAyMykrNjU1MzYsclt1KytdPTI0MHxjPj4+MTgsclt1KytdPTEyOHxjPj4+MTImNjMsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMsbD0wKTpsPWN9dT49VmUuaW5wdXRCeXRlcyYmKHRoaXMuX2ludDMyKGkpLGlbMF09aVtWZS5pbnB1dFdvcmRzXSksdGhpcy5fc2l6ZSs9dS1hfXJldHVybiB0aGlzLl9zcD1sLHRoaXN9fSx7a2V5OiJfaW50MzIiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGk9dGhpcy5BLG89dGhpcy5CLGw9dGhpcy5DLHM9dGhpcy5ELGE9dGhpcy5FLHU9dGhpcy5GLGM9dGhpcy5HLGQ9dGhpcy5ILGY9MDtmb3Iocj1yfDA7ZjxWZS5pbnB1dFdvcmRzOylTb1tmKytdPXVyKG5bcisrXSk7Zm9yKGY9VmUuaW5wdXRXb3JkcztmPFZlLndvcmtXb3JkcztmKyspU29bZl09Vk4oU29bZi0yXSkrU29bZi03XStXTihTb1tmLTE1XSkrU29bZi0xNl18MDtmb3IoZj0wO2Y8VmUud29ya1dvcmRzO2YrKyl7dmFyIGg9ZCtVTihhKSt6TihhLHUsYykrTU5bZl0rU29bZl18MCxtPUJOKGkpK0ZOKGksbyxsKXwwO2Q9YyxjPXUsdT1hLGE9cytofDAscz1sLGw9byxvPWksaT1oK218MH10aGlzLkE9aSt0aGlzLkF8MCx0aGlzLkI9byt0aGlzLkJ8MCx0aGlzLkM9bCt0aGlzLkN8MCx0aGlzLkQ9cyt0aGlzLkR8MCx0aGlzLkU9YSt0aGlzLkV8MCx0aGlzLkY9dSt0aGlzLkZ8MCx0aGlzLkc9Yyt0aGlzLkd8MCx0aGlzLkg9ZCt0aGlzLkh8MH19LHtrZXk6ImRpZ2VzdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXN8MDtmb3IocltvKytdPTEyODtvJjM7KXJbbysrXT0wO2lmKG8+Pj0yLG8+VmUuaGlnaEluZGV4KXtmb3IoO288VmUuaW5wdXRXb3JkczspaVtvKytdPTA7bz0wLHRoaXMuX2ludDMyKGkpfWZvcig7bzxWZS5pbnB1dFdvcmRzOylpW28rK109MDt2YXIgbD10aGlzLl9zaXplKjgscz0obCY0Mjk0OTY3Mjk1KT4+PjAsYT0obC1zKS80Mjk0OTY3Mjk2O3JldHVybiBhJiYoaVtWZS5oaWdoSW5kZXhdPXVyKGEpKSxzJiYoaVtWZS5sb3dJbmRleF09dXIocykpLHRoaXMuX2ludDMyKGkpLG49PT0iaGV4Ij90aGlzLl9oZXgoKTp0aGlzLl9iaW4oKX19LHtrZXk6Il9oZXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5IO3JldHVybiAkaShuKSskaShyKSskaShpKSskaShvKSskaShsKSskaShzKSskaShhKSskaSh1KX19LHtrZXk6Il9iaW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5ILGM9dGhpcy5fYnl0ZSxkPXRoaXMuX3dvcmQ7cmV0dXJuIGRbMF09dXIobiksZFsxXT11cihyKSxkWzJdPXVyKGkpLGRbM109dXIobyksZFs0XT11cihsKSxkWzVdPXVyKHMpLGRbNl09dXIoYSksZFs3XT11cih1KSxjLnNsaWNlKDAsMzIpfX1dKSx0fSgpLFNvPW5ldyBJbnQzMkFycmF5KFZlLndvcmtXb3JkcyksZmMsR3M9MCwkaT1mdW5jdGlvbihlKXtyZXR1cm4oZSs0Mjk0OTY3Mjk2KS50b1N0cmluZygxNikuc3Vic3RyKC04KX0sRE49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8PDI0JjQyNzgxOTAwODB8ZTw8OCYxNjcxMTY4MHxlPj44JjY1MjgwfGU+PjI0JjI1NX0sak49ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHVyPUhOKCk/ak46RE4sek49ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByXmUmKG5ecil9LEZOPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gZSZufHImKGV8bil9LEJOPWZ1bmN0aW9uKGUpe3JldHVybihlPj4+MnxlPDwzMCleKGU+Pj4xM3xlPDwxOSleKGU+Pj4yMnxlPDwxMCl9LFVOPWZ1bmN0aW9uKGUpe3JldHVybihlPj4+NnxlPDwyNileKGU+Pj4xMXxlPDwyMSleKGU+Pj4yNXxlPDw3KX0sV049ZnVuY3Rpb24oZSl7cmV0dXJuKGU+Pj43fGU8PDI1KV4oZT4+PjE4fGU8PDE0KV5lPj4+M30sVk49ZnVuY3Rpb24oZSl7cmV0dXJuKGU+Pj4xN3xlPDwxNSleKGU+Pj4xOXxlPDwxMyleZT4+PjEwfTtmdW5jdGlvbiBITigpe3ZhciB0PW5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbNjUyNzldKS5idWZmZXIpO3JldHVybiB0WzBdPT09MjU0fXZhciBLTj1mdW5jdGlvbihlKXtyZXR1cm4gTE4oKS51cGRhdGUoZSkuZGlnZXN0KCJoZXgiKX07ZnVuY3Rpb24gcWEoKXtxYT1mdW5jdGlvbigpe3JldHVybiBlfTt2YXIgdCxlPXt9LG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksaT1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKEMsayxFKXtDW2tdPUUudmFsdWV9LG89dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIj9TeW1ib2w6e30sbD1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIscz1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGE9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoQyxrLEUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoQyxrLHt2YWx1ZTpFLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksQ1trXX10cnl7dSh7fSwiIil9Y2F0Y2h7dT1mdW5jdGlvbihrLEUsQSl7cmV0dXJuIGtbRV09QX19ZnVuY3Rpb24gYyhDLGssRSxBKXt2YXIgTj1rJiZrLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/azp2LEY9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSksSz1uZXcgSChBfHxbXSk7cmV0dXJuIGkoRiwiX2ludm9rZSIse3ZhbHVlOlAoQyxFLEspfSksRn1mdW5jdGlvbiBkKEMsayxFKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOkMuY2FsbChrLEUpfX1jYXRjaChBKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpBfX19ZS53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsbT0iZXhlY3V0aW5nIixnPSJjb21wbGV0ZWQiLHc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoKXt9dmFyIFM9e307dShTLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZixUPWImJmIoYihaKFtdKSkpO1QmJlQhPT1uJiZyLmNhbGwoVCxsKSYmKFM9VCk7dmFyICQ9eC5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTKTtmdW5jdGlvbiBPKEMpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihrKXt1KEMsayxmdW5jdGlvbihFKXtyZXR1cm4gdGhpcy5faW52b2tlKGssRSl9KX0pfWZ1bmN0aW9uIEwoQyxrKXtmdW5jdGlvbiBFKE4sRixLLGRlKXt2YXIgc2U9ZChDW05dLEMsRik7aWYoc2UudHlwZSE9PSJ0aHJvdyIpe3ZhciBBZT1zZS5hcmcsTmU9QWUudmFsdWU7cmV0dXJuIE5lJiZ0eXBlb2YgTmU9PSJvYmplY3QiJiZyLmNhbGwoTmUsIl9fYXdhaXQiKT9rLnJlc29sdmUoTmUuX19hd2FpdCkudGhlbihmdW5jdGlvbihRKXtFKCJuZXh0IixRLEssZGUpfSxmdW5jdGlvbihRKXtFKCJ0aHJvdyIsUSxLLGRlKX0pOmsucmVzb2x2ZShOZSkudGhlbihmdW5jdGlvbihRKXtBZS52YWx1ZT1RLEsoQWUpfSxmdW5jdGlvbihRKXtyZXR1cm4gRSgidGhyb3ciLFEsSyxkZSl9KX1kZShzZS5hcmcpfXZhciBBO2kodGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKE4sRil7ZnVuY3Rpb24gSygpe3JldHVybiBuZXcgayhmdW5jdGlvbihkZSxzZSl7RShOLEYsZGUsc2UpfSl9cmV0dXJuIEE9QT9BLnRoZW4oSyxLKTpLKCl9fSl9ZnVuY3Rpb24gUChDLGssRSl7dmFyIEE9ZjtyZXR1cm4gZnVuY3Rpb24oTixGKXtpZihBPT09bSl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihBPT09Zyl7aWYoTj09PSJ0aHJvdyIpdGhyb3cgRjtyZXR1cm57dmFsdWU6dCxkb25lOiEwfX1mb3IoRS5tZXRob2Q9TixFLmFyZz1GOzspe3ZhciBLPUUuZGVsZWdhdGU7aWYoSyl7dmFyIGRlPUQoSyxFKTtpZihkZSl7aWYoZGU9PT13KWNvbnRpbnVlO3JldHVybiBkZX19aWYoRS5tZXRob2Q9PT0ibmV4dCIpRS5zZW50PUUuX3NlbnQ9RS5hcmc7ZWxzZSBpZihFLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEE9PT1mKXRocm93IEE9ZyxFLmFyZztFLmRpc3BhdGNoRXhjZXB0aW9uKEUuYXJnKX1lbHNlIEUubWV0aG9kPT09InJldHVybiImJkUuYWJydXB0KCJyZXR1cm4iLEUuYXJnKTtBPW07dmFyIHNlPWQoQyxrLEUpO2lmKHNlLnR5cGU9PT0ibm9ybWFsIil7aWYoQT1FLmRvbmU/ZzpoLHNlLmFyZz09PXcpY29udGludWU7cmV0dXJue3ZhbHVlOnNlLmFyZyxkb25lOkUuZG9uZX19c2UudHlwZT09PSJ0aHJvdyImJihBPWcsRS5tZXRob2Q9InRocm93IixFLmFyZz1zZS5hcmcpfX19ZnVuY3Rpb24gRChDLGspe3ZhciBFPWsubWV0aG9kLEE9Qy5pdGVyYXRvcltFXTtpZihBPT09dClyZXR1cm4gay5kZWxlZ2F0ZT1udWxsLEU9PT0idGhyb3ciJiZDLml0ZXJhdG9yLnJldHVybiYmKGsubWV0aG9kPSJyZXR1cm4iLGsuYXJnPXQsRChDLGspLGsubWV0aG9kPT09InRocm93Iil8fEUhPT0icmV0dXJuIiYmKGsubWV0aG9kPSJ0aHJvdyIsay5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitFKyInIG1ldGhvZCIpKSx3O3ZhciBOPWQoQSxDLml0ZXJhdG9yLGsuYXJnKTtpZihOLnR5cGU9PT0idGhyb3ciKXJldHVybiBrLm1ldGhvZD0idGhyb3ciLGsuYXJnPU4uYXJnLGsuZGVsZWdhdGU9bnVsbCx3O3ZhciBGPU4uYXJnO3JldHVybiBGP0YuZG9uZT8oa1tDLnJlc3VsdE5hbWVdPUYudmFsdWUsay5uZXh0PUMubmV4dExvYyxrLm1ldGhvZCE9PSJyZXR1cm4iJiYoay5tZXRob2Q9Im5leHQiLGsuYXJnPXQpLGsuZGVsZWdhdGU9bnVsbCx3KTpGOihrLm1ldGhvZD0idGhyb3ciLGsuYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksay5kZWxlZ2F0ZT1udWxsLHcpfWZ1bmN0aW9uIEIoQyl7dmFyIGs9e3RyeUxvYzpDWzBdfTsxIGluIEMmJihrLmNhdGNoTG9jPUNbMV0pLDIgaW4gQyYmKGsuZmluYWxseUxvYz1DWzJdLGsuYWZ0ZXJMb2M9Q1szXSksdGhpcy50cnlFbnRyaWVzLnB1c2goayl9ZnVuY3Rpb24gb2UoQyl7dmFyIGs9Qy5jb21wbGV0aW9ufHx7fTtrLnR5cGU9Im5vcm1hbCIsZGVsZXRlIGsuYXJnLEMuY29tcGxldGlvbj1rfWZ1bmN0aW9uIEgoQyl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLEMuZm9yRWFjaChCLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFooQyl7aWYoQ3x8Qz09PSIiKXt2YXIgaz1DW2xdO2lmKGspcmV0dXJuIGsuY2FsbChDKTtpZih0eXBlb2YgQy5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBDO2lmKCFpc05hTihDLmxlbmd0aCkpe3ZhciBFPS0xLEE9ZnVuY3Rpb24gTigpe2Zvcig7KytFPEMubGVuZ3RoOylpZihyLmNhbGwoQyxFKSlyZXR1cm4gTi52YWx1ZT1DW0VdLE4uZG9uZT0hMSxOO3JldHVybiBOLnZhbHVlPXQsTi5kb25lPSEwLE59O3JldHVybiBBLm5leHQ9QX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgQysiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT14LGkoJCwiY29uc3RydWN0b3IiLHt2YWx1ZTp4LGNvbmZpZ3VyYWJsZTohMH0pLGkoeCwiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dSh4LGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksZS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKEMpe3ZhciBrPXR5cGVvZiBDPT0iZnVuY3Rpb24iJiZDLmNvbnN0cnVjdG9yO3JldHVybiEhayYmKGs9PT15fHwoay5kaXNwbGF5TmFtZXx8ay5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSxlLm1hcms9ZnVuY3Rpb24oQyl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoQyx4KTooQy5fX3Byb3RvX189eCx1KEMsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksQy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSgkKSxDfSxlLmF3cmFwPWZ1bmN0aW9uKEMpe3JldHVybntfX2F3YWl0OkN9fSxPKEwucHJvdG90eXBlKSx1KEwucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGUuQXN5bmNJdGVyYXRvcj1MLGUuYXN5bmM9ZnVuY3Rpb24oQyxrLEUsQSxOKXtOPT09dm9pZCAwJiYoTj1Qcm9taXNlKTt2YXIgRj1uZXcgTChjKEMsayxFLEEpLE4pO3JldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24oayk/RjpGLm5leHQoKS50aGVuKGZ1bmN0aW9uKEspe3JldHVybiBLLmRvbmU/Sy52YWx1ZTpGLm5leHQoKX0pfSxPKCQpLHUoJCxhLCJHZW5lcmF0b3IiKSx1KCQsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdSgkLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLGUua2V5cz1mdW5jdGlvbihDKXt2YXIgaz1PYmplY3QoQyksRT1bXTtmb3IodmFyIEEgaW4gaylFLnB1c2goQSk7cmV0dXJuIEUucmV2ZXJzZSgpLGZ1bmN0aW9uIE4oKXtmb3IoO0UubGVuZ3RoOyl7dmFyIEY9RS5wb3AoKTtpZihGIGluIGspcmV0dXJuIE4udmFsdWU9RixOLmRvbmU9ITEsTn1yZXR1cm4gTi5kb25lPSEwLE59fSxlLnZhbHVlcz1aLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKEMpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PXQsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9dCx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChvZSksIUMpZm9yKHZhciBrIGluIHRoaXMpay5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLGspJiYhaXNOYU4oK2suc2xpY2UoMSkpJiYodGhpc1trXT10KX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgQz10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihDLnR5cGU9PT0idGhyb3ciKXRocm93IEMuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKEMpe2lmKHRoaXMuZG9uZSl0aHJvdyBDO3ZhciBrPXRoaXM7ZnVuY3Rpb24gRShzZSxBZSl7cmV0dXJuIEYudHlwZT0idGhyb3ciLEYuYXJnPUMsay5uZXh0PXNlLEFlJiYoay5tZXRob2Q9Im5leHQiLGsuYXJnPXQpLCEhQWV9Zm9yKHZhciBBPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtBPj0wOy0tQSl7dmFyIE49dGhpcy50cnlFbnRyaWVzW0FdLEY9Ti5jb21wbGV0aW9uO2lmKE4udHJ5TG9jPT09InJvb3QiKXJldHVybiBFKCJlbmQiKTtpZihOLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgSz1yLmNhbGwoTiwiY2F0Y2hMb2MiKSxkZT1yLmNhbGwoTiwiZmluYWxseUxvYyIpO2lmKEsmJmRlKXtpZih0aGlzLnByZXY8Ti5jYXRjaExvYylyZXR1cm4gRShOLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8Ti5maW5hbGx5TG9jKXJldHVybiBFKE4uZmluYWxseUxvYyl9ZWxzZSBpZihLKXtpZih0aGlzLnByZXY8Ti5jYXRjaExvYylyZXR1cm4gRShOLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFkZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PE4uZmluYWxseUxvYylyZXR1cm4gRShOLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oQyxrKXtmb3IodmFyIEU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO0U+PTA7LS1FKXt2YXIgQT10aGlzLnRyeUVudHJpZXNbRV07aWYoQS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEEsImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEEuZmluYWxseUxvYyl7dmFyIE49QTticmVha319TiYmKEM9PT0iYnJlYWsifHxDPT09ImNvbnRpbnVlIikmJk4udHJ5TG9jPD1rJiZrPD1OLmZpbmFsbHlMb2MmJihOPW51bGwpO3ZhciBGPU4/Ti5jb21wbGV0aW9uOnt9O3JldHVybiBGLnR5cGU9QyxGLmFyZz1rLE4/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9Ti5maW5hbGx5TG9jLHcpOnRoaXMuY29tcGxldGUoRil9LGNvbXBsZXRlOmZ1bmN0aW9uKEMsayl7aWYoQy50eXBlPT09InRocm93Iil0aHJvdyBDLmFyZztyZXR1cm4gQy50eXBlPT09ImJyZWFrInx8Qy50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9Qy5hcmc6Qy50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1DLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOkMudHlwZT09PSJub3JtYWwiJiZrJiYodGhpcy5uZXh0PWspLHd9LGZpbmlzaDpmdW5jdGlvbihDKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgRT10aGlzLnRyeUVudHJpZXNba107aWYoRS5maW5hbGx5TG9jPT09QylyZXR1cm4gdGhpcy5jb21wbGV0ZShFLmNvbXBsZXRpb24sRS5hZnRlckxvYyksb2UoRSksd319LGNhdGNoOmZ1bmN0aW9uKEMpe2Zvcih2YXIgaz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7az49MDstLWspe3ZhciBFPXRoaXMudHJ5RW50cmllc1trXTtpZihFLnRyeUxvYz09PUMpe3ZhciBBPUUuY29tcGxldGlvbjtpZihBLnR5cGU9PT0idGhyb3ciKXt2YXIgTj1BLmFyZztvZShFKX1yZXR1cm4gTn19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihDLGssRSl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlooQykscmVzdWx0TmFtZTprLG5leHRMb2M6RX0sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz10KSx3fX0sZX1mdW5jdGlvbiBrMCh0LGUsbixyLGksbyxsKXt0cnl7dmFyIHM9dFtvXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP2UoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixpKX1mdW5jdGlvbiBHdyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe3ZhciBvPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBsKGEpe2swKG8scixpLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtrMChvLHIsaSxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19dmFyIFpOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXticih0aGlzLHQpLHRoaXMuaG9zdD1lfXJldHVybiAkcih0LFt7a2V5OiJnZXREaXNhYmxlVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZGlzYWJsZT9yZWRpcmVjdF90bz0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG4pKX19LHtrZXk6ImdldExvZ2luVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvYXV0aG9yaXplP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0RW5hYmxlVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZW5hYmxlP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0UGF0Y2hlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1HdyhxYSgpLm1hcmsoZnVuY3Rpb24gcihpKXt2YXIgbyxsLHM7cmV0dXJuIHFhKCkud3JhcChmdW5jdGlvbih1KXtmb3IoOzspc3dpdGNoKHUucHJldj11Lm5leHQpe2Nhc2UgMDpyZXR1cm4gbz1pLnBhdGNoSWRzLGw9aS5oZWFkZXJzLHM9bz8iPyIuY29uY2F0KG8ubWFwKGZ1bmN0aW9uKGMpe3JldHVybiIiLmNvbmNhdChjLCI9IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChjKSl9KS5qb2luKCImIikpOiIiLHUuYWJydXB0KCJyZXR1cm4iLGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKS5jb25jYXQocykse2hlYWRlcnM6bHx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19KS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBYcyhjKX0pLmNhdGNoKFlzKSk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gdS5zdG9wKCl9fSxyLHRoaXMpfSkpO2Z1bmN0aW9uIG4ocil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufSgpfSx7a2V5OiJnZXRFZGl0VXJsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9zdGF0aWMvZWRpdCIpfX0se2tleToicG9zdFBhdGNoZXMiLHZhbHVlOmZ1bmN0aW9uKG4scixpKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3BhdGNoZXMvfiIpLHtoZWFkZXJzOml8fHsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LG1ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShVZSh7fSxuLHIpKX0pLnRoZW4oZnVuY3Rpb24obyl7cmV0dXJuIFhzKG8pfSkuY2F0Y2goWXMpfX0se2tleToiZ2V0U2Vzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3Nlc3Npb24iKSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gWHMobikuY2F0Y2goWXMpfSl9fSx7a2V5OiJnZXRUcmVlIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1uLnBhdGNoLGk9cj09PXZvaWQgMD8hMTpyLG89bi5pbmNsdWRlU2NoZW1hLGw9bz09PXZvaWQgMD8hMTpvLHM9bi5pbmNsdWRlU291cmNlLGE9cz09PXZvaWQgMD8hMTpzLHU9bi50cmVlUGF0aCxjPXU9PT12b2lkIDA/Ii8iOnUsZD1uLmhlYWRlcnMsZj1uZXcgVVJMU2VhcmNoUGFyYW1zO3JldHVybiBmLnNldCgicGF0Y2giLGkudG9TdHJpbmcoKSksZi5zZXQoInNjaGVtYSIsbC50b1N0cmluZygpKSxmLnNldCgic291cmNlIixhLnRvU3RyaW5nKCkpLGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi90cmVlL34iKS5jb25jYXQoYywiPyIpLmNvbmNhdChmLnRvU3RyaW5nKCkpLHtoZWFkZXJzOmR9KS50aGVuKGZ1bmN0aW9uKGgpe3JldHVybiBYcyhoKX0pLmNhdGNoKFlzKX19LHtrZXk6InBvc3RDb21taXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2hlcyxpPW4uaGVhZGVycztyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL2NvbW1pdCIpLHttZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkoe3BhdGNoZXM6cn0pLGhlYWRlcnM6aXx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19KS50aGVuKGZ1bmN0aW9uKG8pe3JldHVybiBYcyhvKX0pLmNhdGNoKFlzKX19XSksdH0oKTtmdW5jdGlvbiBZcyh0KXtyZXR1cm4gQnIoe3N0YXR1c0NvZGU6NTAwLG1lc3NhZ2U6dCBpbnN0YW5jZW9mIEVycm9yP3QubWVzc2FnZToiVW5rbm93biBlcnJvciJ9KX1mdW5jdGlvbiBYcyh0KXtyZXR1cm4gS3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEtwKCl7cmV0dXJuIEtwPUd3KHFhKCkubWFyayhmdW5jdGlvbiB0KGUpe3ZhciBuO3JldHVybiBxYSgpLndyYXAoZnVuY3Rpb24oaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYoaS5wcmV2PTAsIWUub2spe2kubmV4dD05O2JyZWFrfXJldHVybiBpLnQwPUxvLGkubmV4dD01LGUuanNvbigpO2Nhc2UgNTpyZXR1cm4gaS50MT1pLnNlbnQsaS5hYnJ1cHQoInJldHVybiIsaS50MC5vay5jYWxsKGkudDAsaS50MSkpO2Nhc2UgOTpyZXR1cm4gaS5wcmV2PTksaS5uZXh0PTEyLGUuanNvbigpO2Nhc2UgMTI6cmV0dXJuIG49aS5zZW50LGkuYWJydXB0KCJyZXR1cm4iLEJyKHtzdGF0dXNDb2RlOmUuc3RhdHVzLG1lc3NhZ2U6bi5tZXNzYWdlfHxlLnN0YXR1c1RleHQsZGV0YWlsczpuLmRldGFpbHN8fE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuKS5maWx0ZXIoZnVuY3Rpb24obyl7dmFyIGw9SmkobywxKSxzPWxbMF07cmV0dXJuIHMhPT0ibWVzc2FnZSJ9KSl9KSk7Y2FzZSAxNjpyZXR1cm4gaS5wcmV2PTE2LGkudDI9aS5jYXRjaCg5KSxpLmFicnVwdCgicmV0dXJuIixCcih7c3RhdHVzQ29kZTplLnN0YXR1cyxtZXNzYWdlOmUuc3RhdHVzVGV4dH0pKTtjYXNlIDE5OmkubmV4dD0yNDticmVhaztjYXNlIDIxOnJldHVybiBpLnByZXY9MjEsaS50Mz1pLmNhdGNoKDApLGkuYWJydXB0KCJyZXR1cm4iLEJyKHttZXNzYWdlOmkudDMgaW5zdGFuY2VvZiBFcnJvcj9pLnQzLm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSkpO2Nhc2UgMjQ6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19LHQsbnVsbCxbWzAsMjFdLFs5LDE2XV0pfSkpLEtwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgam49e2NvbnZlcnRGaWxlU291cmNlOkh3LGdldFNjaGVtYTp1TixnZXRWYWxQYXRoOmhOLGdldFZhbDpSTixnZXRTb3VyY2U6X04scmVzb2x2ZVBhdGg6VE4sc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGg6d04saXNWYWw6Zk4sY3JlYXRlVmFsUGF0aE9mSXRlbTptcixnZXRTSEEyNTZIYXNoOktOLGNyZWF0ZVBhdGNoSlNPTlBhdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIi8iLmNvbmNhdChlLnNwbGl0KCIuIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuJiZHTihuKX0pLmpvaW4oIi8iKSl9LFZBTF9FTkFCTEVfQ09PS0lFX05BTUU6InZhbF9lbmFibGUiLFZBTF9TVEFURV9DT09LSUU6InZhbF9zdGF0ZSIsVkFMX1NFU1NJT05fQ09PS0lFOiJ2YWxfc2Vzc2lvbiJ9O2Z1bmN0aW9uIEdOKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaHtyZXR1cm4gdH19dmFyIFl3PXtleHBvcnRzOnt9fTsvKiEKCUNvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLgoJTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWUKCWh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXMKKi8oZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj1bXSxpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIG89YXJndW1lbnRzW2ldO2lmKG8pe3ZhciBsPXR5cGVvZiBvO2lmKGw9PT0ic3RyaW5nInx8bD09PSJudW1iZXIiKXIucHVzaChvKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobykpe2lmKG8ubGVuZ3RoKXt2YXIgcz1uLmFwcGx5KG51bGwsbyk7cyYmci5wdXNoKHMpfX1lbHNlIGlmKGw9PT0ib2JqZWN0Iil7aWYoby50b1N0cmluZyE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcmJiFvLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoIltuYXRpdmUgY29kZV0iKSl7ci5wdXNoKG8udG9TdHJpbmcoKSk7Y29udGludWV9Zm9yKHZhciBhIGluIG8pZS5jYWxsKG8sYSkmJm9bYV0mJnIucHVzaChhKX19fXJldHVybiByLmpvaW4oIiAiKX10LmV4cG9ydHM/KG4uZGVmYXVsdD1uLHQuZXhwb3J0cz1uKTp3aW5kb3cuY2xhc3NOYW1lcz1ufSkoKX0pKFl3KTt2YXIgWU49WXcuZXhwb3J0cztjb25zdCBfZj1UdShZTik7ZnVuY3Rpb24gaWUoKXtyZXR1cm4gaWU9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxpZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWE4odCxlKXt0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQhPW51bGwmJih0LmN1cnJlbnQ9ZSl9ZnVuY3Rpb24gWHcoLi4udCl7cmV0dXJuIGU9PnQuZm9yRWFjaChuPT5YTihuLGUpKX1mdW5jdGlvbiBzdCguLi50KXtyZXR1cm4gcC51c2VDYWxsYmFjayhYdyguLi50KSx0KX1jb25zdCBhcz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PXQsaT1wLkNoaWxkcmVuLnRvQXJyYXkobiksbz1pLmZpbmQoSk4pO2lmKG8pe2NvbnN0IGw9by5wcm9wcy5jaGlsZHJlbixzPWkubWFwKGE9PmE9PT1vP3AuQ2hpbGRyZW4uY291bnQobCk+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6cC5pc1ZhbGlkRWxlbWVudChsKT9sLnByb3BzLmNoaWxkcmVuOm51bGw6YSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChacCxpZSh7fSxyLHtyZWY6ZX0pLHAuaXNWYWxpZEVsZW1lbnQobCk/cC5jbG9uZUVsZW1lbnQobCx2b2lkIDAscyk6bnVsbCl9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChacCxpZSh7fSxyLHtyZWY6ZX0pLG4pfSk7YXMuZGlzcGxheU5hbWU9IlNsb3QiO2NvbnN0IFpwPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e2NoaWxkcmVuOm4sLi4ucn09dDtyZXR1cm4gcC5pc1ZhbGlkRWxlbWVudChuKT9wLmNsb25lRWxlbWVudChuLHsuLi5xTihyLG4ucHJvcHMpLHJlZjplP1h3KGUsbi5yZWYpOm4ucmVmfSk6cC5DaGlsZHJlbi5jb3VudChuKT4xP3AuQ2hpbGRyZW4ub25seShudWxsKTpudWxsfSk7WnAuZGlzcGxheU5hbWU9IlNsb3RDbG9uZSI7Y29uc3QgUU49KHtjaGlsZHJlbjp0fSk9PnAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsdCk7ZnVuY3Rpb24gSk4odCl7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQodCkmJnQudHlwZT09PVFOfWZ1bmN0aW9uIHFOKHQsZSl7Y29uc3Qgbj17Li4uZX07Zm9yKGNvbnN0IHIgaW4gZSl7Y29uc3QgaT10W3JdLG89ZVtyXTsvXm9uW0EtWl0vLnRlc3Qocik/aSYmbz9uW3JdPSguLi5zKT0+e28oLi4ucyksaSguLi5zKX06aSYmKG5bcl09aSk6cj09PSJzdHlsZSI/bltyXT17Li4uaSwuLi5vfTpyPT09ImNsYXNzTmFtZSImJihuW3JdPVtpLG9dLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIikpfXJldHVybnsuLi50LC4uLm59fWNvbnN0IGUyPVsiYSIsImJ1dHRvbiIsImRpdiIsImZvcm0iLCJoMiIsImgzIiwiaW1nIiwiaW5wdXQiLCJsYWJlbCIsImxpIiwibmF2Iiwib2wiLCJwIiwic3BhbiIsInN2ZyIsInVsIl0sS2U9ZTIucmVkdWNlKCh0LGUpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHIsaSk9Pntjb25zdHthc0NoaWxkOm8sLi4ubH09cixzPW8/YXM6ZTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt3aW5kb3dbU3ltYm9sLmZvcigicmFkaXgtdWkiKV09ITB9LFtdKSxwLmNyZWF0ZUVsZW1lbnQocyxpZSh7fSxsLHtyZWY6aX0pKX0pO3JldHVybiBuLmRpc3BsYXlOYW1lPWBQcmltaXRpdmUuJHtlfWAsey4uLnQsW2VdOm59fSx7fSk7ZnVuY3Rpb24gdDIodCxlKXt0JiZHci5mbHVzaFN5bmMoKCk9PnQuZGlzcGF0Y2hFdmVudChlKSl9Y29uc3QgVW49Z2xvYmFsVGhpcyE9bnVsbCYmZ2xvYmFsVGhpcy5kb2N1bWVudD9wLnVzZUxheW91dEVmZmVjdDooKT0+e307ZnVuY3Rpb24gbjIodCxlKXtyZXR1cm4gcC51c2VSZWR1Y2VyKChuLHIpPT57Y29uc3QgaT1lW25dW3JdO3JldHVybiBpPz9ufSx0KX1jb25zdCBTcz10PT57Y29uc3R7cHJlc2VudDplLGNoaWxkcmVuOm59PXQscj1yMihlKSxpPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oe3ByZXNlbnQ6ci5pc1ByZXNlbnR9KTpwLkNoaWxkcmVuLm9ubHkobiksbz1zdChyLnJlZixpLnJlZik7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24ifHxyLmlzUHJlc2VudD9wLmNsb25lRWxlbWVudChpLHtyZWY6b30pOm51bGx9O1NzLmRpc3BsYXlOYW1lPSJQcmVzZW5jZSI7ZnVuY3Rpb24gcjIodCl7Y29uc3RbZSxuXT1wLnVzZVN0YXRlKCkscj1wLnVzZVJlZih7fSksaT1wLnVzZVJlZih0KSxvPXAudXNlUmVmKCJub25lIiksbD10PyJtb3VudGVkIjoidW5tb3VudGVkIixbcyxhXT1uMihsLHttb3VudGVkOntVTk1PVU5UOiJ1bm1vdW50ZWQiLEFOSU1BVElPTl9PVVQ6InVubW91bnRTdXNwZW5kZWQifSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDoibW91bnRlZCIsQU5JTUFUSU9OX0VORDoidW5tb3VudGVkIn0sdW5tb3VudGVkOntNT1VOVDoibW91bnRlZCJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1oYyhyLmN1cnJlbnQpO28uY3VycmVudD1zPT09Im1vdW50ZWQiP3U6Im5vbmUifSxbc10pLFVuKCgpPT57Y29uc3QgdT1yLmN1cnJlbnQsYz1pLmN1cnJlbnQ7aWYoYyE9PXQpe2NvbnN0IGY9by5jdXJyZW50LGg9aGModSk7dD9hKCJNT1VOVCIpOmg9PT0ibm9uZSJ8fCh1PT1udWxsP3ZvaWQgMDp1LmRpc3BsYXkpPT09Im5vbmUiP2EoIlVOTU9VTlQiKTphKGMmJmYhPT1oPyJBTklNQVRJT05fT1VUIjoiVU5NT1VOVCIpLGkuY3VycmVudD10fX0sW3QsYV0pLFVuKCgpPT57aWYoZSl7Y29uc3QgdT1kPT57Y29uc3QgaD1oYyhyLmN1cnJlbnQpLmluY2x1ZGVzKGQuYW5pbWF0aW9uTmFtZSk7ZC50YXJnZXQ9PT1lJiZoJiZHci5mbHVzaFN5bmMoKCk9PmEoIkFOSU1BVElPTl9FTkQiKSl9LGM9ZD0+e2QudGFyZ2V0PT09ZSYmKG8uY3VycmVudD1oYyhyLmN1cnJlbnQpKX07cmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uc3RhcnQiLGMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uY2FuY2VsIix1KSxlLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdSksKCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpfX1lbHNlIGEoIkFOSU1BVElPTl9FTkQiKX0sW2UsYV0pLHtpc1ByZXNlbnQ6WyJtb3VudGVkIiwidW5tb3VudFN1c3BlbmRlZCJdLmluY2x1ZGVzKHMpLHJlZjpwLnVzZUNhbGxiYWNrKHU9Pnt1JiYoci5jdXJyZW50PWdldENvbXB1dGVkU3R5bGUodSkpLG4odSl9LFtdKX19ZnVuY3Rpb24gaGModCl7cmV0dXJuKHQ9PW51bGw/dm9pZCAwOnQuYW5pbWF0aW9uTmFtZSl8fCJub25lIn1mdW5jdGlvbiBvbCh0LGU9W10pe2xldCBuPVtdO2Z1bmN0aW9uIHIobyxsKXtjb25zdCBzPXAuY3JlYXRlQ29udGV4dChsKSxhPW4ubGVuZ3RoO249Wy4uLm4sbF07ZnVuY3Rpb24gdShkKXtjb25zdHtzY29wZTpmLGNoaWxkcmVuOmgsLi4ubX09ZCxnPShmPT1udWxsP3ZvaWQgMDpmW3RdW2FdKXx8cyx3PXAudXNlTWVtbygoKT0+bSxPYmplY3QudmFsdWVzKG0pKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGcuUHJvdmlkZXIse3ZhbHVlOnd9LGgpfWZ1bmN0aW9uIGMoZCxmKXtjb25zdCBoPShmPT1udWxsP3ZvaWQgMDpmW3RdW2FdKXx8cyxtPXAudXNlQ29udGV4dChoKTtpZihtKXJldHVybiBtO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7dGhyb3cgbmV3IEVycm9yKGBcYCR7ZH1cYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxgJHtvfVxgYCl9cmV0dXJuIHUuZGlzcGxheU5hbWU9bysiUHJvdmlkZXIiLFt1LGNdfWNvbnN0IGk9KCk9Pntjb25zdCBvPW4ubWFwKGw9PnAuY3JlYXRlQ29udGV4dChsKSk7cmV0dXJuIGZ1bmN0aW9uKHMpe2NvbnN0IGE9KHM9PW51bGw/dm9pZCAwOnNbdF0pfHxvO3JldHVybiBwLnVzZU1lbW8oKCk9Pih7W2BfX3Njb3BlJHt0fWBdOnsuLi5zLFt0XTphfX0pLFtzLGFdKX19O3JldHVybiBpLnNjb3BlTmFtZT10LFtyLGkyKGksLi4uZSldfWZ1bmN0aW9uIGkyKC4uLnQpe2NvbnN0IGU9dFswXTtpZih0Lmxlbmd0aD09PTEpcmV0dXJuIGU7Y29uc3Qgbj0oKT0+e2NvbnN0IHI9dC5tYXAoaT0+KHt1c2VTY29wZTppKCksc2NvcGVOYW1lOmkuc2NvcGVOYW1lfSkpO3JldHVybiBmdW5jdGlvbihvKXtjb25zdCBsPXIucmVkdWNlKChzLHt1c2VTY29wZTphLHNjb3BlTmFtZTp1fSk9Pntjb25zdCBkPWEobylbYF9fc2NvcGUke3V9YF07cmV0dXJuey4uLnMsLi4uZH19LHt9KTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZS5zY29wZU5hbWV9YF06bH0pLFtsXSl9fTtyZXR1cm4gbi5zY29wZU5hbWU9ZS5zY29wZU5hbWUsbn1mdW5jdGlvbiBlbih0KXtjb25zdCBlPXAudXNlUmVmKHQpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2UuY3VycmVudD10fSkscC51c2VNZW1vKCgpPT4oLi4ubik9Pnt2YXIgcjtyZXR1cm4ocj1lLmN1cnJlbnQpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5jYWxsKGUsLi4ubil9LFtdKX1jb25zdCBvMj1wLmNyZWF0ZUNvbnRleHQodm9pZCAwKTtmdW5jdGlvbiBYbSh0KXtjb25zdCBlPXAudXNlQ29udGV4dChvMik7cmV0dXJuIHR8fGV8fCJsdHIifWZ1bmN0aW9uIEdwKHQsW2Usbl0pe3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KGUsdCkpfWZ1bmN0aW9uIG50KHQsZSx7Y2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOm49ITB9PXt9KXtyZXR1cm4gZnVuY3Rpb24oaSl7aWYodD09bnVsbHx8dChpKSxuPT09ITF8fCFpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIGU9PW51bGw/dm9pZCAwOmUoaSl9fWZ1bmN0aW9uIGwyKHQsZSl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IGk9ZVtuXVtyXTtyZXR1cm4gaT8/bn0sdCl9Y29uc3QgUXc9IlNjcm9sbEFyZWEiLFtKdyxORF09b2woUXcpLFtzMixvcl09SncoUXcpLGEyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sdHlwZTpyPSJob3ZlciIsZGlyOmksc2Nyb2xsSGlkZURlbGF5Om89NjAwLC4uLmx9PXQsW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLFtkLGZdPXAudXNlU3RhdGUobnVsbCksW2gsbV09cC51c2VTdGF0ZShudWxsKSxbZyx3XT1wLnVzZVN0YXRlKG51bGwpLFt2LHldPXAudXNlU3RhdGUoMCksW3gsU109cC51c2VTdGF0ZSgwKSxbYixUXT1wLnVzZVN0YXRlKCExKSxbJCxPXT1wLnVzZVN0YXRlKCExKSxMPXN0KGUsRD0+YShEKSksUD1YbShpKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHMyLHtzY29wZTpuLHR5cGU6cixkaXI6UCxzY3JvbGxIaWRlRGVsYXk6byxzY3JvbGxBcmVhOnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmMsY29udGVudDpkLG9uQ29udGVudENoYW5nZTpmLHNjcm9sbGJhclg6aCxvblNjcm9sbGJhclhDaGFuZ2U6bSxzY3JvbGxiYXJYRW5hYmxlZDpiLG9uU2Nyb2xsYmFyWEVuYWJsZWRDaGFuZ2U6VCxzY3JvbGxiYXJZOmcsb25TY3JvbGxiYXJZQ2hhbmdlOncsc2Nyb2xsYmFyWUVuYWJsZWQ6JCxvblNjcm9sbGJhcllFbmFibGVkQ2hhbmdlOk8sb25Db3JuZXJXaWR0aENoYW5nZTp5LG9uQ29ybmVySGVpZ2h0Q2hhbmdlOlN9LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe2RpcjpQfSxsLHtyZWY6TCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgiOnYrInB4IiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0Ijp4KyJweCIsLi4udC5zdHlsZX19KSkpfSksdTI9IlNjcm9sbEFyZWFWaWV3cG9ydCIsYzI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixjaGlsZHJlbjpyLC4uLml9PXQsbz1vcih1MixuKSxsPXAudXNlUmVmKG51bGwpLHM9c3QoZSxsLG8ub25WaWV3cG9ydENoYW5nZSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XXtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt9W2RhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydCI6IiJ9LGkse3JlZjpzLHN0eWxlOntvdmVyZmxvd1g6by5zY3JvbGxiYXJYRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIixvdmVyZmxvd1k6by5zY3JvbGxiYXJZRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIiwuLi50LnN0eWxlfX0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOm8ub25Db250ZW50Q2hhbmdlLHN0eWxlOnttaW5XaWR0aDoiMTAwJSIsZGlzcGxheToidGFibGUifX0scikpKX0pLF9pPSJTY3JvbGxBcmVhU2Nyb2xsYmFyIixxdz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLHtvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOm8sb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpsfT1pLHM9dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIjtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PihzP28oITApOmwoITApLCgpPT57cz9vKCExKTpsKCExKX0pLFtzLG8sbF0pLGkudHlwZT09PSJob3ZlciI/cC5jcmVhdGVFbGVtZW50KGQyLGllKHt9LHIse3JlZjplLGZvcmNlTW91bnQ6bn0pKTppLnR5cGU9PT0ic2Nyb2xsIj9wLmNyZWF0ZUVsZW1lbnQoZjIsaWUoe30scix7cmVmOmUsZm9yY2VNb3VudDpufSkpOmkudHlwZT09PSJhdXRvIj9wLmNyZWF0ZUVsZW1lbnQoZVMsaWUoe30scix7cmVmOmUsZm9yY2VNb3VudDpufSkpOmkudHlwZT09PSJhbHdheXMiP3AuY3JlYXRlRWxlbWVudChRbSxpZSh7fSxyLHtyZWY6ZX0pKTpudWxsfSksZDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PXQsaT1vcihfaSx0Ll9fc2NvcGVTY3JvbGxBcmVhKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPWkuc2Nyb2xsQXJlYTtsZXQgYT0wO2lmKHMpe2NvbnN0IHU9KCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLGwoITApfSxjPSgpPT57YT13aW5kb3cuc2V0VGltZW91dCgoKT0+bCghMSksaS5zY3JvbGxIaWRlRGVsYXkpfTtyZXR1cm4gcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKSwoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoYSkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKX19fSxbaS5zY3JvbGxBcmVhLGkuc2Nyb2xsSGlkZURlbGF5XSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fG99LHAuY3JlYXRlRWxlbWVudChlUyxpZSh7ImRhdGEtc3RhdGUiOm8/InZpc2libGUiOiJoaWRkZW4ifSxyLHtyZWY6ZX0pKSl9KSxmMj1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLG89dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixsPVNmKCgpPT5hKCJTQ1JPTExfRU5EIiksMTAwKSxbcyxhXT1sMigiaGlkZGVuIix7aGlkZGVuOntTQ1JPTEw6InNjcm9sbGluZyJ9LHNjcm9sbGluZzp7U0NST0xMX0VORDoiaWRsZSIsUE9JTlRFUl9FTlRFUjoiaW50ZXJhY3RpbmcifSxpbnRlcmFjdGluZzp7U0NST0xMOiJpbnRlcmFjdGluZyIsUE9JTlRFUl9MRUFWRToiaWRsZSJ9LGlkbGU6e0hJREU6ImhpZGRlbiIsU0NST0xMOiJzY3JvbGxpbmciLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn19KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpZihzPT09ImlkbGUiKXtjb25zdCB1PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCJISURFIiksaS5zY3JvbGxIaWRlRGVsYXkpO3JldHVybigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHUpfX0sW3MsaS5zY3JvbGxIaWRlRGVsYXksYV0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1pLnZpZXdwb3J0LGM9bz8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCI7aWYodSl7bGV0IGQ9dVtjXTtjb25zdCBmPSgpPT57Y29uc3QgaD11W2NdO2QhPT1oJiYoYSgiU0NST0xMIiksbCgpKSxkPWh9O3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PnUucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtpLnZpZXdwb3J0LG8sYSxsXSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fHMhPT0iaGlkZGVuIn0scC5jcmVhdGVFbGVtZW50KFFtLGllKHsiZGF0YS1zdGF0ZSI6cz09PSJoaWRkZW4iPyJoaWRkZW4iOiJ2aXNpYmxlIn0scix7cmVmOmUsb25Qb2ludGVyRW50ZXI6bnQodC5vblBvaW50ZXJFbnRlciwoKT0+YSgiUE9JTlRFUl9FTlRFUiIpKSxvblBvaW50ZXJMZWF2ZTpudCh0Lm9uUG9pbnRlckxlYXZlLCgpPT5hKCJQT0lOVEVSX0xFQVZFIikpfSkpKX0pLGVTPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0IG49b3IoX2ksdC5fX3Njb3BlU2Nyb2xsQXJlYSkse2ZvcmNlTW91bnQ6ciwuLi5pfT10LFtvLGxdPXAudXNlU3RhdGUoITEpLHM9dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixhPVNmKCgpPT57aWYobi52aWV3cG9ydCl7Y29uc3QgdT1uLnZpZXdwb3J0Lm9mZnNldFdpZHRoPG4udmlld3BvcnQuc2Nyb2xsV2lkdGgsYz1uLnZpZXdwb3J0Lm9mZnNldEhlaWdodDxuLnZpZXdwb3J0LnNjcm9sbEhlaWdodDtsKHM/dTpjKX19LDEwKTtyZXR1cm4gdXMobi52aWV3cG9ydCxhKSx1cyhuLmNvbnRlbnQsYSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50OnJ8fG99LHAuY3JlYXRlRWxlbWVudChRbSxpZSh7ImRhdGEtc3RhdGUiOm8/InZpc2libGUiOiJoaWRkZW4ifSxpLHtyZWY6ZX0pKSl9KSxRbT1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtvcmllbnRhdGlvbjpuPSJ2ZXJ0aWNhbCIsLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLG89cC51c2VSZWYobnVsbCksbD1wLnVzZVJlZigwKSxbcyxhXT1wLnVzZVN0YXRlKHtjb250ZW50OjAsdmlld3BvcnQ6MCxzY3JvbGxiYXI6e3NpemU6MCxwYWRkaW5nU3RhcnQ6MCxwYWRkaW5nRW5kOjB9fSksdT1pUyhzLnZpZXdwb3J0LHMuY29udGVudCksYz17Li4ucixzaXplczpzLG9uU2l6ZXNDaGFuZ2U6YSxoYXNUaHVtYjp1PjAmJnU8MSxvblRodW1iQ2hhbmdlOmY9Pm8uY3VycmVudD1mLG9uVGh1bWJQb2ludGVyVXA6KCk9PmwuY3VycmVudD0wLG9uVGh1bWJQb2ludGVyRG93bjpmPT5sLmN1cnJlbnQ9Zn07ZnVuY3Rpb24gZChmLGgpe3JldHVybiBfMihmLGwuY3VycmVudCxzLGgpfXJldHVybiBuPT09Imhvcml6b250YWwiP3AuY3JlYXRlRWxlbWVudChoMixpZSh7fSxjLHtyZWY6ZSxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihpLnZpZXdwb3J0JiZvLmN1cnJlbnQpe2NvbnN0IGY9aS52aWV3cG9ydC5zY3JvbGxMZWZ0LGg9YjAoZixzLGkuZGlyKTtvLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGUzZCgke2h9cHgsIDAsIDApYH19LG9uV2hlZWxTY3JvbGw6Zj0+e2kudmlld3BvcnQmJihpLnZpZXdwb3J0LnNjcm9sbExlZnQ9Zil9LG9uRHJhZ1Njcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsTGVmdD1kKGYsaS5kaXIpKX19KSk6bj09PSJ2ZXJ0aWNhbCI/cC5jcmVhdGVFbGVtZW50KHAyLGllKHt9LGMse3JlZjplLG9uVGh1bWJQb3NpdGlvbkNoYW5nZTooKT0+e2lmKGkudmlld3BvcnQmJm8uY3VycmVudCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbFRvcCxoPWIwKGYscyk7by5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoMCwgJHtofXB4LCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntpLnZpZXdwb3J0JiYoaS52aWV3cG9ydC5zY3JvbGxUb3A9Zil9LG9uRHJhZ1Njcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsVG9wPWQoZikpfX0pKTpudWxsfSksaDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7c2l6ZXM6bixvblNpemVzQ2hhbmdlOnIsLi4uaX09dCxvPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLFtsLHNdPXAudXNlU3RhdGUoKSxhPXAudXNlUmVmKG51bGwpLHU9c3QoZSxhLG8ub25TY3JvbGxiYXJYQ2hhbmdlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PnthLmN1cnJlbnQmJnMoZ2V0Q29tcHV0ZWRTdHlsZShhLmN1cnJlbnQpKX0sW2FdKSxwLmNyZWF0ZUVsZW1lbnQoblMsaWUoeyJkYXRhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LGkse3JlZjp1LHNpemVzOm4sc3R5bGU6e2JvdHRvbTowLGxlZnQ6by5kaXI9PT0icnRsIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCxyaWdodDpvLmRpcj09PSJsdHIiPyJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgpIjowLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoIjp3ZihuKSsicHgiLC4uLnQuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT50Lm9uVGh1bWJQb2ludGVyRG93bihjLngpLG9uRHJhZ1Njcm9sbDpjPT50Lm9uRHJhZ1Njcm9sbChjLngpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihvLnZpZXdwb3J0KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsTGVmdCtjLmRlbHRhWDt0Lm9uV2hlZWxTY3JvbGwoZiksbFMoZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJm8udmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6by52aWV3cG9ydC5zY3JvbGxXaWR0aCx2aWV3cG9ydDpvLnZpZXdwb3J0Lm9mZnNldFdpZHRoLHNjcm9sbGJhcjp7c2l6ZTphLmN1cnJlbnQuY2xpZW50V2lkdGgscGFkZGluZ1N0YXJ0Ol9kKGwucGFkZGluZ0xlZnQpLHBhZGRpbmdFbmQ6X2QobC5wYWRkaW5nUmlnaHQpfX0pfX0pKX0pLHAyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLml9PXQsbz1vcihfaSx0Ll9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PXN0KGUsYSxvLm9uU2Nyb2xsYmFyWUNoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KG5TLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6InZlcnRpY2FsIn0saSx7cmVmOnUsc2l6ZXM6bixzdHlsZTp7dG9wOjAscmlnaHQ6by5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0Om8uZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0KSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0Ijp3ZihuKSsicHgiLC4uLnQuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT50Lm9uVGh1bWJQb2ludGVyRG93bihjLnkpLG9uRHJhZ1Njcm9sbDpjPT50Lm9uRHJhZ1Njcm9sbChjLnkpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihvLnZpZXdwb3J0KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsVG9wK2MuZGVsdGFZO3Qub25XaGVlbFNjcm9sbChmKSxsUyhmLGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxvblJlc2l6ZTooKT0+e2EuY3VycmVudCYmby52aWV3cG9ydCYmbCYmcih7Y29udGVudDpvLnZpZXdwb3J0LnNjcm9sbEhlaWdodCx2aWV3cG9ydDpvLnZpZXdwb3J0Lm9mZnNldEhlaWdodCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudEhlaWdodCxwYWRkaW5nU3RhcnQ6X2QobC5wYWRkaW5nVG9wKSxwYWRkaW5nRW5kOl9kKGwucGFkZGluZ0JvdHRvbSl9fSl9fSkpfSksW2cyLHRTXT1KdyhfaSksblM9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzaXplczpyLGhhc1RodW1iOmksb25UaHVtYkNoYW5nZTpvLG9uVGh1bWJQb2ludGVyVXA6bCxvblRodW1iUG9pbnRlckRvd246cyxvblRodW1iUG9zaXRpb25DaGFuZ2U6YSxvbkRyYWdTY3JvbGw6dSxvbldoZWVsU2Nyb2xsOmMsb25SZXNpemU6ZCwuLi5mfT10LGg9b3IoX2ksbiksW20sZ109cC51c2VTdGF0ZShudWxsKSx3PXN0KGUsTD0+ZyhMKSksdj1wLnVzZVJlZihudWxsKSx5PXAudXNlUmVmKCIiKSx4PWgudmlld3BvcnQsUz1yLmNvbnRlbnQtci52aWV3cG9ydCxiPWVuKGMpLFQ9ZW4oYSksJD1TZihkLDEwKTtmdW5jdGlvbiBPKEwpe2lmKHYuY3VycmVudCl7Y29uc3QgUD1MLmNsaWVudFgtdi5jdXJyZW50LmxlZnQsRD1MLmNsaWVudFktdi5jdXJyZW50LnRvcDt1KHt4OlAseTpEfSl9fXJldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IEw9UD0+e2NvbnN0IEQ9UC50YXJnZXQ7KG09PW51bGw/dm9pZCAwOm0uY29udGFpbnMoRCkpJiZiKFAsUyl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsTCx7cGFzc2l2ZTohMX0pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsTCx7cGFzc2l2ZTohMX0pfSxbeCxtLFMsYl0pLHAudXNlRWZmZWN0KFQsW3IsVF0pLHVzKG0sJCksdXMoaC5jb250ZW50LCQpLHAuY3JlYXRlRWxlbWVudChnMix7c2NvcGU6bixzY3JvbGxiYXI6bSxoYXNUaHVtYjppLG9uVGh1bWJDaGFuZ2U6ZW4obyksb25UaHVtYlBvaW50ZXJVcDplbihsKSxvblRodW1iUG9zaXRpb25DaGFuZ2U6VCxvblRodW1iUG9pbnRlckRvd246ZW4ocyl9LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30sZix7cmVmOncsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsLi4uZi5zdHlsZX0sb25Qb2ludGVyRG93bjpudCh0Lm9uUG9pbnRlckRvd24sTD0+e0wuYnV0dG9uPT09MCYmKEwudGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKEwucG9pbnRlcklkKSx2LmN1cnJlbnQ9bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx5LmN1cnJlbnQ9ZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0LGRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdD0ibm9uZSIsaC52aWV3cG9ydCYmKGgudmlld3BvcnQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9ImF1dG8iKSxPKEwpKX0pLG9uUG9pbnRlck1vdmU6bnQodC5vblBvaW50ZXJNb3ZlLE8pLG9uUG9pbnRlclVwOm50KHQub25Qb2ludGVyVXAsTD0+e2NvbnN0IFA9TC50YXJnZXQ7UC5oYXNQb2ludGVyQ2FwdHVyZShMLnBvaW50ZXJJZCkmJlAucmVsZWFzZVBvaW50ZXJDYXB0dXJlKEwucG9pbnRlcklkKSxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9eS5jdXJyZW50LGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSIiKSx2LmN1cnJlbnQ9bnVsbH0pfSkpKX0pLFlwPSJTY3JvbGxBcmVhVGh1bWIiLG0yPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT10LGk9dFMoWXAsdC5fX3Njb3BlU2Nyb2xsQXJlYSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChTcyx7cHJlc2VudDpufHxpLmhhc1RodW1ifSxwLmNyZWF0ZUVsZW1lbnQodjIsaWUoe3JlZjplfSxyKSkpfSksdjI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzdHlsZTpyLC4uLml9PXQsbz1vcihZcCxuKSxsPXRTKFlwLG4pLHtvblRodW1iUG9zaXRpb25DaGFuZ2U6c309bCxhPXN0KGUsZD0+bC5vblRodW1iQ2hhbmdlKGQpKSx1PXAudXNlUmVmKCksYz1TZigoKT0+e3UuY3VycmVudCYmKHUuY3VycmVudCgpLHUuY3VycmVudD12b2lkIDApfSwxMDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGQ9by52aWV3cG9ydDtpZihkKXtjb25zdCBmPSgpPT57aWYoYygpLCF1LmN1cnJlbnQpe2NvbnN0IGg9dzIoZCxzKTt1LmN1cnJlbnQ9aCxzKCl9fTtyZXR1cm4gcygpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKSwoKT0+ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpfX0sW28udmlld3BvcnQsYyxzXSkscC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ImRhdGEtc3RhdGUiOmwuaGFzVGh1bWI/InZpc2libGUiOiJoaWRkZW4ifSxpLHtyZWY6YSxzdHlsZTp7d2lkdGg6InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoKSIsaGVpZ2h0OiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi1oZWlnaHQpIiwuLi5yfSxvblBvaW50ZXJEb3duQ2FwdHVyZTpudCh0Lm9uUG9pbnRlckRvd25DYXB0dXJlLGQ9Pntjb25zdCBoPWQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG09ZC5jbGllbnRYLWgubGVmdCxnPWQuY2xpZW50WS1oLnRvcDtsLm9uVGh1bWJQb2ludGVyRG93bih7eDptLHk6Z30pfSksb25Qb2ludGVyVXA6bnQodC5vblBvaW50ZXJVcCxsLm9uVGh1bWJQb2ludGVyVXApfSkpfSksclM9IlNjcm9sbEFyZWFDb3JuZXIiLHkyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0IG49b3IoclMsdC5fX3Njb3BlU2Nyb2xsQXJlYSkscj0hIShuLnNjcm9sbGJhclgmJm4uc2Nyb2xsYmFyWSk7cmV0dXJuIG4udHlwZSE9PSJzY3JvbGwiJiZyP3AuY3JlYXRlRWxlbWVudCh4MixpZSh7fSx0LHtyZWY6ZX0pKTpudWxsfSkseDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6biwuLi5yfT10LGk9b3IoclMsbiksW28sbF09cC51c2VTdGF0ZSgwKSxbcyxhXT1wLnVzZVN0YXRlKDApLHU9ISEobyYmcyk7cmV0dXJuIHVzKGkuc2Nyb2xsYmFyWCwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPWkuc2Nyb2xsYmFyWCk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldEhlaWdodCl8fDA7aS5vbkNvcm5lckhlaWdodENoYW5nZShkKSxhKGQpfSksdXMoaS5zY3JvbGxiYXJZLCgpPT57dmFyIGM7Y29uc3QgZD0oKGM9aS5zY3JvbGxiYXJZKT09PW51bGx8fGM9PT12b2lkIDA/dm9pZCAwOmMub2Zmc2V0V2lkdGgpfHwwO2kub25Db3JuZXJXaWR0aENoYW5nZShkKSxsKGQpfSksdT9wLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LHIse3JlZjplLHN0eWxlOnt3aWR0aDpvLGhlaWdodDpzLHBvc2l0aW9uOiJhYnNvbHV0ZSIscmlnaHQ6aS5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0OmkuZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOjAsLi4udC5zdHlsZX19KSk6bnVsbH0pO2Z1bmN0aW9uIF9kKHQpe3JldHVybiB0P3BhcnNlSW50KHQsMTApOjB9ZnVuY3Rpb24gaVModCxlKXtjb25zdCBuPXQvZTtyZXR1cm4gaXNOYU4obik/MDpufWZ1bmN0aW9uIHdmKHQpe2NvbnN0IGU9aVModC52aWV3cG9ydCx0LmNvbnRlbnQpLG49dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQscj0odC5zY3JvbGxiYXIuc2l6ZS1uKSplO3JldHVybiBNYXRoLm1heChyLDE4KX1mdW5jdGlvbiBfMih0LGUsbixyPSJsdHIiKXtjb25zdCBpPXdmKG4pLG89aS8yLGw9ZXx8byxzPWktbCxhPW4uc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtsLHU9bi5zY3JvbGxiYXIuc2l6ZS1uLnNjcm9sbGJhci5wYWRkaW5nRW5kLXMsYz1uLmNvbnRlbnQtbi52aWV3cG9ydCxkPXI9PT0ibHRyIj9bMCxjXTpbYyotMSwwXTtyZXR1cm4gb1MoW2EsdV0sZCkodCl9ZnVuY3Rpb24gYjAodCxlLG49Imx0ciIpe2NvbnN0IHI9d2YoZSksaT1lLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrZS5zY3JvbGxiYXIucGFkZGluZ0VuZCxvPWUuc2Nyb2xsYmFyLnNpemUtaSxsPWUuY29udGVudC1lLnZpZXdwb3J0LHM9by1yLGE9bj09PSJsdHIiP1swLGxdOltsKi0xLDBdLHU9R3AodCxhKTtyZXR1cm4gb1MoWzAsbF0sWzAsc10pKHUpfWZ1bmN0aW9uIG9TKHQsZSl7cmV0dXJuIG49PntpZih0WzBdPT09dFsxXXx8ZVswXT09PWVbMV0pcmV0dXJuIGVbMF07Y29uc3Qgcj0oZVsxXS1lWzBdKS8odFsxXS10WzBdKTtyZXR1cm4gZVswXStyKihuLXRbMF0pfX1mdW5jdGlvbiBsUyh0LGUpe3JldHVybiB0PjAmJnQ8ZX1jb25zdCB3Mj0odCxlPSgpPT57fSk9PntsZXQgbj17bGVmdDp0LnNjcm9sbExlZnQsdG9wOnQuc2Nyb2xsVG9wfSxyPTA7cmV0dXJuIGZ1bmN0aW9uIGkoKXtjb25zdCBvPXtsZWZ0OnQuc2Nyb2xsTGVmdCx0b3A6dC5zY3JvbGxUb3B9LGw9bi5sZWZ0IT09by5sZWZ0LHM9bi50b3AhPT1vLnRvcDsobHx8cykmJmUoKSxuPW8scj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpfSgpLCgpPT53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocil9O2Z1bmN0aW9uIFNmKHQsZSl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSkscC51c2VDYWxsYmFjaygoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQobixlKX0sW24sZV0pfWZ1bmN0aW9uIHVzKHQsZSl7Y29uc3Qgbj1lbihlKTtVbigoKT0+e2xldCByPTA7aWYodCl7Y29uc3QgaT1uZXcgUmVzaXplT2JzZXJ2ZXIoKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZShyKSxyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobil9KTtyZXR1cm4gaS5vYnNlcnZlKHQpLCgpPT57d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpLGkudW5vYnNlcnZlKHQpfX19LFt0LG5dKX1jb25zdCBzUz1hMixTMj1jMixFMj15MjtmdW5jdGlvbiBhUyh0KXt2YXIgZSxuLHI9IiI7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09Im51bWJlciIpcis9dDtlbHNlIGlmKHR5cGVvZiB0PT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KHQpKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXSYmKG49YVModFtlXSkpJiYociYmKHIrPSIgIikscis9bik7ZWxzZSBmb3IoZSBpbiB0KXRbZV0mJihyJiYocis9IiAiKSxyKz1lKTtyZXR1cm4gcn1mdW5jdGlvbiB1Uygpe2Zvcih2YXIgdCxlLG49MCxyPSIiO248YXJndW1lbnRzLmxlbmd0aDspKHQ9YXJndW1lbnRzW24rK10pJiYoZT1hUyh0KSkmJihyJiYocis9IiAiKSxyKz1lKTtyZXR1cm4gcn1jb25zdCBKbT0iLSI7ZnVuY3Rpb24gQzIodCl7Y29uc3QgZT1iMih0KSx7Y29uZmxpY3RpbmdDbGFzc0dyb3VwczpuLGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczpyfT10O2Z1bmN0aW9uIGkobCl7Y29uc3Qgcz1sLnNwbGl0KEptKTtyZXR1cm4gc1swXT09PSIiJiZzLmxlbmd0aCE9PTEmJnMuc2hpZnQoKSxjUyhzLGUpfHxrMihsKX1mdW5jdGlvbiBvKGwscyl7Y29uc3QgYT1uW2xdfHxbXTtyZXR1cm4gcyYmcltsXT9bLi4uYSwuLi5yW2xdXTphfXJldHVybntnZXRDbGFzc0dyb3VwSWQ6aSxnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6b319ZnVuY3Rpb24gY1ModCxlKXt2YXIgbDtpZih0Lmxlbmd0aD09PTApcmV0dXJuIGUuY2xhc3NHcm91cElkO2NvbnN0IG49dFswXSxyPWUubmV4dFBhcnQuZ2V0KG4pLGk9cj9jUyh0LnNsaWNlKDEpLHIpOnZvaWQgMDtpZihpKXJldHVybiBpO2lmKGUudmFsaWRhdG9ycy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBvPXQuam9pbihKbSk7cmV0dXJuKGw9ZS52YWxpZGF0b3JzLmZpbmQoKHt2YWxpZGF0b3I6c30pPT5zKG8pKSk9PW51bGw/dm9pZCAwOmwuY2xhc3NHcm91cElkfWNvbnN0ICQwPS9eXFsoLispXF0kLztmdW5jdGlvbiBrMih0KXtpZigkMC50ZXN0KHQpKXtjb25zdCBlPSQwLmV4ZWModClbMV0sbj1lPT1udWxsP3ZvaWQgMDplLnN1YnN0cmluZygwLGUuaW5kZXhPZigiOiIpKTtpZihuKXJldHVybiJhcmJpdHJhcnkuLiIrbn19ZnVuY3Rpb24gYjIodCl7Y29uc3R7dGhlbWU6ZSxwcmVmaXg6bn09dCxyPXtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119O3JldHVybiBUMihPYmplY3QuZW50cmllcyh0LmNsYXNzR3JvdXBzKSxuKS5mb3JFYWNoKChbbyxsXSk9PntYcChsLHIsbyxlKX0pLHJ9ZnVuY3Rpb24gWHAodCxlLG4scil7dC5mb3JFYWNoKGk9PntpZih0eXBlb2YgaT09InN0cmluZyIpe2NvbnN0IG89aT09PSIiP2U6VDAoZSxpKTtvLmNsYXNzR3JvdXBJZD1uO3JldHVybn1pZih0eXBlb2YgaT09ImZ1bmN0aW9uIil7aWYoJDIoaSkpe1hwKGkociksZSxuLHIpO3JldHVybn1lLnZhbGlkYXRvcnMucHVzaCh7dmFsaWRhdG9yOmksY2xhc3NHcm91cElkOm59KTtyZXR1cm59T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW28sbF0pPT57WHAobCxUMChlLG8pLG4scil9KX0pfWZ1bmN0aW9uIFQwKHQsZSl7bGV0IG49dDtyZXR1cm4gZS5zcGxpdChKbSkuZm9yRWFjaChyPT57bi5uZXh0UGFydC5oYXMocil8fG4ubmV4dFBhcnQuc2V0KHIse25leHRQYXJ0Om5ldyBNYXAsdmFsaWRhdG9yczpbXX0pLG49bi5uZXh0UGFydC5nZXQocil9KSxufWZ1bmN0aW9uICQyKHQpe3JldHVybiB0LmlzVGhlbWVHZXR0ZXJ9ZnVuY3Rpb24gVDIodCxlKXtyZXR1cm4gZT90Lm1hcCgoW24scl0pPT57Y29uc3QgaT1yLm1hcChvPT50eXBlb2Ygbz09InN0cmluZyI/ZStvOnR5cGVvZiBvPT0ib2JqZWN0Ij9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobykubWFwKChbbCxzXSk9PltlK2wsc10pKTpvKTtyZXR1cm5bbixpXX0pOnR9ZnVuY3Rpb24gTjIodCl7aWYodDwxKXJldHVybntnZXQ6KCk9Pnt9LHNldDooKT0+e319O2xldCBlPTAsbj1uZXcgTWFwLHI9bmV3IE1hcDtmdW5jdGlvbiBpKG8sbCl7bi5zZXQobyxsKSxlKyssZT50JiYoZT0wLHI9bixuPW5ldyBNYXApfXJldHVybntnZXQobyl7bGV0IGw9bi5nZXQobyk7aWYobCE9PXZvaWQgMClyZXR1cm4gbDtpZigobD1yLmdldChvKSkhPT12b2lkIDApcmV0dXJuIGkobyxsKSxsfSxzZXQobyxsKXtuLmhhcyhvKT9uLnNldChvLGwpOmkobyxsKX19fWNvbnN0IGRTPSIhIjtmdW5jdGlvbiBSMih0KXtjb25zdCBlPXQuc2VwYXJhdG9yLG49ZS5sZW5ndGg9PT0xLHI9ZVswXSxpPWUubGVuZ3RoO3JldHVybiBmdW5jdGlvbihsKXtjb25zdCBzPVtdO2xldCBhPTAsdT0wLGM7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2xldCB3PWxbZ107aWYoYT09PTApe2lmKHc9PT1yJiYobnx8bC5zbGljZShnLGcraSk9PT1lKSl7cy5wdXNoKGwuc2xpY2UodSxnKSksdT1nK2k7Y29udGludWV9aWYodz09PSIvIil7Yz1nO2NvbnRpbnVlfX13PT09IlsiP2ErKzp3PT09Il0iJiZhLS19Y29uc3QgZD1zLmxlbmd0aD09PTA/bDpsLnN1YnN0cmluZyh1KSxmPWQuc3RhcnRzV2l0aChkUyksaD1mP2Quc3Vic3RyaW5nKDEpOmQsbT1jJiZjPnU/Yy11OnZvaWQgMDtyZXR1cm57bW9kaWZpZXJzOnMsaGFzSW1wb3J0YW50TW9kaWZpZXI6ZixiYXNlQ2xhc3NOYW1lOmgsbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbjptfX19ZnVuY3Rpb24gTzIodCl7aWYodC5sZW5ndGg8PTEpcmV0dXJuIHQ7Y29uc3QgZT1bXTtsZXQgbj1bXTtyZXR1cm4gdC5mb3JFYWNoKHI9PntyWzBdPT09IlsiPyhlLnB1c2goLi4ubi5zb3J0KCksciksbj1bXSk6bi5wdXNoKHIpfSksZS5wdXNoKC4uLm4uc29ydCgpKSxlfWZ1bmN0aW9uIFAyKHQpe3JldHVybntjYWNoZTpOMih0LmNhY2hlU2l6ZSksc3BsaXRNb2RpZmllcnM6UjIodCksLi4uQzIodCl9fWNvbnN0IEEyPS9ccysvO2Z1bmN0aW9uIE0yKHQsZSl7Y29uc3R7c3BsaXRNb2RpZmllcnM6bixnZXRDbGFzc0dyb3VwSWQ6cixnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6aX09ZSxvPW5ldyBTZXQ7cmV0dXJuIHQudHJpbSgpLnNwbGl0KEEyKS5tYXAobD0+e2NvbnN0e21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmEsYmFzZUNsYXNzTmFtZTp1LG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Y309bihsKTtsZXQgZD1yKGM/dS5zdWJzdHJpbmcoMCxjKTp1KSxmPSEhYztpZighZCl7aWYoIWMpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtpZihkPXIodSksIWQpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtmPSExfWNvbnN0IGg9TzIocykuam9pbigiOiIpO3JldHVybntpc1RhaWx3aW5kQ2xhc3M6ITAsbW9kaWZpZXJJZDphP2grZFM6aCxjbGFzc0dyb3VwSWQ6ZCxvcmlnaW5hbENsYXNzTmFtZTpsLGhhc1Bvc3RmaXhNb2RpZmllcjpmfX0pLnJldmVyc2UoKS5maWx0ZXIobD0+e2lmKCFsLmlzVGFpbHdpbmRDbGFzcylyZXR1cm4hMDtjb25zdHttb2RpZmllcklkOnMsY2xhc3NHcm91cElkOmEsaGFzUG9zdGZpeE1vZGlmaWVyOnV9PWwsYz1zK2E7cmV0dXJuIG8uaGFzKGMpPyExOihvLmFkZChjKSxpKGEsdSkuZm9yRWFjaChkPT5vLmFkZChzK2QpKSwhMCl9KS5yZXZlcnNlKCkubWFwKGw9Pmwub3JpZ2luYWxDbGFzc05hbWUpLmpvaW4oIiAiKX1mdW5jdGlvbiBMMigpe2xldCB0PTAsZSxuLHI9IiI7Zm9yKDt0PGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1t0KytdKSYmKG49ZlMoZSkpJiYociYmKHIrPSIgIikscis9bik7cmV0dXJuIHJ9ZnVuY3Rpb24gZlModCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2xldCBlLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspdFtyXSYmKGU9ZlModFtyXSkpJiYobiYmKG4rPSIgIiksbis9ZSk7cmV0dXJuIG59ZnVuY3Rpb24gSTIodCwuLi5lKXtsZXQgbixyLGksbz1sO2Z1bmN0aW9uIGwoYSl7Y29uc3QgdT1lLnJlZHVjZSgoYyxkKT0+ZChjKSx0KCkpO3JldHVybiBuPVAyKHUpLHI9bi5jYWNoZS5nZXQsaT1uLmNhY2hlLnNldCxvPXMscyhhKX1mdW5jdGlvbiBzKGEpe2NvbnN0IHU9cihhKTtpZih1KXJldHVybiB1O2NvbnN0IGM9TTIoYSxuKTtyZXR1cm4gaShhLGMpLGN9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG8oTDIuYXBwbHkobnVsbCxhcmd1bWVudHMpKX19ZnVuY3Rpb24gcWUodCl7Y29uc3QgZT1uPT5uW3RdfHxbXTtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyPSEwLGV9Y29uc3QgaFM9L15cWyg/OihbYS16LV0rKTopPyguKylcXSQvaSxEMj0vXlxkK1wvXGQrJC8sajI9bmV3IFNldChbInB4IiwiZnVsbCIsInNjcmVlbiJdKSx6Mj0vXihcZCsoXC5cZCspPyk/KHhzfHNtfG1kfGxnfHhsKSQvLEYyPS9cZCsoJXxweHxyP2VtfFtzZGxdP3YoW2h3aWJdfG1pbnxtYXgpfHB0fHBjfGlufGNtfG1tfGNhcHxjaHxleHxyP2xofGNxKHd8aHxpfGJ8bWlufG1heCkpfFxiKGNhbGN8bWlufG1heHxjbGFtcClcKC4rXCl8XjAkLyxCMj0vXi0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxVMj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvO2Z1bmN0aW9uIGNyKHQpe3JldHVybiBPbyh0KXx8ajIuaGFzKHQpfHxEMi50ZXN0KHQpfWZ1bmN0aW9uIFRpKHQpe3JldHVybiBFcyh0LCJsZW5ndGgiLFgyKX1mdW5jdGlvbiBPbyh0KXtyZXR1cm4hIXQmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKHQpKX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gRXModCwibnVtYmVyIixPbyl9ZnVuY3Rpb24gUXModCl7cmV0dXJuISF0JiZOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcih0KSl9ZnVuY3Rpb24gVzIodCl7cmV0dXJuIHQuZW5kc1dpdGgoIiUiKSYmT28odC5zbGljZSgwLC0xKSl9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIGhTLnRlc3QodCl9ZnVuY3Rpb24gTmkodCl7cmV0dXJuIHoyLnRlc3QodCl9Y29uc3QgVjI9bmV3IFNldChbImxlbmd0aCIsInNpemUiLCJwZXJjZW50YWdlIl0pO2Z1bmN0aW9uIEgyKHQpe3JldHVybiBFcyh0LFYyLHBTKX1mdW5jdGlvbiBLMih0KXtyZXR1cm4gRXModCwicG9zaXRpb24iLHBTKX1jb25zdCBaMj1uZXcgU2V0KFsiaW1hZ2UiLCJ1cmwiXSk7ZnVuY3Rpb24gRzIodCl7cmV0dXJuIEVzKHQsWjIsSjIpfWZ1bmN0aW9uIFkyKHQpe3JldHVybiBFcyh0LCIiLFEyKX1mdW5jdGlvbiBKcygpe3JldHVybiEwfWZ1bmN0aW9uIEVzKHQsZSxuKXtjb25zdCByPWhTLmV4ZWModCk7cmV0dXJuIHI/clsxXT90eXBlb2YgZT09InN0cmluZyI/clsxXT09PWU6ZS5oYXMoclsxXSk6bihyWzJdKTohMX1mdW5jdGlvbiBYMih0KXtyZXR1cm4gRjIudGVzdCh0KX1mdW5jdGlvbiBwUygpe3JldHVybiExfWZ1bmN0aW9uIFEyKHQpe3JldHVybiBCMi50ZXN0KHQpfWZ1bmN0aW9uIEoyKHQpe3JldHVybiBVMi50ZXN0KHQpfWZ1bmN0aW9uIHEyKCl7Y29uc3QgdD1xZSgiY29sb3JzIiksZT1xZSgic3BhY2luZyIpLG49cWUoImJsdXIiKSxyPXFlKCJicmlnaHRuZXNzIiksaT1xZSgiYm9yZGVyQ29sb3IiKSxvPXFlKCJib3JkZXJSYWRpdXMiKSxsPXFlKCJib3JkZXJTcGFjaW5nIikscz1xZSgiYm9yZGVyV2lkdGgiKSxhPXFlKCJjb250cmFzdCIpLHU9cWUoImdyYXlzY2FsZSIpLGM9cWUoImh1ZVJvdGF0ZSIpLGQ9cWUoImludmVydCIpLGY9cWUoImdhcCIpLGg9cWUoImdyYWRpZW50Q29sb3JTdG9wcyIpLG09cWUoImdyYWRpZW50Q29sb3JTdG9wUG9zaXRpb25zIiksZz1xZSgiaW5zZXQiKSx3PXFlKCJtYXJnaW4iKSx2PXFlKCJvcGFjaXR5IikseT1xZSgicGFkZGluZyIpLHg9cWUoInNhdHVyYXRlIiksUz1xZSgic2NhbGUiKSxiPXFlKCJzZXBpYSIpLFQ9cWUoInNrZXciKSwkPXFlKCJzcGFjZSIpLE89cWUoInRyYW5zbGF0ZSIpLEw9KCk9PlsiYXV0byIsImNvbnRhaW4iLCJub25lIl0sUD0oKT0+WyJhdXRvIiwiaGlkZGVuIiwiY2xpcCIsInZpc2libGUiLCJzY3JvbGwiXSxEPSgpPT5bImF1dG8iLFNlLGVdLEI9KCk9PltTZSxlXSxvZT0oKT0+WyIiLGNyLFRpXSxIPSgpPT5bImF1dG8iLE9vLFNlXSxaPSgpPT5bImJvdHRvbSIsImNlbnRlciIsImxlZnQiLCJsZWZ0LWJvdHRvbSIsImxlZnQtdG9wIiwicmlnaHQiLCJyaWdodC1ib3R0b20iLCJyaWdodC10b3AiLCJ0b3AiXSxDPSgpPT5bInNvbGlkIiwiZGFzaGVkIiwiZG90dGVkIiwiZG91YmxlIiwibm9uZSJdLGs9KCk9Plsibm9ybWFsIiwibXVsdGlwbHkiLCJzY3JlZW4iLCJvdmVybGF5IiwiZGFya2VuIiwibGlnaHRlbiIsImNvbG9yLWRvZGdlIiwiY29sb3ItYnVybiIsImhhcmQtbGlnaHQiLCJzb2Z0LWxpZ2h0IiwiZGlmZmVyZW5jZSIsImV4Y2x1c2lvbiIsImh1ZSIsInNhdHVyYXRpb24iLCJjb2xvciIsImx1bWlub3NpdHkiLCJwbHVzLWxpZ2h0ZXIiXSxFPSgpPT5bInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmV0d2VlbiIsImFyb3VuZCIsImV2ZW5seSIsInN0cmV0Y2giXSxBPSgpPT5bIiIsIjAiLFNlXSxOPSgpPT5bImF1dG8iLCJhdm9pZCIsImFsbCIsImF2b2lkLXBhZ2UiLCJwYWdlIiwibGVmdCIsInJpZ2h0IiwiY29sdW1uIl0sRj0oKT0+W09vLHBjXSxLPSgpPT5bT28sU2VdO3JldHVybntjYWNoZVNpemU6NTAwLHNlcGFyYXRvcjoiOiIsdGhlbWU6e2NvbG9yczpbSnNdLHNwYWNpbmc6W2NyLFRpXSxibHVyOlsibm9uZSIsIiIsTmksU2VdLGJyaWdodG5lc3M6RigpLGJvcmRlckNvbG9yOlt0XSxib3JkZXJSYWRpdXM6WyJub25lIiwiIiwiZnVsbCIsTmksU2VdLGJvcmRlclNwYWNpbmc6QigpLGJvcmRlcldpZHRoOm9lKCksY29udHJhc3Q6RigpLGdyYXlzY2FsZTpBKCksaHVlUm90YXRlOksoKSxpbnZlcnQ6QSgpLGdhcDpCKCksZ3JhZGllbnRDb2xvclN0b3BzOlt0XSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbVzIsVGldLGluc2V0OkQoKSxtYXJnaW46RCgpLG9wYWNpdHk6RigpLHBhZGRpbmc6QigpLHNhdHVyYXRlOkYoKSxzY2FsZTpGKCksc2VwaWE6QSgpLHNrZXc6SygpLHNwYWNlOkIoKSx0cmFuc2xhdGU6QigpfSxjbGFzc0dyb3Vwczp7YXNwZWN0Olt7YXNwZWN0OlsiYXV0byIsInNxdWFyZSIsInZpZGVvIixTZV19XSxjb250YWluZXI6WyJjb250YWluZXIiXSxjb2x1bW5zOlt7Y29sdW1uczpbTmldfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6TigpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjpOKCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOlsiYXV0byIsImF2b2lkIiwiYXZvaWQtcGFnZSIsImF2b2lkLWNvbHVtbiJdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6WyJzbGljZSIsImNsb25lIl19XSxib3g6W3tib3g6WyJib3JkZXIiLCJjb250ZW50Il19XSxkaXNwbGF5OlsiYmxvY2siLCJpbmxpbmUtYmxvY2siLCJpbmxpbmUiLCJmbGV4IiwiaW5saW5lLWZsZXgiLCJ0YWJsZSIsImlubGluZS10YWJsZSIsInRhYmxlLWNhcHRpb24iLCJ0YWJsZS1jZWxsIiwidGFibGUtY29sdW1uIiwidGFibGUtY29sdW1uLWdyb3VwIiwidGFibGUtZm9vdGVyLWdyb3VwIiwidGFibGUtaGVhZGVyLWdyb3VwIiwidGFibGUtcm93LWdyb3VwIiwidGFibGUtcm93IiwiZmxvdy1yb290IiwiZ3JpZCIsImlubGluZS1ncmlkIiwiY29udGVudHMiLCJsaXN0LWl0ZW0iLCJoaWRkZW4iXSxmbG9hdDpbe2Zsb2F0OlsicmlnaHQiLCJsZWZ0Iiwibm9uZSJdfV0sY2xlYXI6W3tjbGVhcjpbImxlZnQiLCJyaWdodCIsImJvdGgiLCJub25lIl19XSxpc29sYXRpb246WyJpc29sYXRlIiwiaXNvbGF0aW9uLWF1dG8iXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6WyJjb250YWluIiwiY292ZXIiLCJmaWxsIiwibm9uZSIsInNjYWxlLWRvd24iXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OlsuLi5aKCksU2VdfV0sb3ZlcmZsb3c6W3tvdmVyZmxvdzpQKCl9XSwib3ZlcmZsb3cteCI6W3sib3ZlcmZsb3cteCI6UCgpfV0sIm92ZXJmbG93LXkiOlt7Im92ZXJmbG93LXkiOlAoKX1dLG92ZXJzY3JvbGw6W3tvdmVyc2Nyb2xsOkwoKX1dLCJvdmVyc2Nyb2xsLXgiOlt7Im92ZXJzY3JvbGwteCI6TCgpfV0sIm92ZXJzY3JvbGwteSI6W3sib3ZlcnNjcm9sbC15IjpMKCl9XSxwb3NpdGlvbjpbInN0YXRpYyIsImZpeGVkIiwiYWJzb2x1dGUiLCJyZWxhdGl2ZSIsInN0aWNreSJdLGluc2V0Olt7aW5zZXQ6W2ddfV0sImluc2V0LXgiOlt7Imluc2V0LXgiOltnXX1dLCJpbnNldC15IjpbeyJpbnNldC15IjpbZ119XSxzdGFydDpbe3N0YXJ0OltnXX1dLGVuZDpbe2VuZDpbZ119XSx0b3A6W3t0b3A6W2ddfV0scmlnaHQ6W3tyaWdodDpbZ119XSxib3R0b206W3tib3R0b206W2ddfV0sbGVmdDpbe2xlZnQ6W2ddfV0sdmlzaWJpbGl0eTpbInZpc2libGUiLCJpbnZpc2libGUiLCJjb2xsYXBzZSJdLHo6W3t6OlsiYXV0byIsUXMsU2VdfV0sYmFzaXM6W3tiYXNpczpEKCl9XSwiZmxleC1kaXJlY3Rpb24iOlt7ZmxleDpbInJvdyIsInJvdy1yZXZlcnNlIiwiY29sIiwiY29sLXJldmVyc2UiXX1dLCJmbGV4LXdyYXAiOlt7ZmxleDpbIndyYXAiLCJ3cmFwLXJldmVyc2UiLCJub3dyYXAiXX1dLGZsZXg6W3tmbGV4OlsiMSIsImF1dG8iLCJpbml0aWFsIiwibm9uZSIsU2VdfV0sZ3Jvdzpbe2dyb3c6QSgpfV0sc2hyaW5rOlt7c2hyaW5rOkEoKX1dLG9yZGVyOlt7b3JkZXI6WyJmaXJzdCIsImxhc3QiLCJub25lIixRcyxTZV19XSwiZ3JpZC1jb2xzIjpbeyJncmlkLWNvbHMiOltKc119XSwiY29sLXN0YXJ0LWVuZCI6W3tjb2w6WyJhdXRvIix7c3BhbjpbImZ1bGwiLFFzLFNlXX0sU2VdfV0sImNvbC1zdGFydCI6W3siY29sLXN0YXJ0IjpIKCl9XSwiY29sLWVuZCI6W3siY29sLWVuZCI6SCgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjpbSnNdfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlsiYXV0byIse3NwYW46W1FzLFNlXX0sU2VdfV0sInJvdy1zdGFydCI6W3sicm93LXN0YXJ0IjpIKCl9XSwicm93LWVuZCI6W3sicm93LWVuZCI6SCgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbInJvdyIsImNvbCIsImRlbnNlIiwicm93LWRlbnNlIiwiY29sLWRlbnNlIl19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIixTZV19XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIixTZV19XSxnYXA6W3tnYXA6W2ZdfV0sImdhcC14IjpbeyJnYXAteCI6W2ZdfV0sImdhcC15IjpbeyJnYXAteSI6W2ZdfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5Olsibm9ybWFsIiwuLi5FKCldfV0sImp1c3RpZnktaXRlbXMiOlt7Imp1c3RpZnktaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIl19XSwianVzdGlmeS1zZWxmIjpbeyJqdXN0aWZ5LXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbIm5vcm1hbCIsLi4uRSgpLCJiYXNlbGluZSJdfV0sImFsaWduLWl0ZW1zIjpbe2l0ZW1zOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIiwiYmFzZWxpbmUiXX1dLCJwbGFjZS1jb250ZW50IjpbeyJwbGFjZS1jb250ZW50IjpbLi4uRSgpLCJiYXNlbGluZSJdfV0sInBsYWNlLWl0ZW1zIjpbeyJwbGFjZS1pdGVtcyI6WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJhc2VsaW5lIiwic3RyZXRjaCJdfV0sInBsYWNlLXNlbGYiOlt7InBsYWNlLXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0scDpbe3A6W3ldfV0scHg6W3tweDpbeV19XSxweTpbe3B5Olt5XX1dLHBzOlt7cHM6W3ldfV0scGU6W3twZTpbeV19XSxwdDpbe3B0Olt5XX1dLHByOlt7cHI6W3ldfV0scGI6W3twYjpbeV19XSxwbDpbe3BsOlt5XX1dLG06W3ttOlt3XX1dLG14Olt7bXg6W3ddfV0sbXk6W3tteTpbd119XSxtczpbe21zOlt3XX1dLG1lOlt7bWU6W3ddfV0sbXQ6W3ttdDpbd119XSxtcjpbe21yOlt3XX1dLG1iOlt7bWI6W3ddfV0sbWw6W3ttbDpbd119XSwic3BhY2UteCI6W3sic3BhY2UteCI6WyRdfV0sInNwYWNlLXgtcmV2ZXJzZSI6WyJzcGFjZS14LXJldmVyc2UiXSwic3BhY2UteSI6W3sic3BhY2UteSI6WyRdfV0sInNwYWNlLXktcmV2ZXJzZSI6WyJzcGFjZS15LXJldmVyc2UiXSx3Olt7dzpbImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiLFNlLGVdfV0sIm1pbi13IjpbeyJtaW4tdyI6WyJtaW4iLCJtYXgiLCJmaXQiLFNlLGNyXX1dLCJtYXgtdyI6W3sibWF4LXciOlsiMCIsIm5vbmUiLCJmdWxsIiwibWluIiwibWF4IiwiZml0IiwicHJvc2UiLHtzY3JlZW46W05pXX0sTmksU2VdfV0saDpbe2g6W1NlLGUsImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiXX1dLCJtaW4taCI6W3sibWluLWgiOlsibWluIiwibWF4IiwiZml0IixjcixTZV19XSwibWF4LWgiOlt7Im1heC1oIjpbU2UsZSwibWluIiwibWF4IiwiZml0Il19XSwiZm9udC1zaXplIjpbe3RleHQ6WyJiYXNlIixOaSxUaV19XSwiZm9udC1zbW9vdGhpbmciOlsiYW50aWFsaWFzZWQiLCJzdWJwaXhlbC1hbnRpYWxpYXNlZCJdLCJmb250LXN0eWxlIjpbIml0YWxpYyIsIm5vdC1pdGFsaWMiXSwiZm9udC13ZWlnaHQiOlt7Zm9udDpbInRoaW4iLCJleHRyYWxpZ2h0IiwibGlnaHQiLCJub3JtYWwiLCJtZWRpdW0iLCJzZW1pYm9sZCIsImJvbGQiLCJleHRyYWJvbGQiLCJibGFjayIscGNdfV0sImZvbnQtZmFtaWx5Ijpbe2ZvbnQ6W0pzXX1dLCJmdm4tbm9ybWFsIjpbIm5vcm1hbC1udW1zIl0sImZ2bi1vcmRpbmFsIjpbIm9yZGluYWwiXSwiZnZuLXNsYXNoZWQtemVybyI6WyJzbGFzaGVkLXplcm8iXSwiZnZuLWZpZ3VyZSI6WyJsaW5pbmctbnVtcyIsIm9sZHN0eWxlLW51bXMiXSwiZnZuLXNwYWNpbmciOlsicHJvcG9ydGlvbmFsLW51bXMiLCJ0YWJ1bGFyLW51bXMiXSwiZnZuLWZyYWN0aW9uIjpbImRpYWdvbmFsLWZyYWN0aW9ucyIsInN0YWNrZWQtZnJhY3RvbnMiXSx0cmFja2luZzpbe3RyYWNraW5nOlsidGlnaHRlciIsInRpZ2h0Iiwibm9ybWFsIiwid2lkZSIsIndpZGVyIiwid2lkZXN0IixTZV19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6WyJub25lIixPbyxwY119XSxsZWFkaW5nOlt7bGVhZGluZzpbIm5vbmUiLCJ0aWdodCIsInNudWciLCJub3JtYWwiLCJyZWxheGVkIiwibG9vc2UiLGNyLFNlXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbIm5vbmUiLFNlXX1dLCJsaXN0LXN0eWxlLXR5cGUiOlt7bGlzdDpbIm5vbmUiLCJkaXNjIiwiZGVjaW1hbCIsU2VdfV0sImxpc3Qtc3R5bGUtcG9zaXRpb24iOlt7bGlzdDpbImluc2lkZSIsIm91dHNpZGUiXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpbdF19XSwicGxhY2Vob2xkZXItb3BhY2l0eSI6W3sicGxhY2Vob2xkZXItb3BhY2l0eSI6W3ZdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJqdXN0aWZ5Iiwic3RhcnQiLCJlbmQiXX1dLCJ0ZXh0LWNvbG9yIjpbe3RleHQ6W3RdfV0sInRleHQtb3BhY2l0eSI6W3sidGV4dC1vcGFjaXR5Ijpbdl19XSwidGV4dC1kZWNvcmF0aW9uIjpbInVuZGVybGluZSIsIm92ZXJsaW5lIiwibGluZS10aHJvdWdoIiwibm8tdW5kZXJsaW5lIl0sInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6W3tkZWNvcmF0aW9uOlsuLi5DKCksIndhdnkiXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246WyJhdXRvIiwiZnJvbS1mb250IixjcixUaV19XSwidW5kZXJsaW5lLW9mZnNldCI6W3sidW5kZXJsaW5lLW9mZnNldCI6WyJhdXRvIixjcixTZV19XSwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIjpbe2RlY29yYXRpb246W3RdfV0sInRleHQtdHJhbnNmb3JtIjpbInVwcGVyY2FzZSIsImxvd2VyY2FzZSIsImNhcGl0YWxpemUiLCJub3JtYWwtY2FzZSJdLCJ0ZXh0LW92ZXJmbG93IjpbInRydW5jYXRlIiwidGV4dC1lbGxpcHNpcyIsInRleHQtY2xpcCJdLGluZGVudDpbe2luZGVudDpCKCl9XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246WyJiYXNlbGluZSIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSIsInRleHQtdG9wIiwidGV4dC1ib3R0b20iLCJzdWIiLCJzdXBlciIsU2VdfV0sd2hpdGVzcGFjZTpbe3doaXRlc3BhY2U6WyJub3JtYWwiLCJub3dyYXAiLCJwcmUiLCJwcmUtbGluZSIsInByZS13cmFwIiwiYnJlYWstc3BhY2VzIl19XSxicmVhazpbe2JyZWFrOlsibm9ybWFsIiwid29yZHMiLCJhbGwiLCJrZWVwIl19XSxoeXBoZW5zOlt7aHlwaGVuczpbIm5vbmUiLCJtYW51YWwiLCJhdXRvIl19XSxjb250ZW50Olt7Y29udGVudDpbIm5vbmUiLFNlXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOlsiZml4ZWQiLCJsb2NhbCIsInNjcm9sbCJdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOlsiYm9yZGVyIiwicGFkZGluZyIsImNvbnRlbnQiLCJ0ZXh0Il19XSwiYmctb3BhY2l0eSI6W3siYmctb3BhY2l0eSI6W3ZdfV0sImJnLW9yaWdpbiI6W3siYmctb3JpZ2luIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50Il19XSwiYmctcG9zaXRpb24iOlt7Ymc6Wy4uLlooKSxLMl19XSwiYmctcmVwZWF0Ijpbe2JnOlsibm8tcmVwZWF0Iix7cmVwZWF0OlsiIiwieCIsInkiLCJyb3VuZCIsInNwYWNlIl19XX1dLCJiZy1zaXplIjpbe2JnOlsiYXV0byIsImNvdmVyIiwiY29udGFpbiIsSDJdfV0sImJnLWltYWdlIjpbe2JnOlsibm9uZSIseyJncmFkaWVudC10byI6WyJ0IiwidHIiLCJyIiwiYnIiLCJiIiwiYmwiLCJsIiwidGwiXX0sRzJdfV0sImJnLWNvbG9yIjpbe2JnOlt0XX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOlttXX1dLCJncmFkaWVudC12aWEtcG9zIjpbe3ZpYTpbbV19XSwiZ3JhZGllbnQtdG8tcG9zIjpbe3RvOlttXX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206W2hdfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6W2hdfV0sImdyYWRpZW50LXRvIjpbe3RvOltoXX1dLHJvdW5kZWQ6W3tyb3VuZGVkOltvXX1dLCJyb3VuZGVkLXMiOlt7InJvdW5kZWQtcyI6W29dfV0sInJvdW5kZWQtZSI6W3sicm91bmRlZC1lIjpbb119XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOltvXX1dLCJyb3VuZGVkLXIiOlt7InJvdW5kZWQtciI6W29dfV0sInJvdW5kZWQtYiI6W3sicm91bmRlZC1iIjpbb119XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOltvXX1dLCJyb3VuZGVkLXNzIjpbeyJyb3VuZGVkLXNzIjpbb119XSwicm91bmRlZC1zZSI6W3sicm91bmRlZC1zZSI6W29dfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOltvXX1dLCJyb3VuZGVkLWVzIjpbeyJyb3VuZGVkLWVzIjpbb119XSwicm91bmRlZC10bCI6W3sicm91bmRlZC10bCI6W29dfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOltvXX1dLCJyb3VuZGVkLWJyIjpbeyJyb3VuZGVkLWJyIjpbb119XSwicm91bmRlZC1ibCI6W3sicm91bmRlZC1ibCI6W29dfV0sImJvcmRlci13Ijpbe2JvcmRlcjpbc119XSwiYm9yZGVyLXcteCI6W3siYm9yZGVyLXgiOltzXX1dLCJib3JkZXItdy15IjpbeyJib3JkZXIteSI6W3NdfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjpbc119XSwiYm9yZGVyLXctZSI6W3siYm9yZGVyLWUiOltzXX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6W3NdfV0sImJvcmRlci13LXIiOlt7ImJvcmRlci1yIjpbc119XSwiYm9yZGVyLXctYiI6W3siYm9yZGVyLWIiOltzXX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6W3NdfV0sImJvcmRlci1vcGFjaXR5IjpbeyJib3JkZXItb3BhY2l0eSI6W3ZdfV0sImJvcmRlci1zdHlsZSI6W3tib3JkZXI6Wy4uLkMoKSwiaGlkZGVuIl19XSwiZGl2aWRlLXgiOlt7ImRpdmlkZS14Ijpbc119XSwiZGl2aWRlLXgtcmV2ZXJzZSI6WyJkaXZpZGUteC1yZXZlcnNlIl0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6W3NdfV0sImRpdmlkZS15LXJldmVyc2UiOlsiZGl2aWRlLXktcmV2ZXJzZSJdLCJkaXZpZGUtb3BhY2l0eSI6W3siZGl2aWRlLW9wYWNpdHkiOlt2XX1dLCJkaXZpZGUtc3R5bGUiOlt7ZGl2aWRlOkMoKX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOltpXX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOltpXX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOltpXX1dLCJib3JkZXItY29sb3ItdCI6W3siYm9yZGVyLXQiOltpXX1dLCJib3JkZXItY29sb3ItciI6W3siYm9yZGVyLXIiOltpXX1dLCJib3JkZXItY29sb3ItYiI6W3siYm9yZGVyLWIiOltpXX1dLCJib3JkZXItY29sb3ItbCI6W3siYm9yZGVyLWwiOltpXX1dLCJkaXZpZGUtY29sb3IiOlt7ZGl2aWRlOltpXX1dLCJvdXRsaW5lLXN0eWxlIjpbe291dGxpbmU6WyIiLC4uLkMoKV19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbY3IsU2VdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltjcixUaV19XSwib3V0bGluZS1jb2xvciI6W3tvdXRsaW5lOlt0XX1dLCJyaW5nLXciOlt7cmluZzpvZSgpfV0sInJpbmctdy1pbnNldCI6WyJyaW5nLWluc2V0Il0sInJpbmctY29sb3IiOlt7cmluZzpbdF19XSwicmluZy1vcGFjaXR5IjpbeyJyaW5nLW9wYWNpdHkiOlt2XX1dLCJyaW5nLW9mZnNldC13IjpbeyJyaW5nLW9mZnNldCI6W2NyLFRpXX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOlt0XX1dLHNoYWRvdzpbe3NoYWRvdzpbIiIsImlubmVyIiwibm9uZSIsTmksWTJdfV0sInNoYWRvdy1jb2xvciI6W3tzaGFkb3c6W0pzXX1dLG9wYWNpdHk6W3tvcGFjaXR5Olt2XX1dLCJtaXgtYmxlbmQiOlt7Im1peC1ibGVuZCI6aygpfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6aygpfV0sZmlsdGVyOlt7ZmlsdGVyOlsiIiwibm9uZSJdfV0sYmx1cjpbe2JsdXI6W25dfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W3JdfV0sY29udHJhc3Q6W3tjb250cmFzdDpbYV19XSwiZHJvcC1zaGFkb3ciOlt7ImRyb3Atc2hhZG93IjpbIiIsIm5vbmUiLE5pLFNlXX1dLGdyYXlzY2FsZTpbe2dyYXlzY2FsZTpbdV19XSwiaHVlLXJvdGF0ZSI6W3siaHVlLXJvdGF0ZSI6W2NdfV0saW52ZXJ0Olt7aW52ZXJ0OltkXX1dLHNhdHVyYXRlOlt7c2F0dXJhdGU6W3hdfV0sc2VwaWE6W3tzZXBpYTpbYl19XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOlsiIiwibm9uZSJdfV0sImJhY2tkcm9wLWJsdXIiOlt7ImJhY2tkcm9wLWJsdXIiOltuXX1dLCJiYWNrZHJvcC1icmlnaHRuZXNzIjpbeyJiYWNrZHJvcC1icmlnaHRuZXNzIjpbcl19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbYV19XSwiYmFja2Ryb3AtZ3JheXNjYWxlIjpbeyJiYWNrZHJvcC1ncmF5c2NhbGUiOlt1XX1dLCJiYWNrZHJvcC1odWUtcm90YXRlIjpbeyJiYWNrZHJvcC1odWUtcm90YXRlIjpbY119XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltkXX1dLCJiYWNrZHJvcC1vcGFjaXR5IjpbeyJiYWNrZHJvcC1vcGFjaXR5Ijpbdl19XSwiYmFja2Ryb3Atc2F0dXJhdGUiOlt7ImJhY2tkcm9wLXNhdHVyYXRlIjpbeF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpbYl19XSwiYm9yZGVyLWNvbGxhcHNlIjpbe2JvcmRlcjpbImNvbGxhcHNlIiwic2VwYXJhdGUiXX1dLCJib3JkZXItc3BhY2luZyI6W3siYm9yZGVyLXNwYWNpbmciOltsXX1dLCJib3JkZXItc3BhY2luZy14IjpbeyJib3JkZXItc3BhY2luZy14IjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteSI6W3siYm9yZGVyLXNwYWNpbmcteSI6W2xdfV0sInRhYmxlLWxheW91dCI6W3t0YWJsZTpbImF1dG8iLCJmaXhlZCJdfV0sY2FwdGlvbjpbe2NhcHRpb246WyJ0b3AiLCJib3R0b20iXX1dLHRyYW5zaXRpb246W3t0cmFuc2l0aW9uOlsibm9uZSIsImFsbCIsIiIsImNvbG9ycyIsIm9wYWNpdHkiLCJzaGFkb3ciLCJ0cmFuc2Zvcm0iLFNlXX1dLGR1cmF0aW9uOlt7ZHVyYXRpb246SygpfV0sZWFzZTpbe2Vhc2U6WyJsaW5lYXIiLCJpbiIsIm91dCIsImluLW91dCIsU2VdfV0sZGVsYXk6W3tkZWxheTpLKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIixTZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOltTXX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpbU119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W1NdfV0scm90YXRlOlt7cm90YXRlOltRcyxTZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbT119XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbT119XSwic2tldy14IjpbeyJza2V3LXgiOltUXX1dLCJza2V3LXkiOlt7InNrZXcteSI6W1RdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsU2VdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsdF19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0IixTZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W3RdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkIoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6QigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpCKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkIoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6QigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpCKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkIoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6QigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpCKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpCKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkIoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6QigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpCKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkIoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6QigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpCKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkIoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6QigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsU2VdfV0sZmlsbDpbe2ZpbGw6W3QsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W2NyLFRpLHBjXX1dLHN0cm9rZTpbe3N0cm9rZTpbdCwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IGVSPUkyKHEyKTtmdW5jdGlvbiB4dCguLi50KXtyZXR1cm4gZVIodVModCkpfWNvbnN0IFNhPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LGNoaWxkcmVuOmUsLi4ubn0scik9Pl8uanN4cyhzUyx7cmVmOnIsY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLHQpLC4uLm4sY2hpbGRyZW46W18uanN4KFMyLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOmV9KSxfLmpzeChnUyx7fSksXy5qc3goRTIse30pXX0pKTtTYS5kaXNwbGF5TmFtZT1zUy5kaXNwbGF5TmFtZTtjb25zdCBnUz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxvcmllbnRhdGlvbjplPSJ2ZXJ0aWNhbCIsLi4ubn0scik9Pl8uanN4KHF3LHtyZWY6cixvcmllbnRhdGlvbjplLGNsYXNzTmFtZTp4dCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIixlPT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIixlPT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsdCksLi4ubixjaGlsZHJlbjpfLmpzeChtMix7Y2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIixlPT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7Z1MuZGlzcGxheU5hbWU9cXcuZGlzcGxheU5hbWU7ZnVuY3Rpb24gRWEoe2NoaWxkcmVuOnR9KXtjb25zdCBlPXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksaT1wLnVzZVJlZigwKSxvPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxvLmN1cnJlbnQ9bnVsbCxpLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT13PT57dy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9by5jdXJyZW50PT09ImxlZnQiP2U6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1vLmN1cnJlbnQ9PT0ibGVmdCI/dy5zY3JlZW5YLWkuY3VycmVudDppLmN1cnJlbnQtdy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9dz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCB4PXc9PT0ibGVmdCI/ZTp3PT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLHgmJnguY3VycmVudCYmKGkuY3VycmVudD12LnNjcmVlblgsby5jdXJyZW50PXcseC5jdXJyZW50JiYobC5jdXJyZW50PXguY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsbSxnXT1wLkNoaWxkcmVuLnRvQXJyYXkodCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse3JlZjplLGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOltjLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSksXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6X2YoIiIseyJ3LWZ1bGwiOiFtJiYhZ30pLGNoaWxkcmVuOl8uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOltmLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxtfHxnJiZfLmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOlttLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpnfSldfSksXy5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfUVhLkNvbHVtbj0oe2NoaWxkcmVuOnR9KT0+e2NvbnN0W2Usbl09cC5DaGlsZHJlbi50b0FycmF5KHQpO3JldHVybiBfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOmV9KSxuXX0pfTtjb25zdCB0Uj0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6dCxjaGlsZHJlbjpbXy5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W18uanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLF8uanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSksXy5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLF8uanN4KCJkZWZzIix7Y2hpbGRyZW46Xy5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46Xy5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxtUz10UixuUj0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6dCxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W18uanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goImRlZnMiLHtjaGlsZHJlbjpfLmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjpfLmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHJSPW5SLGlSPSh7Y2xhc3NOYW1lOnR9KT0+Xy5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTp0LGNoaWxkcmVuOl8uanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46Xy5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksb1I9aVI7ZnVuY3Rpb24gdlMoe2NoaWxkcmVuOnQscm9vdFBhdGg6ZX0pe3JldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKHQsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W2VdfSkpfSl9dlMuTm9kZT0oe2NoaWxkcmVuOnQscGF0aHM6ZT1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6aSxzZXRBY3RpdmVQYXRoOm99KT0+e2NvbnN0IGw9ciozMCxzPWk9PT0ic3RyaW5nIj9fLmpzeChvUix7fSk6aT09PSJpbWFnZSI/Xy5qc3gobVMse2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOl8uanN4KHJSLHt9KTtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W18uanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e28mJm8obil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLF8uanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksdCYmXy5qc3goXy5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAodCxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLmUsbl19KSl9KV19KX07ZnVuY3Rpb24gcW0oKXtyZXR1cm57YXN5bmM6ITEsYnJlYWtzOiExLGV4dGVuc2lvbnM6bnVsbCxnZm06ITAsaG9va3M6bnVsbCxwZWRhbnRpYzohMSxyZW5kZXJlcjpudWxsLHNpbGVudDohMSx0b2tlbml6ZXI6bnVsbCx3YWxrVG9rZW5zOm51bGx9fWxldCBsbD1xbSgpO2Z1bmN0aW9uIHlTKHQpe2xsPXR9Y29uc3QgeFM9L1smPD4iJ10vLGxSPW5ldyBSZWdFeHAoeFMuc291cmNlLCJnIiksX1M9L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLHNSPW5ldyBSZWdFeHAoX1Muc291cmNlLCJnIiksYVI9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LE4wPXQ9PmFSW3RdO2Z1bmN0aW9uIE1uKHQsZSl7aWYoZSl7aWYoeFMudGVzdCh0KSlyZXR1cm4gdC5yZXBsYWNlKGxSLE4wKX1lbHNlIGlmKF9TLnRlc3QodCkpcmV0dXJuIHQucmVwbGFjZShzUixOMCk7cmV0dXJuIHR9Y29uc3QgdVI9LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWc7ZnVuY3Rpb24gY1IodCl7cmV0dXJuIHQucmVwbGFjZSh1UiwoZSxuKT0+KG49bi50b0xvd2VyQ2FzZSgpLG49PT0iY29sb24iPyI6IjpuLmNoYXJBdCgwKT09PSIjIj9uLmNoYXJBdCgxKT09PSJ4Ij9TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4uc3Vic3RyaW5nKDIpLDE2KSk6U3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpOiIiKSl9Y29uc3QgZFI9LyhefFteXFtdKVxeL2c7ZnVuY3Rpb24gQmUodCxlKXt0PXR5cGVvZiB0PT0ic3RyaW5nIj90OnQuc291cmNlLGU9ZXx8IiI7Y29uc3Qgbj17cmVwbGFjZToocixpKT0+KGk9dHlwZW9mIGk9PSJvYmplY3QiJiYic291cmNlImluIGk/aS5zb3VyY2U6aSxpPWkucmVwbGFjZShkUiwiJDEiKSx0PXQucmVwbGFjZShyLGkpLG4pLGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKHQsZSl9O3JldHVybiBufWZ1bmN0aW9uIFIwKHQpe3RyeXt0PWVuY29kZVVSSSh0KS5yZXBsYWNlKC8lMjUvZywiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiB0fWNvbnN0IHdkPXtleGVjOigpPT5udWxsfTtmdW5jdGlvbiBPMCh0LGUpe2NvbnN0IG49dC5yZXBsYWNlKC9cfC9nLChvLGwscyk9PntsZXQgYT0hMSx1PWw7Zm9yKDstLXU+PTAmJnNbdV09PT0iXFwiOylhPSFhO3JldHVybiBhPyJ8IjoiIHwifSkscj1uLnNwbGl0KC8gXHwvKTtsZXQgaT0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXJbci5sZW5ndGgtMV0udHJpbSgpJiZyLnBvcCgpLGUpaWYoci5sZW5ndGg+ZSlyLnNwbGljZShlKTtlbHNlIGZvcig7ci5sZW5ndGg8ZTspci5wdXNoKCIiKTtmb3IoO2k8ci5sZW5ndGg7aSsrKXJbaV09cltpXS50cmltKCkucmVwbGFjZSgvXFxcfC9nLCJ8Iik7cmV0dXJuIHJ9ZnVuY3Rpb24gZ2ModCxlLG4pe2NvbnN0IHI9dC5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IGk9MDtmb3IoO2k8cjspe2NvbnN0IG89dC5jaGFyQXQoci1pLTEpO2lmKG89PT1lJiYhbilpKys7ZWxzZSBpZihvIT09ZSYmbilpKys7ZWxzZSBicmVha31yZXR1cm4gdC5zbGljZSgwLHItaSl9ZnVuY3Rpb24gZlIodCxlKXtpZih0LmluZGV4T2YoZVsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWlmKHRbcl09PT0iXFwiKXIrKztlbHNlIGlmKHRbcl09PT1lWzBdKW4rKztlbHNlIGlmKHRbcl09PT1lWzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gUDAodCxlLG4scil7Y29uc3QgaT1lLmhyZWYsbz1lLnRpdGxlP01uKGUudGl0bGUpOm51bGwsbD10WzFdLnJlcGxhY2UoL1xcKFtcW1xdXSkvZywiJDEiKTtpZih0WzBdLmNoYXJBdCgwKSE9PSIhIil7ci5zdGF0ZS5pbkxpbms9ITA7Y29uc3Qgcz17dHlwZToibGluayIscmF3Om4saHJlZjppLHRpdGxlOm8sdGV4dDpsLHRva2VuczpyLmlubGluZVRva2VucyhsKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLHN9cmV0dXJue3R5cGU6ImltYWdlIixyYXc6bixocmVmOmksdGl0bGU6byx0ZXh0Ok1uKGwpfX1mdW5jdGlvbiBoUih0LGUpe2NvbnN0IG49dC5tYXRjaCgvXihccyspKD86YGBgKS8pO2lmKG49PT1udWxsKXJldHVybiBlO2NvbnN0IHI9blsxXTtyZXR1cm4gZS5zcGxpdChgCmApLm1hcChpPT57Y29uc3Qgbz1pLm1hdGNoKC9eXHMrLyk7aWYobz09PW51bGwpcmV0dXJuIGk7Y29uc3RbbF09bztyZXR1cm4gbC5sZW5ndGg+PXIubGVuZ3RoP2kuc2xpY2Uoci5sZW5ndGgpOml9KS5qb2luKGAKYCl9Y2xhc3MgU2R7Y29uc3RydWN0b3IoZSl7SmUodGhpcywib3B0aW9ucyIpO0plKHRoaXMsInJ1bGVzIik7SmUodGhpcywibGV4ZXIiKTt0aGlzLm9wdGlvbnM9ZXx8bGx9c3BhY2UoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhlKTtpZihuJiZuWzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3Om5bMF19fWNvZGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyhlKTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiB7MSw0fS9nbSwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuWzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/cjpnYyhyLGAKYCl9fX1mZW5jZXMoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blswXSxpPWhSKHIsblszXXx8IiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6cixsYW5nOm5bMl0/blsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzJdLHRleHQ6aX19fWhlYWRpbmcoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzJdLnRyaW0oKTtpZigvIyQvLnRlc3Qocikpe2NvbnN0IGk9Z2MociwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFpfHwvICQvLnRlc3QoaSkpJiYocj1pLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMV0ubGVuZ3RoLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX1ocihlKXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhlKTtpZihuKXJldHVybnt0eXBlOiJociIscmF3Om5bMF19fWJsb2NrcXVvdGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmJsb2NrcXVvdGUuZXhlYyhlKTtpZihuKXtjb25zdCByPWdjKG5bMF0ucmVwbGFjZSgvXiAqPlsgXHRdPy9nbSwiIiksYApgKSxpPXRoaXMubGV4ZXIuc3RhdGUudG9wO3RoaXMubGV4ZXIuc3RhdGUudG9wPSEwO2NvbnN0IG89dGhpcy5sZXhlci5ibG9ja1Rva2VucyhyKTtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS50b3A9aSx7dHlwZToiYmxvY2txdW90ZSIscmF3Om5bMF0sdG9rZW5zOm8sdGV4dDpyfX19bGlzdChlKXtsZXQgbj10aGlzLnJ1bGVzLmJsb2NrLmxpc3QuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzFdLnRyaW0oKTtjb25zdCBpPXIubGVuZ3RoPjEsbz17dHlwZToibGlzdCIscmF3OiIiLG9yZGVyZWQ6aSxzdGFydDppPytyLnNsaWNlKDAsLTEpOiIiLGxvb3NlOiExLGl0ZW1zOltdfTtyPWk/YFxcZHsxLDl9XFwke3Iuc2xpY2UoLTEpfWA6YFxcJHtyfWAsdGhpcy5vcHRpb25zLnBlZGFudGljJiYocj1pP3I6IlsqKy1dIik7Y29uc3QgbD1uZXcgUmVnRXhwKGBeKCB7MCwzfSR7cn0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCk7bGV0IHM9IiIsYT0iIix1PSExO2Zvcig7ZTspe2xldCBjPSExO2lmKCEobj1sLmV4ZWMoZSkpfHx0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3QoZSkpYnJlYWs7cz1uWzBdLGU9ZS5zdWJzdHJpbmcocy5sZW5ndGgpO2xldCBkPW5bMl0uc3BsaXQoYApgLDEpWzBdLnJlcGxhY2UoL15cdCsvLHY9PiIgIi5yZXBlYXQoMyp2Lmxlbmd0aCkpLGY9ZS5zcGxpdChgCmAsMSlbMF0saD0wO3RoaXMub3B0aW9ucy5wZWRhbnRpYz8oaD0yLGE9ZC50cmltU3RhcnQoKSk6KGg9blsyXS5zZWFyY2goL1teIF0vKSxoPWg+ND8xOmgsYT1kLnNsaWNlKGgpLGgrPW5bMV0ubGVuZ3RoKTtsZXQgbT0hMTtpZighZCYmL14gKiQvLnRlc3QoZikmJihzKz1mK2AKYCxlPWUuc3Vic3RyaW5nKGYubGVuZ3RoKzEpLGM9ITApLCFjKXtjb25zdCB2PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSx5PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSx4PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlxgXGBcYHx+fn4pYCksUz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0jYCk7Zm9yKDtlOyl7Y29uc3QgYj1lLnNwbGl0KGAKYCwxKVswXTtpZihmPWIsdGhpcy5vcHRpb25zLnBlZGFudGljJiYoZj1mLnJlcGxhY2UoL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZywiICAiKSkseC50ZXN0KGYpfHxTLnRlc3QoZil8fHYudGVzdChmKXx8eS50ZXN0KGUpKWJyZWFrO2lmKGYuc2VhcmNoKC9bXiBdLyk+PWh8fCFmLnRyaW0oKSlhKz1gCmArZi5zbGljZShoKTtlbHNle2lmKG18fGQuc2VhcmNoKC9bXiBdLyk+PTR8fHgudGVzdChkKXx8Uy50ZXN0KGQpfHx5LnRlc3QoZCkpYnJlYWs7YSs9YApgK2Z9IW0mJiFmLnRyaW0oKSYmKG09ITApLHMrPWIrYApgLGU9ZS5zdWJzdHJpbmcoYi5sZW5ndGgrMSksZD1mLnNsaWNlKGgpfX1vLmxvb3NlfHwodT9vLmxvb3NlPSEwOi9cbiAqXG4gKiQvLnRlc3QocykmJih1PSEwKSk7bGV0IGc9bnVsbCx3O3RoaXMub3B0aW9ucy5nZm0mJihnPS9eXFtbIHhYXVxdIC8uZXhlYyhhKSxnJiYodz1nWzBdIT09IlsgXSAiLGE9YS5yZXBsYWNlKC9eXFtbIHhYXVxdICsvLCIiKSkpLG8uaXRlbXMucHVzaCh7dHlwZToibGlzdF9pdGVtIixyYXc6cyx0YXNrOiEhZyxjaGVja2VkOncsbG9vc2U6ITEsdGV4dDphLHRva2VuczpbXX0pLG8ucmF3Kz1zfW8uaXRlbXNbby5pdGVtcy5sZW5ndGgtMV0ucmF3PXMudHJpbUVuZCgpLG8uaXRlbXNbby5pdGVtcy5sZW5ndGgtMV0udGV4dD1hLnRyaW1FbmQoKSxvLnJhdz1vLnJhdy50cmltRW5kKCk7Zm9yKGxldCBjPTA7YzxvLml0ZW1zLmxlbmd0aDtjKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsby5pdGVtc1tjXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhvLml0ZW1zW2NdLnRleHQsW10pLCFvLmxvb3NlKXtjb25zdCBkPW8uaXRlbXNbY10udG9rZW5zLmZpbHRlcihoPT5oLnR5cGU9PT0ic3BhY2UiKSxmPWQubGVuZ3RoPjAmJmQuc29tZShoPT4vXG4uKlxuLy50ZXN0KGgucmF3KSk7by5sb29zZT1mfWlmKG8ubG9vc2UpZm9yKGxldCBjPTA7YzxvLml0ZW1zLmxlbmd0aDtjKyspby5pdGVtc1tjXS5sb29zZT0hMDtyZXR1cm4gb319aHRtbChlKXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKGUpO2lmKG4pcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzpuWzBdLHByZTpuWzFdPT09InByZSJ8fG5bMV09PT0ic2NyaXB0Inx8blsxXT09PSJzdHlsZSIsdGV4dDpuWzBdfX1kZWYoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blsxXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCIgIiksaT1uWzJdP25bMl0ucmVwbGFjZSgvXjwoLiopPiQvLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6IiIsbz1uWzNdP25bM10uc3Vic3RyaW5nKDEsblszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpyLHJhdzpuWzBdLGhyZWY6aSx0aXRsZTpvfX19dGFibGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoZSk7aWYobil7aWYoIS9bOnxdLy50ZXN0KG5bMl0pKXJldHVybjtjb25zdCByPXt0eXBlOiJ0YWJsZSIscmF3Om5bMF0saGVhZGVyOk8wKG5bMV0pLm1hcChpPT4oe3RleHQ6aSx0b2tlbnM6W119KSksYWxpZ246blsyXS5yZXBsYWNlKC9eXHx8XHwgKiQvZywiIikuc3BsaXQoInwiKSxyb3dzOm5bM10mJm5bM10udHJpbSgpP25bM10ucmVwbGFjZSgvXG5bIFx0XSokLywiIikuc3BsaXQoYApgKTpbXX07aWYoci5oZWFkZXIubGVuZ3RoPT09ci5hbGlnbi5sZW5ndGgpe2xldCBpPXIuYWxpZ24ubGVuZ3RoLG8sbCxzLGE7Zm9yKG89MDtvPGk7bysrKXtjb25zdCB1PXIuYWxpZ25bb107dSYmKC9eICotKzogKiQvLnRlc3QodSk/ci5hbGlnbltvXT0icmlnaHQiOi9eICo6LSs6ICokLy50ZXN0KHUpP3IuYWxpZ25bb109ImNlbnRlciI6L14gKjotKyAqJC8udGVzdCh1KT9yLmFsaWduW29dPSJsZWZ0IjpyLmFsaWduW29dPW51bGwpfWZvcihpPXIucm93cy5sZW5ndGgsbz0wO288aTtvKyspci5yb3dzW29dPU8wKHIucm93c1tvXSxyLmhlYWRlci5sZW5ndGgpLm1hcCh1PT4oe3RleHQ6dSx0b2tlbnM6W119KSk7Zm9yKGk9ci5oZWFkZXIubGVuZ3RoLGw9MDtsPGk7bCsrKXIuaGVhZGVyW2xdLnRva2Vucz10aGlzLmxleGVyLmlubGluZShyLmhlYWRlcltsXS50ZXh0KTtmb3IoaT1yLnJvd3MubGVuZ3RoLGw9MDtsPGk7bCsrKWZvcihhPXIucm93c1tsXSxzPTA7czxhLmxlbmd0aDtzKyspYVtzXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoYVtzXS50ZXh0KTtyZXR1cm4gcn19fWxoZWFkaW5nKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKGUpO2lmKG4pcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0Om5bMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5bMV0pfX1wYXJhZ3JhcGgoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blsxXS5jaGFyQXQoblsxXS5sZW5ndGgtMSk9PT1gCmA/blsxXS5zbGljZSgwLC0xKTpuWzFdO3JldHVybnt0eXBlOiJwYXJhZ3JhcGgiLHJhdzpuWzBdLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX10ZXh0KGUpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpuWzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzBdKX19ZXNjYXBlKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToiZXNjYXBlIixyYXc6blswXSx0ZXh0Ok1uKG5bMV0pfX10YWcoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhlKTtpZihuKXJldHVybiF0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148YSAvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSEwOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rJiYvXjxcL2E+L2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSExKSwhdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjwocHJlfGNvZGV8a2JkfHNjcmlwdCkoXHN8PikvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJi9ePFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMSkse3R5cGU6Imh0bWwiLHJhdzpuWzBdLGluTGluazp0aGlzLmxleGVyLnN0YXRlLmluTGluayxpblJhd0Jsb2NrOnRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxibG9jazohMSx0ZXh0Om5bMF19fWxpbmsoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoZSk7aWYobil7Y29uc3Qgcj1uWzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiYvXjwvLnRlc3Qocikpe2lmKCEvPiQvLnRlc3QocikpcmV0dXJuO2NvbnN0IGw9Z2Moci5zbGljZSgwLC0xKSwiXFwiKTtpZigoci5sZW5ndGgtbC5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2NvbnN0IGw9ZlIoblsyXSwiKCkiKTtpZihsPi0xKXtjb25zdCBhPShuWzBdLmluZGV4T2YoIiEiKT09PTA/NTo0KStuWzFdLmxlbmd0aCtsO25bMl09blsyXS5zdWJzdHJpbmcoMCxsKSxuWzBdPW5bMF0uc3Vic3RyaW5nKDAsYSkudHJpbSgpLG5bM109IiJ9fWxldCBpPW5bMl0sbz0iIjtpZih0aGlzLm9wdGlvbnMucGVkYW50aWMpe2NvbnN0IGw9L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLy5leGVjKGkpO2wmJihpPWxbMV0sbz1sWzNdKX1lbHNlIG89blszXT9uWzNdLnNsaWNlKDEsLTEpOiIiO3JldHVybiBpPWkudHJpbSgpLC9ePC8udGVzdChpKSYmKHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmIS8+JC8udGVzdChyKT9pPWkuc2xpY2UoMSk6aT1pLnNsaWNlKDEsLTEpKSxQMChuLHtocmVmOmkmJmkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKSx0aXRsZTpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIil9LG5bMF0sdGhpcy5sZXhlcil9fXJlZmxpbmsoZSxuKXtsZXQgcjtpZigocj10aGlzLnJ1bGVzLmlubGluZS5yZWZsaW5rLmV4ZWMoZSkpfHwocj10aGlzLnJ1bGVzLmlubGluZS5ub2xpbmsuZXhlYyhlKSkpe2xldCBpPShyWzJdfHxyWzFdKS5yZXBsYWNlKC9ccysvZywiICIpO2lmKGk9bltpLnRvTG93ZXJDYXNlKCldLCFpKXtjb25zdCBvPXJbMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6byx0ZXh0Om99fXJldHVybiBQMChyLGksclswXSx0aGlzLmxleGVyKX19ZW1TdHJvbmcoZSxuLHI9IiIpe2xldCBpPXRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLmxEZWxpbS5leGVjKGUpO2lmKCFpfHxpWzNdJiZyLm1hdGNoKC9bXHB7TH1ccHtOfV0vdSkpcmV0dXJuO2lmKCEoaVsxXXx8aVsyXXx8IiIpfHwhcnx8dGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhyKSl7Y29uc3QgbD1bLi4uaVswXV0ubGVuZ3RoLTE7bGV0IHMsYSx1PWwsYz0wO2NvbnN0IGQ9aVswXVswXT09PSIqIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5yRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltVW5kO2ZvcihkLmxhc3RJbmRleD0wLG49bi5zbGljZSgtMSplLmxlbmd0aCtsKTsoaT1kLmV4ZWMobikpIT1udWxsOyl7aWYocz1pWzFdfHxpWzJdfHxpWzNdfHxpWzRdfHxpWzVdfHxpWzZdLCFzKWNvbnRpbnVlO2lmKGE9Wy4uLnNdLmxlbmd0aCxpWzNdfHxpWzRdKXt1Kz1hO2NvbnRpbnVlfWVsc2UgaWYoKGlbNV18fGlbNl0pJiZsJTMmJiEoKGwrYSklMykpe2MrPWE7Y29udGludWV9aWYodS09YSx1PjApY29udGludWU7YT1NYXRoLm1pbihhLGErdStjKTtjb25zdCBmPVsuLi5pWzBdXVswXS5sZW5ndGgsaD1lLnNsaWNlKDAsbCtpLmluZGV4K2YrYSk7aWYoTWF0aC5taW4obCxhKSUyKXtjb25zdCBnPWguc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6ImVtIixyYXc6aCx0ZXh0OmcsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGcpfX1jb25zdCBtPWguc2xpY2UoMiwtMik7cmV0dXJue3R5cGU6InN0cm9uZyIscmF3OmgsdGV4dDptLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhtKX19fX1jb2Rlc3BhbihlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzJdLnJlcGxhY2UoL1xuL2csIiAiKTtjb25zdCBpPS9bXiBdLy50ZXN0KHIpLG89L14gLy50ZXN0KHIpJiYvICQvLnRlc3Qocik7cmV0dXJuIGkmJm8mJihyPXIuc3Vic3RyaW5nKDEsci5sZW5ndGgtMSkpLHI9TW4ociwhMCkse3R5cGU6ImNvZGVzcGFuIixyYXc6blswXSx0ZXh0OnJ9fX1icihlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmJyLmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToiYnIiLHJhdzpuWzBdfX1kZWwoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5kZWwuZXhlYyhlKTtpZihuKXJldHVybnt0eXBlOiJkZWwiLHJhdzpuWzBdLHRleHQ6blsyXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoblsyXSl9fWF1dG9saW5rKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhlKTtpZihuKXtsZXQgcixpO3JldHVybiBuWzJdPT09IkAiPyhyPU1uKG5bMV0pLGk9Im1haWx0bzoiK3IpOihyPU1uKG5bMV0pLGk9cikse3R5cGU6ImxpbmsiLHJhdzpuWzBdLHRleHQ6cixocmVmOmksdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OnIsdGV4dDpyfV19fX11cmwoZSl7bGV0IG47aWYobj10aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhlKSl7bGV0IHIsaTtpZihuWzJdPT09IkAiKXI9TW4oblswXSksaT0ibWFpbHRvOiIrcjtlbHNle2xldCBvO2RvIG89blswXSxuWzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhuWzBdKVswXTt3aGlsZShvIT09blswXSk7cj1NbihuWzBdKSxuWzFdPT09Ind3dy4iP2k9Imh0dHA6Ly8iK25bMF06aT1uWzBdfXJldHVybnt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjppLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19aW5saW5lVGV4dChlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZihuKXtsZXQgcjtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrP3I9blswXTpyPU1uKG5bMF0pLHt0eXBlOiJ0ZXh0IixyYXc6blswXSx0ZXh0OnJ9fX19Y29uc3QgY2U9e25ld2xpbmU6L14oPzogKig/OlxufCQpKSsvLGNvZGU6L14oIHs0fVteXG5dKyg/OlxuKD86ICooPzpcbnwkKSkqKT8pKy8sZmVuY2VzOi9eIHswLDN9KGB7Myx9KD89W15gXG5dKig/OlxufCQpKXx+ezMsfSkoW15cbl0qKSg/OlxufCQpKD86fChbXHNcU10qPykoPzpcbnwkKSkoPzogezAsM31cMVt+YF0qICooPz1cbnwkKXwkKS8saHI6L14gezAsM30oKD86LVtcdCBdKil7Myx9fCg/Ol9bIFx0XSopezMsfXwoPzpcKlsgXHRdKil7Myx9KSg/OlxuK3wkKS8saGVhZGluZzovXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxibG9ja3F1b3RlOi9eKCB7MCwzfT4gPyhwYXJhZ3JhcGh8W15cbl0qKSg/OlxufCQpKSsvLGxpc3Q6L14oIHswLDN9YnVsbCkoWyBcdF1bXlxuXSs/KT8oPzpcbnwkKS8saHRtbDoiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxzPl1bXFxzXFxTXSo/KD86PC9cXDE+W15cXG5dKlxcbit8JCl8Y29tbWVudFteXFxuXSooXFxuK3wkKXw8XFw/W1xcc1xcU10qPyg/OlxcPz5cXG4qfCQpfDwhW0EtWl1bXFxzXFxTXSo/KD86Plxcbip8JCl8PCFcXFtDREFUQVxcW1tcXHNcXFNdKj8oPzpcXF1cXF0+XFxuKnwkKXw8Lz8odGFnKSg/OiArfFxcbnwvPz4pW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcdy1dKlxccyo+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKSkiLGRlZjovXiB7MCwzfVxbKGxhYmVsKVxdOiAqKD86XG4gKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuICopP3wgKlxuICopKHRpdGxlKSk/ICooPzpcbit8JCkvLHRhYmxlOndkLGxoZWFkaW5nOi9eKD8hYnVsbCApKCg/Oi58XG4oPyFccyo/XG58YnVsbCApKSs/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxfcGFyYWdyYXBoOi9eKFteXG5dKyg/OlxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcbilbXlxuXSspKikvLHRleHQ6L15bXlxuXSsvfTtjZS5fbGFiZWw9Lyg/IVxzKlxdKSg/OlxcLnxbXlxbXF1cXF0pKy87Y2UuX3RpdGxlPS8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvO2NlLmRlZj1CZShjZS5kZWYpLnJlcGxhY2UoImxhYmVsIixjZS5fbGFiZWwpLnJlcGxhY2UoInRpdGxlIixjZS5fdGl0bGUpLmdldFJlZ2V4KCk7Y2UuYnVsbGV0PS8oPzpbKistXXxcZHsxLDl9Wy4pXSkvO2NlLmxpc3RJdGVtU3RhcnQ9QmUoL14oICopKGJ1bGwpICovKS5yZXBsYWNlKCJidWxsIixjZS5idWxsZXQpLmdldFJlZ2V4KCk7Y2UubGlzdD1CZShjZS5saXN0KS5yZXBsYWNlKC9idWxsL2csY2UuYnVsbGV0KS5yZXBsYWNlKCJociIsIlxcbisoPz1cXDE/KD86KD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpKSIpLnJlcGxhY2UoImRlZiIsIlxcbisoPz0iK2NlLmRlZi5zb3VyY2UrIikiKS5nZXRSZWdleCgpO2NlLl90YWc9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlY3Rpb258c291cmNlfHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiO2NlLl9jb21tZW50PS88IS0tKD8hLT8+KVtcc1xTXSo/KD86LS0+fCQpLztjZS5odG1sPUJlKGNlLmh0bWwsImkiKS5yZXBsYWNlKCJjb21tZW50IixjZS5fY29tbWVudCkucmVwbGFjZSgidGFnIixjZS5fdGFnKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpO2NlLmxoZWFkaW5nPUJlKGNlLmxoZWFkaW5nKS5yZXBsYWNlKC9idWxsL2csY2UuYnVsbGV0KS5nZXRSZWdleCgpO2NlLnBhcmFncmFwaD1CZShjZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsY2UuX3RhZykuZ2V0UmVnZXgoKTtjZS5ibG9ja3F1b3RlPUJlKGNlLmJsb2NrcXVvdGUpLnJlcGxhY2UoInBhcmFncmFwaCIsY2UucGFyYWdyYXBoKS5nZXRSZWdleCgpO2NlLm5vcm1hbD17Li4uY2V9O2NlLmdmbT17Li4uY2Uubm9ybWFsLHRhYmxlOiJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSJ9O2NlLmdmbS50YWJsZT1CZShjZS5nZm0udGFibGUpLnJlcGxhY2UoImhyIixjZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIiB7NH1bXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLGNlLl90YWcpLmdldFJlZ2V4KCk7Y2UuZ2ZtLnBhcmFncmFwaD1CZShjZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ0YWJsZSIsY2UuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsY2UuX3RhZykuZ2V0UmVnZXgoKTtjZS5wZWRhbnRpYz17Li4uY2Uubm9ybWFsLGh0bWw6QmUoYF4gKig/OmNvbW1lbnQgKig/OlxcbnxcXHMqJCl8PCh0YWcpW1xcc1xcU10rPzwvXFwxPiAqKD86XFxuezIsfXxcXHMqJCl8PHRhZyg/OiJbXiJdKiJ8J1teJ10qJ3xcXHNbXiciLz5cXHNdKikqPy8/PiAqKD86XFxuezIsfXxcXHMqJCkpYCkucmVwbGFjZSgiY29tbWVudCIsY2UuX2NvbW1lbnQpLnJlcGxhY2UoL3RhZy9nLCIoPyEoPzphfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3VifHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZylcXGIpXFx3Kyg/ITp8W15cXHdcXHNAXSpAKVxcYiIpLmdldFJlZ2V4KCksZGVmOi9eICpcWyhbXlxdXSspXF06ICo8PyhbXlxzPl0rKT4/KD86ICsoWyIoXVteXG5dK1siKV0pKT8gKig/OlxuK3wkKS8saGVhZGluZzovXigjezEsNn0pKC4qKSg/OlxuK3wkKS8sZmVuY2VzOndkLGxoZWFkaW5nOi9eKC4rPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8scGFyYWdyYXBoOkJlKGNlLm5vcm1hbC5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLGAgKiN7MSw2fSAqW14KXWApLnJlcGxhY2UoImxoZWFkaW5nIixjZS5saGVhZGluZykucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJ8ZmVuY2VzIiwiIikucmVwbGFjZSgifGxpc3QiLCIiKS5yZXBsYWNlKCJ8aHRtbCIsIiIpLmdldFJlZ2V4KCl9O2NvbnN0IFg9e2VzY2FwZTovXlxcKFshIiMkJSYnKCkqKyxcLS4vOjs8PT4/QFxbXF1cXF5fYHt8fX5dKS8sYXV0b2xpbms6L148KHNjaGVtZTpbXlxzXHgwMC1ceDFmPD5dKnxlbWFpbCk+Lyx1cmw6d2QsdGFnOiJeY29tbWVudHxePC9bYS16QS1aXVtcXHc6LV0qXFxzKj58XjxbYS16QS1aXVtcXHctXSooPzphdHRyaWJ1dGUpKj9cXHMqLz8+fF48XFw/W1xcc1xcU10qP1xcPz58XjwhW2EtekEtWl0rXFxzW1xcc1xcU10qPz58XjwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPiIsbGluazovXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/OlxzKyh0aXRsZSkpP1xzKlwpLyxyZWZsaW5rOi9eIT9cWyhsYWJlbClcXVxbKHJlZilcXS8sbm9saW5rOi9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vLHJlZmxpbmtTZWFyY2g6InJlZmxpbmt8bm9saW5rKD8hXFwoKSIsZW1TdHJvbmc6e2xEZWxpbTovXig/OlwqKyg/OigoPyFcKilbcHVuY3RdKXxbXlxzKl0pKXxeXysoPzooKD8hXylbcHVuY3RdKXwoW15cc19dKSkvLHJEZWxpbUFzdDovXlteXypdKj9fX1teXypdKj9cKlteXypdKj8oPz1fXyl8W14qXSsoPz1bXipdKXwoPyFcKilbcHVuY3RdKFwqKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXCorKSg/IVwqKSg/PVtwdW5jdFxzXXwkKXwoPyFcKilbcHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pfFtcc10oXCorKSg/IVwqKSg/PVtwdW5jdF0pfCg/IVwqKVtwdW5jdF0oXCorKSg/IVwqKSg/PVtwdW5jdF0pfFtecHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pLyxyRGVsaW1VbmQ6L15bXl8qXSo/XCpcKlteXypdKj9fW15fKl0qPyg/PVwqXCopfFteX10rKD89W15fXSl8KD8hXylbcHVuY3RdKF8rKSg/PVtcc118JCl8W15wdW5jdFxzXShfKykoPyFfKSg/PVtwdW5jdFxzXXwkKXwoPyFfKVtwdW5jdFxzXShfKykoPz1bXnB1bmN0XHNdKXxbXHNdKF8rKSg/IV8pKD89W3B1bmN0XSl8KD8hXylbcHVuY3RdKF8rKSg/IV8pKD89W3B1bmN0XSkvfSxjb2RlOi9eKGArKShbXmBdfFteYF1bXHNcU10qP1teYF0pXDEoPyFgKS8sYnI6L14oIHsyLH18XFwpXG4oPyFccyokKS8sZGVsOndkLHRleHQ6L14oYCt8W15gXSkoPzooPz0gezIsfVxuKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKl9dfFxiX3wkKXxbXiBdKD89IHsyLH1cbikpKS8scHVuY3R1YXRpb246L14oKD8hWypfXSlbXHNwdW5jdHVhdGlvbl0pL307WC5fcHVuY3R1YXRpb249IlxccHtQfSQrPD0+YF58fiI7WC5wdW5jdHVhdGlvbj1CZShYLnB1bmN0dWF0aW9uLCJ1IikucmVwbGFjZSgvcHVuY3R1YXRpb24vZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLmJsb2NrU2tpcD0vXFtbXltcXV0qP1xdXChbXlwoXCldKj9cKXxgW15gXSo/YHw8W148Pl0qPz4vZztYLmFueVB1bmN0dWF0aW9uPS9cXFtwdW5jdF0vZztYLl9lc2NhcGVzPS9cXChbcHVuY3RdKS9nO1guX2NvbW1lbnQ9QmUoY2UuX2NvbW1lbnQpLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCk7WC5lbVN0cm9uZy5sRGVsaW09QmUoWC5lbVN0cm9uZy5sRGVsaW0sInUiKS5yZXBsYWNlKC9wdW5jdC9nLFguX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1guZW1TdHJvbmcuckRlbGltQXN0PUJlKFguZW1TdHJvbmcuckRlbGltQXN0LCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWC5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WC5lbVN0cm9uZy5yRGVsaW1VbmQ9QmUoWC5lbVN0cm9uZy5yRGVsaW1VbmQsImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLmFueVB1bmN0dWF0aW9uPUJlKFguYW55UHVuY3R1YXRpb24sImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLl9lc2NhcGVzPUJlKFguX2VzY2FwZXMsImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLl9zY2hlbWU9L1thLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0vO1guX2VtYWlsPS9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS87WC5hdXRvbGluaz1CZShYLmF1dG9saW5rKS5yZXBsYWNlKCJzY2hlbWUiLFguX3NjaGVtZSkucmVwbGFjZSgiZW1haWwiLFguX2VtYWlsKS5nZXRSZWdleCgpO1guX2F0dHJpYnV0ZT0vXHMrW2EtekEtWjpfXVtcdy46LV0qKD86XHMqPVxzKiJbXiJdKiJ8XHMqPVxzKidbXiddKid8XHMqPVxzKlteXHMiJz08PmBdKyk/LztYLnRhZz1CZShYLnRhZykucmVwbGFjZSgiY29tbWVudCIsWC5fY29tbWVudCkucmVwbGFjZSgiYXR0cmlidXRlIixYLl9hdHRyaWJ1dGUpLmdldFJlZ2V4KCk7WC5fbGFiZWw9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy87WC5faHJlZj0vPCg/OlxcLnxbXlxuPD5cXF0pKz58W15cc1x4MDAtXHgxZl0qLztYLl90aXRsZT0vIig/OlxcIj98W14iXFxdKSoifCcoPzpcXCc/fFteJ1xcXSkqJ3xcKCg/OlxcXCk/fFteKVxcXSkqXCkvO1gubGluaz1CZShYLmxpbmspLnJlcGxhY2UoImxhYmVsIixYLl9sYWJlbCkucmVwbGFjZSgiaHJlZiIsWC5faHJlZikucmVwbGFjZSgidGl0bGUiLFguX3RpdGxlKS5nZXRSZWdleCgpO1gucmVmbGluaz1CZShYLnJlZmxpbmspLnJlcGxhY2UoImxhYmVsIixYLl9sYWJlbCkucmVwbGFjZSgicmVmIixjZS5fbGFiZWwpLmdldFJlZ2V4KCk7WC5ub2xpbms9QmUoWC5ub2xpbmspLnJlcGxhY2UoInJlZiIsY2UuX2xhYmVsKS5nZXRSZWdleCgpO1gucmVmbGlua1NlYXJjaD1CZShYLnJlZmxpbmtTZWFyY2gsImciKS5yZXBsYWNlKCJyZWZsaW5rIixYLnJlZmxpbmspLnJlcGxhY2UoIm5vbGluayIsWC5ub2xpbmspLmdldFJlZ2V4KCk7WC5ub3JtYWw9ey4uLlh9O1gucGVkYW50aWM9ey4uLlgubm9ybWFsLHN0cm9uZzp7c3RhcnQ6L15fX3xcKlwqLyxtaWRkbGU6L15fXyg/PVxTKShbXHNcU10qP1xTKV9fKD8hXyl8XlwqXCooPz1cUykoW1xzXFNdKj9cUylcKlwqKD8hXCopLyxlbmRBc3Q6L1wqXCooPyFcKikvZyxlbmRVbmQ6L19fKD8hXykvZ30sZW06e3N0YXJ0Oi9eX3xcKi8sbWlkZGxlOi9eKClcKig/PVxTKShbXHNcU10qP1xTKVwqKD8hXCopfF5fKD89XFMpKFtcc1xTXSo/XFMpXyg/IV8pLyxlbmRBc3Q6L1wqKD8hXCopL2csZW5kVW5kOi9fKD8hXykvZ30sbGluazpCZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsWC5fbGFiZWwpLmdldFJlZ2V4KCkscmVmbGluazpCZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsWC5fbGFiZWwpLmdldFJlZ2V4KCl9O1guZ2ZtPXsuLi5YLm5vcm1hbCxlc2NhcGU6QmUoWC5lc2NhcGUpLnJlcGxhY2UoIl0pIiwifnxdKSIpLmdldFJlZ2V4KCksX2V4dGVuZGVkX2VtYWlsOi9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLyx1cmw6L14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nIn4oKSZdK3xcKFteKV0qXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nIn4pXSsoPyEkKSkrLyxkZWw6L14ofn4/KSg/PVteXHN+XSkoW1xzXFNdKj9bXlxzfl0pXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99O1guZ2ZtLnVybD1CZShYLmdmbS51cmwsImkiKS5yZXBsYWNlKCJlbWFpbCIsWC5nZm0uX2V4dGVuZGVkX2VtYWlsKS5nZXRSZWdleCgpO1guYnJlYWtzPXsuLi5YLmdmbSxicjpCZShYLmJyKS5yZXBsYWNlKCJ7Mix9IiwiKiIpLmdldFJlZ2V4KCksdGV4dDpCZShYLmdmbS50ZXh0KS5yZXBsYWNlKCJcXGJfIiwiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCIqIikuZ2V0UmVnZXgoKX07Y2xhc3MgSXJ7Y29uc3RydWN0b3IoZSl7SmUodGhpcywidG9rZW5zIik7SmUodGhpcywib3B0aW9ucyIpO0plKHRoaXMsInN0YXRlIik7SmUodGhpcywidG9rZW5pemVyIik7SmUodGhpcywiaW5saW5lUXVldWUiKTt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz1lfHxsbCx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBTZCx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2NvbnN0IG49e2Jsb2NrOmNlLm5vcm1hbCxpbmxpbmU6WC5ub3JtYWx9O3RoaXMub3B0aW9ucy5wZWRhbnRpYz8obi5ibG9jaz1jZS5wZWRhbnRpYyxuLmlubGluZT1YLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1jZS5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT1YLmJyZWFrczpuLmlubGluZT1YLmdmbSksdGhpcy50b2tlbml6ZXIucnVsZXM9bn1zdGF0aWMgZ2V0IHJ1bGVzKCl7cmV0dXJue2Jsb2NrOmNlLGlubGluZTpYfX1zdGF0aWMgbGV4KGUsbil7cmV0dXJuIG5ldyBJcihuKS5sZXgoZSl9c3RhdGljIGxleElubGluZShlLG4pe3JldHVybiBuZXcgSXIobikuaW5saW5lVG9rZW5zKGUpfWxleChlKXtlPWUucmVwbGFjZSgvXHJcbnxcci9nLGAKYCksdGhpcy5ibG9ja1Rva2VucyhlLHRoaXMudG9rZW5zKTtsZXQgbjtmb3IoO249dGhpcy5pbmxpbmVRdWV1ZS5zaGlmdCgpOyl0aGlzLmlubGluZVRva2VucyhuLnNyYyxuLnRva2Vucyk7cmV0dXJuIHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKGUsbj1bXSl7dGhpcy5vcHRpb25zLnBlZGFudGljP2U9ZS5yZXBsYWNlKC9cdC9nLCIgICAgIikucmVwbGFjZSgvXiArJC9nbSwiIik6ZT1lLnJlcGxhY2UoL14oICopKFx0KykvZ20sKHMsYSx1KT0+YSsiICAgICIucmVwZWF0KHUubGVuZ3RoKSk7bGV0IHIsaSxvLGw7Zm9yKDtlOylpZighKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9jayYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2suc29tZShzPT4ocj1zLmNhbGwoe2xleGVyOnRoaXN9LGUsbikpPyhlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpKXtpZihyPXRoaXMudG9rZW5pemVyLnNwYWNlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcubGVuZ3RoPT09MSYmbi5sZW5ndGg+MD9uW24ubGVuZ3RoLTFdLnJhdys9YApgOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmKGkudHlwZT09PSJwYXJhZ3JhcGgifHxpLnR5cGU9PT0idGV4dCIpPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmZlbmNlcyhlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmhlYWRpbmcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ocihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saXN0KGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHRtbChlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlZihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLGk9bltuLmxlbmd0aC0xXSxpJiYoaS50eXBlPT09InBhcmFncmFwaCJ8fGkudHlwZT09PSJ0ZXh0Iik/KGkucmF3Kz1gCmArci5yYXcsaS50ZXh0Kz1gCmArci5yYXcsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTp0aGlzLnRva2Vucy5saW5rc1tyLnRhZ118fCh0aGlzLnRva2Vucy5saW5rc1tyLnRhZ109e2hyZWY6ci5ocmVmLHRpdGxlOnIudGl0bGV9KTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhYmxlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGhlYWRpbmcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYobz1lLHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrKXtsZXQgcz0xLzA7Y29uc3QgYT1lLnNsaWNlKDEpO2xldCB1O3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaChjPT57dT1jLmNhbGwoe2xleGVyOnRoaXN9LGEpLHR5cGVvZiB1PT0ibnVtYmVyIiYmdT49MCYmKHM9TWF0aC5taW4ocyx1KSl9KSxzPDEvMCYmcz49MCYmKG89ZS5zdWJzdHJpbmcoMCxzKzEpKX1pZih0aGlzLnN0YXRlLnRvcCYmKHI9dGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKG8pKSl7aT1uW24ubGVuZ3RoLTFdLGwmJmkudHlwZT09PSJwYXJhZ3JhcGgiPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPWkudGV4dCk6bi5wdXNoKHIpLGw9by5sZW5ndGghPT1lLmxlbmd0aCxlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50ZXh0KGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJmkudHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihlKXtjb25zdCBzPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrZS5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3Iocyk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3Iocyl9fXJldHVybiB0aGlzLnN0YXRlLnRvcD0hMCxufWlubGluZShlLG49W10pe3JldHVybiB0aGlzLmlubGluZVF1ZXVlLnB1c2goe3NyYzplLHRva2VuczpufSksbn1pbmxpbmVUb2tlbnMoZSxuPVtdKXtsZXQgcixpLG8sbD1lLHMsYSx1O2lmKHRoaXMudG9rZW5zLmxpbmtzKXtjb25zdCBjPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihjLmxlbmd0aD4wKWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhsKSkhPW51bGw7KWMuaW5jbHVkZXMoc1swXS5zbGljZShzWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYobD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiWyIrImEiLnJlcGVhdChzWzBdLmxlbmd0aC0yKSsiXSIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhsKSkhPW51bGw7KWw9bC5zbGljZSgwLHMuaW5kZXgpKyIrKyIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoO2U7KWlmKGF8fCh1PSIiKSxhPSExLCEodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZSYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuaW5saW5lLnNvbWUoYz0+KHI9Yy5jYWxsKHtsZXhlcjp0aGlzfSxlLG4pKT8oZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5lc2NhcGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmci50eXBlPT09InRleHQiJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGluayhlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnJlZmxpbmsoZSx0aGlzLnRva2Vucy5saW5rcykpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmci50eXBlPT09InRleHQiJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoZSxsLHUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4oZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5icihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlbChlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHI9dGhpcy50b2tlbml6ZXIudXJsKGUpKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihvPWUsdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lKXtsZXQgYz0xLzA7Y29uc3QgZD1lLnNsaWNlKDEpO2xldCBmO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2goaD0+e2Y9aC5jYWxsKHtsZXhlcjp0aGlzfSxkKSx0eXBlb2YgZj09Im51bWJlciImJmY+PTAmJihjPU1hdGgubWluKGMsZikpfSksYzwxLzAmJmM+PTAmJihvPWUuc3Vic3RyaW5nKDAsYysxKSl9aWYocj10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KG8pKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcuc2xpY2UoLTEpIT09Il8iJiYodT1yLnJhdy5zbGljZSgtMSkpLGE9ITAsaT1uW24ubGVuZ3RoLTFdLGkmJmkudHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPXIucmF3LGkudGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYoZSl7Y29uc3QgYz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK2UuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGMpfX1yZXR1cm4gbn19Y2xhc3MgRWR7Y29uc3RydWN0b3IoZSl7SmUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz1lfHxsbH1jb2RlKGUsbixyKXt2YXIgbztjb25zdCBpPShvPShufHwiIikubWF0Y2goL15cUyovKSk9PW51bGw/dm9pZCAwOm9bMF07cmV0dXJuIGU9ZS5yZXBsYWNlKC9cbiQvLCIiKStgCmAsaT8nPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtJytNbihpKSsnIj4nKyhyP2U6TW4oZSwhMCkpK2A8L2NvZGU+PC9wcmU+CmA6IjxwcmU+PGNvZGU+Iisocj9lOk1uKGUsITApKStgPC9jb2RlPjwvcHJlPgpgfWJsb2NrcXVvdGUoZSl7cmV0dXJuYDxibG9ja3F1b3RlPgoke2V9PC9ibG9ja3F1b3RlPgpgfWh0bWwoZSxuKXtyZXR1cm4gZX1oZWFkaW5nKGUsbixyKXtyZXR1cm5gPGgke259PiR7ZX08L2gke259PgpgfWhyKCl7cmV0dXJuYDxocj4KYH1saXN0KGUsbixyKXtjb25zdCBpPW4/Im9sIjoidWwiLG89biYmciE9PTE/JyBzdGFydD0iJytyKyciJzoiIjtyZXR1cm4iPCIraStvK2A+CmArZSsiPC8iK2krYD4KYH1saXN0aXRlbShlLG4scil7cmV0dXJuYDxsaT4ke2V9PC9saT4KYH1jaGVja2JveChlKXtyZXR1cm4iPGlucHV0ICIrKGU/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaChlKXtyZXR1cm5gPHA+JHtlfTwvcD4KYH10YWJsZShlLG4pe3JldHVybiBuJiYobj1gPHRib2R5PiR7bn08L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCtlK2A8L3RoZWFkPgpgK24rYDwvdGFibGU+CmB9dGFibGVyb3coZSl7cmV0dXJuYDx0cj4KJHtlfTwvdHI+CmB9dGFibGVjZWxsKGUsbil7Y29uc3Qgcj1uLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKG4uYWxpZ24/YDwke3J9IGFsaWduPSIke24uYWxpZ259Ij5gOmA8JHtyfT5gKStlK2A8LyR7cn0+CmB9c3Ryb25nKGUpe3JldHVybmA8c3Ryb25nPiR7ZX08L3N0cm9uZz5gfWVtKGUpe3JldHVybmA8ZW0+JHtlfTwvZW0+YH1jb2Rlc3BhbihlKXtyZXR1cm5gPGNvZGU+JHtlfTwvY29kZT5gfWJyKCl7cmV0dXJuIjxicj4ifWRlbChlKXtyZXR1cm5gPGRlbD4ke2V9PC9kZWw+YH1saW5rKGUsbixyKXtjb25zdCBpPVIwKGUpO2lmKGk9PT1udWxsKXJldHVybiByO2U9aTtsZXQgbz0nPGEgaHJlZj0iJytlKyciJztyZXR1cm4gbiYmKG8rPScgdGl0bGU9IicrbisnIicpLG8rPSI+IityKyI8L2E+IixvfWltYWdlKGUsbixyKXtjb25zdCBpPVIwKGUpO2lmKGk9PT1udWxsKXJldHVybiByO2U9aTtsZXQgbz1gPGltZyBzcmM9IiR7ZX0iIGFsdD0iJHtyfSJgO3JldHVybiBuJiYobys9YCB0aXRsZT0iJHtufSJgKSxvKz0iPiIsb310ZXh0KGUpe3JldHVybiBlfX1jbGFzcyBldntzdHJvbmcoZSl7cmV0dXJuIGV9ZW0oZSl7cmV0dXJuIGV9Y29kZXNwYW4oZSl7cmV0dXJuIGV9ZGVsKGUpe3JldHVybiBlfWh0bWwoZSl7cmV0dXJuIGV9dGV4dChlKXtyZXR1cm4gZX1saW5rKGUsbixyKXtyZXR1cm4iIityfWltYWdlKGUsbixyKXtyZXR1cm4iIityfWJyKCl7cmV0dXJuIiJ9fWNsYXNzIERye2NvbnN0cnVjdG9yKGUpe0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJyZW5kZXJlciIpO0plKHRoaXMsInRleHRSZW5kZXJlciIpO3RoaXMub3B0aW9ucz1lfHxsbCx0aGlzLm9wdGlvbnMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyfHxuZXcgRWQsdGhpcy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXIsdGhpcy5yZW5kZXJlci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRleHRSZW5kZXJlcj1uZXcgZXZ9c3RhdGljIHBhcnNlKGUsbil7cmV0dXJuIG5ldyBEcihuKS5wYXJzZShlKX1zdGF0aWMgcGFyc2VJbmxpbmUoZSxuKXtyZXR1cm4gbmV3IERyKG4pLnBhcnNlSW5saW5lKGUpfXBhcnNlKGUsbj0hMCl7bGV0IHI9IiI7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2NvbnN0IG89ZVtpXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXSl7Y29uc3QgbD1vLHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2wudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGwpO2lmKHMhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMobC50eXBlKSl7cis9c3x8IiI7Y29udGludWV9fXN3aXRjaChvLnR5cGUpe2Nhc2Uic3BhY2UiOmNvbnRpbnVlO2Nhc2UiaHIiOntyKz10aGlzLnJlbmRlcmVyLmhyKCk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSxsLmRlcHRoLGNSKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsdGhpcy50ZXh0UmVuZGVyZXIpKSk7Y29udGludWV9Y2FzZSJjb2RlIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuY29kZShsLnRleHQsbC5sYW5nLCEhbC5lc2NhcGVkKTtjb250aW51ZX1jYXNlInRhYmxlIjp7Y29uc3QgbD1vO2xldCBzPSIiLGE9IiI7Zm9yKGxldCBjPTA7YzxsLmhlYWRlci5sZW5ndGg7YysrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUobC5oZWFkZXJbY10udG9rZW5zKSx7aGVhZGVyOiEwLGFsaWduOmwuYWxpZ25bY119KTtzKz10aGlzLnJlbmRlcmVyLnRhYmxlcm93KGEpO2xldCB1PSIiO2ZvcihsZXQgYz0wO2M8bC5yb3dzLmxlbmd0aDtjKyspe2NvbnN0IGQ9bC5yb3dzW2NdO2E9IiI7Zm9yKGxldCBmPTA7ZjxkLmxlbmd0aDtmKyspYSs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5wYXJzZUlubGluZShkW2ZdLnRva2Vucykse2hlYWRlcjohMSxhbGlnbjpsLmFsaWduW2ZdfSk7dSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKX1yKz10aGlzLnJlbmRlcmVyLnRhYmxlKHMsdSk7Y29udGludWV9Y2FzZSJibG9ja3F1b3RlIjp7Y29uc3QgbD1vLHM9dGhpcy5wYXJzZShsLnRva2Vucyk7cis9dGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHMpO2NvbnRpbnVlfWNhc2UibGlzdCI6e2NvbnN0IGw9byxzPWwub3JkZXJlZCxhPWwuc3RhcnQsdT1sLmxvb3NlO2xldCBjPSIiO2ZvcihsZXQgZD0wO2Q8bC5pdGVtcy5sZW5ndGg7ZCsrKXtjb25zdCBmPWwuaXRlbXNbZF0saD1mLmNoZWNrZWQsbT1mLnRhc2s7bGV0IGc9IiI7aWYoZi50YXNrKXtjb25zdCB3PXRoaXMucmVuZGVyZXIuY2hlY2tib3goISFoKTt1P2YudG9rZW5zLmxlbmd0aD4wJiZmLnRva2Vuc1swXS50eXBlPT09InBhcmFncmFwaCI/KGYudG9rZW5zWzBdLnRleHQ9dysiICIrZi50b2tlbnNbMF0udGV4dCxmLnRva2Vuc1swXS50b2tlbnMmJmYudG9rZW5zWzBdLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udG9rZW5zWzBdLnR5cGU9PT0idGV4dCImJihmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dD13KyIgIitmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCkpOmYudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHRleHQ6dysiICJ9KTpnKz13KyIgIn1nKz10aGlzLnBhcnNlKGYudG9rZW5zLHUpLGMrPXRoaXMucmVuZGVyZXIubGlzdGl0ZW0oZyxtLCEhaCl9cis9dGhpcy5yZW5kZXJlci5saXN0KGMscyxhKTtjb250aW51ZX1jYXNlImh0bWwiOntjb25zdCBsPW87cis9dGhpcy5yZW5kZXJlci5odG1sKGwudGV4dCxsLmJsb2NrKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSk7Y29udGludWV9Y2FzZSJ0ZXh0Ijp7bGV0IGw9byxzPWwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dDtmb3IoO2krMTxlLmxlbmd0aCYmZVtpKzFdLnR5cGU9PT0idGV4dCI7KWw9ZVsrK2ldLHMrPWAKYCsobC50b2tlbnM/dGhpcy5wYXJzZUlubGluZShsLnRva2Vucyk6bC50ZXh0KTtyKz1uP3RoaXMucmVuZGVyZXIucGFyYWdyYXBoKHMpOnM7Y29udGludWV9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytvLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn1wYXJzZUlubGluZShlLG4pe249bnx8dGhpcy5yZW5kZXJlcjtsZXQgcj0iIjtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3Qgbz1lW2ldO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tvLnR5cGVdKXtjb25zdCBsPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tvLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxvKTtpZihsIT09ITF8fCFbImVzY2FwZSIsImh0bWwiLCJsaW5rIiwiaW1hZ2UiLCJzdHJvbmciLCJlbSIsImNvZGVzcGFuIiwiYnIiLCJkZWwiLCJ0ZXh0Il0uaW5jbHVkZXMoby50eXBlKSl7cis9bHx8IiI7Y29udGludWV9fXN3aXRjaChvLnR5cGUpe2Nhc2UiZXNjYXBlIjp7Y29uc3QgbD1vO3IrPW4udGV4dChsLnRleHQpO2JyZWFrfWNhc2UiaHRtbCI6e2NvbnN0IGw9bztyKz1uLmh0bWwobC50ZXh0KTticmVha31jYXNlImxpbmsiOntjb25zdCBsPW87cis9bi5saW5rKGwuaHJlZixsLnRpdGxlLHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiaW1hZ2UiOntjb25zdCBsPW87cis9bi5pbWFnZShsLmhyZWYsbC50aXRsZSxsLnRleHQpO2JyZWFrfWNhc2Uic3Ryb25nIjp7Y29uc3QgbD1vO3IrPW4uc3Ryb25nKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiZW0iOntjb25zdCBsPW87cis9bi5lbSh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImNvZGVzcGFuIjp7Y29uc3QgbD1vO3IrPW4uY29kZXNwYW4obC50ZXh0KTticmVha31jYXNlImJyIjp7cis9bi5icigpO2JyZWFrfWNhc2UiZGVsIjp7Y29uc3QgbD1vO3IrPW4uZGVsKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UidGV4dCI6e2NvbnN0IGw9bztyKz1uLnRleHQobC50ZXh0KTticmVha31kZWZhdWx0Ontjb25zdCBsPSdUb2tlbiB3aXRoICInK28udHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGwpLCIiO3Rocm93IG5ldyBFcnJvcihsKX19fXJldHVybiByfX1jbGFzcyBDYXtjb25zdHJ1Y3RvcihlKXtKZSh0aGlzLCJvcHRpb25zIik7dGhpcy5vcHRpb25zPWV8fGxsfXByZXByb2Nlc3MoZSl7cmV0dXJuIGV9cG9zdHByb2Nlc3MoZSl7cmV0dXJuIGV9fUplKENhLCJwYXNzVGhyb3VnaEhvb2tzIixuZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIl0pKTt2YXIgJHUsUXAsbmYsd1M7Y2xhc3MgcFJ7Y29uc3RydWN0b3IoLi4uZSl7dGgodGhpcywkdSk7dGgodGhpcyxuZik7SmUodGhpcywiZGVmYXVsdHMiLHFtKCkpO0plKHRoaXMsIm9wdGlvbnMiLHRoaXMuc2V0T3B0aW9ucyk7SmUodGhpcywicGFyc2UiLEd1KHRoaXMsJHUsUXApLmNhbGwodGhpcyxJci5sZXgsRHIucGFyc2UpKTtKZSh0aGlzLCJwYXJzZUlubGluZSIsR3UodGhpcywkdSxRcCkuY2FsbCh0aGlzLElyLmxleElubGluZSxEci5wYXJzZUlubGluZSkpO0plKHRoaXMsIlBhcnNlciIsRHIpO0plKHRoaXMsIlJlbmRlcmVyIixFZCk7SmUodGhpcywiVGV4dFJlbmRlcmVyIixldik7SmUodGhpcywiTGV4ZXIiLElyKTtKZSh0aGlzLCJUb2tlbml6ZXIiLFNkKTtKZSh0aGlzLCJIb29rcyIsQ2EpO3RoaXMudXNlKC4uLmUpfXdhbGtUb2tlbnMoZSxuKXt2YXIgaSxvO2xldCByPVtdO2Zvcihjb25zdCBsIG9mIGUpc3dpdGNoKHI9ci5jb25jYXQobi5jYWxsKHRoaXMsbCkpLGwudHlwZSl7Y2FzZSJ0YWJsZSI6e2NvbnN0IHM9bDtmb3IoY29uc3QgYSBvZiBzLmhlYWRlcilyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhhLnRva2VucyxuKSk7Zm9yKGNvbnN0IGEgb2Ygcy5yb3dzKWZvcihjb25zdCB1IG9mIGEpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnModS50b2tlbnMsbikpO2JyZWFrfWNhc2UibGlzdCI6e2NvbnN0IHM9bDtyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzLml0ZW1zLG4pKTticmVha31kZWZhdWx0Ontjb25zdCBzPWw7KG89KGk9dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zKT09bnVsbD92b2lkIDA6aS5jaGlsZFRva2VucykhPW51bGwmJm9bcy50eXBlXT90aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbcy50eXBlXS5mb3JFYWNoKGE9PntyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzW2FdLG4pKX0pOnMudG9rZW5zJiYocj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy50b2tlbnMsbikpKX19cmV0dXJuIHJ9dXNlKC4uLmUpe2NvbnN0IG49dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zfHx7cmVuZGVyZXJzOnt9LGNoaWxkVG9rZW5zOnt9fTtyZXR1cm4gZS5mb3JFYWNoKHI9Pntjb25zdCBpPXsuLi5yfTtpZihpLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fGkuYXN5bmN8fCExLHIuZXh0ZW5zaW9ucyYmKHIuZXh0ZW5zaW9ucy5mb3JFYWNoKG89PntpZighby5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gbyl7Y29uc3QgbD1uLnJlbmRlcmVyc1tvLm5hbWVdO2w/bi5yZW5kZXJlcnNbby5uYW1lXT1mdW5jdGlvbiguLi5zKXtsZXQgYT1vLnJlbmRlcmVyLmFwcGx5KHRoaXMscyk7cmV0dXJuIGE9PT0hMSYmKGE9bC5hcHBseSh0aGlzLHMpKSxhfTpuLnJlbmRlcmVyc1tvLm5hbWVdPW8ucmVuZGVyZXJ9aWYoInRva2VuaXplciJpbiBvKXtpZighby5sZXZlbHx8by5sZXZlbCE9PSJibG9jayImJm8ubGV2ZWwhPT0iaW5saW5lIil0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTtjb25zdCBsPW5bby5sZXZlbF07bD9sLnVuc2hpZnQoby50b2tlbml6ZXIpOm5bby5sZXZlbF09W28udG9rZW5pemVyXSxvLnN0YXJ0JiYoby5sZXZlbD09PSJibG9jayI/bi5zdGFydEJsb2NrP24uc3RhcnRCbG9jay5wdXNoKG8uc3RhcnQpOm4uc3RhcnRCbG9jaz1bby5zdGFydF06by5sZXZlbD09PSJpbmxpbmUiJiYobi5zdGFydElubGluZT9uLnN0YXJ0SW5saW5lLnB1c2goby5zdGFydCk6bi5zdGFydElubGluZT1bby5zdGFydF0pKX0iY2hpbGRUb2tlbnMiaW4gbyYmby5jaGlsZFRva2VucyYmKG4uY2hpbGRUb2tlbnNbby5uYW1lXT1vLmNoaWxkVG9rZW5zKX0pLGkuZXh0ZW5zaW9ucz1uKSxyLnJlbmRlcmVyKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBFZCh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnJlbmRlcmVyKXtjb25zdCBzPXIucmVuZGVyZXJbbF0sYT1sLHU9b1thXTtvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR8fCIifX1pLnJlbmRlcmVyPW99aWYoci50b2tlbml6ZXIpe2NvbnN0IG89dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBTZCh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnRva2VuaXplcil7Y29uc3Qgcz1yLnRva2VuaXplcltsXSxhPWwsdT1vW2FdO29bYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShvLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkobyxjKSksZH19aS50b2tlbml6ZXI9b31pZihyLmhvb2tzKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMuaG9va3N8fG5ldyBDYTtmb3IoY29uc3QgbCBpbiByLmhvb2tzKXtjb25zdCBzPXIuaG9va3NbbF0sYT1sLHU9b1thXTtDYS5wYXNzVGhyb3VnaEhvb2tzLmhhcyhsKT9vW2FdPWM9PntpZih0aGlzLmRlZmF1bHRzLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUocy5jYWxsKG8sYykpLnRoZW4oZj0+dS5jYWxsKG8sZikpO2NvbnN0IGQ9cy5jYWxsKG8sYyk7cmV0dXJuIHUuY2FsbChvLGQpfTpvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR9fWkuaG9va3M9b31pZihyLndhbGtUb2tlbnMpe2NvbnN0IG89dGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zLGw9ci53YWxrVG9rZW5zO2kud2Fsa1Rva2Vucz1mdW5jdGlvbihzKXtsZXQgYT1bXTtyZXR1cm4gYS5wdXNoKGwuY2FsbCh0aGlzLHMpKSxvJiYoYT1hLmNvbmNhdChvLmNhbGwodGhpcyxzKSkpLGF9fXRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uaX19KSx0aGlzfXNldE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uZX0sdGhpc31sZXhlcihlLG4pe3JldHVybiBJci5sZXgoZSxuPz90aGlzLmRlZmF1bHRzKX1wYXJzZXIoZSxuKXtyZXR1cm4gRHIucGFyc2UoZSxuPz90aGlzLmRlZmF1bHRzKX19JHU9bmV3IFdlYWtTZXQsUXA9ZnVuY3Rpb24oZSxuKXtyZXR1cm4ocixpKT0+e2NvbnN0IG89ey4uLml9LGw9ey4uLnRoaXMuZGVmYXVsdHMsLi4ub307dGhpcy5kZWZhdWx0cy5hc3luYz09PSEwJiZvLmFzeW5jPT09ITEmJihsLnNpbGVudHx8Y29uc29sZS53YXJuKCJtYXJrZWQoKTogVGhlIGFzeW5jIG9wdGlvbiB3YXMgc2V0IHRvIHRydWUgYnkgYW4gZXh0ZW5zaW9uLiBUaGUgYXN5bmM6IGZhbHNlIG9wdGlvbiBzZW50IHRvIHBhcnNlIHdpbGwgYmUgaWdub3JlZC4iKSxsLmFzeW5jPSEwKTtjb25zdCBzPUd1KHRoaXMsbmYsd1MpLmNhbGwodGhpcywhIWwuc2lsZW50LCEhbC5hc3luYyk7aWYodHlwZW9mIHI+InUifHxyPT09bnVsbClyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiBzKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpKyIsIHN0cmluZyBleHBlY3RlZCIpKTtpZihsLmhvb2tzJiYobC5ob29rcy5vcHRpb25zPWwpLGwuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShsLmhvb2tzP2wuaG9va3MucHJlcHJvY2VzcyhyKTpyKS50aGVuKGE9PmUoYSxsKSkudGhlbihhPT5sLndhbGtUb2tlbnM/UHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKSkudGhlbigoKT0+YSk6YSkudGhlbihhPT5uKGEsbCkpLnRoZW4oYT0+bC5ob29rcz9sLmhvb2tzLnBvc3Rwcm9jZXNzKGEpOmEpLmNhdGNoKHMpO3RyeXtsLmhvb2tzJiYocj1sLmhvb2tzLnByZXByb2Nlc3MocikpO2NvbnN0IGE9ZShyLGwpO2wud2Fsa1Rva2VucyYmdGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKTtsZXQgdT1uKGEsbCk7cmV0dXJuIGwuaG9va3MmJih1PWwuaG9va3MucG9zdHByb2Nlc3ModSkpLHV9Y2F0Y2goYSl7cmV0dXJuIHMoYSl9fX0sbmY9bmV3IFdlYWtTZXQsd1M9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gcj0+e2lmKHIubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2NvbnN0IGk9IjxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPiIrTW4oci5tZXNzYWdlKyIiLCEwKSsiPC9wcmU+IjtyZXR1cm4gbj9Qcm9taXNlLnJlc29sdmUoaSk6aX1pZihuKXJldHVybiBQcm9taXNlLnJlamVjdChyKTt0aHJvdyByfX07Y29uc3QgSG89bmV3IHBSO2Z1bmN0aW9uIEhlKHQsZSl7cmV0dXJuIEhvLnBhcnNlKHQsZSl9SGUub3B0aW9ucz1IZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBIby5zZXRPcHRpb25zKHQpLEhlLmRlZmF1bHRzPUhvLmRlZmF1bHRzLHlTKEhlLmRlZmF1bHRzKSxIZX07SGUuZ2V0RGVmYXVsdHM9cW07SGUuZGVmYXVsdHM9bGw7SGUudXNlPWZ1bmN0aW9uKC4uLnQpe3JldHVybiBIby51c2UoLi4udCksSGUuZGVmYXVsdHM9SG8uZGVmYXVsdHMseVMoSGUuZGVmYXVsdHMpLEhlfTtIZS53YWxrVG9rZW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEhvLndhbGtUb2tlbnModCxlKX07SGUucGFyc2VJbmxpbmU9SG8ucGFyc2VJbmxpbmU7SGUuUGFyc2VyPURyO0hlLnBhcnNlcj1Eci5wYXJzZTtIZS5SZW5kZXJlcj1FZDtIZS5UZXh0UmVuZGVyZXI9ZXY7SGUuTGV4ZXI9SXI7SGUubGV4ZXI9SXIubGV4O0hlLlRva2VuaXplcj1TZDtIZS5Ib29rcz1DYTtIZS5wYXJzZT1IZTtIZS5vcHRpb25zO0hlLnNldE9wdGlvbnM7SGUudXNlO0hlLndhbGtUb2tlbnM7SGUucGFyc2VJbmxpbmU7RHIucGFyc2U7Y29uc3QgZ1I9SXIubGV4O2Z1bmN0aW9uIGV1KCl7ZXU9ZnVuY3Rpb24oKXtyZXR1cm4gZX07dmFyIHQsZT17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LGk9T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihDLGssRSl7Q1trXT1FLnZhbHVlfSxvPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KEMsayxFKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsayx7dmFsdWU6RSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLENba119dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oayxFLEEpe3JldHVybiBrW0VdPUF9fWZ1bmN0aW9uIGMoQyxrLEUsQSl7dmFyIE49ayYmay5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2s6dixGPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpLEs9bmV3IEgoQXx8W10pO3JldHVybiBpKEYsIl9pbnZva2UiLHt2YWx1ZTpQKEMsRSxLKX0pLEZ9ZnVuY3Rpb24gZChDLGssRSl7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzpDLmNhbGwoayxFKX19Y2F0Y2goQSl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6QX19fWUud3JhcD1jO3ZhciBmPSJzdXNwZW5kZWRTdGFydCIsaD0ic3VzcGVuZGVkWWllbGQiLG09ImV4ZWN1dGluZyIsZz0iY29tcGxldGVkIix3PXt9O2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB4KCl7fXZhciBTPXt9O3UoUyxsLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTt2YXIgYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsVD1iJiZiKGIoWihbXSkpKTtUJiZUIT09biYmci5jYWxsKFQsbCkmJihTPVQpO3ZhciAkPXgucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUyk7ZnVuY3Rpb24gTyhDKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oayl7dShDLGssZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMuX2ludm9rZShrLEUpfSl9KX1mdW5jdGlvbiBMKEMsayl7ZnVuY3Rpb24gRShOLEYsSyxkZSl7dmFyIHNlPWQoQ1tOXSxDLEYpO2lmKHNlLnR5cGUhPT0idGhyb3ciKXt2YXIgQWU9c2UuYXJnLE5lPUFlLnZhbHVlO3JldHVybiBOZSYmdHlwZW9mIE5lPT0ib2JqZWN0IiYmci5jYWxsKE5lLCJfX2F3YWl0Iik/ay5yZXNvbHZlKE5lLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24oUSl7RSgibmV4dCIsUSxLLGRlKX0sZnVuY3Rpb24oUSl7RSgidGhyb3ciLFEsSyxkZSl9KTprLnJlc29sdmUoTmUpLnRoZW4oZnVuY3Rpb24oUSl7QWUudmFsdWU9USxLKEFlKX0sZnVuY3Rpb24oUSl7cmV0dXJuIEUoInRocm93IixRLEssZGUpfSl9ZGUoc2UuYXJnKX12YXIgQTtpKHRoaXMsIl9pbnZva2UiLHt2YWx1ZTpmdW5jdGlvbihOLEYpe2Z1bmN0aW9uIEsoKXtyZXR1cm4gbmV3IGsoZnVuY3Rpb24oZGUsc2Upe0UoTixGLGRlLHNlKX0pfXJldHVybiBBPUE/QS50aGVuKEssSyk6SygpfX0pfWZ1bmN0aW9uIFAoQyxrLEUpe3ZhciBBPWY7cmV0dXJuIGZ1bmN0aW9uKE4sRil7aWYoQT09PW0pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoQT09PWcpe2lmKE49PT0idGhyb3ciKXRocm93IEY7cmV0dXJue3ZhbHVlOnQsZG9uZTohMH19Zm9yKEUubWV0aG9kPU4sRS5hcmc9Rjs7KXt2YXIgSz1FLmRlbGVnYXRlO2lmKEspe3ZhciBkZT1EKEssRSk7aWYoZGUpe2lmKGRlPT09dyljb250aW51ZTtyZXR1cm4gZGV9fWlmKEUubWV0aG9kPT09Im5leHQiKUUuc2VudD1FLl9zZW50PUUuYXJnO2Vsc2UgaWYoRS5tZXRob2Q9PT0idGhyb3ciKXtpZihBPT09Zil0aHJvdyBBPWcsRS5hcmc7RS5kaXNwYXRjaEV4Y2VwdGlvbihFLmFyZyl9ZWxzZSBFLm1ldGhvZD09PSJyZXR1cm4iJiZFLmFicnVwdCgicmV0dXJuIixFLmFyZyk7QT1tO3ZhciBzZT1kKEMsayxFKTtpZihzZS50eXBlPT09Im5vcm1hbCIpe2lmKEE9RS5kb25lP2c6aCxzZS5hcmc9PT13KWNvbnRpbnVlO3JldHVybnt2YWx1ZTpzZS5hcmcsZG9uZTpFLmRvbmV9fXNlLnR5cGU9PT0idGhyb3ciJiYoQT1nLEUubWV0aG9kPSJ0aHJvdyIsRS5hcmc9c2UuYXJnKX19fWZ1bmN0aW9uIEQoQyxrKXt2YXIgRT1rLm1ldGhvZCxBPUMuaXRlcmF0b3JbRV07aWYoQT09PXQpcmV0dXJuIGsuZGVsZWdhdGU9bnVsbCxFPT09InRocm93IiYmQy5pdGVyYXRvci5yZXR1cm4mJihrLm1ldGhvZD0icmV0dXJuIixrLmFyZz10LEQoQyxrKSxrLm1ldGhvZD09PSJ0aHJvdyIpfHxFIT09InJldHVybiImJihrLm1ldGhvZD0idGhyb3ciLGsuYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIrRSsiJyBtZXRob2QiKSksdzt2YXIgTj1kKEEsQy5pdGVyYXRvcixrLmFyZyk7aWYoTi50eXBlPT09InRocm93IilyZXR1cm4gay5tZXRob2Q9InRocm93IixrLmFyZz1OLmFyZyxrLmRlbGVnYXRlPW51bGwsdzt2YXIgRj1OLmFyZztyZXR1cm4gRj9GLmRvbmU/KGtbQy5yZXN1bHROYW1lXT1GLnZhbHVlLGsubmV4dD1DLm5leHRMb2Msay5tZXRob2QhPT0icmV0dXJuIiYmKGsubWV0aG9kPSJuZXh0IixrLmFyZz10KSxrLmRlbGVnYXRlPW51bGwsdyk6Rjooay5tZXRob2Q9InRocm93IixrLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLGsuZGVsZWdhdGU9bnVsbCx3KX1mdW5jdGlvbiBCKEMpe3ZhciBrPXt0cnlMb2M6Q1swXX07MSBpbiBDJiYoay5jYXRjaExvYz1DWzFdKSwyIGluIEMmJihrLmZpbmFsbHlMb2M9Q1syXSxrLmFmdGVyTG9jPUNbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKGspfWZ1bmN0aW9uIG9lKEMpe3ZhciBrPUMuY29tcGxldGlvbnx8e307ay50eXBlPSJub3JtYWwiLGRlbGV0ZSBrLmFyZyxDLmNvbXBsZXRpb249a31mdW5jdGlvbiBIKEMpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxDLmZvckVhY2goQix0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBaKEMpe2lmKEN8fEM9PT0iIil7dmFyIGs9Q1tsXTtpZihrKXJldHVybiBrLmNhbGwoQyk7aWYodHlwZW9mIEMubmV4dD09ImZ1bmN0aW9uIilyZXR1cm4gQztpZighaXNOYU4oQy5sZW5ndGgpKXt2YXIgRT0tMSxBPWZ1bmN0aW9uIE4oKXtmb3IoOysrRTxDLmxlbmd0aDspaWYoci5jYWxsKEMsRSkpcmV0dXJuIE4udmFsdWU9Q1tFXSxOLmRvbmU9ITEsTjtyZXR1cm4gTi52YWx1ZT10LE4uZG9uZT0hMCxOfTtyZXR1cm4gQS5uZXh0PUF9fXRocm93IG5ldyBUeXBlRXJyb3IodHlwZW9mIEMrIiBpcyBub3QgaXRlcmFibGUiKX1yZXR1cm4geS5wcm90b3R5cGU9eCxpKCQsImNvbnN0cnVjdG9yIix7dmFsdWU6eCxjb25maWd1cmFibGU6ITB9KSxpKHgsImNvbnN0cnVjdG9yIix7dmFsdWU6eSxjb25maWd1cmFibGU6ITB9KSx5LmRpc3BsYXlOYW1lPXUoeCxhLCJHZW5lcmF0b3JGdW5jdGlvbiIpLGUuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbihDKXt2YXIgaz10eXBlb2YgQz09ImZ1bmN0aW9uIiYmQy5jb25zdHJ1Y3RvcjtyZXR1cm4hIWsmJihrPT09eXx8KGsuZGlzcGxheU5hbWV8fGsubmFtZSk9PT0iR2VuZXJhdG9yRnVuY3Rpb24iKX0sZS5tYXJrPWZ1bmN0aW9uKEMpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKEMseCk6KEMuX19wcm90b19fPXgsdShDLGEsIkdlbmVyYXRvckZ1bmN0aW9uIikpLEMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoJCksQ30sZS5hd3JhcD1mdW5jdGlvbihDKXtyZXR1cm57X19hd2FpdDpDfX0sTyhMLnByb3RvdHlwZSksdShMLnByb3RvdHlwZSxzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxlLkFzeW5jSXRlcmF0b3I9TCxlLmFzeW5jPWZ1bmN0aW9uKEMsayxFLEEsTil7Tj09PXZvaWQgMCYmKE49UHJvbWlzZSk7dmFyIEY9bmV3IEwoYyhDLGssRSxBKSxOKTtyZXR1cm4gZS5pc0dlbmVyYXRvckZ1bmN0aW9uKGspP0Y6Ri5uZXh0KCkudGhlbihmdW5jdGlvbihLKXtyZXR1cm4gSy5kb25lP0sudmFsdWU6Ri5uZXh0KCl9KX0sTygkKSx1KCQsYSwiR2VuZXJhdG9yIiksdSgkLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHUoJCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSxlLmtleXM9ZnVuY3Rpb24oQyl7dmFyIGs9T2JqZWN0KEMpLEU9W107Zm9yKHZhciBBIGluIGspRS5wdXNoKEEpO3JldHVybiBFLnJldmVyc2UoKSxmdW5jdGlvbiBOKCl7Zm9yKDtFLmxlbmd0aDspe3ZhciBGPUUucG9wKCk7aWYoRiBpbiBrKXJldHVybiBOLnZhbHVlPUYsTi5kb25lPSExLE59cmV0dXJuIE4uZG9uZT0hMCxOfX0sZS52YWx1ZXM9WixILnByb3RvdHlwZT17Y29uc3RydWN0b3I6SCxyZXNldDpmdW5jdGlvbihDKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD10LHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXQsdGhpcy50cnlFbnRyaWVzLmZvckVhY2gob2UpLCFDKWZvcih2YXIgayBpbiB0aGlzKWsuY2hhckF0KDApPT09InQiJiZyLmNhbGwodGhpcyxrKSYmIWlzTmFOKCtrLnNsaWNlKDEpKSYmKHRoaXNba109dCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIEM9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoQy50eXBlPT09InRocm93Iil0aHJvdyBDLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihDKXtpZih0aGlzLmRvbmUpdGhyb3cgQzt2YXIgaz10aGlzO2Z1bmN0aW9uIEUoc2UsQWUpe3JldHVybiBGLnR5cGU9InRocm93IixGLmFyZz1DLGsubmV4dD1zZSxBZSYmKGsubWV0aG9kPSJuZXh0IixrLmFyZz10KSwhIUFlfWZvcih2YXIgQT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7QT49MDstLUEpe3ZhciBOPXRoaXMudHJ5RW50cmllc1tBXSxGPU4uY29tcGxldGlvbjtpZihOLnRyeUxvYz09PSJyb290IilyZXR1cm4gRSgiZW5kIik7aWYoTi50cnlMb2M8PXRoaXMucHJldil7dmFyIEs9ci5jYWxsKE4sImNhdGNoTG9jIiksZGU9ci5jYWxsKE4sImZpbmFsbHlMb2MiKTtpZihLJiZkZSl7aWYodGhpcy5wcmV2PE4uY2F0Y2hMb2MpcmV0dXJuIEUoTi5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PE4uZmluYWxseUxvYylyZXR1cm4gRShOLmZpbmFsbHlMb2MpfWVsc2UgaWYoSyl7aWYodGhpcy5wcmV2PE4uY2F0Y2hMb2MpcmV0dXJuIEUoTi5jYXRjaExvYywhMCl9ZWxzZXtpZighZGUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxOLmZpbmFsbHlMb2MpcmV0dXJuIEUoTi5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKEMsayl7Zm9yKHZhciBFPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtFPj0wOy0tRSl7dmFyIEE9dGhpcy50cnlFbnRyaWVzW0VdO2lmKEEudHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChBLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxBLmZpbmFsbHlMb2Mpe3ZhciBOPUE7YnJlYWt9fU4mJihDPT09ImJyZWFrInx8Qz09PSJjb250aW51ZSIpJiZOLnRyeUxvYzw9ayYmazw9Ti5maW5hbGx5TG9jJiYoTj1udWxsKTt2YXIgRj1OP04uY29tcGxldGlvbjp7fTtyZXR1cm4gRi50eXBlPUMsRi5hcmc9ayxOPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PU4uZmluYWxseUxvYyx3KTp0aGlzLmNvbXBsZXRlKEYpfSxjb21wbGV0ZTpmdW5jdGlvbihDLGspe2lmKEMudHlwZT09PSJ0aHJvdyIpdGhyb3cgQy5hcmc7cmV0dXJuIEMudHlwZT09PSJicmVhayJ8fEMudHlwZT09PSJjb250aW51ZSI/dGhpcy5uZXh0PUMuYXJnOkMudHlwZT09PSJyZXR1cm4iPyh0aGlzLnJ2YWw9dGhpcy5hcmc9Qy5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKTpDLnR5cGU9PT0ibm9ybWFsIiYmayYmKHRoaXMubmV4dD1rKSx3fSxmaW5pc2g6ZnVuY3Rpb24oQyl7Zm9yKHZhciBrPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtrPj0wOy0tayl7dmFyIEU9dGhpcy50cnlFbnRyaWVzW2tdO2lmKEUuZmluYWxseUxvYz09PUMpcmV0dXJuIHRoaXMuY29tcGxldGUoRS5jb21wbGV0aW9uLEUuYWZ0ZXJMb2MpLG9lKEUpLHd9fSxjYXRjaDpmdW5jdGlvbihDKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgRT10aGlzLnRyeUVudHJpZXNba107aWYoRS50cnlMb2M9PT1DKXt2YXIgQT1FLmNvbXBsZXRpb247aWYoQS50eXBlPT09InRocm93Iil7dmFyIE49QS5hcmc7b2UoRSl9cmV0dXJuIE59fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oQyxrLEUpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpaKEMpLHJlc3VsdE5hbWU6ayxuZXh0TG9jOkV9LHRoaXMubWV0aG9kPT09Im5leHQiJiYodGhpcy5hcmc9dCksd319LGV9ZnVuY3Rpb24gSnAodCxlKXsoZT09bnVsbHx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiB0dih0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSnAodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpwKHQsZSl9fWZ1bmN0aW9uIG1SKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj10dih0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAsbD0hMSxzO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtsPSEwLHM9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihsKXRocm93IHN9fX19ZnVuY3Rpb24gdlIodCxlKXtpZih0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiB0O3ZhciBuPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwodCxlfHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybihlPT09InN0cmluZyI/U3RyaW5nOk51bWJlcikodCl9ZnVuY3Rpb24geVIodCl7dmFyIGU9dlIodCwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiBlPT0ic3ltYm9sIj9lOlN0cmluZyhlKX1mdW5jdGlvbiBxdCh0LGUsbil7cmV0dXJuIGU9eVIoZSksZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiB4Uih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIF9SKHQsZSl7dmFyIG49dD09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl18fHRbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwodCkpLm5leHQsZT09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09ZSk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiB3Uigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBTUih0LGUpe3JldHVybiB4Uih0KXx8X1IodCxlKXx8dHYodCxlKXx8d1IoKX1mdW5jdGlvbiBBMCh0LGUsbixyLGksbyxsKXt0cnl7dmFyIHM9dFtvXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP2UoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixpKX1mdW5jdGlvbiBTUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe3ZhciBvPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBsKGEpe0EwKG8scixpLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtBMChvLHIsaSxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19ZnVuY3Rpb24gRVIodCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gSnAodCl9ZnVuY3Rpb24gQ1IodCl7aWYodHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8dFsiQEBpdGVyYXRvciJdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIGtSKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBxcCh0KXtyZXR1cm4gRVIodCl8fENSKHQpfHx0dih0KXx8a1IoKX12YXIgYlI9L15kYXRhOihpbWFnZVwvKHBuZ3xqcGVnfGpwZ3xnaWZ8d2VicHxibXB8dGlmZnxpY298c3ZnXCt4bWwpKTtiYXNlNjQsLztmdW5jdGlvbiBudih0KXt2YXIgZT1iUi5leGVjKHQpO2lmKGUmJmVbMV0pcmV0dXJuIGVbMV19ZnVuY3Rpb24gcnYodCl7cmV0dXJuIHQ9PT0iaW1hZ2Uvc3ZnK3htbCI/InN2ZyI6dD09PSJpbWFnZS92bmQubWljcm9zb2Z0Lmljb24iPyJpY28iOnQuc3RhcnRzV2l0aCgiaW1hZ2UvIik/dC5zbGljZSg2KTp0fXZhciAkUj0vXmgoW1xkK10pJC87ZnVuY3Rpb24gVFIodCl7dmFyIGU9dC5jaGlsZHJlbi5tYXAoTlIpO3JldHVybiBSUihlKX1mdW5jdGlvbiBOUih0KXtpZih0LnR5cGU9PT0iaGVhZGluZyIpe3ZhciBlLG49IiIscj1OdW1iZXIoKGU9dC50YWcubWF0Y2goJFIpKT09PW51bGx8fGU9PT12b2lkIDA/dm9pZCAwOmVbMV0pO2lmKE51bWJlci5pc05hTihyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGVhZGVyIGRlcHRoIik7Zm9yKHZhciBpPTA7aTxOdW1iZXIocik7aSsrKW4rPSIjIjt2YXIgbz1bIiIuY29uY2F0KG4sIiAiKV07cmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjpvLmNvbmNhdC5hcHBseShvLHFwKHQuY2hpbGRyZW4ubWFwKHRnKSkpfX1lbHNle2lmKHQudHlwZT09PSJwYXJhZ3JhcGgiKXJldHVybiB0LmNoaWxkcmVuLmxlbmd0aD09PTA/e3R5cGU6ImJsb2NrIixjaGlsZHJlbjpbIjxiciAvPiJdfTp7dHlwZToiYmxvY2siLGNoaWxkcmVuOnQuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHMpe3JldHVybiB0ZyhzKX0pfTtpZih0LnR5cGU9PT0ibGlzdCIpcmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjp0LmNoaWxkcmVuLmZsYXRNYXAoZnVuY3Rpb24ocyxhKXtyZXR1cm4gQ1Moa1ModCkscywwLGE9PT0wKX0pfTt2YXIgbD10O3Rocm93IG5ldyBFcnJvcigiVW5oYW5kbGVkIG5vZGUgdHlwZTogIi5jb25jYXQoInR5cGUiaW4gbD8iZXhoYXVzdGl2ZUNoZWNrLnR5cGUiOiJ1bmtub3duIikpfX1mdW5jdGlvbiBSUih0KXtyZXR1cm4gZWcuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGVnKCl7cmV0dXJuIGVnPVNTKGV1KCkubWFyayhmdW5jdGlvbiB0KGUpe3ZhciBuLHIsaSxvLGwscyxhLHUsYztyZXR1cm4gZXUoKS53cmFwKGZ1bmN0aW9uKGYpe2Zvcig7Oylzd2l0Y2goZi5wcmV2PWYubmV4dCl7Y2FzZSAwOm49W2AKYF0scj1bXSxpPXt9LG89MDtjYXNlIDQ6aWYoIShvPGUubGVuZ3RoKSl7Zi5uZXh0PTQ0O2JyZWFrfWw9ZVtvXSxzPW1SKGwuY2hpbGRyZW4pLGYucHJldj03LHMucygpO2Nhc2UgOTppZigoYT1zLm4oKSkuZG9uZSl7Zi5uZXh0PTMyO2JyZWFrfWlmKHU9YS52YWx1ZSx0eXBlb2YgdSE9InN0cmluZyIpe2YubmV4dD0xNTticmVha31uW24ubGVuZ3RoLTFdKz11LGYubmV4dD0zMDticmVhaztjYXNlIDE1OmlmKHUudHlwZSE9PSJpbWFnZSIpe2YubmV4dD0yMzticmVha31yZXR1cm4gZi50MD1yLGYubmV4dD0xOSxNUih1LGkpO2Nhc2UgMTk6Zi50MT1mLnNlbnQsZi50MC5wdXNoLmNhbGwoZi50MCxmLnQxKSxmLm5leHQ9Mjk7YnJlYWs7Y2FzZSAyMzppZih1LnR5cGUhPT0ibGluayIpe2YubmV4dD0yNzticmVha31yLnB1c2goSVIodSkpLGYubmV4dD0yOTticmVhaztjYXNlIDI3OnRocm93IGM9dSxuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZSB0eXBlOiAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShjLG51bGwsMikpKTtjYXNlIDI5Om4ucHVzaCgiIik7Y2FzZSAzMDpmLm5leHQ9OTticmVhaztjYXNlIDMyOmYubmV4dD0zNzticmVhaztjYXNlIDM0OmYucHJldj0zNCxmLnQyPWYuY2F0Y2goNykscy5lKGYudDIpO2Nhc2UgMzc6cmV0dXJuIGYucHJldj0zNyxzLmYoKSxmLmZpbmlzaCgzNyk7Y2FzZSA0MDpvPT09ZS5sZW5ndGgtMT9uW24ubGVuZ3RoLTFdKz1gCmA6bltuLmxlbmd0aC0xXSs9YAoKYDtjYXNlIDQxOm8rKyxmLm5leHQ9NDticmVhaztjYXNlIDQ0OnJldHVybiBmLmFicnVwdCgicmV0dXJuIixxdChxdChxdChxdCh7fSxubiwicmljaHRleHQiKSwidGVtcGxhdGVTdHJpbmdzIixuKSwiZXhwcnMiLHIpLCJmaWxlcyIsaSkpO2Nhc2UgNDU6Y2FzZSJlbmQiOnJldHVybiBmLnN0b3AoKX19LHQsbnVsbCxbWzcsMzQsMzcsNDBdXSl9KSksZWcuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEVTKHQpe3ZhciBlPXR5cGVvZiB0LmZvcm1hdD09Im51bWJlciI/UFIodC5mb3JtYXQpOltdLG49dC50ZXh0LnRyaW1TdGFydCgpLHI9dC50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO3ZhciBpPXQudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gZS5pbmNsdWRlcygiYm9sZCIpJiZlLmluY2x1ZGVzKCJpdGFsaWMiKT9uPSIqKioiLmNvbmNhdChuLCIqKioiKTplLmluY2x1ZGVzKCJib2xkIik/bj0iKioiLmNvbmNhdChuLCIqKiIpOmUuaW5jbHVkZXMoIml0YWxpYyIpJiYobj0iXyIuY29uY2F0KG4sIl8iKSksZS5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPSJ+fiIuY29uY2F0KG4sIn5+IikpLCIiLmNvbmNhdCgiICIucmVwZWF0KHIpKS5jb25jYXQobikuY29uY2F0KCIgIi5yZXBlYXQoaSkpfWZ1bmN0aW9uIHRnKHQpe3JldHVybiB0LnR5cGU9PT0idGV4dCI/RVModCk6dC50eXBlPT09ImxpbmVicmVhayI/YApgOnR9ZnVuY3Rpb24gQ1ModCxlLG4pe3ZhciByLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG89aT8iIjpgCmAsbD1bIiIuY29uY2F0KG8pLmNvbmNhdCgiICIucmVwZWF0KG4pKS5jb25jYXQodCldO3JldHVybigocj1lLmNoaWxkcmVuKT09PW51bGx8fHI9PT12b2lkIDB8fChyPXJbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci50eXBlKSE9PSJsaXN0IiYmbC5wdXNoKCIgIiksbC5jb25jYXQoZS5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLnR5cGU9PT0ibGlzdCI/cy5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKGEpe3JldHVybiBDUyhrUyhzKSxhLG4rNCl9KTpbdGcocyldfSkpfWZ1bmN0aW9uIGtTKHQpe2lmKHQubGlzdFR5cGU9PT0iYnVsbGV0IilyZXR1cm4iLSI7aWYodC5saXN0VHlwZT09PSJudW1iZXIiKXJldHVybiIxLiI7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgbGlzdCB0eXBlOiAiLmNvbmNhdCh0Lmxpc3RUeXBlKSl9dmFyIE9SPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gUFIodCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKE9SKS5mbGF0TWFwKGZ1bmN0aW9uKGUpe3ZhciBuPVNSKGUsMikscj1uWzBdLGk9blsxXTtyZXR1cm4oaSZ0KT09PWk/W3JdOltdfSl9dmFyIEFSPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiBNUih0LGUpe3JldHVybiBuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbmcoKXtyZXR1cm4gbmc9U1MoZXUoKS5tYXJrKGZ1bmN0aW9uIHQoZSxuKXt2YXIgcixpLG8sbCxzO3JldHVybiBldSgpLndyYXAoZnVuY3Rpb24odSl7Zm9yKDs7KXN3aXRjaCh1LnByZXY9dS5uZXh0KXtjYXNlIDA6aWYoIWUuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe3UubmV4dD0xMzticmVha31yZXR1cm4gdS5uZXh0PTMsam4uZ2V0U0hBMjU2SGFzaChBUi5lbmNvZGUoZS5zcmMpKTtjYXNlIDM6aWYocj11LnNlbnQsaT1udihlLnNyYyksaSE9PXZvaWQgMCl7dS5uZXh0PTc7YnJlYWt9dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZGV0ZWN0IE1pbWUgVHlwZSBmb3IgaW1hZ2U6ICIuY29uY2F0KGUuc3JjKSk7Y2FzZSA3OnJldHVybiBvPXJ2KGkpLGw9Ii9wdWJsaWMvIi5jb25jYXQociwiLiIpLmNvbmNhdChvKSxuW2xdPWUuc3JjLHUuYWJydXB0KCJyZXR1cm4iLHF0KHF0KHF0KHt9LG5uLCJmaWxlIiksUm4sbCksIm1ldGFkYXRhIix7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS5oZWlnaHR8fDAsc2hhMjU2OnJ8fCIifSkpO2Nhc2UgMTM6cmV0dXJuIHM9TFIoInNoYTI1NiIsZS5zcmMpLHUuYWJydXB0KCJyZXR1cm4iLHF0KHF0KHF0KHt9LG5uLCJmaWxlIiksUm4sIi9wdWJsaWMiLmNvbmNhdChlLnNyYy5zcGxpdCgiPyIpWzBdKSksIm1ldGFkYXRhIix7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS5oZWlnaHR8fDAsc2hhMjU2OnN8fCIifSkpO2Nhc2UgMTU6Y2FzZSJlbmQiOnJldHVybiB1LnN0b3AoKX19LHQpfSkpLG5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBMUih0LGUpe3ZhciBuPWUuc3BsaXQoIj8iKTtpZighKG4ubGVuZ3RoPDIpKXt2YXIgcj1uWzFdLGk9bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihpLmhhcyh0KSlyZXR1cm4gaS5nZXQodCl9fWZ1bmN0aW9uIElSKHQpe3JldHVybiBxdChxdChxdCh7fSxubiwibGluayIpLCJocmVmIix0LnVybCksImNoaWxkcmVuIix0LmNoaWxkcmVuLm1hcChFUykpfWZ1bmN0aW9uIE0wKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbHQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/TTAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3F0KHQscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk0wKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gdH12YXIgQ3I9e3ZlcnNpb246MSxmb3JtYXQ6IiIsaW5kZW50OjAsZGlyZWN0aW9uOm51bGx9O2Z1bmN0aW9uIENzKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToidGV4dCIsZm9ybWF0OiIiLHRleHQ6dH0pO2lmKCJ0YWciaW4gdClzd2l0Y2godC50YWcpe2Nhc2UiaDEiOnJldHVybiBnbCh0KTtjYXNlImgyIjpyZXR1cm4gZ2wodCk7Y2FzZSJoMyI6cmV0dXJuIGdsKHQpO2Nhc2UiaDQiOnJldHVybiBnbCh0KTtjYXNlImg1IjpyZXR1cm4gZ2wodCk7Y2FzZSJoNiI6cmV0dXJuIGdsKHQpO2Nhc2UibGkiOnJldHVybiBVUih0KTtjYXNlInAiOnJldHVybiBGUih0KTtjYXNlInVsIjpyZXR1cm4gTDAodCk7Y2FzZSJvbCI6cmV0dXJuIEwwKHQpO2Nhc2Uic3BhbiI6cmV0dXJuIGJTKHQpO2Nhc2UiYSI6cmV0dXJuIGpSKHQpO2Nhc2UiaW1nIjpyZXR1cm4gRFIodCk7Y2FzZSJiciI6cmV0dXJuIGU/bHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaW5lYnJlYWsifSk6QlIoKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdGFnOiAiK0pTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlOiAiK0pTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSl9ZnVuY3Rpb24gRFIodCl7dmFyIGU9dC5zcmM7cmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToiaW1hZ2UiLHNyYzplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSl9ZnVuY3Rpb24galIodCl7cmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToibGluayIsdXJsOnQuaHJlZixjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIHpSKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se2Zvcm1hdDoiIix0eXBlOiJyb290IixjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIGdsKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6ImhlYWRpbmciLHRhZzp0LnRhZyxjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIEZSKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUsITApfSl9KX1mdW5jdGlvbiBCUigpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46W119KX1mdW5jdGlvbiBVUih0KXtyZXR1cm4gbHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaXN0aXRlbSIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUsITApfSl9KX1mdW5jdGlvbiBMMCh0KXtyZXR1cm4gbHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaXN0IixsaXN0VHlwZTp0LnRhZz09PSJvbCI/Im51bWJlciI6ImJ1bGxldCIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUpfSl9LHQuZGlyP3tkaXJlY3Rpb246dC5kaXJ9OntkaXJlY3Rpb246bnVsbH0pfXZhciBXUj17Ym9sZDoxLGl0YWxpYzoyLCJsaW5lLXRocm91Z2giOjR9O2Z1bmN0aW9uIFZSKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihlLG4pe3JldHVybiBlfFdSW25dfSwwKX1mdW5jdGlvbiBiUyh0KXt2YXIgZT10LmNoaWxkcmVuWzBdO3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/bHQobHQoe30sQ3IpLHt9LHt0eXBlOiJ0ZXh0Iix0ZXh0OmUsZm9ybWF0OlZSKHQuY2xhc3Nlcyl9KTpiUyhsdChsdCh7fSxlKSx7fSx7Y2xhc3Nlczp0LmNsYXNzZXMuY29uY2F0KGUuY2xhc3Nlcyl9KSl9dmFyIENkPSc8dmFsIHZhbHVlPSInLHJnPSciPicsaWc9IjwvdmFsPiI7ZnVuY3Rpb24gZHIodCxlLG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsaT1bXSxvPWZ1bmN0aW9uKCl7dmFyIGE9dFtuXTtpZihhLnR5cGU9PT0iaGVhZGluZyIpaS5wdXNoKHt0YWc6ImgiLmNvbmNhdChhLmRlcHRoKSxjaGlsZHJlbjpkcihhLnRva2Vucz9hLnRva2VuczpbXSxlLDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0icGFyYWdyYXBoIilpLnB1c2goe3RhZzoicCIsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09InN0cm9uZyIpaS5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJib2xkIl0sY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09ImVtIilpLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbIml0YWxpYyJdLGNoaWxkcmVuOmRyKGEudG9rZW5zP2EudG9rZW5zOltdLGUsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJkZWwiKWkucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsibGluZS10aHJvdWdoIl0sY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09InRleHQiKWlmKCJ0b2tlbnMiaW4gYSYmQXJyYXkuaXNBcnJheShhLnRva2VucykpaS5wdXNoLmFwcGx5KGkscXAoZHIoYS50b2tlbnMsZSxuLHIpLmNoaWxkcmVuKSk7ZWxzZSBpZihyJiZ0eXBlb2YgYS5yYXc9PSJzdHJpbmciKXt2YXIgdT1hLnJhdy5zcGxpdChgCmApLGM9dS5mbGF0TWFwKGZ1bmN0aW9uKFMsYil7cmV0dXJuIGI9PT11Lmxlbmd0aC0xP1tTXTpbUyx7dGFnOiJiciIsY2hpbGRyZW46W119XX0pO2kucHVzaC5hcHBseShpLHFwKGMpKX1lbHNlIGkucHVzaChhLnJhdyk7ZWxzZSBpZihhLnR5cGU9PT0ibGlzdCIpaS5wdXNoKHt0YWc6YS5vcmRlcmVkPyJvbCI6InVsIixjaGlsZHJlbjpkcihhLml0ZW1zLGUsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJsaXN0X2l0ZW0iKWkucHVzaCh7dGFnOiJsaSIsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwLCEwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlIT09InNwYWNlIilpZihhLnR5cGU9PT0iaHRtbCIpe2lmKGEudGV4dD09PWlnKXJldHVybnt2OntjaGlsZHJlbjppLGN1cnNvcjpufX07dmFyIGQ9YS50ZXh0LmluZGV4T2YocmcpO2lmKGEudGV4dC5zdGFydHNXaXRoKENkKSYmZD4tMSl7dmFyIGY9TnVtYmVyKGEudGV4dC5zbGljZShDZC5sZW5ndGgsZCkpO2lmKE51bWJlci5pc05hTihmKSl0aHJvdyBFcnJvcigiSWxsZWdhbCB2YWwgaW50ZXJtZWRpYXRlIG5vZGU6ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGEpKSk7dmFyIGg9ZHIodC5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMudHlwZT09PSJsaW5rInx8Uy50eXBlPT09Imxpc3QiP3t0eXBlOiJ0ZXh0IixyYXc6Uy5yYXcsdGV4dDpTLnJhd306U30pLGUsbisxKSxtPWguY2hpbGRyZW4sZz1oLmN1cnNvcix3PWVbZl07aWYody5fdHlwZT09PSJsaW5rIilpLnB1c2goe3RhZzoiYSIsaHJlZjp3LmhyZWYsY2hpbGRyZW46bX0pO2Vsc2UgaWYody5fdHlwZT09PSJmaWxlIil7dmFyIHYseTtpLnB1c2goe3RhZzoiaW1nIixzcmM6am4uY29udmVydEZpbGVTb3VyY2UodykudXJsLHdpZHRoOih2PXcubWV0YWRhdGEpPT09bnVsbHx8dj09PXZvaWQgMD92b2lkIDA6di53aWR0aCxoZWlnaHQ6KHk9dy5tZXRhZGF0YSk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmhlaWdodCxjaGlsZHJlbjpbXX0pfW49Z312YXIgeD0vPGJyXHMqXC8/Pi9naTthLnRleHQudHJpbSgpLm1hdGNoKHgpJiZpLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSl9ZWxzZSBhLnR5cGU9PT0ibGluayI/YS5yYXc9PT1hLmhyZWY/aS5wdXNoKGEucmF3KTppLnB1c2goe3RhZzoiYSIsaHJlZjphLmhyZWYsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pOmEudHlwZT09PSJiciI/aS5wdXNoKHt0YWc6ImJyIixjaGlsZHJlbjpbXX0pOmNvbnNvbGUuZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBtYXJrZG93bjogdW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogIi5jb25jYXQoYS50eXBlLCIuIEZvdW5kOiAiKS5jb25jYXQoYS5yYXcpKTtuKyt9LGw7bjx0Lmxlbmd0aDspaWYobD1vKCksbClyZXR1cm4gbC52O3JldHVybntjaGlsZHJlbjppLGN1cnNvcjpufX1mdW5jdGlvbiAkUyh0KXt2YXIgZT10LnRlbXBsYXRlU3RyaW5ncyxuPXQuZXhwcnMscj1lLmZsYXRNYXAoZnVuY3Rpb24oYSx1KXt2YXIgYz1uW3VdO3JldHVybiBjP2Nbbm5dPT09ImxpbmsiP2EuY29uY2F0KCIiLmNvbmNhdChDZCkuY29uY2F0KHUpLmNvbmNhdChyZykuY29uY2F0KGMuY2hpbGRyZW5bMF0pLmNvbmNhdChpZykpOmEuY29uY2F0KCIiLmNvbmNhdChDZCkuY29uY2F0KHUpLmNvbmNhdChyZykuY29uY2F0KGlnKSk6YX0pLmpvaW4oIiIpLGk9Z1Iocix7Z2ZtOiEwfSksbz1kcihpLG4sMCksbD1vLmNoaWxkcmVuLHM9by5jdXJzb3I7aWYocyE9PWkubGVuZ3RoKXRocm93IEVycm9yKCJVbmV4cGVjdGVkbHkgdGVybWluYXRlZCBtYXJrZG93biBwYXJzaW5nLiBQb3NzaWJsZSByZWFzb246IHVuY2xvc2VkIGh0bWwgdGFnPyIpO3JldHVybiBxdChxdCh7fSxubiwicmljaHRleHQiKSwiY2hpbGRyZW4iLGwpfXZhciB3bj17fSxqPXt9O2xldCBFZj17fSxUUz17fSx0dT17fSxrYT17fSxvZz17fSxHbD17fSxpdj17fSxsZz17fSxudT17fSxydT17fSxVaT17fSxvdj17fSxsdj17fSxOUz17fSxSUz17fSxPUz17fSxQUz17fSxBUz17fSxNUz17fSxMUz17fSxrZD17fSxJUz17fSxEUz17fSxqUz17fSx6Uz17fSxGUz17fSxCUz17fSxVUz17fSxXUz17fSxWUz17fSxzdj17fSxhdj17fSxzZz17fSxIUz17fSxLUz17fSxaUz17fTtmdW5jdGlvbiBHKHQpe2xldCBlPW5ldyBVUkxTZWFyY2hQYXJhbXM7ZS5hcHBlbmQoImNvZGUiLHQpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7dH07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke2V9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgd2k9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLEhSPXdpJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLFF0PXdpJiYvTWFjfGlQb2R8aVBob25lfGlQYWQvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxybz13aSYmL14oPyEuKlNlYW1vbmtleSkoPz0uKkZpcmVmb3gpLiovaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGJkPXdpJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFIUj8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSx1dj13aSYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLENmPXdpJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxLUj13aSYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksY3Y9d2kmJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhS1Isa2Y9dXZ8fENmfHxjdj8iwqAiOiLigIsiLFpSPXJvPyLCoCI6a2YsR1I9L15bXkEtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXSpbXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXS8sWVI9L15bXlx1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZkXHVmZTcwLVx1ZmVmY10qW0EtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXS8sSW89e2JvbGQ6MSxjb2RlOjE2LGhpZ2hsaWdodDoxMjgsaXRhbGljOjIsc3RyaWtldGhyb3VnaDo0LHN1YnNjcmlwdDozMixzdXBlcnNjcmlwdDo2NCx1bmRlcmxpbmU6OH0sWFI9e2RpcmVjdGlvbmxlc3M6MSx1bm1lcmdlYWJsZToyfSxJMD17Y2VudGVyOjIsZW5kOjYsanVzdGlmeTo0LGxlZnQ6MSxyaWdodDozLHN0YXJ0OjV9LFFSPXsyOiJjZW50ZXIiLDY6ImVuZCIsNDoianVzdGlmeSIsMToibGVmdCIsMzoicmlnaHQiLDU6InN0YXJ0In0sSlI9e25vcm1hbDowLHNlZ21lbnRlZDoyLHRva2VuOjF9LHFSPXswOiJub3JtYWwiLDI6InNlZ21lbnRlZCIsMToidG9rZW4ifSxhZz0hMSxkdj0wO2Z1bmN0aW9uIGVPKHQpe2R2PXQudGltZVN0YW1wfWZ1bmN0aW9uIFRoKHQsZSxuKXtyZXR1cm4gZS5fX2xleGljYWxMaW5lQnJlYWs9PT10fHx0W2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0hPT12b2lkIDB9ZnVuY3Rpb24gdE8odCl7cmV0dXJuIHQuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57bGV0IGU9cnQoKTtyZXR1cm4gZSE9PW51bGw/ZS5jbG9uZSgpOm51bGx9KX1mdW5jdGlvbiBHUyh0LGUsbil7YWc9ITA7bGV0IHI9MTAwPHBlcmZvcm1hbmNlLm5vdygpLWR2O3RyeXtXbih0LCgpPT57bGV0IGk9cnQoKXx8dE8odCk7dmFyIG89bmV3IE1hcCxsPXQuZ2V0Um9vdEVsZW1lbnQoKSxzPXQuX2VkaXRvclN0YXRlLGE9dC5fYmxvY2tDdXJzb3JFbGVtZW50O2xldCB1PSExLGM9IiI7Zm9yKHZhciBkPTA7ZDxlLmxlbmd0aDtkKyspe3ZhciBmPWVbZF0saD1mLnR5cGUsbT1mLnRhcmdldCxnPUR1KG0scyk7aWYoIShnPT09bnVsbCYmbSE9PWx8fHR0KGcpKSl7aWYoaD09PSJjaGFyYWN0ZXJEYXRhIil7aWYoZj1yJiZlZShnKSllOntmPWksaD1tO3ZhciB3PWc7aWYodmUoZikpe3ZhciB2PWYuYW5jaG9yLmdldE5vZGUoKTtpZih2LmlzKHcpJiZmLmZvcm1hdCE9PXYuZ2V0Rm9ybWF0KCkpe2Y9ITE7YnJlYWsgZX19Zj1oLm5vZGVUeXBlPT09MyYmdy5pc0F0dGFjaGVkKCl9ZiYmKHc9WHIodC5fd2luZG93KSxoPWY9bnVsbCx3IT09bnVsbCYmdy5hbmNob3JOb2RlPT09bSYmKGY9dy5hbmNob3JPZmZzZXQsaD13LmZvY3VzT2Zmc2V0KSxtPW0ubm9kZVZhbHVlLG0hPT1udWxsJiZ2dihnLG0sZixoLCExKSl9ZWxzZSBpZihoPT09ImNoaWxkTGlzdCIpe2Zvcih1PSEwLGg9Zi5hZGRlZE5vZGVzLHc9MDt3PGgubGVuZ3RoO3crKyl7dj1oW3ddO3ZhciB5PXRFKHYpLHg9di5wYXJlbnROb2RlO3g9PW51bGx8fHY9PT1hfHx5IT09bnVsbHx8di5ub2RlTmFtZT09PSJCUiImJlRoKHYseCx0KXx8KHJvJiYoeT12LmlubmVyVGV4dHx8di5ub2RlVmFsdWUpJiYoYys9eSkseC5yZW1vdmVDaGlsZCh2KSl9aWYoZj1mLnJlbW92ZWROb2RlcyxoPWYubGVuZ3RoLDA8aCl7Zm9yKHc9MCx2PTA7djxoO3YrKyl4PWZbdl0sKHgubm9kZU5hbWU9PT0iQlIiJiZUaCh4LG0sdCl8fGE9PT14KSYmKG0uYXBwZW5kQ2hpbGQoeCksdysrKTtoIT09dyYmKG09PT1sJiYoZz1zLl9ub2RlTWFwLmdldCgicm9vdCIpKSxvLnNldChtLGcpKX19fX1pZigwPG8uc2l6ZSlmb3IobGV0W1MsYl1vZiBvKWlmKFUoYikpZm9yKG89Yi5nZXRDaGlsZHJlbktleXMoKSxsPVMuZmlyc3RDaGlsZCxzPTA7czxvLmxlbmd0aDtzKyspYT10LmdldEVsZW1lbnRCeUtleShvW3NdKSxhIT09bnVsbCYmKGw9PW51bGw/KFMuYXBwZW5kQ2hpbGQoYSksbD1hKTpsIT09YSYmUy5yZXBsYWNlQ2hpbGQoYSxsKSxsPWwubmV4dFNpYmxpbmcpO2Vsc2UgZWUoYikmJmIubWFya0RpcnR5KCk7aWYobz1uLnRha2VSZWNvcmRzKCksMDxvLmxlbmd0aCl7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IoYT1vW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKWc9c1tkXSxtPWcucGFyZW50Tm9kZSxtPT1udWxsfHxnLm5vZGVOYW1lIT09IkJSInx8VGgoZyxhLHQpfHxtLnJlbW92ZUNoaWxkKGcpO24udGFrZVJlY29yZHMoKX1pIT09bnVsbCYmKHUmJihpLmRpcnR5PSEwLFdyKGkpKSxybyYmb0UodCkmJmkuaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e2FnPSExfX1mdW5jdGlvbiBZUyh0KXtsZXQgZT10Ll9vYnNlcnZlcjtpZihlIT09bnVsbCl7bGV0IG49ZS50YWtlUmVjb3JkcygpO0dTKHQsbixlKX19ZnVuY3Rpb24gWFModCl7ZHY9PT0wJiYkZih0KS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGVPLCEwKSx0Ll9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigoZSxuKT0+e0dTKHQsZSxuKX0pfWZ1bmN0aW9uIEQwKHQsZSl7bGV0IG49dC5fX21vZGUscj10Ll9fZm9ybWF0O3Q9dC5fX3N0eWxlO2xldCBpPWUuX19tb2RlLG89ZS5fX2Zvcm1hdDtyZXR1cm4gZT1lLl9fc3R5bGUsKG49PT1udWxsfHxuPT09aSkmJihyPT09bnVsbHx8cj09PW8pJiYodD09PW51bGx8fHQ9PT1lKX1mdW5jdGlvbiBqMCh0LGUpe2xldCBuPXQubWVyZ2VXaXRoU2libGluZyhlKSxyPXB0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQodC5fX2tleSksci5hZGQoZS5fX2tleSksbn1mdW5jdGlvbiBRUyh0KXtpZih0Ll9fdGV4dD09PSIiJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkpdC5yZW1vdmUoKTtlbHNle2Zvcih2YXIgZTsoZT10LmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJmVlKGUpJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCk7KWlmKGUuX190ZXh0PT09IiIpZS5yZW1vdmUoKTtlbHNle0QwKGUsdCkmJih0PWowKGUsdCkpO2JyZWFrfWZvcih2YXIgbjsobj10LmdldE5leHRTaWJsaW5nKCkpIT09bnVsbCYmZWUobikmJm4uaXNTaW1wbGVUZXh0KCkmJiFuLmlzVW5tZXJnZWFibGUoKTspaWYobi5fX3RleHQ9PT0iIiluLnJlbW92ZSgpO2Vsc2V7RDAodCxuKSYmajAodCxuKTticmVha319fWZ1bmN0aW9uIGZ2KHQpe3JldHVybiB6MCh0LmFuY2hvciksejAodC5mb2N1cyksdH1mdW5jdGlvbiB6MCh0KXtmb3IoO3QudHlwZT09PSJlbGVtZW50Ijspe3ZhciBlPXQuZ2V0Tm9kZSgpLG49dC5vZmZzZXQ7aWYobj09PWUuZ2V0Q2hpbGRyZW5TaXplKCk/KGU9ZS5nZXRDaGlsZEF0SW5kZXgobi0xKSxuPSEwKTooZT1lLmdldENoaWxkQXRJbmRleChuKSxuPSExKSxlZShlKSl7dC5zZXQoZS5fX2tleSxuP2UuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIVUoZSkpYnJlYWs7dC5zZXQoZS5fX2tleSxuP2UuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgbk89MSxyTz10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dD0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4odCl9O2Z1bmN0aW9uIGh2KHQpe2xldCBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoZT09PW51bGwpcmV0dXJuITE7bGV0IG49ZS5ub2RlTmFtZTtyZXR1cm4gdHQoRHUodCkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmZS5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEl1KHQsZSxuKXtsZXQgcj10LmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyhlKSYmci5jb250YWlucyhuKSYmZSE9PW51bGwmJiFodihlKSYmcHYoZSk9PT10fWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBwdih0KXtmb3IoO3QhPW51bGw7KXtsZXQgZT10Ll9fbGV4aWNhbEVkaXRvcjtpZihlIT1udWxsKXJldHVybiBlO3Q9YmYodCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdWcodCl7cmV0dXJuIHQuaXNUb2tlbigpfHx0LmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gJGQodCl7Zm9yKDt0IT1udWxsOyl7aWYodC5ub2RlVHlwZT09PTMpcmV0dXJuIHQ7dD10LmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSlModCxlLG4pe3JldHVybiBlPUlvW2VdLHQmZSYmKG49PT1udWxsfHwhKG4mZSkpP3ReZTpuPT09bnVsbHx8biZlP3R8ZTp0fWZ1bmN0aW9uIHFTKHQpe3JldHVybiBlZSh0KXx8c3UodCl8fHR0KHQpfWZ1bmN0aW9uIGVFKHQsZSl7aWYoZSE9bnVsbCl0Ll9fa2V5PWU7ZWxzZXtobigpLDk5PGF1JiZHKDE0KSxlPXB0KCk7dmFyIG49UXIoKSxyPSIiK25PKys7bi5fbm9kZU1hcC5zZXQocix0KSxVKHQpP2UuX2RpcnR5RWxlbWVudHMuc2V0KHIsITApOmUuX2RpcnR5TGVhdmVzLmFkZChyKSxlLl9jbG9uZU5vdE5lZWRlZC5hZGQociksZS5fZGlydHlUeXBlPTEsdC5fX2tleT1yfX1mdW5jdGlvbiBEbyh0KXt2YXIgZT10LmdldFBhcmVudCgpO2lmKGUhPT1udWxsKXtsZXQgaT10LmdldFdyaXRhYmxlKCk7ZT1lLmdldFdyaXRhYmxlKCk7dmFyIG49dC5nZXRQcmV2aW91c1NpYmxpbmcoKTtpZih0PXQuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbClpZih0IT09bnVsbCl7dmFyIHI9dC5nZXRXcml0YWJsZSgpO2UuX19maXJzdD10Ll9fa2V5LHIuX19wcmV2PW51bGx9ZWxzZSBlLl9fZmlyc3Q9bnVsbDtlbHNle2lmKHI9bi5nZXRXcml0YWJsZSgpLHQhPT1udWxsKXtsZXQgbz10LmdldFdyaXRhYmxlKCk7by5fX3ByZXY9ci5fX2tleSxyLl9fbmV4dD1vLl9fa2V5fWVsc2Ugci5fX25leHQ9bnVsbDtpLl9fcHJldj1udWxsfXQ9PT1udWxsP24hPT1udWxsPyh0PW4uZ2V0V3JpdGFibGUoKSxlLl9fbGFzdD1uLl9fa2V5LHQuX19uZXh0PW51bGwpOmUuX19sYXN0PW51bGw6KHQ9dC5nZXRXcml0YWJsZSgpLG4hPT1udWxsPyhuPW4uZ2V0V3JpdGFibGUoKSxuLl9fbmV4dD10Ll9fa2V5LHQuX19wcmV2PW4uX19rZXkpOnQuX19wcmV2PW51bGwsaS5fX25leHQ9bnVsbCksZS5fX3NpemUtLSxpLl9fcGFyZW50PW51bGx9fWZ1bmN0aW9uIFRkKHQpezk5PGF1JiZHKDE0KTt2YXIgZT10LmdldExhdGVzdCgpLG49ZS5fX3BhcmVudCxyPVFyKCk7bGV0IGk9cHQoKSxvPXIuX25vZGVNYXA7aWYocj1pLl9kaXJ0eUVsZW1lbnRzLG4hPT1udWxsKWU6Zm9yKDtuIT09bnVsbDspe2lmKHIuaGFzKG4pKWJyZWFrIGU7bGV0IGw9by5nZXQobik7aWYobD09PXZvaWQgMClicmVhaztyLnNldChuLCExKSxuPWwuX19wYXJlbnR9ZT1lLl9fa2V5LGkuX2RpcnR5VHlwZT0xLFUodCk/ci5zZXQoZSwhMCk6aS5fZGlydHlMZWF2ZXMuYWRkKGUpfWZ1bmN0aW9uIEt0KHQpe2huKCk7dmFyIGU9cHQoKTtsZXQgbj1lLl9jb21wb3NpdGlvbktleTt0IT09biYmKGUuX2NvbXBvc2l0aW9uS2V5PXQsbiE9PW51bGwmJihlPUR0KG4pLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpLHQhPT1udWxsJiYodD1EdCh0KSx0IT09bnVsbCYmdC5nZXRXcml0YWJsZSgpKSl9ZnVuY3Rpb24gV2koKXtyZXR1cm4gTnMoKT9udWxsOnB0KCkuX2NvbXBvc2l0aW9uS2V5fWZ1bmN0aW9uIER0KHQsZSl7cmV0dXJuIHQ9KGV8fFFyKCkpLl9ub2RlTWFwLmdldCh0KSx0PT09dm9pZCAwP251bGw6dH1mdW5jdGlvbiB0RSh0LGUpe2xldCBuPXB0KCk7cmV0dXJuIHQ9dFtgX19sZXhpY2FsS2V5XyR7bi5fa2V5fWBdLHQhPT12b2lkIDA/RHQodCxlKTpudWxsfWZ1bmN0aW9uIER1KHQsZSl7Zm9yKDt0IT1udWxsOyl7bGV0IG49dEUodCxlKTtpZihuIT09bnVsbClyZXR1cm4gbjt0PWJmKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIG5FKHQpe2xldCBlPU9iamVjdC5hc3NpZ24oe30sdC5fZGVjb3JhdG9ycyk7cmV0dXJuIHQuX3BlbmRpbmdEZWNvcmF0b3JzPWV9ZnVuY3Rpb24gRjAodCl7cmV0dXJuIHQucmVhZCgoKT0+WXIoKS5nZXRUZXh0Q29udGVudCgpKX1mdW5jdGlvbiBpTyh0LGUpe1duKHQsKCk9Pnt2YXIgbj1RcigpO2lmKCFuLmlzRW1wdHkoKSlpZihlPT09InJvb3QiKVlyKCkubWFya0RpcnR5KCk7ZWxzZXtuPW4uX25vZGVNYXA7Zm9yKGxldFsscl1vZiBuKXIubWFya0RpcnR5KCl9fSx0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsP3t0YWc6Imhpc3RvcnktbWVyZ2UifTp2b2lkIDApfWZ1bmN0aW9uIFlyKCl7cmV0dXJuIFFyKCkuX25vZGVNYXAuZ2V0KCJyb290Iil9ZnVuY3Rpb24gV3IodCl7aG4oKTtsZXQgZT1RcigpO3QhPT1udWxsJiYodC5kaXJ0eT0hMCx0Ll9jYWNoZWROb2Rlcz1udWxsKSxlLl9zZWxlY3Rpb249dH1mdW5jdGlvbiBqbCh0KXt2YXIgZT1wdCgpLG47ZTp7Zm9yKG49dDtuIT1udWxsOyl7bGV0IHI9bltgX19sZXhpY2FsS2V5XyR7ZS5fa2V5fWBdO2lmKHIhPT12b2lkIDApe249cjticmVhayBlfW49YmYobil9bj1udWxsfXJldHVybiBuPT09bnVsbD8oZT1lLmdldFJvb3RFbGVtZW50KCksdD09PWU/RHQoInJvb3QiKTpudWxsKTpEdChuKX1mdW5jdGlvbiByRSh0KXtyZXR1cm4vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2cudGVzdCh0KX1mdW5jdGlvbiBndih0KXtsZXQgZT1bXTtmb3IoO3QhPT1udWxsOyllLnB1c2godCksdD10Ll9wYXJlbnRFZGl0b3I7cmV0dXJuIGV9ZnVuY3Rpb24gaUUoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvW15hLXpdKy9nLCIiKS5zdWJzdHIoMCw1KX1mdW5jdGlvbiBtdih0LGUsbil7aWYoZT1YcihlLl93aW5kb3cpLGUhPT1udWxsKXt2YXIgcj1lLmFuY2hvck5vZGUse2FuY2hvck9mZnNldDppLGZvY3VzT2Zmc2V0Om99PWU7aWYociE9PW51bGwmJihlPXIubm9kZVR5cGU9PT0zP3Iubm9kZVZhbHVlOm51bGwscj1EdShyKSxlIT09bnVsbCYmZWUocikpKXtpZihlPT09a2YmJm4pe2xldCBsPW4ubGVuZ3RoO2U9bixvPWk9bH1lIT09bnVsbCYmdnYocixlLGksbyx0KX19fWZ1bmN0aW9uIHZ2KHQsZSxuLHIsaSl7bGV0IG89dDtpZihvLmlzQXR0YWNoZWQoKSYmKGl8fCFvLmlzRGlydHkoKSkpe2xldCB1PW8uaXNDb21wb3NpbmcoKSxjPWU7aWYoKHV8fGkpJiZlW2UubGVuZ3RoLTFdPT09a2YmJihjPWUuc2xpY2UoMCwtMSkpLGU9by5nZXRUZXh0Q29udGVudCgpLGl8fGMhPT1lKWlmKGM9PT0iIilpZihLdChudWxsKSx1dnx8Q2Z8fGN2KW8ucmVtb3ZlKCk7ZWxzZXtsZXQgZD1wdCgpO3NldFRpbWVvdXQoKCk9PntkLnVwZGF0ZSgoKT0+e28uaXNBdHRhY2hlZCgpJiZvLnJlbW92ZSgpfSl9LDIwKX1lbHNle2k9by5nZXRQYXJlbnQoKSxlPVRzKCk7dmFyIGw9by5nZXRUZXh0Q29udGVudFNpemUoKSxzPVdpKCksYT1vLmdldEtleSgpO28uaXNUb2tlbigpfHxzIT09bnVsbCYmYT09PXMmJiF1fHx2ZShlKSYmKGkhPT1udWxsJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmUuYW5jaG9yLm9mZnNldD09PTB8fGUuYW5jaG9yLmtleT09PXQuX19rZXkmJmUuYW5jaG9yLm9mZnNldD09PTAmJiFvLmNhbkluc2VydFRleHRCZWZvcmUoKXx8ZS5mb2N1cy5rZXk9PT10Ll9fa2V5JiZlLmZvY3VzLm9mZnNldD09PWwmJiFvLmNhbkluc2VydFRleHRBZnRlcigpKT9vLm1hcmtEaXJ0eSgpOih0PXJ0KCksdmUodCkmJm4hPT1udWxsJiZyIT09bnVsbCYmKHQuc2V0VGV4dE5vZGVSYW5nZShvLG4sbyxyKSxvLmlzU2VnbWVudGVkKCkmJihuPW8uZ2V0VGV4dENvbnRlbnQoKSxuPUx0KG4pLG8ucmVwbGFjZShuKSxvPW4pKSxvLnNldFRleHRDb250ZW50KGMpKX19fWZ1bmN0aW9uIG9PKHQsZSl7aWYoZS5pc1NlZ21lbnRlZCgpKXJldHVybiEwO2lmKCF0LmlzQ29sbGFwc2VkKCkpcmV0dXJuITE7dD10LmFuY2hvci5vZmZzZXQ7bGV0IG49ZS5nZXRQYXJlbnRPclRocm93KCkscj1lLmlzVG9rZW4oKTtyZXR1cm4gdD09PTA/KCh0PSFlLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IW4uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHxyKXx8KGU9ZS5nZXRQcmV2aW91c1NpYmxpbmcoKSx0PShlZShlKXx8VShlKSYmZS5pc0lubGluZSgpKSYmIWUuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLHQpOnQ9PT1lLmdldFRleHRDb250ZW50U2l6ZSgpPyFlLmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiBiYSh0LGUpe3QuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJih0Ll9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj10Ll9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9bltlXTtyZXR1cm4gciE9PXZvaWQgMD9yOih0PXRbZV0sdHlwZW9mIHQ9PSJzdHJpbmciPyh0PXQuc3BsaXQoIiAiKSxuW2VdPXQpOnQpfWZ1bmN0aW9uIHl2KHQsZSxuLHIsaSl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LGU9ZS5nZXQobiksZT09PXZvaWQgMCYmRygzMyxuKSxuPWUua2xhc3MsZT10LmdldChuKSxlPT09dm9pZCAwJiYoZT1uZXcgTWFwLHQuc2V0KG4sZSkpLHQ9ZS5nZXQociksbj10PT09ImRlc3Ryb3llZCImJmk9PT0iY3JlYXRlZCIsKHQ9PT12b2lkIDB8fG4pJiZlLnNldChyLG4/InVwZGF0ZWQiOmkpKX1mdW5jdGlvbiBCMCh0LGUsbil7bGV0IHI9dC5nZXRQYXJlbnQoKSxpPW47cmV0dXJuIHIhPT1udWxsJiYoZSYmbj09PTA/KGk9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLHQ9cik6ZXx8biE9PXQuZ2V0Q2hpbGRyZW5TaXplKCl8fChpPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLHQ9cikpLHQuZ2V0Q2hpbGRBdEluZGV4KGU/aS0xOmkpfWZ1bmN0aW9uIGNnKHQsZSl7dmFyIG49dC5vZmZzZXQ7cmV0dXJuIHQudHlwZT09PSJlbGVtZW50Ij8odD10LmdldE5vZGUoKSxCMCh0LGUsbikpOih0PXQuZ2V0Tm9kZSgpLGUmJm49PT0wfHwhZSYmbj09PXQuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49ZT90LmdldFByZXZpb3VzU2libGluZygpOnQuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD9CMCh0LmdldFBhcmVudE9yVGhyb3coKSxlLHQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsoZT8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBvRSh0KXtyZXR1cm4gdD0odD0kZih0KS5ldmVudCkmJnQuaW5wdXRUeXBlLHQ9PT0iaW5zZXJ0RnJvbVBhc3RlInx8dD09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24gTmQodCl7cmV0dXJuIWduKHQpJiYhdC5pc0xhc3RDaGlsZCgpJiYhdC5pc0lubGluZSgpfWZ1bmN0aW9uIFJkKHQsZSl7cmV0dXJuIHQ9dC5fa2V5VG9ET01NYXAuZ2V0KGUpLHQ9PT12b2lkIDAmJkcoNzUsZSksdH1mdW5jdGlvbiBiZih0KXtyZXR1cm4gdD10LmFzc2lnbmVkU2xvdHx8dC5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0Lm5vZGVUeXBlPT09MTE/dC5ob3N0OnR9ZnVuY3Rpb24gT2QodCxlKXtmb3IodD10LmdldFBhcmVudCgpO3QhPT1udWxsOyl7aWYodC5pcyhlKSlyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gJGYodCl7cmV0dXJuIHQ9dC5fd2luZG93LHQ9PT1udWxsJiZHKDc4KSx0fWZ1bmN0aW9uIGxFKHQpe2Zvcih0PXQuZ2V0UGFyZW50T3JUaHJvdygpO3QhPT1udWxsJiYhdnIodCk7KXQ9dC5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHR9ZnVuY3Rpb24gdnIodCl7cmV0dXJuIGduKHQpfHxVKHQpJiZ0LmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIHNFKHQpe3JldHVybiB0PXQuY29uc3RydWN0b3IuY2xvbmUodCksZUUodCxudWxsKSx0fWZ1bmN0aW9uIGp1KHQpe3ZhciBlPXB0KCk7bGV0IG49dC5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIGU9ZS5fbm9kZXMuZ2V0KG4pLGU9PT12b2lkIDAmJkcoOTcpLGU9ZS5yZXBsYWNlLGUhPT1udWxsPyhlPWUodCksZSBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3J8fEcoOTgpLGUpOnR9ZnVuY3Rpb24gTmgodCxlKXt0PXQuZ2V0UGFyZW50KCksIWduKHQpfHxVKGUpfHx0dChlKXx8Ryg5OSl9ZnVuY3Rpb24gUmgodCl7cmV0dXJuKHR0KHQpfHxVKHQpJiYhdC5jYW5CZUVtcHR5KCkpJiYhdC5pc0lubGluZSgpfWZ1bmN0aW9uIGRnKHQsZSxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLGUuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLGU9dC5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIFhyKHQpe3JldHVybiB3aT8odHx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIGFFKHQsZSl7bGV0IG49dC5nZXRDaGlsZEF0SW5kZXgoZSk7bj09bnVsbCYmKG49dCksdnIodCkmJkcoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPXZyKHMpLHU9bCE9PW58fGE/c0UobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtpLG9dPXIobik7cmV0dXJuW2ksb119ZnVuY3Rpb24gUGQodCxlKXtmb3IoO3QhPT1ZcigpJiZ0IT1udWxsOyl7aWYoZSh0KSlyZXR1cm4gdDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbE8odCl7bGV0IGU9W10sbj1bdF07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZHKDExMiksVShyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PXQmJmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBUZih0KXtyZXR1cm4gdC5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gdUUodCxlLG4scixpLG8pe2Zvcih0PXQuZ2V0Rmlyc3RDaGlsZCgpO3QhPT1udWxsOyl7bGV0IGw9dC5fX2tleTt0Ll9fcGFyZW50PT09ZSYmKFUodCkmJnVFKHQsbCxuLHIsaSxvKSxuLmhhcyhsKXx8by5kZWxldGUobCksaS5wdXNoKGwpKSx0PXQuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24gc08odCxlLG4scil7dD10Ll9ub2RlTWFwLGU9ZS5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0W29db2Ygcil7bGV0IGw9ZS5nZXQobyk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChVKGwpJiZ1RShsLG8sdCxlLGksciksdC5oYXMobyl8fHIuZGVsZXRlKG8pLGkucHVzaChvKSl9Zm9yKGxldCBvIG9mIGkpZS5kZWxldGUobyk7Zm9yKGxldCBvIG9mIG4pcj1lLmdldChvKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KHQuaGFzKG8pfHxuLmRlbGV0ZShvKSxlLmRlbGV0ZShvKSl9bGV0IE50PSIiLGZuPSIiLG9pPSIiLGlvLHRuLGl1LGNFPSExLHh2PSExLE5mLEJjPW51bGwsZmcsaGcsS28sb28scGcsb3U7ZnVuY3Rpb24gVWModCxlKXtsZXQgbj1Lby5nZXQodCk7aWYoZSE9PW51bGwpe2xldCByPXZnKHQpO3IucGFyZW50Tm9kZT09PWUmJmUucmVtb3ZlQ2hpbGQocil9b28uaGFzKHQpfHx0bi5fa2V5VG9ET01NYXAuZGVsZXRlKHQpLFUobikmJih0PUFkKG4sS28pLGdnKHQsMCx0Lmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZ5dihvdSxpdSxOZixuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBnZyh0LGUsbixyKXtmb3IoO2U8PW47KytlKXtsZXQgaT10W2VdO2khPT12b2lkIDAmJlVjKGkscil9fWZ1bmN0aW9uIEVvKHQsZSl7dC5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsZSl9ZnVuY3Rpb24gZEUodCxlKXt2YXIgbj1pby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj10LmNsYXNzTGlzdC5jb250YWlucyhuKTswPGUmJiFyP3QuY2xhc3NMaXN0LmFkZChuKToxPmUmJnImJnQuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4Iix0LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsZT09PTA/IiI6YGNhbGMoJHtlfSAqICR7bn0pYCl9ZnVuY3Rpb24gZkUodCxlKXt0PXQuc3R5bGUsZT09PTA/RW8odCwiIik6ZT09PTE/RW8odCwibGVmdCIpOmU9PT0yP0VvKHQsImNlbnRlciIpOmU9PT0zP0VvKHQsInJpZ2h0Iik6ZT09PTQ/RW8odCwianVzdGlmeSIpOmU9PT01P0VvKHQsInN0YXJ0Iik6ZT09PTYmJkVvKHQsImVuZCIpfWZ1bmN0aW9uIFdjKHQsZSxuKXtsZXQgcj1vby5nZXQodCk7cj09PXZvaWQgMCYmRyg2MCk7bGV0IGk9ci5jcmVhdGVET00oaW8sdG4pO3ZhciBvPXRuLl9rZXlUb0RPTU1hcDtpZihpWyJfX2xleGljYWxLZXlfIit0bi5fa2V5XT10LG8uc2V0KHQsaSksZWUocik/aS5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC10ZXh0IiwidHJ1ZSIpOnR0KHIpJiZpLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWRlY29yYXRvciIsInRydWUiKSxVKHIpKXtpZih0PXIuX19pbmRlbnQsbz1yLl9fc2l6ZSx0IT09MCYmZEUoaSx0KSxvIT09MCl7LS1vLHQ9QWQocixvbyk7dmFyIGw9Zm47Zm49IiIsbWcodCxyLDAsbyxpLG51bGwpLHBFKHIsaSksZm49bH10PXIuX19mb3JtYXQsdCE9PTAmJmZFKGksdCksci5pc0lubGluZSgpfHxoRShudWxsLHIsaSksTmQocikmJihOdCs9YAoKYCxvaSs9YAoKYCl9ZWxzZSBvPXIuZ2V0VGV4dENvbnRlbnQoKSx0dChyKT8obD1yLmRlY29yYXRlKHRuLGlvKSxsIT09bnVsbCYmZ0UodCxsKSxpLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiKTplZShyKSYmKHIuaXNEaXJlY3Rpb25sZXNzKCl8fChmbis9bykpLE50Kz1vLG9pKz1vO3JldHVybiBlIT09bnVsbCYmKG4hPW51bGw/ZS5pbnNlcnRCZWZvcmUoaSxuKToobj1lLl9fbGV4aWNhbExpbmVCcmVhayxuIT1udWxsP2UuaW5zZXJ0QmVmb3JlKGksbik6ZS5hcHBlbmRDaGlsZChpKSkpLHl2KG91LGl1LE5mLHIsImNyZWF0ZWQiKSxpfWZ1bmN0aW9uIG1nKHQsZSxuLHIsaSxvKXtsZXQgbD1OdDtmb3IoTnQ9IiI7bjw9cjsrK24pV2ModFtuXSxpLG8pO05kKGUpJiYoTnQrPWAKCmApLGkuX19sZXhpY2FsVGV4dENvbnRlbnQ9TnQsTnQ9bCtOdH1mdW5jdGlvbiBVMCh0LGUpe3JldHVybiB0PWUuZ2V0KHQpLHN1KHQpfHx0dCh0KSYmdC5pc0lubGluZSgpfWZ1bmN0aW9uIGhFKHQsZSxuKXt0PXQhPT1udWxsJiYodC5fX3NpemU9PT0wfHxVMCh0Ll9fbGFzdCxLbykpLGU9ZS5fX3NpemU9PT0wfHxVMChlLl9fbGFzdCxvbyksdD9lfHwoZT1uLl9fbGV4aWNhbExpbmVCcmVhayxlIT1udWxsJiZuLnJlbW92ZUNoaWxkKGUpLG4uX19sZXhpY2FsTGluZUJyZWFrPW51bGwpOmUmJihlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIiksbi5fX2xleGljYWxMaW5lQnJlYWs9ZSxuLmFwcGVuZENoaWxkKGUpKX1mdW5jdGlvbiBwRSh0LGUpe3ZhciBuPWUuX19sZXhpY2FsRGlyO2lmKGUuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQhPT1mbnx8biE9PUJjKXtsZXQgbz1mbj09PSIiO2lmKG8pdmFyIHI9QmM7ZWxzZSByPWZuLHI9R1IudGVzdChyKT8icnRsIjpZUi50ZXN0KHIpPyJsdHIiOm51bGw7aWYociE9PW4pe2xldCBsPWUuY2xhc3NMaXN0LHM9aW8udGhlbWU7dmFyIGk9biE9PW51bGw/c1tuXTp2b2lkIDA7bGV0IGE9ciE9PW51bGw/c1tyXTp2b2lkIDA7aSE9PXZvaWQgMCYmKHR5cGVvZiBpPT0ic3RyaW5nIiYmKGk9aS5zcGxpdCgiICIpLGk9c1tuXT1pKSxsLnJlbW92ZSguLi5pKSkscj09PW51bGx8fG8mJnI9PT0ibHRyIj9lLnJlbW92ZUF0dHJpYnV0ZSgiZGlyIik6KGEhPT12b2lkIDAmJih0eXBlb2YgYT09InN0cmluZyImJihuPWEuc3BsaXQoIiAiKSxhPXNbcl09biksYSE9PXZvaWQgMCYmbC5hZGQoLi4uYSkpLGUuZGlyPXIpLHh2fHwodC5nZXRXcml0YWJsZSgpLl9fZGlyPXIpfUJjPXIsZS5fX2xleGljYWxEaXJUZXh0Q29udGVudD1mbixlLl9fbGV4aWNhbERpcj1yfX1mdW5jdGlvbiBBZCh0LGUpe2xldCBuPVtdO2Zvcih0PXQuX19maXJzdDt0IT09bnVsbDspe2xldCByPWUuZ2V0KHQpO3I9PT12b2lkIDAmJkcoMTAxKSxuLnB1c2godCksdD1yLl9fbmV4dH1yZXR1cm4gbn1mdW5jdGlvbiB1YSh0LGUpe3ZhciBuPUtvLmdldCh0KSxyPW9vLmdldCh0KTtuIT09dm9pZCAwJiZyIT09dm9pZCAwfHxHKDYxKTt2YXIgaT1jRXx8aGcuaGFzKHQpfHxmZy5oYXModCk7bGV0IG89UmQodG4sdCk7aWYobj09PXImJiFpKXJldHVybiBVKG4pPyhyPW8uX19sZXhpY2FsVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKE50Kz1yLG9pKz1yKSxyPW8uX19sZXhpY2FsRGlyVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKGZuKz1yKSk6KHI9bi5nZXRUZXh0Q29udGVudCgpLGVlKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKGZuKz1yKSxvaSs9cixOdCs9ciksbztpZihuIT09ciYmaSYmeXYob3UsaXUsTmYsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4sbyxpbykpcmV0dXJuIHI9V2ModCxudWxsLG51bGwpLGU9PT1udWxsJiZHKDYyKSxlLnJlcGxhY2VDaGlsZChyLG8pLFVjKHQsbnVsbCkscjtpZihVKG4pJiZVKHIpKXtpZih0PXIuX19pbmRlbnQsdCE9PW4uX19pbmRlbnQmJmRFKG8sdCksdD1yLl9fZm9ybWF0LHQhPT1uLl9fZm9ybWF0JiZmRShvLHQpLGkpe3Q9cixpPWZuLGZuPSIiLGU9TnQ7dmFyIGw9bi5fX3NpemUscz10Ll9fc2l6ZTtpZihOdD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PXQuX19maXJzdDtpZihhPT09dSl1YShhLG8pO2Vsc2V7dmFyIGM9dmcoYSk7dT1XYyh1LG51bGwsbnVsbCksby5yZXBsYWNlQ2hpbGQodSxjKSxVYyhhLG51bGwpfX1lbHNle3U9QWQobixLbyk7dmFyIGQ9QWQodCxvbyk7aWYobD09PTApcyE9PTAmJm1nKGQsdCwwLHMtMSxvLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPW8uX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLGdnKHUsMCxsLTEsYT9udWxsOm8pLGEmJihvLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgbT1vLmZpcnN0Q2hpbGQsZz0wO2ZvcihzPTA7Zzw9ZCYmczw9bDspe3ZhciBoPWZbZ107bGV0IHc9dVtzXTtpZihoPT09dyltPU9oKHVhKHcsbykpLGcrKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKHcpO3Y/KHk/KGg9UmQodG4sdyksaD09PW0/bT1PaCh1YSh3LG8pKToobSE9bnVsbD9vLmluc2VydEJlZm9yZShoLG0pOm8uYXBwZW5kQ2hpbGQoaCksdWEodyxvKSksZysrKTpXYyh3LG8sbSkscysrKToobT1PaCh2ZyhoKSksVWMoaCxvKSxnKyspfX1hPWc+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6dG4uZ2V0RWxlbWVudEJ5S2V5KGEpLG1nKHUsdCxzLGwsbyxhKSk6YyYmIWEmJmdnKGYsZyxkLG8pfX1OZCh0KSYmKE50Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PU50LE50PWUrTnQscEUodCxvKSxmbj1pLGduKHIpfHxyLmlzSW5saW5lKCl8fGhFKG4scixvKX1OZChyKSYmKE50Kz1gCgpgLG9pKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLHR0KHIpPyhpPXIuZGVjb3JhdGUodG4saW8pLGkhPT1udWxsJiZnRSh0LGkpKTplZShyKSYmIXIuaXNEaXJlY3Rpb25sZXNzKCkmJihmbis9biksTnQrPW4sb2krPW47cmV0dXJuIXh2JiZnbihyKSYmci5fX2NhY2hlZFRleHQhPT1vaSYmKHI9ci5nZXRXcml0YWJsZSgpLHIuX19jYWNoZWRUZXh0PW9pKSxvfWZ1bmN0aW9uIGdFKHQsZSl7bGV0IG49dG4uX3BlbmRpbmdEZWNvcmF0b3JzLHI9dG4uX2RlY29yYXRvcnM7aWYobj09PW51bGwpe2lmKHJbdF09PT1lKXJldHVybjtuPW5FKHRuKX1uW3RdPWV9ZnVuY3Rpb24gT2godCl7cmV0dXJuIHQ9dC5uZXh0U2libGluZyx0IT09bnVsbCYmdD09PXRuLl9ibG9ja0N1cnNvckVsZW1lbnQmJih0PXQubmV4dFNpYmxpbmcpLHR9ZnVuY3Rpb24gdmcodCl7bGV0IGU9cGcuZ2V0KHQpO3JldHVybiBlPT09dm9pZCAwJiZHKDc1LHQpLGV9bGV0IGVpPU9iamVjdC5mcmVlemUoe30pLHlnPVtbImtleWRvd24iLGdPXSxbInBvaW50ZXJkb3duIix1T10sWyJjb21wb3NpdGlvbnN0YXJ0IixoT10sWyJjb21wb3NpdGlvbmVuZCIscE9dLFsiaW5wdXQiLGZPXSxbImNsaWNrIixhT10sWyJjdXQiLGVpXSxbImNvcHkiLGVpXSxbImRyYWdzdGFydCIsZWldLFsiZHJhZ292ZXIiLGVpXSxbImRyYWdlbmQiLGVpXSxbInBhc3RlIixlaV0sWyJmb2N1cyIsZWldLFsiYmx1ciIsZWldLFsiZHJvcCIsZWldXTtiZCYmeWcucHVzaChbImJlZm9yZWlucHV0IiwodCxlKT0+ZE8odCxlKV0pO2xldCBsdT0wLG1FPTAsdkU9MCxDbD1udWxsLCRhPTAseGc9ITEsX2c9ITEsVGE9ITEsY2E9ITEseUU9WzAsIiIsMCwicm9vdCIsMF07ZnVuY3Rpb24geEUodCxlLG4scixpKXtsZXQgbz10LmFuY2hvcixsPXQuZm9jdXMscz1vLmdldE5vZGUoKTt2YXIgYT1wdCgpO2xldCB1PVhyKGEuX3dpbmRvdyksYz11IT09bnVsbD91LmFuY2hvck5vZGU6bnVsbCxkPW8ua2V5O2E9YS5nZXRFbGVtZW50QnlLZXkoZCk7bGV0IGY9bi5sZW5ndGg7cmV0dXJuIGQhPT1sLmtleXx8IWVlKHMpfHwoIWkmJighYmR8fHZFPHIrNTApfHxzLmlzRGlydHkoKSYmMj5mfHxyRShuKSkmJm8ub2Zmc2V0IT09bC5vZmZzZXQmJiFzLmlzQ29tcG9zaW5nKCl8fHVnKHMpfHxzLmlzRGlydHkoKSYmMTxmfHwoaXx8IWJkKSYmYSE9PW51bGwmJiFzLmlzQ29tcG9zaW5nKCkmJmMhPT0kZChhKXx8dSE9PW51bGwmJmUhPT1udWxsJiYoIWUuY29sbGFwc2VkfHxlLnN0YXJ0Q29udGFpbmVyIT09dS5hbmNob3JOb2RlfHxlLnN0YXJ0T2Zmc2V0IT09dS5hbmNob3JPZmZzZXQpfHxzLmdldEZvcm1hdCgpIT09dC5mb3JtYXR8fHMuZ2V0U3R5bGUoKSE9PXQuc3R5bGV8fG9PKHQscyl9ZnVuY3Rpb24gVzAodCxlKXtyZXR1cm4gdCE9PW51bGwmJnQubm9kZVZhbHVlIT09bnVsbCYmdC5ub2RlVHlwZT09PTMmJmUhPT0wJiZlIT09dC5ub2RlVmFsdWUubGVuZ3RofWZ1bmN0aW9uIFYwKHQsZSxuKXtsZXR7YW5jaG9yTm9kZTpyLGFuY2hvck9mZnNldDppLGZvY3VzTm9kZTpvLGZvY3VzT2Zmc2V0Omx9PXQ7eGcmJih4Zz0hMSxXMChyLGkpJiZXMChvLGwpKXx8V24oZSwoKT0+e2lmKCFuKVdyKG51bGwpO2Vsc2UgaWYoSXUoZSxyLG8pKXt2YXIgcz1ydCgpO2lmKHZlKHMpKXt2YXIgYT1zLmFuY2hvcix1PWEuZ2V0Tm9kZSgpO2lmKHMuaXNDb2xsYXBzZWQoKSl7dC50eXBlPT09IlJhbmdlIiYmdC5hbmNob3JOb2RlPT09dC5mb2N1c05vZGUmJihzLmRpcnR5PSEwKTt2YXIgYz0kZihlKS5ldmVudDtjPWM/Yy50aW1lU3RhbXA6cGVyZm9ybWFuY2Uubm93KCk7bGV0W2QsZixoLG0sZ109eUU7YzxnKzIwMCYmYS5vZmZzZXQ9PT1oJiZhLmtleT09PW0/KHMuZm9ybWF0PWQscy5zdHlsZT1mKTphLnR5cGU9PT0idGV4dCI/KHMuZm9ybWF0PXUuZ2V0Rm9ybWF0KCkscy5zdHlsZT11LmdldFN0eWxlKCkpOmEudHlwZT09PSJlbGVtZW50IiYmKHMuZm9ybWF0PTAscy5zdHlsZT0iIil9ZWxzZXthPTI1NSx1PSExLGM9cy5nZXROb2RlcygpO2xldCBkPWMubGVuZ3RoO2ZvcihsZXQgZj0wO2Y8ZDtmKyspe2xldCBoPWNbZl07aWYoZWUoaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1KKGUsRWYsdm9pZCAwKX19KX1mdW5jdGlvbiBhTyh0LGUpe1duKGUsKCk9PntsZXQgbj1ydCgpO3ZhciByPVhyKGUuX3dpbmRvdyk7bGV0IGk9VHMoKTtpZihyKWlmKHZlKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgbz1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhZ24obykmJllyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZvLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJmkhPT1udWxsJiZuLmlzKGkpPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOnQuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxvIT09ciYmKFUobyk/by5zZWxlY3QoMCk6by5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSB0LnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKG89ci5hbmNob3JOb2RlLG8hPT1udWxsJiYobz1vLm5vZGVUeXBlLG89PT0xfHxvPT09MykpJiYocj13dihpLHIsZSksV3IocikpO0ooZSxUUyx0KX0pfWZ1bmN0aW9uIHVPKHQsZSl7bGV0IG49dC50YXJnZXQ7dD10LnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZ0IT09InRvdWNoIiYmV24oZSwoKT0+e3R0KER1KG4pKXx8KF9nPSEwKX0pfWZ1bmN0aW9uIF9FKHQpe3JldHVybiB0LmdldFRhcmdldFJhbmdlcz8odD10LmdldFRhcmdldFJhbmdlcygpLHQubGVuZ3RoPT09MD9udWxsOnRbMF0pOm51bGx9ZnVuY3Rpb24gY08odCxlKXtyZXR1cm4gdCE9PWV8fFUodCl8fFUoZSl8fCF0LmlzVG9rZW4oKXx8IWUuaXNUb2tlbigpfWZ1bmN0aW9uIGRPKHQsZSl7bGV0IG49dC5pbnB1dFR5cGUscj1fRSh0KTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fHJvJiZvRShlKXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZXbihlLCgpPT57bGV0IGk9cnQoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKGk9PT1udWxsKXt2YXIgbz1UcygpO2lmKCF2ZShvKSlyZXR1cm47V3Ioby5jbG9uZSgpKX1pZih2ZShpKSl7bUU9PT0yMjkmJnQudGltZVN0YW1wPGx1KzMwJiZlLmlzQ29tcG9zaW5nKCkmJmkuYW5jaG9yLmtleT09PWkuZm9jdXMua2V5PyhLdChudWxsKSxsdT0wLHNldFRpbWVvdXQoKCk9PntXbihlLCgpPT57S3QobnVsbCl9KX0sMzApLHZlKGkpJiYobz1pLmFuY2hvci5nZXROb2RlKCksby5tYXJrRGlydHkoKSxpLmZvcm1hdD1vLmdldEZvcm1hdCgpLGkuc3R5bGU9by5nZXRTdHlsZSgpKSk6KHQucHJldmVudERlZmF1bHQoKSxKKGUsdHUsITApKTtyZXR1cm59fWlmKHZlKGkpKXtvPXQuZGF0YSxDbCE9PW51bGwmJm12KCExLGUsQ2wpLGkuZGlydHkmJkNsPT09bnVsbHx8IWkuaXNDb2xsYXBzZWQoKXx8Z24oaS5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fGkuYXBwbHlET01SYW5nZShyKSxDbD1udWxsO3ZhciBsPWkuZm9jdXMscz1pLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpbz09PWAKYD8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxrYSwhMSkpOm89PT1gCgpgPyh0LnByZXZlbnREZWZhdWx0KCksSihlLG9nLHZvaWQgMCkpOm89PW51bGwmJnQuZGF0YVRyYW5zZmVyPyhvPXQuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSx0LnByZXZlbnREZWZhdWx0KCksaS5pbnNlcnRSYXdUZXh0KG8pKTpvIT1udWxsJiZ4RShpLHIsbyx0LnRpbWVTdGFtcCwhMCk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsR2wsbykpOkNsPW8sdkU9dC50aW1lU3RhbXA7ZWxzZSBzd2l0Y2godC5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpKKGUsR2wsdCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOkt0KG51bGwpLEooZSxHbCx0KTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6S3QobnVsbCksSihlLGthLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6S3QobnVsbCksVGEmJiFDZj8oVGE9ITEsSihlLGthLCExKSk6SihlLG9nLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOkooZSxpdix0KTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOmNPKHMsbCkmJkooZSxsZyx0KTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6SihlLGxnLHQpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6SihlLHR1LCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6SihlLG51LCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpKKGUsbnUsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpKKGUscnUsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6SihlLHJ1LCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOkooZSxVaSwic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6SihlLFVpLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOkooZSxVaSwiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOkooZSxVaSwidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6SihlLG92LHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6SihlLGx2LHZvaWQgMCl9fX0pfWZ1bmN0aW9uIGZPKHQsZSl7dC5zdG9wUHJvcGFnYXRpb24oKSxXbihlLCgpPT57dmFyIG49cnQoKSxyPXQuZGF0YSxpPV9FKHQpO2lmKHIhPW51bGwmJnZlKG4pJiZ4RShuLGkscix0LnRpbWVTdGFtcCwhMSkpe2NhJiYod2coZSxyKSxjYT0hMSk7dmFyIG89bi5hbmNob3IsbD1vLmdldE5vZGUoKTtpZihpPVhyKGUuX3dpbmRvdyksaT09PW51bGwpcmV0dXJuO2xldCBzPW8ub2Zmc2V0OyhvPWJkJiYhbi5pc0NvbGxhcHNlZCgpJiZlZShsKSYmaS5hbmNob3JOb2RlIT09bnVsbCkmJihsPWwuZ2V0VGV4dENvbnRlbnQoKS5zbGljZSgwLHMpK3IrbC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKHMrbi5mb2N1cy5vZmZzZXQpLGk9aS5hbmNob3JOb2RlLG89bD09PShpLm5vZGVUeXBlPT09Mz9pLm5vZGVWYWx1ZTpudWxsKSksb3x8SihlLEdsLHIpLHI9ci5sZW5ndGgscm8mJjE8ciYmdC5pbnB1dFR5cGU9PT0iaW5zZXJ0Q29tcG9zaXRpb25UZXh0IiYmIWUuaXNDb21wb3NpbmcoKSYmKG4uYW5jaG9yLm9mZnNldC09ciksdXZ8fENmfHxjdnx8IWUuaXNDb21wb3NpbmcoKXx8KGx1PTAsS3QobnVsbCkpfWVsc2UgbXYoITEsZSxyIT09bnVsbD9yOnZvaWQgMCksY2EmJih3ZyhlLHJ8fHZvaWQgMCksY2E9ITEpO2huKCksbj1wdCgpLFlTKG4pfSksQ2w9bnVsbH1mdW5jdGlvbiBoTyh0LGUpe1duKGUsKCk9PntsZXQgbj1ydCgpO2lmKHZlKG4pJiYhZS5pc0NvbXBvc2luZygpKXtsZXQgcj1uLmFuY2hvcixpPW4uYW5jaG9yLmdldE5vZGUoKTtLdChyLmtleSksKHQudGltZVN0YW1wPGx1KzMwfHxyLnR5cGU9PT0iZWxlbWVudCJ8fCFuLmlzQ29sbGFwc2VkKCl8fGkuZ2V0Rm9ybWF0KCkhPT1uLmZvcm1hdHx8aS5nZXRTdHlsZSgpIT09bi5zdHlsZSkmJkooZSxHbCxaUil9fSl9ZnVuY3Rpb24gd2codCxlKXt2YXIgbj10Ll9jb21wb3NpdGlvbktleTtpZihLdChudWxsKSxuIT09bnVsbCYmZSE9bnVsbCl7aWYoZT09PSIiKXtlPUR0KG4pLHQ9JGQodC5nZXRFbGVtZW50QnlLZXkobikpLHQhPT1udWxsJiZ0Lm5vZGVWYWx1ZSE9PW51bGwmJmVlKGUpJiZ2dihlLHQubm9kZVZhbHVlLG51bGwsbnVsbCwhMCk7cmV0dXJufWlmKGVbZS5sZW5ndGgtMV09PT1gCmAmJihuPXJ0KCksdmUobikpKXtlPW4uZm9jdXMsbi5hbmNob3Iuc2V0KGUua2V5LGUub2Zmc2V0LGUudHlwZSksSih0LGtkLG51bGwpO3JldHVybn19bXYoITAsdCxlKX1mdW5jdGlvbiBwTyh0LGUpe3JvP2NhPSEwOlduKGUsKCk9Pnt3ZyhlLHQuZGF0YSl9KX1mdW5jdGlvbiBnTyh0LGUpe2lmKGx1PXQudGltZVN0YW1wLG1FPXQua2V5Q29kZSwhZS5pc0NvbXBvc2luZygpKXt2YXJ7a2V5Q29kZTpuLHNoaWZ0S2V5OnIsY3RybEtleTppLG1ldGFLZXk6byxhbHRLZXk6bH09dDtpZighSihlLE5TLHQpKXtpZihuIT09Mzl8fGl8fG98fGwpaWYobiE9PTM5fHxsfHxyfHwhaSYmIW8paWYobiE9PTM3fHxpfHxvfHxsKWlmKG4hPT0zN3x8bHx8cnx8IWkmJiFvKWlmKG4hPT0zOHx8aXx8bylpZihuIT09NDB8fGl8fG8paWYobj09PTEzJiZyKVRhPSEwLEooZSxrZCx0KTtlbHNlIGlmKG49PT0zMilKKGUsSVMsdCk7ZWxzZSBpZihRdCYmaSYmbj09PTc5KXQucHJldmVudERlZmF1bHQoKSxUYT0hMCxKKGUsa2EsITApO2Vsc2UgaWYobiE9PTEzfHxyKXt2YXIgcz1RdD9sfHxvPyExOm49PT04fHxuPT09NzImJmk6aXx8bHx8bz8hMTpuPT09ODtzP249PT04P0ooZSxEUyx0KToodC5wcmV2ZW50RGVmYXVsdCgpLEooZSx0dSwhMCkpOm49PT0yNz9KKGUsalMsdCk6KHM9UXQ/cnx8bHx8bz8hMTpuPT09NDZ8fG49PT02OCYmaTppfHxsfHxvPyExOm49PT00NixzP249PT00Nj9KKGUselMsdCk6KHQucHJldmVudERlZmF1bHQoKSxKKGUsdHUsITEpKTpuPT09OCYmKFF0P2w6aSk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsbnUsITApKTpuPT09NDYmJihRdD9sOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLG51LCExKSk6UXQmJm8mJm49PT04Pyh0LnByZXZlbnREZWZhdWx0KCksSihlLHJ1LCEwKSk6UXQmJm8mJm49PT00Nj8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxydSwhMSkpOm49PT02NiYmIWwmJihRdD9vOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLFVpLCJib2xkIikpOm49PT04NSYmIWwmJihRdD9vOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLFVpLCJ1bmRlcmxpbmUiKSk6bj09PTczJiYhbCYmKFF0P286aSk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsVWksIml0YWxpYyIpKTpuIT09OXx8bHx8aXx8bz9uPT09OTAmJiFyJiYoUXQ/bzppKT8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxvdix2b2lkIDApKToocz1RdD9uPT09OTAmJm8mJnI6bj09PTg5JiZpfHxuPT09OTAmJmkmJnIscz8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxsdix2b2lkIDApKTokcyhlLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9uKT8ocz1yPyExOm49PT02Nz9RdD9vOmk6ITEscz8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxzdix0KSk6KHM9cj8hMTpuPT09ODg/UXQ/bzppOiExLHM/KHQucHJldmVudERlZmF1bHQoKSxKKGUsYXYsdCkpOm49PT02NSYmKFF0P286aSkmJih0LnByZXZlbnREZWZhdWx0KCksSihlLHNnLHQpKSkpOiFybyYmbj09PTY1JiYoUXQ/bzppKSYmKHQucHJldmVudERlZmF1bHQoKSxKKGUsc2csdCkpKTpKKGUsRlMsdCkpfWVsc2UgVGE9ITEsSihlLGtkLHQpO2Vsc2UgSihlLExTLHQpO2Vsc2UgSihlLE1TLHQpO2Vsc2UgSihlLEFTLHQpO2Vsc2UgSihlLFBTLHQpO2Vsc2UgSihlLE9TLHQpO2Vsc2UgSihlLFJTLHQpOyhpfHxyfHxsfHxvKSYmSihlLFpTLHQpfX19ZnVuY3Rpb24gd0UodCl7bGV0IGU9dC5fX2xleGljYWxFdmVudEhhbmRsZXM7cmV0dXJuIGU9PT12b2lkIDAmJihlPVtdLHQuX19sZXhpY2FsRXZlbnRIYW5kbGVzPWUpLGV9bGV0IFlsPW5ldyBNYXA7ZnVuY3Rpb24gU0UodCl7dD10LnRhcmdldDtsZXQgZT1Ycih0PT1udWxsP251bGw6dC5ub2RlVHlwZT09PTk/dC5kZWZhdWx0Vmlldzp0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO2lmKGUhPT1udWxsKXt2YXIgbj1wdihlLmFuY2hvck5vZGUpO2lmKG4hPT1udWxsKXtfZyYmKF9nPSExLFduKG4sKCk9Pnt2YXIgbD1UcygpLHM9ZS5hbmNob3JOb2RlO3MhPT1udWxsJiYocz1zLm5vZGVUeXBlLHM9PT0xfHxzPT09MykmJihsPXd2KGwsZSxuKSxXcihsKSl9KSksdD1ndihuKSx0PXRbdC5sZW5ndGgtMV07dmFyIHI9dC5fa2V5LGk9WWwuZ2V0KHIpLG89aXx8dDtvIT09biYmVjAoZSxvLCExKSxWMChlLG4sITApLG4hPT10P1lsLnNldChyLG4pOmkmJllsLmRlbGV0ZShyKX19fWZ1bmN0aW9uIG1PKHQsZSl7JGE9PT0wJiZ0Lm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixTRSksJGErKyx0Ll9fbGV4aWNhbEVkaXRvcj1lO2xldCBuPXdFKHQpO2ZvcihsZXQgcj0wO3I8eWcubGVuZ3RoO3IrKyl7bGV0W2ksb109eWdbcl0sbD10eXBlb2Ygbz09ImZ1bmN0aW9uIj9zPT57cy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLGUuaXNFZGl0YWJsZSgpJiZvKHMsZSkpfTpzPT57aWYocy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLGUuaXNFZGl0YWJsZSgpKSlzd2l0Y2goaSl7Y2FzZSJjdXQiOnJldHVybiBKKGUsYXYscyk7Y2FzZSJjb3B5IjpyZXR1cm4gSihlLHN2LHMpO2Nhc2UicGFzdGUiOnJldHVybiBKKGUsaXYscyk7Y2FzZSJkcmFnc3RhcnQiOnJldHVybiBKKGUsVVMscyk7Y2FzZSJkcmFnb3ZlciI6cmV0dXJuIEooZSxXUyxzKTtjYXNlImRyYWdlbmQiOnJldHVybiBKKGUsVlMscyk7Y2FzZSJmb2N1cyI6cmV0dXJuIEooZSxIUyxzKTtjYXNlImJsdXIiOnJldHVybiBKKGUsS1Mscyk7Y2FzZSJkcm9wIjpyZXR1cm4gSihlLEJTLHMpfX07dC5hZGRFdmVudExpc3RlbmVyKGksbCksbi5wdXNoKCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKGksbCl9KX19ZnVuY3Rpb24gU2codCxlLG4pe2huKCk7dmFyIHI9dC5fX2tleTtsZXQgaT10LmdldFBhcmVudCgpO2lmKGkhPT1udWxsKXt2YXIgbz1ydCgpO2lmKHZlKG8pJiZVKHQpKXt2YXJ7YW5jaG9yOmwsZm9jdXM6c309byxhPWwuZ2V0Tm9kZSgpLHU9cy5nZXROb2RlKCk7T2QoYSx0KSYmbC5zZXQodC5fX2tleSwwLCJlbGVtZW50IiksT2QodSx0KSYmcy5zZXQodC5fX2tleSwwLCJlbGVtZW50Iil9aWYoYT1vLHU9ITEsdmUoYSkmJmUpe289YS5hbmNob3I7bGV0IGM9YS5mb2N1cztvLmtleT09PXImJihMZChvLHQsaSx0LmdldFByZXZpb3VzU2libGluZygpLHQuZ2V0TmV4dFNpYmxpbmcoKSksdT0hMCksYy5rZXk9PT1yJiYoTGQoYyx0LGksdC5nZXRQcmV2aW91c1NpYmxpbmcoKSx0LmdldE5leHRTaWJsaW5nKCkpLHU9ITApfWVsc2UgJHMoYSkmJmUmJnQuaXNTZWxlY3RlZCgpJiZ0LnNlbGVjdFByZXZpb3VzKCk7dmUoYSkmJmUmJiF1PyhyPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxEbyh0KSxNZChhLGksciwtMSkpOkRvKHQpLG58fHZyKGkpfHxpLmNhbkJlRW1wdHkoKXx8IWkuaXNFbXB0eSgpfHxTZyhpLGUpLGUmJmduKGkpJiZpLmlzRW1wdHkoKSYmaS5zZWxlY3RFbmQoKX19Y2xhc3MgenV7c3RhdGljIGdldFR5cGUoKXtHKDY0LHRoaXMubmFtZSl9c3RhdGljIGNsb25lKCl7Ryg2NSx0aGlzLm5hbWUpfWNvbnN0cnVjdG9yKGUpe3RoaXMuX190eXBlPXRoaXMuY29uc3RydWN0b3IuZ2V0VHlwZSgpLHRoaXMuX19uZXh0PXRoaXMuX19wcmV2PXRoaXMuX19wYXJlbnQ9bnVsbCxlRSh0aGlzLGUpfWdldFR5cGUoKXtyZXR1cm4gdGhpcy5fX3R5cGV9aXNBdHRhY2hlZCgpe2Zvcih2YXIgZT10aGlzLl9fa2V5O2UhPT1udWxsOyl7aWYoZT09PSJyb290IilyZXR1cm4hMDtpZihlPUR0KGUpLGU9PT1udWxsKWJyZWFrO2U9ZS5fX3BhcmVudH1yZXR1cm4hMX1pc1NlbGVjdGVkKGUpe2lmKGU9ZXx8cnQoKSxlPT1udWxsKXJldHVybiExO2xldCBuPWUuZ2V0Tm9kZXMoKS5zb21lKHI9PnIuX19rZXk9PT10aGlzLl9fa2V5KTtyZXR1cm4gZWUodGhpcyk/bjp2ZShlKSYmZS5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmZS5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZlLmFuY2hvci5rZXk9PT1lLmZvY3VzLmtleSYmZS5hbmNob3Iub2Zmc2V0PT09ZS5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciBlPXRoaXMuZ2V0UGFyZW50KCk7aWYoZT09PW51bGwpcmV0dXJuLTE7ZT1lLmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7ZSE9PW51bGw7KXtpZih0aGlzLmlzKGUpKXJldHVybiBuO24rKyxlPWUuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgZT10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiBlPT09bnVsbD9udWxsOkR0KGUpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgZT10aGlzLmdldFBhcmVudCgpO3JldHVybiBlPT09bnVsbCYmRyg2Nix0aGlzLl9fa2V5KSxlfWdldFRvcExldmVsRWxlbWVudCgpe2xldCBlPXRoaXM7Zm9yKDtlIT09bnVsbDspe2xldCBuPWUuZ2V0UGFyZW50KCk7aWYodnIobikpcmV0dXJuIGU7ZT1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgZT10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiBlPT09bnVsbCYmRyg2Nyx0aGlzLl9fa2V5KSxlfWdldFBhcmVudHMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspZS5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gZX1nZXRQYXJlbnRLZXlzKCl7bGV0IGU9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIGV9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIGU9PT1udWxsP251bGw6RHQoZSl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCBlPVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIGU7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyllLnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIGV9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgZT10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gZT09PW51bGw/bnVsbDpEdChlKX1nZXROZXh0U2libGluZ3MoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyllLnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIGV9Z2V0Q29tbW9uQW5jZXN0b3IoZSl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9ZS5nZXRQYXJlbnRzKCk7VSh0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLFUoZSkmJnIudW5zaGlmdChlKSxlPW4ubGVuZ3RoO3ZhciBpPXIubGVuZ3RoO2lmKGU9PT0wfHxpPT09MHx8bltlLTFdIT09cltpLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksaT0wO2k8ZTtpKyspe2xldCBvPW5baV07aWYoci5oYXMobykpcmV0dXJuIG99cmV0dXJuIG51bGx9aXMoZSl7cmV0dXJuIGU9PW51bGw/ITE6dGhpcy5fX2tleT09PWUuX19rZXl9aXNCZWZvcmUoZSl7aWYodGhpcz09PWUpcmV0dXJuITE7aWYoZS5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZihlKSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKGUpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgaT1yLmdldFBhcmVudE9yVGhyb3coKTtpZihpPT09bil7aT1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1pfWZvcihyPWU7Oyl7aWYoZT1yLmdldFBhcmVudE9yVGhyb3coKSxlPT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1lfXJldHVybiBpPG59aXNQYXJlbnRPZihlKXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT1lLl9fa2V5KXJldHVybiExO2Zvcig7ZSE9PW51bGw7KXtpZihlLl9fa2V5PT09bilyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKGUpe2xldCBuPXRoaXMuaXNCZWZvcmUoZSkscj1bXSxpPW5ldyBTZXQ7Zm9yKHZhciBvPXRoaXM7Oyl7dmFyIGw9by5fX2tleTtpZihpLmhhcyhsKXx8KGkuYWRkKGwpLHIucHVzaChvKSksbz09PWUpYnJlYWs7aWYobD1VKG8pP24/by5nZXRGaXJzdENoaWxkKCk6by5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKW89bDtlbHNlIGlmKGw9bj9vLmdldE5leHRTaWJsaW5nKCk6by5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClvPWw7ZWxzZXtpZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGkuaGFzKG8uX19rZXkpfHxyLnB1c2gobyksbz09PWUpYnJlYWs7bD1vO2RvIGw9PT1udWxsJiZHKDY4KSxvPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYobyE9PW51bGx8fGkuaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKG89PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCBlPXB0KCkuX2RpcnR5TGVhdmVzO3JldHVybiBlIT09bnVsbCYmZS5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IGU9RHQodGhpcy5fX2tleSk7cmV0dXJuIGU9PT1udWxsJiZHKDExMyksZX1nZXRXcml0YWJsZSgpe2huKCk7dmFyIGU9UXIoKSxuPXB0KCk7ZT1lLl9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksaT10aGlzLmdldExhdGVzdCgpLG89aS5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPXJ0KCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KFRkKGkpLGkpOihsPWkuY29uc3RydWN0b3IuY2xvbmUoaSksbC5fX3BhcmVudD1vLGwuX19uZXh0PWkuX19uZXh0LGwuX19wcmV2PWkuX19wcmV2LFUoaSkmJlUobCk/KGwuX19maXJzdD1pLl9fZmlyc3QsbC5fX2xhc3Q9aS5fX2xhc3QsbC5fX3NpemU9aS5fX3NpemUsbC5fX2luZGVudD1pLl9faW5kZW50LGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fZGlyPWkuX19kaXIpOmVlKGkpJiZlZShsKSYmKGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fc3R5bGU9aS5fX3N0eWxlLGwuX19tb2RlPWkuX19tb2RlLGwuX19kZXRhaWw9aS5fX2RldGFpbCksbi5hZGQociksbC5fX2tleT1yLFRkKGwpLGUuc2V0KHIsbCksbCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm4iIn1nZXRUZXh0Q29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aH1jcmVhdGVET00oKXtHKDcwKX11cGRhdGVET00oKXtHKDcxKX1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6dGhpcy5jcmVhdGVET00oZS5fY29uZmlnLGUpfX1leHBvcnRKU09OKCl7Ryg3Mil9c3RhdGljIGltcG9ydEpTT04oKXtHKDE4LHRoaXMubmFtZSl9c3RhdGljIHRyYW5zZm9ybSgpe3JldHVybiBudWxsfXJlbW92ZShlKXtTZyh0aGlzLCEwLGUpfXJlcGxhY2UoZSxuKXtobigpO3ZhciByPXJ0KCk7ciE9PW51bGwmJihyPXIuY2xvbmUoKSksTmgodGhpcyxlKTtsZXQgaT10aGlzLmdldExhdGVzdCgpLG89dGhpcy5fX2tleSxsPWUuX19rZXkscz1lLmdldFdyaXRhYmxlKCk7ZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBhPWUuX19zaXplO0RvKHMpO2xldCB1PWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksYz1pLmdldE5leHRTaWJsaW5nKCksZD1pLl9fcHJldixmPWkuX19uZXh0LGg9aS5fX3BhcmVudDtyZXR1cm4gU2coaSwhMSwhMCksdT09PW51bGw/ZS5fX2ZpcnN0PWw6dS5nZXRXcml0YWJsZSgpLl9fbmV4dD1sLHMuX19wcmV2PWQsYz09PW51bGw/ZS5fX2xhc3Q9bDpjLmdldFdyaXRhYmxlKCkuX19wcmV2PWwscy5fX25leHQ9ZixzLl9fcGFyZW50PWgsZS5fX3NpemU9YSxuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57cy5hcHBlbmQobSl9KSx2ZShyKSYmKFdyKHIpLG49ci5hbmNob3Iscj1yLmZvY3VzLG4ua2V5PT09byYmWjAobixzKSxyLmtleT09PW8mJlowKHIscykpLFdpKCk9PT1vJiZLdChsKSxzfWluc2VydEFmdGVyKGUsbj0hMCl7aG4oKSxOaCh0aGlzLGUpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgaT1lLmdldFdyaXRhYmxlKCk7dmFyIG89aS5nZXRQYXJlbnQoKTtsZXQgbD1ydCgpO3ZhciBzPSExLGE9ITE7aWYobyE9PW51bGwpe3ZhciB1PWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtEbyhpKSx2ZShsKSYmKGE9by5fX2tleSxzPWwuYW5jaG9yLG89bC5mb2N1cyxzPXMudHlwZT09PSJlbGVtZW50IiYmcy5rZXk9PT1hJiZzLm9mZnNldD09PXUrMSxhPW8udHlwZT09PSJlbGVtZW50IiYmby5rZXk9PT1hJiZvLm9mZnNldD09PXUrMSl9bz10aGlzLmdldE5leHRTaWJsaW5nKCksdT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBjPWkuX19rZXksZD1yLl9fbmV4dDtyZXR1cm4gbz09PW51bGw/dS5fX2xhc3Q9YzpvLmdldFdyaXRhYmxlKCkuX19wcmV2PWMsdS5fX3NpemUrKyxyLl9fbmV4dD1jLGkuX19uZXh0PWQsaS5fX3ByZXY9ci5fX2tleSxpLl9fcGFyZW50PXIuX19wYXJlbnQsbiYmdmUobCkmJihuPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxNZChsLHUsbisxKSxyPXUuX19rZXkscyYmbC5hbmNob3Iuc2V0KHIsbisyLCJlbGVtZW50IiksYSYmbC5mb2N1cy5zZXQocixuKzIsImVsZW1lbnQiKSksZX1pbnNlcnRCZWZvcmUoZSxuPSEwKXtobigpLE5oKHRoaXMsZSk7dmFyIHI9dGhpcy5nZXRXcml0YWJsZSgpO2xldCBpPWUuZ2V0V3JpdGFibGUoKSxvPWkuX19rZXk7RG8oaSk7bGV0IGw9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxzPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCksYT1yLl9fcHJldix1PXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtyZXR1cm4gbD09PW51bGw/cy5fX2ZpcnN0PW86bC5nZXRXcml0YWJsZSgpLl9fbmV4dD1vLHMuX19zaXplKyssci5fX3ByZXY9byxpLl9fcHJldj1hLGkuX19uZXh0PXIuX19rZXksaS5fX3BhcmVudD1yLl9fcGFyZW50LHI9cnQoKSxuJiZ2ZShyKSYmKG49dGhpcy5nZXRQYXJlbnRPclRocm93KCksTWQocixuLHUpKSxlfWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMX1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiBabygpfXNlbGVjdFByZXZpb3VzKGUsbil7aG4oKTtsZXQgcj10aGlzLmdldFByZXZpb3VzU2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KDAsMCk6VShyKT9yLnNlbGVjdCgpOmVlKHIpP3Iuc2VsZWN0KGUsbik6KGU9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsaS5zZWxlY3QoZSxlKSl9c2VsZWN0TmV4dChlLG4pe2huKCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KCk6VShyKT9yLnNlbGVjdCgwLDApOmVlKHIpP3Iuc2VsZWN0KGUsbik6KGU9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpLGkuc2VsZWN0KGUsZSkpfW1hcmtEaXJ0eSgpe3RoaXMuZ2V0V3JpdGFibGUoKX19Y2xhc3Mga3MgZXh0ZW5kcyB6dXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaW5lYnJlYWsifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IGtzKGUuX19rZXkpfWNvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWdldFRleHRDb250ZW50KCl7cmV0dXJuYApgfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YnI6ZT0+e2xldCBuPWUucGFyZW50RWxlbWVudCxyLGk7cmV0dXJuIG4hPT1udWxsJiYoKHI9bi5maXJzdENoaWxkKT09PWV8fHIubmV4dFNpYmxpbmc9PT1lJiZyLm5vZGVUeXBlPT09MyYmKHIudGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKSYmKChpPW4ubGFzdENoaWxkKT09PWV8fGkucHJldmlvdXNTaWJsaW5nPT09ZSYmaS5ub2RlVHlwZT09PTMmJihpLnRleHRDb250ZW50fHwiIikubWF0Y2goL14oIHxcdHxccj9cbikrJC8pIT09bnVsbCk/bnVsbDp7Y29udmVyc2lvbjp2Tyxwcmlvcml0eTowfX19fXN0YXRpYyBpbXBvcnRKU09OKCl7cmV0dXJuIGNzKCl9ZXhwb3J0SlNPTigpe3JldHVybnt0eXBlOiJsaW5lYnJlYWsiLHZlcnNpb246MX19fWZ1bmN0aW9uIHZPKCl7cmV0dXJue25vZGU6Y3MoKX19ZnVuY3Rpb24gY3MoKXtyZXR1cm4ganUobmV3IGtzKX1mdW5jdGlvbiBzdSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGtzfWZ1bmN0aW9uIFBoKHQsZSl7cmV0dXJuIGUmMTY/ImNvZGUiOmUmMTI4PyJtYXJrIjplJjMyPyJzdWIiOmUmNjQ/InN1cCI6bnVsbH1mdW5jdGlvbiBBaCh0LGUpe3JldHVybiBlJjE/InN0cm9uZyI6ZSYyPyJlbSI6InNwYW4ifWZ1bmN0aW9uIE1oKHQsZSxuLHIsaSl7dD1yLmNsYXNzTGlzdCxyPWJhKGksImJhc2UiKSxyIT09dm9pZCAwJiZ0LmFkZCguLi5yKSxyPWJhKGksInVuZGVybGluZVN0cmlrZXRocm91Z2giKTtsZXQgbz0hMSxsPWUmOCYmZSY0O3ZhciBzPW4mOCYmbiY0O3IhPT12b2lkIDAmJihzPyhvPSEwLGx8fHQuYWRkKC4uLnIpKTpsJiZ0LnJlbW92ZSguLi5yKSk7Zm9yKGxldCBhIGluIElvKXM9SW9bYV0scj1iYShpLGEpLHIhPT12b2lkIDAmJihuJnM/IW98fGEhPT0idW5kZXJsaW5lIiYmYSE9PSJzdHJpa2V0aHJvdWdoIj8oIShlJnMpfHxsJiZhPT09InVuZGVybGluZSJ8fGE9PT0ic3RyaWtldGhyb3VnaCIpJiZ0LmFkZCguLi5yKTplJnMmJnQucmVtb3ZlKC4uLnIpOmUmcyYmdC5yZW1vdmUoLi4ucikpfWZ1bmN0aW9uIExoKHQsZSxuKXtsZXQgcj1lLmZpcnN0Q2hpbGQ7aWYobj1uLmlzQ29tcG9zaW5nKCksdCs9bj9rZjoiIixyPT1udWxsKWUudGV4dENvbnRlbnQ9dDtlbHNlIGlmKGU9ci5ub2RlVmFsdWUsZSE9PXQpaWYobnx8cm8pe249ZS5sZW5ndGg7bGV0IGk9dC5sZW5ndGgsbz0wLGw9MDtmb3IoO288biYmbzxpJiZlW29dPT09dFtvXTspbysrO2Zvcig7bCtvPG4mJmwrbzxpJiZlW24tbC0xXT09PXRbaS1sLTFdOylsKys7dD1bbyxuLW8tbCx0LnNsaWNlKG8saS1sKV07bGV0W3MsYSx1XT10O2EhPT0wJiZyLmRlbGV0ZURhdGEocyxhKSxyLmluc2VydERhdGEocyx1KX1lbHNlIHIubm9kZVZhbHVlPXR9ZnVuY3Rpb24gbWModCxlKXtyZXR1cm4gZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLGUuYXBwZW5kQ2hpbGQodCksZX1jbGFzcyBzbCBleHRlbmRzIHp1e3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInRleHQifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IHNsKGUuX190ZXh0LGUuX19rZXkpfWNvbnN0cnVjdG9yKGUsbil7c3VwZXIobiksdGhpcy5fX3RleHQ9ZSx0aGlzLl9fZm9ybWF0PTAsdGhpcy5fX3N0eWxlPSIiLHRoaXMuX19kZXRhaWw9dGhpcy5fX21vZGU9MH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXREZXRhaWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbH1nZXRNb2RlKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKTtyZXR1cm4gcVJbZS5fX21vZGVdfWdldFN0eWxlKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zdHlsZX1pc1Rva2VuKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09MX1pc0NvbXBvc2luZygpe3JldHVybiB0aGlzLl9fa2V5PT09V2koKX1pc1NlZ21lbnRlZCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fbW9kZT09PTJ9aXNEaXJlY3Rpb25sZXNzKCl7cmV0dXJuKHRoaXMuZ2V0TGF0ZXN0KCkuX19kZXRhaWwmMSkhPT0wfWlzVW5tZXJnZWFibGUoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYyKSE9PTB9aGFzRm9ybWF0KGUpe3JldHVybiBlPUlvW2VdLCh0aGlzLmdldEZvcm1hdCgpJmUpIT09MH1pc1NpbXBsZVRleHQoKXtyZXR1cm4gdGhpcy5fX3R5cGU9PT0idGV4dCImJnRoaXMuX19tb2RlPT09MH1nZXRUZXh0Q29udGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGV4dH1nZXRGb3JtYXRGbGFncyhlLG4pe2xldCByPXRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXQ7cmV0dXJuIEpTKHIsZSxuKX1jcmVhdGVET00oZSl7dmFyIG49dGhpcy5fX2Zvcm1hdCxyPVBoKHRoaXMsbik7bGV0IGk9QWgodGhpcyxuKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj09PW51bGw/aTpyKSxsPW87cmV0dXJuIHRoaXMuaGFzRm9ybWF0KCJjb2RlIikmJm8uc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwiZmFsc2UiKSxyIT09bnVsbCYmKGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpKSxvLmFwcGVuZENoaWxkKGwpKSxyPWwsTGgodGhpcy5fX3RleHQscix0aGlzKSxlPWUudGhlbWUudGV4dCxlIT09dm9pZCAwJiZNaChpLDAsbixyLGUpLG49dGhpcy5fX3N0eWxlLG4hPT0iIiYmKG8uc3R5bGUuY3NzVGV4dD1uKSxvfXVwZGF0ZURPTShlLG4scil7bGV0IGk9dGhpcy5fX3RleHQ7dmFyIG89ZS5fX2Zvcm1hdCxsPXRoaXMuX19mb3JtYXQscz1QaCh0aGlzLG8pO2xldCBhPVBoKHRoaXMsbCk7dmFyIHU9QWgodGhpcyxvKTtsZXQgYz1BaCh0aGlzLGwpO3JldHVybihzPT09bnVsbD91OnMpIT09KGE9PT1udWxsP2M6YSk/ITA6cz09PWEmJnUhPT1jPyhvPW4uZmlyc3RDaGlsZCxvPT1udWxsJiZHKDQ4KSxlPXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjKSxMaChpLGUsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmTWgoYywwLGwsZSxyKSxuLnJlcGxhY2VDaGlsZChzLG8pLCExKToodT1uLGEhPT1udWxsJiZzIT09bnVsbCYmKHU9bi5maXJzdENoaWxkLHU9PW51bGwmJkcoNDkpKSxMaChpLHUsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmbyE9PWwmJk1oKGMsbyxsLHUsciksbD10aGlzLl9fc3R5bGUsZS5fX3N0eWxlIT09bCYmKG4uc3R5bGUuY3NzVGV4dD1sKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnsiI3RleHQiOigpPT4oe2NvbnZlcnNpb246X08scHJpb3JpdHk6MH0pLGI6KCk9Pih7Y29udmVyc2lvbjp4Tyxwcmlvcml0eTowfSksY29kZTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxlbTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxpOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHM6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksc3BhbjooKT0+KHtjb252ZXJzaW9uOnlPLHByaW9yaXR5OjB9KSxzdHJvbmc6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksc3ViOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHN1cDooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSx1OigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1MdChlLnRleHQpO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXREZXRhaWwoZS5kZXRhaWwpLG4uc2V0TW9kZShlLm1vZGUpLG4uc2V0U3R5bGUoZS5zdHlsZSksbn1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUhPT1udWxsJiZUZihlKXx8RygxMzIpLGUuc3R5bGUud2hpdGVTcGFjZT0icHJlLXdyYXAiLHRoaXMuaGFzRm9ybWF0KCJib2xkIikmJihlPW1jKGUsImIiKSksdGhpcy5oYXNGb3JtYXQoIml0YWxpYyIpJiYoZT1tYyhlLCJpIikpLHRoaXMuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikmJihlPW1jKGUsInMiKSksdGhpcy5oYXNGb3JtYXQoInVuZGVybGluZSIpJiYoZT1tYyhlLCJ1IikpLHtlbGVtZW50OmV9fWV4cG9ydEpTT04oKXtyZXR1cm57ZGV0YWlsOnRoaXMuZ2V0RGV0YWlsKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0KCksbW9kZTp0aGlzLmdldE1vZGUoKSxzdHlsZTp0aGlzLmdldFN0eWxlKCksdGV4dDp0aGlzLmdldFRleHRDb250ZW50KCksdHlwZToidGV4dCIsdmVyc2lvbjoxfX1zZWxlY3Rpb25UcmFuc2Zvcm0oKXt9c2V0Rm9ybWF0KGUpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2Zvcm1hdD10eXBlb2YgZT09InN0cmluZyI/SW9bZV06ZSxufXNldERldGFpbChlKXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kZXRhaWw9dHlwZW9mIGU9PSJzdHJpbmciP1hSW2VdOmUsbn1zZXRTdHlsZShlKXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19zdHlsZT1lLG59dG9nZ2xlRm9ybWF0KGUpe3JldHVybiBlPUlvW2VdLHRoaXMuc2V0Rm9ybWF0KHRoaXMuZ2V0Rm9ybWF0KCleZSl9dG9nZ2xlRGlyZWN0aW9ubGVzcygpe2xldCBlPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gZS5fX2RldGFpbF49MSxlfXRvZ2dsZVVubWVyZ2VhYmxlKCl7bGV0IGU9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBlLl9fZGV0YWlsXj0yLGV9c2V0TW9kZShlKXtpZihlPUpSW2VdLHRoaXMuX19tb2RlPT09ZSlyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19tb2RlPWUsbn1zZXRUZXh0Q29udGVudChlKXtpZih0aGlzLl9fdGV4dD09PWUpcmV0dXJuIHRoaXM7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fdGV4dD1lLG59c2VsZWN0KGUsbil7aG4oKTtsZXQgcj1ydCgpO3ZhciBpPXRoaXMuZ2V0VGV4dENvbnRlbnQoKTtsZXQgbz10aGlzLl9fa2V5O2lmKHR5cGVvZiBpPT0ic3RyaW5nIj8oaT1pLmxlbmd0aCxlPT09dm9pZCAwJiYoZT1pKSxuPT09dm9pZCAwJiYobj1pKSk6bj1lPTAsdmUocikpaT1XaSgpLGkhPT1yLmFuY2hvci5rZXkmJmkhPT1yLmZvY3VzLmtleXx8S3Qobyksci5zZXRUZXh0Tm9kZVJhbmdlKHRoaXMsZSx0aGlzLG4pO2Vsc2UgcmV0dXJuIGtFKG8sZSxvLG4sInRleHQiLCJ0ZXh0Iik7cmV0dXJuIHJ9c3BsaWNlVGV4dChlLG4scixpKXtsZXQgbz10aGlzLmdldFdyaXRhYmxlKCksbD1vLl9fdGV4dCxzPXIubGVuZ3RoLGE9ZTswPmEmJihhPXMrYSwwPmEmJihhPTApKTtsZXQgdT1ydCgpO3JldHVybiBpJiZ2ZSh1KSYmKGUrPXMsdS5zZXRUZXh0Tm9kZVJhbmdlKG8sZSxvLGUpKSxuPWwuc2xpY2UoMCxhKStyK2wuc2xpY2UoYStuKSxvLl9fdGV4dD1uLG99Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfXNwbGl0VGV4dCguLi5lKXtobigpO3ZhciBuPXRoaXMuZ2V0TGF0ZXN0KCkscj1uLmdldFRleHRDb250ZW50KCksaT1uLl9fa2V5LG89V2koKSxsPW5ldyBTZXQoZSk7ZT1bXTtmb3IodmFyIHM9ci5sZW5ndGgsYT0iIix1PTA7dTxzO3UrKylhIT09IiImJmwuaGFzKHUpJiYoZS5wdXNoKGEpLGE9IiIpLGErPXJbdV07aWYoYSE9PSIiJiZlLnB1c2goYSksbD1lLmxlbmd0aCxsPT09MClyZXR1cm5bXTtpZihlWzBdPT09cilyZXR1cm5bbl07dmFyIGM9ZVswXTtyPW4uZ2V0UGFyZW50T3JUaHJvdygpLHU9bi5nZXRGb3JtYXQoKTtsZXQgZD1uLmdldFN0eWxlKCksZj1uLl9fZGV0YWlsO3M9ITEsbi5pc1NlZ21lbnRlZCgpPyhhPUx0KGMpLGEuX19mb3JtYXQ9dSxhLl9fc3R5bGU9ZCxhLl9fZGV0YWlsPWYscz0hMCk6KGE9bi5nZXRXcml0YWJsZSgpLGEuX190ZXh0PWMpLG49cnQoKSxhPVthXSxjPWMubGVuZ3RoO2ZvcihsZXQgZz0xO2c8bDtnKyspe3ZhciBoPWVbZ10sbT1oLmxlbmd0aDtoPUx0KGgpLmdldFdyaXRhYmxlKCksaC5fX2Zvcm1hdD11LGguX19zdHlsZT1kLGguX19kZXRhaWw9ZjtsZXQgdz1oLl9fa2V5O2lmKG09YyttLHZlKG4pKXtsZXQgdj1uLmFuY2hvcix5PW4uZm9jdXM7di5rZXk9PT1pJiZ2LnR5cGU9PT0idGV4dCImJnYub2Zmc2V0PmMmJnYub2Zmc2V0PD1tJiYodi5rZXk9dyx2Lm9mZnNldC09YyxuLmRpcnR5PSEwKSx5LmtleT09PWkmJnkudHlwZT09PSJ0ZXh0IiYmeS5vZmZzZXQ+YyYmeS5vZmZzZXQ8PW0mJih5LmtleT13LHkub2Zmc2V0LT1jLG4uZGlydHk9ITApfW89PT1pJiZLdCh3KSxjPW0sYS5wdXNoKGgpfXJldHVybiBpPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCksbz10aGlzLmdldE5leHRTaWJsaW5nKCksaSE9PW51bGwmJlRkKGkpLG8hPT1udWxsJiZUZChvKSxpPXIuZ2V0V3JpdGFibGUoKSxvPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxzPyhpLnNwbGljZShvLDAsYSksdGhpcy5yZW1vdmUoKSk6aS5zcGxpY2UobywxLGEpLHZlKG4pJiZNZChuLHIsbyxsLTEpLGF9bWVyZ2VXaXRoU2libGluZyhlKXt2YXIgbj1lPT09dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKTtufHxlPT09dGhpcy5nZXROZXh0U2libGluZygpfHxHKDUwKTt2YXIgcj10aGlzLl9fa2V5O2xldCBpPWUuX19rZXksbz10aGlzLl9fdGV4dCxsPW8ubGVuZ3RoO1dpKCk9PT1pJiZLdChyKTtsZXQgcz1ydCgpO2lmKHZlKHMpKXtsZXQgYT1zLmFuY2hvcix1PXMuZm9jdXM7YSE9PW51bGwmJmEua2V5PT09aSYmKGV4KGEsbixyLGUsbCkscy5kaXJ0eT0hMCksdSE9PW51bGwmJnUua2V5PT09aSYmKGV4KHUsbixyLGUsbCkscy5kaXJ0eT0hMCl9cmV0dXJuIHI9ZS5fX3RleHQsdGhpcy5zZXRUZXh0Q29udGVudChuP3IrbzpvK3IpLG49dGhpcy5nZXRXcml0YWJsZSgpLGUucmVtb3ZlKCksbn1pc1RleHRFbnRpdHkoKXtyZXR1cm4hMX19ZnVuY3Rpb24geU8odCl7bGV0IGU9dC5zdHlsZS5mb250V2VpZ2h0PT09IjcwMCIsbj10LnN0eWxlLnRleHREZWNvcmF0aW9uPT09ImxpbmUtdGhyb3VnaCIscj10LnN0eWxlLmZvbnRTdHlsZT09PSJpdGFsaWMiLGk9dC5zdHlsZS50ZXh0RGVjb3JhdGlvbj09PSJ1bmRlcmxpbmUiLG89dC5zdHlsZS52ZXJ0aWNhbEFsaWduO3JldHVybntmb3JDaGlsZDpsPT4oZWUobCkmJihlJiZsLnRvZ2dsZUZvcm1hdCgiYm9sZCIpLG4mJmwudG9nZ2xlRm9ybWF0KCJzdHJpa2V0aHJvdWdoIiksciYmbC50b2dnbGVGb3JtYXQoIml0YWxpYyIpLGkmJmwudG9nZ2xlRm9ybWF0KCJ1bmRlcmxpbmUiKSxvPT09InN1YiImJmwudG9nZ2xlRm9ybWF0KCJzdWJzY3JpcHQiKSxvPT09InN1cGVyIiYmbC50b2dnbGVGb3JtYXQoInN1cGVyc2NyaXB0IikpLGwpLG5vZGU6bnVsbH19ZnVuY3Rpb24geE8odCl7bGV0IGU9dC5zdHlsZS5mb250V2VpZ2h0PT09Im5vcm1hbCI7cmV0dXJue2ZvckNoaWxkOm49PihlZShuKSYmIWUmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgSDA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gX08odCl7dC5wYXJlbnRFbGVtZW50PT09bnVsbCYmRygxMjkpO2Zvcih2YXIgZT10LnRleHRDb250ZW50fHwiIixuLHI9dC5wYXJlbnROb2RlLGk9W3RdO3IhPT1udWxsJiYobj1IMC5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KWkucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxpLmxlbmd0aDtyKyspSDAuc2V0KGlbcl0sbik7aWYobiE9PW51bGwpe2ZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSx0PVtdLGk9ZS5sZW5ndGgsbj0wO248aTtuKyspcj1lW25dLHI9PT1gCmB8fHI9PT1gXHIKYD90LnB1c2goY3MoKSk6cj09PSIJIj90LnB1c2goUmYoKSk6ciE9PSIiJiZ0LnB1c2goTHQocikpO3JldHVybntub2RlOnR9fWlmKGU9ZS5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksZT09PSIiKXJldHVybntub2RlOm51bGx9O2lmKGVbMF09PT0iICIpe2ZvcihpPXQsbj0hMDtpIT09bnVsbCYmKGk9SzAoaSwhMSkpIT09bnVsbDspaWYocj1pLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJihlPWUuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKGU9ZS5zbGljZSgxKSl9aWYoZVtlLmxlbmd0aC0xXT09PSIgIil7Zm9yKGk9ITA7dCE9PW51bGwmJih0PUswKHQsITApKSE9PW51bGw7KWlmKDA8KHQudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7aT0hMTticmVha31pJiYoZT1lLnNsaWNlKDAsZS5sZW5ndGgtMSkpfXJldHVybiBlPT09IiI/e25vZGU6bnVsbH06e25vZGU6THQoZSl9fWxldCB3Tz1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gSzAodCxlKXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49ZT90Lm5leHRTaWJsaW5nOnQucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKHQ9dC5wYXJlbnRFbGVtZW50LHQ9PT1udWxsKXJldHVybiBudWxsO2lmKHQ9bix0Lm5vZGVUeXBlPT09MSYmKG49dC5zdHlsZS5kaXNwbGF5LG49PT0iIiYmdC5ub2RlTmFtZS5tYXRjaCh3Tyk9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPWU/dC5maXJzdENoaWxkOnQubGFzdENoaWxkKSE9PW51bGw7KXQ9bjtpZih0Lm5vZGVUeXBlPT09MylyZXR1cm4gdDtpZih0Lm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IFNPPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIFJpKHQpe2xldCBlPVNPW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIGU9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihlZShuKSYmIW4uaGFzRm9ybWF0KGUpJiZuLnRvZ2dsZUZvcm1hdChlKSxuKSxub2RlOm51bGx9fWZ1bmN0aW9uIEx0KHQ9IiIpe3JldHVybiBqdShuZXcgc2wodCkpfWZ1bmN0aW9uIGVlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygc2x9Y2xhc3MgYnMgZXh0ZW5kcyBzbHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJ0YWIifXN0YXRpYyBjbG9uZShlKXtsZXQgbj1uZXcgYnMoZS5fX2tleSk7cmV0dXJuIG4uX190ZXh0PWUuX190ZXh0LG4uX19mb3JtYXQ9ZS5fX2Zvcm1hdCxuLl9fc3R5bGU9ZS5fX3N0eWxlLG59Y29uc3RydWN0b3IoZSl7c3VwZXIoIgkiLGUpLHRoaXMuX19kZXRhaWw9Mn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49UmYoKTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0U3R5bGUoZS5zdHlsZSksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJ0YWIiLHZlcnNpb246MX19c2V0VGV4dENvbnRlbnQoKXtHKDEyNil9c2V0RGV0YWlsKCl7RygxMjcpfXNldE1vZGUoKXtHKDEyOCl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfX1mdW5jdGlvbiBSZigpe3JldHVybiBqdShuZXcgYnMpfWNsYXNzIFZye2NvbnN0cnVjdG9yKGUsbixyKXt0aGlzLl9zZWxlY3Rpb249bnVsbCx0aGlzLmtleT1lLHRoaXMub2Zmc2V0PW4sdGhpcy50eXBlPXJ9aXMoZSl7cmV0dXJuIHRoaXMua2V5PT09ZS5rZXkmJnRoaXMub2Zmc2V0PT09ZS5vZmZzZXQmJnRoaXMudHlwZT09PWUudHlwZX1pc0JlZm9yZShlKXtsZXQgbj10aGlzLmdldE5vZGUoKSxyPWUuZ2V0Tm9kZSgpLGk9dGhpcy5vZmZzZXQ7aWYoZT1lLm9mZnNldCxVKG4pKXt2YXIgbz1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpO249bz8/bn1yZXR1cm4gVShyKSYmKG89ci5nZXREZXNjZW5kYW50QnlJbmRleChlKSxyPW8/P3IpLG49PT1yP2k8ZTpuLmlzQmVmb3JlKHIpfWdldE5vZGUoKXtsZXQgZT1EdCh0aGlzLmtleSk7cmV0dXJuIGU9PT1udWxsJiZHKDIwKSxlfXNldChlLG4scil7bGV0IGk9dGhpcy5fc2VsZWN0aW9uLG89dGhpcy5rZXk7dGhpcy5rZXk9ZSx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yLE5zKCl8fChXaSgpPT09byYmS3QoZSksaSE9PW51bGwmJihpLl9jYWNoZWROb2Rlcz1udWxsLGkuZGlydHk9ITApKX19ZnVuY3Rpb24gSWgodCxlKXtsZXQgbj1lLl9fa2V5LHI9dC5vZmZzZXQsaT0iZWxlbWVudCI7aWYoZWUoZSkpaT0idGV4dCIsZT1lLmdldFRleHRDb250ZW50U2l6ZSgpLHI+ZSYmKHI9ZSk7ZWxzZSBpZighVShlKSl7dmFyIG89ZS5nZXROZXh0U2libGluZygpO2VlKG8pPyhuPW8uX19rZXkscj0wLGk9InRleHQiKToobz1lLmdldFBhcmVudCgpKSYmKG49by5fX2tleSxyPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxKX10LnNldChuLHIsaSl9ZnVuY3Rpb24gWjAodCxlKXtpZihVKGUpKXtsZXQgbj1lLmdldExhc3REZXNjZW5kYW50KCk7VShuKXx8ZWUobik/SWgodCxuKTpJaCh0LGUpfWVsc2UgSWgodCxlKX1mdW5jdGlvbiBHMCh0LGUsbixyKXtsZXQgaT10LmdldE5vZGUoKSxvPWkuZ2V0Q2hpbGRBdEluZGV4KHQub2Zmc2V0KSxsPUx0KCkscz1nbihpKT9abygpLmFwcGVuZChsKTpsO2wuc2V0Rm9ybWF0KG4pLGwuc2V0U3R5bGUociksbz09PW51bGw/aS5hcHBlbmQocyk6KG8uaW5zZXJ0QmVmb3JlKHMpLGUudHlwZT09PSJlbGVtZW50IiYmZS5rZXk9PT10LmtleSYmZS5vZmZzZXQhPT10Lm9mZnNldCYmZS5zZXQoZS5rZXksZS5vZmZzZXQrMSwiZWxlbWVudCIpKSx0LmlzKGUpJiZlLnNldChsLl9fa2V5LDAsInRleHQiKSx0LnNldChsLl9fa2V5LDAsInRleHQiKX1mdW5jdGlvbiBMaSh0LGUsbixyKXt0LmtleT1lLHQub2Zmc2V0PW4sdC50eXBlPXJ9Y2xhc3MgT2Z7Y29uc3RydWN0b3IoZSl7dGhpcy5kaXJ0eT0hMSx0aGlzLl9ub2Rlcz1lLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aXMoZSl7aWYoISRzKGUpKXJldHVybiExO2xldCBuPXRoaXMuX25vZGVzLHI9ZS5fbm9kZXM7cmV0dXJuIG4uc2l6ZT09PXIuc2l6ZSYmQXJyYXkuZnJvbShuKS5ldmVyeShpPT5yLmhhcyhpKSl9YWRkKGUpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuYWRkKGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9ZGVsZXRlKGUpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuZGVsZXRlKGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xlYXIoKXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1oYXMoZSl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyhlKX1jbG9uZSgpe3JldHVybiBuZXcgT2YobmV3IFNldCh0aGlzLl9ub2RlcykpfWV4dHJhY3QoKXtyZXR1cm4gdGhpcy5nZXROb2RlcygpfWluc2VydFJhd1RleHQoKXt9aW5zZXJ0VGV4dCgpe31pbnNlcnROb2RlcyhlLG4pe2xldCByPXRoaXMuZ2V0Tm9kZXMoKSxpPXIubGVuZ3RoO3ZhciBvPXJbaS0xXTtpZihlZShvKSlvPW8uc2VsZWN0KCk7ZWxzZXtsZXQgbD1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtvPW8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihvLmluc2VydE5vZGVzKGUsbiksZT0wO2U8aTtlKyspcltlXS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciBlPXRoaXMuX2NhY2hlZE5vZGVzO2lmKGUhPT1udWxsKXJldHVybiBlO3ZhciBuPXRoaXMuX25vZGVzO2U9W107Zm9yKGxldCByIG9mIG4pbj1EdChyKSxuIT09bnVsbCYmZS5wdXNoKG4pO3JldHVybiBOcygpfHwodGhpcy5fY2FjaGVkTm9kZXM9ZSksZX1nZXRUZXh0Q29udGVudCgpe2xldCBlPXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWVbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gdmUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBhbH1mdW5jdGlvbiBFZyh0KXtsZXRbZSwsbl09JEUodCk7dD1uLmdldENoaWxkcmVuKCk7bGV0IHI9dC5sZW5ndGg7dmFyIGk9dFswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgbz1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKW9bbF09QXJyYXkoaSk7Zm9yKGk9MDtpPHI7aSsrKXtsPXRbaV0uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO29baV1bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspb1tpK2ZdW3MraF09dTtpZihlPT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6aSxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIFBme2NvbnN0cnVjdG9yKGUsbixyKXt0aGlzLmdyaWRLZXk9ZSx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXMoZSl7cmV0dXJuIF92KGUpP3RoaXMuZ3JpZEtleT09PWUuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXMoZS5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKGUuZm9jdXMpOiExfXNldChlLG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9ZSx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IFBmKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBWYyh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXMoZSxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gZnYoci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXMoZSxuKX1nZXRTaGFwZSgpe3ZhciBlPUR0KHRoaXMuYW5jaG9yLmtleSk7aWYoUW4oZSl8fEcoMTAzKSxlPUVnKGUpLGU9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49RHQodGhpcy5mb2N1cy5rZXkpO1FuKG4pfHxHKDEwNCk7bGV0IHI9RWcobik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKGUuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IGk9TWF0aC5tYXgoZS5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxvPU1hdGgubWluKGUucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIGU9TWF0aC5tYXgoZS5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixpKSxmcm9tWTpNYXRoLm1pbihvLGUpLHRvWDpNYXRoLm1heChuLGkpLHRvWTpNYXRoLm1heChvLGUpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIGUodyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Onh9PXc7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSx4KSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQseCt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPVBkKHIsUW4pO3ZhciBpPVBkKG4sUW4pO1FuKHIpfHxHKDEwMyksUW4oaSl8fEcoMTA0KSxuPXIuZ2V0UGFyZW50KCksdXUobil8fEcoMTA1KSxuPW4uZ2V0UGFyZW50KCksa3Yobil8fEcoMTA2KTtsZXRbbyxsLHNdPWJFKG4scixpKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxpPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxpfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIG09aC1pOy0tcjtmb3IodmFyIGc9MDtnPD1tO2crKyllKG9baStnXVtyXSl9aWYodTxpKWZvcihtPWYtciwtLWksZz0wO2c8PW07ZysrKWUob1tpXVtyK2ddKTtpZihjPmYpZm9yKG09aC1pLGYrPTEsZz0wO2c8PW07ZysrKWUob1tpK2ddW2ZdKTtpZihkPmgpZm9yKG09Zi1yLGgrPTEsZz0wO2c8PW07ZysrKWUob1toXVtyK2ddKX1mb3Iobj1bbl0scj1udWxsLGk9dTtpPD1kO2krKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1vW2ldW2ZdKSxtPWguZ2V0UGFyZW50KCksdXUobSl8fEcoMTA3KSxtIT09ciYmbi5wdXNoKG0pLG4ucHVzaChoLC4uLmxPKGgpKSxyPW07cmV0dXJuIE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IGU9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspbis9ZVtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBfdih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFBmfWNsYXNzIGFse2NvbnN0cnVjdG9yKGUsbixyLGkpe3RoaXMuYW5jaG9yPWUsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPWksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCxlLl9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyhlKXtyZXR1cm4gdmUoZSk/dGhpcy5hbmNob3IuaXMoZS5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKGUuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PWUuZm9ybWF0JiZ0aGlzLnN0eWxlPT09ZS5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIGU9dGhpcy5fY2FjaGVkTm9kZXM7aWYoZSE9PW51bGwpcmV0dXJuIGU7ZT10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9ZS5pc0JlZm9yZShuKSxpPXI/ZTpuO3I9cj9uOmUsZT1pLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBvPWkub2Zmc2V0O3JldHVybiBpPXIub2Zmc2V0LFUoZSkmJihyPWUuZ2V0RGVzY2VuZGFudEJ5SW5kZXgobyksZT1yPz9lKSxVKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpLHIhPT1udWxsJiZyIT09ZSYmbi5nZXRDaGlsZEF0SW5kZXgoaSk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLGU9ZS5pcyhuKT9VKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCk/W106W2VdOmUuZ2V0Tm9kZXNCZXR3ZWVuKG4pLE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1lKSxlfXNldFRleHROb2RlUmFuZ2UoZSxuLHIsaSl7TGkodGhpcy5hbmNob3IsZS5fX2tleSxuLCJ0ZXh0IiksTGkodGhpcy5mb2N1cyxyLl9fa2V5LGksInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgZT10aGlzLmdldE5vZGVzKCk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPWVbMF0scj1lW2UubGVuZ3RoLTFdLGk9dGhpcy5hbmNob3Isbz10aGlzLmZvY3VzLGw9aS5pc0JlZm9yZShvKSxbcyxhXT1WYyh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDtkKyspe2xldCBmPWVbZF07aWYoVShmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsZWUoZikpe2xldCBoPWYuZ2V0VGV4dENvbnRlbnQoKTtmPT09bj9mPT09cj8oaS50eXBlIT09ImVsZW1lbnQifHxvLnR5cGUhPT0iZWxlbWVudCJ8fG8ub2Zmc2V0PT09aS5vZmZzZXQpJiYoaD1zPGE/aC5zbGljZShzLGEpOmguc2xpY2UoYSxzKSk6aD1sP2guc2xpY2Uocyk6aC5zbGljZShhKTpmPT09ciYmKGg9bD9oLnNsaWNlKDAsYSk6aC5zbGljZSgwLHMpKSx1Kz1ofWVsc2UhdHQoZikmJiFzdShmKXx8Zj09PXImJnRoaXMuaXNDb2xsYXBzZWQoKXx8KHUrPWYuZ2V0VGV4dENvbnRlbnQoKSl9cmV0dXJuIHV9YXBwbHlET01SYW5nZShlKXtsZXQgbj1wdCgpLHI9bi5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb247aWYoZT1DRShlLnN0YXJ0Q29udGFpbmVyLGUuc3RhcnRPZmZzZXQsZS5lbmRDb250YWluZXIsZS5lbmRPZmZzZXQsbixyKSxlIT09bnVsbCl7dmFyW2ksb109ZTtMaSh0aGlzLmFuY2hvcixpLmtleSxpLm9mZnNldCxpLnR5cGUpLExpKHRoaXMuZm9jdXMsby5rZXksby5vZmZzZXQsby50eXBlKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfX1jbG9uZSgpe2xldCBlPXRoaXMuYW5jaG9yLG49dGhpcy5mb2N1cztyZXR1cm4gbmV3IGFsKG5ldyBWcihlLmtleSxlLm9mZnNldCxlLnR5cGUpLG5ldyBWcihuLmtleSxuLm9mZnNldCxuLnR5cGUpLHRoaXMuZm9ybWF0LHRoaXMuc3R5bGUpfXRvZ2dsZUZvcm1hdChlKXt0aGlzLmZvcm1hdD1KUyh0aGlzLmZvcm1hdCxlLG51bGwpLHRoaXMuZGlydHk9ITB9c2V0U3R5bGUoZSl7dGhpcy5zdHlsZT1lLHRoaXMuZGlydHk9ITB9aGFzRm9ybWF0KGUpe3JldHVybih0aGlzLmZvcm1hdCZJb1tlXSkhPT0wfWluc2VydFJhd1RleHQoZSl7ZT1lLnNwbGl0KC8oXHI/XG58XHQpLyk7bGV0IG49W10scj1lLmxlbmd0aDtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgbz1lW2ldO289PT1gCmB8fG89PT1gXHIKYD9uLnB1c2goY3MoKSk6bz09PSIJIj9uLnB1c2goUmYoKSk6bi5wdXNoKEx0KG8pKX10aGlzLmluc2VydE5vZGVzKG4pfWluc2VydFRleHQoZSl7dmFyIG49dGhpcy5hbmNob3Iscj10aGlzLmZvY3VzLGk9dGhpcy5pc0NvbGxhcHNlZCgpfHxuLmlzQmVmb3JlKHIpLG89dGhpcy5mb3JtYXQsbD10aGlzLnN0eWxlO2kmJm4udHlwZT09PSJlbGVtZW50Ij9HMChuLHIsbyxsKTppfHxyLnR5cGUhPT0iZWxlbWVudCJ8fEcwKHIsbixvLGwpO3ZhciBzPXRoaXMuZ2V0Tm9kZXMoKSxhPXMubGVuZ3RoLHU9aT9yOm47cj0oaT9uOnIpLm9mZnNldDt2YXIgYz11Lm9mZnNldDtuPXNbMF0sZWUobil8fEcoMjYpLGk9bi5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDt2YXIgZD1uLmdldFBhcmVudE9yVGhyb3coKSxmPXNbYS0xXTtpZih0aGlzLmlzQ29sbGFwc2VkKCkmJnI9PT1pJiYobi5pc1NlZ21lbnRlZCgpfHxuLmlzVG9rZW4oKXx8IW4uY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFkLmNhbkluc2VydFRleHRBZnRlcigpJiZuLmdldE5leHRTaWJsaW5nKCk9PT1udWxsKSl7dmFyIGg9bi5nZXROZXh0U2libGluZygpO2lmKGVlKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIXVnKGgpfHwoaD1MdCgpLGguc2V0Rm9ybWF0KG8pLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCxlIT09IiIpe3RoaXMuaW5zZXJ0VGV4dChlKTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIWVlKGgpfHx1ZyhoKSkmJihoPUx0KCksaC5zZXRGb3JtYXQobyksZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCk/bi5pbnNlcnRCZWZvcmUoaCk6ZC5pbnNlcnRCZWZvcmUoaCkpLGguc2VsZWN0KCksbj1oLGUhPT0iIil7dGhpcy5pbnNlcnRUZXh0KGUpO3JldHVybn19ZWxzZSBpZihuLmlzU2VnbWVudGVkKCkmJnIhPT1pKWQ9THQobi5nZXRUZXh0Q29udGVudCgpKSxkLnNldEZvcm1hdChvKSxuLnJlcGxhY2UoZCksbj1kO2Vsc2UgaWYoISh0aGlzLmlzQ29sbGFwc2VkKCl8fGU9PT0iInx8KGg9Zi5nZXRQYXJlbnQoKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKSYmZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmKCFVKGgpfHxoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmaC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSkpKSl7dGhpcy5pbnNlcnRUZXh0KCIiKSxFRSh0aGlzLmFuY2hvcix0aGlzLmZvY3VzLG51bGwpLHRoaXMuaW5zZXJ0VGV4dChlKTtyZXR1cm59aWYoYT09PTEpaWYobi5pc1Rva2VuKCkpZT1MdChlKSxlLnNlbGVjdCgpLG4ucmVwbGFjZShlKTtlbHNle2lmKHM9bi5nZXRGb3JtYXQoKSxhPW4uZ2V0U3R5bGUoKSxyPT09YyYmKHMhPT1vfHxhIT09bCkpaWYobi5nZXRUZXh0Q29udGVudCgpPT09IiIpbi5zZXRGb3JtYXQobyksbi5zZXRTdHlsZShsKTtlbHNle3M9THQoZSkscy5zZXRGb3JtYXQobykscy5zZXRTdHlsZShsKSxzLnNlbGVjdCgpLHI9PT0wP24uaW5zZXJ0QmVmb3JlKHMsITEpOihbYV09bi5zcGxpdFRleHQociksYS5pbnNlcnRBZnRlcihzLCExKSkscy5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT1lLmxlbmd0aCk7cmV0dXJufW49bi5zcGxpY2VUZXh0KHIsYy1yLGUsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6dGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKG4uaXNDb21wb3NpbmcoKT90aGlzLmFuY2hvci5vZmZzZXQtPWUubGVuZ3RoOih0aGlzLmZvcm1hdD1zLHRoaXMuc3R5bGU9YSkpfWVsc2V7aWYobz1uZXcgU2V0KFsuLi5uLmdldFBhcmVudEtleXMoKSwuLi5mLmdldFBhcmVudEtleXMoKV0pLGg9VShuKT9uOm4uZ2V0UGFyZW50T3JUaHJvdygpLGw9VShmKT9mOmYuZ2V0UGFyZW50T3JUaHJvdygpLGQ9ZiwhaC5pcyhsKSYmbC5pc0lubGluZSgpKWRvIGQ9bCxsPWwuZ2V0UGFyZW50T3JUaHJvdygpO3doaWxlKGwuaXNJbmxpbmUoKSk7aWYodS50eXBlPT09InRleHQiJiYoYyE9PTB8fGYuZ2V0VGV4dENvbnRlbnQoKT09PSIiKXx8dS50eXBlPT09ImVsZW1lbnQiJiZmLmdldEluZGV4V2l0aGluUGFyZW50KCk8YylpZihlZShmKSYmIWYuaXNUb2tlbigpJiZjIT09Zi5nZXRUZXh0Q29udGVudFNpemUoKSl7aWYoZi5pc1NlZ21lbnRlZCgpKXt2YXIgbT1MdChmLmdldFRleHRDb250ZW50KCkpO2YucmVwbGFjZShtKSxmPW19Z24odS5nZXROb2RlKCkpfHwoZj1mLnNwbGljZVRleHQoMCxjLCIiKSksby5hZGQoZi5fX2tleSl9ZWxzZSB1PWYuZ2V0UGFyZW50T3JUaHJvdygpLHUuY2FuQmVFbXB0eSgpfHx1LmdldENoaWxkcmVuU2l6ZSgpIT09MT9mLnJlbW92ZSgpOnUucmVtb3ZlKCk7ZWxzZSBvLmFkZChmLl9fa2V5KTtmb3IodT1sLmdldENoaWxkcmVuKCksYz1uZXcgU2V0KHMpLGY9aC5pcyhsKSxoPWguaXNJbmxpbmUoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbD9oOm4sbT11Lmxlbmd0aC0xOzA8PW07bS0tKXtsZXQgZz11W21dO2lmKGcuaXMobil8fFUoZykmJmcuaXNQYXJlbnRPZihuKSlicmVhaztnLmlzQXR0YWNoZWQoKSYmKCFjLmhhcyhnKXx8Zy5pcyhkKT9mfHxoLmluc2VydEFmdGVyKGcsITEpOmcucmVtb3ZlKCkpfWlmKCFmKWZvcih1PWwsYz1udWxsO3UhPT1udWxsOylsPXUuZ2V0Q2hpbGRyZW4oKSxmPWwubGVuZ3RoLChmPT09MHx8bFtmLTFdLmlzKGMpKSYmKG8uZGVsZXRlKHUuX19rZXkpLGM9dSksdT11LmdldFBhcmVudCgpO2ZvcihuLmlzVG9rZW4oKT9yPT09aT9uLnNlbGVjdCgpOihlPUx0KGUpLGUuc2VsZWN0KCksbi5yZXBsYWNlKGUpKToobj1uLnNwbGljZVRleHQocixpLXIsZSwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTpuLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPWUubGVuZ3RoKSksZT0xO2U8YTtlKyspbj1zW2VdLG8uaGFzKG4uX19rZXkpfHxuLnJlbW92ZSgpfX1yZW1vdmVUZXh0KCl7dGhpcy5pbnNlcnRUZXh0KCIiKX1mb3JtYXRUZXh0KGUpe2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl0aGlzLnRvZ2dsZUZvcm1hdChlKSxLdChudWxsKTtlbHNle3ZhciBuPXRoaXMuZ2V0Tm9kZXMoKSxyPVtdO2Zvcih2YXIgaSBvZiBuKWVlKGkpJiZyLnB1c2goaSk7dmFyIG89ci5sZW5ndGg7aWYobz09PTApdGhpcy50b2dnbGVGb3JtYXQoZSksS3QobnVsbCk7ZWxzZXtpPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDppLGk9cz9pOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyhlLG51bGwpO3ZhciBjPW8tMSxkPXJbY107aWYobz1pLnR5cGU9PT0idGV4dCI/aS5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1vJiYobD09PTAmJm89PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOihlPXUuc3BsaXRUZXh0KGwsbyksZT1sPT09MD9lWzBdOmVbMV0sZS5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldChlLl9fa2V5LDAsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KGUuX19rZXksby1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyhlLHMpO2ZvcigwPG8mJihvIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChvKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBtPWguZ2V0Rm9ybWF0RmxhZ3MoZSxmKTtoLnNldEZvcm1hdChtKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KGQuX19rZXksbywidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXMoZSxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLGk9ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihpPWk/aS5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1pJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBvPUx0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKG8pfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYobz1MdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKG8pKTtvJiYodGhpcy5mb2N1cy5zZXQoby5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KG8uX19rZXksMCwidGV4dCIpKX19bz10aGlzLmFuY2hvcixyPW8ub2Zmc2V0O3ZhciBsPW8uZ2V0Tm9kZSgpO2k9bCxvLnR5cGU9PT0iZWxlbWVudCImJihvPW8uZ2V0Tm9kZSgpLGk9by5nZXRDaGlsZEF0SW5kZXgoci0xKSxpPWk9PT1udWxsP286aSksbz1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9dnIobCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihlZShsKSlpZihpPWwuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgscj09PTAmJmkhPT0wKWk9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPWkhPT1udWxsP2k6bC5nZXRQYXJlbnRPclRocm93KCksby5wdXNoKGwpO2Vsc2UgaWYocj09PWkpaT1sO2Vsc2V7aWYobC5pc1Rva2VuKCkpcmV0dXJuITE7W2ksbF09bC5zcGxpdFRleHQociksby5wdXNoKGwpfWw9aSxvLnB1c2goLi4ucykscz1lWzBdO3ZhciB1PSExLGM9bnVsbDtmb3IobGV0IG09MDttPGUubGVuZ3RoO20rKyl7dmFyIGQ9ZVttXTtpZih2cihpKXx8dHQoaSl8fCFVKGQpfHxkLmlzSW5saW5lKCkpdSYmIVUoZCkmJiF0dChkKSYmdnIoaS5nZXRQYXJlbnQoKSkmJkcoMjgpO2Vsc2V7aWYoZC5pcyhzKSl7aWYoVShpKSYmaS5pc0VtcHR5KCkmJmkuY2FuUmVwbGFjZVdpdGgoZCkpe2kucmVwbGFjZShkKSxpPWQsdT0hMDtjb250aW51ZX1pZih1PWQuZ2V0Rmlyc3REZXNjZW5kYW50KCkscVModSkpe2Zvcih2YXIgZj11LmdldFBhcmVudE9yVGhyb3coKTtmLmlzSW5saW5lKCk7KWY9Zi5nZXRQYXJlbnRPclRocm93KCk7aWYoYz1mLmdldENoaWxkcmVuKCksdT1jLmxlbmd0aCxVKGkpKXt2YXIgaD1pLmdldEZpcnN0Q2hpbGQoKTtmb3IobGV0IGc9MDtnPHU7ZysrKXtsZXQgdz1jW2ddO2g9PT1udWxsP2kuYXBwZW5kKHcpOmguaW5zZXJ0QWZ0ZXIodyksaD13fX1lbHNle2ZvcihoPXUtMTswPD1oO2gtLSlpLmluc2VydEFmdGVyKGNbaF0pO2k9aS5nZXRQYXJlbnRPclRocm93KCl9aWYoYz1jW3UtMV0sZi5yZW1vdmUoKSx1PSEwLGYuaXMoZCkpY29udGludWV9fWVlKGkpJiYoYT09PW51bGwmJkcoMjcpLGk9YSl9dT0hMSxVKGkpJiYhaS5pc0lubGluZSgpPyhjPWQsdHQoZCkmJiFkLmlzSW5saW5lKCk/aT1lLmxlbmd0aD09PTEmJmkuY2FuQmVFbXB0eSgpJiZpLmlzRW1wdHkoKT9pLmluc2VydEJlZm9yZShkLCExKTppLmluc2VydEFmdGVyKGQsITEpOlUoZCk/KGQuY2FuQmVFbXB0eSgpfHwhZC5pc0VtcHR5KCkpJiYoZ24oaSk/KGY9aS5nZXRDaGlsZEF0SW5kZXgociksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6aS5hcHBlbmQoZCksaT1kKTpkLmlzSW5saW5lKCk/KGkuYXBwZW5kKGQpLGk9ZCk6aT1pLmluc2VydEFmdGVyKGQsITEpKTooZj1pLmdldEZpcnN0Q2hpbGQoKSxmIT09bnVsbD9mLmluc2VydEJlZm9yZShkKTppLmFwcGVuZChkKSxpPWQpKTohVShkKXx8VShkKSYmZC5pc0lubGluZSgpfHx0dChpKSYmIWkuaXNJbmxpbmUoKT8oYz1kLHZlKHRoaXMpJiZ0dChkKSYmKFUoaSl8fGVlKGkpKSYmIWQuaXNJbmxpbmUoKT8oZWUoaSk/KGY9aS5nZXRQYXJlbnRPclRocm93KCksW2ldPWkuc3BsaXRUZXh0KHIpLGk9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpOihmPWksaT1yKSxbLGldPWFFKGYsaSksaT1pLmluc2VydEJlZm9yZShkKSk6aT1pLmluc2VydEFmdGVyKGQsITEpKTooZD1pLmdldFBhcmVudE9yVGhyb3coKSxzdShpKSYmaS5yZW1vdmUoKSxpPWQsbS0tKX1pZihuJiYoZWUobCk/bC5zZWxlY3QoKTooZT1pLmdldFByZXZpb3VzU2libGluZygpLGVlKGUpP2Uuc2VsZWN0KCk6KGU9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChlLGUpKSkpLFUoaSkpe2lmKGU9ZWUoYyk/YzpVKGMpJiZjLmlzSW5saW5lKCk/Yy5nZXRMYXN0RGVzY2VuZGFudCgpOmkuZ2V0TGFzdERlc2NlbmRhbnQoKSxufHwoZT09PW51bGw/aS5zZWxlY3QoKTplZShlKT9lLmdldFRleHRDb250ZW50KCk9PT0iIj9lLnNlbGVjdFByZXZpb3VzKCk6ZS5zZWxlY3QoKTplLnNlbGVjdE5leHQoKSksby5sZW5ndGghPT0wKWZvcihuPWksZT1vLmxlbmd0aC0xOzA8PWU7ZS0tKXI9b1tlXSxhPXIuZ2V0UGFyZW50T3JUaHJvdygpLCFVKGkpfHxDZyhyKXx8dHQocikmJighci5pc0lubGluZSgpfHxyLmlzSXNvbGF0ZWQoKSk/VShpKXx8Q2cocik/VShyKSYmIXIuY2FuSW5zZXJ0QWZ0ZXIoaSk/KGw9YS5jb25zdHJ1Y3Rvci5jbG9uZShhKSxVKGwpfHxHKDI5KSxsLmFwcGVuZChyKSxpLmluc2VydEFmdGVyKGwpKTppLmluc2VydEFmdGVyKHIpOihpLmluc2VydEJlZm9yZShyKSxpPXIpOihuPT09aT9pLmFwcGVuZChyKTppLmluc2VydEJlZm9yZShyKSxpPXIpLGEuaXNFbXB0eSgpJiYhYS5jYW5CZUVtcHR5KCkmJmEucmVtb3ZlKCl9ZWxzZSBufHwoZWUoaSk/aS5zZWxlY3QoKToobj1pLmdldFBhcmVudE9yVGhyb3coKSxlPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KGUsZSkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciBlPXRoaXMuYW5jaG9yLG49ZS5vZmZzZXQscj1bXTtpZihlLnR5cGU9PT0idGV4dCIpe3ZhciBpPWUuZ2V0Tm9kZSgpLG89aS5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1pLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTppLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP28ucHVzaChpKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1pLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxpXT1pLnNwbGl0VGV4dChuKSxvLnB1c2goaSkpKX1lbHNle2lmKGw9ZS5nZXROb2RlKCksdnIobCkpe289Wm8oKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLG8uc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUobywhMSk6bC5hcHBlbmQobyk7cmV0dXJufW89bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihpPW8ubGVuZ3RoLG49PT0wJiYwPGkmJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxvPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksVShvKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKW8uYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihVKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKGUuZ2V0Tm9kZSgpKXx8YSYmYS5pcyhlLmdldE5vZGUoKSkpJiYwPGkpbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCxlPXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspZS5hcHBlbmQoclthXSk7aWYoaSE9PTApZm9yKHI9MDtyPGk7cisrKW49b1tyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsoZSl7bGV0IG49Y3MoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLGduKHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSxlP3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4gVmModGhpcyl9ZXh0cmFjdCgpe3ZhciBlPXRoaXMuZ2V0Tm9kZXMoKSxuPWUubGVuZ3RoLHI9bi0xLGk9dGhpcy5hbmNob3I7bGV0IG89dGhpcy5mb2N1czt2YXIgbD1lWzBdO2xldCBzPWVbcl0sW2EsdV09VmModGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP2VlKGwpJiYhdGhpcy5pc0NvbGxhcHNlZCgpPyhlPWE+dT91OmEscj1sLnNwbGl0VGV4dChlLGE+dT9hOnUpLGU9ZT09PTA/clswXTpyWzFdLGUhPW51bGw/W2VdOltdKTpbbF06KG49aS5pc0JlZm9yZShvKSxlZShsKSYmKGk9bj9hOnUsaT09PWwuZ2V0VGV4dENvbnRlbnRTaXplKCk/ZS5zaGlmdCgpOmkhPT0wJiYoWyxsXT1sLnNwbGl0VGV4dChpKSxlWzBdPWwpKSxlZShzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP2UucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksZVtyXT1zKSksZSl9bW9kaWZ5KGUsbixyKXt2YXIgaT10aGlzLmZvY3VzLG89dGhpcy5hbmNob3IsbD1lPT09Im1vdmUiLHM9Y2coaSxuKTtpZih0dChzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj1rZygpLG4uYWRkKHMuX19rZXkpLFdyKG4pKTooZT1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLGVlKGUpPyhzPWUuX19rZXksbj1uP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCxpLnNldChzLG4sInRleHQiKSxsJiZvLnNldChzLG4sInRleHQiKSk6KHI9cy5nZXRQYXJlbnRPclRocm93KCksVShlKT8ocj1lLl9fa2V5LHM9bj9lLmdldENoaWxkcmVuU2l6ZSgpOjApOihzPXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxyPXIuX19rZXksbnx8cysrKSxpLnNldChyLHMsImVsZW1lbnQiKSxsJiZvLnNldChyLHMsImVsZW1lbnQiKSkpO2Vsc2UgaWYobz1wdCgpLGk9WHIoby5fd2luZG93KSl7dmFyIGE9by5fYmxvY2tDdXJzb3JFbGVtZW50LHU9by5fcm9vdEVsZW1lbnQ7aWYodT09PW51bGx8fGE9PT1udWxsfHwhVShzKXx8cy5pc0lubGluZSgpfHxzLmNhbkJlRW1wdHkoKXx8ZGcoYSxvLHUpLGkubW9kaWZ5KGUsbj8iYmFja3dhcmQiOiJmb3J3YXJkIixyKSwwPGkucmFuZ2VDb3VudCYmKHM9aS5nZXRSYW5nZUF0KDApLG89dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLG89Z24obyk/bzpsRShvKSx0aGlzLmFwcGx5RE9NUmFuZ2UocyksdGhpcy5kaXJ0eT0hMCwhbCkpe2ZvcihsPXRoaXMuZ2V0Tm9kZXMoKSxlPVtdLHI9ITEsYT0wO2E8bC5sZW5ndGg7YSsrKXU9bFthXSxPZCh1LG8pP2UucHVzaCh1KTpyPSEwO3ImJjA8ZS5sZW5ndGgmJihuPyhuPWVbMF0sVShuKT9uLnNlbGVjdFN0YXJ0KCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0U3RhcnQoKSk6KG49ZVtlLmxlbmd0aC0xXSxVKG4pP24uc2VsZWN0RW5kKCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0RW5kKCkpKSwoaS5hbmNob3JOb2RlIT09cy5zdGFydENvbnRhaW5lcnx8aS5hbmNob3JPZmZzZXQhPT1zLnN0YXJ0T2Zmc2V0KSYmKG49dGhpcy5mb2N1cyxsPXRoaXMuYW5jaG9yLGk9bC5rZXkscz1sLm9mZnNldCxvPWwudHlwZSxMaShsLG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksTGkobixpLHMsbyksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCl9fX1kZWxldGVDaGFyYWN0ZXIoZSl7bGV0IG49dGhpcy5pc0NvbGxhcHNlZCgpO2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl7dmFyIHI9dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLG89ci5nZXROb2RlKCk7aWYoIWUmJihyLnR5cGU9PT0iZWxlbWVudCImJlUobykmJnIub2Zmc2V0PT09by5nZXRDaGlsZHJlblNpemUoKXx8ci50eXBlPT09InRleHQiJiZyLm9mZnNldD09PW8uZ2V0VGV4dENvbnRlbnRTaXplKCkpKXt2YXIgbD1vLmdldFBhcmVudCgpO2lmKGw9by5nZXROZXh0U2libGluZygpfHwobD09PW51bGw/bnVsbDpsLmdldE5leHRTaWJsaW5nKCkpLFUobCkmJmwuaXNTaGFkb3dSb290KCkpcmV0dXJufWlmKGw9Y2coaSxlKSx0dChsKSYmIWwuaXNJc29sYXRlZCgpKXtsLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCkmJlUobykmJm8uZ2V0Q2hpbGRyZW5TaXplKCk9PT0wPyhvLnJlbW92ZSgpLGU9a2coKSxlLmFkZChsLl9fa2V5KSxXcihlKSk6KGwucmVtb3ZlKCkscHQoKS5kaXNwYXRjaENvbW1hbmQoRWYsdm9pZCAwKSk7cmV0dXJufWlmKCFlJiZVKGwpJiZVKG8pJiZvLmlzRW1wdHkoKSl7by5yZW1vdmUoKSxsLnNlbGVjdFN0YXJ0KCk7cmV0dXJufWlmKHRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImNoYXJhY3RlciIpLHRoaXMuaXNDb2xsYXBzZWQoKSl7aWYoZSYmci5vZmZzZXQ9PT0wJiYoci50eXBlPT09ImVsZW1lbnQiP3IuZ2V0Tm9kZSgpOnIuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKSkuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKXJldHVybn1lbHNle2lmKGw9aS50eXBlPT09InRleHQiP2kuZ2V0Tm9kZSgpOm51bGwsbz1yLnR5cGU9PT0idGV4dCI/ci5nZXROb2RlKCk6bnVsbCxsIT09bnVsbCYmbC5pc1NlZ21lbnRlZCgpKXtpZihyPWkub2Zmc2V0LGk9bC5nZXRUZXh0Q29udGVudFNpemUoKSxsLmlzKG8pfHxlJiZyIT09aXx8IWUmJnIhPT0wKXtYMChsLGUscik7cmV0dXJufX1lbHNlIGlmKG8hPT1udWxsJiZvLmlzU2VnbWVudGVkKCkmJihyPXIub2Zmc2V0LGk9by5nZXRUZXh0Q29udGVudFNpemUoKSxvLmlzKGwpfHxlJiZyIT09MHx8IWUmJnIhPT1pKSl7WDAobyxlLHIpO3JldHVybn1pZihvPXRoaXMuYW5jaG9yLGw9dGhpcy5mb2N1cyxyPW8uZ2V0Tm9kZSgpLGk9bC5nZXROb2RlKCkscj09PWkmJm8udHlwZT09PSJ0ZXh0IiYmbC50eXBlPT09InRleHQiKXt2YXIgcz1vLm9mZnNldCxhPWwub2Zmc2V0O2xldCB1PXM8YTtpPXU/czphLGE9dT9hOnMscz1hLTEsaSE9PXMmJihyPXIuZ2V0VGV4dENvbnRlbnQoKS5zbGljZShpLGEpLHJFKHIpfHwoZT9sLm9mZnNldD1zOm8ub2Zmc2V0PXMpKX19fXRoaXMucmVtb3ZlVGV4dCgpLGUmJiFuJiZ0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnRoaXMuYW5jaG9yLm9mZnNldD09PTAmJihlPXRoaXMuYW5jaG9yLmdldE5vZGUoKSxlLmlzRW1wdHkoKSYmZ24oZS5nZXRQYXJlbnQoKSkmJmUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKT09PTAmJmUuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKX1kZWxldGVMaW5lKGUpe3RoaXMuaXNDb2xsYXBzZWQoKSYmKHRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJnRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImxpbmVib3VuZGFyeSIpLChlP3RoaXMuZm9jdXM6dGhpcy5hbmNob3IpLm9mZnNldD09PTAmJnRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImNoYXJhY3RlciIpKSx0aGlzLnJlbW92ZVRleHQoKX1kZWxldGVXb3JkKGUpe3RoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5tb2RpZnkoImV4dGVuZCIsZSwid29yZCIpLHRoaXMucmVtb3ZlVGV4dCgpfX1mdW5jdGlvbiAkcyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE9mfWZ1bmN0aW9uIFkwKHQpe2xldCBlPXQub2Zmc2V0O3JldHVybiB0LnR5cGU9PT0idGV4dCI/ZToodD10LmdldE5vZGUoKSxlPT09dC5nZXRDaGlsZHJlblNpemUoKT90LmdldFRleHRDb250ZW50KCkubGVuZ3RoOjApfWZ1bmN0aW9uIFZjKHQpe2xldCBlPXQuYW5jaG9yO3JldHVybiB0PXQuZm9jdXMsZS50eXBlPT09ImVsZW1lbnQiJiZ0LnR5cGU9PT0iZWxlbWVudCImJmUua2V5PT09dC5rZXkmJmUub2Zmc2V0PT09dC5vZmZzZXQ/WzAsMF06W1kwKGUpLFkwKHQpXX1mdW5jdGlvbiBYMCh0LGUsbil7bGV0IHI9dC5nZXRUZXh0Q29udGVudCgpLnNwbGl0KC8oPz1ccykvZyksaT1yLmxlbmd0aCxvPTAsbD0wO2ZvcihsZXQgcz0wO3M8aTtzKyspe2xldCBhPXJbc10sdT1zPT09aS0xO2lmKGw9byxvKz1hLmxlbmd0aCxlJiZvPT09bnx8bz5ufHx1KXtyLnNwbGljZShzLDEpLHUmJihsPXZvaWQgMCk7YnJlYWt9fWU9ci5qb2luKCIiKS50cmltKCksZT09PSIiP3QucmVtb3ZlKCk6KHQuc2V0VGV4dENvbnRlbnQoZSksdC5zZWxlY3QobCxsKSl9ZnVuY3Rpb24gUTAodCxlLG4scil7dmFyIGk9ZTtpZih0Lm5vZGVUeXBlPT09MSl7bGV0IHM9ITE7dmFyIG89dC5jaGlsZE5vZGVzLGw9by5sZW5ndGg7aT09PWwmJihzPSEwLGk9bC0xKTtsZXQgYT1vW2ldO2lmKGw9ITEsYT09PXIuX2Jsb2NrQ3Vyc29yRWxlbWVudD8oYT1vW2krMV0sbD0hMCk6ci5fYmxvY2tDdXJzb3JFbGVtZW50IT09bnVsbCYmaS0tLHI9amwoYSksZWUocikpaT1zP3IuZ2V0VGV4dENvbnRlbnRTaXplKCk6MDtlbHNle2lmKG89amwodCksbz09PW51bGwpcmV0dXJuIG51bGw7aWYoVShvKT8odD1vLmdldENoaWxkQXRJbmRleChpKSwoZT1VKHQpKSYmKGU9dC5nZXRQYXJlbnQoKSxlPW49PT1udWxsfHxlPT09bnVsbHx8IWUuY2FuQmVFbXB0eSgpfHxlIT09bi5nZXROb2RlKCkpLGUmJihuPXM/dC5nZXRMYXN0RGVzY2VuZGFudCgpOnQuZ2V0Rmlyc3REZXNjZW5kYW50KCksbj09PW51bGw/KG89dCxpPTApOih0PW4sbz1VKHQpP3Q6dC5nZXRQYXJlbnRPclRocm93KCkpKSxlZSh0KT8ocj10LG89bnVsbCxpPXM/dC5nZXRUZXh0Q29udGVudFNpemUoKTowKTp0IT09byYmcyYmIWwmJmkrKyk6KGk9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGk9ZT09PTAmJnR0KG8pJiZqbCh0KT09PW8/aTppKzEsbz1vLmdldFBhcmVudE9yVGhyb3coKSksVShvKSlyZXR1cm4gbmV3IFZyKG8uX19rZXksaSwiZWxlbWVudCIpfX1lbHNlIHI9amwodCk7cmV0dXJuIGVlKHIpP25ldyBWcihyLl9fa2V5LGksInRleHQiKTpudWxsfWZ1bmN0aW9uIEowKHQsZSxuKXt2YXIgcj10Lm9mZnNldCxpPXQuZ2V0Tm9kZSgpO3I9PT0wPyhyPWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksaT1pLmdldFBhcmVudCgpLGU/KG58fCFlKSYmcj09PW51bGwmJlUoaSkmJmkuaXNJbmxpbmUoKSYmKGU9aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlZShlKSYmKHQua2V5PWUuX19rZXksdC5vZmZzZXQ9ZS5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOlUocikmJiFuJiZyLmlzSW5saW5lKCk/KHQua2V5PXIuX19rZXksdC5vZmZzZXQ9ci5nZXRDaGlsZHJlblNpemUoKSx0LnR5cGU9ImVsZW1lbnQiKTplZShyKSYmKHQua2V5PXIuX19rZXksdC5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1pLmdldE5leHRTaWJsaW5nKCksaT1pLmdldFBhcmVudCgpLGUmJlUocikmJnIuaXNJbmxpbmUoKT8odC5rZXk9ci5fX2tleSx0Lm9mZnNldD0wLHQudHlwZT0iZWxlbWVudCIpOihufHxlKSYmcj09PW51bGwmJlUoaSkmJmkuaXNJbmxpbmUoKSYmIWkuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJihlPWkuZ2V0TmV4dFNpYmxpbmcoKSxlZShlKSYmKHQua2V5PWUuX19rZXksdC5vZmZzZXQ9MCkpKX1mdW5jdGlvbiBFRSh0LGUsbil7aWYodC50eXBlPT09InRleHQiJiZlLnR5cGU9PT0idGV4dCIpe3ZhciByPXQuaXNCZWZvcmUoZSk7bGV0IGk9dC5pcyhlKTtKMCh0LHIsaSksSjAoZSwhcixpKSxpJiYoZS5rZXk9dC5rZXksZS5vZmZzZXQ9dC5vZmZzZXQsZS50eXBlPXQudHlwZSkscj1wdCgpLHIuaXNDb21wb3NpbmcoKSYmci5fY29tcG9zaXRpb25LZXkhPT10LmtleSYmdmUobikmJihyPW4uYW5jaG9yLG49bi5mb2N1cyxMaSh0LHIua2V5LHIub2Zmc2V0LHIudHlwZSksTGkoZSxuLmtleSxuLm9mZnNldCxuLnR5cGUpKX19ZnVuY3Rpb24gQ0UodCxlLG4scixpLG8pe3JldHVybiB0PT09bnVsbHx8bj09PW51bGx8fCFJdShpLHQsbil8fChlPVEwKHQsZSx2ZShvKT9vLmFuY2hvcjpudWxsLGkpLGU9PT1udWxsKXx8KHI9UTAobixyLHZlKG8pP28uZm9jdXM6bnVsbCxpKSxyPT09bnVsbHx8ZS50eXBlPT09ImVsZW1lbnQiJiZyLnR5cGU9PT0iZWxlbWVudCImJih0PWpsKHQpLG49amwobiksdHQodCkmJnR0KG4pKSk/bnVsbDooRUUoZSxyLG8pLFtlLHJdKX1mdW5jdGlvbiBDZyh0KXtyZXR1cm4gVSh0KSYmIXQuaXNJbmxpbmUoKX1mdW5jdGlvbiBrRSh0LGUsbixyLGksbyl7bGV0IGw9UXIoKTtyZXR1cm4gdD1uZXcgYWwobmV3IFZyKHQsZSxpKSxuZXcgVnIobixyLG8pLDAsIiIpLHQuZGlydHk9ITAsbC5fc2VsZWN0aW9uPXR9ZnVuY3Rpb24ga2coKXtyZXR1cm4gbmV3IE9mKG5ldyBTZXQpfWZ1bmN0aW9uIEVPKHQpe2xldCBlPXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLG49WHIodC5fd2luZG93KTtyZXR1cm4gJHMoZSl8fF92KGUpP2UuY2xvbmUoKTp3dihlLG4sdCl9ZnVuY3Rpb24gd3YodCxlLG4pe3ZhciByPW4uX3dpbmRvdztpZihyPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgaT1yLmV2ZW50LG89aT9pLnR5cGU6dm9pZCAwO3I9bz09PSJzZWxlY3Rpb25jaGFuZ2UiLGk9IWFnJiYocnx8bz09PSJiZWZvcmVpbnB1dCJ8fG89PT0iY29tcG9zaXRpb25zdGFydCJ8fG89PT0iY29tcG9zaXRpb25lbmQifHxvPT09ImNsaWNrIiYmaSYmaS5kZXRhaWw9PT0zfHxvPT09ImRyb3AifHxvPT09dm9pZCAwKTtsZXQgbDtpZighdmUodCl8fGkpe2lmKGU9PT1udWxsKXJldHVybiBudWxsO2lmKGk9ZS5hbmNob3JOb2RlLG89ZS5mb2N1c05vZGUsbD1lLmFuY2hvck9mZnNldCxlPWUuZm9jdXNPZmZzZXQsciYmdmUodCkmJiFJdShuLGksbykpcmV0dXJuIHQuY2xvbmUoKX1lbHNlIHJldHVybiB0LmNsb25lKCk7aWYobj1DRShpLGwsbyxlLG4sdCksbj09PW51bGwpcmV0dXJuIG51bGw7bGV0W3MsYV09bjtyZXR1cm4gbmV3IGFsKHMsYSx2ZSh0KT90LmZvcm1hdDowLHZlKHQpP3Quc3R5bGU6IiIpfWZ1bmN0aW9uIHJ0KCl7cmV0dXJuIFFyKCkuX3NlbGVjdGlvbn1mdW5jdGlvbiBUcygpe3JldHVybiBwdCgpLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9ufWZ1bmN0aW9uIE1kKHQsZSxuLHI9MSl7dmFyIGk9dC5hbmNob3Isbz10LmZvY3VzLGw9aS5nZXROb2RlKCkscz1vLmdldE5vZGUoKTtpZihlLmlzKGwpfHxlLmlzKHMpKXtpZihsPWUuX19rZXksdC5pc0NvbGxhcHNlZCgpKWU9aS5vZmZzZXQsKG48PWUmJjA8cnx8bjxlJiYwPnIpJiYobj1NYXRoLm1heCgwLGUrciksaS5zZXQobCxuLCJlbGVtZW50Iiksby5zZXQobCxuLCJlbGVtZW50IikscTAodCkpO2Vsc2V7bGV0IHU9dC5pc0JhY2t3YXJkKCk7cz11P286aTt2YXIgYT1zLmdldE5vZGUoKTtpPXU/aTpvLG89aS5nZXROb2RlKCksZS5pcyhhKSYmKGE9cy5vZmZzZXQsKG48PWEmJjA8cnx8bjxhJiYwPnIpJiZzLnNldChsLE1hdGgubWF4KDAsYStyKSwiZWxlbWVudCIpKSxlLmlzKG8pJiYoZT1pLm9mZnNldCwobjw9ZSYmMDxyfHxuPGUmJjA+cikmJmkuc2V0KGwsTWF0aC5tYXgoMCxlK3IpLCJlbGVtZW50IikpfXEwKHQpfX1mdW5jdGlvbiBxMCh0KXt2YXIgZT10LmFuY2hvcixuPWUub2Zmc2V0O2xldCByPXQuZm9jdXM7dmFyIGk9ci5vZmZzZXQsbz1lLmdldE5vZGUoKSxsPXIuZ2V0Tm9kZSgpO2lmKHQuaXNDb2xsYXBzZWQoKSlVKG8pJiYobD1vLmdldENoaWxkcmVuU2l6ZSgpLGw9KGk9bj49bCk/by5nZXRDaGlsZEF0SW5kZXgobC0xKTpvLmdldENoaWxkQXRJbmRleChuKSxlZShsKSYmKG49MCxpJiYobj1sLmdldFRleHRDb250ZW50U2l6ZSgpKSxlLnNldChsLl9fa2V5LG4sInRleHQiKSxyLnNldChsLl9fa2V5LG4sInRleHQiKSkpO2Vsc2V7aWYoVShvKSl7bGV0IHM9by5nZXRDaGlsZHJlblNpemUoKTtuPSh0PW4+PXMpP28uZ2V0Q2hpbGRBdEluZGV4KHMtMSk6by5nZXRDaGlsZEF0SW5kZXgobiksZWUobikmJihvPTAsdCYmKG89bi5nZXRUZXh0Q29udGVudFNpemUoKSksZS5zZXQobi5fX2tleSxvLCJ0ZXh0IikpfVUobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksaT0oZT1pPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KGkpLGVlKGkpJiYobD0wLGUmJihsPWkuZ2V0VGV4dENvbnRlbnRTaXplKCkpLHIuc2V0KGkuX19rZXksbCwidGV4dCIpKSl9fWZ1bmN0aW9uIENPKHQsZSl7aWYoZT1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbix0PXQuX3NlbGVjdGlvbix2ZSh0KSl7dmFyIG49dC5hbmNob3I7bGV0IHI9dC5mb2N1cyxpO24udHlwZT09PSJ0ZXh0IiYmKGk9bi5nZXROb2RlKCksaS5zZWxlY3Rpb25UcmFuc2Zvcm0oZSx0KSksci50eXBlPT09InRleHQiJiYobj1yLmdldE5vZGUoKSxpIT09biYmbi5zZWxlY3Rpb25UcmFuc2Zvcm0oZSx0KSl9fWZ1bmN0aW9uIExkKHQsZSxuLHIsaSl7bGV0IG89bnVsbCxsPTAscz1udWxsO3IhPT1udWxsPyhvPXIuX19rZXksZWUocik/KGw9ci5nZXRUZXh0Q29udGVudFNpemUoKSxzPSJ0ZXh0Iik6VShyKSYmKGw9ci5nZXRDaGlsZHJlblNpemUoKSxzPSJlbGVtZW50IikpOmkhPT1udWxsJiYobz1pLl9fa2V5LGVlKGkpP3M9InRleHQiOlUoaSkmJihzPSJlbGVtZW50IikpLG8hPT1udWxsJiZzIT09bnVsbD90LnNldChvLGwscyk6KGw9ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksdC5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIGV4KHQsZSxuLHIsaSl7dC50eXBlPT09InRleHQiPyh0LmtleT1uLGV8fCh0Lm9mZnNldCs9aSkpOnQub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS10Lm9mZnNldH1mdW5jdGlvbiBiRSh0LGUsbil7bGV0IHI9W10saT1udWxsLG89bnVsbDt0PXQuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPHQubGVuZ3RoO2MrKyl7dmFyIGw9dFtjXTt1dShsKXx8RygxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihRbihkKXx8RygxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sbT11Ll9fY29sU3Bhbjtmb3IobGV0IGc9MDtnPGg7ZysrKXtyW3MrZ109PT12b2lkIDAmJihyW3MrZ109W10pO2ZvcihsZXQgdz0wO3c8bTt3KyspcltzK2ddW2Erd109Zn1lLmlzKHUpJiYoaT1mKSxuLmlzKHUpJiYobz1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIGk9PT1udWxsJiZHKDExMCksbz09PW51bGwmJkcoMTExKSxbcixpLG9dfWZ1bmN0aW9uICRFKHQpe3QgaW5zdGFuY2VvZiBDdnx8KHQgaW5zdGFuY2VvZiB6dT8odD1QZCh0LFFuKSxRbih0KXx8RygxMTQpKToodD1QZCh0LmdldE5vZGUoKSxRbiksUW4odCl8fEcoMTE0KSkpO2xldCBlPXQuZ2V0UGFyZW50KCk7dXUoZSl8fEcoMTE1KTtsZXQgbj1lLmdldFBhcmVudCgpO3JldHVybiBrdihuKXx8RygxMTYpLFt0LGUsbl19bGV0IGp0PW51bGwsenQ9bnVsbCxPbj0hMSxEaD0hMSxhdT0wLHR4PXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBOcygpe3JldHVybiBPbnx8anQhPT1udWxsJiZqdC5fcmVhZE9ubHl9ZnVuY3Rpb24gaG4oKXtPbiYmRygxMyl9ZnVuY3Rpb24gUXIoKXtyZXR1cm4ganQ9PT1udWxsJiZHKDE1KSxqdH1mdW5jdGlvbiBwdCgpe3JldHVybiB6dD09PW51bGwmJkcoMTYpLHp0fWZ1bmN0aW9uIG54KHQsZSxuKXt2YXIgcj1lLl9fdHlwZTtsZXQgaT10Ll9ub2Rlcy5nZXQocik7Zm9yKGk9PT12b2lkIDAmJkcoMzAsciksdD1uLmdldChyKSx0PT09dm9pZCAwJiYodD1BcnJheS5mcm9tKGkudHJhbnNmb3Jtcyksbi5zZXQocix0KSksbj10Lmxlbmd0aCxyPTA7cjxuJiYodFtyXShlKSxlLmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24ga08odCxlKXtlPWUuX2RpcnR5TGVhdmVzLHQ9dC5fbm9kZU1hcDtmb3IobGV0IG4gb2YgZSllPXQuZ2V0KG4pLGVlKGUpJiZlLmlzQXR0YWNoZWQoKSYmZS5pc1NpbXBsZVRleHQoKSYmIWUuaXNVbm1lcmdlYWJsZSgpJiZRUyhlKX1mdW5jdGlvbiBiTyh0LGUpe2xldCBuPWUuX2RpcnR5TGVhdmVzLHI9ZS5fZGlydHlFbGVtZW50czt0PXQuX25vZGVNYXA7bGV0IGk9V2koKSxvPW5ldyBNYXA7dmFyIGw9bjtsZXQgcz1sLnNpemU7Zm9yKHZhciBhPXIsdT1hLnNpemU7MDxzfHwwPHU7KXtpZigwPHMpe2UuX2RpcnR5TGVhdmVzPW5ldyBTZXQ7Zm9yKGxldCBjIG9mIGwpbD10LmdldChjKSxlZShsKSYmbC5pc0F0dGFjaGVkKCkmJmwuaXNTaW1wbGVUZXh0KCkmJiFsLmlzVW5tZXJnZWFibGUoKSYmUVMobCksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PWkmJmwuaXNBdHRhY2hlZCgpJiZueChlLGwsbyksbi5hZGQoYyk7aWYobD1lLl9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSwwPHMpe2F1Kys7Y29udGludWV9fWUuX2RpcnR5TGVhdmVzPW5ldyBTZXQsZS5fZGlydHlFbGVtZW50cz1uZXcgTWFwO2ZvcihsZXQgYyBvZiBhKWE9Y1swXSx1PWNbMV0sKGE9PT0icm9vdCJ8fHUpJiYobD10LmdldChhKSxsIT09dm9pZCAwJiZsIT09dm9pZCAwJiZsLl9fa2V5IT09aSYmbC5pc0F0dGFjaGVkKCkmJm54KGUsbCxvKSxyLnNldChhLHUpKTtsPWUuX2RpcnR5TGVhdmVzLHM9bC5zaXplLGE9ZS5fZGlydHlFbGVtZW50cyx1PWEuc2l6ZSxhdSsrfWUuX2RpcnR5TGVhdmVzPW4sZS5fZGlydHlFbGVtZW50cz1yfWZ1bmN0aW9uIFN2KHQsZSl7dmFyIG49dC50eXBlLHI9ZS5nZXQobik7aWYocj09PXZvaWQgMCYmRygxNyxuKSxuPXIua2xhc3MsdC50eXBlIT09bi5nZXRUeXBlKCkmJkcoMTgsbi5uYW1lKSxuPW4uaW1wb3J0SlNPTih0KSx0PXQuY2hpbGRyZW4sVShuKSYmQXJyYXkuaXNBcnJheSh0KSlmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgaT1Tdih0W3JdLGUpO24uYXBwZW5kKGkpfXJldHVybiBufWZ1bmN0aW9uIHJ4KHQsZSl7bGV0IG49anQscj1PbixpPXp0O2p0PXQsT249ITAsenQ9bnVsbDt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2p0PW4sT249cix6dD1pfX1mdW5jdGlvbiBqbyh0LGUpe2xldCBuPXQuX3BlbmRpbmdFZGl0b3JTdGF0ZSxyPXQuX3Jvb3RFbGVtZW50LGk9dC5faGVhZGxlc3N8fHI9PT1udWxsO2lmKG4hPT1udWxsKXt2YXIgbz10Ll9lZGl0b3JTdGF0ZSxsPW8uX3NlbGVjdGlvbixzPW4uX3NlbGVjdGlvbixhPXQuX2RpcnR5VHlwZSE9PTAsdT1qdCxjPU9uLGQ9enQsZj10Ll91cGRhdGluZyxoPXQuX29ic2VydmVyLG09bnVsbDtpZih0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCx0Ll9lZGl0b3JTdGF0ZT1uLCFpJiZhJiZoIT09bnVsbCl7enQ9dCxqdD1uLE9uPSExLHQuX3VwZGF0aW5nPSEwO3RyeXtsZXQgemU9dC5fZGlydHlUeXBlLFR0PXQuX2RpcnR5RWxlbWVudHMsYXQ9dC5fZGlydHlMZWF2ZXM7aC5kaXNjb25uZWN0KCk7dmFyIGc9emUsdz1UdCx2PWF0O2ZuPW9pPU50PSIiLGNFPWc9PT0yLEJjPW51bGwsdG49dCxpbz10Ll9jb25maWcsaXU9dC5fbm9kZXMsTmY9dG4uX2xpc3RlbmVycy5tdXRhdGlvbixmZz13LGhnPXYsS289by5fbm9kZU1hcCxvbz1uLl9ub2RlTWFwLHh2PW4uX3JlYWRPbmx5LHBnPW5ldyBNYXAodC5fa2V5VG9ET01NYXApO2xldCBsbj1uZXcgTWFwO291PWxuLHVhKCJyb290IixudWxsKSxvdT1wZz1pbz1vbz1Lbz1oZz1mZz1pdT10bj12b2lkIDAsbT1sbn1jYXRjaCh6ZSl7aWYoemUgaW5zdGFuY2VvZiBFcnJvciYmdC5fb25FcnJvcih6ZSksRGgpdGhyb3cgemU7T0UodCxudWxsLHIsbiksWFModCksdC5fZGlydHlUeXBlPTIsRGg9ITAsam8odCxvKSxEaD0hMTtyZXR1cm59ZmluYWxseXtoLm9ic2VydmUocix0eCksdC5fdXBkYXRpbmc9ZixqdD11LE9uPWMsenQ9ZH19bi5fcmVhZE9ubHl8fChuLl9yZWFkT25seT0hMCk7dmFyIHk9dC5fZGlydHlMZWF2ZXMseD10Ll9kaXJ0eUVsZW1lbnRzLFM9dC5fbm9ybWFsaXplZE5vZGVzLGI9dC5fdXBkYXRlVGFncyxUPXQuX2RlZmVycmVkO2EmJih0Ll9kaXJ0eVR5cGU9MCx0Ll9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLHQuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdC5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHQuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHQuX3VwZGF0ZVRhZ3M9bmV3IFNldCk7dmFyICQ9dC5fZGVjb3JhdG9ycyxPPXQuX3BlbmRpbmdEZWNvcmF0b3JzfHwkLEw9bi5fbm9kZU1hcCxQO2ZvcihQIGluIE8pTC5oYXMoUCl8fChPPT09JCYmKE89bkUodCkpLGRlbGV0ZSBPW1BdKTt2YXIgRD1pP251bGw6WHIodC5fd2luZG93KTtpZih0Ll9lZGl0YWJsZSYmRCE9PW51bGwmJihhfHxzPT09bnVsbHx8cy5kaXJ0eSkpe3p0PXQsanQ9bjt0cnl7aWYoaCE9PW51bGwmJmguZGlzY29ubmVjdCgpLGF8fHM9PT1udWxsfHxzLmRpcnR5KXtsZXQgemU9dC5fYmxvY2tDdXJzb3JFbGVtZW50O3plIT09bnVsbCYmZGcoemUsdCxyKTtlOntsZXQgVHQ9RC5hbmNob3JOb2RlLGF0PUQuZm9jdXNOb2RlLGxuPUQuYW5jaG9yT2Zmc2V0LEVuPUQuZm9jdXNPZmZzZXQsX3Q9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighKGIuaGFzKCJjb2xsYWJvcmF0aW9uIikmJl90IT09cnx8X3QhPT1udWxsJiZodihfdCkpKWlmKHZlKHMpKXt2YXIgQj1zLmFuY2hvcixvZT1zLmZvY3VzLEg9Qi5rZXksWj1vZS5rZXksQz1SZCh0LEgpLGs9UmQodCxaKSxFPUIub2Zmc2V0LEE9b2Uub2Zmc2V0LE49cy5mb3JtYXQsRj1zLnN0eWxlLEs9cy5pc0NvbGxhcHNlZCgpLGRlPUMsc2U9ayxBZT0hMTtpZihCLnR5cGU9PT0idGV4dCIpe2RlPSRkKEMpO2xldCBBdD1CLmdldE5vZGUoKTtBZT1BdC5nZXRGb3JtYXQoKSE9PU58fEF0LmdldFN0eWxlKCkhPT1GfWVsc2UgdmUobCkmJmwuYW5jaG9yLnR5cGU9PT0idGV4dCImJihBZT0hMCk7aWYob2UudHlwZT09PSJ0ZXh0IiYmKHNlPSRkKGspKSxkZSE9PW51bGwmJnNlIT09bnVsbCl7aWYoSyYmKGw9PT1udWxsfHxBZXx8dmUobCkmJihsLmZvcm1hdCE9PU58fGwuc3R5bGUhPT1GKSkpe3ZhciBOZT1wZXJmb3JtYW5jZS5ub3coKTt5RT1bTixGLEUsSCxOZV19aWYobG49PT1FJiZFbj09PUEmJlR0PT09ZGUmJmF0PT09c2UmJihELnR5cGUhPT0iUmFuZ2UifHwhSykmJihfdCE9PW51bGwmJnIuY29udGFpbnMoX3QpfHxyLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksQi50eXBlIT09ImVsZW1lbnQiKSlicmVhayBlO3RyeXtELnNldEJhc2VBbmRFeHRlbnQoZGUsRSxzZSxBKX1jYXRjaHt9aWYoIWIuaGFzKCJza2lwLXNjcm9sbC1pbnRvLXZpZXciKSYmcy5pc0NvbGxhcHNlZCgpJiZyIT09bnVsbCYmcj09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe2xldCBBdD1zIGluc3RhbmNlb2YgYWwmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCI/ZGUuY2hpbGROb2Rlc1tFXXx8bnVsbDowPEQucmFuZ2VDb3VudD9ELmdldFJhbmdlQXQoMCk6bnVsbDtpZihBdCE9PW51bGwpe2xldCBzbjtpZihBdCBpbnN0YW5jZW9mIFRleHQpe2xldCBtdD1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO210LnNlbGVjdE5vZGUoQXQpLHNuPW10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWVsc2Ugc249QXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IFBuPXIub3duZXJEb2N1bWVudCxxcj1Qbi5kZWZhdWx0VmlldztpZihxciE9PW51bGwpZm9yKHZhcnt0b3A6USxib3R0b206amV9PXNuLGJlLFJlLHdlPXI7d2UhPT1udWxsOyl7bGV0IG10PXdlPT09UG4uYm9keTtpZihtdCliZT0wLFJlPSRmKHQpLmlubmVySGVpZ2h0O2Vsc2V7bGV0IF9vPXdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2JlPV9vLnRvcCxSZT1fby5ib3R0b219bGV0IE5yPTA7aWYoUTxiZT9Ocj0tKGJlLVEpOmplPlJlJiYoTnI9amUtUmUpLE5yIT09MClpZihtdClxci5zY3JvbGxCeSgwLE5yKTtlbHNle2xldCBfbz13ZS5zY3JvbGxUb3A7d2Uuc2Nyb2xsVG9wKz1OcjtsZXQganM9d2Uuc2Nyb2xsVG9wLV9vO1EtPWpzLGplLT1qc31pZihtdClicmVhazt3ZT1iZih3ZSl9fX14Zz0hMH19ZWxzZSBsIT09bnVsbCYmSXUodCxUdCxhdCkmJkQucmVtb3ZlQWxsUmFuZ2VzKCl9fWU6e2xldCB6ZT10Ll9ibG9ja0N1cnNvckVsZW1lbnQ7aWYodmUocykmJnMuaXNDb2xsYXBzZWQoKSYmcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmci5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSl7bGV0IFR0PXMuYW5jaG9yLGF0PVR0LmdldE5vZGUoKSxsbj1UdC5vZmZzZXQsRW49YXQuZ2V0Q2hpbGRyZW5TaXplKCksX3Q9ITEsQXQ9bnVsbDtpZihsbj09PUVuKXtsZXQgc249YXQuZ2V0Q2hpbGRBdEluZGV4KGxuLTEpO1JoKHNuKSYmKF90PSEwKX1lbHNle2xldCBzbj1hdC5nZXRDaGlsZEF0SW5kZXgobG4pO2lmKFJoKHNuKSl7bGV0IFBuPXNuLmdldFByZXZpb3VzU2libGluZygpOyhQbj09PW51bGx8fFJoKFBuKSkmJihfdD0hMCxBdD10LmdldEVsZW1lbnRCeUtleShzbi5fX2tleSkpfX1pZihfdCl7bGV0IHNuPXQuZ2V0RWxlbWVudEJ5S2V5KGF0Ll9fa2V5KTtpZih6ZT09PW51bGwpe2xldCBQbj10Ll9jb25maWcudGhlbWUscXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cXIuY29udGVudEVkaXRhYmxlPSJmYWxzZSIscXIuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtY3Vyc29yIiwidHJ1ZSIpO2xldCBtdD1Qbi5ibG9ja0N1cnNvcjtpZihtdCE9PXZvaWQgMCl7aWYodHlwZW9mIG10PT0ic3RyaW5nIil7bGV0IE5yPW10LnNwbGl0KCIgIik7bXQ9UG4uYmxvY2tDdXJzb3I9TnJ9bXQhPT12b2lkIDAmJnFyLmNsYXNzTGlzdC5hZGQoLi4ubXQpfXQuX2Jsb2NrQ3Vyc29yRWxlbWVudD16ZT1xcn1yLnN0eWxlLmNhcmV0Q29sb3I9InRyYW5zcGFyZW50IixBdD09PW51bGw/c24uYXBwZW5kQ2hpbGQoemUpOnNuLmluc2VydEJlZm9yZSh6ZSxBdCk7YnJlYWsgZX19emUhPT1udWxsJiZkZyh6ZSx0LHIpfWghPT1udWxsJiZoLm9ic2VydmUocix0eCl9ZmluYWxseXt6dD1kLGp0PXV9fWlmKG0hPT1udWxsKXt2YXIgSWU9bTtsZXQgemU9QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnMubXV0YXRpb24pLFR0PXplLmxlbmd0aDtmb3IobGV0IGF0PTA7YXQ8VHQ7YXQrKyl7bGV0W2xuLEVuXT16ZVthdF0sX3Q9SWUuZ2V0KEVuKTtfdCE9PXZvaWQgMCYmbG4oX3Qse2RpcnR5TGVhdmVzOnkscHJldkVkaXRvclN0YXRlOm8sdXBkYXRlVGFnczpifSl9fXZlKHMpfHxzPT09bnVsbHx8bCE9PW51bGwmJmwuaXMocyl8fHQuZGlzcGF0Y2hDb21tYW5kKEVmLHZvaWQgMCk7dmFyIFFlPXQuX3BlbmRpbmdEZWNvcmF0b3JzO1FlIT09bnVsbCYmKHQuX2RlY29yYXRvcnM9UWUsdC5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCxOYSgiZGVjb3JhdG9yIix0LCEwLFFlKSk7dmFyIFd0PUYwKGV8fG8pLFNuPUYwKG4pO2lmKFd0IT09U24mJk5hKCJ0ZXh0Y29udGVudCIsdCwhMCxTbiksTmEoInVwZGF0ZSIsdCwhMCx7ZGlydHlFbGVtZW50czp4LGRpcnR5TGVhdmVzOnksZWRpdG9yU3RhdGU6bixub3JtYWxpemVkTm9kZXM6UyxwcmV2RWRpdG9yU3RhdGU6ZXx8byx0YWdzOmJ9KSx0Ll9kZWZlcnJlZD1bXSxULmxlbmd0aCE9PTApe2xldCB6ZT10Ll91cGRhdGluZzt0Ll91cGRhdGluZz0hMDt0cnl7Zm9yKGxldCBUdD0wO1R0PFQubGVuZ3RoO1R0KyspVFtUdF0oKX1maW5hbGx5e3QuX3VwZGF0aW5nPXplfX12YXIgbHI9dC5fdXBkYXRlcztpZihsci5sZW5ndGghPT0wKXtsZXQgemU9bHIuc2hpZnQoKTtpZih6ZSl7bGV0W1R0LGF0XT16ZTtURSh0LFR0LGF0KX19fX1mdW5jdGlvbiBOYSh0LGUsbiwuLi5yKXtsZXQgaT1lLl91cGRhdGluZztlLl91cGRhdGluZz1uO3RyeXtsZXQgbz1BcnJheS5mcm9tKGUuX2xpc3RlbmVyc1t0XSk7Zm9yKHQ9MDt0PG8ubGVuZ3RoO3QrKylvW3RdLmFwcGx5KG51bGwscil9ZmluYWxseXtlLl91cGRhdGluZz1pfX1mdW5jdGlvbiBKKHQsZSxuKXtpZih0Ll91cGRhdGluZz09PSExfHx6dCE9PXQpe2xldCBvPSExO3JldHVybiB0LnVwZGF0ZSgoKT0+e289Sih0LGUsbil9KSxvfWxldCByPWd2KHQpO2ZvcihsZXQgbz00OzA8PW87by0tKWZvcihsZXQgbD0wO2w8ci5sZW5ndGg7bCsrKXt2YXIgaT1yW2xdLl9jb21tYW5kcy5nZXQoZSk7aWYoaSE9PXZvaWQgMCYmKGk9aVtvXSxpIT09dm9pZCAwKSl7aT1BcnJheS5mcm9tKGkpO2xldCBzPWkubGVuZ3RoO2ZvcihsZXQgYT0wO2E8czthKyspaWYoaVthXShuLHQpPT09ITApcmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIGl4KHQsZSl7bGV0IG49dC5fdXBkYXRlcztmb3IoZT1lfHwhMTtuLmxlbmd0aCE9PTA7KXt2YXIgcj1uLnNoaWZ0KCk7aWYocil7bGV0W2ksb109cixsO28hPT12b2lkIDAmJihyPW8ub25VcGRhdGUsbD1vLnRhZyxvLnNraXBUcmFuc2Zvcm1zJiYoZT0hMCksciYmdC5fZGVmZXJyZWQucHVzaChyKSxsJiZ0Ll91cGRhdGVUYWdzLmFkZChsKSksaSgpfX1yZXR1cm4gZX1mdW5jdGlvbiBURSh0LGUsbil7bGV0IHI9dC5fdXBkYXRlVGFnczt2YXIgaSxvPWk9ITE7aWYobiE9PXZvaWQgMCl7dmFyIGw9bi5vblVwZGF0ZTtpPW4udGFnLGkhPW51bGwmJnIuYWRkKGkpLGk9bi5za2lwVHJhbnNmb3Jtc3x8ITEsbz1uLmRpc2NyZXRlfHwhMX1sJiZ0Ll9kZWZlcnJlZC5wdXNoKGwpLG49dC5fZWRpdG9yU3RhdGUsbD10Ll9wZW5kaW5nRWRpdG9yU3RhdGU7bGV0IHM9ITE7KGw9PT1udWxsfHxsLl9yZWFkT25seSkmJihsPXQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1uZXcgQWYobmV3IE1hcCgobHx8bikuX25vZGVNYXApKSxzPSEwKSxsLl9mbHVzaFN5bmM9byxvPWp0O2xldCBhPU9uLHU9enQsYz10Ll91cGRhdGluZztqdD1sLE9uPSExLHQuX3VwZGF0aW5nPSEwLHp0PXQ7dHJ5e3MmJih0Ll9oZWFkbGVzcz9uLl9zZWxlY3Rpb24hPW51bGwmJihsLl9zZWxlY3Rpb249bi5fc2VsZWN0aW9uLmNsb25lKCkpOmwuX3NlbGVjdGlvbj1FTyh0KSk7bGV0IGQ9dC5fY29tcG9zaXRpb25LZXk7ZSgpLGk9aXgodCxpKSxDTyhsLHQpLHQuX2RpcnR5VHlwZSE9PTAmJihpP2tPKGwsdCk6Yk8obCx0KSxpeCh0KSxzTyhuLGwsdC5fZGlydHlMZWF2ZXMsdC5fZGlydHlFbGVtZW50cykpLGQhPT10Ll9jb21wb3NpdGlvbktleSYmKGwuX2ZsdXNoU3luYz0hMCk7bGV0IGY9bC5fc2VsZWN0aW9uO2lmKHZlKGYpKXtsZXQgaD1sLl9ub2RlTWFwLG09Zi5mb2N1cy5rZXk7aC5nZXQoZi5hbmNob3Iua2V5KSE9PXZvaWQgMCYmaC5nZXQobSkhPT12b2lkIDB8fEcoMTkpfWVsc2UgJHMoZikmJmYuX25vZGVzLnNpemU9PT0wJiYobC5fc2VsZWN0aW9uPW51bGwpfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdC5fb25FcnJvcihkKSx0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9bix0Ll9kaXJ0eVR5cGU9Mix0Ll9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLHQuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdC5fZGlydHlFbGVtZW50cy5jbGVhcigpLGpvKHQpO3JldHVybn1maW5hbGx5e2p0PW8sT249YSx6dD11LHQuX3VwZGF0aW5nPWMsYXU9MH10Ll9kaXJ0eVR5cGUhPT0wfHwkTyhsLHQpP2wuX2ZsdXNoU3luYz8obC5fZmx1c2hTeW5jPSExLGpvKHQpKTpzJiZyTygoKT0+e2pvKHQpfSk6KGwuX2ZsdXNoU3luYz0hMSxzJiYoci5jbGVhcigpLHQuX2RlZmVycmVkPVtdLHQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSl9ZnVuY3Rpb24gV24odCxlLG4pe3QuX3VwZGF0aW5nP3QuX3VwZGF0ZXMucHVzaChbZSxuXSk6VEUodCxlLG4pfWNsYXNzIE5FIGV4dGVuZHMgenV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9ZGVjb3JhdGUoKXtHKDQ3KX1pc0lzb2xhdGVkKCl7cmV0dXJuITF9aXNJbmxpbmUoKXtyZXR1cm4hMH1pc0tleWJvYXJkU2VsZWN0YWJsZSgpe3JldHVybiEwfX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE5FfWNsYXNzIHVsIGV4dGVuZHMgenV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fX2xhc3Q9dGhpcy5fX2ZpcnN0PW51bGwsdGhpcy5fX2luZGVudD10aGlzLl9fZm9ybWF0PXRoaXMuX19zaXplPTAsdGhpcy5fX2Rpcj1udWxsfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldEZvcm1hdFR5cGUoKXtsZXQgZT10aGlzLmdldEZvcm1hdCgpO3JldHVybiBRUltlXXx8IiJ9Z2V0SW5kZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19pbmRlbnR9Z2V0Q2hpbGRyZW4oKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuKSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gZX1nZXRDaGlsZHJlbktleXMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuLl9fa2V5KSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gZX1nZXRDaGlsZHJlblNpemUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3NpemV9aXNFbXB0eSgpe3JldHVybiB0aGlzLmdldENoaWxkcmVuU2l6ZSgpPT09MH1pc0RpcnR5KCl7bGV0IGU9cHQoKS5fZGlydHlFbGVtZW50cztyZXR1cm4gZSE9PW51bGwmJmUuaGFzKHRoaXMuX19rZXkpfWlzTGFzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKSxuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldExhc3RDaGlsZCgpO3JldHVybiBuIT09bnVsbCYmbi5pcyhlKX1nZXRBbGxUZXh0Tm9kZXMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KXtpZihlZShuKSYmZS5wdXNoKG4pLFUobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7ZS5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiBlfWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCBlPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7ZSE9PW51bGw7KXtpZihVKGUpKXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7ZT1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gZX1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCBlPXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDtlIT09bnVsbDspe2lmKFUoZSkpe2xldCBuPWUuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe2U9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIGV9Z2V0RGVzY2VuZGFudEJ5SW5kZXgoZSl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIGU+PXI/KGU9bltyLTFdLFUoZSkmJmUuZ2V0TGFzdERlc2NlbmRhbnQoKXx8ZXx8bnVsbCk6KGU9bltlXSxVKGUpJiZlLmdldEZpcnN0RGVzY2VuZGFudCgpfHxlfHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiBlPT09bnVsbD9udWxsOkR0KGUpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IGU9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIGU9PT1udWxsJiZHKDQ1LHRoaXMuX19rZXkpLGV9Z2V0TGFzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIGU9PT1udWxsP251bGw6RHQoZSl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCBlPXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIGU9PT1udWxsJiZHKDk2LHRoaXMuX19rZXkpLGV9Z2V0Q2hpbGRBdEluZGV4KGUpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYoZTxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9ZTspe2lmKG49PT1lKXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49ZTspe2lmKG49PT1lKXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgZT0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPW5baV07ZSs9by5nZXRUZXh0Q29udGVudCgpLFUobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJihlKz1gCgpgKX1yZXR1cm4gZX1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgZT0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IG89bltpXTtlKz1vLmdldFRleHRDb250ZW50U2l6ZSgpLFUobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJihlKz0yKX1yZXR1cm4gZX1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQoZSl7cmV0dXJuIGUhPT0iIj8oZT1JMFtlXSwodGhpcy5nZXRGb3JtYXQoKSZlKSE9PTApOiExfXNlbGVjdChlLG4pe2huKCk7bGV0IHI9cnQoKSxpPWUsbz1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZihlPT09MCYmbj09PTApe2lmKGU9dGhpcy5nZXRGaXJzdENoaWxkKCksZWUoZSl8fFUoZSkpcmV0dXJuIGUuc2VsZWN0KDAsMCl9ZWxzZSBpZighKGUhPT12b2lkIDAmJmUhPT1sfHxuIT09dm9pZCAwJiZuIT09bCkmJihlPXRoaXMuZ2V0TGFzdENoaWxkKCksZWUoZSl8fFUoZSkpKXJldHVybiBlLnNlbGVjdCgpfWlmKGk9PT12b2lkIDAmJihpPWwpLG89PT12b2lkIDAmJihvPWwpLGw9dGhpcy5fX2tleSx2ZShyKSlyLmFuY2hvci5zZXQobCxpLCJlbGVtZW50Iiksci5mb2N1cy5zZXQobCxvLCJlbGVtZW50Iiksci5kaXJ0eT0hMDtlbHNlIHJldHVybiBrRShsLGksbCxvLCJlbGVtZW50IiwiZWxlbWVudCIpO3JldHVybiByfXNlbGVjdFN0YXJ0KCl7bGV0IGU9dGhpcy5nZXRGaXJzdERlc2NlbmRhbnQoKTtyZXR1cm4gVShlKXx8ZWUoZSk/ZS5zZWxlY3QoMCwwKTplIT09bnVsbD9lLnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgZT10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIFUoZSl8fGVlKGUpP2Uuc2VsZWN0KCk6ZSE9PW51bGw/ZS5zZWxlY3ROZXh0KCk6dGhpcy5zZWxlY3QoKX1jbGVhcigpe2xldCBlPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobj0+bi5yZW1vdmUoKSksZX1hcHBlbmQoLi4uZSl7cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCksMCxlKX1zZXREaXJlY3Rpb24oZSl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZGlyPWUsbn1zZXRGb3JtYXQoZSl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2Zvcm1hdD1lIT09IiI/STBbZV06MCx0aGlzfXNldEluZGVudChlKXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9faW5kZW50PWUsdGhpc31zcGxpY2UoZSxuLHIpe2xldCBpPXIubGVuZ3RoLG89dGhpcy5nZXRDaGlsZHJlblNpemUoKSxsPXRoaXMuZ2V0V3JpdGFibGUoKSxzPWwuX19rZXk7dmFyIGE9W10sdT1bXTtsZXQgYz10aGlzLmdldENoaWxkQXRJbmRleChlK24pLGQ9bnVsbCxmPW8tbitpO2lmKGUhPT0wKWlmKGU9PT1vKWQ9dGhpcy5nZXRMYXN0Q2hpbGQoKTtlbHNle3ZhciBoPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KGUpO2ghPT1udWxsJiYoZD1oLmdldFByZXZpb3VzU2libGluZygpKX1pZigwPG4pe3ZhciBtPWQ9PT1udWxsP3RoaXMuZ2V0Rmlyc3RDaGlsZCgpOmQuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoaD0wO2g8bjtoKyspe209PT1udWxsJiZHKDEwMCk7dmFyIGc9bS5nZXROZXh0U2libGluZygpLHc9bS5fX2tleTttPW0uZ2V0V3JpdGFibGUoKSxEbyhtKSx1LnB1c2godyksbT1nfX1mb3IoaD1kLGc9MDtnPGk7ZysrKXt3PXJbZ10saCE9PW51bGwmJncuaXMoaCkmJihkPWg9aC5nZXRQcmV2aW91c1NpYmxpbmcoKSksbT13LmdldFdyaXRhYmxlKCksbS5fX3BhcmVudD09PXMmJmYtLSxEbyhtKTtsZXQgdj13Ll9fa2V5O2g9PT1udWxsPyhsLl9fZmlyc3Q9dixtLl9fcHJldj1udWxsKTooaD1oLmdldFdyaXRhYmxlKCksaC5fX25leHQ9dixtLl9fcHJldj1oLl9fa2V5KSx3Ll9fa2V5PT09cyYmRyg3NiksbS5fX3BhcmVudD1zLGEucHVzaCh2KSxoPXd9aWYoZStuPT09bz9oIT09bnVsbCYmKGguZ2V0V3JpdGFibGUoKS5fX25leHQ9bnVsbCxsLl9fbGFzdD1oLl9fa2V5KTpjIT09bnVsbCYmKGU9Yy5nZXRXcml0YWJsZSgpLGghPT1udWxsPyhuPWguZ2V0V3JpdGFibGUoKSxlLl9fcHJldj1oLl9fa2V5LG4uX19uZXh0PWMuX19rZXkpOmUuX19wcmV2PW51bGwpLGwuX19zaXplPWYsdS5sZW5ndGgmJihlPXJ0KCksdmUoZSkpKXt1PW5ldyBTZXQodSksYT1uZXcgU2V0KGEpO2xldHthbmNob3I6dixmb2N1czp5fT1lO294KHYsdSxhKSYmTGQodix2LmdldE5vZGUoKSx0aGlzLGQsYyksb3goeSx1LGEpJiZMZCh5LHkuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxmIT09MHx8dGhpcy5jYW5CZUVtcHR5KCl8fHZyKHRoaXMpfHx0aGlzLnJlbW92ZSgpfXJldHVybiBsfWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6ImVsZW1lbnQiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoKXtyZXR1cm4gbnVsbH1jYW5JbmRlbnQoKXtyZXR1cm4hMH1jb2xsYXBzZUF0U3RhcnQoKXtyZXR1cm4hMX1leGNsdWRlRnJvbUNvcHkoKXtyZXR1cm4hMX1jYW5FeHRyYWN0Q29udGVudHMoKXtyZXR1cm4hMH1jYW5SZXBsYWNlV2l0aCgpe3JldHVybiEwfWNhbkluc2VydEFmdGVyKCl7cmV0dXJuITB9Y2FuQmVFbXB0eSgpe3JldHVybiEwfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1pc0lubGluZSgpe3JldHVybiExfWlzU2hhZG93Um9vdCgpe3JldHVybiExfWNhbk1lcmdlV2l0aCgpe3JldHVybiExfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gVSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHVsfWZ1bmN0aW9uIG94KHQsZSxuKXtmb3IodD10LmdldE5vZGUoKTt0Oyl7bGV0IHI9dC5fX2tleTtpZihlLmhhcyhyKSYmIW4uaGFzKHIpKXJldHVybiEwO3Q9dC5nZXRQYXJlbnQoKX1yZXR1cm4hMX1jbGFzcyBScyBleHRlbmRzIHVse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInJvb3QifXN0YXRpYyBjbG9uZSgpe3JldHVybiBuZXcgUnN9Y29uc3RydWN0b3IoKXtzdXBlcigicm9vdCIpLHRoaXMuX19jYWNoZWRUZXh0PW51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe0coNTEpfWdldFRleHRDb250ZW50KCl7bGV0IGU9dGhpcy5fX2NhY2hlZFRleHQ7cmV0dXJuIU5zKCkmJnB0KCkuX2RpcnR5VHlwZSE9PTB8fGU9PT1udWxsP3N1cGVyLmdldFRleHRDb250ZW50KCk6ZX1yZW1vdmUoKXtHKDUyKX1yZXBsYWNlKCl7Ryg1Myl9aW5zZXJ0QmVmb3JlKCl7Ryg1NCl9aW5zZXJ0QWZ0ZXIoKXtHKDU1KX11cGRhdGVET00oKXtyZXR1cm4hMX1hcHBlbmQoLi4uZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl07VShyKXx8dHQocil8fEcoNTYpfXJldHVybiBzdXBlci5hcHBlbmQoLi4uZSl9c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49WXIoKTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJue2NoaWxkcmVuOltdLGRpcmVjdGlvbjp0aGlzLmdldERpcmVjdGlvbigpLGZvcm1hdDp0aGlzLmdldEZvcm1hdFR5cGUoKSxpbmRlbnQ6dGhpcy5nZXRJbmRlbnQoKSx0eXBlOiJyb290Iix2ZXJzaW9uOjF9fWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiEwfX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFJzfWZ1bmN0aW9uICRPKHQsZSl7aWYoZT1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbix0PXQuX3NlbGVjdGlvbix0IT09bnVsbCl7aWYodC5kaXJ0eXx8IXQuaXMoZSkpcmV0dXJuITB9ZWxzZSBpZihlIT09bnVsbClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBFdigpe3JldHVybiBuZXcgQWYobmV3IE1hcChbWyJyb290IixuZXcgUnNdXSkpfWZ1bmN0aW9uIFJFKHQpe2xldCBlPXQuZXhwb3J0SlNPTigpO3ZhciBuPXQuY29uc3RydWN0b3I7ZS50eXBlIT09bi5nZXRUeXBlKCkmJkcoMTMwLG4ubmFtZSk7bGV0IHI9ZS5jaGlsZHJlbjtpZihVKHQpKWZvcihBcnJheS5pc0FycmF5KHIpfHxHKDU5LG4ubmFtZSksdD10LmdldENoaWxkcmVuKCksbj0wO248dC5sZW5ndGg7bisrKXtsZXQgaT1SRSh0W25dKTtyLnB1c2goaSl9cmV0dXJuIGV9Y2xhc3MgQWZ7Y29uc3RydWN0b3IoZSxuKXt0aGlzLl9ub2RlTWFwPWUsdGhpcy5fc2VsZWN0aW9uPW58fG51bGwsdGhpcy5fcmVhZE9ubHk9dGhpcy5fZmx1c2hTeW5jPSExfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC5zaXplPT09MSYmdGhpcy5fc2VsZWN0aW9uPT09bnVsbH1yZWFkKGUpe3JldHVybiByeCh0aGlzLGUpfWNsb25lKGUpe3JldHVybiBlPW5ldyBBZih0aGlzLl9ub2RlTWFwLGU9PT12b2lkIDA/dGhpcy5fc2VsZWN0aW9uOmUpLGUuX3JlYWRPbmx5PSEwLGV9dG9KU09OKCl7cmV0dXJuIHJ4KHRoaXMsKCk9Pih7cm9vdDpSRShZcigpKX0pKX19Y2xhc3MgT3MgZXh0ZW5kcyB1bHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJwYXJhZ3JhcGgifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IE9zKGUuX19rZXkpfWNyZWF0ZURPTShlKXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7cmV0dXJuIGU9YmEoZS50aGVtZSwicGFyYWdyYXBoIiksZSE9PXZvaWQgMCYmbi5jbGFzc0xpc3QuYWRkKC4uLmUpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntwOigpPT4oe2NvbnZlcnNpb246VE8scHJpb3JpdHk6MH0pfX1leHBvcnRET00oZSl7aWYoe2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUmJlRmKGUpKXt0aGlzLmlzRW1wdHkoKSYmZS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7dmFyIG49dGhpcy5nZXRGb3JtYXRUeXBlKCk7ZS5zdHlsZS50ZXh0QWxpZ249biwobj10aGlzLmdldERpcmVjdGlvbigpKSYmKGUuZGlyPW4pLG49dGhpcy5nZXRJbmRlbnQoKSwwPG4mJihlLnN0eWxlLnRleHRJbmRlbnQ9YCR7MjAqbn1weGApfXJldHVybntlbGVtZW50OmV9fXN0YXRpYyBpbXBvcnRKU09OKGUpe2xldCBuPVpvKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KGUuZm9ybWF0KSxuLnNldEluZGVudChlLmluZGVudCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToicGFyYWdyYXBoIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKGUsbil7ZT1abygpO2xldCByPXRoaXMuZ2V0RGlyZWN0aW9uKCk7cmV0dXJuIGUuc2V0RGlyZWN0aW9uKHIpLHRoaXMuaW5zZXJ0QWZ0ZXIoZSxuKSxlfWNvbGxhcHNlQXRTdGFydCgpe2xldCBlPXRoaXMuZ2V0Q2hpbGRyZW4oKTtpZihlLmxlbmd0aD09PTB8fGVlKGVbMF0pJiZlWzBdLmdldFRleHRDb250ZW50KCkudHJpbSgpPT09IiIpe2lmKHRoaXMuZ2V0TmV4dFNpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0TmV4dCgpLHRoaXMucmVtb3ZlKCksITA7aWYodGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0UHJldmlvdXMoKSx0aGlzLnJlbW92ZSgpLCEwfXJldHVybiExfX1mdW5jdGlvbiBUTyh0KXtsZXQgZT1abygpO3JldHVybiB0LnN0eWxlJiYoZS5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pLHQ9cGFyc2VJbnQodC5zdHlsZS50ZXh0SW5kZW50LDEwKS8yMCwwPHQmJmUuc2V0SW5kZW50KHQpKSx7bm9kZTplfX1mdW5jdGlvbiBabygpe3JldHVybiBqdShuZXcgT3MpfWZ1bmN0aW9uIE9FKHQsZSxuLHIpe2xldCBpPXQuX2tleVRvRE9NTWFwO2kuY2xlYXIoKSx0Ll9lZGl0b3JTdGF0ZT1FdigpLHQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1yLHQuX2NvbXBvc2l0aW9uS2V5PW51bGwsdC5fZGlydHlUeXBlPTAsdC5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSx0Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSx0Ll9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCx0Ll91cGRhdGVUYWdzPW5ldyBTZXQsdC5fdXBkYXRlcz1bXSx0Ll9ibG9ja0N1cnNvckVsZW1lbnQ9bnVsbCxyPXQuX29ic2VydmVyLHIhPT1udWxsJiYoci5kaXNjb25uZWN0KCksdC5fb2JzZXJ2ZXI9bnVsbCksZSE9PW51bGwmJihlLnRleHRDb250ZW50PSIiKSxuIT09bnVsbCYmKG4udGV4dENvbnRlbnQ9IiIsaS5zZXQoInJvb3QiLG4pKX1mdW5jdGlvbiBOTyh0KXtsZXQgZT1uZXcgTWFwLG49bmV3IFNldDtyZXR1cm4gdC5mb3JFYWNoKHI9PntpZihyPXIua2xhc3MuaW1wb3J0RE9NIT1udWxsP3Iua2xhc3MuaW1wb3J0RE9NLmJpbmQoci5rbGFzcyk6bnVsbCxyIT1udWxsJiYhbi5oYXMocikpe24uYWRkKHIpO3ZhciBpPXIoKTtpIT09bnVsbCYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChvPT57bGV0IGw9ZS5nZXQobyk7bD09PXZvaWQgMCYmKGw9W10sZS5zZXQobyxsKSksbC5wdXNoKGlbb10pfSl9fSksZX1jbGFzcyBST3tjb25zdHJ1Y3RvcihlLG4scixpLG8sbCxzKXt0aGlzLl9wYXJlbnRFZGl0b3I9bix0aGlzLl9yb290RWxlbWVudD1udWxsLHRoaXMuX2VkaXRvclN0YXRlPWUsdGhpcy5fY29tcG9zaXRpb25LZXk9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsdGhpcy5fZGVmZXJyZWQ9W10sdGhpcy5fa2V5VG9ET01NYXA9bmV3IE1hcCx0aGlzLl91cGRhdGVzPVtdLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2xpc3RlbmVycz17ZGVjb3JhdG9yOm5ldyBTZXQsZWRpdGFibGU6bmV3IFNldCxtdXRhdGlvbjpuZXcgTWFwLHJvb3Q6bmV3IFNldCx0ZXh0Y29udGVudDpuZXcgU2V0LHVwZGF0ZTpuZXcgU2V0fSx0aGlzLl9jb21tYW5kcz1uZXcgTWFwLHRoaXMuX2NvbmZpZz1pLHRoaXMuX25vZGVzPXIsdGhpcy5fZGVjb3JhdG9ycz17fSx0aGlzLl9wZW5kaW5nRGVjb3JhdG9ycz1udWxsLHRoaXMuX2RpcnR5VHlwZT0wLHRoaXMuX2Nsb25lTm90TmVlZGVkPW5ldyBTZXQsdGhpcy5fZGlydHlMZWF2ZXM9bmV3IFNldCx0aGlzLl9kaXJ0eUVsZW1lbnRzPW5ldyBNYXAsdGhpcy5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsdGhpcy5fdXBkYXRlVGFncz1uZXcgU2V0LHRoaXMuX29ic2VydmVyPW51bGwsdGhpcy5fa2V5PWlFKCksdGhpcy5fb25FcnJvcj1vLHRoaXMuX2h0bWxDb252ZXJzaW9ucz1sLHRoaXMuX2VkaXRhYmxlPXMsdGhpcy5faGVhZGxlc3M9biE9PW51bGwmJm4uX2hlYWRsZXNzLHRoaXMuX2Jsb2NrQ3Vyc29yRWxlbWVudD10aGlzLl93aW5kb3c9bnVsbH1pc0NvbXBvc2luZygpe3JldHVybiB0aGlzLl9jb21wb3NpdGlvbktleSE9bnVsbH1yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKGUpe2xldCBuPXRoaXMuX2xpc3RlbmVycy51cGRhdGU7cmV0dXJuIG4uYWRkKGUpLCgpPT57bi5kZWxldGUoZSl9fXJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcihlKXtsZXQgbj10aGlzLl9saXN0ZW5lcnMuZWRpdGFibGU7cmV0dXJuIG4uYWRkKGUpLCgpPT57bi5kZWxldGUoZSl9fXJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoZSl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmRlY29yYXRvcjtyZXR1cm4gbi5hZGQoZSksKCk9PntuLmRlbGV0ZShlKX19cmVnaXN0ZXJUZXh0Q29udGVudExpc3RlbmVyKGUpe2xldCBuPXRoaXMuX2xpc3RlbmVycy50ZXh0Y29udGVudDtyZXR1cm4gbi5hZGQoZSksKCk9PntuLmRlbGV0ZShlKX19cmVnaXN0ZXJSb290TGlzdGVuZXIoZSl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnJvb3Q7cmV0dXJuIGUodGhpcy5fcm9vdEVsZW1lbnQsbnVsbCksbi5hZGQoZSksKCk9PntlKG51bGwsdGhpcy5fcm9vdEVsZW1lbnQpLG4uZGVsZXRlKGUpfX1yZWdpc3RlckNvbW1hbmQoZSxuLHIpe3I9PT12b2lkIDAmJkcoMzUpO2xldCBpPXRoaXMuX2NvbW1hbmRzO2kuaGFzKGUpfHxpLnNldChlLFtuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0LG5ldyBTZXRdKTtsZXQgbz1pLmdldChlKTtvPT09dm9pZCAwJiZHKDM2LFN0cmluZyhlKSk7bGV0IGw9b1tyXTtyZXR1cm4gbC5hZGQobiksKCk9PntsLmRlbGV0ZShuKSxvLmV2ZXJ5KHM9PnMuc2l6ZT09PTApJiZpLmRlbGV0ZShlKX19cmVnaXN0ZXJNdXRhdGlvbkxpc3RlbmVyKGUsbil7dGhpcy5fbm9kZXMuZ2V0KGUuZ2V0VHlwZSgpKT09PXZvaWQgMCYmRygzNyxlLm5hbWUpO2xldCByPXRoaXMuX2xpc3RlbmVycy5tdXRhdGlvbjtyZXR1cm4gci5zZXQobixlKSwoKT0+e3IuZGVsZXRlKG4pfX1yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKGUsbil7dmFyIHI9ZS5nZXRUeXBlKCk7cmV0dXJuIHI9dGhpcy5fbm9kZXMuZ2V0KHIpLHI9PT12b2lkIDAmJkcoMzcsZS5uYW1lKSxyLnRyYW5zZm9ybXMuYWRkKG4pLHJ9cmVnaXN0ZXJOb2RlVHJhbnNmb3JtKGUsbil7dmFyIHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKGUsbik7bGV0IGk9W3JdO3JldHVybiByPXIucmVwbGFjZVdpdGhLbGFzcyxyIT1udWxsJiYocj10aGlzLnJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3MocixuKSxpLnB1c2gocikpLGlPKHRoaXMsZS5nZXRUeXBlKCkpLCgpPT57aS5mb3JFYWNoKG89Pm8udHJhbnNmb3Jtcy5kZWxldGUobikpfX1oYXNOb2RlKGUpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXMoZS5nZXRUeXBlKCkpfWhhc05vZGVzKGUpe3JldHVybiBlLmV2ZXJ5KHRoaXMuaGFzTm9kZS5iaW5kKHRoaXMpKX1kaXNwYXRjaENvbW1hbmQoZSxuKXtyZXR1cm4gSih0aGlzLGUsbil9Z2V0RGVjb3JhdG9ycygpe3JldHVybiB0aGlzLl9kZWNvcmF0b3JzfWdldFJvb3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50fWdldEtleSgpe3JldHVybiB0aGlzLl9rZXl9c2V0Um9vdEVsZW1lbnQoZSl7bGV0IG49dGhpcy5fcm9vdEVsZW1lbnQ7aWYoZSE9PW4pe2xldCBsPWJhKHRoaXMuX2NvbmZpZy50aGVtZSwicm9vdCIpO3ZhciByPXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZXx8dGhpcy5fZWRpdG9yU3RhdGU7aWYodGhpcy5fcm9vdEVsZW1lbnQ9ZSxPRSh0aGlzLG4sZSxyKSxuIT09bnVsbCl7aWYoIXRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzKXskYSE9PTAmJigkYS0tLCRhPT09MCYmbi5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsU0UpKTt2YXIgaT1uLl9fbGV4aWNhbEVkaXRvcjtpZihpIT1udWxsKXtpZihpLl9wYXJlbnRFZGl0b3IhPT1udWxsKXt2YXIgbz1ndihpKTtvPW9bby5sZW5ndGgtMV0uX2tleSxZbC5nZXQobyk9PT1pJiZZbC5kZWxldGUobyl9ZWxzZSBZbC5kZWxldGUoaS5fa2V5KTtuLl9fbGV4aWNhbEVkaXRvcj1udWxsfWZvcihpPXdFKG4pLG89MDtvPGkubGVuZ3RoO28rKylpW29dKCk7bi5fX2xleGljYWxFdmVudEhhbmRsZXM9W119bCE9bnVsbCYmbi5jbGFzc0xpc3QucmVtb3ZlKC4uLmwpfWUhPT1udWxsPyhyPShyPWUub3duZXJEb2N1bWVudCkmJnIuZGVmYXVsdFZpZXd8fG51bGwsaT1lLnN0eWxlLGkudXNlclNlbGVjdD0idGV4dCIsaS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsaS53b3JkQnJlYWs9ImJyZWFrLXdvcmQiLGUuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZWRpdG9yIiwidHJ1ZSIpLHRoaXMuX3dpbmRvdz1yLHRoaXMuX2RpcnR5VHlwZT0yLFhTKHRoaXMpLHRoaXMuX3VwZGF0ZVRhZ3MuYWRkKCJoaXN0b3J5LW1lcmdlIiksam8odGhpcyksdGhpcy5fY29uZmlnLmRpc2FibGVFdmVudHN8fG1PKGUsdGhpcyksbCE9bnVsbCYmZS5jbGFzc0xpc3QuYWRkKC4uLmwpKToodGhpcy5fZWRpdG9yU3RhdGU9cix0aGlzLl93aW5kb3c9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwpLE5hKCJyb290Iix0aGlzLCExLGUsbil9fWdldEVsZW1lbnRCeUtleShlKXtyZXR1cm4gdGhpcy5fa2V5VG9ET01NYXAuZ2V0KGUpfHxudWxsfWdldEVkaXRvclN0YXRlKCl7cmV0dXJuIHRoaXMuX2VkaXRvclN0YXRlfXNldEVkaXRvclN0YXRlKGUsbil7ZS5pc0VtcHR5KCkmJkcoMzgpLFlTKHRoaXMpO2xldCByPXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZSxpPXRoaXMuX3VwZGF0ZVRhZ3M7bj1uIT09dm9pZCAwP24udGFnOm51bGwscj09PW51bGx8fHIuaXNFbXB0eSgpfHwobiE9bnVsbCYmaS5hZGQobiksam8odGhpcykpLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1lLHRoaXMuX2RpcnR5VHlwZT0yLHRoaXMuX2RpcnR5RWxlbWVudHMuc2V0KCJyb290IiwhMSksdGhpcy5fY29tcG9zaXRpb25LZXk9bnVsbCxuIT1udWxsJiZpLmFkZChuKSxqbyh0aGlzKX1wYXJzZUVkaXRvclN0YXRlKGUsbil7ZT10eXBlb2YgZT09InN0cmluZyI/SlNPTi5wYXJzZShlKTplO2xldCByPUV2KCksaT1qdCxvPU9uLGw9enQscz10aGlzLl9kaXJ0eUVsZW1lbnRzLGE9dGhpcy5fZGlydHlMZWF2ZXMsdT10aGlzLl9jbG9uZU5vdE5lZWRlZCxjPXRoaXMuX2RpcnR5VHlwZTt0aGlzLl9kaXJ0eUVsZW1lbnRzPW5ldyBNYXAsdGhpcy5fZGlydHlMZWF2ZXM9bmV3IFNldCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5VHlwZT0wLGp0PXIsT249ITEsenQ9dGhpczt0cnl7U3YoZS5yb290LHRoaXMuX25vZGVzKSxuJiZuKCksci5fcmVhZE9ubHk9ITB9Y2F0Y2goZCl7ZCBpbnN0YW5jZW9mIEVycm9yJiZ0aGlzLl9vbkVycm9yKGQpfWZpbmFsbHl7dGhpcy5fZGlydHlFbGVtZW50cz1zLHRoaXMuX2RpcnR5TGVhdmVzPWEsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9dSx0aGlzLl9kaXJ0eVR5cGU9YyxqdD1pLE9uPW8senQ9bH1yZXR1cm4gcn11cGRhdGUoZSxuKXtXbih0aGlzLGUsbil9Zm9jdXMoZSxuPXt9KXtsZXQgcj10aGlzLl9yb290RWxlbWVudDtyIT09bnVsbCYmKHIuc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsIm9mZiIpLFduKHRoaXMsKCk9PntsZXQgaT1ydCgpLG89WXIoKTtpIT09bnVsbD9pLmRpcnR5PSEwOm8uZ2V0Q2hpbGRyZW5TaXplKCkhPT0wJiYobi5kZWZhdWx0U2VsZWN0aW9uPT09InJvb3RTdGFydCI/by5zZWxlY3RTdGFydCgpOm8uc2VsZWN0RW5kKCkpfSx7b25VcGRhdGU6KCk9PntyLnJlbW92ZUF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiKSxlJiZlKCl9LHRhZzoiZm9jdXMifSksdGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPT09bnVsbCYmci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIikpfWJsdXIoKXt2YXIgZT10aGlzLl9yb290RWxlbWVudDtlIT09bnVsbCYmZS5ibHVyKCksZT1Ycih0aGlzLl93aW5kb3cpLGUhPT1udWxsJiZlLnJlbW92ZUFsbFJhbmdlcygpfWlzRWRpdGFibGUoKXtyZXR1cm4gdGhpcy5fZWRpdGFibGV9c2V0RWRpdGFibGUoZSl7dGhpcy5fZWRpdGFibGUhPT1lJiYodGhpcy5fZWRpdGFibGU9ZSxOYSgiZWRpdGFibGUiLHRoaXMsITAsZSkpfXRvSlNPTigpe3JldHVybntlZGl0b3JTdGF0ZTp0aGlzLl9lZGl0b3JTdGF0ZS50b0pTT04oKX19fWNsYXNzIEN2IGV4dGVuZHMgdWx7Y29uc3RydWN0b3IoZSxuKXtzdXBlcihuKSx0aGlzLl9fY29sU3Bhbj1lLHRoaXMuX19yb3dTcGFuPTF9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY29sU3Bhbjp0aGlzLl9fY29sU3Bhbixyb3dTcGFuOnRoaXMuX19yb3dTcGFufX1nZXRDb2xTcGFuKCl7cmV0dXJuIHRoaXMuX19jb2xTcGFufXNldENvbFNwYW4oZSl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2NvbFNwYW49ZSx0aGlzfWdldFJvd1NwYW4oKXtyZXR1cm4gdGhpcy5fX3Jvd1NwYW59c2V0Um93U3BhbihlKXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fcm93U3Bhbj1lLHRoaXN9fWZ1bmN0aW9uIFFuKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQ3Z9Y2xhc3MgUEUgZXh0ZW5kcyB1bHt9ZnVuY3Rpb24ga3YodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQRX1jbGFzcyBBRSBleHRlbmRzIHVse31mdW5jdGlvbiB1dSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFFfWouJGFkZFVwZGF0ZVRhZz1mdW5jdGlvbih0KXtobigpLHB0KCkuX3VwZGF0ZVRhZ3MuYWRkKHQpfTtqLiRhcHBseU5vZGVSZXBsYWNlbWVudD1qdTtqLiRjb3B5Tm9kZT1zRTtqLiRjcmVhdGVMaW5lQnJlYWtOb2RlPWNzO2ouJGNyZWF0ZU5vZGVTZWxlY3Rpb249a2c7ai4kY3JlYXRlUGFyYWdyYXBoTm9kZT1abztqLiRjcmVhdGVSYW5nZVNlbGVjdGlvbj1mdW5jdGlvbigpe2xldCB0PW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpLGU9bmV3IFZyKCJyb290IiwwLCJlbGVtZW50Iik7cmV0dXJuIG5ldyBhbCh0LGUsMCwiIil9O2ouJGNyZWF0ZVRhYk5vZGU9UmY7ai4kY3JlYXRlVGV4dE5vZGU9THQ7ai4kZ2V0QWRqYWNlbnROb2RlPWNnO2ouJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGU9RHU7ai4kZ2V0TmVhcmVzdFJvb3RPclNoYWRvd1Jvb3Q9bEU7ai4kZ2V0Tm9kZUJ5S2V5PUR0O2ouJGdldFByZXZpb3VzU2VsZWN0aW9uPVRzO2ouJGdldFJvb3Q9WXI7ai4kZ2V0U2VsZWN0aW9uPXJ0O2ouJGdldFRleHRDb250ZW50PWZ1bmN0aW9uKCl7bGV0IHQ9cnQoKTtyZXR1cm4gdD09PW51bGw/IiI6dC5nZXRUZXh0Q29udGVudCgpfTtqLiRoYXNBbmNlc3Rvcj1PZDtqLiRoYXNVcGRhdGVUYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHB0KCkuX3VwZGF0ZVRhZ3MuaGFzKHQpfTtqLiRpbnNlcnROb2Rlcz1mdW5jdGlvbih0LGUpe2xldCBuPXJ0KCl8fFRzKCk7cmV0dXJuIG49PT1udWxsJiYobj1ZcigpLnNlbGVjdEVuZCgpKSxuLmluc2VydE5vZGVzKHQsZSl9O2ouJGlzQmxvY2tFbGVtZW50Tm9kZT1DZztqLiRpc0RlY29yYXRvck5vZGU9dHQ7ai4kaXNFbGVtZW50Tm9kZT1VO2ouJGlzSW5saW5lRWxlbWVudE9yRGVjb3JhdG9yTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gVSh0KSYmdC5pc0lubGluZSgpfHx0dCh0KSYmdC5pc0lubGluZSgpfTtqLiRpc0xlYWZOb2RlPXFTO2ouJGlzTGluZUJyZWFrTm9kZT1zdTtqLiRpc05vZGVTZWxlY3Rpb249JHM7ai4kaXNQYXJhZ3JhcGhOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgT3N9O2ouJGlzUmFuZ2VTZWxlY3Rpb249dmU7ai4kaXNSb290Tm9kZT1nbjtqLiRpc1Jvb3RPclNoYWRvd1Jvb3Q9dnI7ai4kaXNUYWJOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgYnN9O2ouJGlzVGV4dE5vZGU9ZWU7ai4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24odCl7dmFyIGU9UXIoKTtsZXQgbj1lLl9yZWFkT25seSxyPXQuZ2V0VHlwZSgpO2U9ZS5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0WyxvXW9mIGUpbyBpbnN0YW5jZW9mIHQmJm8uX190eXBlPT09ciYmKG58fG8uaXNBdHRhY2hlZCgpKSYmaS5wdXNoKG8pO3JldHVybiBpfTtqLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1mdjtqLiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBTdih0LHB0KCkuX25vZGVzKX07ai4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIHQ9WXIoKTt0PXQuc2VsZWN0KDAsdC5nZXRDaGlsZHJlblNpemUoKSksV3IoZnYodCkpfTtqLiRzZXRDb21wb3NpdGlvbktleT1LdDtqLiRzZXRTZWxlY3Rpb249V3I7ai4kc3BsaXROb2RlPWFFO2ouQkxVUl9DT01NQU5EPUtTO2ouQ0FOX1JFRE9fQ09NTUFORD17fTtqLkNBTl9VTkRPX0NPTU1BTkQ9e307ai5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtqLkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtqLkNMSUNLX0NPTU1BTkQ9VFM7ai5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7ai5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO2ouQ09NTUFORF9QUklPUklUWV9ISUdIPTM7ai5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO2ouQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtqLkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1HbDtqLkNPUFlfQ09NTUFORD1zdjtqLkNVVF9DT01NQU5EPWF2O2ouREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPXR1O2ouREVMRVRFX0xJTkVfQ09NTUFORD1ydTtqLkRFTEVURV9XT1JEX0NPTU1BTkQ9bnU7ai5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1iRTtqLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgdD1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKSxlPW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgUGYoInJvb3QiLHQsZSl9O2ouREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1FZztqLkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PSRFO2ouREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9UW47ai5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPWt2O2ouREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT11dTtqLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj1fdjtqLkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPUN2O2ouREVQUkVDQVRFRF9HcmlkTm9kZT1QRTtqLkRFUFJFQ0FURURfR3JpZFJvd05vZGU9QUU7ai5EUkFHRU5EX0NPTU1BTkQ9VlM7ai5EUkFHT1ZFUl9DT01NQU5EPVdTO2ouRFJBR1NUQVJUX0NPTU1BTkQ9VVM7ai5EUk9QX0NPTU1BTkQ9QlM7ai5EZWNvcmF0b3JOb2RlPU5FO2ouRWxlbWVudE5vZGU9dWw7ai5GT0NVU19DT01NQU5EPUhTO2ouRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtqLkZPUk1BVF9URVhUX0NPTU1BTkQ9VWk7ai5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O2ouSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1rYTtqLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1vZztqLklOU0VSVF9UQUJfQ09NTUFORD17fTtqLktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9TFM7ai5LRVlfQVJST1dfTEVGVF9DT01NQU5EPVBTO2ouS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9UlM7ai5LRVlfQVJST1dfVVBfQ09NTUFORD1NUztqLktFWV9CQUNLU1BBQ0VfQ09NTUFORD1EUztqLktFWV9ERUxFVEVfQ09NTUFORD16UztqLktFWV9ET1dOX0NPTU1BTkQ9TlM7ai5LRVlfRU5URVJfQ09NTUFORD1rZDtqLktFWV9FU0NBUEVfQ09NTUFORD1qUztqLktFWV9NT0RJRklFUl9DT01NQU5EPVpTO2ouS0VZX1NQQUNFX0NPTU1BTkQ9SVM7ai5LRVlfVEFCX0NPTU1BTkQ9RlM7ai5MaW5lQnJlYWtOb2RlPWtzO2ouTU9WRV9UT19FTkQ9T1M7ai5NT1ZFX1RPX1NUQVJUPUFTO2ouT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307ai5QQVNURV9DT01NQU5EPWl2O2ouUGFyYWdyYXBoTm9kZT1PcztqLlJFRE9fQ09NTUFORD1sdjtqLlJFTU9WRV9URVhUX0NPTU1BTkQ9bGc7ai5Sb290Tm9kZT1ScztqLlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1FZjtqLlNFTEVDVF9BTExfQ09NTUFORD1zZztqLlRhYk5vZGU9YnM7ai5UZXh0Tm9kZT1zbDtqLlVORE9fQ09NTUFORD1vdjtqLmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07ai5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24odCl7dmFyIGU9dHx8e30sbj16dCxyPWUudGhlbWV8fHt9O2xldCBpPXQ9PT12b2lkIDA/bjplLnBhcmVudEVkaXRvcnx8bnVsbCxvPWUuZGlzYWJsZUV2ZW50c3x8ITEsbD1FdigpLHM9ZS5uYW1lc3BhY2V8fChpIT09bnVsbD9pLl9jb25maWcubmFtZXNwYWNlOmlFKCkpLGE9ZS5lZGl0b3JTdGF0ZSx1PVtScyxzbCxrcyxicyxPcywuLi5lLm5vZGVzfHxbXV0sYz1lLm9uRXJyb3I7aWYoZT1lLmVkaXRhYmxlIT09dm9pZCAwP2UuZWRpdGFibGU6ITAsdD09PXZvaWQgMCYmbiE9PW51bGwpdD1uLl9ub2RlcztlbHNlIGZvcih0PW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IG09Zi5nZXRUeXBlKCksZz1mLnRyYW5zZm9ybSgpLHc9bmV3IFNldDtnIT09bnVsbCYmdy5hZGQoZyksdC5zZXQobSx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6d30pfXJldHVybiByPW5ldyBSTyhsLGksdCx7ZGlzYWJsZUV2ZW50czpvLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsTk8odCksZSksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtqLmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1wdjtqLmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFRmKHQpJiZ0LnRhZ05hbWU9PT0iQSJ9O2ouaXNIVE1MRWxlbWVudD1UZjtqLmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PWh2O2ouaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9SXU7Y29uc3QgT089ajt2YXIgX2U9T08sJHQ9e30sVXQ9e30sYWU9X2U7bGV0IElkPW5ldyBNYXA7ZnVuY3Rpb24gbHgodCl7Zm9yKDt0IT1udWxsOyl7aWYodC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiB0O3Q9dC5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIHN4KHQpe2xldCBlPXQucGFyZW50Tm9kZTtpZihlPT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW2UsQXJyYXkuZnJvbShlLmNoaWxkTm9kZXMpLmluZGV4T2YodCldfWZ1bmN0aW9uIE1FKHQpe2xldCBlPXt9O3Q9dC5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiB0KWlmKG4hPT0iIil7bGV0W3IsaV09bi5zcGxpdCgvOihbXl0rKS8pO2Vbci50cmltKCldPWkudHJpbSgpfXJldHVybiBlfWZ1bmN0aW9uIERkKHQpe2xldCBlPUlkLmdldCh0KTtyZXR1cm4gZT09PXZvaWQgMCYmKGU9TUUodCksSWQuc2V0KHQsZSkpLGV9ZnVuY3Rpb24gUE8odCl7bGV0IGU9IiI7Zm9yKGxldCBuIGluIHQpbiYmKGUrPWAke259OiAke3Rbbl19O2ApO3JldHVybiBlfWZ1bmN0aW9uIG1sKHQsZSl7dmFyIG49RGQoImdldFN0eWxlImluIHQ/dC5nZXRTdHlsZSgpOnQuc3R5bGUpO2U9T2JqZWN0LmVudHJpZXMoZSkucmVkdWNlKChyLFtpLG9dKT0+KG89PT1udWxsP2RlbGV0ZSByW2ldOnJbaV09byxyKSx7Li4ubn0pLG49UE8oZSksdC5zZXRTdHlsZShuKSxJZC5zZXQobixlKX1mdW5jdGlvbiBMRSh0LGUpe3ZhciBuPXQuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKGFlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KSl7Zm9yKHZhciBpPWFlLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLG89aS5hbmNob3IsbD1pLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO2FlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoby5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksTEUoYWUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKGkpLGUpKX1hZS4kc2V0U2VsZWN0aW9uKHQpfWVsc2UgaWYoLS1yLGk9blswXSxvPW5bcl0sdC5pc0NvbGxhcHNlZCgpKW1sKHQsZSk7ZWxzZXt2YXIgdT10LmFuY2hvcixjPXQuZm9jdXM7cz1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsdD1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsbT1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LGFlLiRpc1RleHROb2RlKGkpJiZsPT09cyYmKGM9aS5nZXROZXh0U2libGluZygpLGFlLiRpc1RleHROb2RlKGMpJiYobD1kPTAsaT1jKSksbi5sZW5ndGg9PT0xKWFlLiRpc1RleHROb2RlKGkpJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCx0PW09PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT10JiYobD09PTAmJnQ9PT1zPyhtbChpLGUpLGkuc2VsZWN0KGwsdCkpOihuPWkuc3BsaXRUZXh0KGwsdCksbj1sPT09MD9uWzBdOm5bMV0sbWwobixlKSxuLnNlbGVjdCgwLHQtbCkpKSk7ZWxzZSBmb3IoYWUuJGlzVGV4dE5vZGUoaSkmJmw8aS5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYoaT1pLnNwbGl0VGV4dChsKVsxXSksbWwoaSxlKSksYWUuJGlzVGV4dE5vZGUobykmJihsPW8uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsby5fX2tleSE9PXUmJnQhPT0wJiYodD1sKSx0IT09bCYmKFtvXT1vLnNwbGl0VGV4dCh0KSksdCE9PTAmJm1sKG8sZSkpLHQ9MTt0PHI7dCsrKWw9blt0XSxzPWwuZ2V0S2V5KCksYWUuJGlzVGV4dE5vZGUobCkmJnMhPT1pLmdldEtleSgpJiZzIT09by5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZtbChsLGUpfX1mdW5jdGlvbiBBTyh0KXtmb3IoO3QhPT1udWxsJiYhYWUuJGlzUm9vdE9yU2hhZG93Um9vdCh0KTspe2xldCBlPXQuZ2V0TGF0ZXN0KCksbj10LmdldFBhcmVudCgpO2UuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ0LnJlbW92ZSghMCksdD1ufX1mdW5jdGlvbiBqaCh0LGUsbixyLGk9bnVsbCl7aWYoZS5sZW5ndGghPT0wKXt2YXIgbz1lWzBdLGw9bmV3IE1hcCxzPVtdO289YWUuJGlzRWxlbWVudE5vZGUobyk/bzpvLmdldFBhcmVudE9yVGhyb3coKSxvLmlzSW5saW5lKCkmJihvPW8uZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7byE9PW51bGw7KXt2YXIgdT1vLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtvPXUsYT0hMDticmVha31pZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGFlLiRpc1Jvb3RPclNoYWRvd1Jvb3QobykpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPWVbY107YWUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD1lW2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJmFlLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IG09cigpO20uc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxtLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2gobSksbC5zZXQoZCxtKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChnPT57bS5hcHBlbmQoZyksZi5hZGQoZy5nZXRLZXkoKSksYWUuJGlzRWxlbWVudE5vZGUoZykmJmcuZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaCh3PT5mLmFkZCh3KSl9KSxBTyhoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihpIT09bnVsbClmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKWkuYXBwZW5kKHNbZV0pO2lmKGU9bnVsbCxhZS4kaXNSb290T3JTaGFkb3dSb290KG8pKWlmKGEpaWYoaSE9PW51bGwpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pby5pbnNlcnRBZnRlcihzW2ldKTtlbHNlIGlmKGE9by5nZXRGaXJzdENoaWxkKCksYWUuJGlzRWxlbWVudE5vZGUoYSkmJihvPWEpLGE9PT1udWxsKWlmKGkpby5hcHBlbmQoaSk7ZWxzZSBmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKWE9c1tpXSxvLmFwcGVuZChhKSxlPWE7ZWxzZSBpZihpIT09bnVsbClhLmluc2VydEJlZm9yZShpKTtlbHNlIGZvcihvPTA7bzxzLmxlbmd0aDtvKyspaT1zW29dLGEuaW5zZXJ0QmVmb3JlKGkpLGU9aTtlbHNlIGlmKGkpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pYT1zW2ldLG8uaW5zZXJ0QWZ0ZXIoYSksZT1hO3M9YWUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksYWUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9hZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6ZSE9PW51bGw/ZS5zZWxlY3RFbmQoKTp0LmRpcnR5PSEwfX1mdW5jdGlvbiBJRSh0LGUsbixyKXt0Lm1vZGlmeShlPyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIERFKHQpe3JldHVybiB0PXQuYW5jaG9yLmdldE5vZGUoKSwoYWUuJGlzUm9vdE5vZGUodCk/dDp0LmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1VdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKHQpe3Q9dC5nZXRTdHlsZSgpO2xldCBlPU1FKHQpO0lkLnNldCh0LGUpfTtVdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbih0KXtsZXQgZT10LmNvbnN0cnVjdG9yLmNsb25lKHQpO3JldHVybiBlLl9fcGFyZW50PXQuX19wYXJlbnQsZS5fX25leHQ9dC5fX25leHQsZS5fX3ByZXY9dC5fX3ByZXYsYWUuJGlzRWxlbWVudE5vZGUodCkmJmFlLiRpc0VsZW1lbnROb2RlKGUpPyhlLl9fZmlyc3Q9dC5fX2ZpcnN0LGUuX19sYXN0PXQuX19sYXN0LGUuX19zaXplPXQuX19zaXplLGUuX19mb3JtYXQ9dC5fX2Zvcm1hdCxlLl9faW5kZW50PXQuX19pbmRlbnQsZS5fX2Rpcj10Ll9fZGlyLGUpOihhZS4kaXNUZXh0Tm9kZSh0KSYmYWUuJGlzVGV4dE5vZGUoZSkmJihlLl9fZm9ybWF0PXQuX19mb3JtYXQsZS5fX3N0eWxlPXQuX19zdHlsZSxlLl9fbW9kZT10Ll9fbW9kZSxlLl9fZGV0YWlsPXQuX19kZXRhaWwpLGUpfTtVdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuPSIiKXtsZXQgcj1udWxsLGk9dC5nZXROb2RlcygpO3ZhciBvPXQuYW5jaG9yLGw9dC5mb2N1cyxzPXQuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6by5vZmZzZXQ7aWYobz1zP2wuZ2V0Tm9kZSgpOm8uZ2V0Tm9kZSgpLHQuc3R5bGUhPT0iIiYmKHQ9RGQodC5zdHlsZSksdCE9PW51bGwmJmUgaW4gdCkpcmV0dXJuIHRbZV07Zm9yKHQ9MDt0PGkubGVuZ3RoO3QrKyl7dmFyIHU9aVt0XTtpZigodD09PTB8fGEhPT0wfHwhdS5pcyhvKSkmJmFlLiRpc1RleHROb2RlKHUpKXtpZihsPWUscz1uLHU9dS5nZXRTdHlsZSgpLHU9RGQodSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1V0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT09InRleHQiP3Qub2Zmc2V0PT09dC5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6dC5vZmZzZXQ9PT10LmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07VXQuJGlzUGFyZW50RWxlbWVudFJUTD1ERTtVdC4kbW92ZUNhcmV0U2VsZWN0aW9uPUlFO1V0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1ERSh0KTtJRSh0LGUsbj8hcjpyLCJjaGFyYWN0ZXIiKX07VXQuJHBhdGNoU3R5bGVUZXh0PUxFO1V0LiRzZWxlY3RBbGw9ZnVuY3Rpb24odCl7bGV0IGU9dC5hbmNob3I7dD10LmZvY3VzO3ZhciBuPWUuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgaT0iZWxlbWVudCIsbz0iZWxlbWVudCIsbD0wO2FlLiRpc1RleHROb2RlKHIpP2k9InRleHQiOmFlLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLGFlLiRpc1RleHROb2RlKG4pPyhvPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOmFlLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJihlLnNldChyLmdldEtleSgpLDAsaSksdC5zZXQobi5nZXRLZXkoKSxsLG8pKX07VXQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24odCxlKXtpZih0LmFuY2hvci5rZXk9PT0icm9vdCIpe2U9ZSgpO3ZhciBuPWFlLiRnZXRSb290KCk7KHQ9bi5nZXRGaXJzdENoaWxkKCkpP3QucmVwbGFjZShlLCEwKTpuLmFwcGVuZChlKX1lbHNlIGZvcihuPXQuZ2V0Tm9kZXMoKSx0PXQuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKHQpPT09LTEmJm4ucHVzaCh0KSx0LmlzSW5saW5lKCkmJih0PXQuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZih0KT09PS0xJiZuLnB1c2godCkpLHQ9MDt0PG4ubGVuZ3RoO3QrKyl7bGV0IG89blt0XTt2YXIgcj1vO2lmKCFhZS4kaXNFbGVtZW50Tm9kZShyKXx8YWUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIGk9ci5nZXRGaXJzdENoaWxkKCk7aT1pPT09bnVsbHx8YWUuJGlzTGluZUJyZWFrTm9kZShpKXx8YWUuJGlzVGV4dE5vZGUoaSl8fGkuaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJml9ciYmKHI9ZSgpLHIuc2V0Rm9ybWF0KG8uZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChvLmdldEluZGVudCgpKSxvLnJlcGxhY2UociwhMCkpfX07VXQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0PWFlLiRnZXRBZGphY2VudE5vZGUodC5mb2N1cyxlKSxhZS4kaXNEZWNvcmF0b3JOb2RlKHQpJiYhdC5pc0lzb2xhdGVkKCl8fGFlLiRpc0VsZW1lbnROb2RlKHQpJiYhdC5pc0lubGluZSgpJiYhdC5jYW5CZUVtcHR5KCl9O1V0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKHQsZSl7aWYoZS5pc1NlbGVjdGVkKCkmJiFlLmlzU2VnbWVudGVkKCkmJiFlLmlzVG9rZW4oKSYmKGFlLiRpc1JhbmdlU2VsZWN0aW9uKHQpfHxhZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24odCkpKXt2YXIgbj10LmFuY2hvci5nZXROb2RlKCkscj10LmZvY3VzLmdldE5vZGUoKSxpPWUuaXMobiksbz1lLmlzKHIpO2lmKGl8fG8pe2k9dC5pc0JhY2t3YXJkKCk7bGV0W2wsc109dC5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7dD1uLmlzKHIpLG89ZS5pcyhpP3I6bikscj1lLmlzKGk/bjpyKSxuPTA7bGV0IGE7dD8obj1sPnM/czpsLGE9bD5zP2w6cyk6bz8obj1pP3M6bCxhPXZvaWQgMCk6ciYmKGk9aT9sOnMsbj0wLGE9aSksZS5fX3RleHQ9ZS5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIGV9O1V0LiR3cmFwTm9kZXM9ZnVuY3Rpb24odCxlLG49bnVsbCl7dmFyIHI9dC5nZXROb2RlcygpO2xldCBpPXIubGVuZ3RoO3ZhciBvPXQuYW5jaG9yO2lmKGk9PT0wfHxpPT09MSYmby50eXBlPT09ImVsZW1lbnQiJiZvLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe3Q9by50eXBlPT09InRleHQiP28uZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTpvLmdldE5vZGUoKSxyPXQuZ2V0Q2hpbGRyZW4oKTtsZXQgcz1lKCk7cy5zZXRGb3JtYXQodC5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KHQuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLHQucmVwbGFjZShzKX1lbHNle289bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPGk7cysrKXtsZXQgYT1yW3NdO2FlLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KGpoKHQsbCxsLmxlbmd0aCxlLG4pLGw9W10sbz1hKTpvPT09bnVsbHx8byE9PW51bGwmJmFlLiRoYXNBbmNlc3RvcihhLG8pP2wucHVzaChhKTooamgodCxsLGwubGVuZ3RoLGUsbiksbD1bYV0pfWpoKHQsbCxsLmxlbmd0aCxlLG4pfX07VXQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24odCxlLG4scixpKXtsZXQgbz1lLmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT10LmdldEVsZW1lbnRCeUtleShvKTtpZih0PXQuZ2V0RWxlbWVudEJ5S2V5KGwpLGFlLiRpc1RleHROb2RlKGUpJiYoYT1seChhKSksYWUuJGlzVGV4dE5vZGUocikmJih0PWx4KHQpKSxlPT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8dD09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1zeChhKSksdC5ub2RlTmFtZT09PSJCUiImJihbdCxpXT1zeCh0KSksZT1hLmZpcnN0Q2hpbGQsYT09PXQmJmUhPW51bGwmJmUubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmaT09PTAmJihpPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQodCxpKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1pJiZvPT09bHx8KHMuc2V0U3RhcnQodCxpKSxzLnNldEVuZChhLG4pKSxzfTtVdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTt0PW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSxlPUFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj1lLmxlbmd0aDtlLnNvcnQoKG8sbCk9PntsZXQgcz1vLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/by5sZWZ0LWwubGVmdDpzfSk7bGV0IGk7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGw9ZVtvXSxzPWwud2lkdGgrbj09PXQud2lkdGg7aSYmaS50b3A8PWwudG9wJiZpLnRvcCtpLmhlaWdodD5sLnRvcCYmaS5sZWZ0K2kud2lkdGg+bC5sZWZ0fHxzPyhlLnNwbGljZShvLS0sMSksci0tKTppPWx9cmV0dXJuIGV9O1V0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1EZDtVdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1lLmdldE5vZGUoKTtpZihhZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIGk9ci5nZXREZXNjZW5kYW50QnlJbmRleChlLm9mZnNldCk7aSE9PW51bGwmJihyPWkpfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBvPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKG89PT1udWxsKXtpPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1pLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYoaT1pLmdldFBhcmVudCgpLGk9PT1udWxsKXtvPW51bGw7YnJlYWt9cz1pLmdldFByZXZpb3VzU2libGluZygpfWkhPT1udWxsJiYobD1pLmlzSW5saW5lKCk/MDoyLG89YWUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmYWUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLGk9cy5sZW5ndGgsIWFlLiRpc1RleHROb2RlKHIpfHxuPj1pKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1pK2wscj1vO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPXQuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1hZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBhZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLG89aS1uO2xldCB1PXMuc2xpY2UoMCxvKTtsIT09bnVsbCYmbCE9PXM/KG49YWUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksaT1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKTooaT1hZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKGkpKSxhZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsaS5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9ZS5rZXk9PT1hLHM9ZS5vZmZzZXQsczxuJiYocz1pKSxuPWw/cy1uOjAsaT1sP3M6byxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4saSksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixpKSxuLnJlbW92ZSgpKSk6KG49YWUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IE1PPVV0O3ZhciBsbz1NTyxMTz1sbyxFdD1fZTtmdW5jdGlvbiBJTyh0KXtsZXQgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2UuYXBwZW5kKCJjb2RlIix0KTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWUuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke3R9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHtlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gakUodCxlKXtmb3IobGV0IG4gb2YgZSlpZih0LnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiB6RSh0LGUpe2Zvcig7dCE9PUV0LiRnZXRSb290KCkmJnQhPW51bGw7KXtpZihlKHQpKXJldHVybiB0O3Q9dC5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH0kdC4kc3BsaXROb2RlPUV0LiRzcGxpdE5vZGU7JHQuaXNIVE1MQW5jaG9yRWxlbWVudD1FdC5pc0hUTUxBbmNob3JFbGVtZW50OyR0LmlzSFRNTEVsZW1lbnQ9RXQuaXNIVE1MRWxlbWVudDskdC4kZGZzPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107dD0odHx8RXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksZT1lfHwoRXQuJGlzRWxlbWVudE5vZGUodCk/dC5nZXRMYXN0RGVzY2VuZGFudCgpOnQpO2Zvcih2YXIgcj10LGk9MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KWkrKztmb3Iocj1pO3QhPT1udWxsJiYhdC5pcyhlKTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6dH0pLEV0LiRpc0VsZW1lbnROb2RlKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCkpdD10LmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3IoaT1udWxsO2k9PT1udWxsJiZ0IT09bnVsbDspaT10LmdldE5leHRTaWJsaW5nKCksaT09PW51bGw/KHQ9dC5nZXRQYXJlbnQoKSxyLS0pOnQ9aTtyZXR1cm4gdCE9PW51bGwmJnQuaXMoZSkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOnR9KSxufTskdC4kZmlsdGVyPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2xldCBpPWUodFtyXSk7aSE9PW51bGwmJm4ucHVzaChpKX1yZXR1cm4gbn07JHQuJGZpbmRNYXRjaGluZ1BhcmVudD16RTskdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbih0KXtsZXQgZT16RSh0LG49PkV0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gRXQuJGlzRWxlbWVudE5vZGUoZSl8fElPKDQsdC5fX2tleSksZX07JHQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKHQsZSl7Zm9yKDt0IT1udWxsOyl7aWYodCBpbnN0YW5jZW9mIGUpcmV0dXJuIHQ7dD10LmdldFBhcmVudCgpfXJldHVybiBudWxsfTskdC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24odCxlKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZShlKTp0LmFwcGVuZChlKX07JHQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKHQpe3ZhciBlPUV0LiRnZXRTZWxlY3Rpb24oKXx8RXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoRXQuJGlzUmFuZ2VTZWxlY3Rpb24oZSkpe3Zhcntmb2N1czpufT1lO2lmKGU9bi5nZXROb2RlKCksbj1uLm9mZnNldCxFdC4kaXNSb290T3JTaGFkb3dSb290KGUpKW49ZS5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD9lLmFwcGVuZCh0KTpuLmluc2VydEJlZm9yZSh0KSx0LnNlbGVjdE5leHQoKTtlbHNle2xldCByLGk7RXQuJGlzVGV4dE5vZGUoZSk/KHI9ZS5nZXRQYXJlbnRPclRocm93KCksaT1lLmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYoaSs9MSxlLnNwbGl0VGV4dChuKSkpOihyPWUsaT1uKSxbLGVdPUV0LiRzcGxpdE5vZGUocixpKSxlLmluc2VydEJlZm9yZSh0KSxlLnNlbGVjdFN0YXJ0KCl9fWVsc2UgRXQuJGlzTm9kZVNlbGVjdGlvbihlKXx8RXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpPyhlPWUuZ2V0Tm9kZXMoKSxlW2UubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcih0KSk6RXQuJGdldFJvb3QoKS5hcHBlbmQodCksZT1FdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIoZSksZS5zZWxlY3QoKTtyZXR1cm4gdC5nZXRMYXRlc3QoKX07JHQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbih0LGUpe2xldCBuPW5ldyBNYXAscj10Ll9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtpLG9db2YgZS5fbm9kZU1hcCl7bGV0IGw9TE8uJGNsb25lV2l0aFByb3BlcnRpZXMobyk7RXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1vLl9fdGV4dCksbi5zZXQoaSxsKX1yJiYoci5fbm9kZU1hcD1uKSx0Ll9kaXJ0eVR5cGU9Mix0PWUuX3NlbGVjdGlvbixFdC4kc2V0U2VsZWN0aW9uKHQ9PT1udWxsP251bGw6dC5jbG9uZSgpKX07JHQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZSgpLHQucmVwbGFjZShlKSxlLmFwcGVuZCh0KSxlfTskdC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKHQsLi4uZSl7ZS5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSx0LmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9OyR0LmlzTWltZVR5cGU9akU7JHQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKHQsZSl7bGV0IG49dFtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLGkpPT57bGV0IG89W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKG8pO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZvLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLGpFKGEsZSk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9OyR0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4udCl7cmV0dXJuKCk9Pnt0LmZvckVhY2goZT0+ZSgpKX19OyR0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3Rvci5uYW1lPT09ZS5uYW1lOiExfTskdC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oZSxpPT57ZTp7Zm9yKHZhciBvPWkuZ2V0Q2hpbGRyZW4oKSxsPTA7bDxvLmxlbmd0aDtsKyspaWYob1tsXWluc3RhbmNlb2YgZSl7bz1udWxsO2JyZWFrIGV9Zm9yKG89aTtvIT09bnVsbDspaWYobD1vLG89by5nZXRQYXJlbnQoKSxvIGluc3RhbmNlb2YgZSl7bz17Y2hpbGQ6bCxwYXJlbnQ6b307YnJlYWsgZX1vPW51bGx9aWYobyE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PW87aWYocy5pcyhpKSl7aWYocihhLGkpLGk9cy5nZXROZXh0U2libGluZ3MoKSxvPWkubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksbyE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8bzt1KyspbC5hcHBlbmQoaVt1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07JHQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKHQsLi4uZSl7ZS5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJnQuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IERPPSR0O3ZhciBGdD1ETyxGZT1fZSxzbz1GdDtmdW5jdGlvbiBkcyh0KXtsZXQgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2UuYXBwZW5kKCJjb2RlIix0KTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWUuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke3R9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHtlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gRkUodCl7bGV0IGU9MTtmb3IodD10LmdldFBhcmVudCgpO3QhPW51bGw7KXtpZihmdCh0KSl7aWYodD10LmdldFBhcmVudCgpLFRlKHQpKXtlKyssdD10LmdldFBhcmVudCgpO2NvbnRpbnVlfWRzKDQwKX1icmVha31yZXR1cm4gZX1mdW5jdGlvbiBiZyh0KXt0PXQuZ2V0UGFyZW50KCksVGUodCl8fGRzKDQwKTtsZXQgZT10O2Zvcig7ZSE9PW51bGw7KWU9ZS5nZXRQYXJlbnQoKSxUZShlKSYmKHQ9ZSk7cmV0dXJuIHR9ZnVuY3Rpb24gQkUodCl7bGV0IGU9W107dD10LmdldENoaWxkcmVuKCkuZmlsdGVyKGZ0KTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXSxpPXIuZ2V0Rmlyc3RDaGlsZCgpO1RlKGkpP2U9ZS5jb25jYXQoQkUoaSkpOmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBBcih0KXtyZXR1cm4gZnQodCkmJlRlKHQuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBqTyh0KXtmb3IoO3QuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmdC5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCBlPXQuZ2V0UGFyZW50KCk7aWYoZT09bnVsbHx8IWZ0KHQpJiYhVGUodCkpYnJlYWs7dD1lfXQucmVtb3ZlKCl9ZnVuY3Rpb24gYXgodCl7cmV0dXJuIHpuKCkuYXBwZW5kKHQpfWZ1bmN0aW9uIFVFKHQsZSl7cmV0dXJuIGZ0KHQpJiYoZS5sZW5ndGg9PT0wfHxlLmxlbmd0aD09PTEmJnQuaXMoZVswXSkmJnQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBHbyh0LGUpe3Quc3BsaWNlKHQuZ2V0Q2hpbGRyZW5TaXplKCksMCxlKX1mdW5jdGlvbiB1eCh0LGUpe2lmKFRlKHQpKXJldHVybiB0O2xldCBuPXQuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10LmdldE5leHRTaWJsaW5nKCksaT16bigpO3JldHVybiBpLnNldEZvcm1hdCh0LmdldEZvcm1hdFR5cGUoKSksaS5zZXRJbmRlbnQodC5nZXRJbmRlbnQoKSksR28oaSx0LmdldENoaWxkcmVuKCkpLFRlKG4pJiZlPT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChpKSx0LnJlbW92ZSgpLFRlKHIpJiZlPT09ci5nZXRMaXN0VHlwZSgpJiYoR28obixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOlRlKHIpJiZlPT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKGkpLHQucmVtb3ZlKCkscik6KGU9bW4oZSksZS5hcHBlbmQoaSksdC5yZXBsYWNlKGUpLGNuKGUpLGUpfWZ1bmN0aW9uIFdFKHQsZSl7dmFyIG49dC5nZXRMYXN0Q2hpbGQoKTtsZXQgcj1lLmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZBcihuKSYmQXIocikmJihXRShuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj1lLmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKHQuYXBwZW5kKC4uLm4pLGNuKHQpKSxlLnJlbW92ZSgpfWZ1bmN0aW9uIGNuKHQsZSl7aWYodD1lfHx0LmdldENoaWxkcmVuKCksdCE9PXZvaWQgMClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbz10W2VdO2lmKGZ0KG8pKXtsZXQgbD1vLmdldFZhbHVlKCk7dmFyIG49byxyPW4uZ2V0UGFyZW50KCksaT0xO2ZvcihyIT1udWxsJiYoVGUocik/aT1yLmdldFN0YXJ0KCk6ZHMoNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtmdChzKSYmIVRlKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmaSsrfWwhPT1pJiZvLnNldFZhbHVlKGkpfX19ZnVuY3Rpb24gek8odCl7aWYoIUFyKHQpKXt2YXIgZT10LmdldFBhcmVudCgpLG49ZT9lLmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoVGUocikmJmZ0KG4pJiZUZShlKSl7dmFyIGk9ZT9lLmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsbz1lP2UuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKHQuaXMoaSkpbi5pbnNlcnRCZWZvcmUodCksZS5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZih0LmlzKG8pKW4uaW5zZXJ0QWZ0ZXIodCksZS5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD1lLmdldExpc3RUeXBlKCk7aT16bigpO2xldCBzPW1uKGwpO2kuYXBwZW5kKHMpLHQuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLG89em4oKSxsPW1uKGwpLG8uYXBwZW5kKGwpLEdvKGwsdC5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUoaSksbi5pbnNlcnRBZnRlcihvKSxuLnJlcGxhY2UodCl9Y24oZSksY24ocil9fX1sZXQgTWY9Y2xhc3MgVkUgZXh0ZW5kcyBGZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgVkUoZS5fX3ZhbHVlLGUuX19jaGVja2VkLGUuX19rZXkpfWNvbnN0cnVjdG9yKGUsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9ZT09PXZvaWQgMD8xOmUsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIFRlKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZkeChuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsY3gobixlLnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKGUsbixyKXtsZXQgaT10aGlzLmdldFBhcmVudCgpO3JldHVybiBUZShpKSYmaS5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmZHgobix0aGlzLGUpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLGN4KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIGU9PntsZXQgbj1lLmdldFBhcmVudCgpO1RlKG4pJiYoY24obiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmZS5nZXRDaGVja2VkKCkhPW51bGwmJmUuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOkZPLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49em4oKTtyZXR1cm4gbi5zZXRDaGVja2VkKGUuY2hlY2tlZCksbi5zZXRWYWx1ZShlLnZhbHVlKSxuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLmUpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2lmKEZlLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IGk9ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLmkpLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZShlLG4pe2lmKGZ0KGUpKXJldHVybiBzdXBlci5yZXBsYWNlKGUpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCFUZShyKSlyZXR1cm4gZTtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKGUpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIoZSk7ZWxzZXtsZXQgaT1tbihyLmdldExpc3RUeXBlKCkpLG89dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7bzspe2xldCBsPW87bz1vLmdldE5leHRTaWJsaW5nKCksaS5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcihlKSxlLmluc2VydEFmdGVyKGkpfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChpPT57ZS5hcHBlbmQoaSl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLGV9aW5zZXJ0QWZ0ZXIoZSxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtUZShyKXx8ZHMoMzkpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoZnQoZSkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIoZSxuKSxlPWUuZ2V0UGFyZW50T3JUaHJvdygpLFRlKGUpJiZjbihlKSxuO2lmKFRlKGUpKXtmb3Iocj1lLGU9ZS5nZXRDaGlsZHJlbigpLGk9ZS5sZW5ndGgtMTswPD1pO2ktLSlyPWVbaV0sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIoZSxuKSxpLmxlbmd0aCE9PTApe2xldCBvPW1uKHIuZ2V0TGlzdFR5cGUoKSk7aS5mb3JFYWNoKGw9Pm8uYXBwZW5kKGwpKSxlLmluc2VydEFmdGVyKG8sbil9cmV0dXJuIGV9cmVtb3ZlKGUpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKGUpLG4mJnImJkFyKG4pJiZBcihyKT8oV0Uobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJihlPXIuZ2V0UGFyZW50KCksVGUoZSkmJmNuKGUpKX1pbnNlcnROZXdBZnRlcihlLG49ITApe3JldHVybiBlPXpuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcihlLG4pLGV9Y29sbGFwc2VBdFN0YXJ0KGUpe2xldCBuPUZlLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLGk9ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IG89ZnQoaSk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP28/KHIucmVtb3ZlKCksaS5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj1lLmFuY2hvcixlPWUuZm9jdXMsaT1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KGksci5vZmZzZXQsImVsZW1lbnQiKSxlLnR5cGU9PT0iZWxlbWVudCImJmUuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZlLnNldChpLGUub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9ZX1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD1lfXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgZT10aGlzLmdldFBhcmVudCgpO2lmKGU9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O2U9ZS5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO2Z0KGUpOyllPWUuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmLTE8ZXx8ZHMoMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PWU7KWlmKG48ZSl7ZTp7dmFyIHI9bmV3IFNldDtpZihBcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoQXIoaSkmJkFyKG8pKXtpZihvPW8uZ2V0Rmlyc3RDaGlsZCgpLFRlKG8pKXtvLmFwcGVuZCh0aGlzKTt2YXIgbD1pLmdldEZpcnN0Q2hpbGQoKTtUZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLEdvKG8sbCksaS5yZW1vdmUoKSxyLmFkZChpLmdldEtleSgpKSksY24obyl9fWVsc2UgQXIoaSk/KGk9aS5nZXRGaXJzdENoaWxkKCksVGUoaSkmJihyPWkuZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxjbihpKSkpOkFyKG8pPyhpPW8uZ2V0Rmlyc3RDaGlsZCgpLFRlKGkpJiYoaS5hcHBlbmQodGhpcyksY24oaSkpKTpUZShzKSYmKHI9em4oKSxsPW1uKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksbz9vLmluc2VydEFmdGVyKHIpOmk/aS5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksY24obCkpO1RlKHMpJiZjbihzKX1uKyt9ZWxzZSB6Tyh0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKGUpe2lmKGZ0KGUpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZihUZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtjbihuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKGUpfWNhbkluc2VydEFmdGVyKGUpe3JldHVybiBmdChlKX1jYW5SZXBsYWNlV2l0aChlKXtyZXR1cm4gZnQoZSl9Y2FuTWVyZ2VXaXRoKGUpe3JldHVybiBGZS4kaXNQYXJhZ3JhcGhOb2RlKGUpfHxmdChlKX1leHRyYWN0V2l0aENoaWxkKGUsbil7aWYoIUZlLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO2U9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YoZSkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIG1uKCJidWxsZXQiKX19O2Z1bmN0aW9uIGN4KHQsZSxuKXtsZXQgcj1bXSxpPVtdO3ZhciBvPShlPWUubGlzdCk/ZS5saXN0aXRlbTp2b2lkIDA7aWYoZSYmZS5uZXN0ZWQpdmFyIGw9ZS5uZXN0ZWQubGlzdGl0ZW07aWYobyE9PXZvaWQgMCYmKG89by5zcGxpdCgiICIpLHIucHVzaCguLi5vKSksZSl7bz1uLmdldFBhcmVudCgpLG89VGUobykmJm8uZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7byYmIXN8fGkucHVzaChlLmxpc3RpdGVtVW5jaGVja2VkKSxvJiZzfHxpLnB1c2goZS5saXN0aXRlbUNoZWNrZWQpLG8mJnIucHVzaChzP2UubGlzdGl0ZW1DaGVja2VkOmUubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT5UZShzKSk/ci5wdXNoKC4uLmwpOmkucHVzaCguLi5sKSksMDxpLmxlbmd0aCYmc28ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KHQsLi4uaSksMDxyLmxlbmd0aCYmc28uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudCh0LC4uLnIpfWZ1bmN0aW9uIGR4KHQsZSxuKXtUZShlLmdldEZpcnN0Q2hpbGQoKSk/KHQucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksdC5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKToodC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLHQuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmZS5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8dC5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsZS5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBGTyh0KXtyZXR1cm4gdD1zby5pc0hUTUxFbGVtZW50KHQpJiZ0LmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6em4odCl9fWZ1bmN0aW9uIHpuKHQpe3JldHVybiBGZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IE1mKHZvaWQgMCx0KSl9ZnVuY3Rpb24gZnQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNZn1sZXQgYnY9Y2xhc3MgSEUgZXh0ZW5kcyBGZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBIRShlLl9fbGlzdFR5cGV8fHB4W2UuX190YWddLGUuX19zdGFydCxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPWU9cHhbZV18fGUsdGhpcy5fX3RhZz1lPT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKGUpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9ZSxuLl9fdGFnPWU9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsZngobixlLnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKGUsbixyKXtyZXR1cm4gZS5fX3RhZyE9PXRoaXMuX190YWc/ITA6KGZ4KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOmh4LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOmh4LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49bW4oZS5saXN0VHlwZSxlLnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUmJnNvLmlzSFRNTEVsZW1lbnQoZSkmJih0aGlzLl9fc3RhcnQhPT0xJiZlLnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZlLnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDplfX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi5lKXtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtpZihmdChuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgaT16bigpO1RlKG4pfHxGZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49RmUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLGkuYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChpKX19cmV0dXJuIGNuKHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZChlKXtyZXR1cm4gZnQoZSl9fTtmdW5jdGlvbiBmeCh0LGUsbil7bGV0IHI9W10saT1bXTt2YXIgbz1lLmxpc3Q7aWYobyE9PXZvaWQgMCl7bGV0IHM9b1tgJHtuLl9fdGFnfURlcHRoYF18fFtdO2U9RkUobiktMTtsZXQgYT1lJXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9b1tuLl9fdGFnXSxjO2lmKG89by5uZXN0ZWQsbyE9PXZvaWQgMCYmby5saXN0JiYoYz1vLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZpLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTxlP3IucHVzaCguLi5uKTppLnB1c2goLi4ubikpfTA8aS5sZW5ndGgmJnNvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudCh0LC4uLmkpLDA8ci5sZW5ndGgmJnNvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQodCwuLi5yKX1mdW5jdGlvbiBCTyh0KXtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtmdChuKT8oZS5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChpPT57VGUoaSkmJmUucHVzaChheChpKSl9KSk6ZS5wdXNoKGF4KG4pKX1yZXR1cm4gZX1mdW5jdGlvbiBoeCh0KXtsZXQgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiBlPT09Im9sIj9uPW1uKCJudW1iZXIiLHQuc3RhcnQpOmU9PT0idWwiJiYobj1zby5pc0hUTUxFbGVtZW50KHQpJiZ0LmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/bW4oImNoZWNrIik6bW4oImJ1bGxldCIpKSx7YWZ0ZXI6Qk8sbm9kZTpufX1sZXQgcHg9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiBtbih0LGU9MSl7cmV0dXJuIEZlLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgYnYodCxlKSl9ZnVuY3Rpb24gVGUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBidn1sZXQgVU89RmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxXTz1GZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxWTz1GZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIiksSE89RmUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO3duLiRjcmVhdGVMaXN0SXRlbU5vZGU9em47d24uJGNyZWF0ZUxpc3ROb2RlPW1uO3duLiRnZXRMaXN0RGVwdGg9RkU7d24uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgdD1GZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIUZlLiRpc1JhbmdlU2VsZWN0aW9uKHQpfHwhdC5pc0NvbGxhcHNlZCgpfHwodD10LmFuY2hvci5nZXROb2RlKCksIWZ0KHQpfHx0LmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIGU9YmcodCksbj10LmdldFBhcmVudCgpO1RlKG4pfHxkcyg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxpO2lmKEZlLiRpc1Jvb3RPclNoYWRvd1Jvb3QocikpaT1GZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSBpZihmdChyKSlpPXpuKCksci5pbnNlcnRBZnRlcihpKTtlbHNlIHJldHVybiExO2lmKGkuc2VsZWN0KCksZT10LmdldE5leHRTaWJsaW5ncygpLDA8ZS5sZW5ndGgpe2xldCBvPW1uKG4uZ2V0TGlzdFR5cGUoKSk7RmUuJGlzUGFyYWdyYXBoTm9kZShpKT9pLmluc2VydEFmdGVyKG8pOihuPXpuKCksbi5hcHBlbmQobyksaS5pbnNlcnRBZnRlcihuKSksZS5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLG8uYXBwZW5kKGwpfSl9cmV0dXJuIGpPKHQpLCEwfTt3bi4kaXNMaXN0SXRlbU5vZGU9ZnQ7d24uJGlzTGlzdE5vZGU9VGU7d24uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD1WTzt3bi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9V087d24uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9VU87d24uTGlzdEl0ZW1Ob2RlPU1mO3duLkxpc3ROb2RlPWJ2O3duLlJFTU9WRV9MSVNUX0NPTU1BTkQ9SE87d24uaW5zZXJ0TGlzdD1mdW5jdGlvbih0LGUpe3QudXBkYXRlKCgpPT57dmFyIG49RmUuJGdldFNlbGVjdGlvbigpO2lmKEZlLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxGZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgaT1uLmdldFBhcmVudCgpO2lmKFVFKG4scikpcj1tbihlKSxGZS4kaXNSb290T3JTaGFkb3dSb290KGkpPyhuLnJlcGxhY2UociksaT16bigpLEZlLiRpc0VsZW1lbnROb2RlKG4pJiYoaS5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLGkuc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChpKSk6ZnQobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLEdvKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoRmUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNFbXB0eSgpJiYhbi5oYXMoby5nZXRLZXkoKSkpdXgobyxlKTtlbHNlIGlmKEZlLiRpc0xlYWZOb2RlKG8pKWZvcihvPW8uZ2V0UGFyZW50KCk7byE9bnVsbDspe2xldCBzPW8uZ2V0S2V5KCk7aWYoVGUobykpe2lmKCFuLmhhcyhzKSl7dmFyIGw9bW4oZSk7R28obCxvLmdldENoaWxkcmVuKCkpLG8ucmVwbGFjZShsKSxjbihsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9by5nZXRQYXJlbnQoKSxGZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLHV4KG8sZSk7YnJlYWt9bz1sfX19fX0pfTt3bi5yZW1vdmVMaXN0PWZ1bmN0aW9uKHQpe3QudXBkYXRlKCgpPT57bGV0IGU9RmUuJGdldFNlbGVjdGlvbigpO2lmKEZlLiRpc1JhbmdlU2VsZWN0aW9uKGUpKXt2YXIgbj1uZXcgU2V0LHI9ZS5nZXROb2RlcygpLGk9ZS5hbmNob3IuZ2V0Tm9kZSgpO2lmKFVFKGkscikpbi5hZGQoYmcoaSkpO2Vsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtGZS4kaXNMZWFmTm9kZShvKSYmKG89c28uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKG8sTWYpLG8hPW51bGwmJm4uYWRkKGJnKG8pKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPUJFKGwpO2ZvcihsZXQgcyBvZiByKXI9RmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxHbyhyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PWUuYW5jaG9yLmtleSYmZS5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT1lLmZvY3VzLmtleSYmZS5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgS089d247dmFyIGppPUtPLEtFPXt9LExmPXt9LFpFPXA7ZnVuY3Rpb24gWk8odCl7bGV0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcztlLmFwcGVuZCgiY29kZSIsdCk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllLmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHt0fTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7ZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBHRT1aRS5jcmVhdGVDb250ZXh0KG51bGwpO0xmLkxleGljYWxDb21wb3NlckNvbnRleHQ9R0U7TGYuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbih0LGUpe2xldCBuPW51bGw7cmV0dXJuIHQhPW51bGwmJihuPXRbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiBlPz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07TGYudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCB0PVpFLnVzZUNvbnRleHQoR0UpO3JldHVybiB0PT1udWxsJiZaTyg4KSx0fTtjb25zdCBHTz1MZjt2YXIgVHI9R08sZ3g9VHIsZGE9X2UsamQ9cDtsZXQgWUU9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBZTz1ZRT9qZC51c2VMYXlvdXRFZmZlY3Q6amQudXNlRWZmZWN0O2xldCB2Yz17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gWE8odCxlKXtpZihlIT09bnVsbCl7aWYoZT09PXZvaWQgMCl0LnVwZGF0ZSgoKT0+e3ZhciBuPWRhLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPWRhLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1ZRT9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKGRhLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09dC5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LHZjKTtlbHNlIGlmKGUhPT1udWxsKXN3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOmxldCBuPXQucGFyc2VFZGl0b3JTdGF0ZShlKTt0LnNldEVkaXRvclN0YXRlKG4sdmMpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnNldEVkaXRvclN0YXRlKGUsdmMpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOnQudXBkYXRlKCgpPT57ZGEuJGdldFJvb3QoKS5pc0VtcHR5KCkmJmUodCl9LHZjKX19fUtFLkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzp0LGNoaWxkcmVuOmV9KXtsZXQgbj1qZC51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6aSxlZGl0b3JfX0RFUFJFQ0FURUQ6byxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT10LHU9Z3guY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPW98fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9ZGEuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTp0LmVkaXRhYmxlLG5hbWVzcGFjZTppLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO1hPKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIFlPKCgpPT57bGV0IHI9dC5lZGl0YWJsZSxbaV09bjtpLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxqZC5jcmVhdGVFbGVtZW50KGd4LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LGUpfTtjb25zdCBRTz1LRTt2YXIgSk89UU8sUmE9cDtmdW5jdGlvbiAkZyh0LGUpe3JldHVybiAkZz1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LCRnKHQsZSl9ZnVuY3Rpb24gcU8odCxlKXt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LCRnKHQsZSl9ZnVuY3Rpb24gZVAodCxlKXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9W10pLGU9PT12b2lkIDAmJihlPVtdKSx0Lmxlbmd0aCE9PWUubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sZVtyXSl9KX12YXIgbXg9e2Vycm9yOm51bGx9LHRQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIHIsaT1hcmd1bWVudHMubGVuZ3RoLG89QXJyYXkoaSksbD0wO2w8aTtsKyspb1tsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsW3RoaXNdLmNvbmNhdChvKSl8fHRoaXMsci5zdGF0ZT1teCxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9cU8oZSx0KSxlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPWUucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShteCl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixpKXt2YXIgbyxsOyhvPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxvLmNhbGwobCxyLGkpfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLGkpe3ZhciBvPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZpLmVycm9yIT09bnVsbCYmZVAoci5yZXNldEtleXMsbykpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxvKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3IsaT10aGlzLnByb3BzLG89aS5mYWxsYmFja1JlbmRlcixsPWkuRmFsbGJhY2tDb21wb25lbnQ7aWYoaT1pLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0sUmEuaXNWYWxpZEVsZW1lbnQoaSkpcmV0dXJuIGk7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIG8ocik7aWYobClyZXR1cm4gUmEuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sZX0oUmEuQ29tcG9uZW50KSxuUD1mdW5jdGlvbih7Y2hpbGRyZW46dCxvbkVycm9yOmV9KXtyZXR1cm4gUmEuY3JlYXRlRWxlbWVudCh0UCx7ZmFsbGJhY2s6UmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjplfSx0KX07Y29uc3QgclA9blA7dmFyIGlQPXJQO2NvbnN0IG9QPVR1KGlQKTt2YXIgJHY9e30sVHY9e30sbFA9RnQsWWU9X2U7ZnVuY3Rpb24gc1AodCxlLG4scixpKXtpZih0PT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIWkpcmV0dXJuIDA7dmFyIG89ZS5fc2VsZWN0aW9uLGw9dC5fc2VsZWN0aW9uO2lmKGkpcmV0dXJuIDE7aWYoIShZZS4kaXNSYW5nZVNlbGVjdGlvbihvKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmby5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtpPWUuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1pLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1pLmdldChhKSxyPT09dm9pZCAwfHxZZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj1lLl9ub2RlTWFwLGU9ci5nZXQoby5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksZSYmbCYmIXQuX25vZGVNYXAuaGFzKGUuX19rZXkpJiZZZS4kaXNUZXh0Tm9kZShlKSYmZS5fX3RleHQubGVuZ3RoPT09MSYmby5hbmNob3Iub2Zmc2V0PT09MT8yOjApOihlPXNbMF0sdD10Ll9ub2RlTWFwLmdldChlLl9fa2V5KSwhWWUuJGlzVGV4dE5vZGUodCl8fCFZZS4kaXNUZXh0Tm9kZShlKXx8dC5fX21vZGUhPT1lLl9fbW9kZXx8KHQ9dC5fX3RleHQsZT1lLl9fdGV4dCx0PT09ZSl8fChvPW8uYW5jaG9yLGw9bC5hbmNob3Isby5rZXkhPT1sLmtleXx8by50eXBlIT09InRleHQiKT8wOihvPW8ub2Zmc2V0LGw9bC5vZmZzZXQsdD1lLmxlbmd0aC10Lmxlbmd0aCx0PT09MSYmbD09PW8tMT8yOnQ9PT0tMSYmbD09PW8rMT8zOnQ9PT0tMSYmbD09PW8/NDowKSl9ZnVuY3Rpb24gYVAodCxlKXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4oaSxvLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPXNQKGksbyxzLGEsdC5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PXQsbT11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIW0mJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYoaT09PW51bGwpcmV0dXJuIDE7dmFyIGc9by5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gZyE9PW51bGw/MDoyO2lmKG09PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rZSYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7bT1BcnJheS5mcm9tKHMpWzBdLGg9aS5fbm9kZU1hcC5nZXQobSksbT1vLl9ub2RlTWFwLmdldChtKSxnPWkuX3NlbGVjdGlvbjtsZXQgdz1vLl9zZWxlY3Rpb24sdj0hMTtZZS4kaXNSYW5nZVNlbGVjdGlvbihnKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24odykmJih2PWcuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJmcuZm9jdXMudHlwZT09PSJlbGVtZW50IiYmdy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZZZS4kaXNUZXh0Tm9kZShoKSYmWWUuJGlzVGV4dE5vZGUobSk/aC5fX3R5cGU9PT1tLl9fdHlwZSYmaC5fX3RleHQ9PT1tLl9fdGV4dCYmaC5fX21vZGU9PT1tLl9fbW9kZSYmaC5fX2RldGFpbD09PW0uX19kZXRhaWwmJmguX19zdHlsZT09PW0uX19zdHlsZSYmaC5fX2Zvcm1hdD09PW0uX19mb3JtYXQmJmguX19wYXJlbnQ9PT1tLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fVR2LmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07VHYucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1hUCh0LG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD1lLmN1cnJlbnQsZj1lLnJlZG9TdGFjayxoPWUudW5kb1N0YWNrLG09ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09bSl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJihlLnJlZG9TdGFjaz1bXSx0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSx0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47ZS5jdXJyZW50PXtlZGl0b3I6dCxlZGl0b3JTdGF0ZTpsfX19O2xldCBpPWxQLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoWWUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9ZS5yZWRvU3RhY2sscz1lLnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPWUuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksdC5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmdC5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1VORE9fQ09NTUFORCwhMSksZS5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0sWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKFllLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPWUucmVkb1N0YWNrO3ZhciBzPWUudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9ZS5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZ0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSxlLmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoWWUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9PihlLnVuZG9TdGFjaz1bXSxlLnJlZG9TdGFjaz1bXSxlLmN1cnJlbnQ9bnVsbCwhMSksWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKFllLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KGUudW5kb1N0YWNrPVtdLGUucmVkb1N0YWNrPVtdLGUuY3VycmVudD1udWxsLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9SRURPX0NPTU1BTkQsITEpLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxvPXQucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e2koKSxvKCl9fTtjb25zdCB1UD1Udjt2YXIgY1A9dVAsZFA9VHIsVGc9Y1Asdng9cDtmdW5jdGlvbiBmUCh0LGUsbj0xZTMpe2xldCByPXZ4LnVzZU1lbW8oKCk9PmV8fFRnLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW2VdKTt2eC51c2VFZmZlY3QoKCk9PlRnLnJlZ2lzdGVySGlzdG9yeSh0LHIsbiksW24sdCxyXSl9JHYuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9VGcuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7JHYuSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6dH0pe2xldFtlXT1kUC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIGZQKGUsdCksbnVsbH07Y29uc3QgaFA9JHY7dmFyIHBQPWhQLFhFPXt9LGdQPVRyLE9hPXAsbVA9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP09hLnVzZUxheW91dEVmZmVjdDpPYS51c2VFZmZlY3Q7ZnVuY3Rpb24gdlAodCl7bGV0W2VdPWdQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPU9hLnVzZU1lbW8oKCk9PnQoZSksW2UsdF0pLHI9T2EudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW2ksb109T2EudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gbVAoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLG8oYSkpLHModT0+e3IuY3VycmVudD11LG8odSl9KX0sW24sdF0pLGl9ZnVuY3Rpb24geVAodCl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT50LmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6ZT0+dC5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoZSl9fXZhciB4UD1mdW5jdGlvbigpe3JldHVybiB2UCh5UCl9O2NvbnN0IF9QPXhQO3ZhciB3UD1fUCx5bz17fSxkbj1fZTtmdW5jdGlvbiBOdih0LGU9ITApe3JldHVybiB0PyExOih0PVFFKCksZSYmKHQ9dC50cmltKCkpLHQ9PT0iIil9ZnVuY3Rpb24gUUUoKXtyZXR1cm4gZG4uJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIEpFKHQpe2lmKCFOdih0LCExKSlyZXR1cm4hMTt0PWRuLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgZT10Lmxlbmd0aDtpZigxPGUpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlO3IrKyl7dmFyIG49dFtyXTtpZihkbi4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKGRuLiRpc0VsZW1lbnROb2RlKG4pKXtpZighZG4uJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IGk9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxpO28rKylpZighZG4uJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfXlvLiRjYW5TaG93UGxhY2Vob2xkZXI9SkU7eW8uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKHQpe3JldHVybigpPT5KRSh0KX07eW8uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEZpcnN0Q2hpbGQoKTt0PTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoZG4uJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoZG4uJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSx0K3I+ZSlyZXR1cm57bm9kZTpuLG9mZnNldDplLXR9O3QrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTt5by4kaXNSb290VGV4dENvbnRlbnRFbXB0eT1Odjt5by4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCk9Pk52KHQsZSl9O3lvLiRyb290VGV4dENvbnRlbnQ9UUU7eW8ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbih0LGUsbixyKXtsZXQgaT1sPT57Y29uc3Qgcz1kbi4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LG89dC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oZG4uVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKGRuLiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD1lKGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe2kocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD1lKGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLGRuLiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD1lKGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9pKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPWUoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIHQ9dC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9ZShzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/aShsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKGkocyksaShsKSkscz1sLmdldE5leHRTaWJsaW5nKCksZG4uJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihpKHMpLGwgaW5zdGFuY2VvZiBuJiZpKGwpKSl9KSxbbyx0XX07Y29uc3QgU1A9eW87dmFyIEVQPVNQLHFFPXt9LHljPV9lO3FFLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbih0KXtsZXQgZT13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09ZSl7dmFyIGk9dC5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1pJiYoaT1yLmRhdGEsdHlwZW9mIGk9PSJzdHJpbmciKSl7dHJ5e3ZhciBvPUpTT04ucGFyc2UoaSl9Y2F0Y2h7cmV0dXJufWlmKG8mJm8ucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZvLnR5cGU9PT0icmVxdWVzdCImJihvPW8ucGF5bG9hZCkmJm8uZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihvPW8uYXJncykpe2NvbnN0W2wscyxhLHUsY109bzt0LnVwZGF0ZSgoKT0+e2NvbnN0IGQ9eWMuJGdldFNlbGVjdGlvbigpO2lmKHljLiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxtPTAsZz0wO3ljLiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYobT1sLGc9bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksKG0hPT1nfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLHljLiRpc1RleHROb2RlKGgpJiYobT11LGc9dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxtPW0+Zj9mOm0sZz1nPmY/ZjpnLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IENQPXFFO3ZhciBrUD1DUCxKcj17fSxTaT17fSxSdj17fSx5eD1sbyxiUD1GdCx6bD1fZTtmdW5jdGlvbiBlQyh0LGUsbixyPW51bGwpe2xldCBpPXIhPW51bGw/ZS5pc1NlbGVjdGVkKHIpOiEwLG89emwuJGlzRWxlbWVudE5vZGUoZSkmJmUuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9ZTtyIT09bnVsbCYmKGw9eXguJGNsb25lV2l0aFByb3BlcnRpZXMoZSksbD16bC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD95eC4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPXpsLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKHQpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPWVDKHQsZixjLHIpOyFpJiZ6bC4kaXNFbGVtZW50Tm9kZShlKSYmaCYmZS5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYoaT0hMCl9cmV0dXJuIGkmJiFvPyhiUC5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYodD11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgodCkpOm4uYXBwZW5kKGMpLGl9bGV0IHRDPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiBuQyh0LGUsbj1uZXcgTWFwLHIpe2xldCBpPVtdO2lmKHRDLmhhcyh0Lm5vZGVOYW1lKSlyZXR1cm4gaTtsZXQgbz1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT10LGE9ZS5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKHQpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2wodCk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxvPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLG8hPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYobz11KG8sciksIW8pYnJlYWs7byYmaS5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbb10pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KHQubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKHQ9dC5jaGlsZE5vZGVzLHI9W10sdT0wO3U8dC5sZW5ndGg7dSsrKXIucHVzaCguLi5uQyh0W3VdLGUsbmV3IE1hcChuKSxvKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLG89PW51bGw/aT1pLmNvbmNhdChyKTp6bC4kaXNFbGVtZW50Tm9kZShvKSYmby5hcHBlbmQoLi4uciksaX1Sdi4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPXpsLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGk9MDtpPHIubGVuZ3RoO2krKyllQyh0LHJbaV0sbixlKTtyZXR1cm4gbi5pbm5lckhUTUx9O1J2LiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbih0LGUpe2U9ZS5ib2R5P2UuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcj1lW2ldO3RDLmhhcyhyLm5vZGVOYW1lKXx8KHI9bkMocix0KSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3QgJFA9UnY7dmFyIFRQPSRQLHJDPVRQLE5nPWxvLFhsPUZ0LG1lPV9lO2Z1bmN0aW9uIGxpKHQpe2xldCBlPW5ldyBVUkxTZWFyY2hQYXJhbXM7ZS5hcHBlbmQoImNvZGUiLHQpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7dH07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke2V9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgaUM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIG9DKHQpe2xldCBlPW1lLiRnZXRTZWxlY3Rpb24oKTtpZihlPT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIG1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpJiZlLmlzQ29sbGFwc2VkKCl8fGUuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOnJDLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXModCxlKX1mdW5jdGlvbiBsQyh0KXtsZXQgZT1tZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiBtZS4kaXNSYW5nZVNlbGVjdGlvbihlKSYmZS5pc0NvbGxhcHNlZCgpfHxlLmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KGFDKHQsZSkpfWZ1bmN0aW9uIFJnKHQsZSxuKXsobWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT5tZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZlLmxlbmd0aD09PTEmJm1lLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoZVswXSk/UlAoZSxuLCExLHQpOk5QKGUsbil9ZnVuY3Rpb24gTlAodCxlKXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2xldCBvPXRbaV0sbD1tZS4kaXNMaW5lQnJlYWtOb2RlKG8pO2lmKGx8fG1lLiRpc0RlY29yYXRvck5vZGUobykmJm8uaXNJbmxpbmUoKXx8bWUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNJbmxpbmUoKXx8bWUuJGlzVGV4dE5vZGUobyl8fG8uaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9by5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQobyl9ZWxzZSBuLnB1c2gobykscj1udWxsfW1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpP2UuaW5zZXJ0Tm9kZXMobik6bWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpJiYodD1lLmFuY2hvci5nZXROb2RlKCksbWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUodCl8fGxpKDQxKSx0LmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gUlAodCxlLG4scil7dC5sZW5ndGg9PT0xJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHRbMF0pfHxsaSg0Mik7dmFyIGk9dFswXTt0PWkuZ2V0Q2hpbGRyZW4oKSxuPWkuZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgbz1pLmdldENoaWxkcmVuU2l6ZSgpLGw9WGwuJGZpbmRNYXRjaGluZ1BhcmVudChlLmFuY2hvci5nZXROb2RlKCksaD0+bWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO2U9KGk9bCYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChpLGg9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLG1lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGkpJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGUpfHxsaSg0Myk7dmFyIHM9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4oZS5nZXRDaGlsZHJlblNpemUoKS0xLHMrby0xKTtvPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKGkuZ2V0Q2hpbGRyZW5TaXplKCktMSxvK24tMSksbj1NYXRoLm1pbihvLGwpLGk9TWF0aC5taW4ocyxhKSxvPU1hdGgubWF4KG8sbCkscz1NYXRoLm1heChzLGEpLGE9ZS5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1pO2g8PXM7aCsrKXt2YXIgZD1hW2hdO21lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fGxpKDI0KTt2YXIgZj10W2xdO21lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fGxpKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgbT0wO2ZvcihsZXQgZz1uO2c8PW87ZysrKXtsZXQgdz1kW2ddO21lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHcpfHxsaSgyNSk7bGV0IHY9ZlttXTttZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8bGkoMjUpLGg9PT1pJiZnPT09bj91PXcuZ2V0S2V5KCk6aD09PXMmJmc9PT1vJiYoYz13LmdldEtleSgpKTtsZXQgeT13LmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goeD0+e21lLiRpc1RleHROb2RlKHgpJiZtZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZCh4KSx3LmFwcGVuZCh4KX0pLHkuZm9yRWFjaCh4PT54LnJlbW92ZSgpKSxtKyt9bCsrfXUmJmMmJih0PW1lLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSx0LnNldChlLmdldEtleSgpLHUsYyksbWUuJHNldFNlbGVjdGlvbih0KSxyLmRpc3BhdGNoQ29tbWFuZChtZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gc0ModCxlLG4scj1bXSl7bGV0IGk9ZSE9bnVsbD9uLmlzU2VsZWN0ZWQoZSk6ITAsbz1tZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKGUhPT1udWxsKXt2YXIgcz1OZy4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9bWUuJGlzVGV4dE5vZGUocykmJmUhPW51bGw/TmcuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQoZSxzKTpzfWxldCBhPW1lLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmbGkoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2ZvcihtZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fGxpKDU5LGMubmFtZSkpLG1lLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOmk9ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1zQyh0LGUsdSxzLmNoaWxkcmVuKSwhaSYmbWUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LGUsImNsb25lIikmJihpPSEwKTtpZihpJiYhbylyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcih0PTA7dDxzLmNoaWxkcmVuLmxlbmd0aDt0Kyspci5wdXNoKHMuY2hpbGRyZW5bdF0pO3JldHVybiBpfWZ1bmN0aW9uIGFDKHQsZSl7bGV0IG49W10scj1tZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspc0ModCxlLHJbaV0sbik7cmV0dXJue25hbWVzcGFjZTp0Ll9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIHVDKHQpe2xldCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj1tZS4kcGFyc2VTZXJpYWxpemVkTm9kZSh0W25dKTttZS4kaXNUZXh0Tm9kZShyKSYmTmcuJGFkZE5vZGVTdHlsZShyKSxlLnB1c2gocil9cmV0dXJuIGV9bGV0IHZsPW51bGw7ZnVuY3Rpb24geHgodCxlKXt2YXIgbj1pQz8odC5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhbWUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IodCxyLG4pfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGU9ZS5jbGlwYm9hcmREYXRhLHI9bWUuJGdldFNlbGVjdGlvbigpLGU9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1vQyh0KSx0PWxDKHQpO2xldCBpPSIiO3JldHVybiByIT09bnVsbCYmKGk9ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmZS5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLHQhPT1udWxsJiZlLnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLHQpLGUuc2V0RGF0YSgidGV4dC9wbGFpbiIsaSksITB9U2kuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPWFDO1NpLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz11QztTaS4kZ2V0SHRtbENvbnRlbnQ9b0M7U2kuJGdldExleGljYWxDb250ZW50PWxDO1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24odCxlKXt0PXQuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHx0LmdldERhdGEoInRleHQvdXJpLWxpc3QiKSx0IT1udWxsJiZlLmluc2VydFJhd1RleHQodCl9O1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPXVDKGwubm9kZXMpO3JldHVybiBSZyhuLHMsZSl9fWNhdGNoe31pZihyPXQuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBpPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksbz1yQy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixpKTtyZXR1cm4gUmcobixvLGUpfWNhdGNoe31pZih0PXQuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHx0LmdldERhdGEoInRleHQvdXJpLWxpc3QiKSx0IT1udWxsKWlmKG1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpKWZvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxuPXQubGVuZ3RoLGk9MDtpPG47aSsrKW89dFtpXSxvPT09YApgfHxvPT09YFxyCmA/ZS5pbnNlcnRQYXJhZ3JhcGgoKTpvPT09IgkiP2UuaW5zZXJ0Tm9kZXMoW21lLiRjcmVhdGVUYWJOb2RlKCldKTplLmluc2VydFRleHQobyk7ZWxzZSBlLmluc2VydFJhd1RleHQodCl9O1NpLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1SZztTaS5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24odCxlKXtpZih2bCE9PW51bGwpcmV0dXJuITE7aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9Pnt0LnVwZGF0ZSgoKT0+e2woeHgodCxlKSl9KX0pO3ZhciBuPXQuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj10Ll93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OnQuX3dpbmRvdy5kb2N1bWVudCxpPWlDPyh0Ll93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8aT09PW51bGwpcmV0dXJuITE7bGV0IG89ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIG8uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixvLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKG8pLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQobywwKSxuLnNldEVuZChvLDEpLGkucmVtb3ZlQWxsUmFuZ2VzKCksaS5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9dC5yZWdpc3RlckNvbW1hbmQobWUuQ09QWV9DT01NQU5ELGE9PihYbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSx2bCE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHZsKSx2bD1udWxsKSxsKHh4KHQsYSkpKSwhMCksbWUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7dmw9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksdmw9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxvLnJlbW92ZSgpfSl9O2NvbnN0IE9QPVNpO3ZhciBQUD1PUCx6ZD1QUCx4Yz1sbyxqcj1GdCxNPV9lO2Z1bmN0aW9uIF94KHQsZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8odD1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KHQsZSksdD09PW51bGw/bnVsbDp7bm9kZTp0LnN0YXJ0Q29udGFpbmVyLG9mZnNldDp0LnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyh0PWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQodCxlKSx0PT09bnVsbD9udWxsOntub2RlOnQub2Zmc2V0Tm9kZSxvZmZzZXQ6dC5vZmZzZXR9KTpudWxsfWxldCBQcz10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsQVA9UHMmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsTVA9UHMmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIUFQPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLExQPVBzJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksSVA9UHMmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLERQPVBzJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxqUD1QcyYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFEUCxPZz1NLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIiksT3Y9Y2xhc3MgY0MgZXh0ZW5kcyBNLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBjQyhlLl9fa2V5KX1jb25zdHJ1Y3RvcihlKXtzdXBlcihlKX1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBqci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sZS50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjp6UCxwcmlvcml0eTowfSl9fWV4cG9ydERPTShlKXtpZih7ZWxlbWVudDplfT1zdXBlci5leHBvcnRET00oZSksZSYmanIuaXNIVE1MRWxlbWVudChlKSl7dGhpcy5pc0VtcHR5KCkmJmUuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO2Uuc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJihlLmRpcj1uKX1yZXR1cm57ZWxlbWVudDplfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1QdigpO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXRJbmRlbnQoZS5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKGUuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIoZSxuKXtlPU0uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiBlLnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKGUsbiksZX1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgZT1NLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PmUuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UoZSksITB9fTtmdW5jdGlvbiBQdigpe3JldHVybiBNLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgT3YpfWxldCBBdj1jbGFzcyBkQyBleHRlbmRzIE0uRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgZEMoZS5fX3RhZyxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG4pe3N1cGVyKG4pLHRoaXMuX190YWc9ZX1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00oZSl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIGU9ZS50aGVtZS5oZWFkaW5nLGUhPT12b2lkIDAmJmpyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocixlW25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSkscDplPT4oZT1lLmZpcnN0Q2hpbGQsZSE9PW51bGwmJnd4KGUpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46ZT0+d3goZSk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpGbCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTShlKXtpZih7ZWxlbWVudDplfT1zdXBlci5leHBvcnRET00oZSksZSYmanIuaXNIVE1MRWxlbWVudChlKSl7dGhpcy5pc0VtcHR5KCkmJmUuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO2Uuc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJihlLmRpcj1uKX1yZXR1cm57ZWxlbWVudDplfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1GbChlLnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KGUuZm9ybWF0KSxuLnNldEluZGVudChlLmluZGVudCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcihlLG49ITApe2U9ZT9lLmFuY2hvci5vZmZzZXQ6MCxlPTA8ZSYmZTx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP0ZsKHRoaXMuZ2V0VGFnKCkpOk0uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiBlLnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKGUsbiksZX1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgZT10aGlzLmlzRW1wdHkoKT9NLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6RmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PmUuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UoZSksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gd3godCl7cmV0dXJuIHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj90LnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIHlsKHQpe2xldCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKGU9PT0iaDEifHxlPT09ImgyInx8ZT09PSJoMyJ8fGU9PT0iaDQifHxlPT09Img1Inx8ZT09PSJoNiIpJiYobj1GbChlKSx0LnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiB6UCh0KXtsZXQgZT1QdigpO3JldHVybiB0LnN0eWxlIT09bnVsbCYmZS5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOmV9fWZ1bmN0aW9uIEZsKHQpe3JldHVybiBNLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQXYodCkpfWZ1bmN0aW9uIEZQKHQsZSl7dC5wcmV2ZW50RGVmYXVsdCgpLGUudXBkYXRlKCgpPT57bGV0IG49TS4kZ2V0U2VsZWN0aW9uKCkscj10IGluc3RhbmNlb2YgSW5wdXRFdmVudHx8dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDp0LmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKE0uJGlzUmFuZ2VTZWxlY3Rpb24obil8fE0uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmemQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gQlAodCxlKXthd2FpdCB6ZC5jb3B5VG9DbGlwYm9hcmQoZSxqci5vYmplY3RLbGFzc0VxdWFscyh0LENsaXBib2FyZEV2ZW50KT90Om51bGwpLGUudXBkYXRlKCgpPT57bGV0IG49TS4kZ2V0U2VsZWN0aW9uKCk7TS4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpNLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gZmEodCl7bGV0IGU9bnVsbDtpZih0IGluc3RhbmNlb2YgRHJhZ0V2ZW50P2U9dC5kYXRhVHJhbnNmZXI6dCBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYoZT10LmNsaXBib2FyZERhdGEpLGU9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49ZS50eXBlcztyZXR1cm4gdD1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbdCxBcnJheS5mcm9tKGUuZmlsZXMpLG5dfWZ1bmN0aW9uIFN4KHQpe3ZhciBlPU0uJGdldFNlbGVjdGlvbigpO2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKGUpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7ZT1lLmdldE5vZGVzKCk7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciByPWVbb10saT1yLmdldEtleSgpO24uaGFzKGkpfHwocj1qci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxpPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKGkpJiYobi5hZGQoaSksdChyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gdD1NLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKHQpLE0uJGlzRGVjb3JhdG9yTm9kZSh0KX1Kci4kY3JlYXRlSGVhZGluZ05vZGU9Rmw7SnIuJGNyZWF0ZVF1b3RlTm9kZT1QdjtKci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEF2fTtKci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBPdn07SnIuRFJBR19EUk9QX1BBU1RFPU9nO0pyLkhlYWRpbmdOb2RlPUF2O0pyLlF1b3RlTm9kZT1PdjtKci5ldmVudEZpbGVzPWZhO0pyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGpyLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoTS5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgZT1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNOb2RlU2VsZWN0aW9uKGUpPyhlLmNsZWFyKCksITApOiExfSwwKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIoZSksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRFTEVURV9XT1JEX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZChlKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uREVMRVRFX0xJTkVfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKGUpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIGU9PSJzdHJpbmciKU0uJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KGUpOk0uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIU0uJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFNLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPWUuZGF0YVRyYW5zZmVyO3IhPW51bGw/emQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KTpNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYoZT1lLmRhdGEpJiZuLmluc2VydFRleHQoZSl9cmV0dXJuITB9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IGU9TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24oZSk/KGUucmVtb3ZlVGV4dCgpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5GT1JNQVRfVEVYVF9DT01NQU5ELGU9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQoZSksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsZT0+e3ZhciBuPU0uJGdldFNlbGVjdGlvbigpO2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhTS4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1qci4kZmluZE1hdGNoaW5nUGFyZW50KHIsaT0+TS4kaXNFbGVtZW50Tm9kZShpKSYmIWkuaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KGUpO3JldHVybiEwfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKGUpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCBlPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKGUpPyhlLmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihNLiRpbnNlcnROb2RlcyhbTS4kY3JlYXRlVGFiTm9kZSgpXSksITApLE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+U3goZT0+e2NvbnN0IG49ZS5nZXRJbmRlbnQoKTtlLnNldEluZGVudChuKzEpfSksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+U3goZT0+e2NvbnN0IG49ZS5nZXRJbmRlbnQoKTswPG4mJmUuc2V0SW5kZW50KG4tMSl9KSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19VUF9DT01NQU5ELGU9Pnt2YXIgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZihNLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyhlLnRhcmdldCkpe2lmKGU9bi5nZXROb2RlcygpLDA8ZS5sZW5ndGgpcmV0dXJuIGVbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKE0uJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPU0uJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhZS5zaGlmdEtleSYmTS4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsZT0+e3ZhciBuPU0uJGdldFNlbGVjdGlvbigpO2lmKE0uJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYoZT1uLmdldE5vZGVzKCksMDxlLmxlbmd0aClyZXR1cm4gZVswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihNLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PU0uJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49TS4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCFlLnNoaWZ0S2V5JiZNLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksZS5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoTS4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmeGMuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj1lLnNoaWZ0S2V5LGUucHJldmVudERlZmF1bHQoKSx4Yy4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQVJST1dfUklHSFRfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZihNLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyhlLnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9ZS5zaGlmdEtleSx4Yy4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyhlLnByZXZlbnREZWZhdWx0KCkseGMuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9CQUNLU1BBQ0VfQ09NTUFORCxlPT57aWYoX2MoZS50YXJnZXQpKXJldHVybiExO2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU0uJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7ZS5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6ZX09bjtjb25zdCByPWUuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJmUub2Zmc2V0PT09MCYmIU0uJGlzUm9vdE5vZGUocikmJjA8anIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/dC5kaXNwYXRjaENvbW1hbmQoTS5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOnQuZGlzcGF0Y2hDb21tYW5kKE0uREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfREVMRVRFX0NPTU1BTkQsZT0+e2lmKF9jKGUudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhlLnByZXZlbnREZWZhdWx0KCksdC5kaXNwYXRjaENvbW1hbmQoTS5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfRU5URVJfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZighTS4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZihlIT09bnVsbCl7aWYoKElQfHxMUHx8alApJiZNUClyZXR1cm4hMTtpZihlLnByZXZlbnREZWZhdWx0KCksZS5zaGlmdEtleSlyZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoTS5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoTS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCBlPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKGUpPyh0LmJsdXIoKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uRFJPUF9DT01NQU5ELGU9Pntjb25zdFssbl09ZmEoZSk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9X3goZS5jbGllbnRYLGUuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDpvLG5vZGU6bH09cjt2YXIgaT1NLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKGkhPT1udWxsKXtpZihyPU0uJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksTS4kaXNUZXh0Tm9kZShpKSlyLmFuY2hvci5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iiksci5mb2N1cy5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPWkuZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO2k9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsaSwiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsaSwiZWxlbWVudCIpfXI9TS4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksTS4kc2V0U2VsZWN0aW9uKHIpfXQuZGlzcGF0Y2hDb21tYW5kKE9nLG4pfXJldHVybiBlLnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIGU9TS4kZ2V0U2VsZWN0aW9uKCksISFNLiRpc1JhbmdlU2VsZWN0aW9uKGUpfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRSQUdTVEFSVF9DT01NQU5ELGU9PntbZV09ZmEoZSk7Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKGUmJiFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5EUkFHT1ZFUl9DT01NQU5ELGU9Pnt2YXJbbl09ZmEoZSk7Y29uc3Qgcj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIU0uJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49X3goZS5jbGllbnRYLGUuY2xpZW50WSksbiE9PW51bGwmJihuPU0uJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxNLiRpc0RlY29yYXRvck5vZGUobikmJmUucHJldmVudERlZmF1bHQoKSksITApfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KE0uJHNlbGVjdEFsbCgpLCEwKSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkNPUFlfQ09NTUFORCxlPT4oemQuY29weVRvQ2xpcGJvYXJkKHQsanIub2JqZWN0S2xhc3NFcXVhbHMoZSxDbGlwYm9hcmRFdmVudCk/ZTpudWxsKSwhMCksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5DVVRfQ09NTUFORCxlPT4oQlAoZSx0KSwhMCksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5QQVNURV9DT01NQU5ELGU9Pntjb25zdFssbixyXT1mYShlKTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoT2csbiksITA7aWYoTS5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dChlLnRhcmdldCkpcmV0dXJuITE7Y29uc3QgaT1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihpKXx8TS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oaSk/KEZQKGUsdCksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IFVQPUpyO3ZhciBQYT1VUCxmQz1UcixXUD13UCxKbj1wLFZQPUVQLGhDPUZ0LEV4PUdyLEhQPWtQLEtQPVBhLE12PXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Kbi51c2VMYXlvdXRFZmZlY3Q6Sm4udXNlRWZmZWN0O2Z1bmN0aW9uIEN4KHQpe3JldHVybiB0LmdldEVkaXRvclN0YXRlKCkucmVhZChWUC4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkodC5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gWlAodCl7bGV0W2Usbl09Sm4udXNlU3RhdGUoKCk9PkN4KHQpKTtyZXR1cm4gTXYoKCk9PntmdW5jdGlvbiByKCl7bGV0IGk9Q3godCk7bihpKX1yZXR1cm4gcigpLGhDLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksdC5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFt0XSksZX1mdW5jdGlvbiBHUCh0LGUpe2xldFtuLHJdPUpuLnVzZVN0YXRlKCgpPT50LmdldERlY29yYXRvcnMoKSk7cmV0dXJuIE12KCgpPT50LnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoaT0+e0V4LmZsdXNoU3luYygoKT0+e3IoaSl9KX0pLFt0XSksSm4udXNlRWZmZWN0KCgpPT57cih0LmdldERlY29yYXRvcnMoKSl9LFt0XSksSm4udXNlTWVtbygoKT0+e2xldCBpPVtdLG89T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxvLmxlbmd0aDtsKyspe2xldCBzPW9bbF0sYT1Kbi5jcmVhdGVFbGVtZW50KGUse29uRXJyb3I6Yz0+dC5fb25FcnJvcihjKX0sSm4uY3JlYXRlRWxlbWVudChKbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9dC5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJmkucHVzaChFeC5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gaX0sW2Usbix0XSl9ZnVuY3Rpb24gWVAodCl7TXYoKCk9PmhDLm1lcmdlUmVnaXN0ZXIoS1AucmVnaXN0ZXJSaWNoVGV4dCh0KSxIUC5yZWdpc3RlckRyYWdvblN1cHBvcnQodCkpLFt0XSl9ZnVuY3Rpb24gWFAoe2NvbnRlbnQ6dH0pe3ZhcltlXT1mQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7ZT1aUChlKTtsZXQgbj1XUCgpO3JldHVybiBlP3R5cGVvZiB0PT0iZnVuY3Rpb24iP3Qobik6dDpudWxsfVhFLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6dCxwbGFjZWhvbGRlcjplLEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT1mQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49R1AocixuKSxZUChyKSxKbi5jcmVhdGVFbGVtZW50KEpuLkZyYWdtZW50LG51bGwsdCxKbi5jcmVhdGVFbGVtZW50KFhQLHtjb250ZW50OmV9KSxuKX07Y29uc3QgUVA9WEU7dmFyIEpQPVFQLHBDPXt9LG5pPWppLHFQPVRyLGdDPXAsZUE9RnQscXM9X2U7ZnVuY3Rpb24gdEEodCl7Z0MudXNlRWZmZWN0KCgpPT5lQS5tZXJnZVJlZ2lzdGVyKHQucmVnaXN0ZXJDb21tYW5kKG5pLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QodCwibnVtYmVyIiksITApLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0LnJlZ2lzdGVyQ29tbWFuZChuaS5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QodCwiYnVsbGV0IiksITApLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0LnJlZ2lzdGVyQ29tbWFuZChuaS5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4obmkucmVtb3ZlTGlzdCh0KSwhMCkscXMuQ09NTUFORF9QUklPUklUWV9MT1cpLHQucmVnaXN0ZXJDb21tYW5kKHFzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFuaS4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW3RdKX1wQy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W3RdPXFQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gZ0MudXNlRWZmZWN0KCgpPT57aWYoIXQuaGFzTm9kZXMoW25pLkxpc3ROb2RlLG5pLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbdF0pLHRBKHQpLG51bGx9O2NvbnN0IG5BPXBDO3ZhciByQT1uQSxtQz17fSxFaT17fSx2Qz1GdCxVcj1fZTtsZXQgaUE9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEFzIGV4dGVuZHMgVXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgQXMoZS5fX3VybCx7cmVsOmUuX19yZWwsdGFyZ2V0OmUuX190YXJnZXQsdGl0bGU6ZS5fX3RpdGxlfSxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDppPW51bGwscmVsOm89bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD1lLHRoaXMuX190YXJnZXQ9aSx0aGlzLl9fcmVsPW8sdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKGUpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksdkMuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLGUudGhlbWUubGluayksbn11cGRhdGVET00oZSxuKXtsZXQgcj10aGlzLl9fdXJsLGk9dGhpcy5fX3RhcmdldCxvPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT1lLl9fdXJsJiYobi5ocmVmPXIpLGkhPT1lLl9fdGFyZ2V0JiYoaT9uLnRhcmdldD1pOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksbyE9PWUuX19yZWwmJihvP24ucmVsPW86bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09ZS5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOm9BLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49Y3UoZS51cmwse3JlbDplLnJlbCx0YXJnZXQ6ZS50YXJnZXQsdGl0bGU6ZS50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXRJbmRlbnQoZS5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKGUuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKGUpe3RyeXtsZXQgbj1uZXcgVVJMKGUpO2lmKCFpQS5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIGV9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKGUpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD1lfWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldChlKXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9ZX1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPWV9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKGUpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPWV9aW5zZXJ0TmV3QWZ0ZXIoZSxuPSEwKXtyZXR1cm4gZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcihlLG4pLFVyLiRpc0VsZW1lbnROb2RlKGUpPyhuPWN1KHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLGUuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQoZSxuKXtpZighVXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7ZT1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZihlKSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIG9BKHQpe2xldCBlPW51bGw7aWYodkMuaXNIVE1MQW5jaG9yRWxlbWVudCh0KSl7bGV0IG49dC50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYoZT1jdSh0LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOnQuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6dC5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOmV9fWZ1bmN0aW9uIGN1KHQsZSl7cmV0dXJuIFVyLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQXModCxlKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBc31jbGFzcyBGdSBleHRlbmRzIEFze3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBGdShlLl9fdXJsLHtyZWw6ZS5fX3JlbCx0YXJnZXQ6ZS5fX3RhcmdldCx0aXRsZTplLl9fdGl0bGV9LGUuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKGUpe2xldCBuPVBnKGUudXJsLHtyZWw6ZS5yZWwsdGFyZ2V0OmUudGFyZ2V0LHRpdGxlOmUudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoZSxuPSEwKXtyZXR1cm4gZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcihlLG4pLFVyLiRpc0VsZW1lbnROb2RlKGUpPyhuPVBnKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksZS5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gUGcodCxlKXtyZXR1cm4gVXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBGdSh0LGUpKX1sZXQgbEE9VXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIHNBKHQsZSl7Zm9yKDt0IT09bnVsbCYmKHQ9dC5nZXRQYXJlbnQoKSkhPT1udWxsJiYhZSh0KTspO3JldHVybiB0fUVpLiRjcmVhdGVBdXRvTGlua05vZGU9UGc7RWkuJGNyZWF0ZUxpbmtOb2RlPWN1O0VpLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEZ1fTtFaS4kaXNMaW5rTm9kZT1ibztFaS5BdXRvTGlua05vZGU9RnU7RWkuTGlua05vZGU9QXM7RWkuVE9HR0xFX0xJTktfQ09NTUFORD1sQTtFaS50b2dnbGVMaW5rPWZ1bmN0aW9uKHQsZT17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PWUsaT1lLnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6ZS5yZWw7aWYoZT1Vci4kZ2V0U2VsZWN0aW9uKCksVXIuJGlzUmFuZ2VTZWxlY3Rpb24oZSkpaWYoZT1lLmV4dHJhY3QoKSx0PT09bnVsbCllLmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxibyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZihlLmxlbmd0aD09PTEpe3ZhciBvPWVbMF07aWYobz1ibyhvKT9vOnNBKG8sYm8pLG8hPT1udWxsKXtvLnNldFVSTCh0KSxuIT09dm9pZCAwJiZvLnNldFRhcmdldChuKSxpIT09bnVsbCYmby5zZXRSZWwoaSksciE9PXZvaWQgMCYmby5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO2UuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighVXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoYm8odSkpcz11LHUuc2V0VVJMKHQpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLGkhPT1udWxsJiZzLnNldFJlbChpKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPWN1KHQse3JlbDppLHRhcmdldDpufSksYm8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksYm8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IGFBPUVpO3ZhciBmcz1hQSx4bD1mcyx1QT1UcixjQT1GdCxfbD1fZSxkQT1wO21DLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOnR9KXtsZXRbZV09dUEudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBkQS51c2VFZmZlY3QoKCk9PntpZighZS5oYXNOb2RlcyhbeGwuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIGNBLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoeGwuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIHhsLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiB0PT09dm9pZCAwfHx0KG4pPyh4bC50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0OmkscmVsOm8sdGl0bGU6bH09bjtyZXR1cm4geGwudG9nZ2xlTGluayhyLHtyZWw6byx0YXJnZXQ6aSx0aXRsZTpsfSksITB9LF9sLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0IT09dm9pZCAwP2UucmVnaXN0ZXJDb21tYW5kKF9sLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPV9sLiRnZXRTZWxlY3Rpb24oKTtpZighX2wuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IGk9bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gdChpKT9yLmdldE5vZGVzKCkuc29tZShvPT5fbC4kaXNFbGVtZW50Tm9kZShvKSk/ITE6KGUuZGlzcGF0Y2hDb21tYW5kKHhsLlRPR0dMRV9MSU5LX0NPTU1BTkQsaSksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sX2wuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFtlLHRdKSxudWxsfTtjb25zdCBmQT1tQzt2YXIgaEE9ZkE7ZnVuY3Rpb24gcEEoe2FyaWFBY3RpdmVEZXNjZW5kYW50OnQsYXJpYUF1dG9Db21wbGV0ZTplLGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDppLGFyaWFMYWJlbDpvLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazptPSEwLHN0eWxlOmcsdGFiSW5kZXg6dywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W3hdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbUyxiXT1wLnVzZVN0YXRlKCExKSxUPXAudXNlQ2FsbGJhY2soJD0+e3ZhciBMO3guc2V0Um9vdEVsZW1lbnQoJCk7Y29uc3QgTz0oTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpMLnNoYWRvd1Jvb3Q7aWYoTyYmImdldFNlbGVjdGlvbiJpbiBPKXt4Ll93aW5kb3c9TztyZXR1cm59fSxbeF0pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KGIoeC5pc0VkaXRhYmxlKCkpLHgucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKCQ9PntiKCQpfSkpLFt4XSksXy5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6Uz90OnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOlM/ZToibm9uZSIsImFyaWEtY29udHJvbHMiOlM/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOlMmJmg9PT0iY29tYm9ib3giPyEhaTp2b2lkIDAsImFyaWEtbGFiZWwiOm8sImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6Uz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6Uz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6UywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6VCxyb2xlOmgsc3BlbGxDaGVjazptLHN0eWxlOmcsdGFiSW5kZXg6d30pfWZ1bmN0aW9uIGdBKHtjbGFzc05hbWU6dH0pe3JldHVybiBfLmpzeChwQSx7Y2xhc3NOYW1lOnR9KX1jbGFzcyBCdSBleHRlbmRzIF9lLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IoZSxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPWUuc3JjLHRoaXMuX19hbHRUZXh0PWUuYWx0VGV4dCx0aGlzLl9fd2lkdGg9ZS53aWR0aCx0aGlzLl9faGVpZ2h0PWUuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBCdSh7c3JjOmUuX19zcmMsYWx0VGV4dDplLl9fYWx0VGV4dCx3aWR0aDplLl9fd2lkdGgsaGVpZ2h0OmUuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04oZSl7cmV0dXJuIHlDKGUpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiBfLmpzeChtQSx7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIG1BKHQpe3JldHVybiBfLmpzeCgiaW1nIix7c3JjOnQuc3JjfSl9ZnVuY3Rpb24geUModCl7cmV0dXJuIG5ldyBCdSh0KX1mdW5jdGlvbiB2QSgpe2NvbnN0W3RdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmZvY3VzKCl9LFt0XSksbnVsbH1jb25zdCB4Qz1fZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIHlBKCl7Y29uc3RbdF09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCF0Lmhhc05vZGVzKFtCdV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIEZ0Lm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoeEMsZT0+e2NvbnN0IG49eUMoZSk7cmV0dXJuIF9lLiRpbnNlcnROb2Rlcyhbbl0pLF9lLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZGdC4kd3JhcE5vZGVJbkVsZW1lbnQobixfZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LF9lLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFt0XSksbnVsbH1jb25zdCB4QT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTp0LGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSksXy5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSxfQT14QSx3QT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOnQsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOltfLmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSksXy5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSxfLmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksU0E9d0EsRUE9KHtjbGFzc05hbWU6dH0pPT5fLmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOnQsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOl8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxDQT1FQSxrQT0oe3ZhcmlhbnQ6dD0icHJpbWFyeSIsb25DbGljazplLGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOmk9ITF9KT0+Xy5qc3goImJ1dHRvbiIse2Rpc2FibGVkOmksY2xhc3NOYW1lOl9mKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6dD09PSJwcmltYXJ5IiwiYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6dD09PSJwcmltYXJ5IiwiYmctdHJhbnNwYXJlbnQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjp0IT09InByaW1hcnkifSksb25DbGljazplLGNoaWxkcmVuOl8uanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSwkbz1rQSxiQT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOnQsY2hpbGRyZW46W18uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLCRBPWJBLF9DPXJlLmNyZWF0ZUNvbnRleHQoe2dldCBhcGkoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXNzaW9uKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgdGhlbWUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRUaGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGVkaXRNb2RlKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0RWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBoaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRIaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRXaW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgd2luZG93U2l6ZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX19KTtmdW5jdGlvbiBMdigpe3JldHVybiByZS51c2VDb250ZXh0KF9DKX1jb25zdCBUQT0oe29wdGlvbnM6dCxvbkNoYW5nZTplLGxhYmVsOm4saWNvbjpyfSk9Pntjb25zdFtpLG9dPXAudXNlU3RhdGUoITEpLGw9cC51c2VSZWYobnVsbCksW3MsYV09cC51c2VTdGF0ZSgwKSx7d2luZG93U2l6ZTp1fT1MdigpLGM9KCk9PntvKCFpKX0sZD0oZixoKT0+e2EoaCksZShmKSxvKCExKX07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgZj1oPT57aSYmbC5jdXJyZW50JiYhbC5jdXJyZW50LmNvbnRhaW5zKGgudGFyZ2V0KSYmbyghMSl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZiksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsZil9fSxbXSksXy5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC1bMTJweF0iLHJlZjpsLGNoaWxkcmVuOl8uanN4KCRvLHtvbkNsaWNrOmY9PntmLnByZXZlbnREZWZhdWx0KCksYygpfSxpY29uOl8uanN4KCRBLHtjbGFzc05hbWU6YHJvdGF0ZS1bLTkwZGVnXSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0xNTAgZWFzZS1pbi1vdXQgJHtpPyIiOiJyb3RhdGUtWzkwZGVnXSJ9YH0pLGNoaWxkcmVuOl8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWxhdGl2ZSIsY2hpbGRyZW46W18uanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEiLGNoaWxkcmVuOltuLHImJnJdfSksaSYmXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXRvcC1bNHB4XSBvdmVyZmxvdy1zY3JvbGwgc2hhZG93LWxnIC1sZWZ0LTIgdGV4dC1wcmltYXJ5IGJnLWJvcmRlciB3LWZpdCB6LW92ZXJsYXkiLHN0eWxlOnttYXhIZWlnaHQ6dT09bnVsbD92b2lkIDA6dS5pbm5lckhlaWdodH0sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCAiLGNoaWxkcmVuOnQ9PW51bGw/dm9pZCAwOnQubWFwKChmLGgpPT5fLmpzeCgiYnV0dG9uIix7b25DbGljazptPT57bS5wcmV2ZW50RGVmYXVsdCgpLGQoZixoKX0sY2xhc3NOYW1lOmB0ZXh0LWxlZnQgcHgtMiBweS0xIGhvdmVyOmJnLWJhY2tncm91bmQgaG92ZXI6dGV4dC1oaWdobGlnaHQgICR7aD09PXMmJiJmb250LWJvbGQgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRydW5jYXRlIn1gLGNoaWxkcmVuOmZ9LGYpKX0pfSldfSl9KX0pfSxOQT1UQSxSQT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gd0ModCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dmFyIG87Y29uc3Qgcj0obz10LmN1cnJlbnRUYXJnZXQuZmlsZXMpPT1udWxsP3ZvaWQgMDpvWzBdLGk9bmV3IEZpbGVSZWFkZXI7aS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGw9aS5yZXN1bHQ7aWYodHlwZW9mIGw9PSJzdHJpbmciKXtjb25zdCBzPW5ldyBJbWFnZTtzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGFzeW5jKCk9Pntjb25zdCBhPWF3YWl0IGpuLmdldFNIQTI1Nkhhc2goUkEuZW5jb2RlKGwpKTtpZihzLm5hdHVyYWxXaWR0aCYmcy5uYXR1cmFsSGVpZ2h0KXtjb25zdCB1PW52KGwpO2Uoe3NyYzpsLHdpZHRoOnMubmF0dXJhbFdpZHRoLGhlaWdodDpzLm5hdHVyYWxIZWlnaHQsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphLG1pbWVUeXBlOnUsZmlsZUV4dDp1JiZydih1KX0pfWVsc2UgZSh7c3JjOmwsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphfSl9KSxzLnNyYz1sfWVsc2UgbihsP3ttZXNzYWdlOiJVbmV4cGVjdGVkIGltYWdlIHJlc3VsdCB0eXBlIixyZXN1bHQ6bH06e21lc3NhZ2U6IkVtcHR5IHJlc3VsdCJ9KX0pLHImJmkucmVhZEFzRGF0YVVSTChyKX0pfWZ1bmN0aW9uIFNDKHQpe2NvbnN0IGU9dC5hbmNob3Isbj10LmZvY3VzLHI9dC5hbmNob3IuZ2V0Tm9kZSgpLGk9dC5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHI9PT1pP3I6dC5pc0JhY2t3YXJkKCk/bG8uJGlzQXROb2RlRW5kKG4pP3I6aTpsby4kaXNBdE5vZGVFbmQoZSk/cjppfWZ1bmN0aW9uIE9BKCl7Y29uc3RbdF09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3Rlcih0LnJlZ2lzdGVyQ29tbWFuZChfZS5DTElDS19DT01NQU5ELGU9Pntjb25zdCBuPV9lLiRnZXRTZWxlY3Rpb24oKTtpZihfZS4kaXNSYW5nZVNlbGVjdGlvbihuKSl7Y29uc3Qgcj1TQyhuKSxpPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQocixmcy4kaXNMaW5rTm9kZSk7aWYoZnMuJGlzTGlua05vZGUoaSkmJihlLm1ldGFLZXl8fGUuY3RybEtleSkpcmV0dXJuIHdpbmRvdy5vcGVuKGkuZ2V0VVJMKCksIl9ibGFuayIpLCEwfXJldHVybiExfSxfZS5DT01NQU5EX1BSSU9SSVRZX0xPVykpLFtdKSxudWxsfXZhciBFQz17ZXhwb3J0czp7fX0sUEE9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIixBQT1QQSxNQT1BQTtmdW5jdGlvbiBDQygpe31mdW5jdGlvbiBrQygpe31rQy5yZXNldFdhcm5pbmdDYWNoZT1DQzt2YXIgTEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHIsaSxvLGwscyxhKXtpZihhIT09TUEpe3ZhciB1PW5ldyBFcnJvcigiQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcyIpO3Rocm93IHUubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsdX19dC5pc1JlcXVpcmVkPXQ7ZnVuY3Rpb24gZSgpe3JldHVybiB0fXZhciBuPXthcnJheTp0LGJpZ2ludDp0LGJvb2w6dCxmdW5jOnQsbnVtYmVyOnQsb2JqZWN0OnQsc3RyaW5nOnQsc3ltYm9sOnQsYW55OnQsYXJyYXlPZjplLGVsZW1lbnQ6dCxlbGVtZW50VHlwZTp0LGluc3RhbmNlT2Y6ZSxub2RlOnQsb2JqZWN0T2Y6ZSxvbmVPZjplLG9uZU9mVHlwZTplLHNoYXBlOmUsZXhhY3Q6ZSxjaGVja1Byb3BUeXBlczprQyxyZXNldFdhcm5pbmdDYWNoZTpDQ307cmV0dXJuIG4uUHJvcFR5cGVzPW4sbn07RUMuZXhwb3J0cz1MQSgpO3ZhciBJQT1FQy5leHBvcnRzO2NvbnN0IGVyPVR1KElBKTtmdW5jdGlvbiBBZygpe3JldHVybiBBZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxBZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gREEodCxlKXtpZih0PT1udWxsKXJldHVybnt9O3ZhciBuPWpBKHQsZSkscixpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylyPW9baV0sIShlLmluZGV4T2Yocik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxyKSYmKG5bcl09dFtyXSl9cmV0dXJuIG59ZnVuY3Rpb24gakEodCxlKXtpZih0PT1udWxsKXJldHVybnt9O3ZhciBuPXt9LHI9T2JqZWN0LmtleXModCksaSxvO2ZvcihvPTA7bzxyLmxlbmd0aDtvKyspaT1yW29dLCEoZS5pbmRleE9mKGkpPj0wKSYmKG5baV09dFtpXSk7cmV0dXJuIG59dmFyIEl2PXAuZm9yd2FyZFJlZihmdW5jdGlvbih0LGUpe3ZhciBuPXQuY29sb3Iscj1uPT09dm9pZCAwPyJjdXJyZW50Q29sb3IiOm4saT10LnNpemUsbz1pPT09dm9pZCAwPzI0OmksbD1EQSh0LFsiY29sb3IiLCJzaXplIl0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KCJzdmciLEFnKHtyZWY6ZSx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOm8saGVpZ2h0Om8sdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHJlLmNyZWF0ZUVsZW1lbnQoInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiJ9KSl9KTtJdi5wcm9wVHlwZXM9e2NvbG9yOmVyLnN0cmluZyxzaXplOmVyLm9uZU9mVHlwZShbZXIuc3RyaW5nLGVyLm51bWJlcl0pfTtJdi5kaXNwbGF5TmFtZT0iQ2hlY2siO2NvbnN0IHpBPUl2O2Z1bmN0aW9uIE1nKCl7cmV0dXJuIE1nPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LE1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBGQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49QkEodCxlKSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKGUuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHIpJiYobltyXT10W3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBCQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyh0KSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sIShlLmluZGV4T2YoaSk+PTApJiYobltpXT10W2ldKTtyZXR1cm4gbn12YXIgRHY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPXQuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPUZBKHQsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTWcoe3JlZjplLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMCAxM2E1IDUgMCAwIDAgNy41NC41NGwzLTNhNSA1IDAgMCAwLTcuMDctNy4wN2wtMS43MiAxLjcxIn0pLHJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEifSkpfSk7RHYucHJvcFR5cGVzPXtjb2xvcjplci5zdHJpbmcsc2l6ZTplci5vbmVPZlR5cGUoW2VyLnN0cmluZyxlci5udW1iZXJdKX07RHYuZGlzcGxheU5hbWU9IkxpbmsiO2NvbnN0IFVBPUR2O2Z1bmN0aW9uIExnKCl7cmV0dXJuIExnPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LExnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBXQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49VkEodCxlKSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKGUuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHIpJiYobltyXT10W3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBWQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyh0KSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sIShlLmluZGV4T2YoaSk+PTApJiYobltpXT10W2ldKTtyZXR1cm4gbn12YXIganY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPXQuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPVdBKHQsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTGcoe3JlZjplLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIxOCIseTE6IjYiLHgyOiI2Iix5MjoiMTgifSkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiI2Iix5MToiNiIseDI6IjE4Iix5MjoiMTgifSkpfSk7anYucHJvcFR5cGVzPXtjb2xvcjplci5zdHJpbmcsc2l6ZTplci5vbmVPZlR5cGUoW2VyLnN0cmluZyxlci5udW1iZXJdKX07anYuZGlzcGxheU5hbWU9IlgiO2NvbnN0IEhBPWp2LEtBPSh7Zm9udFNpemVzOnQsZm9udHNGYW1pbGllczplLG9uRWRpdG9yOm4sY29sb3JzOnJ9KT0+e2NvbnN0W2ldPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtwLnVzZUVmZmVjdCgoKT0+e24mJm4oaSl9LFtpXSk7Y29uc3RbbyxsXT1wLnVzZVN0YXRlKGkpLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZSghMSksW2QsZl09cC51c2VTdGF0ZSghMSksW2gsbV09cC51c2VTdGF0ZSghMSksW2csd109cC51c2VTdGF0ZSghMSk7cC51c2VTdGF0ZSgiMTVweCIpLHAudXNlU3RhdGUoIiMwMDAiKSxwLnVzZVN0YXRlKCJTYW5zIik7Y29uc3Rbdix5XT1wLnVzZVN0YXRlKCJwYXJhZ3JhcGgiKTtwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCJ1cmwiKSxwLnVzZVN0YXRlKG51bGwpO2NvbnN0W3gsU109cC51c2VTdGF0ZShudWxsKSxiPVA9PntpLmRpc3BhdGNoQ29tbWFuZChmcy5UT0dHTEVfTElOS19DT01NQU5ELFApfSxUPXtwYXJhZ3JhcGg6Ik5vcm1hbCIsaDE6IkhlYWRpbmcgMSIsaDI6IkhlYWRpbmcgMiIsaDM6IkhlYWRpbmcgMyIsaDQ6IkhlYWRpbmcgNCIsaDU6IkhlYWRpbmcgNSIsaDY6IkhlYWRpbmcgNiIsbnVtYmVyOiJOdW1iZXJlZCBMaXN0IixidWxsZXQ6IkJ1bGxldGVkIExpc3QifSwkPXt9O2Zvcihjb25zdCBQIGluIFQpJFtUW1BdXT1QO2NvbnN0IE89cC51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9X2UuJGdldFNlbGVjdGlvbigpO2lmKF9lLiRpc1JhbmdlU2VsZWN0aW9uKFApKXtjb25zdCBEPVAuYW5jaG9yLmdldE5vZGUoKTtsZXQgQj1ELmdldEtleSgpPT09InJvb3QiP0Q6RnQuJGZpbmRNYXRjaGluZ1BhcmVudChELGs9Pntjb25zdCBFPWsuZ2V0UGFyZW50KCk7cmV0dXJuIEUhPT1udWxsJiZfZS4kaXNSb290T3JTaGFkb3dSb290KEUpfSk7Qj09PW51bGwmJihCPUQuZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpKTtjb25zdCBvZT1TQyhQKSxIPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQob2UsZnMuJGlzTGlua05vZGUpO2lmKEghPT1udWxsKXtjb25zdCBrPUguZ2V0VVJMKCk7UyhrKX1lbHNlIFMobnVsbCk7Y29uc3QgWj1CLmdldEtleSgpLEM9by5nZXRFbGVtZW50QnlLZXkoWik7aWYoYyhQLmhhc0Zvcm1hdCgiYm9sZCIpKSxmKFAuaGFzRm9ybWF0KCJpdGFsaWMiKSksbShQLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpKSx3KFAuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSksQyE9PW51bGwpaWYoYShaKSxqaS4kaXNMaXN0Tm9kZShCKSl7Y29uc3Qgaz1GdC4kZ2V0TmVhcmVzdE5vZGVPZlR5cGUoRCxqaS5MaXN0Tm9kZSksRT1rP2suZ2V0TGlzdFR5cGUoKTpCLmdldExpc3RUeXBlKCk7eShFKX1lbHNle2NvbnN0IGs9UGEuJGlzSGVhZGluZ05vZGUoQik/Qi5nZXRUYWcoKTpCLmdldFR5cGUoKTtrIGluIFQmJnkoayl9fX0sW29dKTtwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3RlcihpLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIoKHtlZGl0b3JTdGF0ZTpQfSk9PntQLnJlYWQoKCk9PntPKCl9KX0pKSxbTyxvLGldKSxwLnVzZUVmZmVjdCgoKT0+aS5yZWdpc3RlckNvbW1hbmQoX2UuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELChQLEQpPT4oTygpLGwoRCksITEpLF9lLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpLFtpLE9dKTtjb25zdCBMPVA9PntbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdLmluY2x1ZGVzKFApP3YhPT1QJiZpLnVwZGF0ZSgoKT0+e2NvbnN0IEQ9X2UuJGdldFNlbGVjdGlvbigpO19lLiRpc1JhbmdlU2VsZWN0aW9uKEQpJiZsby4kc2V0QmxvY2tzVHlwZShELCgpPT5QYS4kY3JlYXRlSGVhZGluZ05vZGUoUCkpfSk6UD09PSJwYXJhZ3JhcGgiJiZ2IT09InBhcmFncmFwaCI/aS51cGRhdGUoKCk9Pntjb25zdCBEPV9lLiRnZXRTZWxlY3Rpb24oKTsoX2UuJGlzUmFuZ2VTZWxlY3Rpb24oRCl8fF9lLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihEKSkmJmxvLiRzZXRCbG9ja3NUeXBlKEQsKCk9Pl9lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkpfSk6UD09PSJudW1iZXIiJiZ2IT09Im51bWJlciI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5ELHZvaWQgMCk6UD09PSJidWxsZXQiJiZ2IT09ImJ1bGxldCI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTppLmRpc3BhdGNoQ29tbWFuZChqaS5SRU1PVkVfTElTVF9DT01NQU5ELHZvaWQgMCl9O3JldHVybiBwLnVzZUNhbGxiYWNrKCgpPT57aS51cGRhdGUoKCk9Pntjb25zdCBQPV9lLiRnZXRTZWxlY3Rpb24oKTtpZihfZS4kaXNSYW5nZVNlbGVjdGlvbihQKSl7Y29uc3QgRD1QLmFuY2hvcixCPVAuZm9jdXMsb2U9UC5nZXROb2RlcygpO2lmKEQua2V5PT09Qi5rZXkmJkQub2Zmc2V0PT09Qi5vZmZzZXQpcmV0dXJuO29lLmZvckVhY2goKEgsWik9PntfZS4kaXNUZXh0Tm9kZShIKT8oWj09PTAmJkQub2Zmc2V0IT09MCYmKEg9SC5zcGxpdFRleHQoRC5vZmZzZXQpWzFdfHxIKSxaPT09b2UubGVuZ3RoLTEmJihIPUguc3BsaXRUZXh0KEIub2Zmc2V0KVswXXx8SCksSC5fX3N0eWxlIT09IiImJkguc2V0U3R5bGUoIiIpLEguX19mb3JtYXQhPT0wJiYoSC5zZXRGb3JtYXQoMCksRnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3coSCkuc2V0Rm9ybWF0KCIiKSkpOlBhLiRpc0hlYWRpbmdOb2RlKEgpJiZILnJlcGxhY2UoX2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSwhMCl9KX19KX0sW29dKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RpY2t5IHRvcC0wIGJvcmRlci1iIGJnLWJhY2tncm91bmQgYm9yZGVyLWhpZ2hsaWdodCBmbGV4IGZsZXgtY29sIixjaGlsZHJlbjpbXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgZ2FwLTEiLGNoaWxkcmVuOltfLmpzeChOQSx7b3B0aW9uczpPYmplY3QudmFsdWVzKFQpLGxhYmVsOlRbdl0/P3YrIiAobm90IHN1cHBvcnRlZCkiLG9uQ2hhbmdlOlA9PntMKCRbUF0pfX0pLF8uanN4KCRvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlA9PntQLnByZXZlbnREZWZhdWx0KCksaS5kaXNwYXRjaENvbW1hbmQoX2UuRk9STUFUX1RFWFRfQ09NTUFORCwiYm9sZCIpfSxhY3RpdmU6dSxpY29uOl8uanN4KF9BLHtjbGFzc05hbWU6YCR7dSYmInN0cm9rZS1bM3B4XSJ9YH0pfSksXy5qc3goJG8se2FjdGl2ZTpoLG9uQ2xpY2s6UD0+e1AucHJldmVudERlZmF1bHQoKSxpLmRpc3BhdGNoQ29tbWFuZChfZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJzdHJpa2V0aHJvdWdoIil9LGljb246Xy5qc3goQ0Ese2NsYXNzTmFtZTpgJHtoJiYic3Ryb2tlLVsycHhdIn1gfSl9KSxfLmpzeCgkbyx7YWN0aXZlOmQsb25DbGljazpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLGkuZGlzcGF0Y2hDb21tYW5kKF9lLkZPUk1BVF9URVhUX0NPTU1BTkQsIml0YWxpYyIpfSxpY29uOl8uanN4KFNBLHtjbGFzc05hbWU6YCR7ZCYmInN0cm9rZS1bM3B4XSJ9YH0pfSksXy5qc3goJG8se2FjdGl2ZTp4IT09bnVsbCxvbkNsaWNrOlA9PntQLnByZXZlbnREZWZhdWx0KCksUygiIiksYigiIil9LGljb246Xy5qc3goVUEse3dpZHRoOjEyLGhlaWdodDoxMixjbGFzc05hbWU6YCR7eCE9PW51bGwmJiJzdHJva2UtWzNweF0ifWB9KX0pLF8uanN4cygibGFiZWwiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGN1cnNvci1wb2ludGVyIixjaGlsZHJlbjpbXy5qc3gobVMse30pLF8uanN4KCJpbnB1dCIse3R5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLHdDKFApLnRoZW4oRD0+e2kuZGlzcGF0Y2hDb21tYW5kKHhDLHsuLi5EfSl9KS5jYXRjaChEPT57Y29uc29sZS5lcnJvcigiRXJyb3IgcmVhZGluZyBpbWFnZSIsRCl9KX19KV19KV19KSx4IT09bnVsbCYmXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgcC0yIixjaGlsZHJlbjpbXy5qc3goImlucHV0Iix7dHlwZToidGV4dCIscGxhY2Vob2xkZXI6IkVudGVyIFVSTCIsY2xhc3NOYW1lOiJ3LTEvMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBweC0yIix2YWx1ZTp4LG9uQ2hhbmdlOlA9PntQLnByZXZlbnREZWZhdWx0KCksUyhQLnRhcmdldC52YWx1ZSl9fSksXy5qc3goJG8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6UD0+e1AucHJldmVudERlZmF1bHQoKSxiKHh8fG51bGwpfSxpY29uOl8uanN4KHpBLHtzaXplOjE0fSl9KSxfLmpzeCgkbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLGIobnVsbCl9LGljb246Xy5qc3goSEEse3NpemU6MTR9KX0pXX0pXX0pfSxaQT1LQTtmdW5jdGlvbiBHQSh0KXtjb25zb2xlLmVycm9yKHQpfWNvbnN0IFlBPTI4LFhBPSh7cmljaHRleHQ6dCxvbkVkaXRvcjplfSk9Pntjb25zdHt3aW5kb3dTaXplOm59PUx2KCksaT17bmFtZXNwYWNlOiJ2YWwiLGVkaXRvclN0YXRlOm89PntvLnNldEVkaXRvclN0YXRlKG8ucGFyc2VFZGl0b3JTdGF0ZSh7cm9vdDp6UigkUyh0KSl9KSl9LG5vZGVzOltQYS5IZWFkaW5nTm9kZSxCdSxqaS5MaXN0Tm9kZSxqaS5MaXN0SXRlbU5vZGUsZnMuTGlua05vZGVdLHRoZW1lOnt0ZXh0Ontib2xkOiJmb250LXNlbWlib2xkIix1bmRlcmxpbmU6InVuZGVybGluZSIsaXRhbGljOiJpdGFsaWMiLHN0cmlrZXRocm91Z2g6ImxpbmUtdGhyb3VnaCIsdW5kZXJsaW5lU3RyaWtldGhyb3VnaDoidW5kZXJsaW5lIGxpbmUtdGhyb3VnaCJ9LGxpc3Q6e2xpc3RpdGVtOiJtbC1bMjBweF0iLG9sOiJsaXN0LWRlY2ltYWwiLHVsOiJsaXN0LWRpc2MifSxoZWFkaW5nOntoMToidGV4dC00eGwgZm9udC1ib2xkIixoMjoidGV4dC0zeGwgZm9udC1ib2xkIixoMzoidGV4dC0yeGwgZm9udC1ib2xkIixoNDoidGV4dC14bCBmb250LWJvbGQiLGg1OiJ0ZXh0LWxnIGZvbnQtYm9sZCIsaDY6InRleHQtbWQgZm9udC1ib2xkIn0sbGluazoidGV4dC1oaWdobGlnaHQgdW5kZXJsaW5lIn0sb25FcnJvcjpHQX07cmV0dXJuIF8uanN4cyhKTy5MZXhpY2FsQ29tcG9zZXIse2luaXRpYWxDb25maWc6aSxjaGlsZHJlbjpbXy5qc3godkEse30pLF8uanN4KFpBLHtvbkVkaXRvcjplfSksXy5qc3goSlAuUmljaFRleHRQbHVnaW4se2NvbnRlbnRFZGl0YWJsZTpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmb250LXNhbnMgYm9yZGVyLWIgdGV4dC1wcmltYXJ5IGJvcmRlci1oaWdobGlnaHQiLHN0eWxlOnttaW5IZWlnaHQ6biE9bnVsbCYmbi5pbm5lckhlaWdodD8obj09bnVsbD92b2lkIDA6bi5pbm5lckhlaWdodCktWUE6dm9pZCAwfSxjaGlsZHJlbjpfLmpzeChnQSx7Y2xhc3NOYW1lOiJwLTQgb3V0bGluZS1ub25lIGJnLWZpbGwifSl9KSxwbGFjZWhvbGRlcjpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiIiLGNoaWxkcmVuOiJFbnRlciBzb21lIHRleHQuLi4ifSksRXJyb3JCb3VuZGFyeTpvUH0pLF8uanN4KGhBLkxpbmtQbHVnaW4se30pLF8uanN4KE9BLHt9KSxfLmpzeChyQS5MaXN0UGx1Z2luLHt9KSxfLmpzeCh5QSx7fSksXy5qc3gocFAuSGlzdG9yeVBsdWdpbix7fSldfSl9O3ZhciBRQT17eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoyNCxoZWlnaHQ6MjQsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6MixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn07Y29uc3QgSkE9dD0+dC5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksS249KHQsZSk9Pntjb25zdCBuPXAuZm9yd2FyZFJlZigoe2NvbG9yOnI9ImN1cnJlbnRDb2xvciIsc2l6ZTppPTI0LHN0cm9rZVdpZHRoOm89MixhYnNvbHV0ZVN0cm9rZVdpZHRoOmwsY2hpbGRyZW46cywuLi5hfSx1KT0+cC5jcmVhdGVFbGVtZW50KCJzdmciLHtyZWY6dSwuLi5RQSx3aWR0aDppLGhlaWdodDppLHN0cm9rZTpyLHN0cm9rZVdpZHRoOmw/TnVtYmVyKG8pKjI0L051bWJlcihpKTpvLGNsYXNzTmFtZTpgbHVjaWRlIGx1Y2lkZS0ke0pBKHQpfWAsLi4uYX0sWy4uLmUubWFwKChbYyxkXSk9PnAuY3JlYXRlRWxlbWVudChjLGQpKSwuLi4oQXJyYXkuaXNBcnJheShzKT9zOltzXSl8fFtdXSkpO3JldHVybiBuLmRpc3BsYXlOYW1lPWAke3R9YCxufSxxQT1LbigiQ2hlY2siLFtbInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiIsa2V5OiIxMGpqZmoifV1dKSxiQz1LbigiQ2hldnJvbkRvd24iLFtbInBhdGgiLHtkOiJtNiA5IDYgNiA2LTYiLGtleToicXJ1bnNsIn1dXSksZTU9S24oIkNoZXZyb25MZWZ0IixbWyJwYXRoIix7ZDoibTE1IDE4LTYtNiA2LTYiLGtleToiMXduZmczIn1dXSksa3g9S24oIkxvZ0luIixbWyJwYXRoIix7ZDoiTTE1IDNoNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTQiLGtleToidTUzczZyIn1dLFsicG9seWxpbmUiLHtwb2ludHM6IjEwIDE3IDE1IDEyIDEwIDciLGtleToiMWFpbDBoIn1dLFsibGluZSIse3gxOiIxNSIseDI6IjMiLHkxOiIxMiIseTI6IjEyIixrZXk6InY2Z3J4OCJ9XV0pLHQ1PUtuKCJNYXhpbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDNINWEyIDIgMCAwIDAtMiAydjMiLGtleToiMWRjbWl0In1dLFsicGF0aCIse2Q6Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIsa2V5OiIxZTRndDMifV0sWyJwYXRoIix7ZDoiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLGtleToid3NsNXNjIn1dLFsicGF0aCIse2Q6Ik0xNiAyMWgzYTIgMiAwIDAgMCAyLTJ2LTMiLGtleToiMTh0cmVrIn1dXSksbjU9S24oIk1pbmltaXplIixbWyJwYXRoIix7ZDoiTTggM3YzYTIgMiAwIDAgMS0yIDJIMyIsa2V5OiJob2hidHIifV0sWyJwYXRoIix7ZDoiTTIxIDhoLTNhMiAyIDAgMCAxLTItMlYzIixrZXk6IjVqdzFmMyJ9XSxbInBhdGgiLHtkOiJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIsa2V5OiIxOTh0dnIifV0sWyJwYXRoIix7ZDoiTTE2IDIxdi0zYTIgMiAwIDAgMSAyLTJoMyIsa2V5OiJwaDhteHAifV1dKSxyNT1LbigiTW9vbiIsW1sicGF0aCIse2Q6Ik0xMiAzYTYgNiAwIDAgMCA5IDkgOSA5IDAgMSAxLTktOVoiLGtleToiYTd0bjE4In1dXSksaTU9S24oIlBhdXNlIixbWyJyZWN0Iix7d2lkdGg6IjQiLGhlaWdodDoiMTYiLHg6IjYiLHk6IjQiLGtleToiaWZmaGU0In1dLFsicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiIxNCIseToiNCIsa2V5OiJzamluN2oifV1dKSxvNT1LbigiUGxheSIsW1sicG9seWdvbiIse3BvaW50czoiNSAzIDE5IDEyIDUgMjEgNSAzIixrZXk6IjE5MTYzNyJ9XV0pLGw1PUtuKCJQb3dlciIsW1sicGF0aCIse2Q6Ik0xMiAydjEwIixrZXk6Im1uZmJsIn1dLFsicGF0aCIse2Q6Ik0xOC40IDYuNmE5IDkgMCAxIDEtMTIuNzcuMDQiLGtleToib2JvZnU5In1dXSksczU9S24oIlNlbmQiLFtbInBhdGgiLHtkOiJtMjIgMi03IDIwLTQtOS05LTRaIixrZXk6IjFxM3ZnZyJ9XSxbInBhdGgiLHtkOiJNMjIgMiAxMSAxMyIsa2V5OiJuemJxZWYifV1dKSxhNT1LbigiU3VuIixbWyJjaXJjbGUiLHtjeDoiMTIiLGN5OiIxMiIscjoiNCIsa2V5OiI0ZXhpcDIifV0sWyJwYXRoIix7ZDoiTTEyIDJ2MiIsa2V5OiJ0dXMwM20ifV0sWyJwYXRoIix7ZDoiTTEyIDIwdjIiLGtleToiMWxoMWtnIn1dLFsicGF0aCIse2Q6Im00LjkzIDQuOTMgMS40MSAxLjQxIixrZXk6IjE0OXQ2aiJ9XSxbInBhdGgiLHtkOiJtMTcuNjYgMTcuNjYgMS40MSAxLjQxIixrZXk6InB0Ymd1diJ9XSxbInBhdGgiLHtkOiJNMiAxMmgyIixrZXk6IjF0OGY4biJ9XSxbInBhdGgiLHtkOiJNMjAgMTJoMiIsa2V5OiIxcThtancifV0sWyJwYXRoIix7ZDoibTYuMzQgMTcuNjYtMS40MSAxLjQxIixrZXk6IjFtOHp6NSJ9XSxbInBhdGgiLHtkOiJtMTkuMDcgNC45My0xLjQxIDEuNDEiLGtleToiMXNobGNzIn1dXSksdTU9S24oIlgiLFtbInBhdGgiLHtkOiJNMTggNiA2IDE4IixrZXk6IjFibDVmOCJ9XSxbInBhdGgiLHtkOiJtNiA2IDEyIDEyIixrZXk6ImQ4Yms2diJ9XV0pLHp2PSJwLTEgYm9yZGVyIHJvdW5kZWQtZnVsbCBzaGFkb3cgYm9yZGVyLWFjY2VudCIsYng9InZhbGJ1aWxkOnVybEJlZm9yZU5hdmlnYXRpb24iO2Z1bmN0aW9uIGM1KHthcGk6dCxwYXRjaGVzOmUsb25Db21taXQ6bn0pe2NvbnN0e3RoZW1lOnIsc2V0VGhlbWU6aSxlZGl0TW9kZTpvLHNldEVkaXRNb2RlOmwsc2Vzc2lvbjpzfT1MdigpO2lmKHMuc3RhdHVzPT09InN1Y2Nlc3MiJiZzLmRhdGEubW9kZT09PSJ1bmF1dGhvcml6ZWQiKXJldHVybiBfLmpzeHMoJHgse2hyZWY6dC5nZXRMb2dpblVybCh3aW5kb3cubG9jYXRpb24uaHJlZiksY2hpbGRyZW46W18uanN4KCJzcGFuIix7Y2hpbGRyZW46IkxvZ2luIn0pLF8uanN4KGt4LHtzaXplOjE4fSldfSk7aWYocy5zdGF0dXM9PT0ic3VjY2VzcyImJiFzLmRhdGEuZW5hYmxlZClyZXR1cm4gXy5qc3hzKCR4LHtocmVmOnQuZ2V0RW5hYmxlVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxjaGlsZHJlbjpbXy5qc3goInNwYW4iLHtjaGlsZHJlbjoiRW5hYmxlIn0pLF8uanN4KGt4LHtzaXplOjE4fSldfSk7Y29uc3RbYSx1XT1wLnVzZVN0YXRlKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bGV0IGM9MDtmb3IoY29uc3QgZCBpbiBlKWMrPWVbZF0ubGVuZ3RoO3UoYyl9LFtlXSksXy5qc3hzKGQ1LHtjaGlsZHJlbjpbXy5qc3god2Mse2FjdGl2ZTpvPT09ImhvdmVyIixvbkNsaWNrOigpPT57bChjPT5jPT09ImhvdmVyIj8ib2ZmIjoiaG92ZXIiKX0sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOm89PT0iaG92ZXIiP18uanN4KGk1LHtzaXplOjE4fSk6Xy5qc3gobzUse3NpemU6MTh9KX0pfSksXy5qc3god2Mse29uQ2xpY2s6KCk9PntpKHI9PT0iZGFyayI/ImxpZ2h0IjoiZGFyayIpfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOltyPT09ImRhcmsiJiZfLmpzeChhNSx7c2l6ZToxNX0pLHI9PT0ibGlnaHQiJiZfLmpzeChyNSx7c2l6ZToxNX0pXX0pfSksXy5qc3god2Mse2FjdGl2ZTpvPT09ImZ1bGwiLG9uQ2xpY2s6KCk9PntpZihvIT09ImZ1bGwiKWxvY2FsU3RvcmFnZS5zZXRJdGVtKGJ4LHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx3aW5kb3cubG9jYXRpb24uaHJlZj10LmdldEVkaXRVcmwoKTtlbHNlIGlmKG89PT0iZnVsbCIpe2NvbnN0IGM9bG9jYWxTdG9yYWdlLmdldEl0ZW0oYngpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPWN8fCIvIn19LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpvPT09ImZ1bGwiP18uanN4KG41LHtzaXplOjE1fSk6Xy5qc3godDUse3NpemU6MTV9KX0pfSksYSE9PXZvaWQgMCYmXy5qc3god2Mse29uQ2xpY2s6KCk9PnthPjA/dC5wb3N0Q29tbWl0KHtwYXRjaGVzOmV9KS50aGVuKGM9PntMby5pc0VycihjKT8oY29uc29sZS5lcnJvcihjLmVycm9yKSxhbGVydCgiQ291bGQgbm90IGNvbW1pdCBwYXRjaGVzOiAiK2MuZXJyb3IubWVzc2FnZSkpOihjb25zb2xlLmxvZygiQ29tbWl0dGVkIHBhdGNoZXM6ICIsYy52YWx1ZSksbigpKX0pOmFsZXJ0KCJObyBwYXRjaGVzIHRvIGNvbW1pdCIpfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUgaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSAtcmlnaHQtWzEwcHhdIC10b3AtWzEwcHhdIGJvcmRlciBib3JkZXItYm9yZGVyIHJvdW5kZWQtZnVsbCBweC0xIGZvbnQtc2FucyB0ZXh0LXhzIGJnLWNhcmQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmF9KSxfLmpzeChzNSx7c2l6ZToxOH0pXX0pfSksXy5qc3goImEiLHtjbGFzc05hbWU6enYsaHJlZjp0LmdldERpc2FibGVVcmwod2luZG93LmxvY2F0aW9uLmhyZWYpLGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpfLmpzeChsNSx7c2l6ZToxOH0pfSl9KV19KX1mdW5jdGlvbiAkeCh7aHJlZjp0LGNoaWxkcmVuOmV9KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBmb250LXNhbnMgYm9yZGVyLTIgcm91bmRlZC1mdWxsIGdhcC14LTMgdGV4dC1wcmltYXJ5IGJnLWJhY2tncm91bmQgYm9yZGVyLWZpbGwiLGNoaWxkcmVuOl8uanN4KCJhIix7Y2xhc3NOYW1lOnp2LGhyZWY6dCxjaGlsZHJlbjpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIGdhcC14LTIiLGNoaWxkcmVuOmV9KX0pfSl9ZnVuY3Rpb24gZDUoe2NoaWxkcmVuOnR9KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBweC0yIHB5LTIgZm9udC1zYW5zIGJvcmRlci0yIHJvdW5kZWQtZnVsbCBnYXAteC0zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIGJvcmRlci1maWxsIixjaGlsZHJlbjp0fSl9ZnVuY3Rpb24gd2Moe2FjdGl2ZTp0LG9uQ2xpY2s6ZSxjaGlsZHJlbjpufSl7cmV0dXJuIF8uanN4KCJidXR0b24iLHtjbGFzc05hbWU6X2YoenYseyJiZy1hY2NlbnQgZHJvcC1zaGFkb3ctWzBweF8wcHhfMTJweF9yZ2JhKDU2LDIwNSwxNTIsMC42MCldIjp0fSksb25DbGljazplLGNoaWxkcmVuOm59KX1mdW5jdGlvbiBmNSh0LGUpe2NvbnN0W24scl09cC51c2VTdGF0ZSh7fSksW2ksb109cC51c2VTdGF0ZSgwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LnN0YXR1cz09PSJzdWNjZXNzIiYmdC5kYXRhLm1vZGU9PT0icHJveHkiJiZlLmdldFBhdGNoZXMoe30pLnRoZW4obD0+e2lmKExvLmlzT2sobCkpe2NvbnN0IHM9e307Zm9yKGNvbnN0IGEgaW4gbC52YWx1ZSlzW2FdPWwudmFsdWVbYV0ubWFwKHU9PnUucGF0Y2hfaWQpO3Iocyl9ZWxzZSBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBwYXRjaGVzIixsLmVycm9yKX0pfSxbdCxpXSkse3BhdGNoZXM6bixzZXRQYXRjaFJlc2V0SWQ6b319ZnVuY3Rpb24gaDUodD0iZGFyayIpe2NvbnN0W2Usbl09cC51c2VTdGF0ZSh0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIik9PT0ibGlnaHQiP24oImxpZ2h0Iik6bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImRhcmsifHx3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzP24oImRhcmsiKTp3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIikubWF0Y2hlcyYmbigibGlnaHQiKTtjb25zdCByPWk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIil8fG4oaS5tYXRjaGVzPyJkYXJrIjoibGlnaHQiKX07cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKSwoKT0+e3dpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKX19LFtdKSxbZSxyPT57bG9jYWxTdG9yYWdlLnNldEl0ZW0oInZhbC10aGVtZSIsciksbihyKX1dfXZhciBEZTsoZnVuY3Rpb24odCl7dC5hc3NlcnRFcXVhbD1pPT5pO2Z1bmN0aW9uIGUoaSl7fXQuYXNzZXJ0SXM9ZTtmdW5jdGlvbiBuKGkpe3Rocm93IG5ldyBFcnJvcn10LmFzc2VydE5ldmVyPW4sdC5hcnJheVRvRW51bT1pPT57Y29uc3Qgbz17fTtmb3IoY29uc3QgbCBvZiBpKW9bbF09bDtyZXR1cm4gb30sdC5nZXRWYWxpZEVudW1WYWx1ZXM9aT0+e2NvbnN0IG89dC5vYmplY3RLZXlzKGkpLmZpbHRlcihzPT50eXBlb2YgaVtpW3NdXSE9Im51bWJlciIpLGw9e307Zm9yKGNvbnN0IHMgb2YgbylsW3NdPWlbc107cmV0dXJuIHQub2JqZWN0VmFsdWVzKGwpfSx0Lm9iamVjdFZhbHVlcz1pPT50Lm9iamVjdEtleXMoaSkubWFwKGZ1bmN0aW9uKG8pe3JldHVybiBpW29dfSksdC5vYmplY3RLZXlzPXR5cGVvZiBPYmplY3Qua2V5cz09ImZ1bmN0aW9uIj9pPT5PYmplY3Qua2V5cyhpKTppPT57Y29uc3Qgbz1bXTtmb3IoY29uc3QgbCBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLGwpJiZvLnB1c2gobCk7cmV0dXJuIG99LHQuZmluZD0oaSxvKT0+e2Zvcihjb25zdCBsIG9mIGkpaWYobyhsKSlyZXR1cm4gbH0sdC5pc0ludGVnZXI9dHlwZW9mIE51bWJlci5pc0ludGVnZXI9PSJmdW5jdGlvbiI/aT0+TnVtYmVyLmlzSW50ZWdlcihpKTppPT50eXBlb2YgaT09Im51bWJlciImJmlzRmluaXRlKGkpJiZNYXRoLmZsb29yKGkpPT09aTtmdW5jdGlvbiByKGksbz0iIHwgIil7cmV0dXJuIGkubWFwKGw9PnR5cGVvZiBsPT0ic3RyaW5nIj9gJyR7bH0nYDpsKS5qb2luKG8pfXQuam9pblZhbHVlcz1yLHQuanNvblN0cmluZ2lmeVJlcGxhY2VyPShpLG8pPT50eXBlb2Ygbz09ImJpZ2ludCI/by50b1N0cmluZygpOm99KShEZXx8KERlPXt9KSk7dmFyIElnOyhmdW5jdGlvbih0KXt0Lm1lcmdlU2hhcGVzPShlLG4pPT4oey4uLmUsLi4ubn0pfSkoSWd8fChJZz17fSkpO2NvbnN0IHE9RGUuYXJyYXlUb0VudW0oWyJzdHJpbmciLCJuYW4iLCJudW1iZXIiLCJpbnRlZ2VyIiwiZmxvYXQiLCJib29sZWFuIiwiZGF0ZSIsImJpZ2ludCIsInN5bWJvbCIsImZ1bmN0aW9uIiwidW5kZWZpbmVkIiwibnVsbCIsImFycmF5Iiwib2JqZWN0IiwidW5rbm93biIsInByb21pc2UiLCJ2b2lkIiwibmV2ZXIiLCJtYXAiLCJzZXQiXSksemk9dD0+e3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBxLnVuZGVmaW5lZDtjYXNlInN0cmluZyI6cmV0dXJuIHEuc3RyaW5nO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNOYU4odCk/cS5uYW46cS5udW1iZXI7Y2FzZSJib29sZWFuIjpyZXR1cm4gcS5ib29sZWFuO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBxLmZ1bmN0aW9uO2Nhc2UiYmlnaW50IjpyZXR1cm4gcS5iaWdpbnQ7Y2FzZSJzeW1ib2wiOnJldHVybiBxLnN5bWJvbDtjYXNlIm9iamVjdCI6cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cS5hcnJheTp0PT09bnVsbD9xLm51bGw6dC50aGVuJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiZ0LmNhdGNoJiZ0eXBlb2YgdC5jYXRjaD09ImZ1bmN0aW9uIj9xLnByb21pc2U6dHlwZW9mIE1hcDwidSImJnQgaW5zdGFuY2VvZiBNYXA/cS5tYXA6dHlwZW9mIFNldDwidSImJnQgaW5zdGFuY2VvZiBTZXQ/cS5zZXQ6dHlwZW9mIERhdGU8InUiJiZ0IGluc3RhbmNlb2YgRGF0ZT9xLmRhdGU6cS5vYmplY3Q7ZGVmYXVsdDpyZXR1cm4gcS51bmtub3dufX0sVj1EZS5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxwNT10PT5KU09OLnN0cmluZ2lmeSh0LG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyB3ciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5pc3N1ZXM9W10sdGhpcy5hZGRJc3N1ZT1yPT57dGhpcy5pc3N1ZXM9Wy4uLnRoaXMuaXNzdWVzLHJdfSx0aGlzLmFkZElzc3Vlcz0ocj1bXSk9Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsLi4ucl19O2NvbnN0IG49bmV3LnRhcmdldC5wcm90b3R5cGU7T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG4pOnRoaXMuX19wcm90b19fPW4sdGhpcy5uYW1lPSJab2RFcnJvciIsdGhpcy5pc3N1ZXM9ZX1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuaXNzdWVzfWZvcm1hdChlKXtjb25zdCBuPWV8fGZ1bmN0aW9uKG8pe3JldHVybiBvLm1lc3NhZ2V9LHI9e19lcnJvcnM6W119LGk9bz0+e2Zvcihjb25zdCBsIG9mIG8uaXNzdWVzKWlmKGwuY29kZT09PSJpbnZhbGlkX3VuaW9uIilsLnVuaW9uRXJyb3JzLm1hcChpKTtlbHNlIGlmKGwuY29kZT09PSJpbnZhbGlkX3JldHVybl90eXBlIilpKGwucmV0dXJuVHlwZUVycm9yKTtlbHNlIGlmKGwuY29kZT09PSJpbnZhbGlkX2FyZ3VtZW50cyIpaShsLmFyZ3VtZW50c0Vycm9yKTtlbHNlIGlmKGwucGF0aC5sZW5ndGg9PT0wKXIuX2Vycm9ycy5wdXNoKG4obCkpO2Vsc2V7bGV0IHM9cixhPTA7Zm9yKDthPGwucGF0aC5sZW5ndGg7KXtjb25zdCB1PWwucGF0aFthXTthPT09bC5wYXRoLmxlbmd0aC0xPyhzW3VdPXNbdV18fHtfZXJyb3JzOltdfSxzW3VdLl9lcnJvcnMucHVzaChuKGwpKSk6c1t1XT1zW3VdfHx7X2Vycm9yczpbXX0scz1zW3VdLGErK319fTtyZXR1cm4gaSh0aGlzKSxyfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMubWVzc2FnZX1nZXQgbWVzc2FnZSgpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcyxEZS5qc29uU3RyaW5naWZ5UmVwbGFjZXIsMil9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoPT09MH1mbGF0dGVuKGU9bj0+bi5tZXNzYWdlKXtjb25zdCBuPXt9LHI9W107Zm9yKGNvbnN0IGkgb2YgdGhpcy5pc3N1ZXMpaS5wYXRoLmxlbmd0aD4wPyhuW2kucGF0aFswXV09bltpLnBhdGhbMF1dfHxbXSxuW2kucGF0aFswXV0ucHVzaChlKGkpKSk6ci5wdXNoKGUoaSkpO3JldHVybntmb3JtRXJyb3JzOnIsZmllbGRFcnJvcnM6bn19Z2V0IGZvcm1FcnJvcnMoKXtyZXR1cm4gdGhpcy5mbGF0dGVuKCl9fXdyLmNyZWF0ZT10PT5uZXcgd3IodCk7Y29uc3QgZHU9KHQsZSk9PntsZXQgbjtzd2l0Y2godC5jb2RlKXtjYXNlIFYuaW52YWxpZF90eXBlOnQucmVjZWl2ZWQ9PT1xLnVuZGVmaW5lZD9uPSJSZXF1aXJlZCI6bj1gRXhwZWN0ZWQgJHt0LmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHt0LnJlY2VpdmVkfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfbGl0ZXJhbDpuPWBJbnZhbGlkIGxpdGVyYWwgdmFsdWUsIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkodC5leHBlY3RlZCxEZS5qc29uU3RyaW5naWZ5UmVwbGFjZXIpfWA7YnJlYWs7Y2FzZSBWLnVucmVjb2duaXplZF9rZXlzOm49YFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke0RlLmpvaW5WYWx1ZXModC5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfdW5pb246bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBWLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpuPWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7RGUuam9pblZhbHVlcyh0Lm9wdGlvbnMpfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfZW51bV92YWx1ZTpuPWBJbnZhbGlkIGVudW0gdmFsdWUuIEV4cGVjdGVkICR7RGUuam9pblZhbHVlcyh0Lm9wdGlvbnMpfSwgcmVjZWl2ZWQgJyR7dC5yZWNlaXZlZH0nYDticmVhaztjYXNlIFYuaW52YWxpZF9hcmd1bWVudHM6bj0iSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHMiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX3JldHVybl90eXBlOm49IkludmFsaWQgZnVuY3Rpb24gcmV0dXJuIHR5cGUiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX2RhdGU6bj0iSW52YWxpZCBkYXRlIjticmVhaztjYXNlIFYuaW52YWxpZF9zdHJpbmc6dHlwZW9mIHQudmFsaWRhdGlvbj09Im9iamVjdCI/ImluY2x1ZGVzImluIHQudmFsaWRhdGlvbj8obj1gSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlICIke3QudmFsaWRhdGlvbi5pbmNsdWRlc30iYCx0eXBlb2YgdC52YWxpZGF0aW9uLnBvc2l0aW9uPT0ibnVtYmVyIiYmKG49YCR7bn0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke3QudmFsaWRhdGlvbi5wb3NpdGlvbn1gKSk6InN0YXJ0c1dpdGgiaW4gdC52YWxpZGF0aW9uP249YEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCAiJHt0LnZhbGlkYXRpb24uc3RhcnRzV2l0aH0iYDoiZW5kc1dpdGgiaW4gdC52YWxpZGF0aW9uP249YEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggIiR7dC52YWxpZGF0aW9uLmVuZHNXaXRofSJgOkRlLmFzc2VydE5ldmVyKHQudmFsaWRhdGlvbik6dC52YWxpZGF0aW9uIT09InJlZ2V4Ij9uPWBJbnZhbGlkICR7dC52YWxpZGF0aW9ufWA6bj0iSW52YWxpZCI7YnJlYWs7Y2FzZSBWLnRvb19zbWFsbDp0LnR5cGU9PT0iYXJyYXkiP249YEFycmF5IG11c3QgY29udGFpbiAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7dC5taW5pbXVtfSBlbGVtZW50KHMpYDp0LnR5cGU9PT0ic3RyaW5nIj9uPWBTdHJpbmcgbXVzdCBjb250YWluICR7dC5leGFjdD8iZXhhY3RseSI6dC5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7dC5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnQudHlwZT09PSJudW1iZXIiP249YE51bWJlciBtdXN0IGJlICR7dC5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnQuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHt0Lm1pbmltdW19YDp0LnR5cGU9PT0iZGF0ZSI/bj1gRGF0ZSBtdXN0IGJlICR7dC5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnQuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIodC5taW5pbXVtKSl9YDpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFYudG9vX2JpZzp0LnR5cGU9PT0iYXJyYXkiP249YEFycmF5IG11c3QgY29udGFpbiAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHt0Lm1heGltdW19IGVsZW1lbnQocylgOnQudHlwZT09PSJzdHJpbmciP249YFN0cmluZyBtdXN0IGNvbnRhaW4gJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHt0Lm1heGltdW19IGNoYXJhY3RlcihzKWA6dC50eXBlPT09Im51bWJlciI/bj1gTnVtYmVyIG11c3QgYmUgJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHt0Lm1heGltdW19YDp0LnR5cGU9PT0iYmlnaW50Ij9uPWBCaWdJbnQgbXVzdCBiZSAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3QubWF4aW11bX1gOnQudHlwZT09PSJkYXRlIj9uPWBEYXRlIG11c3QgYmUgJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIodC5tYXhpbXVtKSl9YDpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFYuY3VzdG9tOm49IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpuPSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIFYubm90X211bHRpcGxlX29mOm49YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHt0Lm11bHRpcGxlT2Z9YDticmVhaztjYXNlIFYubm90X2Zpbml0ZTpuPSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6bj1lLmRlZmF1bHRFcnJvcixEZS5hc3NlcnROZXZlcih0KX1yZXR1cm57bWVzc2FnZTpufX07bGV0ICRDPWR1O2Z1bmN0aW9uIGc1KHQpeyRDPXR9ZnVuY3Rpb24gRmQoKXtyZXR1cm4gJEN9Y29uc3QgQmQ9dD0+e2NvbnN0e2RhdGE6ZSxwYXRoOm4sZXJyb3JNYXBzOnIsaXNzdWVEYXRhOml9PXQsbz1bLi4ubiwuLi5pLnBhdGh8fFtdXSxsPXsuLi5pLHBhdGg6b307bGV0IHM9IiI7Y29uc3QgYT1yLmZpbHRlcih1PT4hIXUpLnNsaWNlKCkucmV2ZXJzZSgpO2Zvcihjb25zdCB1IG9mIGEpcz11KGwse2RhdGE6ZSxkZWZhdWx0RXJyb3I6c30pLm1lc3NhZ2U7cmV0dXJuey4uLmkscGF0aDpvLG1lc3NhZ2U6aS5tZXNzYWdlfHxzfX0sbTU9W107ZnVuY3Rpb24gdGUodCxlKXtjb25zdCBuPUJkKHtpc3N1ZURhdGE6ZSxkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLEZkKCksZHVdLmZpbHRlcihyPT4hIXIpfSk7dC5jb21tb24uaXNzdWVzLnB1c2gobil9Y2xhc3Mgb257Y29uc3RydWN0b3IoKXt0aGlzLnZhbHVlPSJ2YWxpZCJ9ZGlydHkoKXt0aGlzLnZhbHVlPT09InZhbGlkIiYmKHRoaXMudmFsdWU9ImRpcnR5Iil9YWJvcnQoKXt0aGlzLnZhbHVlIT09ImFib3J0ZWQiJiYodGhpcy52YWx1ZT0iYWJvcnRlZCIpfXN0YXRpYyBtZXJnZUFycmF5KGUsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtpZihpLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7aS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksci5wdXNoKGkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpyfX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLG4pe2NvbnN0IHI9W107Zm9yKGNvbnN0IGkgb2YgbilyLnB1c2goe2tleTphd2FpdCBpLmtleSx2YWx1ZTphd2FpdCBpLnZhbHVlfSk7cmV0dXJuIG9uLm1lcmdlT2JqZWN0U3luYyhlLHIpfXN0YXRpYyBtZXJnZU9iamVjdFN5bmMoZSxuKXtjb25zdCByPXt9O2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0e2tleTpvLHZhbHVlOmx9PWk7aWYoby5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiB5ZTtvLnN0YXR1cz09PSJkaXJ0eSImJmUuZGlydHkoKSxsLnN0YXR1cz09PSJkaXJ0eSImJmUuZGlydHkoKSxvLnZhbHVlIT09Il9fcHJvdG9fXyImJih0eXBlb2YgbC52YWx1ZTwidSJ8fGkuYWx3YXlzU2V0KSYmKHJbby52YWx1ZV09bC52YWx1ZSl9cmV0dXJue3N0YXR1czplLnZhbHVlLHZhbHVlOnJ9fX1jb25zdCB5ZT1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksVEM9dD0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTp0fSkseW49dD0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTp0fSksRGc9dD0+dC5zdGF0dXM9PT0iYWJvcnRlZCIsamc9dD0+dC5zdGF0dXM9PT0iZGlydHkiLGZ1PXQ9PnQuc3RhdHVzPT09InZhbGlkIixVZD10PT50eXBlb2YgUHJvbWlzZTwidSImJnQgaW5zdGFuY2VvZiBQcm9taXNlO3ZhciBmZTsoZnVuY3Rpb24odCl7dC5lcnJUb09iaj1lPT50eXBlb2YgZT09InN0cmluZyI/e21lc3NhZ2U6ZX06ZXx8e30sdC50b1N0cmluZz1lPT50eXBlb2YgZT09InN0cmluZyI/ZTplPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2V9KShmZXx8KGZlPXt9KSk7Y2xhc3MgSHJ7Y29uc3RydWN0b3IoZSxuLHIsaSl7dGhpcy5fY2FjaGVkUGF0aD1bXSx0aGlzLnBhcmVudD1lLHRoaXMuZGF0YT1uLHRoaXMuX3BhdGg9cix0aGlzLl9rZXk9aX1nZXQgcGF0aCgpe3JldHVybiB0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aHx8KHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLC4uLnRoaXMuX2tleSk6dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsdGhpcy5fa2V5KSksdGhpcy5fY2FjaGVkUGF0aH19Y29uc3QgVHg9KHQsZSk9PntpZihmdShlKSlyZXR1cm57c3VjY2VzczohMCxkYXRhOmUudmFsdWV9O2lmKCF0LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC4iKTtyZXR1cm57c3VjY2VzczohMSxnZXQgZXJyb3IoKXtpZih0aGlzLl9lcnJvcilyZXR1cm4gdGhpcy5fZXJyb3I7Y29uc3Qgbj1uZXcgd3IodC5jb21tb24uaXNzdWVzKTtyZXR1cm4gdGhpcy5fZXJyb3I9bix0aGlzLl9lcnJvcn19fTtmdW5jdGlvbiB4ZSh0KXtpZighdClyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjpuLHJlcXVpcmVkX2Vycm9yOnIsZGVzY3JpcHRpb246aX09dDtpZihlJiYobnx8cikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246aX06e2Vycm9yTWFwOihsLHMpPT5sLmNvZGUhPT0iaW52YWxpZF90eXBlIj97bWVzc2FnZTpzLmRlZmF1bHRFcnJvcn06dHlwZW9mIHMuZGF0YT4idSI/e21lc3NhZ2U6cj8/cy5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOm4/P3MuZGVmYXVsdEVycm9yfSxkZXNjcmlwdGlvbjppfX1jbGFzcyBDZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIHppKGUuZGF0YSl9X2dldE9yUmV0dXJuQ3R4KGUsbil7cmV0dXJuIG58fHtjb21tb246ZS5wYXJlbnQuY29tbW9uLGRhdGE6ZS5kYXRhLHBhcnNlZFR5cGU6emkoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX1fcHJvY2Vzc0lucHV0UGFyYW1zKGUpe3JldHVybntzdGF0dXM6bmV3IG9uLGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOnppKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19fV9wYXJzZVN5bmMoZSl7Y29uc3Qgbj10aGlzLl9wYXJzZShlKTtpZihVZChuKSl0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7cmV0dXJuIG59X3BhcnNlQXN5bmMoZSl7Y29uc3Qgbj10aGlzLl9wYXJzZShlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfXBhcnNlKGUsbil7Y29uc3Qgcj10aGlzLnNhZmVQYXJzZShlLG4pO2lmKHIuc3VjY2VzcylyZXR1cm4gci5kYXRhO3Rocm93IHIuZXJyb3J9c2FmZVBhcnNlKGUsbil7dmFyIHI7Y29uc3QgaT17Y29tbW9uOntpc3N1ZXM6W10sYXN5bmM6KHI9bj09bnVsbD92b2lkIDA6bi5hc3luYykhPT1udWxsJiZyIT09dm9pZCAwP3I6ITEsY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOmUscGFyc2VkVHlwZTp6aShlKX0sbz10aGlzLl9wYXJzZVN5bmMoe2RhdGE6ZSxwYXRoOmkucGF0aCxwYXJlbnQ6aX0pO3JldHVybiBUeChpLG8pfWFzeW5jIHBhcnNlQXN5bmMoZSxuKXtjb25zdCByPWF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZSxuKTtpZihyLnN1Y2Nlc3MpcmV0dXJuIHIuZGF0YTt0aHJvdyByLmVycm9yfWFzeW5jIHNhZmVQYXJzZUFzeW5jKGUsbil7Y29uc3Qgcj17Y29tbW9uOntpc3N1ZXM6W10sY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXAsYXN5bmM6ITB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOmUscGFyc2VkVHlwZTp6aShlKX0saT10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6ci5wYXRoLHBhcmVudDpyfSksbz1hd2FpdChVZChpKT9pOlByb21pc2UucmVzb2x2ZShpKSk7cmV0dXJuIFR4KHIsbyl9cmVmaW5lKGUsbil7Y29uc3Qgcj1pPT50eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPiJ1Ij97bWVzc2FnZTpufTp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGkpOm47cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKGksbyk9Pntjb25zdCBsPWUoaSkscz0oKT0+by5hZGRJc3N1ZSh7Y29kZTpWLmN1c3RvbSwuLi5yKGkpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmbCBpbnN0YW5jZW9mIFByb21pc2U/bC50aGVuKGE9PmE/ITA6KHMoKSwhMSkpOmw/ITA6KHMoKSwhMSl9KX1yZWZpbmVtZW50KGUsbil7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsaSk9PmUocik/ITA6KGkuYWRkSXNzdWUodHlwZW9mIG49PSJmdW5jdGlvbiI/bihyLGkpOm4pLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBrcih7c2NoZW1hOnRoaXMsdHlwZU5hbWU6aGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InJlZmluZW1lbnQiLHJlZmluZW1lbnQ6ZX19KX1zdXBlclJlZmluZShlKXtyZXR1cm4gdGhpcy5fcmVmaW5lbWVudChlKX1vcHRpb25hbCgpe3JldHVybiBjaS5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIFFvLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9bnVsbGlzaCgpe3JldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKX1hcnJheSgpe3JldHVybiBTci5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfXByb21pc2UoKXtyZXR1cm4gcHMuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1vcihlKXtyZXR1cm4gbXUuY3JlYXRlKFt0aGlzLGVdLHRoaXMuX2RlZil9YW5kKGUpe3JldHVybiB2dS5jcmVhdGUodGhpcyxlLHRoaXMuX2RlZil9dHJhbnNmb3JtKGUpe3JldHVybiBuZXcga3Ioey4uLnhlKHRoaXMuX2RlZiksc2NoZW1hOnRoaXMsdHlwZU5hbWU6aGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOmV9fSl9ZGVmYXVsdChlKXtjb25zdCBuPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6KCk9PmU7cmV0dXJuIG5ldyBTdSh7Li4ueGUodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6bix0eXBlTmFtZTpoZS5ab2REZWZhdWx0fSl9YnJhbmQoKXtyZXR1cm4gbmV3IFJDKHt0eXBlTmFtZTpoZS5ab2RCcmFuZGVkLHR5cGU6dGhpcywuLi54ZSh0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3Qgbj10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgS2Qoey4uLnhlKHRoaXMuX2RlZiksaW5uZXJUeXBlOnRoaXMsY2F0Y2hWYWx1ZTpuLHR5cGVOYW1lOmhlLlpvZENhdGNofSl9ZGVzY3JpYmUoZSl7Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBuZXcgbih7Li4udGhpcy5fZGVmLGRlc2NyaXB0aW9uOmV9KX1waXBlKGUpe3JldHVybiBVdS5jcmVhdGUodGhpcyxlKX1yZWFkb25seSgpe3JldHVybiBHZC5jcmVhdGUodGhpcyl9aXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9aXNOdWxsYWJsZSgpe3JldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzfX1jb25zdCB2NT0vXmNbXlxzLV17OCx9JC9pLHk1PS9eW2Etel1bYS16MC05XSokLyx4NT0vXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLyxfNT0vXlswLTlhLWZBLUZdezh9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17MTJ9JC9pLHc1PS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XystXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2ksUzU9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2xldCB6aDtjb25zdCBFNT0vXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC8sQzU9L14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLyxrNT10PT50LnByZWNpc2lvbj90Lm9mZnNldD9uZXcgUmVnRXhwKGBeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7JHt0LnByZWNpc2lvbn19KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJGApOm5ldyBSZWdFeHAoYF5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHske3QucHJlY2lzaW9ufX1aJGApOnQucHJlY2lzaW9uPT09MD90Lm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oKFsrLV1cXGR7Mn0oOj9cXGR7Mn0pPyl8WikkIik6bmV3IFJlZ0V4cCgiXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9WiQiKTp0Lm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkKyk/KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJCIpOm5ldyBSZWdFeHAoIl5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGQrKT9aJCIpO2Z1bmN0aW9uIGI1KHQsZSl7cmV0dXJuISEoKGU9PT0idjQifHwhZSkmJkU1LnRlc3QodCl8fChlPT09InY2Inx8IWUpJiZDNS50ZXN0KHQpKX1jbGFzcyB5ciBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09cS5zdHJpbmcpe2NvbnN0IG89dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKG8se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5zdHJpbmcscmVjZWl2ZWQ6by5wYXJzZWRUeXBlfSkseWV9Y29uc3Qgcj1uZXcgb247bGV0IGk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylpZihvLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPG8udmFsdWUmJihpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09Im1heCIpZS5kYXRhLmxlbmd0aD5vLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0ibGVuZ3RoIil7Y29uc3QgbD1lLmRhdGEubGVuZ3RoPm8udmFsdWUscz1lLmRhdGEubGVuZ3RoPG8udmFsdWU7KGx8fHMpJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLGw/dGUoaSx7Y29kZTpWLnRvb19iaWcsbWF4aW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6by5tZXNzYWdlfSk6cyYmdGUoaSx7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpfWVsc2UgaWYoby5raW5kPT09ImVtYWlsIil3NS50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoiZW1haWwiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iZW1vamkiKXpofHwoemg9bmV3IFJlZ0V4cChTNSwidSIpKSx6aC50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0idXVpZCIpXzUudGVzdChlLmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246InV1aWQiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZCIpdjUudGVzdChlLmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246ImN1aWQiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZDIiKXk1LnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1bGlkIil4NS50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoidWxpZCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1cmwiKXRyeXtuZXcgVVJMKGUuZGF0YSl9Y2F0Y2h7aT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246InVybCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpfWVsc2Ugby5raW5kPT09InJlZ2V4Ij8oby5yZWdleC5sYXN0SW5kZXg9MCxvLnJlZ2V4LnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKSk6by5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOm8ua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKG8udmFsdWUsby5wb3NpdGlvbil8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2luY2x1ZGVzOm8udmFsdWUscG9zaXRpb246by5wb3NpdGlvbn0sbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJ0b0xvd2VyQ2FzZSI/ZS5kYXRhPWUuZGF0YS50b0xvd2VyQ2FzZSgpOm8ua2luZD09PSJ0b1VwcGVyQ2FzZSI/ZS5kYXRhPWUuZGF0YS50b1VwcGVyQ2FzZSgpOm8ua2luZD09PSJzdGFydHNXaXRoIj9lLmRhdGEuc3RhcnRzV2l0aChvLnZhbHVlKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHtjb2RlOlYuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7c3RhcnRzV2l0aDpvLnZhbHVlfSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImVuZHNXaXRoIj9lLmRhdGEuZW5kc1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOm8udmFsdWV9LG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0iZGF0ZXRpbWUiP2s1KG8pLnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHtjb2RlOlYuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZXRpbWUiLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0iaXAiP2I1KGUuZGF0YSxvLnZlcnNpb24pfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246ImlwIixjb2RlOlYuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOkRlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLG4scil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChpPT5lLnRlc3QoaSkse3ZhbGlkYXRpb246bixjb2RlOlYuaW52YWxpZF9zdHJpbmcsLi4uZmUuZXJyVG9PYmoocil9KX1fYWRkQ2hlY2soZSl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfWVtYWlsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1haWwiLC4uLmZlLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5mZS5lcnJUb09iaihlKX0pfWVtb2ppKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1vamkiLC4uLmZlLmVyclRvT2JqKGUpfSl9dXVpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InV1aWQiLC4uLmZlLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLmZlLmVyclRvT2JqKGUpfSl9Y3VpZDIoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJjdWlkMiIsLi4uZmUuZXJyVG9PYmooZSl9KX11bGlkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidWxpZCIsLi4uZmUuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5mZS5lcnJUb09iaihlKX0pfWRhdGV0aW1lKGUpe3ZhciBuO3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246bnVsbCxvZmZzZXQ6ITEsbWVzc2FnZTplfSk6dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246dHlwZW9mKGU9PW51bGw/dm9pZCAwOmUucHJlY2lzaW9uKT4idSI/bnVsbDplPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbixvZmZzZXQ6KG49ZT09bnVsbD92b2lkIDA6ZS5vZmZzZXQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOiExLC4uLmZlLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1yZWdleChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoicmVnZXgiLHJlZ2V4OmUsLi4uZmUuZXJyVG9PYmoobil9KX1pbmNsdWRlcyhlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW5jbHVkZXMiLHZhbHVlOmUscG9zaXRpb246bj09bnVsbD92b2lkIDA6bi5wb3NpdGlvbiwuLi5mZS5lcnJUb09iaihuPT1udWxsP3ZvaWQgMDpuLm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfWVuZHNXaXRoKGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbmRzV2l0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfW1pbihlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTplLC4uLmZlLmVyclRvT2JqKG4pfSl9bWF4KGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4uZmUuZXJyVG9PYmoobil9KX1sZW5ndGgoZSxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Imxlbmd0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGZlLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidHJpbSJ9XX0pfXRvTG93ZXJDYXNlKCl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidG9Mb3dlckNhc2UifV19KX10b1VwcGVyQ2FzZSgpe3JldHVybiBuZXcgeXIoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNFbWFpbCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJlbWFpbCIpfWdldCBpc1VSTCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1cmwiKX1nZXQgaXNFbW9qaSgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJlbW9qaSIpfWdldCBpc1VVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0idXVpZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgbWluTGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYoZT09PW51bGx8fG4udmFsdWU+ZSkmJihlPW4udmFsdWUpO3JldHVybiBlfWdldCBtYXhMZW5ndGgoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJihlPT09bnVsbHx8bi52YWx1ZTxlKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGV9fXlyLmNyZWF0ZT10PT57dmFyIGU7cmV0dXJuIG5ldyB5cih7Y2hlY2tzOltdLHR5cGVOYW1lOmhlLlpvZFN0cmluZyxjb2VyY2U6KGU9dD09bnVsbD92b2lkIDA6dC5jb2VyY2UpIT09bnVsbCYmZSE9PXZvaWQgMD9lOiExLC4uLnhlKHQpfSl9O2Z1bmN0aW9uICQ1KHQsZSl7Y29uc3Qgbj0odC50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsaT1uPnI/bjpyLG89cGFyc2VJbnQodC50b0ZpeGVkKGkpLnJlcGxhY2UoIi4iLCIiKSksbD1wYXJzZUludChlLnRvRml4ZWQoaSkucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gbyVsL01hdGgucG93KDEwLGkpfWNsYXNzIGFvIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubWluPXRoaXMuZ3RlLHRoaXMubWF4PXRoaXMubHRlLHRoaXMuc3RlcD10aGlzLm11bHRpcGxlT2Z9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9TnVtYmVyKGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1xLm51bWJlcil7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUobyx7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm51bWJlcixyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSx5ZX1sZXQgcjtjb25zdCBpPW5ldyBvbjtmb3IoY29uc3QgbyBvZiB0aGlzLl9kZWYuY2hlY2tzKW8ua2luZD09PSJpbnQiP0RlLmlzSW50ZWdlcihlLmRhdGEpfHwocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6ImludGVnZXIiLHJlY2VpdmVkOiJmbG9hdCIsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtaW4iPyhvLmluY2x1c2l2ZT9lLmRhdGE8by52YWx1ZTplLmRhdGE8PW8udmFsdWUpJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6Im51bWJlciIsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/ZS5kYXRhPm8udmFsdWU6ZS5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxyKSx0ZShyLHtjb2RlOlYudG9vX2JpZyxtYXhpbXVtOm8udmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6by5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtdWx0aXBsZU9mIj8kNShlLmRhdGEsby52YWx1ZSkhPT0wJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5ub3RfbXVsdGlwbGVfb2YsbXVsdGlwbGVPZjpvLnZhbHVlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0iZmluaXRlIj9OdW1iZXIuaXNGaW5pdGUoZS5kYXRhKXx8KHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxyKSx0ZShyLHtjb2RlOlYubm90X2Zpbml0ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6RGUuYXNzZXJ0TmV2ZXIobyk7cmV0dXJue3N0YXR1czppLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxmZS50b1N0cmluZyhuKSl9Z3QoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCExLGZlLnRvU3RyaW5nKG4pKX1sdGUoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLGZlLnRvU3RyaW5nKG4pKX1sdChlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEsZmUudG9TdHJpbmcobikpfXNldExpbWl0KGUsbixyLGkpe3JldHVybiBuZXcgYW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTpuLGluY2x1c2l2ZTpyLG1lc3NhZ2U6ZmUudG9TdHJpbmcoaSl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IGFvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLGVdfSl9aW50KGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW50IixtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9cG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiExLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bm9ubmVnYXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6ZmUudG9TdHJpbmcobil9KX1maW5pdGUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJmaW5pdGUiLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1zYWZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfWdldCBtaW5WYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHxuLnZhbHVlPmUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4VmFsdWUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJihlPT09bnVsbHx8bi52YWx1ZTxlKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGV9Z2V0IGlzSW50KCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImludCJ8fGUua2luZD09PSJtdWx0aXBsZU9mIiYmRGUuaXNJbnRlZ2VyKGUudmFsdWUpKX1nZXQgaXNGaW5pdGUoKXtsZXQgZT1udWxsLG49bnVsbDtmb3IoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKXtpZihyLmtpbmQ9PT0iZmluaXRlInx8ci5raW5kPT09ImludCJ8fHIua2luZD09PSJtdWx0aXBsZU9mIilyZXR1cm4hMDtyLmtpbmQ9PT0ibWluIj8obj09PW51bGx8fHIudmFsdWU+bikmJihuPXIudmFsdWUpOnIua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHIudmFsdWU8ZSkmJihlPXIudmFsdWUpfXJldHVybiBOdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZShlKX19YW8uY3JlYXRlPXQ9Pm5ldyBhbyh7Y2hlY2tzOltdLHR5cGVOYW1lOmhlLlpvZE51bWJlcixjb2VyY2U6KHQ9PW51bGw/dm9pZCAwOnQuY29lcmNlKXx8ITEsLi4ueGUodCl9KTtjbGFzcyB1byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZX1fcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1CaWdJbnQoZS5kYXRhKSksdGhpcy5fZ2V0VHlwZShlKSE9PXEuYmlnaW50KXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShvLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuYmlnaW50LHJlY2VpdmVkOm8ucGFyc2VkVHlwZX0pLHllfWxldCByO2NvbnN0IGk9bmV3IG9uO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09Im1pbiI/KG8uaW5jbHVzaXZlP2UuZGF0YTxvLnZhbHVlOmUuZGF0YTw9by52YWx1ZSkmJihyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsciksdGUocix7Y29kZTpWLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06by52YWx1ZSxpbmNsdXNpdmU6by5pbmNsdXNpdmUsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtYXgiPyhvLmluY2x1c2l2ZT9lLmRhdGE+by52YWx1ZTplLmRhdGE+PW8udmFsdWUpJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi50b29fYmlnLHR5cGU6ImJpZ2ludCIsbWF4aW11bTpvLnZhbHVlLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP2UuZGF0YSVvLnZhbHVlIT09QmlnSW50KDApJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5ub3RfbXVsdGlwbGVfb2YsbXVsdGlwbGVPZjpvLnZhbHVlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpEZS5hc3NlcnROZXZlcihvKTtyZXR1cm57c3RhdHVzOmkudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLGZlLnRvU3RyaW5nKG4pKX1ndChlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEsZmUudG9TdHJpbmcobikpfWx0ZShlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITAsZmUudG9TdHJpbmcobikpfWx0KGUsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxmZS50b1N0cmluZyhuKSl9c2V0TGltaXQoZSxuLHIsaSl7cmV0dXJuIG5ldyB1byh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDplLHZhbHVlOm4saW5jbHVzaXZlOnIsbWVzc2FnZTpmZS50b1N0cmluZyhpKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgdW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1wb3NpdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMSxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bmVnYXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOkJpZ0ludCgwKSxpbmNsdXNpdmU6ITEsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1ub25uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMCxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bXVsdGlwbGVPZihlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibXVsdGlwbGVPZiIsdmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYoZT09PW51bGx8fG4udmFsdWU+ZSkmJihlPW4udmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZX19dW8uY3JlYXRlPXQ9Pnt2YXIgZTtyZXR1cm4gbmV3IHVvKHtjaGVja3M6W10sdHlwZU5hbWU6aGUuWm9kQmlnSW50LGNvZXJjZTooZT10PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4ueGUodCl9KX07Y2xhc3MgaHUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT0hIWUuZGF0YSksdGhpcy5fZ2V0VHlwZShlKSE9PXEuYm9vbGVhbil7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLmJvb2xlYW4scmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fWh1LmNyZWF0ZT10PT5uZXcgaHUoe3R5cGVOYW1lOmhlLlpvZEJvb2xlYW4sY29lcmNlOih0PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSl8fCExLC4uLnhlKHQpfSk7Y2xhc3MgWW8gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09cS5kYXRlKXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShvLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuZGF0ZSxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSx5ZX1pZihpc05hTihlLmRhdGEuZ2V0VGltZSgpKSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUobyx7Y29kZTpWLmludmFsaWRfZGF0ZX0pLHllfWNvbnN0IHI9bmV3IG9uO2xldCBpO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09Im1pbiI/ZS5kYXRhLmdldFRpbWUoKTxvLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fc21hbGwsbWVzc2FnZTpvLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06by52YWx1ZSx0eXBlOiJkYXRlIn0pLHIuZGlydHkoKSk6by5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5vLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fYmlnLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtYXhpbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOkRlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTpuZXcgRGF0ZShlLmRhdGEuZ2V0VGltZSgpKX19X2FkZENoZWNrKGUpe3JldHVybiBuZXcgWW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpmZS50b1N0cmluZyhuKX0pfW1heChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTplLmdldFRpbWUoKSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pbkRhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJihlPT09bnVsbHx8bi52YWx1ZT5lKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH1nZXQgbWF4RGF0ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZSE9bnVsbD9uZXcgRGF0ZShlKTpudWxsfX1Zby5jcmVhdGU9dD0+bmV3IFlvKHtjaGVja3M6W10sY29lcmNlOih0PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSl8fCExLHR5cGVOYW1lOmhlLlpvZERhdGUsLi4ueGUodCl9KTtjbGFzcyBXZCBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09cS5zeW1ib2wpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5zeW1ib2wscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fVdkLmNyZWF0ZT10PT5uZXcgV2Qoe3R5cGVOYW1lOmhlLlpvZFN5bWJvbCwuLi54ZSh0KX0pO2NsYXNzIHB1IGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLnVuZGVmaW5lZCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnVuZGVmaW5lZCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZX1yZXR1cm4geW4oZS5kYXRhKX19cHUuY3JlYXRlPXQ9Pm5ldyBwdSh7dHlwZU5hbWU6aGUuWm9kVW5kZWZpbmVkLC4uLnhlKHQpfSk7Y2xhc3MgZ3UgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PXEubnVsbCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm51bGwscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fWd1LmNyZWF0ZT10PT5uZXcgZ3Uoe3R5cGVOYW1lOmhlLlpvZE51bGwsLi4ueGUodCl9KTtjbGFzcyBocyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9hbnk9ITB9X3BhcnNlKGUpe3JldHVybiB5bihlLmRhdGEpfX1ocy5jcmVhdGU9dD0+bmV3IGhzKHt0eXBlTmFtZTpoZS5ab2RBbnksLi4ueGUodCl9KTtjbGFzcyB6byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4geW4oZS5kYXRhKX19em8uY3JlYXRlPXQ9Pm5ldyB6byh7dHlwZU5hbWU6aGUuWm9kVW5rbm93biwuLi54ZSh0KX0pO2NsYXNzIGdpIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKG4se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5uZXZlcixyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSx5ZX19Z2kuY3JlYXRlPXQ9Pm5ldyBnaSh7dHlwZU5hbWU6aGUuWm9kTmV2ZXIsLi4ueGUodCl9KTtjbGFzcyBWZCBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09cS51bmRlZmluZWQpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS52b2lkLHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLHllfXJldHVybiB5bihlLmRhdGEpfX1WZC5jcmVhdGU9dD0+bmV3IFZkKHt0eXBlTmFtZTpoZS5ab2RWb2lkLC4uLnhlKHQpfSk7Y2xhc3MgU3IgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7Y3R4Om4sc3RhdHVzOnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxpPXRoaXMuX2RlZjtpZihuLnBhcnNlZFR5cGUhPT1xLmFycmF5KXJldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuYXJyYXkscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7aWYoaS5leGFjdExlbmd0aCE9PW51bGwpe2NvbnN0IGw9bi5kYXRhLmxlbmd0aD5pLmV4YWN0TGVuZ3RoLnZhbHVlLHM9bi5kYXRhLmxlbmd0aDxpLmV4YWN0TGVuZ3RoLnZhbHVlOyhsfHxzKSYmKHRlKG4se2NvZGU6bD9WLnRvb19iaWc6Vi50b29fc21hbGwsbWluaW11bTpzP2kuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06bD9pLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6aS5leGFjdExlbmd0aC5tZXNzYWdlfSksci5kaXJ0eSgpKX1pZihpLm1pbkxlbmd0aCE9PW51bGwmJm4uZGF0YS5sZW5ndGg8aS5taW5MZW5ndGgudmFsdWUmJih0ZShuLHtjb2RlOlYudG9vX3NtYWxsLG1pbmltdW06aS5taW5MZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWluTGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLGkubWF4TGVuZ3RoIT09bnVsbCYmbi5kYXRhLmxlbmd0aD5pLm1heExlbmd0aC52YWx1ZSYmKHRlKG4se2NvZGU6Vi50b29fYmlnLG1heGltdW06aS5tYXhMZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWF4TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLmFsbChbLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VBc3luYyhuZXcgSHIobixsLG4ucGF0aCxzKSkpKS50aGVuKGw9Pm9uLm1lcmdlQXJyYXkocixsKSk7Y29uc3Qgbz1bLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VTeW5jKG5ldyBIcihuLGwsbi5wYXRoLHMpKSk7cmV0dXJuIG9uLm1lcmdlQXJyYXkocixvKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSxuKXtyZXR1cm4gbmV3IFNyKHsuLi50aGlzLl9kZWYsbWluTGVuZ3RoOnt2YWx1ZTplLG1lc3NhZ2U6ZmUudG9TdHJpbmcobil9fSl9bWF4KGUsbil7cmV0dXJuIG5ldyBTcih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfWxlbmd0aChlLG4pe3JldHVybiBuZXcgU3Ioey4uLnRoaXMuX2RlZixleGFjdExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1Tci5jcmVhdGU9KHQsZSk9Pm5ldyBTcih7dHlwZTp0LG1pbkxlbmd0aDpudWxsLG1heExlbmd0aDpudWxsLGV4YWN0TGVuZ3RoOm51bGwsdHlwZU5hbWU6aGUuWm9kQXJyYXksLi4ueGUoZSl9KTtmdW5jdGlvbiBrbCh0KXtpZih0IGluc3RhbmNlb2YgY3Qpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdC5zaGFwZSl7Y29uc3Qgcj10LnNoYXBlW25dO2Vbbl09Y2kuY3JlYXRlKGtsKHIpKX1yZXR1cm4gbmV3IGN0KHsuLi50Ll9kZWYsc2hhcGU6KCk9PmV9KX1lbHNlIHJldHVybiB0IGluc3RhbmNlb2YgU3I/bmV3IFNyKHsuLi50Ll9kZWYsdHlwZTprbCh0LmVsZW1lbnQpfSk6dCBpbnN0YW5jZW9mIGNpP2NpLmNyZWF0ZShrbCh0LnVud3JhcCgpKSk6dCBpbnN0YW5jZW9mIFFvP1FvLmNyZWF0ZShrbCh0LnVud3JhcCgpKSk6dCBpbnN0YW5jZW9mIEtyP0tyLmNyZWF0ZSh0Lml0ZW1zLm1hcChlPT5rbChlKSkpOnR9Y2xhc3MgY3QgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fY2FjaGVkPW51bGwsdGhpcy5ub25zdHJpY3Q9dGhpcy5wYXNzdGhyb3VnaCx0aGlzLmF1Z21lbnQ9dGhpcy5leHRlbmR9X2dldENhY2hlZCgpe2lmKHRoaXMuX2NhY2hlZCE9PW51bGwpcmV0dXJuIHRoaXMuX2NhY2hlZDtjb25zdCBlPXRoaXMuX2RlZi5zaGFwZSgpLG49RGUub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6bn19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUodSx7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm9iamVjdCxyZWNlaXZlZDp1LnBhcnNlZFR5cGV9KSx5ZX1jb25zdHtzdGF0dXM6cixjdHg6aX09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHtzaGFwZTpvLGtleXM6bH09dGhpcy5fZ2V0Q2FjaGVkKCkscz1bXTtpZighKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIGdpJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBpLmRhdGEpbC5pbmNsdWRlcyh1KXx8cy5wdXNoKHUpO2NvbnN0IGE9W107Zm9yKGNvbnN0IHUgb2YgbCl7Y29uc3QgYz1vW3VdLGQ9aS5kYXRhW3VdO2EucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpjLl9wYXJzZShuZXcgSHIoaSxkLGkucGF0aCx1KSksYWx3YXlzU2V0OnUgaW4gaS5kYXRhfSl9aWYodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgZ2kpe2NvbnN0IHU9dGhpcy5fZGVmLnVua25vd25LZXlzO2lmKHU9PT0icGFzc3Rocm91Z2giKWZvcihjb25zdCBjIG9mIHMpYS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOmN9LHZhbHVlOntzdGF0dXM6InZhbGlkIix2YWx1ZTppLmRhdGFbY119fSk7ZWxzZSBpZih1PT09InN0cmljdCIpcy5sZW5ndGg+MCYmKHRlKGkse2NvZGU6Vi51bnJlY29nbml6ZWRfa2V5cyxrZXlzOnN9KSxyLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgYyBvZiBzKXtjb25zdCBkPWkuZGF0YVtjXTthLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6Y30sdmFsdWU6dS5fcGFyc2UobmV3IEhyKGksZCxpLnBhdGgsYykpLGFsd2F5c1NldDpjIGluIGkuZGF0YX0pfX1yZXR1cm4gaS5jb21tb24uYXN5bmM/UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYygpPT57Y29uc3QgdT1bXTtmb3IoY29uc3QgYyBvZiBhKXtjb25zdCBkPWF3YWl0IGMua2V5O3UucHVzaCh7a2V5OmQsdmFsdWU6YXdhaXQgYy52YWx1ZSxhbHdheXNTZXQ6Yy5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+b24ubWVyZ2VPYmplY3RTeW5jKHIsdSkpOm9uLm1lcmdlT2JqZWN0U3luYyhyLGEpfWdldCBzaGFwZSgpe3JldHVybiB0aGlzLl9kZWYuc2hhcGUoKX1zdHJpY3QoZSl7cmV0dXJuIGZlLmVyclRvT2JqLG5ldyBjdCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpY3QiLC4uLmUhPT12b2lkIDA/e2Vycm9yTWFwOihuLHIpPT57dmFyIGksbyxsLHM7Y29uc3QgYT0obD0obz0oaT10aGlzLl9kZWYpLmVycm9yTWFwKT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8uY2FsbChpLG4scikubWVzc2FnZSkhPT1udWxsJiZsIT09dm9pZCAwP2w6ci5kZWZhdWx0RXJyb3I7cmV0dXJuIG4uY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyI/e21lc3NhZ2U6KHM9ZmUuZXJyVG9PYmooZSkubWVzc2FnZSkhPT1udWxsJiZzIT09dm9pZCAwP3M6YX06e21lc3NhZ2U6YX19fTp7fX0pfXN0cmlwKCl7cmV0dXJuIG5ldyBjdCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoicGFzc3Rocm91Z2gifSl9ZXh0ZW5kKGUpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+KHsuLi50aGlzLl9kZWYuc2hhcGUoKSwuLi5lfSl9KX1tZXJnZShlKXtyZXR1cm4gbmV3IGN0KHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6aGUuWm9kT2JqZWN0fSl9c2V0S2V5KGUsbil7cmV0dXJuIHRoaXMuYXVnbWVudCh7W2VdOm59KX1jYXRjaGFsbChlKXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsY2F0Y2hhbGw6ZX0pfXBpY2soZSl7Y29uc3Qgbj17fTtyZXR1cm4gRGUub2JqZWN0S2V5cyhlKS5mb3JFYWNoKHI9PntlW3JdJiZ0aGlzLnNoYXBlW3JdJiYobltyXT10aGlzLnNoYXBlW3JdKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9b21pdChlKXtjb25zdCBuPXt9O3JldHVybiBEZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2gocj0+e2Vbcl18fChuW3JdPXRoaXMuc2hhcGVbcl0pfSksbmV3IGN0KHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pm59KX1kZWVwUGFydGlhbCgpe3JldHVybiBrbCh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IG49e307cmV0dXJuIERlLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaChyPT57Y29uc3QgaT10aGlzLnNoYXBlW3JdO2UmJiFlW3JdP25bcl09aTpuW3JdPWkub3B0aW9uYWwoKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9cmVxdWlyZWQoZSl7Y29uc3Qgbj17fTtyZXR1cm4gRGUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKHI9PntpZihlJiYhZVtyXSluW3JdPXRoaXMuc2hhcGVbcl07ZWxzZXtsZXQgbz10aGlzLnNoYXBlW3JdO2Zvcig7byBpbnN0YW5jZW9mIGNpOylvPW8uX2RlZi5pbm5lclR5cGU7bltyXT1vfX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9a2V5b2YoKXtyZXR1cm4gTkMoRGUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fWN0LmNyZWF0ZT0odCxlKT0+bmV3IGN0KHtzaGFwZTooKT0+dCx1bmtub3duS2V5czoic3RyaXAiLGNhdGNoYWxsOmdpLmNyZWF0ZSgpLHR5cGVOYW1lOmhlLlpvZE9iamVjdCwuLi54ZShlKX0pO2N0LnN0cmljdENyZWF0ZT0odCxlKT0+bmV3IGN0KHtzaGFwZTooKT0+dCx1bmtub3duS2V5czoic3RyaWN0IixjYXRjaGFsbDpnaS5jcmVhdGUoKSx0eXBlTmFtZTpoZS5ab2RPYmplY3QsLi4ueGUoZSl9KTtjdC5sYXp5Y3JlYXRlPSh0LGUpPT5uZXcgY3Qoe3NoYXBlOnQsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpnaS5jcmVhdGUoKSx0eXBlTmFtZTpoZS5ab2RPYmplY3QsLi4ueGUoZSl9KTtjbGFzcyBtdSBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9dGhpcy5fZGVmLm9wdGlvbnM7ZnVuY3Rpb24gaShvKXtmb3IoY29uc3QgcyBvZiBvKWlmKHMucmVzdWx0LnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIHMucmVzdWx0O2Zvcihjb25zdCBzIG9mIG8paWYocy5yZXN1bHQuc3RhdHVzPT09ImRpcnR5IilyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4ucy5jdHguY29tbW9uLmlzc3Vlcykscy5yZXN1bHQ7Y29uc3QgbD1vLm1hcChzPT5uZXcgd3Iocy5jdHguY29tbW9uLmlzc3VlcykpO3JldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpsfSkseWV9aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIG89Pntjb25zdCBsPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfSxwYXJlbnQ6bnVsbH07cmV0dXJue3Jlc3VsdDphd2FpdCBvLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bH0pLGN0eDpsfX0pKS50aGVuKGkpO3tsZXQgbztjb25zdCBsPVtdO2Zvcihjb25zdCBhIG9mIHIpe2NvbnN0IHU9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfSxjPWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnV9KTtpZihjLnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIGM7Yy5zdGF0dXM9PT0iZGlydHkiJiYhbyYmKG89e3Jlc3VsdDpjLGN0eDp1fSksdS5jb21tb24uaXNzdWVzLmxlbmd0aCYmbC5wdXNoKHUuY29tbW9uLmlzc3Vlcyl9aWYobylyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4uby5jdHguY29tbW9uLmlzc3Vlcyksby5yZXN1bHQ7Y29uc3Qgcz1sLm1hcChhPT5uZXcgd3IoYSkpO3JldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpzfSkseWV9fWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zfX1tdS5jcmVhdGU9KHQsZSk9Pm5ldyBtdSh7b3B0aW9uczp0LHR5cGVOYW1lOmhlLlpvZFVuaW9uLC4uLnhlKGUpfSk7Y29uc3QgSGM9dD0+dCBpbnN0YW5jZW9mIHh1P0hjKHQuc2NoZW1hKTp0IGluc3RhbmNlb2Yga3I/SGModC5pbm5lclR5cGUoKSk6dCBpbnN0YW5jZW9mIF91P1t0LnZhbHVlXTp0IGluc3RhbmNlb2YgY28/dC5vcHRpb25zOnQgaW5zdGFuY2VvZiB3dT9PYmplY3Qua2V5cyh0LmVudW0pOnQgaW5zdGFuY2VvZiBTdT9IYyh0Ll9kZWYuaW5uZXJUeXBlKTp0IGluc3RhbmNlb2YgcHU/W3ZvaWQgMF06dCBpbnN0YW5jZW9mIGd1P1tudWxsXTpudWxsO2NsYXNzIElmIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0e2N0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09cS5vYmplY3QpcmV0dXJuIHRlKG4se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7Y29uc3Qgcj10aGlzLmRpc2NyaW1pbmF0b3IsaT1uLmRhdGFbcl0sbz10aGlzLm9wdGlvbnNNYXAuZ2V0KGkpO3JldHVybiBvP24uY29tbW9uLmFzeW5jP28uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk6by5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pOih0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLG9wdGlvbnM6QXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSxwYXRoOltyXX0pLHllKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsbixyKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1IYyhvLnNoYXBlW2VdKTtpZighbCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgcyBvZiBsKXtpZihpLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcocyl9YCk7aS5zZXQocyxvKX19cmV0dXJuIG5ldyBJZih7dHlwZU5hbWU6aGUuWm9kRGlzY3JpbWluYXRlZFVuaW9uLGRpc2NyaW1pbmF0b3I6ZSxvcHRpb25zOm4sb3B0aW9uc01hcDppLC4uLnhlKHIpfSl9fWZ1bmN0aW9uIHpnKHQsZSl7Y29uc3Qgbj16aSh0KSxyPXppKGUpO2lmKHQ9PT1lKXJldHVybnt2YWxpZDohMCxkYXRhOnR9O2lmKG49PT1xLm9iamVjdCYmcj09PXEub2JqZWN0KXtjb25zdCBpPURlLm9iamVjdEtleXMoZSksbz1EZS5vYmplY3RLZXlzKHQpLmZpbHRlcihzPT5pLmluZGV4T2YocykhPT0tMSksbD17Li4udCwuLi5lfTtmb3IoY29uc3QgcyBvZiBvKXtjb25zdCBhPXpnKHRbc10sZVtzXSk7aWYoIWEudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtsW3NdPWEuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTpsfX1lbHNlIGlmKG49PT1xLmFycmF5JiZyPT09cS5hcnJheSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGw9dFtvXSxzPWVbb10sYT16ZyhsLHMpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMX07aS5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6aX19ZWxzZSByZXR1cm4gbj09PXEuZGF0ZSYmcj09PXEuZGF0ZSYmK3Q9PStlP3t2YWxpZDohMCxkYXRhOnR9Ont2YWxpZDohMX19Y2xhc3MgdnUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxpPShvLGwpPT57aWYoRGcobyl8fERnKGwpKXJldHVybiB5ZTtjb25zdCBzPXpnKG8udmFsdWUsbC52YWx1ZSk7cmV0dXJuIHMudmFsaWQ/KChqZyhvKXx8amcobCkpJiZuLmRpcnR5KCkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMuZGF0YX0pOih0ZShyLHtjb2RlOlYuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSx5ZSl9O3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChbdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSksdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pXSkudGhlbigoW28sbF0pPT5pKG8sbCkpOmkodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSl9fXZ1LmNyZWF0ZT0odCxlLG4pPT5uZXcgdnUoe2xlZnQ6dCxyaWdodDplLHR5cGVOYW1lOmhlLlpvZEludGVyc2VjdGlvbiwuLi54ZShuKX0pO2NsYXNzIEtyIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYoci5wYXJzZWRUeXBlIT09cS5hcnJheSlyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLmFycmF5LHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLHllO2lmKHIuZGF0YS5sZW5ndGg8dGhpcy5fZGVmLml0ZW1zLmxlbmd0aClyZXR1cm4gdGUocix7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHllOyF0aGlzLl9kZWYucmVzdCYmci5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYodGUocix7Y29kZTpWLnRvb19iaWcsbWF4aW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxuLmRpcnR5KCkpO2NvbnN0IG89Wy4uLnIuZGF0YV0ubWFwKChsLHMpPT57Y29uc3QgYT10aGlzLl9kZWYuaXRlbXNbc118fHRoaXMuX2RlZi5yZXN0O3JldHVybiBhP2EuX3BhcnNlKG5ldyBIcihyLGwsci5wYXRoLHMpKTpudWxsfSkuZmlsdGVyKGw9PiEhbCk7cmV0dXJuIHIuY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKG8pLnRoZW4obD0+b24ubWVyZ2VBcnJheShuLGwpKTpvbi5tZXJnZUFycmF5KG4sbyl9Z2V0IGl0ZW1zKCl7cmV0dXJuIHRoaXMuX2RlZi5pdGVtc31yZXN0KGUpe3JldHVybiBuZXcgS3Ioey4uLnRoaXMuX2RlZixyZXN0OmV9KX19S3IuY3JlYXRlPSh0LGUpPT57aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgS3Ioe2l0ZW1zOnQsdHlwZU5hbWU6aGUuWm9kVHVwbGUscmVzdDpudWxsLC4uLnhlKGUpfSl9O2NsYXNzIHl1IGV4dGVuZHMgQ2V7Z2V0IGtleVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYua2V5VHlwZX1nZXQgdmFsdWVTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLm9iamVjdClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm9iamVjdCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPVtdLG89dGhpcy5fZGVmLmtleVR5cGUsbD10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBzIGluIHIuZGF0YSlpLnB1c2goe2tleTpvLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxzKSksdmFsdWU6bC5fcGFyc2UobmV3IEhyKHIsci5kYXRhW3NdLHIucGF0aCxzKSl9KTtyZXR1cm4gci5jb21tb24uYXN5bmM/b24ubWVyZ2VPYmplY3RBc3luYyhuLGkpOm9uLm1lcmdlT2JqZWN0U3luYyhuLGkpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLG4scil7cmV0dXJuIG4gaW5zdGFuY2VvZiBDZT9uZXcgeXUoe2tleVR5cGU6ZSx2YWx1ZVR5cGU6bix0eXBlTmFtZTpoZS5ab2RSZWNvcmQsLi4ueGUocil9KTpuZXcgeXUoe2tleVR5cGU6eXIuY3JlYXRlKCksdmFsdWVUeXBlOmUsdHlwZU5hbWU6aGUuWm9kUmVjb3JkLC4uLnhlKG4pfSl9fWNsYXNzIEhkIGV4dGVuZHMgQ2V7Z2V0IGtleVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYua2V5VHlwZX1nZXQgdmFsdWVTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLm1hcClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm1hcCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPXRoaXMuX2RlZi5rZXlUeXBlLG89dGhpcy5fZGVmLnZhbHVlVHlwZSxsPVsuLi5yLmRhdGEuZW50cmllcygpXS5tYXAoKFtzLGFdLHUpPT4oe2tleTppLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxbdSwia2V5Il0pKSx2YWx1ZTpvLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCxbdSwidmFsdWUiXSkpfSkpO2lmKHIuY29tbW9uLmFzeW5jKXtjb25zdCBzPW5ldyBNYXA7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2Zvcihjb25zdCBhIG9mIGwpe2NvbnN0IHU9YXdhaXQgYS5rZXksYz1hd2FpdCBhLnZhbHVlO2lmKHUuc3RhdHVzPT09ImFib3J0ZWQifHxjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7KHUuc3RhdHVzPT09ImRpcnR5Inx8Yy5zdGF0dXM9PT0iZGlydHkiKSYmbi5kaXJ0eSgpLHMuc2V0KHUudmFsdWUsYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fSl9ZWxzZXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgbCl7Y29uc3QgdT1hLmtleSxjPWEudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGMuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiB5ZTsodS5zdGF0dXM9PT0iZGlydHkifHxjLnN0YXR1cz09PSJkaXJ0eSIpJiZuLmRpcnR5KCkscy5zZXQodS52YWx1ZSxjLnZhbHVlKX1yZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6c319fX1IZC5jcmVhdGU9KHQsZSxuKT0+bmV3IEhkKHt2YWx1ZVR5cGU6ZSxrZXlUeXBlOnQsdHlwZU5hbWU6aGUuWm9kTWFwLC4uLnhlKG4pfSk7Y2xhc3MgWG8gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLnNldClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnNldCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPXRoaXMuX2RlZjtpLm1pblNpemUhPT1udWxsJiZyLmRhdGEuc2l6ZTxpLm1pblNpemUudmFsdWUmJih0ZShyLHtjb2RlOlYudG9vX3NtYWxsLG1pbmltdW06aS5taW5TaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5taW5TaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpLGkubWF4U2l6ZSE9PW51bGwmJnIuZGF0YS5zaXplPmkubWF4U2l6ZS52YWx1ZSYmKHRlKHIse2NvZGU6Vi50b29fYmlnLG1heGltdW06aS5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5tYXhTaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2NvbnN0IG89dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgYyBvZiBhKXtpZihjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7Yy5zdGF0dXM9PT0iZGlydHkiJiZuLmRpcnR5KCksdS5hZGQoYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnV9fWNvbnN0IHM9Wy4uLnIuZGF0YS52YWx1ZXMoKV0ubWFwKChhLHUpPT5vLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCx1KSkpO3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChzKS50aGVuKGE9PmwoYSkpOmwocyl9bWluKGUsbil7cmV0dXJuIG5ldyBYbyh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpmZS50b1N0cmluZyhuKX19KX1tYXgoZSxuKXtyZXR1cm4gbmV3IFhvKHsuLi50aGlzLl9kZWYsbWF4U2l6ZTp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfXNpemUoZSxuKXtyZXR1cm4gdGhpcy5taW4oZSxuKS5tYXgoZSxuKX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WG8uY3JlYXRlPSh0LGUpPT5uZXcgWG8oe3ZhbHVlVHlwZTp0LG1pblNpemU6bnVsbCxtYXhTaXplOm51bGwsdHlwZU5hbWU6aGUuWm9kU2V0LC4uLnhlKGUpfSk7Y2xhc3MgUWwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy52YWxpZGF0ZT10aGlzLmltcGxlbWVudH1fcGFyc2UoZSl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihuLnBhcnNlZFR5cGUhPT1xLmZ1bmN0aW9uKXJldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuZnVuY3Rpb24scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7ZnVuY3Rpb24gcihzLGEpe3JldHVybiBCZCh7ZGF0YTpzLHBhdGg6bi5wYXRoLGVycm9yTWFwczpbbi5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLG4uc2NoZW1hRXJyb3JNYXAsRmQoKSxkdV0uZmlsdGVyKHU9PiEhdSksaXNzdWVEYXRhOntjb2RlOlYuaW52YWxpZF9hcmd1bWVudHMsYXJndW1lbnRzRXJyb3I6YX19KX1mdW5jdGlvbiBpKHMsYSl7cmV0dXJuIEJkKHtkYXRhOnMscGF0aDpuLnBhdGgsZXJyb3JNYXBzOltuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsbi5zY2hlbWFFcnJvck1hcCxGZCgpLGR1XS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6Vi5pbnZhbGlkX3JldHVybl90eXBlLHJldHVyblR5cGVFcnJvcjphfX0pfWNvbnN0IG89e2Vycm9yTWFwOm4uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcH0sbD1uLmRhdGE7aWYodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBwcyl7Y29uc3Qgcz10aGlzO3JldHVybiB5bihhc3luYyBmdW5jdGlvbiguLi5hKXtjb25zdCB1PW5ldyB3cihbXSksYz1hd2FpdCBzLl9kZWYuYXJncy5wYXJzZUFzeW5jKGEsbykuY2F0Y2goaD0+e3Rocm93IHUuYWRkSXNzdWUocihhLGgpKSx1fSksZD1hd2FpdCBSZWZsZWN0LmFwcGx5KGwsdGhpcyxjKTtyZXR1cm4gYXdhaXQgcy5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZCxvKS5jYXRjaChoPT57dGhyb3cgdS5hZGRJc3N1ZShpKGQsaCkpLHV9KX0pfWVsc2V7Y29uc3Qgcz10aGlzO3JldHVybiB5bihmdW5jdGlvbiguLi5hKXtjb25zdCB1PXMuX2RlZi5hcmdzLnNhZmVQYXJzZShhLG8pO2lmKCF1LnN1Y2Nlc3MpdGhyb3cgbmV3IHdyKFtyKGEsdS5lcnJvcildKTtjb25zdCBjPVJlZmxlY3QuYXBwbHkobCx0aGlzLHUuZGF0YSksZD1zLl9kZWYucmV0dXJucy5zYWZlUGFyc2UoYyxvKTtpZighZC5zdWNjZXNzKXRocm93IG5ldyB3cihbaShjLGQuZXJyb3IpXSk7cmV0dXJuIGQuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IFFsKHsuLi50aGlzLl9kZWYsYXJnczpLci5jcmVhdGUoZSkucmVzdCh6by5jcmVhdGUoKSl9KX1yZXR1cm5zKGUpe3JldHVybiBuZXcgUWwoey4uLnRoaXMuX2RlZixyZXR1cm5zOmV9KX1pbXBsZW1lbnQoZSl7cmV0dXJuIHRoaXMucGFyc2UoZSl9c3RyaWN0SW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0YXRpYyBjcmVhdGUoZSxuLHIpe3JldHVybiBuZXcgUWwoe2FyZ3M6ZXx8S3IuY3JlYXRlKFtdKS5yZXN0KHpvLmNyZWF0ZSgpKSxyZXR1cm5zOm58fHpvLmNyZWF0ZSgpLHR5cGVOYW1lOmhlLlpvZEZ1bmN0aW9uLC4uLnhlKHIpfSl9fWNsYXNzIHh1IGV4dGVuZHMgQ2V7Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCl9X3BhcnNlKGUpe2NvbnN0e2N0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7cmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKS5fcGFyc2Uoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXh1LmNyZWF0ZT0odCxlKT0+bmV3IHh1KHtnZXR0ZXI6dCx0eXBlTmFtZTpoZS5ab2RMYXp5LC4uLnhlKGUpfSk7Y2xhc3MgX3UgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYoZS5kYXRhIT09dGhpcy5fZGVmLnZhbHVlKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShuLHtyZWNlaXZlZDpuLmRhdGEsY29kZTpWLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSx5ZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlfX1fdS5jcmVhdGU9KHQsZSk9Pm5ldyBfdSh7dmFsdWU6dCx0eXBlTmFtZTpoZS5ab2RMaXRlcmFsLC4uLnhlKGUpfSk7ZnVuY3Rpb24gTkModCxlKXtyZXR1cm4gbmV3IGNvKHt2YWx1ZXM6dCx0eXBlTmFtZTpoZS5ab2RFbnVtLC4uLnhlKGUpfSl9Y2xhc3MgY28gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodHlwZW9mIGUuZGF0YSE9InN0cmluZyIpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSkscj10aGlzLl9kZWYudmFsdWVzO3JldHVybiB0ZShuLHtleHBlY3RlZDpEZS5qb2luVmFsdWVzKHIpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOlYuaW52YWxpZF90eXBlfSkseWV9aWYodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKGUuZGF0YSk9PT0tMSl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKSxyPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIHRlKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOlYuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6cn0pLHllfXJldHVybiB5bihlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpZVtuXT1uO3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpZVtuXT1uO3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYudmFsdWVzKWVbbl09bjtyZXR1cm4gZX1leHRyYWN0KGUpe3JldHVybiBjby5jcmVhdGUoZSl9ZXhjbHVkZShlKXtyZXR1cm4gY28uY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpKX19Y28uY3JlYXRlPU5DO2NsYXNzIHd1IGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49RGUuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpLHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7aWYoci5wYXJzZWRUeXBlIT09cS5zdHJpbmcmJnIucGFyc2VkVHlwZSE9PXEubnVtYmVyKXtjb25zdCBpPURlLm9iamVjdFZhbHVlcyhuKTtyZXR1cm4gdGUocix7ZXhwZWN0ZWQ6RGUuam9pblZhbHVlcyhpKSxyZWNlaXZlZDpyLnBhcnNlZFR5cGUsY29kZTpWLmludmFsaWRfdHlwZX0pLHllfWlmKG4uaW5kZXhPZihlLmRhdGEpPT09LTEpe2NvbnN0IGk9RGUub2JqZWN0VmFsdWVzKG4pO3JldHVybiB0ZShyLHtyZWNlaXZlZDpyLmRhdGEsY29kZTpWLmludmFsaWRfZW51bV92YWx1ZSxvcHRpb25zOml9KSx5ZX1yZXR1cm4geW4oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13dS5jcmVhdGU9KHQsZSk9Pm5ldyB3dSh7dmFsdWVzOnQsdHlwZU5hbWU6aGUuWm9kTmF0aXZlRW51bSwuLi54ZShlKX0pO2NsYXNzIHBzIGV4dGVuZHMgQ2V7dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PXEucHJvbWlzZSYmbi5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gdGUobix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnByb21pc2UscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7Y29uc3Qgcj1uLnBhcnNlZFR5cGU9PT1xLnByb21pc2U/bi5kYXRhOlByb21pc2UucmVzb2x2ZShuLmRhdGEpO3JldHVybiB5bihyLnRoZW4oaT0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhpLHtwYXRoOm4ucGF0aCxlcnJvck1hcDpuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1wcy5jcmVhdGU9KHQsZSk9Pm5ldyBwcyh7dHlwZTp0LHR5cGVOYW1lOmhlLlpvZFByb21pc2UsLi4ueGUoZSl9KTtjbGFzcyBrciBleHRlbmRzIENle2lubmVyVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hfXNvdXJjZVR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lPT09aGUuWm9kRWZmZWN0cz90aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKTp0aGlzLl9kZWYuc2NoZW1hfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6bixjdHg6cn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLGk9dGhpcy5fZGVmLmVmZmVjdHx8bnVsbCxvPXthZGRJc3N1ZTpsPT57dGUocixsKSxsLmZhdGFsP24uYWJvcnQoKTpuLmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIHIucGF0aH19O2lmKG8uYWRkSXNzdWU9by5hZGRJc3N1ZS5iaW5kKG8pLGkudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgbD1pLnRyYW5zZm9ybShyLmRhdGEsbyk7cmV0dXJuIHIuY29tbW9uLmlzc3Vlcy5sZW5ndGg/e3N0YXR1czoiZGlydHkiLHZhbHVlOnIuZGF0YX06ci5jb21tb24uYXN5bmM/UHJvbWlzZS5yZXNvbHZlKGwpLnRoZW4ocz0+dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpzLHBhdGg6ci5wYXRoLHBhcmVudDpyfSkpOnRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpsLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9aWYoaS50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBsPXM9Pntjb25zdCBhPWkucmVmaW5lbWVudChzLG8pO2lmKHIuY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBzfTtpZihyLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBzPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/eWU6KHMuc3RhdHVzPT09ImRpcnR5IiYmbi5kaXJ0eSgpLGwocy52YWx1ZSkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMudmFsdWV9KX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLnRoZW4ocz0+cy5zdGF0dXM9PT0iYWJvcnRlZCI/eWU6KHMuc3RhdHVzPT09ImRpcnR5IiYmbi5kaXJ0eSgpLGwocy52YWx1ZSkudGhlbigoKT0+KHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzLnZhbHVlfSkpKSl9aWYoaS50eXBlPT09InRyYW5zZm9ybSIpaWYoci5jb21tb24uYXN5bmM9PT0hMSl7Y29uc3QgbD10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSk7aWYoIWZ1KGwpKXJldHVybiBsO2NvbnN0IHM9aS50cmFuc2Zvcm0obC52YWx1ZSxvKTtpZihzIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuIik7cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSkudGhlbihsPT5mdShsKT9Qcm9taXNlLnJlc29sdmUoaS50cmFuc2Zvcm0obC52YWx1ZSxvKSkudGhlbihzPT4oe3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9KSk6bCk7RGUuYXNzZXJ0TmV2ZXIoaSl9fWtyLmNyZWF0ZT0odCxlLG4pPT5uZXcga3Ioe3NjaGVtYTp0LHR5cGVOYW1lOmhlLlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4ueGUobil9KTtrci5jcmVhdGVXaXRoUHJlcHJvY2Vzcz0odCxlLG4pPT5uZXcga3Ioe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnR9LHR5cGVOYW1lOmhlLlpvZEVmZmVjdHMsLi4ueGUobil9KTtjbGFzcyBjaSBleHRlbmRzIENle19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PXEudW5kZWZpbmVkP3luKHZvaWQgMCk6dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fWNpLmNyZWF0ZT0odCxlKT0+bmV3IGNpKHtpbm5lclR5cGU6dCx0eXBlTmFtZTpoZS5ab2RPcHRpb25hbCwuLi54ZShlKX0pO2NsYXNzIFFvIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09cS5udWxsP3luKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1Rby5jcmVhdGU9KHQsZSk9Pm5ldyBRbyh7aW5uZXJUeXBlOnQsdHlwZU5hbWU6aGUuWm9kTnVsbGFibGUsLi4ueGUoZSl9KTtjbGFzcyBTdSBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2xldCByPW4uZGF0YTtyZXR1cm4gbi5wYXJzZWRUeXBlPT09cS51bmRlZmluZWQmJihyPXRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKSksdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXJlbW92ZURlZmF1bHQoKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19U3UuY3JlYXRlPSh0LGUpPT5uZXcgU3Uoe2lubmVyVHlwZTp0LHR5cGVOYW1lOmhlLlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4ueGUoZSl9KTtjbGFzcyBLZCBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119fSxpPXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6ey4uLnJ9fSk7cmV0dXJuIFVkKGkpP2kudGhlbihvPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOm8uc3RhdHVzPT09InZhbGlkIj9vLnZhbHVlOnRoaXMuX2RlZi5jYXRjaFZhbHVlKHtnZXQgZXJyb3IoKXtyZXR1cm4gbmV3IHdyKHIuY29tbW9uLmlzc3Vlcyl9LGlucHV0OnIuZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTppLnN0YXR1cz09PSJ2YWxpZCI/aS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyB3cihyLmNvbW1vbi5pc3N1ZXMpfSxpbnB1dDpyLmRhdGF9KX19cmVtb3ZlQ2F0Y2goKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19S2QuY3JlYXRlPSh0LGUpPT5uZXcgS2Qoe2lubmVyVHlwZTp0LHR5cGVOYW1lOmhlLlpvZENhdGNoLGNhdGNoVmFsdWU6dHlwZW9mIGUuY2F0Y2g9PSJmdW5jdGlvbiI/ZS5jYXRjaDooKT0+ZS5jYXRjaCwuLi54ZShlKX0pO2NsYXNzIFpkIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLm5hbil7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm5hbixyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19WmQuY3JlYXRlPXQ9Pm5ldyBaZCh7dHlwZU5hbWU6aGUuWm9kTmFOLC4uLnhlKHQpfSk7Y29uc3QgVDU9U3ltYm9sKCJ6b2RfYnJhbmQiKTtjbGFzcyBSQyBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9bi5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgVXUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2NvbnN0IG89YXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj95ZTpvLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSxUQyhvLnZhbHVlKSk6dGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7ZGF0YTpvLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9KSgpO3tjb25zdCBpPXRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBpLnN0YXR1cz09PSJhYm9ydGVkIj95ZTppLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6aS52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTppLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9fXN0YXRpYyBjcmVhdGUoZSxuKXtyZXR1cm4gbmV3IFV1KHtpbjplLG91dDpuLHR5cGVOYW1lOmhlLlpvZFBpcGVsaW5lfSl9fWNsYXNzIEdkIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSk7cmV0dXJuIGZ1KG4pJiYobi52YWx1ZT1PYmplY3QuZnJlZXplKG4udmFsdWUpKSxufX1HZC5jcmVhdGU9KHQsZSk9Pm5ldyBHZCh7aW5uZXJUeXBlOnQsdHlwZU5hbWU6aGUuWm9kUmVhZG9ubHksLi4ueGUoZSl9KTtjb25zdCBPQz0odCxlPXt9LG4pPT50P2hzLmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChyLGkpPT57dmFyIG8sbDtpZighdChyKSl7Y29uc3Qgcz10eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHIpOnR5cGVvZiBlPT0ic3RyaW5nIj97bWVzc2FnZTplfTplLGE9KGw9KG89cy5mYXRhbCkhPT1udWxsJiZvIT09dm9pZCAwP286bikhPT1udWxsJiZsIT09dm9pZCAwP2w6ITAsdT10eXBlb2Ygcz09InN0cmluZyI/e21lc3NhZ2U6c306cztpLmFkZElzc3VlKHtjb2RlOiJjdXN0b20iLC4uLnUsZmF0YWw6YX0pfX0pOmhzLmNyZWF0ZSgpLE41PXtvYmplY3Q6Y3QubGF6eWNyZWF0ZX07dmFyIGhlOyhmdW5jdGlvbih0KXt0LlpvZFN0cmluZz0iWm9kU3RyaW5nIix0LlpvZE51bWJlcj0iWm9kTnVtYmVyIix0LlpvZE5hTj0iWm9kTmFOIix0LlpvZEJpZ0ludD0iWm9kQmlnSW50Iix0LlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHQuWm9kRGF0ZT0iWm9kRGF0ZSIsdC5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsdC5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsdC5ab2ROdWxsPSJab2ROdWxsIix0LlpvZEFueT0iWm9kQW55Iix0LlpvZFVua25vd249IlpvZFVua25vd24iLHQuWm9kTmV2ZXI9IlpvZE5ldmVyIix0LlpvZFZvaWQ9IlpvZFZvaWQiLHQuWm9kQXJyYXk9IlpvZEFycmF5Iix0LlpvZE9iamVjdD0iWm9kT2JqZWN0Iix0LlpvZFVuaW9uPSJab2RVbmlvbiIsdC5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsdC5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsdC5ab2RUdXBsZT0iWm9kVHVwbGUiLHQuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHQuWm9kTWFwPSJab2RNYXAiLHQuWm9kU2V0PSJab2RTZXQiLHQuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIix0LlpvZExhenk9IlpvZExhenkiLHQuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsdC5ab2RFbnVtPSJab2RFbnVtIix0LlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHQuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsdC5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHQuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIix0LlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHQuWm9kQ2F0Y2g9IlpvZENhdGNoIix0LlpvZFByb21pc2U9IlpvZFByb21pc2UiLHQuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsdC5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHQuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKGhlfHwoaGU9e30pKTtjb25zdCBSNT0odCxlPXttZXNzYWdlOmBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHt0Lm5hbWV9YH0pPT5PQyhuPT5uIGluc3RhbmNlb2YgdCxlKSxQQz15ci5jcmVhdGUsQUM9YW8uY3JlYXRlLE81PVpkLmNyZWF0ZSxQNT11by5jcmVhdGUsTUM9aHUuY3JlYXRlLEE1PVlvLmNyZWF0ZSxNNT1XZC5jcmVhdGUsTDU9cHUuY3JlYXRlLEk1PWd1LmNyZWF0ZSxENT1ocy5jcmVhdGUsajU9em8uY3JlYXRlLHo1PWdpLmNyZWF0ZSxGNT1WZC5jcmVhdGUsQjU9U3IuY3JlYXRlLFU1PWN0LmNyZWF0ZSxXNT1jdC5zdHJpY3RDcmVhdGUsVjU9bXUuY3JlYXRlLEg1PUlmLmNyZWF0ZSxLNT12dS5jcmVhdGUsWjU9S3IuY3JlYXRlLEc1PXl1LmNyZWF0ZSxZNT1IZC5jcmVhdGUsWDU9WG8uY3JlYXRlLFE1PVFsLmNyZWF0ZSxKNT14dS5jcmVhdGUscTU9X3UuY3JlYXRlLGUzPWNvLmNyZWF0ZSx0Mz13dS5jcmVhdGUsbjM9cHMuY3JlYXRlLE54PWtyLmNyZWF0ZSxyMz1jaS5jcmVhdGUsaTM9UW8uY3JlYXRlLG8zPWtyLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLGwzPVV1LmNyZWF0ZSxzMz0oKT0+UEMoKS5vcHRpb25hbCgpLGEzPSgpPT5BQygpLm9wdGlvbmFsKCksdTM9KCk9Pk1DKCkub3B0aW9uYWwoKSxjMz17c3RyaW5nOnQ9PnlyLmNyZWF0ZSh7Li4udCxjb2VyY2U6ITB9KSxudW1iZXI6dD0+YW8uY3JlYXRlKHsuLi50LGNvZXJjZTohMH0pLGJvb2xlYW46dD0+aHUuY3JlYXRlKHsuLi50LGNvZXJjZTohMH0pLGJpZ2ludDp0PT51by5jcmVhdGUoey4uLnQsY29lcmNlOiEwfSksZGF0ZTp0PT5Zby5jcmVhdGUoey4uLnQsY29lcmNlOiEwfSl9LGQzPXllO3ZhciBDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6ZHUsc2V0RXJyb3JNYXA6ZzUsZ2V0RXJyb3JNYXA6RmQsbWFrZUlzc3VlOkJkLEVNUFRZX1BBVEg6bTUsYWRkSXNzdWVUb0NvbnRleHQ6dGUsUGFyc2VTdGF0dXM6b24sSU5WQUxJRDp5ZSxESVJUWTpUQyxPSzp5bixpc0Fib3J0ZWQ6RGcsaXNEaXJ0eTpqZyxpc1ZhbGlkOmZ1LGlzQXN5bmM6VWQsZ2V0IHV0aWwoKXtyZXR1cm4gRGV9LGdldCBvYmplY3RVdGlsKCl7cmV0dXJuIElnfSxab2RQYXJzZWRUeXBlOnEsZ2V0UGFyc2VkVHlwZTp6aSxab2RUeXBlOkNlLFpvZFN0cmluZzp5cixab2ROdW1iZXI6YW8sWm9kQmlnSW50OnVvLFpvZEJvb2xlYW46aHUsWm9kRGF0ZTpZbyxab2RTeW1ib2w6V2QsWm9kVW5kZWZpbmVkOnB1LFpvZE51bGw6Z3UsWm9kQW55OmhzLFpvZFVua25vd246em8sWm9kTmV2ZXI6Z2ksWm9kVm9pZDpWZCxab2RBcnJheTpTcixab2RPYmplY3Q6Y3QsWm9kVW5pb246bXUsWm9kRGlzY3JpbWluYXRlZFVuaW9uOklmLFpvZEludGVyc2VjdGlvbjp2dSxab2RUdXBsZTpLcixab2RSZWNvcmQ6eXUsWm9kTWFwOkhkLFpvZFNldDpYbyxab2RGdW5jdGlvbjpRbCxab2RMYXp5Onh1LFpvZExpdGVyYWw6X3UsWm9kRW51bTpjbyxab2ROYXRpdmVFbnVtOnd1LFpvZFByb21pc2U6cHMsWm9kRWZmZWN0czprcixab2RUcmFuc2Zvcm1lcjprcixab2RPcHRpb25hbDpjaSxab2ROdWxsYWJsZTpRbyxab2REZWZhdWx0OlN1LFpvZENhdGNoOktkLFpvZE5hTjpaZCxCUkFORDpUNSxab2RCcmFuZGVkOlJDLFpvZFBpcGVsaW5lOlV1LFpvZFJlYWRvbmx5OkdkLGN1c3RvbTpPQyxTY2hlbWE6Q2UsWm9kU2NoZW1hOkNlLGxhdGU6TjUsZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCgpe3JldHVybiBoZX0sY29lcmNlOmMzLGFueTpENSxhcnJheTpCNSxiaWdpbnQ6UDUsYm9vbGVhbjpNQyxkYXRlOkE1LGRpc2NyaW1pbmF0ZWRVbmlvbjpINSxlZmZlY3Q6TngsZW51bTplMyxmdW5jdGlvbjpRNSxpbnN0YW5jZW9mOlI1LGludGVyc2VjdGlvbjpLNSxsYXp5Oko1LGxpdGVyYWw6cTUsbWFwOlk1LG5hbjpPNSxuYXRpdmVFbnVtOnQzLG5ldmVyOno1LG51bGw6STUsbnVsbGFibGU6aTMsbnVtYmVyOkFDLG9iamVjdDpVNSxvYm9vbGVhbjp1MyxvbnVtYmVyOmEzLG9wdGlvbmFsOnIzLG9zdHJpbmc6czMscGlwZWxpbmU6bDMscHJlcHJvY2VzczpvMyxwcm9taXNlOm4zLHJlY29yZDpHNSxzZXQ6WDUsc3RyaWN0T2JqZWN0Olc1LHN0cmluZzpQQyxzeW1ib2w6TTUsdHJhbnNmb3JtZXI6TngsdHVwbGU6WjUsdW5kZWZpbmVkOkw1LHVuaW9uOlY1LHVua25vd246ajUsdm9pZDpGNSxORVZFUjpkMyxab2RJc3N1ZUNvZGU6VixxdW90ZWxlc3NKc29uOnA1LFpvZEVycm9yOndyfSk7Y29uc3QgZjM9Q24udW5pb24oW0NuLm9iamVjdCh7aWQ6Q24uc3RyaW5nKCksbW9kZTpDbi5saXRlcmFsKCJwcm94eSIpLGZ1bGxfbmFtZTpDbi5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksdXNlcm5hbWU6Q24uc3RyaW5nKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLGF2YXRhcl91cmw6Q24uc3RyaW5nKCkudXJsKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLGVuYWJsZWQ6Q24uYm9vbGVhbigpfSksQ24ub2JqZWN0KHttb2RlOkNuLmxpdGVyYWwoImxvY2FsIiksZW5hYmxlZDpDbi5ib29sZWFuKCkub3B0aW9uYWwoKX0pLENuLm9iamVjdCh7bW9kZTpDbi5saXRlcmFsKCJ1bmF1dGhvcml6ZWQiKSxlbmFibGVkOkNuLmJvb2xlYW4oKS5vcHRpb25hbCgpfSldKTtmdW5jdGlvbiBoMyh0KXtjb25zdFtlLG5dPXAudXNlU3RhdGUoe3N0YXR1czoibm90LWFza2VkIn0pLFtyLGldPXAudXNlU3RhdGUoMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bih7c3RhdHVzOiJsb2FkaW5nIn0pLHQuZ2V0U2Vzc2lvbigpLnRoZW4oYXN5bmMgbz0+e3RyeXtpZihMby5pc09rKG8pKXtjb25zdCBsPW8udmFsdWU7bih7c3RhdHVzOiJzdWNjZXNzIixkYXRhOmYzLnBhcnNlKGwpfSl9ZWxzZSBvLmVycm9yLnN0YXR1c0NvZGU9PT00MDE/bih7c3RhdHVzOiJzdWNjZXNzIixkYXRhOnttb2RlOiJ1bmF1dGhvcml6ZWQifX0pOnI8Mz9zZXRUaW1lb3V0KCgpPT57aShyKzEpfSwyMDAqcik6bih7c3RhdHVzOiJlcnJvciIsZXJyb3I6IkNvdWxkIG5vdCBmZXRjaCBzZXNzaW9uIn0pfWNhdGNoKGwpe2NvbnNvbGUuZXJyb3IoIkNvdWxkIG5vdCBhdXRob3JpemU6IixsKSxuKHtzdGF0dXM6ImVycm9yIixlcnJvcjoiR290IGFuIGVycm9yIHdoaWxlIHRyeWluZyB0byBnZXQgc2Vzc2lvbiJ9KX19KX0sW3JdKSxlfWNvbnN0IFJ4PXQ9PnR5cGVvZiB0PT0iYm9vbGVhbiI/IiIuY29uY2F0KHQpOnQ9PT0wPyIwIjp0LE94PXVTLHAzPSh0LGUpPT5uPT57dmFyIHI7aWYoKGU9PW51bGw/dm9pZCAwOmUudmFyaWFudHMpPT1udWxsKXJldHVybiBPeCh0LG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpO2NvbnN0e3ZhcmlhbnRzOmksZGVmYXVsdFZhcmlhbnRzOm99PWUsbD1PYmplY3Qua2V5cyhpKS5tYXAodT0+e2NvbnN0IGM9bj09bnVsbD92b2lkIDA6blt1XSxkPW89PW51bGw/dm9pZCAwOm9bdV07aWYoYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgZj1SeChjKXx8UngoZCk7cmV0dXJuIGlbdV1bZl19KSxzPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodSxjKT0+e2xldFtkLGZdPWM7cmV0dXJuIGY9PT12b2lkIDB8fCh1W2RdPWYpLHV9LHt9KSxhPWU9PW51bGx8fChyPWUuY29tcG91bmRWYXJpYW50cyk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnJlZHVjZSgodSxjKT0+e2xldHtjbGFzczpkLGNsYXNzTmFtZTpmLC4uLmh9PWM7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGgpLmV2ZXJ5KG09PntsZXRbZyx3XT1tO3JldHVybiBBcnJheS5pc0FycmF5KHcpP3cuaW5jbHVkZXMoey4uLm8sLi4uc31bZ10pOnsuLi5vLC4uLnN9W2ddPT09d30pP1suLi51LGQsZl06dX0sW10pO3JldHVybiBPeCh0LGwsYSxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzLG49PW51bGw/dm9pZCAwOm4uY2xhc3NOYW1lKX0sZzM9cDMoImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLW1kIHRleHQtc20gZm9udC1tZWRpdW0gcmluZy1vZmZzZXQtYmFja2dyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIix7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6ImJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeS85MCIsZGVzdHJ1Y3RpdmU6ImJnLWRlc3RydWN0aXZlIHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCIsb3V0bGluZToiYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixzZWNvbmRhcnk6ImJnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXNlY29uZGFyeS84MCIsZ2hvc3Q6ImhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixsaW5rOiJ0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZSJ9LHNpemU6e2RlZmF1bHQ6ImgtMTAgcHgtNCBweS0yIixzbToiaC05IHJvdW5kZWQtbWQgcHgtMyIsbGc6ImgtMTEgcm91bmRlZC1tZCBweC04IixpY29uOiJoLTEwIHctMTAifX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OiJkZWZhdWx0IixzaXplOiJkZWZhdWx0In19KSxNcz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCx2YXJpYW50OmUsc2l6ZTpuLGFzQ2hpbGQ6cj0hMSwuLi5pfSxvKT0+e2NvbnN0IGw9cj9hczoiYnV0dG9uIjtyZXR1cm4gXy5qc3gobCx7Y2xhc3NOYW1lOnh0KGczKHt2YXJpYW50OmUsc2l6ZTpuLGNsYXNzTmFtZTp0fSkpLHJlZjpvLC4uLml9KX0pO01zLmRpc3BsYXlOYW1lPSJCdXR0b24iO2NvbnN0IEZ2PXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LHR5cGU6ZSwuLi5ufSxyKT0+Xy5qc3goImlucHV0Iix7dHlwZTplLGNsYXNzTmFtZTp4dCgiZmxleCBoLTEwIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZpbGU6Ym9yZGVyLTAgZmlsZTpiZy10cmFuc3BhcmVudCBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIix0KSxyZWY6ciwuLi5ufSkpO0Z2LmRpc3BsYXlOYW1lPSJJbnB1dCI7ZnVuY3Rpb24gTEModCl7Y29uc3QgZT10KyJDb2xsZWN0aW9uUHJvdmlkZXIiLFtuLHJdPW9sKGUpLFtpLG9dPW4oZSx7Y29sbGVjdGlvblJlZjp7Y3VycmVudDpudWxsfSxpdGVtTWFwOm5ldyBNYXB9KSxsPWg9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOmd9PWgsdz1yZS51c2VSZWYobnVsbCksdj1yZS51c2VSZWYobmV3IE1hcCkuY3VycmVudDtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChpLHtzY29wZTptLGl0ZW1NYXA6dixjb2xsZWN0aW9uUmVmOnd9LGcpfSxzPXQrIkNvbGxlY3Rpb25TbG90IixhPXJlLmZvcndhcmRSZWYoKGgsbSk9Pntjb25zdHtzY29wZTpnLGNoaWxkcmVuOnd9PWgsdj1vKHMsZykseT1zdChtLHYuY29sbGVjdGlvblJlZik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoYXMse3JlZjp5fSx3KX0pLHU9dCsiQ29sbGVjdGlvbkl0ZW1TbG90IixjPSJkYXRhLXJhZGl4LWNvbGxlY3Rpb24taXRlbSIsZD1yZS5mb3J3YXJkUmVmKChoLG0pPT57Y29uc3R7c2NvcGU6ZyxjaGlsZHJlbjp3LC4uLnZ9PWgseT1yZS51c2VSZWYobnVsbCkseD1zdChtLHkpLFM9byh1LGcpO3JldHVybiByZS51c2VFZmZlY3QoKCk9PihTLml0ZW1NYXAuc2V0KHkse3JlZjp5LC4uLnZ9KSwoKT0+dm9pZCBTLml0ZW1NYXAuZGVsZXRlKHkpKSkscmUuY3JlYXRlRWxlbWVudChhcyx7W2NdOiIiLHJlZjp4fSx3KX0pO2Z1bmN0aW9uIGYoaCl7Y29uc3QgbT1vKHQrIkNvbGxlY3Rpb25Db25zdW1lciIsaCk7cmV0dXJuIHJlLnVzZUNhbGxiYWNrKCgpPT57Y29uc3Qgdz1tLmNvbGxlY3Rpb25SZWYuY3VycmVudDtpZighdylyZXR1cm5bXTtjb25zdCB2PUFycmF5LmZyb20ody5xdWVyeVNlbGVjdG9yQWxsKGBbJHtjfV1gKSk7cmV0dXJuIEFycmF5LmZyb20obS5pdGVtTWFwLnZhbHVlcygpKS5zb3J0KChTLGIpPT52LmluZGV4T2YoUy5yZWYuY3VycmVudCktdi5pbmRleE9mKGIucmVmLmN1cnJlbnQpKX0sW20uY29sbGVjdGlvblJlZixtLml0ZW1NYXBdKX1yZXR1cm5be1Byb3ZpZGVyOmwsU2xvdDphLEl0ZW1TbG90OmR9LGYscl19ZnVuY3Rpb24gbTModCxlPWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49ZW4odCk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCByPWk9PntpLmtleT09PSJFc2NhcGUiJiZuKGkpfTtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKSwoKT0+ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKX0sW24sZV0pfWNvbnN0IEZnPSJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZSIsdjM9ImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlIix5Mz0iZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGUiO2xldCBQeDtjb25zdCB4Mz1wLmNyZWF0ZUNvbnRleHQoe2xheWVyczpuZXcgU2V0LGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOm5ldyBTZXQsYnJhbmNoZXM6bmV3IFNldH0pLF8zPXAuZm9yd2FyZFJlZigodCxlKT0+e3ZhciBuO2NvbnN0e2Rpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czpyPSExLG9uRXNjYXBlS2V5RG93bjppLG9uUG9pbnRlckRvd25PdXRzaWRlOm8sb25Gb2N1c091dHNpZGU6bCxvbkludGVyYWN0T3V0c2lkZTpzLG9uRGlzbWlzczphLC4uLnV9PXQsYz1wLnVzZUNvbnRleHQoeDMpLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD0obj1kPT1udWxsP3ZvaWQgMDpkLm93bmVyRG9jdW1lbnQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOmdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQsWyxtXT1wLnVzZVN0YXRlKHt9KSxnPXN0KGUsTz0+ZihPKSksdz1BcnJheS5mcm9tKGMubGF5ZXJzKSxbdl09Wy4uLmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSx5PXcuaW5kZXhPZih2KSx4PWQ/dy5pbmRleE9mKGQpOi0xLFM9Yy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPjAsYj14Pj15LFQ9dzMoTz0+e2NvbnN0IEw9Ty50YXJnZXQsUD1bLi4uYy5icmFuY2hlc10uc29tZShEPT5ELmNvbnRhaW5zKEwpKTshYnx8UHx8KG89PW51bGx8fG8oTykscz09bnVsbHx8cyhPKSxPLmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpLCQ9UzMoTz0+e2NvbnN0IEw9Ty50YXJnZXQ7Wy4uLmMuYnJhbmNoZXNdLnNvbWUoRD0+RC5jb250YWlucyhMKSl8fChsPT1udWxsfHxsKE8pLHM9PW51bGx8fHMoTyksTy5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKTtyZXR1cm4gbTMoTz0+e3g9PT1jLmxheWVycy5zaXplLTEmJihpPT1udWxsfHxpKE8pLCFPLmRlZmF1bHRQcmV2ZW50ZWQmJmEmJihPLnByZXZlbnREZWZhdWx0KCksYSgpKSl9LGgpLHAudXNlRWZmZWN0KCgpPT57aWYoZClyZXR1cm4gciYmKGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTAmJihQeD1oLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKGQpKSxjLmxheWVycy5hZGQoZCksQXgoKSwoKT0+e3ImJmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTEmJihoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1QeCl9fSxbZCxoLHIsY10pLHAudXNlRWZmZWN0KCgpPT4oKT0+e2QmJihjLmxheWVycy5kZWxldGUoZCksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoZCksQXgoKSl9LFtkLGNdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IE89KCk9Pm0oe30pO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEZnLE8pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEZnLE8pfSxbXSkscC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSx1LHtyZWY6ZyxzdHlsZTp7cG9pbnRlckV2ZW50czpTP2I/ImF1dG8iOiJub25lIjp2b2lkIDAsLi4udC5zdHlsZX0sb25Gb2N1c0NhcHR1cmU6bnQodC5vbkZvY3VzQ2FwdHVyZSwkLm9uRm9jdXNDYXB0dXJlKSxvbkJsdXJDYXB0dXJlOm50KHQub25CbHVyQ2FwdHVyZSwkLm9uQmx1ckNhcHR1cmUpLG9uUG9pbnRlckRvd25DYXB0dXJlOm50KHQub25Qb2ludGVyRG93bkNhcHR1cmUsVC5vblBvaW50ZXJEb3duQ2FwdHVyZSl9KSl9KTtmdW5jdGlvbiB3Myh0LGU9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKCExKSxpPXAudXNlUmVmKCgpPT57fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgbz1zPT57aWYocy50YXJnZXQmJiFyLmN1cnJlbnQpe2xldCBjPWZ1bmN0aW9uKCl7SUModjMsbix1LHtkaXNjcmV0ZTohMH0pfTt2YXIgYT1jO2NvbnN0IHU9e29yaWdpbmFsRXZlbnQ6c307cy5wb2ludGVyVHlwZT09PSJ0b3VjaCI/KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCksaS5jdXJyZW50PWMsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50LHtvbmNlOiEwfSkpOmMoKX1lbHNlIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCk7ci5jdXJyZW50PSExfSxsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsbyl9LDApO3JldHVybigpPT57d2luZG93LmNsZWFyVGltZW91dChsKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixvKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixpLmN1cnJlbnQpfX0sW2Usbl0pLHtvblBvaW50ZXJEb3duQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwfX1mdW5jdGlvbiBTMyh0LGU9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBpPW89PntvLnRhcmdldCYmIXIuY3VycmVudCYmSUMoeTMsbix7b3JpZ2luYWxFdmVudDpvfSx7ZGlzY3JldGU6ITF9KX07cmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsaSksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsaSl9LFtlLG5dKSx7b25Gb2N1c0NhcHR1cmU6KCk9PnIuY3VycmVudD0hMCxvbkJsdXJDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITF9fWZ1bmN0aW9uIEF4KCl7Y29uc3QgdD1uZXcgQ3VzdG9tRXZlbnQoRmcpO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodCl9ZnVuY3Rpb24gSUModCxlLG4se2Rpc2NyZXRlOnJ9KXtjb25zdCBpPW4ub3JpZ2luYWxFdmVudC50YXJnZXQsbz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczohMSxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7ZSYmaS5hZGRFdmVudExpc3RlbmVyKHQsZSx7b25jZTohMH0pLHI/dDIoaSxvKTppLmRpc3BhdGNoRXZlbnQobyl9bGV0IEZoPTA7ZnVuY3Rpb24gRTMoKXtwLnVzZUVmZmVjdCgoKT0+e3ZhciB0LGU7Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLCh0PW5bMF0pIT09bnVsbCYmdCE9PXZvaWQgMD90Ok14KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLChlPW5bMV0pIT09bnVsbCYmZSE9PXZvaWQgMD9lOk14KCkpLEZoKyssKCk9PntGaD09PTEmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpLmZvckVhY2gocj0+ci5yZW1vdmUoKSksRmgtLX19LFtdKX1mdW5jdGlvbiBNeCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZCIsIiIpLHQudGFiSW5kZXg9MCx0LnN0eWxlLmNzc1RleHQ9Im91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmUiLHR9Y29uc3QgQmg9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudCIsVWg9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50IixMeD17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxDMz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtsb29wOm49ITEsdHJhcHBlZDpyPSExLG9uTW91bnRBdXRvRm9jdXM6aSxvblVubW91bnRBdXRvRm9jdXM6bywuLi5sfT10LFtzLGFdPXAudXNlU3RhdGUobnVsbCksdT1lbihpKSxjPWVuKG8pLGQ9cC51c2VSZWYobnVsbCksZj1zdChlLGc9PmEoZykpLGg9cC51c2VSZWYoe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KS5jdXJyZW50O3AudXNlRWZmZWN0KCgpPT57aWYocil7bGV0IHk9ZnVuY3Rpb24oVCl7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCAkPVQudGFyZ2V0O3MuY29udGFpbnMoJCk/ZC5jdXJyZW50PSQ6T2koZC5jdXJyZW50LHtzZWxlY3Q6ITB9KX0seD1mdW5jdGlvbihUKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0ICQ9VC5yZWxhdGVkVGFyZ2V0OyQhPT1udWxsJiYocy5jb250YWlucygkKXx8T2koZC5jdXJyZW50LHtzZWxlY3Q6ITB9KSl9LFM9ZnVuY3Rpb24oVCl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpZm9yKGNvbnN0IE8gb2YgVClPLnJlbW92ZWROb2Rlcy5sZW5ndGg+MCYmT2kocyl9O3ZhciBnPXksdz14LHY9Uztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCk7Y29uc3QgYj1uZXcgTXV0YXRpb25PYnNlcnZlcihTKTtyZXR1cm4gcyYmYi5vYnNlcnZlKHMse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCksYi5kaXNjb25uZWN0KCl9fX0sW3IscyxoLnBhdXNlZF0pLHAudXNlRWZmZWN0KCgpPT57aWYocyl7RHguYWRkKGgpO2NvbnN0IGc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighcy5jb250YWlucyhnKSl7Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoQmgsTHgpO3MuYWRkRXZlbnRMaXN0ZW5lcihCaCx1KSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHwoazMoUjMoREMocykpLHtzZWxlY3Q6ITB9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZyYmT2kocykpfXJldHVybigpPT57cy5yZW1vdmVFdmVudExpc3RlbmVyKEJoLHUpLHNldFRpbWVvdXQoKCk9Pntjb25zdCB2PW5ldyBDdXN0b21FdmVudChVaCxMeCk7cy5hZGRFdmVudExpc3RlbmVyKFVoLGMpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fE9pKGc/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihVaCxjKSxEeC5yZW1vdmUoaCl9LDApfX19LFtzLHUsYyxoXSk7Y29uc3QgbT1wLnVzZUNhbGxiYWNrKGc9PntpZighbiYmIXJ8fGgucGF1c2VkKXJldHVybjtjb25zdCB3PWcua2V5PT09IlRhYiImJiFnLmFsdEtleSYmIWcuY3RybEtleSYmIWcubWV0YUtleSx2PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodyYmdil7Y29uc3QgeT1nLmN1cnJlbnRUYXJnZXQsW3gsU109YjMoeSk7eCYmUz8hZy5zaGlmdEtleSYmdj09PVM/KGcucHJldmVudERlZmF1bHQoKSxuJiZPaSh4LHtzZWxlY3Q6ITB9KSk6Zy5zaGlmdEtleSYmdj09PXgmJihnLnByZXZlbnREZWZhdWx0KCksbiYmT2koUyx7c2VsZWN0OiEwfSkpOnY9PT15JiZnLnByZXZlbnREZWZhdWx0KCl9fSxbbixyLGgucGF1c2VkXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe3RhYkluZGV4Oi0xfSxsLHtyZWY6ZixvbktleURvd246bX0pKX0pO2Z1bmN0aW9uIGszKHQse3NlbGVjdDplPSExfT17fSl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCByIG9mIHQpaWYoT2kocix7c2VsZWN0OmV9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm59ZnVuY3Rpb24gYjModCl7Y29uc3QgZT1EQyh0KSxuPUl4KGUsdCkscj1JeChlLnJldmVyc2UoKSx0KTtyZXR1cm5bbixyXX1mdW5jdGlvbiBEQyh0KXtjb25zdCBlPVtdLG49ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULHthY2NlcHROb2RlOnI9Pntjb25zdCBpPXIudGFnTmFtZT09PSJJTlBVVCImJnIudHlwZT09PSJoaWRkZW4iO3JldHVybiByLmRpc2FibGVkfHxyLmhpZGRlbnx8aT9Ob2RlRmlsdGVyLkZJTFRFUl9TS0lQOnIudGFiSW5kZXg+PTA/Tm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOk5vZGVGaWx0ZXIuRklMVEVSX1NLSVB9fSk7Zm9yKDtuLm5leHROb2RlKCk7KWUucHVzaChuLmN1cnJlbnROb2RlKTtyZXR1cm4gZX1mdW5jdGlvbiBJeCh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoISQzKG4se3VwVG86ZX0pKXJldHVybiBufWZ1bmN0aW9uICQzKHQse3VwVG86ZX0pe2lmKGdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eT09PSJoaWRkZW4iKXJldHVybiEwO2Zvcig7dDspe2lmKGUhPT12b2lkIDAmJnQ9PT1lKXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUodCkuZGlzcGxheT09PSJub25lIilyZXR1cm4hMDt0PXQucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBUMyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJiJzZWxlY3QiaW4gdH1mdW5jdGlvbiBPaSh0LHtzZWxlY3Q6ZT0hMX09e30pe2lmKHQmJnQuZm9jdXMpe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksdCE9PW4mJlQzKHQpJiZlJiZ0LnNlbGVjdCgpfX1jb25zdCBEeD1OMygpO2Z1bmN0aW9uIE4zKCl7bGV0IHQ9W107cmV0dXJue2FkZChlKXtjb25zdCBuPXRbMF07ZSE9PW4mJihuPT1udWxsfHxuLnBhdXNlKCkpLHQ9angodCxlKSx0LnVuc2hpZnQoZSl9LHJlbW92ZShlKXt2YXIgbjt0PWp4KHQsZSksKG49dFswXSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLnJlc3VtZSgpfX19ZnVuY3Rpb24gangodCxlKXtjb25zdCBuPVsuLi50XSxyPW4uaW5kZXhPZihlKTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59ZnVuY3Rpb24gUjModCl7cmV0dXJuIHQuZmlsdGVyKGU9PmUudGFnTmFtZSE9PSJBIil9Y29uc3QgTzM9TV8udXNlSWR8fCgoKT0+e30pO2xldCBQMz0wO2Z1bmN0aW9uIERmKHQpe2NvbnN0W2Usbl09cC51c2VTdGF0ZShPMygpKTtyZXR1cm4gVW4oKCk9Pnt0fHxuKHI9PnI/P1N0cmluZyhQMysrKSl9LFt0XSksdHx8KGU/YHJhZGl4LSR7ZX1gOiIiKX1jb25zdCBBMz1bInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLGZvPU1hdGgubWluLExuPU1hdGgubWF4LFlkPU1hdGgucm91bmQsU2M9TWF0aC5mbG9vcixobz10PT4oe3g6dCx5OnR9KSxNMz17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifSxMMz17c3RhcnQ6ImVuZCIsZW5kOiJzdGFydCJ9O2Z1bmN0aW9uIEJnKHQsZSxuKXtyZXR1cm4gTG4odCxmbyhlLG4pKX1mdW5jdGlvbiBtaSh0LGUpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnR9ZnVuY3Rpb24gdmkodCl7cmV0dXJuIHQuc3BsaXQoIi0iKVswXX1mdW5jdGlvbiBMcyh0KXtyZXR1cm4gdC5zcGxpdCgiLSIpWzFdfWZ1bmN0aW9uIEJ2KHQpe3JldHVybiB0PT09IngiPyJ5IjoieCJ9ZnVuY3Rpb24gVXYodCl7cmV0dXJuIHQ9PT0ieSI/ImhlaWdodCI6IndpZHRoIn1mdW5jdGlvbiBJcyh0KXtyZXR1cm5bInRvcCIsImJvdHRvbSJdLmluY2x1ZGVzKHZpKHQpKT8ieSI6IngifWZ1bmN0aW9uIFd2KHQpe3JldHVybiBCdihJcyh0KSl9ZnVuY3Rpb24gSTModCxlLG4pe249PT12b2lkIDAmJihuPSExKTtjb25zdCByPUxzKHQpLGk9V3YodCksbz1VdihpKTtsZXQgbD1pPT09IngiP3I9PT0obj8iZW5kIjoic3RhcnQiKT8icmlnaHQiOiJsZWZ0IjpyPT09InN0YXJ0Ij8iYm90dG9tIjoidG9wIjtyZXR1cm4gZS5yZWZlcmVuY2Vbb10+ZS5mbG9hdGluZ1tvXSYmKGw9WGQobCkpLFtsLFhkKGwpXX1mdW5jdGlvbiBEMyh0KXtjb25zdCBlPVhkKHQpO3JldHVybltVZyh0KSxlLFVnKGUpXX1mdW5jdGlvbiBVZyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9zdGFydHxlbmQvZyxlPT5MM1tlXSl9ZnVuY3Rpb24gajModCxlLG4pe2NvbnN0IHI9WyJsZWZ0IiwicmlnaHQiXSxpPVsicmlnaHQiLCJsZWZ0Il0sbz1bInRvcCIsImJvdHRvbSJdLGw9WyJib3R0b20iLCJ0b3AiXTtzd2l0Y2godCl7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjpyZXR1cm4gbj9lP2k6cjplP3I6aTtjYXNlImxlZnQiOmNhc2UicmlnaHQiOnJldHVybiBlP286bDtkZWZhdWx0OnJldHVybltdfX1mdW5jdGlvbiB6Myh0LGUsbixyKXtjb25zdCBpPUxzKHQpO2xldCBvPWozKHZpKHQpLG49PT0ic3RhcnQiLHIpO3JldHVybiBpJiYobz1vLm1hcChsPT5sKyItIitpKSxlJiYobz1vLmNvbmNhdChvLm1hcChVZykpKSksb31mdW5jdGlvbiBYZCh0KXtyZXR1cm4gdC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxlPT5NM1tlXSl9ZnVuY3Rpb24gRjModCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLnR9fWZ1bmN0aW9uIGpDKHQpe3JldHVybiB0eXBlb2YgdCE9Im51bWJlciI/RjModCk6e3RvcDp0LHJpZ2h0OnQsYm90dG9tOnQsbGVmdDp0fX1mdW5jdGlvbiBRZCh0KXtyZXR1cm57Li4udCx0b3A6dC55LGxlZnQ6dC54LHJpZ2h0OnQueCt0LndpZHRoLGJvdHRvbTp0LnkrdC5oZWlnaHR9fWZ1bmN0aW9uIHp4KHQsZSxuKXtsZXR7cmVmZXJlbmNlOnIsZmxvYXRpbmc6aX09dDtjb25zdCBvPUlzKGUpLGw9V3YoZSkscz1VdihsKSxhPXZpKGUpLHU9bz09PSJ5IixjPXIueCtyLndpZHRoLzItaS53aWR0aC8yLGQ9ci55K3IuaGVpZ2h0LzItaS5oZWlnaHQvMixmPXJbc10vMi1pW3NdLzI7bGV0IGg7c3dpdGNoKGEpe2Nhc2UidG9wIjpoPXt4OmMseTpyLnktaS5oZWlnaHR9O2JyZWFrO2Nhc2UiYm90dG9tIjpoPXt4OmMseTpyLnkrci5oZWlnaHR9O2JyZWFrO2Nhc2UicmlnaHQiOmg9e3g6ci54K3Iud2lkdGgseTpkfTticmVhaztjYXNlImxlZnQiOmg9e3g6ci54LWkud2lkdGgseTpkfTticmVhaztkZWZhdWx0Omg9e3g6ci54LHk6ci55fX1zd2l0Y2goTHMoZSkpe2Nhc2Uic3RhcnQiOmhbbF0tPWYqKG4mJnU/LTE6MSk7YnJlYWs7Y2FzZSJlbmQiOmhbbF0rPWYqKG4mJnU/LTE6MSk7YnJlYWt9cmV0dXJuIGh9Y29uc3QgQjM9YXN5bmModCxlLG4pPT57Y29uc3R7cGxhY2VtZW50OnI9ImJvdHRvbSIsc3RyYXRlZ3k6aT0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6bz1bXSxwbGF0Zm9ybTpsfT1uLHM9by5maWx0ZXIoQm9vbGVhbiksYT1hd2FpdChsLmlzUlRMPT1udWxsP3ZvaWQgMDpsLmlzUlRMKGUpKTtsZXQgdT1hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOnQsZmxvYXRpbmc6ZSxzdHJhdGVneTppfSkse3g6Yyx5OmR9PXp4KHUscixhKSxmPXIsaD17fSxtPTA7Zm9yKGxldCBnPTA7ZzxzLmxlbmd0aDtnKyspe2NvbnN0e25hbWU6dyxmbjp2fT1zW2ddLHt4OnkseTp4LGRhdGE6UyxyZXNldDpifT1hd2FpdCB2KHt4OmMseTpkLGluaXRpYWxQbGFjZW1lbnQ6cixwbGFjZW1lbnQ6ZixzdHJhdGVneTppLG1pZGRsZXdhcmVEYXRhOmgscmVjdHM6dSxwbGF0Zm9ybTpsLGVsZW1lbnRzOntyZWZlcmVuY2U6dCxmbG9hdGluZzplfX0pO2lmKGM9eT8/YyxkPXg/P2QsaD17Li4uaCxbd106ey4uLmhbd10sLi4uU319LGImJm08PTUwKXttKyssdHlwZW9mIGI9PSJvYmplY3QiJiYoYi5wbGFjZW1lbnQmJihmPWIucGxhY2VtZW50KSxiLnJlY3RzJiYodT1iLnJlY3RzPT09ITA/YXdhaXQgbC5nZXRFbGVtZW50UmVjdHMoe3JlZmVyZW5jZTp0LGZsb2F0aW5nOmUsc3RyYXRlZ3k6aX0pOmIucmVjdHMpLHt4OmMseTpkfT16eCh1LGYsYSkpLGc9LTE7Y29udGludWV9fXJldHVybnt4OmMseTpkLHBsYWNlbWVudDpmLHN0cmF0ZWd5OmksbWlkZGxld2FyZURhdGE6aH19O2FzeW5jIGZ1bmN0aW9uIEV1KHQsZSl7dmFyIG47ZT09PXZvaWQgMCYmKGU9e30pO2NvbnN0e3g6cix5OmkscGxhdGZvcm06byxyZWN0czpsLGVsZW1lbnRzOnMsc3RyYXRlZ3k6YX09dCx7Ym91bmRhcnk6dT0iY2xpcHBpbmdBbmNlc3RvcnMiLHJvb3RCb3VuZGFyeTpjPSJ2aWV3cG9ydCIsZWxlbWVudENvbnRleHQ6ZD0iZmxvYXRpbmciLGFsdEJvdW5kYXJ5OmY9ITEscGFkZGluZzpoPTB9PW1pKGUsdCksbT1qQyhoKSx3PXNbZj9kPT09ImZsb2F0aW5nIj8icmVmZXJlbmNlIjoiZmxvYXRpbmciOmRdLHY9UWQoYXdhaXQgby5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6KG49YXdhaXQoby5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOm8uaXNFbGVtZW50KHcpKSk9PW51bGx8fG4/dzp3LmNvbnRleHRFbGVtZW50fHxhd2FpdChvLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6by5nZXREb2N1bWVudEVsZW1lbnQocy5mbG9hdGluZykpLGJvdW5kYXJ5OnUscm9vdEJvdW5kYXJ5OmMsc3RyYXRlZ3k6YX0pKSx5PWQ9PT0iZmxvYXRpbmciP3suLi5sLmZsb2F0aW5nLHg6cix5Oml9OmwucmVmZXJlbmNlLHg9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KHMuZmxvYXRpbmcpKSxTPWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudCh4KSk/YXdhaXQoby5nZXRTY2FsZT09bnVsbD92b2lkIDA6by5nZXRTY2FsZSh4KSl8fHt4OjEseToxfTp7eDoxLHk6MX0sYj1RZChvLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0P2F3YWl0IG8uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe3JlY3Q6eSxvZmZzZXRQYXJlbnQ6eCxzdHJhdGVneTphfSk6eSk7cmV0dXJue3RvcDoodi50b3AtYi50b3ArbS50b3ApL1MueSxib3R0b206KGIuYm90dG9tLXYuYm90dG9tK20uYm90dG9tKS9TLnksbGVmdDoodi5sZWZ0LWIubGVmdCttLmxlZnQpL1MueCxyaWdodDooYi5yaWdodC12LnJpZ2h0K20ucmlnaHQpL1MueH19Y29uc3QgRng9dD0+KHtuYW1lOiJhcnJvdyIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50OmkscmVjdHM6byxwbGF0Zm9ybTpsLGVsZW1lbnRzOnMsbWlkZGxld2FyZURhdGE6YX09ZSx7ZWxlbWVudDp1LHBhZGRpbmc6Yz0wfT1taSh0LGUpfHx7fTtpZih1PT1udWxsKXJldHVybnt9O2NvbnN0IGQ9akMoYyksZj17eDpuLHk6cn0saD1XdihpKSxtPVV2KGgpLGc9YXdhaXQgbC5nZXREaW1lbnNpb25zKHUpLHc9aD09PSJ5Iix2PXc/InRvcCI6ImxlZnQiLHk9dz8iYm90dG9tIjoicmlnaHQiLHg9dz8iY2xpZW50SGVpZ2h0IjoiY2xpZW50V2lkdGgiLFM9by5yZWZlcmVuY2VbbV0rby5yZWZlcmVuY2VbaF0tZltoXS1vLmZsb2F0aW5nW21dLGI9ZltoXS1vLnJlZmVyZW5jZVtoXSxUPWF3YWl0KGwuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDpsLmdldE9mZnNldFBhcmVudCh1KSk7bGV0ICQ9VD9UW3hdOjA7KCEkfHwhYXdhaXQobC5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmwuaXNFbGVtZW50KFQpKSkmJigkPXMuZmxvYXRpbmdbeF18fG8uZmxvYXRpbmdbbV0pO2NvbnN0IE89Uy8yLWIvMixMPSQvMi1nW21dLzItMSxQPWZvKGRbdl0sTCksRD1mbyhkW3ldLEwpLEI9UCxvZT0kLWdbbV0tRCxIPSQvMi1nW21dLzIrTyxaPUJnKEIsSCxvZSksQz0hYS5hcnJvdyYmTHMoaSkhPW51bGwmJkghPVomJm8ucmVmZXJlbmNlW21dLzItKEg8Qj9QOkQpLWdbbV0vMjwwLGs9Qz9IPEI/SC1COkgtb2U6MDtyZXR1cm57W2hdOmZbaF0rayxkYXRhOntbaF06WixjZW50ZXJPZmZzZXQ6SC1aLWssLi4uQyYme2FsaWdubWVudE9mZnNldDprfX0scmVzZXQ6Q319fSksVTM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToiZmxpcCIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe3ZhciBuLHI7Y29uc3R7cGxhY2VtZW50OmksbWlkZGxld2FyZURhdGE6byxyZWN0czpsLGluaXRpYWxQbGFjZW1lbnQ6cyxwbGF0Zm9ybTphLGVsZW1lbnRzOnV9PWUse21haW5BeGlzOmM9ITAsY3Jvc3NBeGlzOmQ9ITAsZmFsbGJhY2tQbGFjZW1lbnRzOmYsZmFsbGJhY2tTdHJhdGVneTpoPSJiZXN0Rml0IixmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOm09Im5vbmUiLGZsaXBBbGlnbm1lbnQ6Zz0hMCwuLi53fT1taSh0LGUpO2lmKChuPW8uYXJyb3cpIT1udWxsJiZuLmFsaWdubWVudE9mZnNldClyZXR1cm57fTtjb25zdCB2PXZpKGkpLHk9dmkocyk9PT1zLHg9YXdhaXQoYS5pc1JUTD09bnVsbD92b2lkIDA6YS5pc1JUTCh1LmZsb2F0aW5nKSksUz1mfHwoeXx8IWc/W1hkKHMpXTpEMyhzKSk7IWYmJm0hPT0ibm9uZSImJlMucHVzaCguLi56MyhzLGcsbSx4KSk7Y29uc3QgYj1bcywuLi5TXSxUPWF3YWl0IEV1KGUsdyksJD1bXTtsZXQgTz0oKHI9by5mbGlwKT09bnVsbD92b2lkIDA6ci5vdmVyZmxvd3MpfHxbXTtpZihjJiYkLnB1c2goVFt2XSksZCl7Y29uc3QgQj1JMyhpLGwseCk7JC5wdXNoKFRbQlswXV0sVFtCWzFdXSl9aWYoTz1bLi4uTyx7cGxhY2VtZW50Omksb3ZlcmZsb3dzOiR9XSwhJC5ldmVyeShCPT5CPD0wKSl7dmFyIEwsUDtjb25zdCBCPSgoKEw9by5mbGlwKT09bnVsbD92b2lkIDA6TC5pbmRleCl8fDApKzEsb2U9YltCXTtpZihvZSlyZXR1cm57ZGF0YTp7aW5kZXg6QixvdmVyZmxvd3M6T30scmVzZXQ6e3BsYWNlbWVudDpvZX19O2xldCBIPShQPU8uZmlsdGVyKFo9Ploub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChaLEMpPT5aLm92ZXJmbG93c1sxXS1DLm92ZXJmbG93c1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpQLnBsYWNlbWVudDtpZighSClzd2l0Y2goaCl7Y2FzZSJiZXN0Rml0Ijp7dmFyIEQ7Y29uc3QgWj0oRD1PLm1hcChDPT5bQy5wbGFjZW1lbnQsQy5vdmVyZmxvd3MuZmlsdGVyKGs9Pms+MCkucmVkdWNlKChrLEUpPT5rK0UsMCldKS5zb3J0KChDLGspPT5DWzFdLWtbMV0pWzBdKT09bnVsbD92b2lkIDA6RFswXTtaJiYoSD1aKTticmVha31jYXNlImluaXRpYWxQbGFjZW1lbnQiOkg9czticmVha31pZihpIT09SClyZXR1cm57cmVzZXQ6e3BsYWNlbWVudDpIfX19cmV0dXJue319fX07ZnVuY3Rpb24gQngodCxlKXtyZXR1cm57dG9wOnQudG9wLWUuaGVpZ2h0LHJpZ2h0OnQucmlnaHQtZS53aWR0aCxib3R0b206dC5ib3R0b20tZS5oZWlnaHQsbGVmdDp0LmxlZnQtZS53aWR0aH19ZnVuY3Rpb24gVXgodCl7cmV0dXJuIEEzLnNvbWUoZT0+dFtlXT49MCl9Y29uc3QgVzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToiaGlkZSIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3JlY3RzOm59PWUse3N0cmF0ZWd5OnI9InJlZmVyZW5jZUhpZGRlbiIsLi4uaX09bWkodCxlKTtzd2l0Y2gocil7Y2FzZSJyZWZlcmVuY2VIaWRkZW4iOntjb25zdCBvPWF3YWl0IEV1KGUsey4uLmksZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxsPUJ4KG8sbi5yZWZlcmVuY2UpO3JldHVybntkYXRhOntyZWZlcmVuY2VIaWRkZW5PZmZzZXRzOmwscmVmZXJlbmNlSGlkZGVuOlV4KGwpfX19Y2FzZSJlc2NhcGVkIjp7Y29uc3Qgbz1hd2FpdCBFdShlLHsuLi5pLGFsdEJvdW5kYXJ5OiEwfSksbD1CeChvLG4uZmxvYXRpbmcpO3JldHVybntkYXRhOntlc2NhcGVkT2Zmc2V0czpsLGVzY2FwZWQ6VXgobCl9fX1kZWZhdWx0OnJldHVybnt9fX19fTthc3luYyBmdW5jdGlvbiBWMyh0LGUpe2NvbnN0e3BsYWNlbWVudDpuLHBsYXRmb3JtOnIsZWxlbWVudHM6aX09dCxvPWF3YWl0KHIuaXNSVEw9PW51bGw/dm9pZCAwOnIuaXNSVEwoaS5mbG9hdGluZykpLGw9dmkobikscz1McyhuKSxhPUlzKG4pPT09InkiLHU9WyJsZWZ0IiwidG9wIl0uaW5jbHVkZXMobCk/LTE6MSxjPW8mJmE/LTE6MSxkPW1pKGUsdCk7bGV0e21haW5BeGlzOmYsY3Jvc3NBeGlzOmgsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09Im51bWJlciI/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGwsLi4uZH07cmV0dXJuIHMmJnR5cGVvZiBtPT0ibnVtYmVyIiYmKGg9cz09PSJlbmQiP20qLTE6bSksYT97eDpoKmMseTpmKnV9Ont4OmYqdSx5OmgqY319Y29uc3QgSDM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PTApLHtuYW1lOiJvZmZzZXQiLG9wdGlvbnM6dCxhc3luYyBmbihlKXtjb25zdHt4Om4seTpyfT1lLGk9YXdhaXQgVjMoZSx0KTtyZXR1cm57eDpuK2kueCx5OnIraS55LGRhdGE6aX19fX0sSzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToic2hpZnQiLG9wdGlvbnM6dCxhc3luYyBmbihlKXtjb25zdHt4Om4seTpyLHBsYWNlbWVudDppfT1lLHttYWluQXhpczpvPSEwLGNyb3NzQXhpczpsPSExLGxpbWl0ZXI6cz17Zm46dz0+e2xldHt4OnYseX09dztyZXR1cm57eDp2LHl9fX0sLi4uYX09bWkodCxlKSx1PXt4Om4seTpyfSxjPWF3YWl0IEV1KGUsYSksZD1Jcyh2aShpKSksZj1CdihkKTtsZXQgaD11W2ZdLG09dVtkXTtpZihvKXtjb25zdCB3PWY9PT0ieSI/InRvcCI6ImxlZnQiLHY9Zj09PSJ5Ij8iYm90dG9tIjoicmlnaHQiLHk9aCtjW3ddLHg9aC1jW3ZdO2g9QmcoeSxoLHgpfWlmKGwpe2NvbnN0IHc9ZD09PSJ5Ij8idG9wIjoibGVmdCIsdj1kPT09InkiPyJib3R0b20iOiJyaWdodCIseT1tK2Nbd10seD1tLWNbdl07bT1CZyh5LG0seCl9Y29uc3QgZz1zLmZuKHsuLi5lLFtmXTpoLFtkXTptfSk7cmV0dXJuey4uLmcsZGF0YTp7eDpnLngtbix5OmcueS1yfX19fX0sWjM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7b3B0aW9uczp0LGZuKGUpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50OmkscmVjdHM6byxtaWRkbGV3YXJlRGF0YTpsfT1lLHtvZmZzZXQ6cz0wLG1haW5BeGlzOmE9ITAsY3Jvc3NBeGlzOnU9ITB9PW1pKHQsZSksYz17eDpuLHk6cn0sZD1JcyhpKSxmPUJ2KGQpO2xldCBoPWNbZl0sbT1jW2RdO2NvbnN0IGc9bWkocyxlKSx3PXR5cGVvZiBnPT0ibnVtYmVyIj97bWFpbkF4aXM6Zyxjcm9zc0F4aXM6MH06e21haW5BeGlzOjAsY3Jvc3NBeGlzOjAsLi4uZ307aWYoYSl7Y29uc3QgeD1mPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsUz1vLnJlZmVyZW5jZVtmXS1vLmZsb2F0aW5nW3hdK3cubWFpbkF4aXMsYj1vLnJlZmVyZW5jZVtmXStvLnJlZmVyZW5jZVt4XS13Lm1haW5BeGlzO2g8Uz9oPVM6aD5iJiYoaD1iKX1pZih1KXt2YXIgdix5O2NvbnN0IHg9Zj09PSJ5Ij8id2lkdGgiOiJoZWlnaHQiLFM9WyJ0b3AiLCJsZWZ0Il0uaW5jbHVkZXModmkoaSkpLGI9by5yZWZlcmVuY2VbZF0tby5mbG9hdGluZ1t4XSsoUyYmKCh2PWwub2Zmc2V0KT09bnVsbD92b2lkIDA6dltkXSl8fDApKyhTPzA6dy5jcm9zc0F4aXMpLFQ9by5yZWZlcmVuY2VbZF0rby5yZWZlcmVuY2VbeF0rKFM/MDooKHk9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp5W2RdKXx8MCktKFM/dy5jcm9zc0F4aXM6MCk7bTxiP209YjptPlQmJihtPVQpfXJldHVybntbZl06aCxbZF06bX19fX0sRzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToic2l6ZSIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3BsYWNlbWVudDpuLHJlY3RzOnIscGxhdGZvcm06aSxlbGVtZW50czpvfT1lLHthcHBseTpsPSgpPT57fSwuLi5zfT1taSh0LGUpLGE9YXdhaXQgRXUoZSxzKSx1PXZpKG4pLGM9THMobiksZD1JcyhuKT09PSJ5Iix7d2lkdGg6ZixoZWlnaHQ6aH09ci5mbG9hdGluZztsZXQgbSxnO3U9PT0idG9wInx8dT09PSJib3R0b20iPyhtPXUsZz1jPT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoby5mbG9hdGluZykpPyJzdGFydCI6ImVuZCIpPyJsZWZ0IjoicmlnaHQiKTooZz11LG09Yz09PSJlbmQiPyJ0b3AiOiJib3R0b20iKTtjb25zdCB3PWgtYVttXSx2PWYtYVtnXSx5PSFlLm1pZGRsZXdhcmVEYXRhLnNoaWZ0O2xldCB4PXcsUz12O2lmKGQpe2NvbnN0IFQ9Zi1hLmxlZnQtYS5yaWdodDtTPWN8fHk/Zm8odixUKTpUfWVsc2V7Y29uc3QgVD1oLWEudG9wLWEuYm90dG9tO3g9Y3x8eT9mbyh3LFQpOlR9aWYoeSYmIWMpe2NvbnN0IFQ9TG4oYS5sZWZ0LDApLCQ9TG4oYS5yaWdodCwwKSxPPUxuKGEudG9wLDApLEw9TG4oYS5ib3R0b20sMCk7ZD9TPWYtMiooVCE9PTB8fCQhPT0wP1QrJDpMbihhLmxlZnQsYS5yaWdodCkpOng9aC0yKihPIT09MHx8TCE9PTA/TytMOkxuKGEudG9wLGEuYm90dG9tKSl9YXdhaXQgbCh7Li4uZSxhdmFpbGFibGVXaWR0aDpTLGF2YWlsYWJsZUhlaWdodDp4fSk7Y29uc3QgYj1hd2FpdCBpLmdldERpbWVuc2lvbnMoby5mbG9hdGluZyk7cmV0dXJuIGYhPT1iLndpZHRofHxoIT09Yi5oZWlnaHQ/e3Jlc2V0OntyZWN0czohMH19Ont9fX19O2Z1bmN0aW9uIHBvKHQpe3JldHVybiB6Qyh0KT8odC5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6IiNkb2N1bWVudCJ9ZnVuY3Rpb24gRm4odCl7dmFyIGU7cmV0dXJuKHQ9PW51bGx8fChlPXQub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuZGVmYXVsdFZpZXcpfHx3aW5kb3d9ZnVuY3Rpb24gQ2kodCl7dmFyIGU7cmV0dXJuKGU9KHpDKHQpP3Qub3duZXJEb2N1bWVudDp0LmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KT09bnVsbD92b2lkIDA6ZS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gekModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOb2RlfHx0IGluc3RhbmNlb2YgRm4odCkuTm9kZX1mdW5jdGlvbiB5aSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEVsZW1lbnR8fHQgaW5zdGFuY2VvZiBGbih0KS5FbGVtZW50fWZ1bmN0aW9uIFpyKHQpe3JldHVybiB0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR8fHQgaW5zdGFuY2VvZiBGbih0KS5IVE1MRWxlbWVudH1mdW5jdGlvbiBXeCh0KXtyZXR1cm4gdHlwZW9mIFNoYWRvd1Jvb3Q+InUiPyExOnQgaW5zdGFuY2VvZiBTaGFkb3dSb290fHx0IGluc3RhbmNlb2YgRm4odCkuU2hhZG93Um9vdH1mdW5jdGlvbiBXdSh0KXtjb25zdHtvdmVyZmxvdzplLG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09aXIodCk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QoZStyK24pJiYhWyJpbmxpbmUiLCJjb250ZW50cyJdLmluY2x1ZGVzKGkpfWZ1bmN0aW9uIFkzKHQpe3JldHVyblsidGFibGUiLCJ0ZCIsInRoIl0uaW5jbHVkZXMocG8odCkpfWZ1bmN0aW9uIFZ2KHQpe2NvbnN0IGU9SHYoKSxuPWlyKHQpO3JldHVybiBuLnRyYW5zZm9ybSE9PSJub25lInx8bi5wZXJzcGVjdGl2ZSE9PSJub25lInx8KG4uY29udGFpbmVyVHlwZT9uLmNvbnRhaW5lclR5cGUhPT0ibm9ybWFsIjohMSl8fCFlJiYobi5iYWNrZHJvcEZpbHRlcj9uLmJhY2tkcm9wRmlsdGVyIT09Im5vbmUiOiExKXx8IWUmJihuLmZpbHRlcj9uLmZpbHRlciE9PSJub25lIjohMSl8fFsidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiLCJmaWx0ZXIiXS5zb21lKHI9PihuLndpbGxDaGFuZ2V8fCIiKS5pbmNsdWRlcyhyKSl8fFsicGFpbnQiLCJsYXlvdXQiLCJzdHJpY3QiLCJjb250ZW50Il0uc29tZShyPT4obi5jb250YWlufHwiIikuaW5jbHVkZXMocikpfWZ1bmN0aW9uIFgzKHQpe2xldCBlPWdzKHQpO2Zvcig7WnIoZSkmJiFqZihlKTspe2lmKFZ2KGUpKXJldHVybiBlO2U9Z3MoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSHYoKXtyZXR1cm4gdHlwZW9mIENTUz4idSJ8fCFDU1Muc3VwcG9ydHM/ITE6Q1NTLnN1cHBvcnRzKCItd2Via2l0LWJhY2tkcm9wLWZpbHRlciIsIm5vbmUiKX1mdW5jdGlvbiBqZih0KXtyZXR1cm5bImh0bWwiLCJib2R5IiwiI2RvY3VtZW50Il0uaW5jbHVkZXMocG8odCkpfWZ1bmN0aW9uIGlyKHQpe3JldHVybiBGbih0KS5nZXRDb21wdXRlZFN0eWxlKHQpfWZ1bmN0aW9uIHpmKHQpe3JldHVybiB5aSh0KT97c2Nyb2xsTGVmdDp0LnNjcm9sbExlZnQsc2Nyb2xsVG9wOnQuc2Nyb2xsVG9wfTp7c2Nyb2xsTGVmdDp0LnBhZ2VYT2Zmc2V0LHNjcm9sbFRvcDp0LnBhZ2VZT2Zmc2V0fX1mdW5jdGlvbiBncyh0KXtpZihwbyh0KT09PSJodG1sIilyZXR1cm4gdDtjb25zdCBlPXQuYXNzaWduZWRTbG90fHx0LnBhcmVudE5vZGV8fFd4KHQpJiZ0Lmhvc3R8fENpKHQpO3JldHVybiBXeChlKT9lLmhvc3Q6ZX1mdW5jdGlvbiBGQyh0KXtjb25zdCBlPWdzKHQpO3JldHVybiBqZihlKT90Lm93bmVyRG9jdW1lbnQ/dC5vd25lckRvY3VtZW50LmJvZHk6dC5ib2R5OlpyKGUpJiZXdShlKT9lOkZDKGUpfWZ1bmN0aW9uIEN1KHQsZSxuKXt2YXIgcjtlPT09dm9pZCAwJiYoZT1bXSksbj09PXZvaWQgMCYmKG49ITApO2NvbnN0IGk9RkModCksbz1pPT09KChyPXQub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnIuYm9keSksbD1GbihpKTtyZXR1cm4gbz9lLmNvbmNhdChsLGwudmlzdWFsVmlld3BvcnR8fFtdLFd1KGkpP2k6W10sbC5mcmFtZUVsZW1lbnQmJm4/Q3UobC5mcmFtZUVsZW1lbnQpOltdKTplLmNvbmNhdChpLEN1KGksW10sbikpfWZ1bmN0aW9uIEJDKHQpe2NvbnN0IGU9aXIodCk7bGV0IG49cGFyc2VGbG9hdChlLndpZHRoKXx8MCxyPXBhcnNlRmxvYXQoZS5oZWlnaHQpfHwwO2NvbnN0IGk9WnIodCksbz1pP3Qub2Zmc2V0V2lkdGg6bixsPWk/dC5vZmZzZXRIZWlnaHQ6cixzPVlkKG4pIT09b3x8WWQocikhPT1sO3JldHVybiBzJiYobj1vLHI9bCkse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiBLdih0KXtyZXR1cm4geWkodCk/dDp0LmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIEpsKHQpe2NvbnN0IGU9S3YodCk7aWYoIVpyKGUpKXJldHVybiBobygxKTtjb25zdCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3dpZHRoOnIsaGVpZ2h0OmksJDpvfT1CQyhlKTtsZXQgbD0obz9ZZChuLndpZHRoKTpuLndpZHRoKS9yLHM9KG8/WWQobi5oZWlnaHQpOm4uaGVpZ2h0KS9pO3JldHVybighbHx8IU51bWJlci5pc0Zpbml0ZShsKSkmJihsPTEpLCghc3x8IU51bWJlci5pc0Zpbml0ZShzKSkmJihzPTEpLHt4OmwseTpzfX1jb25zdCBRMz1obygwKTtmdW5jdGlvbiBVQyh0KXtjb25zdCBlPUZuKHQpO3JldHVybiFIdigpfHwhZS52aXN1YWxWaWV3cG9ydD9RMzp7eDplLnZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQseTplLnZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcH19ZnVuY3Rpb24gSjModCxlLG4pe3JldHVybiBlPT09dm9pZCAwJiYoZT0hMSksIW58fGUmJm4hPT1Gbih0KT8hMTplfWZ1bmN0aW9uIEpvKHQsZSxuLHIpe2U9PT12b2lkIDAmJihlPSExKSxuPT09dm9pZCAwJiYobj0hMSk7Y29uc3QgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89S3YodCk7bGV0IGw9aG8oMSk7ZSYmKHI/eWkocikmJihsPUpsKHIpKTpsPUpsKHQpKTtjb25zdCBzPUozKG8sbixyKT9VQyhvKTpobygwKTtsZXQgYT0oaS5sZWZ0K3MueCkvbC54LHU9KGkudG9wK3MueSkvbC55LGM9aS53aWR0aC9sLngsZD1pLmhlaWdodC9sLnk7aWYobyl7Y29uc3QgZj1GbihvKSxoPXImJnlpKHIpP0ZuKHIpOnI7bGV0IG09Zi5mcmFtZUVsZW1lbnQ7Zm9yKDttJiZyJiZoIT09Zjspe2NvbnN0IGc9SmwobSksdz1tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9aXIobSkseT13LmxlZnQrKG0uY2xpZW50TGVmdCtwYXJzZUZsb2F0KHYucGFkZGluZ0xlZnQpKSpnLngseD13LnRvcCsobS5jbGllbnRUb3ArcGFyc2VGbG9hdCh2LnBhZGRpbmdUb3ApKSpnLnk7YSo9Zy54LHUqPWcueSxjKj1nLngsZCo9Zy55LGErPXksdSs9eCxtPUZuKG0pLmZyYW1lRWxlbWVudH19cmV0dXJuIFFkKHt3aWR0aDpjLGhlaWdodDpkLHg6YSx5OnV9KX1mdW5jdGlvbiBxMyh0KXtsZXR7cmVjdDplLG9mZnNldFBhcmVudDpuLHN0cmF0ZWd5OnJ9PXQ7Y29uc3QgaT1acihuKSxvPUNpKG4pO2lmKG49PT1vKXJldHVybiBlO2xldCBsPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LHM9aG8oMSk7Y29uc3QgYT1obygwKTtpZigoaXx8IWkmJnIhPT0iZml4ZWQiKSYmKChwbyhuKSE9PSJib2R5Inx8V3UobykpJiYobD16ZihuKSksWnIobikpKXtjb25zdCB1PUpvKG4pO3M9SmwobiksYS54PXUueCtuLmNsaWVudExlZnQsYS55PXUueStuLmNsaWVudFRvcH1yZXR1cm57d2lkdGg6ZS53aWR0aCpzLngsaGVpZ2h0OmUuaGVpZ2h0KnMueSx4OmUueCpzLngtbC5zY3JvbGxMZWZ0KnMueCthLngseTplLnkqcy55LWwuc2Nyb2xsVG9wKnMueSthLnl9fWZ1bmN0aW9uIGVNKHQpe3JldHVybiBBcnJheS5mcm9tKHQuZ2V0Q2xpZW50UmVjdHMoKSl9ZnVuY3Rpb24gV0ModCl7cmV0dXJuIEpvKENpKHQpKS5sZWZ0K3pmKHQpLnNjcm9sbExlZnR9ZnVuY3Rpb24gdE0odCl7Y29uc3QgZT1DaSh0KSxuPXpmKHQpLHI9dC5vd25lckRvY3VtZW50LmJvZHksaT1MbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsci5zY3JvbGxXaWR0aCxyLmNsaWVudFdpZHRoKSxvPUxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LHIuc2Nyb2xsSGVpZ2h0LHIuY2xpZW50SGVpZ2h0KTtsZXQgbD0tbi5zY3JvbGxMZWZ0K1dDKHQpO2NvbnN0IHM9LW4uc2Nyb2xsVG9wO3JldHVybiBpcihyKS5kaXJlY3Rpb249PT0icnRsIiYmKGwrPUxuKGUuY2xpZW50V2lkdGgsci5jbGllbnRXaWR0aCktaSkse3dpZHRoOmksaGVpZ2h0Om8seDpsLHk6c319ZnVuY3Rpb24gbk0odCxlKXtjb25zdCBuPUZuKHQpLHI9Q2kodCksaT1uLnZpc3VhbFZpZXdwb3J0O2xldCBvPXIuY2xpZW50V2lkdGgsbD1yLmNsaWVudEhlaWdodCxzPTAsYT0wO2lmKGkpe289aS53aWR0aCxsPWkuaGVpZ2h0O2NvbnN0IHU9SHYoKTsoIXV8fHUmJmU9PT0iZml4ZWQiKSYmKHM9aS5vZmZzZXRMZWZ0LGE9aS5vZmZzZXRUb3ApfXJldHVybnt3aWR0aDpvLGhlaWdodDpsLHg6cyx5OmF9fWZ1bmN0aW9uIHJNKHQsZSl7Y29uc3Qgbj1Kbyh0LCEwLGU9PT0iZml4ZWQiKSxyPW4udG9wK3QuY2xpZW50VG9wLGk9bi5sZWZ0K3QuY2xpZW50TGVmdCxvPVpyKHQpP0psKHQpOmhvKDEpLGw9dC5jbGllbnRXaWR0aCpvLngscz10LmNsaWVudEhlaWdodCpvLnksYT1pKm8ueCx1PXIqby55O3JldHVybnt3aWR0aDpsLGhlaWdodDpzLHg6YSx5OnV9fWZ1bmN0aW9uIFZ4KHQsZSxuKXtsZXQgcjtpZihlPT09InZpZXdwb3J0IilyPW5NKHQsbik7ZWxzZSBpZihlPT09ImRvY3VtZW50IilyPXRNKENpKHQpKTtlbHNlIGlmKHlpKGUpKXI9ck0oZSxuKTtlbHNle2NvbnN0IGk9VUModCk7cj17Li4uZSx4OmUueC1pLngseTplLnktaS55fX1yZXR1cm4gUWQocil9ZnVuY3Rpb24gVkModCxlKXtjb25zdCBuPWdzKHQpO3JldHVybiBuPT09ZXx8IXlpKG4pfHxqZihuKT8hMTppcihuKS5wb3NpdGlvbj09PSJmaXhlZCJ8fFZDKG4sZSl9ZnVuY3Rpb24gaU0odCxlKXtjb25zdCBuPWUuZ2V0KHQpO2lmKG4pcmV0dXJuIG47bGV0IHI9Q3UodCxbXSwhMSkuZmlsdGVyKHM9PnlpKHMpJiZwbyhzKSE9PSJib2R5IiksaT1udWxsO2NvbnN0IG89aXIodCkucG9zaXRpb249PT0iZml4ZWQiO2xldCBsPW8/Z3ModCk6dDtmb3IoO3lpKGwpJiYhamYobCk7KXtjb25zdCBzPWlyKGwpLGE9VnYobCk7IWEmJnMucG9zaXRpb249PT0iZml4ZWQiJiYoaT1udWxsKSwobz8hYSYmIWk6IWEmJnMucG9zaXRpb249PT0ic3RhdGljIiYmISFpJiZbImFic29sdXRlIiwiZml4ZWQiXS5pbmNsdWRlcyhpLnBvc2l0aW9uKXx8V3UobCkmJiFhJiZWQyh0LGwpKT9yPXIuZmlsdGVyKGM9PmMhPT1sKTppPXMsbD1ncyhsKX1yZXR1cm4gZS5zZXQodCxyKSxyfWZ1bmN0aW9uIG9NKHQpe2xldHtlbGVtZW50OmUsYm91bmRhcnk6bixyb290Qm91bmRhcnk6cixzdHJhdGVneTppfT10O2NvbnN0IGw9Wy4uLm49PT0iY2xpcHBpbmdBbmNlc3RvcnMiP2lNKGUsdGhpcy5fYyk6W10uY29uY2F0KG4pLHJdLHM9bFswXSxhPWwucmVkdWNlKCh1LGMpPT57Y29uc3QgZD1WeChlLGMsaSk7cmV0dXJuIHUudG9wPUxuKGQudG9wLHUudG9wKSx1LnJpZ2h0PWZvKGQucmlnaHQsdS5yaWdodCksdS5ib3R0b209Zm8oZC5ib3R0b20sdS5ib3R0b20pLHUubGVmdD1MbihkLmxlZnQsdS5sZWZ0KSx1fSxWeChlLHMsaSkpO3JldHVybnt3aWR0aDphLnJpZ2h0LWEubGVmdCxoZWlnaHQ6YS5ib3R0b20tYS50b3AseDphLmxlZnQseTphLnRvcH19ZnVuY3Rpb24gbE0odCl7cmV0dXJuIEJDKHQpfWZ1bmN0aW9uIHNNKHQsZSxuKXtjb25zdCByPVpyKGUpLGk9Q2koZSksbz1uPT09ImZpeGVkIixsPUpvKHQsITAsbyxlKTtsZXQgcz17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfTtjb25zdCBhPWhvKDApO2lmKHJ8fCFyJiYhbylpZigocG8oZSkhPT0iYm9keSJ8fFd1KGkpKSYmKHM9emYoZSkpLHIpe2NvbnN0IHU9Sm8oZSwhMCxvLGUpO2EueD11LngrZS5jbGllbnRMZWZ0LGEueT11LnkrZS5jbGllbnRUb3B9ZWxzZSBpJiYoYS54PVdDKGkpKTtyZXR1cm57eDpsLmxlZnQrcy5zY3JvbGxMZWZ0LWEueCx5OmwudG9wK3Muc2Nyb2xsVG9wLWEueSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH19ZnVuY3Rpb24gSHgodCxlKXtyZXR1cm4hWnIodCl8fGlyKHQpLnBvc2l0aW9uPT09ImZpeGVkIj9udWxsOmU/ZSh0KTp0Lm9mZnNldFBhcmVudH1mdW5jdGlvbiBIQyh0LGUpe2NvbnN0IG49Rm4odCk7aWYoIVpyKHQpKXJldHVybiBuO2xldCByPUh4KHQsZSk7Zm9yKDtyJiZZMyhyKSYmaXIocikucG9zaXRpb249PT0ic3RhdGljIjspcj1IeChyLGUpO3JldHVybiByJiYocG8ocik9PT0iaHRtbCJ8fHBvKHIpPT09ImJvZHkiJiZpcihyKS5wb3NpdGlvbj09PSJzdGF0aWMiJiYhVnYocikpP246cnx8WDModCl8fG59Y29uc3QgYU09YXN5bmMgZnVuY3Rpb24odCl7bGV0e3JlZmVyZW5jZTplLGZsb2F0aW5nOm4sc3RyYXRlZ3k6cn09dDtjb25zdCBpPXRoaXMuZ2V0T2Zmc2V0UGFyZW50fHxIQyxvPXRoaXMuZ2V0RGltZW5zaW9ucztyZXR1cm57cmVmZXJlbmNlOnNNKGUsYXdhaXQgaShuKSxyKSxmbG9hdGluZzp7eDowLHk6MCwuLi5hd2FpdCBvKG4pfX19O2Z1bmN0aW9uIHVNKHQpe3JldHVybiBpcih0KS5kaXJlY3Rpb249PT0icnRsIn1jb25zdCBjTT17Y29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q6cTMsZ2V0RG9jdW1lbnRFbGVtZW50OkNpLGdldENsaXBwaW5nUmVjdDpvTSxnZXRPZmZzZXRQYXJlbnQ6SEMsZ2V0RWxlbWVudFJlY3RzOmFNLGdldENsaWVudFJlY3RzOmVNLGdldERpbWVuc2lvbnM6bE0sZ2V0U2NhbGU6SmwsaXNFbGVtZW50OnlpLGlzUlRMOnVNfTtmdW5jdGlvbiBkTSh0LGUpe2xldCBuPW51bGwscjtjb25zdCBpPUNpKHQpO2Z1bmN0aW9uIG8oKXtjbGVhclRpbWVvdXQociksbiYmbi5kaXNjb25uZWN0KCksbj1udWxsfWZ1bmN0aW9uIGwocyxhKXtzPT09dm9pZCAwJiYocz0hMSksYT09PXZvaWQgMCYmKGE9MSksbygpO2NvbnN0e2xlZnQ6dSx0b3A6Yyx3aWR0aDpkLGhlaWdodDpmfT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHN8fGUoKSwhZHx8IWYpcmV0dXJuO2NvbnN0IGg9U2MoYyksbT1TYyhpLmNsaWVudFdpZHRoLSh1K2QpKSxnPVNjKGkuY2xpZW50SGVpZ2h0LShjK2YpKSx3PVNjKHUpLHk9e3Jvb3RNYXJnaW46LWgrInB4ICIrLW0rInB4ICIrLWcrInB4ICIrLXcrInB4Iix0aHJlc2hvbGQ6TG4oMCxmbygxLGEpKXx8MX07bGV0IHg9ITA7ZnVuY3Rpb24gUyhiKXtjb25zdCBUPWJbMF0uaW50ZXJzZWN0aW9uUmF0aW87aWYoVCE9PWEpe2lmKCF4KXJldHVybiBsKCk7VD9sKCExLFQpOnI9c2V0VGltZW91dCgoKT0+e2woITEsMWUtNyl9LDEwMCl9eD0hMX10cnl7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoUyx7Li4ueSxyb290Omkub3duZXJEb2N1bWVudH0pfWNhdGNoe249bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFMseSl9bi5vYnNlcnZlKHQpfXJldHVybiBsKCEwKSxvfWZ1bmN0aW9uIGZNKHQsZSxuLHIpe3I9PT12b2lkIDAmJihyPXt9KTtjb25zdHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOm89ITAsZWxlbWVudFJlc2l6ZTpsPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09ImZ1bmN0aW9uIixhbmltYXRpb25GcmFtZTphPSExfT1yLHU9S3YodCksYz1pfHxvP1suLi51P0N1KHUpOltdLC4uLkN1KGUpXTpbXTtjLmZvckVhY2godj0+e2kmJnYuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuLHtwYXNzaXZlOiEwfSksbyYmdi5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG4pfSk7Y29uc3QgZD11JiZzP2RNKHUsbik6bnVsbDtsZXQgZj0tMSxoPW51bGw7bCYmKGg9bmV3IFJlc2l6ZU9ic2VydmVyKHY9PntsZXRbeV09djt5JiZ5LnRhcmdldD09PXUmJmgmJihoLnVub2JzZXJ2ZShlKSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2gmJmgub2JzZXJ2ZShlKX0pKSxuKCl9KSx1JiYhYSYmaC5vYnNlcnZlKHUpLGgub2JzZXJ2ZShlKSk7bGV0IG0sZz1hP0pvKHQpOm51bGw7YSYmdygpO2Z1bmN0aW9uIHcoKXtjb25zdCB2PUpvKHQpO2cmJih2LnghPT1nLnh8fHYueSE9PWcueXx8di53aWR0aCE9PWcud2lkdGh8fHYuaGVpZ2h0IT09Zy5oZWlnaHQpJiZuKCksZz12LG09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpfXJldHVybiBuKCksKCk9PntjLmZvckVhY2godj0+e2kmJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuKSxvJiZ2LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KSxkJiZkKCksaCYmaC5kaXNjb25uZWN0KCksaD1udWxsLGEmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKG0pfX1jb25zdCBoTT0odCxlLG4pPT57Y29uc3Qgcj1uZXcgTWFwLGk9e3BsYXRmb3JtOmNNLC4uLm59LG89ey4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIEIzKHQsZSx7Li4uaSxwbGF0Zm9ybTpvfSl9LHBNPXQ9PntmdW5jdGlvbiBlKG4pe3JldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwobiwiY3VycmVudCIpfXJldHVybntuYW1lOiJhcnJvdyIsb3B0aW9uczp0LGZuKG4pe2NvbnN0e2VsZW1lbnQ6cixwYWRkaW5nOml9PXR5cGVvZiB0PT0iZnVuY3Rpb24iP3Qobik6dDtyZXR1cm4gciYmZShyKT9yLmN1cnJlbnQhPW51bGw/Rngoe2VsZW1lbnQ6ci5jdXJyZW50LHBhZGRpbmc6aX0pLmZuKG4pOnt9OnI/Rngoe2VsZW1lbnQ6cixwYWRkaW5nOml9KS5mbihuKTp7fX19fTt2YXIgS2M9dHlwZW9mIGRvY3VtZW50PCJ1Ij9wLnVzZUxheW91dEVmZmVjdDpwLnVzZUVmZmVjdDtmdW5jdGlvbiBKZCh0LGUpe2lmKHQ9PT1lKXJldHVybiEwO2lmKHR5cGVvZiB0IT10eXBlb2YgZSlyZXR1cm4hMTtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIiYmdC50b1N0cmluZygpPT09ZS50b1N0cmluZygpKXJldHVybiEwO2xldCBuLHIsaTtpZih0JiZlJiZ0eXBlb2YgdD09Im9iamVjdCIpe2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5sZW5ndGgsbiE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOylpZighSmQodFtyXSxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZihpPU9iamVjdC5rZXlzKHQpLG49aS5sZW5ndGgsbiE9PU9iamVjdC5rZXlzKGUpLmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaVtyXSkpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOyl7Y29uc3Qgbz1pW3JdO2lmKCEobz09PSJfb3duZXIiJiZ0LiQkdHlwZW9mKSYmIUpkKHRbb10sZVtvXSkpcmV0dXJuITF9cmV0dXJuITB9cmV0dXJuIHQhPT10JiZlIT09ZX1mdW5jdGlvbiBLQyh0KXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSI/MToodC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmRldmljZVBpeGVsUmF0aW98fDF9ZnVuY3Rpb24gS3godCxlKXtjb25zdCBuPUtDKHQpO3JldHVybiBNYXRoLnJvdW5kKGUqbikvbn1mdW5jdGlvbiBaeCh0KXtjb25zdCBlPXAudXNlUmVmKHQpO3JldHVybiBLYygoKT0+e2UuY3VycmVudD10fSksZX1mdW5jdGlvbiBnTSh0KXt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7cGxhY2VtZW50OmU9ImJvdHRvbSIsc3RyYXRlZ3k6bj0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6cj1bXSxwbGF0Zm9ybTppLGVsZW1lbnRzOntyZWZlcmVuY2U6byxmbG9hdGluZzpsfT17fSx0cmFuc2Zvcm06cz0hMCx3aGlsZUVsZW1lbnRzTW91bnRlZDphLG9wZW46dX09dCxbYyxkXT1wLnVzZVN0YXRlKHt4OjAseTowLHN0cmF0ZWd5Om4scGxhY2VtZW50OmUsbWlkZGxld2FyZURhdGE6e30saXNQb3NpdGlvbmVkOiExfSksW2YsaF09cC51c2VTdGF0ZShyKTtKZChmLHIpfHxoKHIpO2NvbnN0W20sZ109cC51c2VTdGF0ZShudWxsKSxbdyx2XT1wLnVzZVN0YXRlKG51bGwpLHk9cC51c2VDYWxsYmFjayhDPT57QyE9VC5jdXJyZW50JiYoVC5jdXJyZW50PUMsZyhDKSl9LFtnXSkseD1wLnVzZUNhbGxiYWNrKEM9PntDIT09JC5jdXJyZW50JiYoJC5jdXJyZW50PUMsdihDKSl9LFt2XSksUz1vfHxtLGI9bHx8dyxUPXAudXNlUmVmKG51bGwpLCQ9cC51c2VSZWYobnVsbCksTz1wLnVzZVJlZihjKSxMPVp4KGEpLFA9WngoaSksRD1wLnVzZUNhbGxiYWNrKCgpPT57aWYoIVQuY3VycmVudHx8ISQuY3VycmVudClyZXR1cm47Y29uc3QgQz17cGxhY2VtZW50OmUsc3RyYXRlZ3k6bixtaWRkbGV3YXJlOmZ9O1AuY3VycmVudCYmKEMucGxhdGZvcm09UC5jdXJyZW50KSxoTShULmN1cnJlbnQsJC5jdXJyZW50LEMpLnRoZW4oaz0+e2NvbnN0IEU9ey4uLmssaXNQb3NpdGlvbmVkOiEwfTtCLmN1cnJlbnQmJiFKZChPLmN1cnJlbnQsRSkmJihPLmN1cnJlbnQ9RSxHci5mbHVzaFN5bmMoKCk9PntkKEUpfSkpfSl9LFtmLGUsbixQXSk7S2MoKCk9Pnt1PT09ITEmJk8uY3VycmVudC5pc1Bvc2l0aW9uZWQmJihPLmN1cnJlbnQuaXNQb3NpdGlvbmVkPSExLGQoQz0+KHsuLi5DLGlzUG9zaXRpb25lZDohMX0pKSl9LFt1XSk7Y29uc3QgQj1wLnVzZVJlZighMSk7S2MoKCk9PihCLmN1cnJlbnQ9ITAsKCk9PntCLmN1cnJlbnQ9ITF9KSxbXSksS2MoKCk9PntpZihTJiYoVC5jdXJyZW50PVMpLGImJigkLmN1cnJlbnQ9YiksUyYmYil7aWYoTC5jdXJyZW50KXJldHVybiBMLmN1cnJlbnQoUyxiLEQpO0QoKX19LFtTLGIsRCxMXSk7Y29uc3Qgb2U9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTpULGZsb2F0aW5nOiQsc2V0UmVmZXJlbmNlOnksc2V0RmxvYXRpbmc6eH0pLFt5LHhdKSxIPXAudXNlTWVtbygoKT0+KHtyZWZlcmVuY2U6UyxmbG9hdGluZzpifSksW1MsYl0pLFo9cC51c2VNZW1vKCgpPT57Y29uc3QgQz17cG9zaXRpb246bixsZWZ0OjAsdG9wOjB9O2lmKCFILmZsb2F0aW5nKXJldHVybiBDO2NvbnN0IGs9S3goSC5mbG9hdGluZyxjLngpLEU9S3goSC5mbG9hdGluZyxjLnkpO3JldHVybiBzP3suLi5DLHRyYW5zZm9ybToidHJhbnNsYXRlKCIraysicHgsICIrRSsicHgpIiwuLi5LQyhILmZsb2F0aW5nKT49MS41JiZ7d2lsbENoYW5nZToidHJhbnNmb3JtIn19Ontwb3NpdGlvbjpuLGxlZnQ6ayx0b3A6RX19LFtuLHMsSC5mbG9hdGluZyxjLngsYy55XSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHsuLi5jLHVwZGF0ZTpELHJlZnM6b2UsZWxlbWVudHM6SCxmbG9hdGluZ1N0eWxlczpafSksW2MsRCxvZSxILFpdKX1mdW5jdGlvbiBaQyh0KXtjb25zdFtlLG5dPXAudXNlU3RhdGUodm9pZCAwKTtyZXR1cm4gVW4oKCk9PntpZih0KXtuKHt3aWR0aDp0Lm9mZnNldFdpZHRoLGhlaWdodDp0Lm9mZnNldEhlaWdodH0pO2NvbnN0IHI9bmV3IFJlc2l6ZU9ic2VydmVyKGk9PntpZighQXJyYXkuaXNBcnJheShpKXx8IWkubGVuZ3RoKXJldHVybjtjb25zdCBvPWlbMF07bGV0IGwscztpZigiYm9yZGVyQm94U2l6ZSJpbiBvKXtjb25zdCBhPW8uYm9yZGVyQm94U2l6ZSx1PUFycmF5LmlzQXJyYXkoYSk/YVswXTphO2w9dS5pbmxpbmVTaXplLHM9dS5ibG9ja1NpemV9ZWxzZSBsPXQub2Zmc2V0V2lkdGgscz10Lm9mZnNldEhlaWdodDtuKHt3aWR0aDpsLGhlaWdodDpzfSl9KTtyZXR1cm4gci5vYnNlcnZlKHQse2JveDoiYm9yZGVyLWJveCJ9KSwoKT0+ci51bm9ic2VydmUodCl9ZWxzZSBuKHZvaWQgMCl9LFt0XSksZX1jb25zdCBHQz0iUG9wcGVyIixbWUMsWENdPW9sKEdDKSxbbU0sUUNdPVlDKEdDKSx2TT10PT57Y29uc3R7X19zY29wZVBvcHBlcjplLGNoaWxkcmVuOm59PXQsW3IsaV09cC51c2VTdGF0ZShudWxsKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KG1NLHtzY29wZTplLGFuY2hvcjpyLG9uQW5jaG9yQ2hhbmdlOml9LG4pfSx5TT0iUG9wcGVyQW5jaG9yIix4TT1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlUG9wcGVyOm4sdmlydHVhbFJlZjpyLC4uLml9PXQsbz1RQyh5TSxuKSxsPXAudXNlUmVmKG51bGwpLHM9c3QoZSxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLm9uQW5jaG9yQ2hhbmdlKChyPT1udWxsP3ZvaWQgMDpyLmN1cnJlbnQpfHxsLmN1cnJlbnQpfSkscj9udWxsOnAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30saSx7cmVmOnN9KSl9KSxKQz0iUG9wcGVyQ29udGVudCIsW19NLFJEXT1ZQyhKQyksd009cC5mb3J3YXJkUmVmKCh0LGUpPT57dmFyIG4scixpLG8sbCxzLGEsdTtjb25zdHtfX3Njb3BlUG9wcGVyOmMsc2lkZTpkPSJib3R0b20iLHNpZGVPZmZzZXQ6Zj0wLGFsaWduOmg9ImNlbnRlciIsYWxpZ25PZmZzZXQ6bT0wLGFycm93UGFkZGluZzpnPTAsYXZvaWRDb2xsaXNpb25zOnc9ITAsY29sbGlzaW9uQm91bmRhcnk6dj1bXSxjb2xsaXNpb25QYWRkaW5nOnk9MCxzdGlja3k6eD0icGFydGlhbCIsaGlkZVdoZW5EZXRhY2hlZDpTPSExLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6Yj0ib3B0aW1pemVkIixvblBsYWNlZDpULC4uLiR9PXQsTz1RQyhKQyxjKSxbTCxQXT1wLnVzZVN0YXRlKG51bGwpLEQ9c3QoZSxTbj0+UChTbikpLFtCLG9lXT1wLnVzZVN0YXRlKG51bGwpLEg9WkMoQiksWj0obj1IPT1udWxsP3ZvaWQgMDpILndpZHRoKSE9PW51bGwmJm4hPT12b2lkIDA/bjowLEM9KHI9SD09bnVsbD92b2lkIDA6SC5oZWlnaHQpIT09bnVsbCYmciE9PXZvaWQgMD9yOjAsaz1kKyhoIT09ImNlbnRlciI/Ii0iK2g6IiIpLEU9dHlwZW9mIHk9PSJudW1iZXIiP3k6e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLnl9LEE9QXJyYXkuaXNBcnJheSh2KT92Olt2XSxOPUEubGVuZ3RoPjAsRj17cGFkZGluZzpFLGJvdW5kYXJ5OkEuZmlsdGVyKFNNKSxhbHRCb3VuZGFyeTpOfSx7cmVmczpLLGZsb2F0aW5nU3R5bGVzOmRlLHBsYWNlbWVudDpzZSxpc1Bvc2l0aW9uZWQ6QWUsbWlkZGxld2FyZURhdGE6TmV9PWdNKHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDprLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5Tbik9PmZNKC4uLlNuLHthbmltYXRpb25GcmFtZTpiPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOk8uYW5jaG9yfSxtaWRkbGV3YXJlOltIMyh7bWFpbkF4aXM6ZitDLGFsaWdubWVudEF4aXM6bX0pLHcmJkszKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjp4PT09InBhcnRpYWwiP1ozKCk6dm9pZCAwLC4uLkZ9KSx3JiZVMyh7Li4uRn0pLEczKHsuLi5GLGFwcGx5Oih7ZWxlbWVudHM6U24scmVjdHM6bHIsYXZhaWxhYmxlV2lkdGg6emUsYXZhaWxhYmxlSGVpZ2h0OlR0fSk9Pntjb25zdHt3aWR0aDphdCxoZWlnaHQ6bG59PWxyLnJlZmVyZW5jZSxFbj1Tbi5mbG9hdGluZy5zdHlsZTtFbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHt6ZX1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtUdH1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2F0fXB4YCksRW4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke2xufXB4YCl9fSksQiYmcE0oe2VsZW1lbnQ6QixwYWRkaW5nOmd9KSxFTSh7YXJyb3dXaWR0aDpaLGFycm93SGVpZ2h0OkN9KSxTJiZXMyh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uRn0pXX0pLFtRLGplXT1xQyhzZSksYmU9ZW4oVCk7VW4oKCk9PntBZSYmKGJlPT1udWxsfHxiZSgpKX0sW0FlLGJlXSk7Y29uc3QgUmU9KGk9TmUuYXJyb3cpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS54LHdlPShvPU5lLmFycm93KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8ueSxJZT0oKGw9TmUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC5jZW50ZXJPZmZzZXQpIT09MCxbUWUsV3RdPXAudXNlU3RhdGUoKTtyZXR1cm4gVW4oKCk9PntMJiZXdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShMKS56SW5kZXgpfSxbTF0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOksuc2V0RmxvYXRpbmcsImRhdGEtcmFkaXgtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6IiIsc3R5bGU6ey4uLmRlLHRyYW5zZm9ybTpBZT9kZS50cmFuc2Zvcm06InRyYW5zbGF0ZSgwLCAtMjAwJSkiLG1pbldpZHRoOiJtYXgtY29udGVudCIsekluZGV4OlFlLCItLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luIjpbKHM9TmUudHJhbnNmb3JtT3JpZ2luKT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMueCwoYT1OZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS55XS5qb2luKCIgIil9LGRpcjp0LmRpcn0scC5jcmVhdGVFbGVtZW50KF9NLHtzY29wZTpjLHBsYWNlZFNpZGU6USxvbkFycm93Q2hhbmdlOm9lLGFycm93WDpSZSxhcnJvd1k6d2Usc2hvdWxkSGlkZUFycm93OkllfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zaWRlIjpRLCJkYXRhLWFsaWduIjpqZX0sJCx7cmVmOkQsc3R5bGU6ey4uLiQuc3R5bGUsYW5pbWF0aW9uOkFlP3ZvaWQgMDoibm9uZSIsb3BhY2l0eToodT1OZS5oaWRlKSE9PW51bGwmJnUhPT12b2lkIDAmJnUucmVmZXJlbmNlSGlkZGVuPzA6dm9pZCAwfX0pKSkpfSk7ZnVuY3Rpb24gU00odCl7cmV0dXJuIHQhPT1udWxsfWNvbnN0IEVNPXQ9Pih7bmFtZToidHJhbnNmb3JtT3JpZ2luIixvcHRpb25zOnQsZm4oZSl7dmFyIG4scixpLG8sbDtjb25zdHtwbGFjZW1lbnQ6cyxyZWN0czphLG1pZGRsZXdhcmVEYXRhOnV9PWUsZD0oKG49dS5hcnJvdyk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmNlbnRlck9mZnNldCkhPT0wLGY9ZD8wOnQuYXJyb3dXaWR0aCxoPWQ/MDp0LmFycm93SGVpZ2h0LFttLGddPXFDKHMpLHc9e3N0YXJ0OiIwJSIsY2VudGVyOiI1MCUiLGVuZDoiMTAwJSJ9W2ddLHY9KChyPShpPXUuYXJyb3cpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS54KSE9PW51bGwmJnIhPT12b2lkIDA/cjowKStmLzIseT0oKG89KGw9dS5hcnJvdyk9PT1udWxsfHxsPT09dm9pZCAwP3ZvaWQgMDpsLnkpIT09bnVsbCYmbyE9PXZvaWQgMD9vOjApK2gvMjtsZXQgeD0iIixTPSIiO3JldHVybiBtPT09ImJvdHRvbSI/KHg9ZD93OmAke3Z9cHhgLFM9YCR7LWh9cHhgKTptPT09InRvcCI/KHg9ZD93OmAke3Z9cHhgLFM9YCR7YS5mbG9hdGluZy5oZWlnaHQraH1weGApOm09PT0icmlnaHQiPyh4PWAkey1ofXB4YCxTPWQ/dzpgJHt5fXB4YCk6bT09PSJsZWZ0IiYmKHg9YCR7YS5mbG9hdGluZy53aWR0aCtofXB4YCxTPWQ/dzpgJHt5fXB4YCkse2RhdGE6e3gseTpTfX19fSk7ZnVuY3Rpb24gcUModCl7Y29uc3RbZSxuPSJjZW50ZXIiXT10LnNwbGl0KCItIik7cmV0dXJuW2Usbl19Y29uc3QgQ009dk0sa009eE0sYk09d00sJE09cC5mb3J3YXJkUmVmKCh0LGUpPT57dmFyIG47Y29uc3R7Y29udGFpbmVyOnI9Z2xvYmFsVGhpcz09bnVsbHx8KG49Z2xvYmFsVGhpcy5kb2N1bWVudCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmJvZHksLi4uaX09dDtyZXR1cm4gcj9qdy5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6ZX0pKSxyKTpudWxsfSk7ZnVuY3Rpb24gbXMoe3Byb3A6dCxkZWZhdWx0UHJvcDplLG9uQ2hhbmdlOm49KCk9Pnt9fSl7Y29uc3RbcixpXT1UTSh7ZGVmYXVsdFByb3A6ZSxvbkNoYW5nZTpufSksbz10IT09dm9pZCAwLGw9bz90OnIscz1lbihuKSxhPXAudXNlQ2FsbGJhY2sodT0+e2lmKG8pe2NvbnN0IGQ9dHlwZW9mIHU9PSJmdW5jdGlvbiI/dSh0KTp1O2QhPT10JiZzKGQpfWVsc2UgaSh1KX0sW28sdCxpLHNdKTtyZXR1cm5bbCxhXX1mdW5jdGlvbiBUTSh7ZGVmYXVsdFByb3A6dCxvbkNoYW5nZTplfSl7Y29uc3Qgbj1wLnVzZVN0YXRlKHQpLFtyXT1uLGk9cC51c2VSZWYociksbz1lbihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQhPT1yJiYobyhyKSxpLmN1cnJlbnQ9cil9LFtyLGksb10pLG59ZnVuY3Rpb24gZWsodCl7Y29uc3QgZT1wLnVzZVJlZih7dmFsdWU6dCxwcmV2aW91czp0fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KGUuY3VycmVudC52YWx1ZSE9PXQmJihlLmN1cnJlbnQucHJldmlvdXM9ZS5jdXJyZW50LnZhbHVlLGUuY3VycmVudC52YWx1ZT10KSxlLmN1cnJlbnQucHJldmlvdXMpLFt0XSl9Y29uc3QgTk09cC5mb3J3YXJkUmVmKCh0LGUpPT5wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7fSx0LHtyZWY6ZSxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixib3JkZXI6MCx3aWR0aDoxLGhlaWdodDoxLHBhZGRpbmc6MCxtYXJnaW46LTEsb3ZlcmZsb3c6ImhpZGRlbiIsY2xpcDoicmVjdCgwLCAwLCAwLCAwKSIsd2hpdGVTcGFjZToibm93cmFwIix3b3JkV3JhcDoibm9ybWFsIiwuLi50LnN0eWxlfX0pKSk7dmFyIFJNPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7dmFyIGU9QXJyYXkuaXNBcnJheSh0KT90WzBdOnQ7cmV0dXJuIGUub3duZXJEb2N1bWVudC5ib2R5fSx3bD1uZXcgV2Vha01hcCxFYz1uZXcgV2Vha01hcCxDYz17fSxXaD0wLHRrPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5ob3N0fHx0ayh0LnBhcmVudE5vZGUpKX0sT009ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24obil7aWYodC5jb250YWlucyhuKSlyZXR1cm4gbjt2YXIgcj10ayhuKTtyZXR1cm4gciYmdC5jb250YWlucyhyKT9yOihjb25zb2xlLmVycm9yKCJhcmlhLWhpZGRlbiIsbiwiaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUiLHQsIi4gRG9pbmcgbm90aGluZyIpLG51bGwpfSkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhbn0pfSxQTT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1PTShlLEFycmF5LmlzQXJyYXkodCk/dDpbdF0pO0NjW25dfHwoQ2Nbbl09bmV3IFdlYWtNYXApO3ZhciBvPUNjW25dLGw9W10scz1uZXcgU2V0LGE9bmV3IFNldChpKSx1PWZ1bmN0aW9uKGQpeyFkfHxzLmhhcyhkKXx8KHMuYWRkKGQpLHUoZC5wYXJlbnROb2RlKSl9O2kuZm9yRWFjaCh1KTt2YXIgYz1mdW5jdGlvbihkKXshZHx8YS5oYXMoZCl8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5jaGlsZHJlbixmdW5jdGlvbihmKXtpZihzLmhhcyhmKSljKGYpO2Vsc2V7dmFyIGg9Zi5nZXRBdHRyaWJ1dGUociksbT1oIT09bnVsbCYmaCE9PSJmYWxzZSIsZz0od2wuZ2V0KGYpfHwwKSsxLHc9KG8uZ2V0KGYpfHwwKSsxO3dsLnNldChmLGcpLG8uc2V0KGYsdyksbC5wdXNoKGYpLGc9PT0xJiZtJiZFYy5zZXQoZiwhMCksdz09PTEmJmYuc2V0QXR0cmlidXRlKG4sInRydWUiKSxtfHxmLnNldEF0dHJpYnV0ZShyLCJ0cnVlIil9fSl9O3JldHVybiBjKGUpLHMuY2xlYXIoKSxXaCsrLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBmPXdsLmdldChkKS0xLGg9by5nZXQoZCktMTt3bC5zZXQoZCxmKSxvLnNldChkLGgpLGZ8fChFYy5oYXMoZCl8fGQucmVtb3ZlQXR0cmlidXRlKHIpLEVjLmRlbGV0ZShkKSksaHx8ZC5yZW1vdmVBdHRyaWJ1dGUobil9KSxXaC0tLFdofHwod2w9bmV3IFdlYWtNYXAsd2w9bmV3IFdlYWtNYXAsRWM9bmV3IFdlYWtNYXAsQ2M9e30pfX0sQU09ZnVuY3Rpb24odCxlLG4pe249PT12b2lkIDAmJihuPSJkYXRhLWFyaWEtaGlkZGVuIik7dmFyIHI9QXJyYXkuZnJvbShBcnJheS5pc0FycmF5KHQpP3Q6W3RdKSxpPWV8fFJNKHQpO3JldHVybiBpPyhyLnB1c2guYXBwbHkocixBcnJheS5mcm9tKGkucXVlcnlTZWxlY3RvckFsbCgiW2FyaWEtbGl2ZV0iKSkpLFBNKHIsaSxuLCJhcmlhLWhpZGRlbiIpKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sTHI9ZnVuY3Rpb24oKXtyZXR1cm4gTHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9MSxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKyl7bj1hcmd1bWVudHNbcl07Zm9yKHZhciBvIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJihlW29dPW5bb10pfXJldHVybiBlfSxMci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG5rKHQsZSl7dmFyIG49e307Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZih0IT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIilmb3IodmFyIGk9MCxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aTxyLmxlbmd0aDtpKyspZS5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHJbaV0pJiYobltyW2ldXT10W3JbaV1dKTtyZXR1cm4gbn1mdW5jdGlvbiBNTSh0LGUsbil7aWYobnx8YXJndW1lbnRzLmxlbmd0aD09PTIpZm9yKHZhciByPTAsaT1lLmxlbmd0aCxvO3I8aTtyKyspKG98fCEociBpbiBlKSkmJihvfHwobz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDAscikpLG9bcl09ZVtyXSk7cmV0dXJuIHQuY29uY2F0KG98fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX12YXIgWmM9InJpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24iLEdjPSJ3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhciIsTE09IndpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuIixJTT0iLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplIjtmdW5jdGlvbiBETSh0LGUpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQmJih0LmN1cnJlbnQ9ZSksdH1mdW5jdGlvbiBqTSh0LGUpe3ZhciBuPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6dCxjYWxsYmFjazplLGZhY2FkZTp7Z2V0IGN1cnJlbnQoKXtyZXR1cm4gbi52YWx1ZX0sc2V0IGN1cnJlbnQocil7dmFyIGk9bi52YWx1ZTtpIT09ciYmKG4udmFsdWU9cixuLmNhbGxiYWNrKHIsaSkpfX19fSlbMF07cmV0dXJuIG4uY2FsbGJhY2s9ZSxuLmZhY2FkZX1mdW5jdGlvbiB6TSh0LGUpe3JldHVybiBqTShlfHxudWxsLGZ1bmN0aW9uKG4pe3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIERNKHIsbil9KX0pfWZ1bmN0aW9uIEZNKHQpe3JldHVybiB0fWZ1bmN0aW9uIEJNKHQsZSl7ZT09PXZvaWQgMCYmKGU9Rk0pO3ZhciBuPVtdLHI9ITEsaT17cmVhZDpmdW5jdGlvbigpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4iKTtyZXR1cm4gbi5sZW5ndGg/bltuLmxlbmd0aC0xXTp0fSx1c2VNZWRpdW06ZnVuY3Rpb24obyl7dmFyIGw9ZShvLHIpO3JldHVybiBuLnB1c2gobCksZnVuY3Rpb24oKXtuPW4uZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzIT09bH0pfX0sYXNzaWduU3luY01lZGl1bTpmdW5jdGlvbihvKXtmb3Iocj0hMDtuLmxlbmd0aDspe3ZhciBsPW47bj1bXSxsLmZvckVhY2gobyl9bj17cHVzaDpmdW5jdGlvbihzKXtyZXR1cm4gbyhzKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG59fX0sYXNzaWduTWVkaXVtOmZ1bmN0aW9uKG8pe3I9ITA7dmFyIGw9W107aWYobi5sZW5ndGgpe3ZhciBzPW47bj1bXSxzLmZvckVhY2gobyksbD1ufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGM9bDtsPVtdLGMuZm9yRWFjaChvKX0sdT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfTt1KCksbj17cHVzaDpmdW5jdGlvbihjKXtsLnB1c2goYyksdSgpfSxmaWx0ZXI6ZnVuY3Rpb24oYyl7cmV0dXJuIGw9bC5maWx0ZXIoYyksbn19fX07cmV0dXJuIGl9ZnVuY3Rpb24gVU0odCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBlPUJNKG51bGwpO3JldHVybiBlLm9wdGlvbnM9THIoe2FzeW5jOiEwLHNzcjohMX0sdCksZX12YXIgcms9ZnVuY3Rpb24odCl7dmFyIGU9dC5zaWRlQ2FyLG49bmsodCxbInNpZGVDYXIiXSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXIiKTt2YXIgcj1lLnJlYWQoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocixMcih7fSxuKSl9O3JrLmlzU2lkZUNhckV4cG9ydD0hMDtmdW5jdGlvbiBXTSh0LGUpe3JldHVybiB0LnVzZU1lZGl1bShlKSxya312YXIgaWs9VU0oKSxWaD1mdW5jdGlvbigpe30sRmY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49cC51c2VSZWYobnVsbCkscj1wLnVzZVN0YXRlKHtvblNjcm9sbENhcHR1cmU6Vmgsb25XaGVlbENhcHR1cmU6Vmgsb25Ub3VjaE1vdmVDYXB0dXJlOlZofSksaT1yWzBdLG89clsxXSxsPXQuZm9yd2FyZFByb3BzLHM9dC5jaGlsZHJlbixhPXQuY2xhc3NOYW1lLHU9dC5yZW1vdmVTY3JvbGxCYXIsYz10LmVuYWJsZWQsZD10LnNoYXJkcyxmPXQuc2lkZUNhcixoPXQubm9Jc29sYXRpb24sbT10LmluZXJ0LGc9dC5hbGxvd1BpbmNoWm9vbSx3PXQuYXMsdj13PT09dm9pZCAwPyJkaXYiOncseT1uayh0LFsiZm9yd2FyZFByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJyZW1vdmVTY3JvbGxCYXIiLCJlbmFibGVkIiwic2hhcmRzIiwic2lkZUNhciIsIm5vSXNvbGF0aW9uIiwiaW5lcnQiLCJhbGxvd1BpbmNoWm9vbSIsImFzIl0pLHg9ZixTPXpNKFtuLGVdKSxiPUxyKExyKHt9LHkpLGkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGMmJnAuY3JlYXRlRWxlbWVudCh4LHtzaWRlQ2FyOmlrLHJlbW92ZVNjcm9sbEJhcjp1LHNoYXJkczpkLG5vSXNvbGF0aW9uOmgsaW5lcnQ6bSxzZXRDYWxsYmFja3M6byxhbGxvd1BpbmNoWm9vbTohIWcsbG9ja1JlZjpufSksbD9wLmNsb25lRWxlbWVudChwLkNoaWxkcmVuLm9ubHkocyksTHIoTHIoe30sYikse3JlZjpTfSkpOnAuY3JlYXRlRWxlbWVudCh2LExyKHt9LGIse2NsYXNzTmFtZTphLHJlZjpTfSkscykpfSk7RmYuZGVmYXVsdFByb3BzPXtlbmFibGVkOiEwLHJlbW92ZVNjcm9sbEJhcjohMCxpbmVydDohMX07RmYuY2xhc3NOYW1lcz17ZnVsbFdpZHRoOkdjLHplcm9SaWdodDpaY307dmFyIEd4LFZNPWZ1bmN0aW9uKCl7aWYoR3gpcmV0dXJuIEd4O2lmKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXzwidSIpcmV0dXJuIF9fd2VicGFja19ub25jZV9ffTtmdW5jdGlvbiBITSgpe2lmKCFkb2N1bWVudClyZXR1cm4gbnVsbDt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QudHlwZT0idGV4dC9jc3MiO3ZhciBlPVZNKCk7cmV0dXJuIGUmJnQuc2V0QXR0cmlidXRlKCJub25jZSIsZSksdH1mdW5jdGlvbiBLTSh0LGUpe3Quc3R5bGVTaGVldD90LnN0eWxlU2hlZXQuY3NzVGV4dD1lOnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSkpfWZ1bmN0aW9uIFpNKHQpe3ZhciBlPWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07ZS5hcHBlbmRDaGlsZCh0KX12YXIgR009ZnVuY3Rpb24oKXt2YXIgdD0wLGU9bnVsbDtyZXR1cm57YWRkOmZ1bmN0aW9uKG4pe3Q9PTAmJihlPUhNKCkpJiYoS00oZSxuKSxaTShlKSksdCsrfSxyZW1vdmU6ZnVuY3Rpb24oKXt0LS0sIXQmJmUmJihlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGwpfX19LFlNPWZ1bmN0aW9uKCl7dmFyIHQ9R00oKTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiB0LmFkZChlKSxmdW5jdGlvbigpe3QucmVtb3ZlKCl9fSxbZSYmbl0pfX0sb2s9ZnVuY3Rpb24oKXt2YXIgdD1ZTSgpLGU9ZnVuY3Rpb24obil7dmFyIHI9bi5zdHlsZXMsaT1uLmR5bmFtaWM7cmV0dXJuIHQocixpKSxudWxsfTtyZXR1cm4gZX0sWE09e2xlZnQ6MCx0b3A6MCxyaWdodDowLGdhcDowfSxIaD1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodHx8IiIsMTApfHwwfSxRTT1mdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KSxuPWVbdD09PSJwYWRkaW5nIj8icGFkZGluZ0xlZnQiOiJtYXJnaW5MZWZ0Il0scj1lW3Q9PT0icGFkZGluZyI/InBhZGRpbmdUb3AiOiJtYXJnaW5Ub3AiXSxpPWVbdD09PSJwYWRkaW5nIj8icGFkZGluZ1JpZ2h0IjoibWFyZ2luUmlnaHQiXTtyZXR1cm5bSGgobiksSGgociksSGgoaSldfSxKTT1mdW5jdGlvbih0KXtpZih0PT09dm9pZCAwJiYodD0ibWFyZ2luIiksdHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIFhNO3ZhciBlPVFNKHQpLG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVyV2lkdGg7cmV0dXJue2xlZnQ6ZVswXSx0b3A6ZVsxXSxyaWdodDplWzJdLGdhcDpNYXRoLm1heCgwLHItbitlWzJdLWVbMF0pfX0scU09b2soKSxlND1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LmxlZnQsbz10LnRvcCxsPXQucmlnaHQscz10LmdhcDtyZXR1cm4gbj09PXZvaWQgMCYmKG49Im1hcmdpbiIpLGAKICAuYC5jb25jYXQoTE0sYCB7CiAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIGJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIGApLmNvbmNhdChbZSYmInBvc2l0aW9uOiByZWxhdGl2ZSAiLmNvbmNhdChyLCI7Iiksbj09PSJtYXJnaW4iJiZgCiAgICBwYWRkaW5nLWxlZnQ6IGAuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy10b3A6IGApLmNvbmNhdChvLGBweDsKICAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLGBweDsKICAgIG1hcmdpbi1sZWZ0OjA7CiAgICBtYXJnaW4tdG9wOjA7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogICAgYCksbj09PSJwYWRkaW5nIiYmInBhZGRpbmctcmlnaHQ6ICIuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLCI7IildLmZpbHRlcihCb29sZWFuKS5qb2luKCIiKSxgCiAgfQogIAogIC5gKS5jb25jYXQoWmMsYCB7CiAgICByaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KFpjLCIgLiIpLmNvbmNhdChaYyxgIHsKICAgIHJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsIiAuIikuY29uY2F0KEdjLGAgewogICAgbWFyZ2luLXJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIGJvZHkgewogICAgYCkuY29uY2F0KElNLCI6ICIpLmNvbmNhdChzLGBweDsKICB9CmApfSx0ND1mdW5jdGlvbih0KXt2YXIgZT10Lm5vUmVsYXRpdmUsbj10Lm5vSW1wb3J0YW50LHI9dC5nYXBNb2RlLGk9cj09PXZvaWQgMD8ibWFyZ2luIjpyLG89cC51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJuIEpNKGkpfSxbaV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocU0se3N0eWxlczplNChvLCFlLGksbj8iIjoiIWltcG9ydGFudCIpfSl9LFdnPSExO2lmKHR5cGVvZiB3aW5kb3c8InUiKXRyeXt2YXIga2M9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFdnPSEwLCEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixrYyxrYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGtjLGtjKX1jYXRjaHtXZz0hMX12YXIgU2w9V2c/e3Bhc3NpdmU6ITF9OiExLG40PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRhZ05hbWU9PT0iVEVYVEFSRUEifSxsaz1mdW5jdGlvbih0LGUpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpO3JldHVybiBuW2VdIT09ImhpZGRlbiImJiEobi5vdmVyZmxvd1k9PT1uLm92ZXJmbG93WCYmIW40KHQpJiZuW2VdPT09InZpc2libGUiKX0scjQ9ZnVuY3Rpb24odCl7cmV0dXJuIGxrKHQsIm92ZXJmbG93WSIpfSxpND1mdW5jdGlvbih0KXtyZXR1cm4gbGsodCwib3ZlcmZsb3dYIil9LFl4PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZTtkb3t0eXBlb2YgU2hhZG93Um9vdDwidSImJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290JiYobj1uLmhvc3QpO3ZhciByPXNrKHQsbik7aWYocil7dmFyIGk9YWsodCxuKSxvPWlbMV0sbD1pWzJdO2lmKG8+bClyZXR1cm4hMH1uPW4ucGFyZW50Tm9kZX13aGlsZShuJiZuIT09ZG9jdW1lbnQuYm9keSk7cmV0dXJuITF9LG80PWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2Nyb2xsVG9wLG49dC5zY3JvbGxIZWlnaHQscj10LmNsaWVudEhlaWdodDtyZXR1cm5bZSxuLHJdfSxsND1mdW5jdGlvbih0KXt2YXIgZT10LnNjcm9sbExlZnQsbj10LnNjcm9sbFdpZHRoLHI9dC5jbGllbnRXaWR0aDtyZXR1cm5bZSxuLHJdfSxzaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09InYiP3I0KGUpOmk0KGUpfSxhaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09InYiP280KGUpOmw0KGUpfSxzND1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ImgiJiZlPT09InJ0bCI/LTE6MX0sYTQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1zNCh0LHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmRpcmVjdGlvbiksbD1vKnIscz1uLnRhcmdldCxhPWUuY29udGFpbnMocyksdT0hMSxjPWw+MCxkPTAsZj0wO2Rve3ZhciBoPWFrKHQscyksbT1oWzBdLGc9aFsxXSx3PWhbMl0sdj1nLXctbyptOyhtfHx2KSYmc2sodCxzKSYmKGQrPXYsZis9bSkscz1zLnBhcmVudE5vZGV9d2hpbGUoIWEmJnMhPT1kb2N1bWVudC5ib2R5fHxhJiYoZS5jb250YWlucyhzKXx8ZT09PXMpKTtyZXR1cm4oYyYmKGkmJmQ9PT0wfHwhaSYmbD5kKXx8IWMmJihpJiZmPT09MHx8IWkmJi1sPmYpKSYmKHU9ITApLHV9LGJjPWZ1bmN0aW9uKHQpe3JldHVybiJjaGFuZ2VkVG91Y2hlcyJpbiB0P1t0LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsdC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXTpbMCwwXX0sWHg9ZnVuY3Rpb24odCl7cmV0dXJuW3QuZGVsdGFYLHQuZGVsdGFZXX0sUXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJjdXJyZW50ImluIHQ/dC5jdXJyZW50OnR9LHU0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX0sYzQ9ZnVuY3Rpb24odCl7cmV0dXJuYAogIC5ibG9jay1pbnRlcmFjdGl2aXR5LWAuY29uY2F0KHQsYCB7cG9pbnRlci1ldmVudHM6IG5vbmU7fQogIC5hbGxvdy1pbnRlcmFjdGl2aXR5LWApLmNvbmNhdCh0LGAge3BvaW50ZXItZXZlbnRzOiBhbGw7fQpgKX0sZDQ9MCxFbD1bXTtmdW5jdGlvbiBmNCh0KXt2YXIgZT1wLnVzZVJlZihbXSksbj1wLnVzZVJlZihbMCwwXSkscj1wLnVzZVJlZigpLGk9cC51c2VTdGF0ZShkNCsrKVswXSxvPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gb2soKX0pWzBdLGw9cC51c2VSZWYodCk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtsLmN1cnJlbnQ9dH0sW3RdKSxwLnVzZUVmZmVjdChmdW5jdGlvbigpe2lmKHQuaW5lcnQpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSk7dmFyIGc9TU0oW3QubG9ja1JlZi5jdXJyZW50XSwodC5zaGFyZHN8fFtdKS5tYXAoUXgpLCEwKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGcuZm9yRWFjaChmdW5jdGlvbih3KXtyZXR1cm4gdy5jbGFzc0xpc3QuYWRkKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKX0pLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKSxnLmZvckVhY2goZnVuY3Rpb24odyl7cmV0dXJuIHcuY2xhc3NMaXN0LnJlbW92ZSgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSl9KX19fSxbdC5pbmVydCx0LmxvY2tSZWYuY3VycmVudCx0LnNoYXJkc10pO3ZhciBzPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24oZyx3KXtpZigidG91Y2hlcyJpbiBnJiZnLnRvdWNoZXMubGVuZ3RoPT09MilyZXR1cm4hbC5jdXJyZW50LmFsbG93UGluY2hab29tO3ZhciB2PWJjKGcpLHk9bi5jdXJyZW50LHg9ImRlbHRhWCJpbiBnP2cuZGVsdGFYOnlbMF0tdlswXSxTPSJkZWx0YVkiaW4gZz9nLmRlbHRhWTp5WzFdLXZbMV0sYixUPWcudGFyZ2V0LCQ9TWF0aC5hYnMoeCk+TWF0aC5hYnMoUyk/ImgiOiJ2IjtpZigidG91Y2hlcyJpbiBnJiYkPT09ImgiJiZULnR5cGU9PT0icmFuZ2UiKXJldHVybiExO3ZhciBPPVl4KCQsVCk7aWYoIU8pcmV0dXJuITA7aWYoTz9iPSQ6KGI9JD09PSJ2Ij8iaCI6InYiLE89WXgoJCxUKSksIU8pcmV0dXJuITE7aWYoIXIuY3VycmVudCYmImNoYW5nZWRUb3VjaGVzImluIGcmJih4fHxTKSYmKHIuY3VycmVudD1iKSwhYilyZXR1cm4hMDt2YXIgTD1yLmN1cnJlbnR8fGI7cmV0dXJuIGE0KEwsdyxnLEw9PT0iaCI/eDpTLCEwKX0sW10pLGE9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt2YXIgdz1nO2lmKCEoIUVsLmxlbmd0aHx8RWxbRWwubGVuZ3RoLTFdIT09bykpe3ZhciB2PSJkZWx0YVkiaW4gdz9YeCh3KTpiYyh3KSx5PWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIubmFtZT09PXcudHlwZSYmYi50YXJnZXQ9PT13LnRhcmdldCYmdTQoYi5kZWx0YSx2KX0pWzBdO2lmKHkmJnkuc2hvdWxkKXt3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIXkpe3ZhciB4PShsLmN1cnJlbnQuc2hhcmRzfHxbXSkubWFwKFF4KS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiLmNvbnRhaW5zKHcudGFyZ2V0KX0pLFM9eC5sZW5ndGg+MD9zKHcseFswXSk6IWwuY3VycmVudC5ub0lzb2xhdGlvbjtTJiZ3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKX19fSxbXSksdT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcsdyx2LHkpe3ZhciB4PXtuYW1lOmcsZGVsdGE6dyx0YXJnZXQ6dixzaG91bGQ6eX07ZS5jdXJyZW50LnB1c2goeCksc2V0VGltZW91dChmdW5jdGlvbigpe2UuY3VycmVudD1lLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKFMpe3JldHVybiBTIT09eH0pfSwxKX0sW10pLGM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXtuLmN1cnJlbnQ9YmMoZyksci5jdXJyZW50PXZvaWQgMH0sW10pLGQ9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxYeChnKSxnLnRhcmdldCxzKGcsdC5sb2NrUmVmLmN1cnJlbnQpKX0sW10pLGY9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxiYyhnKSxnLnRhcmdldCxzKGcsdC5sb2NrUmVmLmN1cnJlbnQpKX0sW10pO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIEVsLnB1c2gobyksdC5zZXRDYWxsYmFja3Moe29uU2Nyb2xsQ2FwdHVyZTpkLG9uV2hlZWxDYXB0dXJlOmQsb25Ub3VjaE1vdmVDYXB0dXJlOmZ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKSxmdW5jdGlvbigpe0VsPUVsLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4gZyE9PW99KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKX19LFtdKTt2YXIgaD10LnJlbW92ZVNjcm9sbEJhcixtPXQuaW5lcnQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbT9wLmNyZWF0ZUVsZW1lbnQobyx7c3R5bGVzOmM0KGkpfSk6bnVsbCxoP3AuY3JlYXRlRWxlbWVudCh0NCx7Z2FwTW9kZToibWFyZ2luIn0pOm51bGwpfWNvbnN0IGg0PVdNKGlrLGY0KTt2YXIgdWs9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChGZixMcih7fSx0LHtyZWY6ZSxzaWRlQ2FyOmg0fSkpfSk7dWsuY2xhc3NOYW1lcz1GZi5jbGFzc05hbWVzO2NvbnN0IHA0PXVrLGc0PVsiICIsIkVudGVyIiwiQXJyb3dVcCIsIkFycm93RG93biJdLG00PVsiICIsIkVudGVyIl0sQmY9IlNlbGVjdCIsW1VmLFp2LHY0XT1MQyhCZiksW0RzLE9EXT1vbChCZixbdjQsWENdKSxHdj1YQygpLFt5NCxjbF09RHMoQmYpLFt4NCxfNF09RHMoQmYpLHc0PXQ9Pntjb25zdHtfX3Njb3BlU2VsZWN0OmUsY2hpbGRyZW46bixvcGVuOnIsZGVmYXVsdE9wZW46aSxvbk9wZW5DaGFuZ2U6byx2YWx1ZTpsLGRlZmF1bHRWYWx1ZTpzLG9uVmFsdWVDaGFuZ2U6YSxkaXI6dSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsZGlzYWJsZWQ6ZixyZXF1aXJlZDpofT10LG09R3YoZSksW2csd109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKG51bGwpLFt4LFNdPXAudXNlU3RhdGUoITEpLGI9WG0odSksW1Q9ITEsJF09bXMoe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOm99KSxbTyxMXT1tcyh7cHJvcDpsLGRlZmF1bHRQcm9wOnMsb25DaGFuZ2U6YX0pLFA9cC51c2VSZWYobnVsbCksRD1nPyEhZy5jbG9zZXN0KCJmb3JtIik6ITAsW0Isb2VdPXAudXNlU3RhdGUobmV3IFNldCksSD1BcnJheS5mcm9tKEIpLm1hcChaPT5aLnByb3BzLnZhbHVlKS5qb2luKCI7Iik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChDTSxtLHAuY3JlYXRlRWxlbWVudCh5NCx7cmVxdWlyZWQ6aCxzY29wZTplLHRyaWdnZXI6ZyxvblRyaWdnZXJDaGFuZ2U6dyx2YWx1ZU5vZGU6dixvblZhbHVlTm9kZUNoYW5nZTp5LHZhbHVlTm9kZUhhc0NoaWxkcmVuOngsb25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTpTLGNvbnRlbnRJZDpEZigpLHZhbHVlOk8sb25WYWx1ZUNoYW5nZTpMLG9wZW46VCxvbk9wZW5DaGFuZ2U6JCxkaXI6Yix0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6UCxkaXNhYmxlZDpmfSxwLmNyZWF0ZUVsZW1lbnQoVWYuUHJvdmlkZXIse3Njb3BlOmV9LHAuY3JlYXRlRWxlbWVudCh4NCx7c2NvcGU6dC5fX3Njb3BlU2VsZWN0LG9uTmF0aXZlT3B0aW9uQWRkOnAudXNlQ2FsbGJhY2soWj0+e29lKEM9Pm5ldyBTZXQoQykuYWRkKFopKX0sW10pLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnAudXNlQ2FsbGJhY2soWj0+e29lKEM9Pntjb25zdCBrPW5ldyBTZXQoQyk7cmV0dXJuIGsuZGVsZXRlKFopLGt9KX0sW10pfSxuKSksRD9wLmNyZWF0ZUVsZW1lbnQoaGsse2tleTpILCJhcmlhLWhpZGRlbiI6ITAscmVxdWlyZWQ6aCx0YWJJbmRleDotMSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsdmFsdWU6TyxvbkNoYW5nZTpaPT5MKFoudGFyZ2V0LnZhbHVlKSxkaXNhYmxlZDpmfSxPPT09dm9pZCAwP3AuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9KTpudWxsLEFycmF5LmZyb20oQikpOm51bGwpKX0sUzQ9IlNlbGVjdFRyaWdnZXIiLEU0PXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixkaXNhYmxlZDpyPSExLC4uLml9PXQsbz1HdihuKSxsPWNsKFM0LG4pLHM9bC5kaXNhYmxlZHx8cixhPXN0KGUsbC5vblRyaWdnZXJDaGFuZ2UpLHU9WnYobiksW2MsZCxmXT1wayhtPT57Y29uc3QgZz11KCkuZmlsdGVyKHk9PiF5LmRpc2FibGVkKSx3PWcuZmluZCh5PT55LnZhbHVlPT09bC52YWx1ZSksdj1nayhnLG0sdyk7diE9PXZvaWQgMCYmbC5vblZhbHVlQ2hhbmdlKHYudmFsdWUpfSksaD0oKT0+e3N8fChsLm9uT3BlbkNoYW5nZSghMCksZigpKX07cmV0dXJuIHAuY3JlYXRlRWxlbWVudChrTSxpZSh7YXNDaGlsZDohMH0sbykscC5jcmVhdGVFbGVtZW50KEtlLmJ1dHRvbixpZSh7dHlwZToiYnV0dG9uIixyb2xlOiJjb21ib2JveCIsImFyaWEtY29udHJvbHMiOmwuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpsLm9wZW4sImFyaWEtcmVxdWlyZWQiOmwucmVxdWlyZWQsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsZGlyOmwuZGlyLCJkYXRhLXN0YXRlIjpsLm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpc2FibGVkOnMsImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLCJkYXRhLXBsYWNlaG9sZGVyIjpmayhsLnZhbHVlKT8iIjp2b2lkIDB9LGkse3JlZjphLG9uQ2xpY2s6bnQoaS5vbkNsaWNrLG09PnttLmN1cnJlbnRUYXJnZXQuZm9jdXMoKX0pLG9uUG9pbnRlckRvd246bnQoaS5vblBvaW50ZXJEb3duLG09Pntjb25zdCBnPW0udGFyZ2V0O2cuaGFzUG9pbnRlckNhcHR1cmUobS5wb2ludGVySWQpJiZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShtLnBvaW50ZXJJZCksbS5idXR0b249PT0wJiZtLmN0cmxLZXk9PT0hMSYmKGgoKSxsLnRyaWdnZXJQb2ludGVyRG93blBvc1JlZi5jdXJyZW50PXt4Ok1hdGgucm91bmQobS5wYWdlWCkseTpNYXRoLnJvdW5kKG0ucGFnZVkpfSxtLnByZXZlbnREZWZhdWx0KCkpfSksb25LZXlEb3duOm50KGkub25LZXlEb3duLG09Pntjb25zdCBnPWMuY3VycmVudCE9PSIiOyEobS5jdHJsS2V5fHxtLmFsdEtleXx8bS5tZXRhS2V5KSYmbS5rZXkubGVuZ3RoPT09MSYmZChtLmtleSksIShnJiZtLmtleT09PSIgIikmJmc0LmluY2x1ZGVzKG0ua2V5KSYmKGgoKSxtLnByZXZlbnREZWZhdWx0KCkpfSl9KSkpfSksQzQ9IlNlbGVjdFZhbHVlIixrND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6aSxjaGlsZHJlbjpvLHBsYWNlaG9sZGVyOmw9IiIsLi4uc309dCxhPWNsKEM0LG4pLHtvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOnV9PWEsYz1vIT09dm9pZCAwLGQ9c3QoZSxhLm9uVmFsdWVOb2RlQ2hhbmdlKTtyZXR1cm4gVW4oKCk9Pnt1KGMpfSxbdSxjXSkscC5jcmVhdGVFbGVtZW50KEtlLnNwYW4saWUoe30scyx7cmVmOmQsc3R5bGU6e3BvaW50ZXJFdmVudHM6Im5vbmUifX0pLGZrKGEudmFsdWUpP3AuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbCk6byl9KSxiND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2hpbGRyZW46ciwuLi5pfT10O3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0saSx7cmVmOmV9KSxyfHwi4pa8Iil9KSwkND10PT5wLmNyZWF0ZUVsZW1lbnQoJE0saWUoe2FzQ2hpbGQ6ITB9LHQpKSx2cz0iU2VsZWN0Q29udGVudCIsVDQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3Qgbj1jbCh2cyx0Ll9fc2NvcGVTZWxlY3QpLFtyLGldPXAudXNlU3RhdGUoKTtpZihVbigoKT0+e2kobmV3IERvY3VtZW50RnJhZ21lbnQpfSxbXSksIW4ub3Blbil7Y29uc3Qgbz1yO3JldHVybiBvP0dyLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoY2sse3Njb3BlOnQuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KFVmLlNsb3Qse3Njb3BlOnQuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsdC5jaGlsZHJlbikpKSxvKTpudWxsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoTjQsaWUoe30sdCx7cmVmOmV9KSl9KSxyaT0xMCxbY2ssV2ZdPURzKHZzKSxOND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4scG9zaXRpb246cj0iaXRlbS1hbGlnbmVkIixvbkNsb3NlQXV0b0ZvY3VzOmksb25Fc2NhcGVLZXlEb3duOm8sb25Qb2ludGVyRG93bk91dHNpZGU6bCxzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6bSxoaWRlV2hlbkRldGFjaGVkOmcsYXZvaWRDb2xsaXNpb25zOncsLi4udn09dCx5PWNsKHZzLG4pLFt4LFNdPXAudXNlU3RhdGUobnVsbCksW2IsVF09cC51c2VTdGF0ZShudWxsKSwkPXN0KGUsUT0+UyhRKSksW08sTF09cC51c2VTdGF0ZShudWxsKSxbUCxEXT1wLnVzZVN0YXRlKG51bGwpLEI9WnYobiksW29lLEhdPXAudXNlU3RhdGUoITEpLFo9cC51c2VSZWYoITEpO3AudXNlRWZmZWN0KCgpPT57aWYoeClyZXR1cm4gQU0oeCl9LFt4XSksRTMoKTtjb25zdCBDPXAudXNlQ2FsbGJhY2soUT0+e2NvbnN0W2plLC4uLmJlXT1CKCkubWFwKEllPT5JZS5yZWYuY3VycmVudCksW1JlXT1iZS5zbGljZSgtMSksd2U9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgSWUgb2YgUSlpZihJZT09PXdlfHwoSWU9PW51bGx8fEllLnNjcm9sbEludG9WaWV3KHtibG9jazoibmVhcmVzdCJ9KSxJZT09PWplJiZiJiYoYi5zY3JvbGxUb3A9MCksSWU9PT1SZSYmYiYmKGIuc2Nyb2xsVG9wPWIuc2Nyb2xsSGVpZ2h0KSxJZT09bnVsbHx8SWUuZm9jdXMoKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09d2UpKXJldHVybn0sW0IsYl0pLGs9cC51c2VDYWxsYmFjaygoKT0+QyhbTyx4XSksW0MsTyx4XSk7cC51c2VFZmZlY3QoKCk9PntvZSYmaygpfSxbb2Usa10pO2NvbnN0e29uT3BlbkNoYW5nZTpFLHRyaWdnZXJQb2ludGVyRG93blBvc1JlZjpBfT15O3AudXNlRWZmZWN0KCgpPT57aWYoeCl7bGV0IFE9e3g6MCx5OjB9O2NvbnN0IGplPVJlPT57dmFyIHdlLEllLFFlLFd0O1E9e3g6TWF0aC5hYnMoTWF0aC5yb3VuZChSZS5wYWdlWCktKCh3ZT0oSWU9QS5jdXJyZW50KT09PW51bGx8fEllPT09dm9pZCAwP3ZvaWQgMDpJZS54KSE9PW51bGwmJndlIT09dm9pZCAwP3dlOjApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoUmUucGFnZVkpLSgoUWU9KFd0PUEuY3VycmVudCk9PT1udWxsfHxXdD09PXZvaWQgMD92b2lkIDA6V3QueSkhPT1udWxsJiZRZSE9PXZvaWQgMD9RZTowKSl9fSxiZT1SZT0+e1EueDw9MTAmJlEueTw9MTA/UmUucHJldmVudERlZmF1bHQoKTp4LmNvbnRhaW5zKFJlLnRhcmdldCl8fEUoITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixqZSksQS5jdXJyZW50PW51bGx9O3JldHVybiBBLmN1cnJlbnQhPT1udWxsJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGplKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLGJlLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsamUpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsYmUse2NhcHR1cmU6ITB9KX19fSxbeCxFLEFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IFE9KCk9PkUoITEpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsUSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsUSksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsUSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsUSl9fSxbRV0pO2NvbnN0W04sRl09cGsoUT0+e2NvbnN0IGplPUIoKS5maWx0ZXIod2U9PiF3ZS5kaXNhYmxlZCksYmU9amUuZmluZCh3ZT0+d2UucmVmLmN1cnJlbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSxSZT1nayhqZSxRLGJlKTtSZSYmc2V0VGltZW91dCgoKT0+UmUucmVmLmN1cnJlbnQuZm9jdXMoKSl9KSxLPXAudXNlQ2FsbGJhY2soKFEsamUsYmUpPT57Y29uc3QgUmU9IVouY3VycmVudCYmIWJlOyh5LnZhbHVlIT09dm9pZCAwJiZ5LnZhbHVlPT09amV8fFJlKSYmKEwoUSksUmUmJihaLmN1cnJlbnQ9ITApKX0sW3kudmFsdWVdKSxkZT1wLnVzZUNhbGxiYWNrKCgpPT54PT1udWxsP3ZvaWQgMDp4LmZvY3VzKCksW3hdKSxzZT1wLnVzZUNhbGxiYWNrKChRLGplLGJlKT0+e2NvbnN0IFJlPSFaLmN1cnJlbnQmJiFiZTsoeS52YWx1ZSE9PXZvaWQgMCYmeS52YWx1ZT09PWplfHxSZSkmJkQoUSl9LFt5LnZhbHVlXSksQWU9cj09PSJwb3BwZXIiP0p4OlI0LE5lPUFlPT09Sng/e3NpZGU6cyxzaWRlT2Zmc2V0OmEsYWxpZ246dSxhbGlnbk9mZnNldDpjLGFycm93UGFkZGluZzpkLGNvbGxpc2lvbkJvdW5kYXJ5OmYsY29sbGlzaW9uUGFkZGluZzpoLHN0aWNreTptLGhpZGVXaGVuRGV0YWNoZWQ6Zyxhdm9pZENvbGxpc2lvbnM6d306e307cmV0dXJuIHAuY3JlYXRlRWxlbWVudChjayx7c2NvcGU6bixjb250ZW50Ongsdmlld3BvcnQ6YixvblZpZXdwb3J0Q2hhbmdlOlQsaXRlbVJlZkNhbGxiYWNrOkssc2VsZWN0ZWRJdGVtOk8sb25JdGVtTGVhdmU6ZGUsaXRlbVRleHRSZWZDYWxsYmFjazpzZSxmb2N1c1NlbGVjdGVkSXRlbTprLHNlbGVjdGVkSXRlbVRleHQ6UCxwb3NpdGlvbjpyLGlzUG9zaXRpb25lZDpvZSxzZWFyY2hSZWY6Tn0scC5jcmVhdGVFbGVtZW50KHA0LHthcyxhbGxvd1BpbmNoWm9vbTohMH0scC5jcmVhdGVFbGVtZW50KEMzLHthc0NoaWxkOiEwLHRyYXBwZWQ6eS5vcGVuLG9uTW91bnRBdXRvRm9jdXM6UT0+e1EucHJldmVudERlZmF1bHQoKX0sb25Vbm1vdW50QXV0b0ZvY3VzOm50KGksUT0+e3ZhciBqZTsoamU9eS50cmlnZ2VyKT09PW51bGx8fGplPT09dm9pZCAwfHxqZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLFEucHJldmVudERlZmF1bHQoKX0pfSxwLmNyZWF0ZUVsZW1lbnQoXzMse2FzQ2hpbGQ6ITAsZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiEwLG9uRXNjYXBlS2V5RG93bjpvLG9uUG9pbnRlckRvd25PdXRzaWRlOmwsb25Gb2N1c091dHNpZGU6UT0+US5wcmV2ZW50RGVmYXVsdCgpLG9uRGlzbWlzczooKT0+eS5vbk9wZW5DaGFuZ2UoITEpfSxwLmNyZWF0ZUVsZW1lbnQoQWUsaWUoe3JvbGU6Imxpc3Rib3giLGlkOnkuY29udGVudElkLCJkYXRhLXN0YXRlIjp5Lm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpcjp5LmRpcixvbkNvbnRleHRNZW51OlE9PlEucHJldmVudERlZmF1bHQoKX0sdixOZSx7b25QbGFjZWQ6KCk9PkgoITApLHJlZjokLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLG91dGxpbmU6Im5vbmUiLC4uLnYuc3R5bGV9LG9uS2V5RG93bjpudCh2Lm9uS2V5RG93bixRPT57Y29uc3QgamU9US5jdHJsS2V5fHxRLmFsdEtleXx8US5tZXRhS2V5O2lmKFEua2V5PT09IlRhYiImJlEucHJldmVudERlZmF1bHQoKSwhamUmJlEua2V5Lmxlbmd0aD09PTEmJkYoUS5rZXkpLFsiQXJyb3dVcCIsIkFycm93RG93biIsIkhvbWUiLCJFbmQiXS5pbmNsdWRlcyhRLmtleSkpe2xldCBSZT1CKCkuZmlsdGVyKHdlPT4hd2UuZGlzYWJsZWQpLm1hcCh3ZT0+d2UucmVmLmN1cnJlbnQpO2lmKFsiQXJyb3dVcCIsIkVuZCJdLmluY2x1ZGVzKFEua2V5KSYmKFJlPVJlLnNsaWNlKCkucmV2ZXJzZSgpKSxbIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyhRLmtleSkpe2NvbnN0IHdlPVEudGFyZ2V0LEllPVJlLmluZGV4T2Yod2UpO1JlPVJlLnNsaWNlKEllKzEpfXNldFRpbWVvdXQoKCk9PkMoUmUpKSxRLnByZXZlbnREZWZhdWx0KCl9fSl9KSkpKSkpfSksUjQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLG9uUGxhY2VkOnIsLi4uaX09dCxvPWNsKHZzLG4pLGw9V2YodnMsbiksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLGQ9c3QoZSwkPT5jKCQpKSxmPVp2KG4pLGg9cC51c2VSZWYoITEpLG09cC51c2VSZWYoITApLHt2aWV3cG9ydDpnLHNlbGVjdGVkSXRlbTp3LHNlbGVjdGVkSXRlbVRleHQ6dixmb2N1c1NlbGVjdGVkSXRlbTp5fT1sLHg9cC51c2VDYWxsYmFjaygoKT0+e2lmKG8udHJpZ2dlciYmby52YWx1ZU5vZGUmJnMmJnUmJmcmJncmJnYpe2NvbnN0ICQ9by50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLE89dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxMPW8udmFsdWVOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihvLmRpciE9PSJydGwiKXtjb25zdCB3ZT1QLmxlZnQtTy5sZWZ0LEllPUwubGVmdC13ZSxRZT0kLmxlZnQtSWUsV3Q9JC53aWR0aCtRZSxTbj1NYXRoLm1heChXdCxPLndpZHRoKSxscj13aW5kb3cuaW5uZXJXaWR0aC1yaSx6ZT1HcChJZSxbcmksbHItU25dKTtzLnN0eWxlLm1pbldpZHRoPVd0KyJweCIscy5zdHlsZS5sZWZ0PXplKyJweCJ9ZWxzZXtjb25zdCB3ZT1PLnJpZ2h0LVAucmlnaHQsSWU9d2luZG93LmlubmVyV2lkdGgtTC5yaWdodC13ZSxRZT13aW5kb3cuaW5uZXJXaWR0aC0kLnJpZ2h0LUllLFd0PSQud2lkdGgrUWUsU249TWF0aC5tYXgoV3QsTy53aWR0aCksbHI9d2luZG93LmlubmVyV2lkdGgtcmksemU9R3AoSWUsW3JpLGxyLVNuXSk7cy5zdHlsZS5taW5XaWR0aD1XdCsicHgiLHMuc3R5bGUucmlnaHQ9emUrInB4In1jb25zdCBEPWYoKSxCPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLG9lPWcuc2Nyb2xsSGVpZ2h0LEg9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksWj1wYXJzZUludChILmJvcmRlclRvcFdpZHRoLDEwKSxDPXBhcnNlSW50KEgucGFkZGluZ1RvcCwxMCksaz1wYXJzZUludChILmJvcmRlckJvdHRvbVdpZHRoLDEwKSxFPXBhcnNlSW50KEgucGFkZGluZ0JvdHRvbSwxMCksQT1aK0Mrb2UrRStrLE49TWF0aC5taW4ody5vZmZzZXRIZWlnaHQqNSxBKSxGPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLEs9cGFyc2VJbnQoRi5wYWRkaW5nVG9wLDEwKSxkZT1wYXJzZUludChGLnBhZGRpbmdCb3R0b20sMTApLHNlPSQudG9wKyQuaGVpZ2h0LzItcmksQWU9Qi1zZSxOZT13Lm9mZnNldEhlaWdodC8yLFE9dy5vZmZzZXRUb3ArTmUsamU9WitDK1EsYmU9QS1qZTtpZihqZTw9c2Upe2NvbnN0IHdlPXc9PT1EW0QubGVuZ3RoLTFdLnJlZi5jdXJyZW50O3Muc3R5bGUuYm90dG9tPSIwcHgiO2NvbnN0IEllPXUuY2xpZW50SGVpZ2h0LWcub2Zmc2V0VG9wLWcub2Zmc2V0SGVpZ2h0LFFlPU1hdGgubWF4KEFlLE5lKyh3ZT9kZTowKStJZStrKSxXdD1qZStRZTtzLnN0eWxlLmhlaWdodD1XdCsicHgifWVsc2V7Y29uc3Qgd2U9dz09PURbMF0ucmVmLmN1cnJlbnQ7cy5zdHlsZS50b3A9IjBweCI7Y29uc3QgUWU9TWF0aC5tYXgoc2UsWitnLm9mZnNldFRvcCsod2U/SzowKStOZSkrYmU7cy5zdHlsZS5oZWlnaHQ9UWUrInB4IixnLnNjcm9sbFRvcD1qZS1zZStnLm9mZnNldFRvcH1zLnN0eWxlLm1hcmdpbj1gJHtyaX1weCAwYCxzLnN0eWxlLm1pbkhlaWdodD1OKyJweCIscy5zdHlsZS5tYXhIZWlnaHQ9QisicHgiLHI9PW51bGx8fHIoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PmguY3VycmVudD0hMCl9fSxbZixvLnRyaWdnZXIsby52YWx1ZU5vZGUscyx1LGcsdyx2LG8uZGlyLHJdKTtVbigoKT0+eCgpLFt4XSk7Y29uc3RbUyxiXT1wLnVzZVN0YXRlKCk7VW4oKCk9Pnt1JiZiKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLnpJbmRleCl9LFt1XSk7Y29uc3QgVD1wLnVzZUNhbGxiYWNrKCQ9PnskJiZtLmN1cnJlbnQ9PT0hMCYmKHgoKSx5PT1udWxsfHx5KCksbS5jdXJyZW50PSExKX0sW3gseV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoTzQse3Njb3BlOm4sY29udGVudFdyYXBwZXI6cyxzaG91bGRFeHBhbmRPblNjcm9sbFJlZjpoLG9uU2Nyb2xsQnV0dG9uQ2hhbmdlOlR9LHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIscG9zaXRpb246ImZpeGVkIix6SW5kZXg6U319LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30saSx7cmVmOmQsc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsbWF4SGVpZ2h0OiIxMDAlIiwuLi5pLnN0eWxlfX0pKSkpfSksSng9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGFsaWduOnI9InN0YXJ0Iixjb2xsaXNpb25QYWRkaW5nOmk9cmksLi4ub309dCxsPUd2KG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoYk0saWUoe30sbCxvLHtyZWY6ZSxhbGlnbjpyLGNvbGxpc2lvblBhZGRpbmc6aSxzdHlsZTp7Ym94U2l6aW5nOiJib3JkZXItYm94IiwuLi5vLnN0eWxlLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4iOiJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbikiLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodCkifX0pKX0pLFtPNCxQNF09RHModnMse30pLHF4PSJTZWxlY3RWaWV3cG9ydCIsQTQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQsaT1XZihxeCxuKSxvPVA0KHF4LG4pLGw9c3QoZSxpLm9uVmlld3BvcnRDaGFuZ2UpLHM9cC51c2VSZWYoMCk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF06Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX0ifX0pLHAuY3JlYXRlRWxlbWVudChVZi5TbG90LHtzY29wZTpufSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnQiOiIiLHJvbGU6InByZXNlbnRhdGlvbiJ9LHIse3JlZjpsLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxvdmVyZmxvdzoiYXV0byIsLi4uci5zdHlsZX0sb25TY3JvbGw6bnQoci5vblNjcm9sbCxhPT57Y29uc3QgdT1hLmN1cnJlbnRUYXJnZXQse2NvbnRlbnRXcmFwcGVyOmMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6ZH09bztpZihkIT1udWxsJiZkLmN1cnJlbnQmJmMpe2NvbnN0IGY9TWF0aC5hYnMocy5jdXJyZW50LXUuc2Nyb2xsVG9wKTtpZihmPjApe2NvbnN0IGg9d2luZG93LmlubmVySGVpZ2h0LXJpKjIsbT1wYXJzZUZsb2F0KGMuc3R5bGUubWluSGVpZ2h0KSxnPXBhcnNlRmxvYXQoYy5zdHlsZS5oZWlnaHQpLHc9TWF0aC5tYXgobSxnKTtpZih3PGgpe2NvbnN0IHY9dytmLHk9TWF0aC5taW4oaCx2KSx4PXYteTtjLnN0eWxlLmhlaWdodD15KyJweCIsYy5zdHlsZS5ib3R0b209PT0iMHB4IiYmKHUuc2Nyb2xsVG9wPXg+MD94OjAsYy5zdHlsZS5qdXN0aWZ5Q29udGVudD0iZmxleC1lbmQiKX19fXMuY3VycmVudD11LnNjcm9sbFRvcH0pfSkpKSl9KSxNND0iU2VsZWN0R3JvdXAiLFtQRCxMNF09RHMoTTQpLEk0PSJTZWxlY3RMYWJlbCIsRDQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQsaT1MNChJNCxuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7aWQ6aS5pZH0scix7cmVmOmV9KSl9KSxWZz0iU2VsZWN0SXRlbSIsW2o0LGRrXT1EcyhWZyksejQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLHZhbHVlOnIsZGlzYWJsZWQ6aT0hMSx0ZXh0VmFsdWU6bywuLi5sfT10LHM9Y2woVmcsbiksYT1XZihWZyxuKSx1PXMudmFsdWU9PT1yLFtjLGRdPXAudXNlU3RhdGUobz8/IiIpLFtmLGhdPXAudXNlU3RhdGUoITEpLG09c3QoZSx2PT57dmFyIHk7cmV0dXJuKHk9YS5pdGVtUmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKGEsdixyLGkpfSksZz1EZigpLHc9KCk9PntpfHwocy5vblZhbHVlQ2hhbmdlKHIpLHMub25PcGVuQ2hhbmdlKCExKSl9O2lmKHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIkEgPFNlbGVjdC5JdGVtIC8+IG11c3QgaGF2ZSBhIHZhbHVlIHByb3AgdGhhdCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGlzIGJlY2F1c2UgdGhlIFNlbGVjdCB2YWx1ZSBjYW4gYmUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCBzaG93IHRoZSBwbGFjZWhvbGRlci4iKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGo0LHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6aSx0ZXh0SWQ6Zyxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTpwLnVzZUNhbGxiYWNrKHY9PntkKHk9Pnt2YXIgeDtyZXR1cm4geXx8KCh4PXY9PW51bGw/dm9pZCAwOnYudGV4dENvbnRlbnQpIT09bnVsbCYmeCE9PXZvaWQgMD94OiIiKS50cmltKCl9KX0sW10pfSxwLmNyZWF0ZUVsZW1lbnQoVWYuSXRlbVNsb3Qse3Njb3BlOm4sdmFsdWU6cixkaXNhYmxlZDppLHRleHRWYWx1ZTpjfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHtyb2xlOiJvcHRpb24iLCJhcmlhLWxhYmVsbGVkYnkiOmcsImRhdGEtaGlnaGxpZ2h0ZWQiOmY/IiI6dm9pZCAwLCJhcmlhLXNlbGVjdGVkIjp1JiZmLCJkYXRhLXN0YXRlIjp1PyJjaGVja2VkIjoidW5jaGVja2VkIiwiYXJpYS1kaXNhYmxlZCI6aXx8dm9pZCAwLCJkYXRhLWRpc2FibGVkIjppPyIiOnZvaWQgMCx0YWJJbmRleDppP3ZvaWQgMDotMX0sbCx7cmVmOm0sb25Gb2N1czpudChsLm9uRm9jdXMsKCk9PmgoITApKSxvbkJsdXI6bnQobC5vbkJsdXIsKCk9PmgoITEpKSxvblBvaW50ZXJVcDpudChsLm9uUG9pbnRlclVwLHcpLG9uUG9pbnRlck1vdmU6bnQobC5vblBvaW50ZXJNb3ZlLHY9PntpZihpKXt2YXIgeTsoeT1hLm9uSXRlbUxlYXZlKT09PW51bGx8fHk9PT12b2lkIDB8fHkuY2FsbChhKX1lbHNlIHYuY3VycmVudFRhcmdldC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSksb25Qb2ludGVyTGVhdmU6bnQobC5vblBvaW50ZXJMZWF2ZSx2PT57aWYodi5jdXJyZW50VGFyZ2V0PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9fSksb25LZXlEb3duOm50KGwub25LZXlEb3duLHY9Pnt2YXIgeTsoKHk9YS5zZWFyY2hSZWYpPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jdXJyZW50KSE9PSIiJiZ2LmtleT09PSIgInx8KG00LmluY2x1ZGVzKHYua2V5KSYmdygpLHYua2V5PT09IiAiJiZ2LnByZXZlbnREZWZhdWx0KCkpfSl9KSkpKX0pLCRjPSJTZWxlY3RJdGVtVGV4dCIsRjQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGNsYXNzTmFtZTpyLHN0eWxlOmksLi4ub309dCxsPWNsKCRjLG4pLHM9V2YoJGMsbiksYT1kaygkYyxuKSx1PV80KCRjLG4pLFtjLGRdPXAudXNlU3RhdGUobnVsbCksZj1zdChlLHY9PmQodiksYS5vbkl0ZW1UZXh0Q2hhbmdlLHY9Pnt2YXIgeTtyZXR1cm4oeT1zLml0ZW1UZXh0UmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKHMsdixhLnZhbHVlLGEuZGlzYWJsZWQpfSksaD1jPT1udWxsP3ZvaWQgMDpjLnRleHRDb250ZW50LG09cC51c2VNZW1vKCgpPT5wLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTphLnZhbHVlLHZhbHVlOmEudmFsdWUsZGlzYWJsZWQ6YS5kaXNhYmxlZH0saCksW2EuZGlzYWJsZWQsYS52YWx1ZSxoXSkse29uTmF0aXZlT3B0aW9uQWRkOmcsb25OYXRpdmVPcHRpb25SZW1vdmU6d309dTtyZXR1cm4gVW4oKCk9PihnKG0pLCgpPT53KG0pKSxbZyx3LG1dKSxwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHtpZDphLnRleHRJZH0sbyx7cmVmOmZ9KSksYS5pc1NlbGVjdGVkJiZsLnZhbHVlTm9kZSYmIWwudmFsdWVOb2RlSGFzQ2hpbGRyZW4/R3IuY3JlYXRlUG9ydGFsKG8uY2hpbGRyZW4sbC52YWx1ZU5vZGUpOm51bGwpfSksQjQ9IlNlbGVjdEl0ZW1JbmRpY2F0b3IiLFU0PXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT10O3JldHVybiBkayhCNCxuKS5pc1NlbGVjdGVkP3AuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6ZX0pKTpudWxsfSksVzQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJhcmlhLWhpZGRlbiI6ITB9LHIse3JlZjplfSkpfSk7ZnVuY3Rpb24gZmsodCl7cmV0dXJuIHQ9PT0iInx8dD09PXZvaWQgMH1jb25zdCBoaz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHt2YWx1ZTpuLC4uLnJ9PXQsaT1wLnVzZVJlZihudWxsKSxvPXN0KGUsaSksbD1layhuKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPWkuY3VycmVudCxhPXdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudC5wcm90b3R5cGUsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInZhbHVlIikuc2V0O2lmKGwhPT1uJiZjKXtjb25zdCBkPW5ldyBFdmVudCgiY2hhbmdlIix7YnViYmxlczohMH0pO2MuY2FsbChzLG4pLHMuZGlzcGF0Y2hFdmVudChkKX19LFtsLG5dKSxwLmNyZWF0ZUVsZW1lbnQoTk0se2FzQ2hpbGQ6ITB9LHAuY3JlYXRlRWxlbWVudCgic2VsZWN0IixpZSh7fSxyLHtyZWY6byxkZWZhdWx0VmFsdWU6bn0pKSl9KTtoay5kaXNwbGF5TmFtZT0iQnViYmxlU2VsZWN0IjtmdW5jdGlvbiBwayh0KXtjb25zdCBlPWVuKHQpLG49cC51c2VSZWYoIiIpLHI9cC51c2VSZWYoMCksaT1wLnVzZUNhbGxiYWNrKGw9Pntjb25zdCBzPW4uY3VycmVudCtsO2UocyksZnVuY3Rpb24gYSh1KXtuLmN1cnJlbnQ9dSx3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksdSE9PSIiJiYoci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCIiKSwxZTMpKX0ocyl9LFtlXSksbz1wLnVzZUNhbGxiYWNrKCgpPT57bi5jdXJyZW50PSIiLHdpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KX0sW10pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSksW24saSxvXX1mdW5jdGlvbiBnayh0LGUsbil7Y29uc3QgaT1lLmxlbmd0aD4xJiZBcnJheS5mcm9tKGUpLmV2ZXJ5KHU9PnU9PT1lWzBdKT9lWzBdOmUsbz1uP3QuaW5kZXhPZihuKTotMTtsZXQgbD1WNCh0LE1hdGgubWF4KG8sMCkpO2kubGVuZ3RoPT09MSYmKGw9bC5maWx0ZXIodT0+dSE9PW4pKTtjb25zdCBhPWwuZmluZCh1PT51LnRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoaS50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGEhPT1uP2E6dm9pZCAwfWZ1bmN0aW9uIFY0KHQsZSl7cmV0dXJuIHQubWFwKChuLHIpPT50WyhlK3IpJXQubGVuZ3RoXSl9Y29uc3QgSDQ9dzQsbWs9RTQsSzQ9azQsWjQ9YjQsRzQ9JDQsdms9VDQsWTQ9QTQseWs9RDQseGs9ejQsWDQ9RjQsUTQ9VTQsX2s9VzQsSjQ9SDQscTQ9SzQsd2s9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsY2hpbGRyZW46ZSwuLi5ufSxyKT0+Xy5qc3hzKG1rLHtyZWY6cixjbGFzc05hbWU6eHQoImZsZXggaC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctcmluZyBmb2N1czpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIix0KSwuLi5uLGNoaWxkcmVuOltlLF8uanN4KFo0LHthc0NoaWxkOiEwLGNoaWxkcmVuOl8uanN4KGJDLHtjbGFzc05hbWU6InctNCBoLTQgb3BhY2l0eS01MCJ9KX0pXX0pKTt3ay5kaXNwbGF5TmFtZT1tay5kaXNwbGF5TmFtZTtjb25zdCBTaz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLHBvc2l0aW9uOm49InBvcHBlciIsLi4ucn0saSk9Pl8uanN4KEc0LHtjaGlsZHJlbjpfLmpzeCh2ayx7cmVmOmksY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSB6LTUwIG1pbi13LVs4cmVtXSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIixuPT09InBvcHBlciImJiJkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xIix0KSxwb3NpdGlvbjpuLC4uLnIsY2hpbGRyZW46Xy5qc3goWTQse2NsYXNzTmFtZTp4dCgicC0xIixuPT09InBvcHBlciImJiJoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0iKSxjaGlsZHJlbjplfSl9KX0pKTtTay5kaXNwbGF5TmFtZT12ay5kaXNwbGF5TmFtZTtjb25zdCBlTD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goeWsse3JlZjpuLGNsYXNzTmFtZTp4dCgicHktMS41IHBsLTggcHItMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQiLHQpLC4uLmV9KSk7ZUwuZGlzcGxheU5hbWU9eWsuZGlzcGxheU5hbWU7Y29uc3QgRWs9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsY2hpbGRyZW46ZSwuLi5ufSxyKT0+Xy5qc3hzKHhrLHtyZWY6cixjbGFzc05hbWU6eHQoInJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciByb3VuZGVkLXNtIHB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBvdXRsaW5lLW5vbmUgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAiLHQpLC4uLm4sY2hpbGRyZW46W18uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBsZWZ0LTIgZmxleCBoLTMuNSB3LTMuNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIiLGNoaWxkcmVuOl8uanN4KFE0LHtjaGlsZHJlbjpfLmpzeChxQSx7Y2xhc3NOYW1lOiJ3LTQgaC00In0pfSl9KSxfLmpzeChYNCx7Y2hpbGRyZW46ZX0pXX0pKTtFay5kaXNwbGF5TmFtZT14ay5kaXNwbGF5TmFtZTtjb25zdCB0TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goX2sse3JlZjpuLGNsYXNzTmFtZTp4dCgiLW14LTEgbXktMSBoLXB4IGJnLW11dGVkIix0KSwuLi5lfSkpO3RMLmRpc3BsYXlOYW1lPV9rLmRpc3BsYXlOYW1lO2Z1bmN0aW9uIENrKHtwYXRoOnQsZGlzYWJsZWQ6ZSxzb3VyY2U6bixzY2hlbWE6cixyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSl7cmV0dXJuKHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJzdHJpbmciP18uanN4KGlMLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09Im51bWJlciI/Xy5qc3gocl8se2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6b30pOih0eXBlb2Ygbj09Im51bWJlciJ8fHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJrZXlPZiI/Xy5qc3gobl8se2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxzZWxlY3RvcjpyLnNlbGVjdG9yfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJudW1iZXIiP18uanN4KHJfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHx0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ia2V5T2YiP18uanN4KG5fLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om8sc2VsZWN0b3I6ci5zZWxlY3Rvcn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0icmljaHRleHQiP18uanN4KHJMLHtyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLGRlZmF1bHRWYWx1ZTpufSk6KHR5cGVvZiBuPT0ib2JqZWN0Inx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJpbWFnZSI/Xy5qc3gobkwse3BhdGg6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLGRlZmF1bHRWYWx1ZTpufSk6Xy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIlVuc3VwcG9ydGVkIHNjaGVtYTogIixyLnR5cGVdfSl9ZnVuY3Rpb24gZV8odCxlLG4scil7aWYoIWV8fCFyKXJldHVybltdO2NvbnN0IGk9ci5zaGEyNTYuc2xpY2UoMCw1KSxvPWZ1bmN0aW9uKCl7Y29uc3QgbD1udihlKT8/InVua25vd24iLHM9cnYobCk7cmV0dXJuIG4/YC9wdWJsaWMvJHtuLnNwbGl0KCIuIikuc2xpY2UoMCwtMSkuam9pbigiLiIpfHxufV8ke2l9LiR7c31gOmAvcHVibGljLyR7ci5zaGEyNTZ9LiR7c31gfSgpO3JldHVyblt7dmFsdWU6e1tSbl06byxbbm5dOiJmaWxlIixtZXRhZGF0YTpyfSxvcDoicmVwbGFjZSIscGF0aDp0fSx7dmFsdWU6ZSxvcDoiZmlsZSIscGF0aDp0LGZpbGVQYXRoOm99XX1mdW5jdGlvbiBuTCh7cGF0aDp0LGRlZmF1bHRWYWx1ZTplLG9uU3VibWl0Om4scmVnaXN0ZXJQYXRjaENhbGxiYWNrOnJ9KXtjb25zdFtpLG9dPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSghMSksW2EsdV09cC51c2VTdGF0ZSgpLFtjLGRdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntkKGUmJmpuLmNvbnZlcnRGaWxlU291cmNlKGUpLnVybCl9LFtlXSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIGY9PmVfKGYsKGk9PW51bGw/dm9pZCAwOmkuc3JjKT8/bnVsbCwoaT09bnVsbD92b2lkIDA6aS5maWxlbmFtZSk/P251bGwsYSkpfSxbaSxlXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6Im1heC13LTR4bCBwLTQiLGNoaWxkcmVuOltfLmpzeHMoImxhYmVsIix7aHRtbEZvcjpgaW1nX2lucHV0OiR7dH1gLGNsYXNzTmFtZToiIixjaGlsZHJlbjpbaXx8Yz9fLmpzeCgiaW1nIix7c3JjOihpPT1udWxsP3ZvaWQgMDppLnNyYyl8fGN9KTpfLmpzeCgiZGl2Iix7Y2hpbGRyZW46IkVtcHR5In0pLF8uanN4KCJpbnB1dCIse2lkOmBpbWdfaW5wdXQ6JHt0fWAsdHlwZToiZmlsZSIsaGlkZGVuOiEwLG9uQ2hhbmdlOmY9Pnt3QyhmKS50aGVuKGg9PntvKHtzcmM6aC5zcmMsZmlsZW5hbWU6aC5maWxlbmFtZX0pLGgud2lkdGgmJmguaGVpZ2h0P3Uoe3NoYTI1NjpoLnNoYTI1Nix3aWR0aDpoLndpZHRoLGhlaWdodDpoLmhlaWdodH0pOnUodm9pZCAwKX0pLmNhdGNoKGg9Pntjb25zb2xlLmVycm9yKGgubWVzc2FnZSksbyhudWxsKSx1KHZvaWQgMCl9KX19KV19KSxuJiZfLmpzeCgiZGl2Iix7Y2hpbGRyZW46aSYmXy5qc3goTXMse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLG4oZj0+UHJvbWlzZS5yZXNvbHZlKGVfKGYsaS5zcmMsaS5maWxlbmFtZT8/bnVsbCxhKSkpLmZpbmFsbHkoKCk9PntzKCExKSxvKG51bGwpLHUodm9pZCAwKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSx0KX1hc3luYyBmdW5jdGlvbiB0Xyh0LGUpe2NvbnN0e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsZmlsZXM6aX09ZT9hd2FpdCBUUihlLmdldEVkaXRvclN0YXRlKCkudG9KU09OKCkucm9vdCk6e1tubl06InJpY2h0ZXh0Iix0ZW1wbGF0ZVN0cmluZ3M6WyIiXSxleHByczpbXSxmaWxlczp7fX07cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp0LHZhbHVlOnt0ZW1wbGF0ZVN0cmluZ3M6bixleHByczpyLFtubl06InJpY2h0ZXh0In19LC4uLk9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW28sbF0pPT4oe29wOiJmaWxlIixwYXRoOnQsZmlsZVBhdGg6byx2YWx1ZTpsfSkpXX1mdW5jdGlvbiByTCh7ZGVmYXVsdFZhbHVlOnQsb25TdWJtaXQ6ZSxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKSxbcyxhXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntyJiYobCghMSksci5yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIoKCk9PntsKCEwKX0pLHIucmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcigoKT0+e2woITApfSkpfSxbcl0pLHAudXNlRWZmZWN0KCgpPT57ciYmbiYmbih1PT50Xyh1LHIpKX0sW3JdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IGJvcmRlciByb3VuZGVkIGJvcmRlci1jYXJkIixjaGlsZHJlbjpbXy5qc3goWEEse29uRWRpdG9yOnU9PntpKHUpfSxyaWNodGV4dDp0fHx7Y2hpbGRyZW46W10sW25uXToicm9vdCJ9fSksZSYmXy5qc3goImRpdiIse2NoaWxkcmVuOm8mJl8uanN4KE1zLHtkaXNhYmxlZDpzfHwhcixvbkNsaWNrOigpPT57ciYmKGEoITApLGUodT0+dF8odSxyKSkuZmluYWxseSgoKT0+e2EoITEpLGwoITEpfSkpfSxjaGlsZHJlbjpzPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gbl8oe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjppfSl7Y29uc3Qgbz1rSShpKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChtPT5wYXJzZUludChtKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShvKSxbYSx1XT1wLnVzZVN0YXRlKGV8fHMudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QodCl9LFt0XSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOltfLmpzeHMoSjQse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbXy5qc3god2sse2NoaWxkcmVuOl8uanN4KHE0LHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSxfLmpzeChTayx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9Pl8uanN4KEVrLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZfLmpzeCgiZGl2Iix7Y2hpbGRyZW46ZSE9PWEmJl8uanN4KE1zLHtkaXNhYmxlZDpjLG9uQ2xpY2s6KCk9PntkKCEwKSxyKGFzeW5jIGg9Plt7b3A6InJlcGxhY2UiLHBhdGg6aCx2YWx1ZTphfV0pLmZpbmFsbHkoKCk9PntkKCExKX0pfSxjaGlsZHJlbjpjPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gcl8oe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W2ksb109cC51c2VTdGF0ZShlfHwwKSxbbCxzXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e3ModCl9LFt0XSk7Y29uc3QgYT1wLnVzZVJlZihudWxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuJiZuKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6TnVtYmVyKChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwwfV19KX0sW10pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4KEZ2LHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTppPz8wLG9uQ2hhbmdlOnU9Pm8oTnVtYmVyKHUudGFyZ2V0LnZhbHVlKSksdHlwZToibnVtYmVyIn0pLHImJl8uanN4KCJkaXYiLHtjaGlsZHJlbjplIT09aSYmXy5qc3goTXMse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gaUwoe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W2ksb109cC51c2VTdGF0ZShlfHwiIiksW2wsc109cC51c2VTdGF0ZSghMSk7cC51c2VFZmZlY3QoKCk9PntzKHQpfSxbdF0pO2NvbnN0IGE9cC51c2VSZWYobnVsbCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pfSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbXy5qc3goRnYse3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOmk/PyIiLG9uQ2hhbmdlOnU9Pm8odS50YXJnZXQudmFsdWUpfSksciYmXy5qc3goImRpdiIse2NoaWxkcmVuOmUhPT1pJiZfLmpzeChNcyx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCkscihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9Y29uc3Qgb0w9KHtjbGFzc05hbWU6dH0pPT5fLmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTp0LGNoaWxkcmVuOltfLmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOl8uanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSxfLmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOl8uanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4cygiZGVmcyIse2NoaWxkcmVuOltfLmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOltfLmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksXy5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSksXy5qc3goImZlT2Zmc2V0Iix7fSksXy5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLF8uanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSxfLmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSksXy5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W18uanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSxfLmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLF8uanN4KCJmZU9mZnNldCIse30pLF8uanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSksXy5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxraz1vTCxiaz0iU3dpdGNoIixbbEwsQURdPW9sKGJrKSxbc0wsYUxdPWxMKGJrKSx1TD1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6aSxkZWZhdWx0Q2hlY2tlZDpvLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309dCxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9c3QoZSx5PT5mKHkpKSxtPXAudXNlUmVmKCExKSxnPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbdz0hMSx2XT1tcyh7cHJvcDppLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoc0wse3Njb3BlOm4sY2hlY2tlZDp3LGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjp3LCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjokayh3KSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOm50KHQub25DbGljayx5PT57dih4PT4heCksZyYmKG0uY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksbS5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLGcmJnAuY3JlYXRlRWxlbWVudChmTCx7Y29udHJvbDpkLGJ1YmJsZXM6IW0uY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOncscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSxjTD0iU3dpdGNoVGh1bWIiLGRMPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT10LGk9YUwoY0wsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiZGF0YS1zdGF0ZSI6JGsoaS5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjplfSkpfSksZkw9dD0+e2NvbnN0e2NvbnRyb2w6ZSxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLml9PXQsbz1wLnVzZVJlZihudWxsKSxsPWVrKG4pLHM9WkMoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1vLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGllKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxpLHt0YWJJbmRleDotMSxyZWY6byxzdHlsZTp7Li4udC5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gJGsodCl7cmV0dXJuIHQ/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IFRrPXVMLGhMPWRMLEhnPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LC4uLmV9LG4pPT5fLmpzeChUayx7Y2xhc3NOYW1lOnh0KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsdCksLi4uZSxyZWY6bixjaGlsZHJlbjpfLmpzeChoTCx7Y2xhc3NOYW1lOnh0KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtIZy5kaXNwbGF5TmFtZT1Uay5kaXNwbGF5TmFtZTtjb25zdCBZdj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLHQpLC4uLmV9KSk7WXYuZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IHBMPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LC4uLmV9LG4pPT5fLmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOnh0KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsdCksLi4uZX0pKTtwTC5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgZ0w9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTp4dCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLHQpLC4uLmV9KSk7Z0wuZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3QgbUw9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOnh0KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsdCksLi4uZX0pKTttTC5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCB2TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicC02IHB0LTAiLHQpLC4uLmV9KSk7dkwuZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCB5TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLHQpLC4uLmV9KSk7eUwuZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMy4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24geXQoKXtyZXR1cm4geXQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSx5dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHd0OyhmdW5jdGlvbih0KXt0LlBvcD0iUE9QIix0LlB1c2g9IlBVU0giLHQuUmVwbGFjZT0iUkVQTEFDRSJ9KSh3dHx8KHd0PXt9KSk7Y29uc3QgaV89InBvcHN0YXRlIjtmdW5jdGlvbiB4TCh0KXt0PT09dm9pZCAwJiYodD17fSk7ZnVuY3Rpb24gZShyLGkpe2xldHtwYXRobmFtZTpvLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4ga3UoIiIse3BhdGhuYW1lOm8sc2VhcmNoOmwsaGFzaDpzfSxpLnN0YXRlJiZpLnN0YXRlLnVzcnx8bnVsbCxpLnN0YXRlJiZpLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsaSl7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOlZ1KGkpfXJldHVybiB3TChlLG4sbnVsbCx0KX1mdW5jdGlvbiBPZSh0LGUpe2lmKHQ9PT0hMXx8dD09PW51bGx8fHR5cGVvZiB0PiJ1Iil0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gcW8odCxlKXtpZighdCl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4oZSk7dHJ5e3Rocm93IG5ldyBFcnJvcihlKX1jYXRjaHt9fX1mdW5jdGlvbiBfTCgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiBvXyh0LGUpe3JldHVybnt1c3I6dC5zdGF0ZSxrZXk6dC5rZXksaWR4OmV9fWZ1bmN0aW9uIGt1KHQsZSxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSx5dCh7cGF0aG5hbWU6dHlwZW9mIHQ9PSJzdHJpbmciP3Q6dC5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpOmUse3N0YXRlOm4sa2V5OmUmJmUua2V5fHxyfHxfTCgpfSl9ZnVuY3Rpb24gVnUodCl7bGV0e3BhdGhuYW1lOmU9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09dDtyZXR1cm4gbiYmbiE9PSI/IiYmKGUrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJihlKz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSxlfWZ1bmN0aW9uIGtpKHQpe2xldCBlPXt9O2lmKHQpe2xldCBuPXQuaW5kZXhPZigiIyIpO24+PTAmJihlLmhhc2g9dC5zdWJzdHIobiksdD10LnN1YnN0cigwLG4pKTtsZXQgcj10LmluZGV4T2YoIj8iKTtyPj0wJiYoZS5zZWFyY2g9dC5zdWJzdHIociksdD10LnN1YnN0cigwLHIpKSx0JiYoZS5wYXRobmFtZT10KX1yZXR1cm4gZX1mdW5jdGlvbiB3TCh0LGUsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzppPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Om89ITF9PXIsbD1pLmhpc3Rvcnkscz13dC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUoeXQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPXd0LlBvcDtsZXQgdz1jKCksdj13PT1udWxsP251bGw6dy11O3U9dyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKHcsdil7cz13dC5QdXNoO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCkrMTtsZXQgeD1vXyh5LHUpLFM9Zy5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZSh4LCIiLFMpfWNhdGNoKGIpe2lmKGIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJmIubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgYjtpLmxvY2F0aW9uLmFzc2lnbihTKX1vJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKHcsdil7cz13dC5SZXBsYWNlO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCk7bGV0IHg9b18oeSx1KSxTPWcuY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZSh4LCIiLFMpLG8mJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIG0odyl7bGV0IHY9aS5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/aS5sb2NhdGlvbi5vcmlnaW46aS5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIHc9PSJzdHJpbmciP3c6VnUodyk7cmV0dXJuIE9lKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgZz17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gdChpLGwpfSxsaXN0ZW4odyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIoaV8sZCksYT13LCgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKGlfLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYodyl7cmV0dXJuIGUoaSx3KX0sY3JlYXRlVVJMOm0sZW5jb2RlTG9jYXRpb24odyl7bGV0IHY9bSh3KTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKHcpe3JldHVybiBsLmdvKHcpfX07cmV0dXJuIGd9dmFyIFN0OyhmdW5jdGlvbih0KXt0LmRhdGE9ImRhdGEiLHQuZGVmZXJyZWQ9ImRlZmVycmVkIix0LnJlZGlyZWN0PSJyZWRpcmVjdCIsdC5lcnJvcj0iZXJyb3IifSkoU3R8fChTdD17fSkpO2NvbnN0IFNMPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gRUwodCl7cmV0dXJuIHQuaW5kZXg9PT0hMH1mdW5jdGlvbiBLZyh0LGUsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSx0Lm1hcCgoaSxvKT0+e2xldCBsPVsuLi5uLG9dLHM9dHlwZW9mIGkuaWQ9PSJzdHJpbmciP2kuaWQ6bC5qb2luKCItIik7aWYoT2UoaS5pbmRleCE9PSEwfHwhaS5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSxPZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLEVMKGkpKXtsZXQgYT15dCh7fSxpLGUoaSkse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT15dCh7fSxpLGUoaSkse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxpLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1LZyhpLmNoaWxkcmVuLGUsbCxyKSksYX19KX1mdW5jdGlvbiBCbCh0LGUsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgZT09InN0cmluZyI/a2koZSk6ZSxpPUh1KHIucGF0aG5hbWV8fCIvIixuKTtpZihpPT1udWxsKXJldHVybiBudWxsO2xldCBvPU5rKHQpO2tMKG8pO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxvLmxlbmd0aDsrK3MpbD1NTChvW3NdLERMKGkpKTtyZXR1cm4gbH1mdW5jdGlvbiBDTCh0LGUpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOml9PXQ7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6aSxkYXRhOmVbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiBOayh0LGUsbixyKXtlPT09dm9pZCAwJiYoZT1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgaT0obyxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP28ucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOm8uY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTpvfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJihPZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWVvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtvLmNoaWxkcmVuJiZvLmNoaWxkcmVuLmxlbmd0aD4wJiYoT2Uoby5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLE5rKG8uY2hpbGRyZW4sZSxjLHUpKSwhKG8ucGF0aD09bnVsbCYmIW8uaW5kZXgpJiZlLnB1c2goe3BhdGg6dSxzY29yZTpQTCh1LG8uaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gdC5mb3JFYWNoKChvLGwpPT57dmFyIHM7aWYoby5wYXRoPT09IiJ8fCEoKHM9by5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlpKG8sbCk7ZWxzZSBmb3IobGV0IGEgb2YgUmsoby5wYXRoKSlpKG8sbCxhKX0pLGV9ZnVuY3Rpb24gUmsodCl7bGV0IGU9dC5zcGxpdCgiLyIpO2lmKGUubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT1lLGk9bi5lbmRzV2l0aCgiPyIpLG89bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIGk/W28sIiJdOltvXTtsZXQgbD1SayhyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9vOltvLGFdLmpvaW4oIi8iKSkpLGkmJnMucHVzaCguLi5sKSxzLm1hcChhPT50LnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBrTCh0KXt0LnNvcnQoKGUsbik9PmUuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtZS5zY29yZTpBTChlLnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3QgYkw9L146XHcrJC8sJEw9MyxUTD0yLE5MPTEsUkw9MTAsT0w9LTIsbF89dD0+dD09PSIqIjtmdW5jdGlvbiBQTCh0LGUpe2xldCBuPXQuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUobF8pJiYocis9T0wpLGUmJihyKz1UTCksbi5maWx0ZXIoaT0+IWxfKGkpKS5yZWR1Y2UoKGksbyk9PmkrKGJMLnRlc3Qobyk/JEw6bz09PSIiP05MOlJMKSxyKX1mdW5jdGlvbiBBTCh0LGUpe3JldHVybiB0Lmxlbmd0aD09PWUubGVuZ3RoJiZ0LnNsaWNlKDAsLTEpLmV2ZXJ5KChyLGkpPT5yPT09ZVtpXSk/dFt0Lmxlbmd0aC0xXS1lW2UubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gTUwodCxlKXtsZXR7cm91dGVzTWV0YTpufT10LHI9e30saT0iLyIsbz1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9aT09PSIvIj9lOmUuc2xpY2UoaS5sZW5ndGgpfHwiLyIsYz1MTCh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO28ucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6ZW8oW2ksYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTpCTChlbyhbaSxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihpPWVvKFtpLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBvfWZ1bmN0aW9uIExMKHQsZSl7dHlwZW9mIHQ9PSJzdHJpbmciJiYodD17cGF0aDp0LGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09SUwodC5wYXRoLHQuY2FzZVNlbnNpdGl2ZSx0LmVuZCksaT1lLm1hdGNoKG4pO2lmKCFpKXJldHVybiBudWxsO2xldCBvPWlbMF0sbD1vLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9aS5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBnPXNbZF18fCIiO2w9by5zbGljZSgwLG8ubGVuZ3RoLWcubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBtPXNbZF07cmV0dXJuIGgmJiFtP3VbZl09dm9pZCAwOnVbZl09akwobXx8IiIsZiksdX0se30pLHBhdGhuYW1lOm8scGF0aG5hbWVCYXNlOmwscGF0dGVybjp0fX1mdW5jdGlvbiBJTCh0LGUsbil7ZT09PXZvaWQgMCYmKGU9ITEpLG49PT12b2lkIDAmJihuPSEwKSxxbyh0PT09IioifHwhdC5lbmRzV2l0aCgiKiIpfHx0LmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK3QrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK3QucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJyt0LnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLGk9Il4iK3QucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiB0LmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLGkrPXQ9PT0iKiJ8fHQ9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9pKz0iXFwvKiQiOnQhPT0iIiYmdCE9PSIvIiYmKGkrPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAoaSxlP3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIERMKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKHQpfWNhdGNoKGUpe3JldHVybiBxbyghMSwnVGhlIFVSTCBwYXRoICInK3QrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrZSsiKS4iKSksdH19ZnVuY3Rpb24gakwodCxlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChuKXtyZXR1cm4gcW8oITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJytlKyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJyt0KyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksdH19ZnVuY3Rpb24gSHUodCxlKXtpZihlPT09Ii8iKXJldHVybiB0O2lmKCF0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChlLnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPWUuZW5kc1dpdGgoIi8iKT9lLmxlbmd0aC0xOmUubGVuZ3RoLHI9dC5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDp0LnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gekwodCxlKXtlPT09dm9pZCAwJiYoZT0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6aT0iIn09dHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpOnQ7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjpGTChuLGUpOmUsc2VhcmNoOlVMKHIpLGhhc2g6V0woaSl9fWZ1bmN0aW9uIEZMKHQsZSl7bGV0IG49ZS5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gdC5zcGxpdCgiLyIpLmZvckVhY2goaT0+e2k9PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6aSE9PSIuIiYmbi5wdXNoKGkpfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gS2godCxlLG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrdCsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK2UrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiBPayh0KXtyZXR1cm4gdC5maWx0ZXIoKGUsbik9Pm49PT0wfHxlLnJvdXRlLnBhdGgmJmUucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gUGsodCl7cmV0dXJuIE9rKHQpLm1hcCgoZSxuKT0+bj09PXQubGVuZ3RoLTE/ZS5wYXRobmFtZTplLnBhdGhuYW1lQmFzZSl9ZnVuY3Rpb24gQWsodCxlLG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBpO3R5cGVvZiB0PT0ic3RyaW5nIj9pPWtpKHQpOihpPXl0KHt9LHQpLE9lKCFpLnBhdGhuYW1lfHwhaS5wYXRobmFtZS5pbmNsdWRlcygiPyIpLEtoKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLGkpKSxPZSghaS5wYXRobmFtZXx8IWkucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxLaCgiIyIsInBhdGhuYW1lIiwiaGFzaCIsaSkpLE9lKCFpLnNlYXJjaHx8IWkuc2VhcmNoLmluY2x1ZGVzKCIjIiksS2goIiMiLCJzZWFyY2giLCJoYXNoIixpKSkpO2xldCBvPXQ9PT0iInx8aS5wYXRobmFtZT09PSIiLGw9bz8iLyI6aS5wYXRobmFtZSxzO2lmKGw9PW51bGwpcz1uO2Vsc2UgaWYocil7bGV0IGQ9ZVtlLmxlbmd0aC0xXS5yZXBsYWNlKC9eXC8vLCIiKS5zcGxpdCgiLyIpO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLnBvcCgpO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz0iLyIrZC5qb2luKCIvIil9ZWxzZXtsZXQgZD1lLmxlbmd0aC0xO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLT0xO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz1kPj0wP2VbZF06Ii8ifWxldCBhPXpMKGkscyksdT1sJiZsIT09Ii8iJiZsLmVuZHNXaXRoKCIvIiksYz0ob3x8bD09PSIuIikmJm4uZW5kc1dpdGgoIi8iKTtyZXR1cm4hYS5wYXRobmFtZS5lbmRzV2l0aCgiLyIpJiYodXx8YykmJihhLnBhdGhuYW1lKz0iLyIpLGF9Y29uc3QgZW89dD0+dC5qb2luKCIvIikucmVwbGFjZSgvXC9cLysvZywiLyIpLEJMPXQ9PnQucmVwbGFjZSgvXC8rJC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIiksVUw9dD0+IXR8fHQ9PT0iPyI/IiI6dC5zdGFydHNXaXRoKCI/Iik/dDoiPyIrdCxXTD10PT4hdHx8dD09PSIjIj8iIjp0LnN0YXJ0c1dpdGgoIiMiKT90OiIjIit0O2NsYXNzIFh2e2NvbnN0cnVjdG9yKGUsbixyLGkpe2k9PT12b2lkIDAmJihpPSExKSx0aGlzLnN0YXR1cz1lLHRoaXMuc3RhdHVzVGV4dD1ufHwiIix0aGlzLmludGVybmFsPWksciBpbnN0YW5jZW9mIEVycm9yPyh0aGlzLmRhdGE9ci50b1N0cmluZygpLHRoaXMuZXJyb3I9cik6dGhpcy5kYXRhPXJ9fWZ1bmN0aW9uIE1rKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdC5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIHQuaW50ZXJuYWw9PSJib29sZWFuIiYmImRhdGEiaW4gdH1jb25zdCBMaz1bInBvc3QiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSJdLFZMPW5ldyBTZXQoTGspLEhMPVsiZ2V0IiwuLi5Ma10sS0w9bmV3IFNldChITCksWkw9bmV3IFNldChbMzAxLDMwMiwzMDMsMzA3LDMwOF0pLEdMPW5ldyBTZXQoWzMwNywzMDhdKSxaaD17c3RhdGU6ImlkbGUiLGxvY2F0aW9uOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxZTD17c3RhdGU6ImlkbGUiLGRhdGE6dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LGVhPXtzdGF0ZToidW5ibG9ja2VkIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246dm9pZCAwfSxJaz0vXig/OlthLXpdW2EtejAtOSsuLV0qOnxcL1wvKS9pLFhMPXQ9Pih7aGFzRXJyb3JCb3VuZGFyeTohIXQuaGFzRXJyb3JCb3VuZGFyeX0pLERrPSJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnMiO2Z1bmN0aW9uIFFMKHQpe2NvbnN0IGU9dC53aW5kb3c/dC53aW5kb3c6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnZvaWQgMCxuPXR5cGVvZiBlPCJ1IiYmdHlwZW9mIGUuZG9jdW1lbnQ8InUiJiZ0eXBlb2YgZS5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixyPSFuO09lKHQucm91dGVzLmxlbmd0aD4wLCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXIiKTtsZXQgaTtpZih0Lm1hcFJvdXRlUHJvcGVydGllcylpPXQubWFwUm91dGVQcm9wZXJ0aWVzO2Vsc2UgaWYodC5kZXRlY3RFcnJvckJvdW5kYXJ5KXtsZXQgUj10LmRldGVjdEVycm9yQm91bmRhcnk7aT1JPT4oe2hhc0Vycm9yQm91bmRhcnk6UihJKX0pfWVsc2UgaT1YTDtsZXQgbz17fSxsPUtnKHQucm91dGVzLGksdm9pZCAwLG8pLHMsYT10LmJhc2VuYW1lfHwiLyIsdT15dCh7djdfZmV0Y2hlclBlcnNpc3Q6ITEsdjdfbm9ybWFsaXplRm9ybU1ldGhvZDohMSx2N19wcmVwZW5kQmFzZW5hbWU6ITF9LHQuZnV0dXJlKSxjPW51bGwsZD1uZXcgU2V0LGY9bnVsbCxoPW51bGwsbT1udWxsLGc9dC5oeWRyYXRpb25EYXRhIT1udWxsLHc9QmwobCx0Lmhpc3RvcnkubG9jYXRpb24sYSksdj1udWxsO2lmKHc9PW51bGwpe2xldCBSPUduKDQwNCx7cGF0aG5hbWU6dC5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lfSkse21hdGNoZXM6SSxyb3V0ZTp6fT1wXyhsKTt3PUksdj17W3ouaWRdOlJ9fWxldCB5PSF3LnNvbWUoUj0+Ui5yb3V0ZS5sYXp5KSYmKCF3LnNvbWUoUj0+Ui5yb3V0ZS5sb2FkZXIpfHx0Lmh5ZHJhdGlvbkRhdGEhPW51bGwpLHgsUz17aGlzdG9yeUFjdGlvbjp0Lmhpc3RvcnkuYWN0aW9uLGxvY2F0aW9uOnQuaGlzdG9yeS5sb2NhdGlvbixtYXRjaGVzOncsaW5pdGlhbGl6ZWQ6eSxuYXZpZ2F0aW9uOlpoLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjp0Lmh5ZHJhdGlvbkRhdGEhPW51bGw/ITE6bnVsbCxwcmV2ZW50U2Nyb2xsUmVzZXQ6ITEscmV2YWxpZGF0aW9uOiJpZGxlIixsb2FkZXJEYXRhOnQuaHlkcmF0aW9uRGF0YSYmdC5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGF8fHt9LGFjdGlvbkRhdGE6dC5oeWRyYXRpb25EYXRhJiZ0Lmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YXx8bnVsbCxlcnJvcnM6dC5oeWRyYXRpb25EYXRhJiZ0Lmh5ZHJhdGlvbkRhdGEuZXJyb3JzfHx2LGZldGNoZXJzOm5ldyBNYXAsYmxvY2tlcnM6bmV3IE1hcH0sYj13dC5Qb3AsVD0hMSwkLE89ITEsTD1uZXcgTWFwLFA9bnVsbCxEPSExLEI9ITEsb2U9W10sSD1bXSxaPW5ldyBNYXAsQz0wLGs9LTEsRT1uZXcgTWFwLEE9bmV3IFNldCxOPW5ldyBNYXAsRj1uZXcgTWFwLEs9bmV3IFNldCxkZT1uZXcgTWFwLHNlPW5ldyBNYXAsQWU9ITE7ZnVuY3Rpb24gTmUoKXtpZihjPXQuaGlzdG9yeS5saXN0ZW4oUj0+e2xldHthY3Rpb246SSxsb2NhdGlvbjp6LGRlbHRhOll9PVI7aWYoQWUpe0FlPSExO3JldHVybn1xbyhzZS5zaXplPT09MHx8WSE9bnVsbCwiWW91IGFyZSB0cnlpbmcgdG8gdXNlIGEgYmxvY2tlciBvbiBhIFBPUCBuYXZpZ2F0aW9uIHRvIGEgbG9jYXRpb24gdGhhdCB3YXMgbm90IGNyZWF0ZWQgYnkgQHJlbWl4LXJ1bi9yb3V0ZXIuIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGluIHByb2R1Y3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgYXJlIG5hdmlnYXRpbmcgb3V0c2lkZSB0aGUgcm91dGVyIHZpYSBgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlYC9gd2luZG93LmxvY2F0aW9uLmhhc2hgIGluc3RlYWQgb2YgdXNpbmcgcm91dGVyIG5hdmlnYXRpb24gQVBJcy4gIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgY3JlYXRlSGFzaFJvdXRlciBhbmQgdGhlIHVzZXIgbWFudWFsbHkgY2hhbmdlcyB0aGUgVVJMLiIpO2xldCBsZT1seSh7Y3VycmVudExvY2F0aW9uOlMubG9jYXRpb24sbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpJfSk7aWYobGUmJlkhPW51bGwpe0FlPSEwLHQuaGlzdG9yeS5nbyhZKi0xKSxLdShsZSx7c3RhdGU6ImJsb2NrZWQiLGxvY2F0aW9uOnoscHJvY2VlZCgpe0t1KGxlLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnp9KSx0Lmhpc3RvcnkuZ28oWSl9LHJlc2V0KCl7bGV0IGtlPW5ldyBNYXAoUy5ibG9ja2Vycyk7a2Uuc2V0KGxlLGVhKSxiZSh7YmxvY2tlcnM6a2V9KX19KTtyZXR1cm59cmV0dXJuIFFlKEkseil9KSxuKXthSShlLEwpO2xldCBSPSgpPT51SShlLEwpO2UuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFIpLFA9KCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFIpfXJldHVybiBTLmluaXRpYWxpemVkfHxRZSh3dC5Qb3AsUy5sb2NhdGlvbikseH1mdW5jdGlvbiBRKCl7YyYmYygpLFAmJlAoKSxkLmNsZWFyKCksJCYmJC5hYm9ydCgpLFMuZmV0Y2hlcnMuZm9yRWFjaCgoUixJKT0+UG4oSSkpLFMuYmxvY2tlcnMuZm9yRWFjaCgoUixJKT0+b3koSSkpfWZ1bmN0aW9uIGplKFIpe3JldHVybiBkLmFkZChSKSwoKT0+ZC5kZWxldGUoUil9ZnVuY3Rpb24gYmUoUixJKXtJPT09dm9pZCAwJiYoST17fSksUz15dCh7fSxTLFIpO2xldCB6PVtdLFk9W107dS52N19mZXRjaGVyUGVyc2lzdCYmUy5mZXRjaGVycy5mb3JFYWNoKChsZSxrZSk9PntsZS5zdGF0ZT09PSJpZGxlIiYmKEsuaGFzKGtlKT9ZLnB1c2goa2UpOnoucHVzaChrZSkpfSksWy4uLmRdLmZvckVhY2gobGU9PmxlKFMse2RlbGV0ZWRGZXRjaGVyczpZLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpJLnZpZXdUcmFuc2l0aW9uT3B0cyx1bnN0YWJsZV9mbHVzaFN5bmM6SS5mbHVzaFN5bmM9PT0hMH0pKSx1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5mb3JFYWNoKGxlPT5TLmZldGNoZXJzLmRlbGV0ZShsZSkpLFkuZm9yRWFjaChsZT0+UG4obGUpKSl9ZnVuY3Rpb24gUmUoUixJLHope3ZhciBZLGxlO2xldHtmbHVzaFN5bmM6a2V9PXo9PT12b2lkIDA/e306eixnZT1TLmFjdGlvbkRhdGEhPW51bGwmJlMubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZwcihTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJlMubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmKChZPVIuc3RhdGUpPT1udWxsP3ZvaWQgMDpZLl9pc1JlZGlyZWN0KSE9PSEwLHBlO0kuYWN0aW9uRGF0YT9PYmplY3Qua2V5cyhJLmFjdGlvbkRhdGEpLmxlbmd0aD4wP3BlPUkuYWN0aW9uRGF0YTpwZT1udWxsOmdlP3BlPVMuYWN0aW9uRGF0YTpwZT1udWxsO2xldCB1ZT1JLmxvYWRlckRhdGE/aF8oUy5sb2FkZXJEYXRhLEkubG9hZGVyRGF0YSxJLm1hdGNoZXN8fFtdLEkuZXJyb3JzKTpTLmxvYWRlckRhdGEsTWU9Uy5ibG9ja2VycztNZS5zaXplPjAmJihNZT1uZXcgTWFwKE1lKSxNZS5mb3JFYWNoKChaZSx1dCk9Pk1lLnNldCh1dCxlYSkpKTtsZXQgVnQ9VD09PSEwfHxTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCE9bnVsbCYmcHIoUy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpJiYoKGxlPVIuc3RhdGUpPT1udWxsP3ZvaWQgMDpsZS5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxEfHxiPT09d3QuUG9wfHwoYj09PXd0LlB1c2g/dC5oaXN0b3J5LnB1c2goUixSLnN0YXRlKTpiPT09d3QuUmVwbGFjZSYmdC5oaXN0b3J5LnJlcGxhY2UoUixSLnN0YXRlKSk7bGV0ICRlO2lmKGI9PT13dC5Qb3Ape2xldCBaZT1MLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZSYmWmUuaGFzKFIucGF0aG5hbWUpPyRlPXtjdXJyZW50TG9jYXRpb246Uy5sb2NhdGlvbixuZXh0TG9jYXRpb246Un06TC5oYXMoUi5wYXRobmFtZSkmJigkZT17Y3VycmVudExvY2F0aW9uOlIsbmV4dExvY2F0aW9uOlMubG9jYXRpb259KX1lbHNlIGlmKE8pe2xldCBaZT1MLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZT9aZS5hZGQoUi5wYXRobmFtZSk6KFplPW5ldyBTZXQoW1IucGF0aG5hbWVdKSxMLnNldChTLmxvY2F0aW9uLnBhdGhuYW1lLFplKSksJGU9e2N1cnJlbnRMb2NhdGlvbjpTLmxvY2F0aW9uLG5leHRMb2NhdGlvbjpSfX1iZSh5dCh7fSxJLHthY3Rpb25EYXRhOnBlLGxvYWRlckRhdGE6dWUsaGlzdG9yeUFjdGlvbjpiLGxvY2F0aW9uOlIsaW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpaaCxyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpheShSLEkubWF0Y2hlc3x8Uy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VnQsYmxvY2tlcnM6TWV9KSx7dmlld1RyYW5zaXRpb25PcHRzOiRlLGZsdXNoU3luYzprZT09PSEwfSksYj13dC5Qb3AsVD0hMSxPPSExLEQ9ITEsQj0hMSxvZT1bXSxIPVtdfWFzeW5jIGZ1bmN0aW9uIHdlKFIsSSl7aWYodHlwZW9mIFI9PSJudW1iZXIiKXt0Lmhpc3RvcnkuZ28oUik7cmV0dXJufWxldCB6PVpnKFMubG9jYXRpb24sUy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsUixJPT1udWxsP3ZvaWQgMDpJLmZyb21Sb3V0ZUlkLEk9PW51bGw/dm9pZCAwOkkucmVsYXRpdmUpLHtwYXRoOlksc3VibWlzc2lvbjpsZSxlcnJvcjprZX09c18odS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosSSksZ2U9Uy5sb2NhdGlvbixwZT1rdShTLmxvY2F0aW9uLFksSSYmSS5zdGF0ZSk7cGU9eXQoe30scGUsdC5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKHBlKSk7bGV0IHVlPUkmJkkucmVwbGFjZSE9bnVsbD9JLnJlcGxhY2U6dm9pZCAwLE1lPXd0LlB1c2g7dWU9PT0hMD9NZT13dC5SZXBsYWNlOnVlPT09ITF8fGxlIT1udWxsJiZwcihsZS5mb3JtTWV0aG9kKSYmbGUuZm9ybUFjdGlvbj09PVMubG9jYXRpb24ucGF0aG5hbWUrUy5sb2NhdGlvbi5zZWFyY2gmJihNZT13dC5SZXBsYWNlKTtsZXQgVnQ9SSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBJP0kucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLCRlPShJJiZJLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxaZT1seSh7Y3VycmVudExvY2F0aW9uOmdlLG5leHRMb2NhdGlvbjpwZSxoaXN0b3J5QWN0aW9uOk1lfSk7aWYoWmUpe0t1KFplLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246cGUscHJvY2VlZCgpe0t1KFplLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnBlfSksd2UoUixJKX0scmVzZXQoKXtsZXQgdXQ9bmV3IE1hcChTLmJsb2NrZXJzKTt1dC5zZXQoWmUsZWEpLGJlKHtibG9ja2Vyczp1dH0pfX0pO3JldHVybn1yZXR1cm4gYXdhaXQgUWUoTWUscGUse3N1Ym1pc3Npb246bGUscGVuZGluZ0Vycm9yOmtlLHByZXZlbnRTY3JvbGxSZXNldDpWdCxyZXBsYWNlOkkmJkkucmVwbGFjZSxlbmFibGVWaWV3VHJhbnNpdGlvbjpJJiZJLnVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uLGZsdXNoU3luYzokZX0pfWZ1bmN0aW9uIEllKCl7aWYoRW4oKSxiZSh7cmV2YWxpZGF0aW9uOiJsb2FkaW5nIn0pLFMubmF2aWdhdGlvbi5zdGF0ZSE9PSJzdWJtaXR0aW5nIil7aWYoUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImlkbGUiKXtRZShTLmhpc3RvcnlBY3Rpb24sUy5sb2NhdGlvbix7c3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uOiEwfSk7cmV0dXJufVFlKGJ8fFMuaGlzdG9yeUFjdGlvbixTLm5hdmlnYXRpb24ubG9jYXRpb24se292ZXJyaWRlTmF2aWdhdGlvbjpTLm5hdmlnYXRpb259KX19YXN5bmMgZnVuY3Rpb24gUWUoUixJLHopeyQmJiQuYWJvcnQoKSwkPW51bGwsYj1SLEQ9KHomJnouc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKT09PSEwLHBiKFMubG9jYXRpb24sUy5tYXRjaGVzKSxUPSh6JiZ6LnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxPPSh6JiZ6LmVuYWJsZVZpZXdUcmFuc2l0aW9uKT09PSEwO2xldCBZPXN8fGwsbGU9eiYmei5vdmVycmlkZU5hdmlnYXRpb24sa2U9QmwoWSxJLGEpLGdlPSh6JiZ6LmZsdXNoU3luYyk9PT0hMDtpZigha2Upe2xldCB1dD1Hbig0MDQse3BhdGhuYW1lOkkucGF0aG5hbWV9KSx7bWF0Y2hlczphbixyb3V0ZTpScn09cF8oWSk7WGYoKSxSZShJLHttYXRjaGVzOmFuLGxvYWRlckRhdGE6e30sZXJyb3JzOntbUnIuaWRdOnV0fX0se2ZsdXNoU3luYzpnZX0pO3JldHVybn1pZihTLmluaXRpYWxpemVkJiYhQiYmbkkoUy5sb2NhdGlvbixJKSYmISh6JiZ6LnN1Ym1pc3Npb24mJnByKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe1JlKEkse21hdGNoZXM6a2V9LHtmbHVzaFN5bmM6Z2V9KTtyZXR1cm59JD1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBwZT1uYSh0Lmhpc3RvcnksSSwkLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLHVlLE1lO2lmKHomJnoucGVuZGluZ0Vycm9yKU1lPXtbQWEoa2UpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJnByKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IHV0PWF3YWl0IFd0KHBlLEksei5zdWJtaXNzaW9uLGtlLHtyZXBsYWNlOnoucmVwbGFjZSxmbHVzaFN5bmM6Z2V9KTtpZih1dC5zaG9ydENpcmN1aXRlZClyZXR1cm47dWU9dXQucGVuZGluZ0FjdGlvbkRhdGEsTWU9dXQucGVuZGluZ0FjdGlvbkVycm9yLGxlPUdoKEksei5zdWJtaXNzaW9uKSxnZT0hMSxwZT1uZXcgUmVxdWVzdChwZS51cmwse3NpZ25hbDpwZS5zaWduYWx9KX1sZXR7c2hvcnRDaXJjdWl0ZWQ6VnQsbG9hZGVyRGF0YTokZSxlcnJvcnM6WmV9PWF3YWl0IFNuKHBlLEksa2UsbGUseiYmei5zdWJtaXNzaW9uLHomJnouZmV0Y2hlclN1Ym1pc3Npb24seiYmei5yZXBsYWNlLGdlLHVlLE1lKTtWdHx8KCQ9bnVsbCxSZShJLHl0KHttYXRjaGVzOmtlfSx1ZT97YWN0aW9uRGF0YTp1ZX06e30se2xvYWRlckRhdGE6JGUsZXJyb3JzOlplfSkpKX1hc3luYyBmdW5jdGlvbiBXdChSLEkseixZLGxlKXtsZT09PXZvaWQgMCYmKGxlPXt9KSxFbigpO2xldCBrZT1sSShJLHopO2JlKHtuYXZpZ2F0aW9uOmtlfSx7Zmx1c2hTeW5jOmxlLmZsdXNoU3luYz09PSEwfSk7bGV0IGdlLHBlPVlnKFksSSk7aWYoIXBlLnJvdXRlLmFjdGlvbiYmIXBlLnJvdXRlLmxhenkpZ2U9e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA1LHttZXRob2Q6Ui5tZXRob2QscGF0aG5hbWU6SS5wYXRobmFtZSxyb3V0ZUlkOnBlLnJvdXRlLmlkfSl9O2Vsc2UgaWYoZ2U9YXdhaXQgdGEoImFjdGlvbiIsUixwZSxZLG8saSxhKSxSLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07aWYocWwoZ2UpKXtsZXQgdWU7cmV0dXJuIGxlJiZsZS5yZXBsYWNlIT1udWxsP3VlPWxlLnJlcGxhY2U6dWU9Z2UubG9jYXRpb249PT1TLmxvY2F0aW9uLnBhdGhuYW1lK1MubG9jYXRpb24uc2VhcmNoLGF3YWl0IGF0KFMsZ2Use3N1Ym1pc3Npb246eixyZXBsYWNlOnVlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1pZihNYShnZSkpe2xldCB1ZT1BYShZLHBlLnJvdXRlLmlkKTtyZXR1cm4obGUmJmxlLnJlcGxhY2UpIT09ITAmJihiPXd0LlB1c2gpLHtwZW5kaW5nQWN0aW9uRGF0YTp7fSxwZW5kaW5nQWN0aW9uRXJyb3I6e1t1ZS5yb3V0ZS5pZF06Z2UuZXJyb3J9fX1pZihQbyhnZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7cmV0dXJue3BlbmRpbmdBY3Rpb25EYXRhOntbcGUucm91dGUuaWRdOmdlLmRhdGF9fX1hc3luYyBmdW5jdGlvbiBTbihSLEkseixZLGxlLGtlLGdlLHBlLHVlLE1lKXtsZXQgVnQ9WXx8R2goSSxsZSksJGU9bGV8fGtlfHx2XyhWdCksWmU9c3x8bCxbdXQsYW5dPWFfKHQuaGlzdG9yeSxTLHosJGUsSSxCLG9lLEgsSyxOLEEsWmUsYSx1ZSxNZSk7aWYoWGYoR2U9PiEoeiYmei5zb21lKFpuPT5abi5yb3V0ZS5pZD09PUdlKSl8fHV0JiZ1dC5zb21lKFpuPT5abi5yb3V0ZS5pZD09PUdlKSksaz0rK0MsdXQubGVuZ3RoPT09MCYmYW4ubGVuZ3RoPT09MCl7bGV0IEdlPV9vKCk7cmV0dXJuIFJlKEkseXQoe21hdGNoZXM6eixsb2FkZXJEYXRhOnt9LGVycm9yczpNZXx8bnVsbH0sdWU/e2FjdGlvbkRhdGE6dWV9Ont9LEdlP3tmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfTp7fSkse2ZsdXNoU3luYzpwZX0pLHtzaG9ydENpcmN1aXRlZDohMH19aWYoIUQpe2FuLmZvckVhY2goWm49PntsZXQga3Q9Uy5mZXRjaGVycy5nZXQoWm4ua2V5KSx3bz1yYSh2b2lkIDAsa3Q/a3QuZGF0YTp2b2lkIDApO1MuZmV0Y2hlcnMuc2V0KFpuLmtleSx3byl9KTtsZXQgR2U9dWV8fFMuYWN0aW9uRGF0YTtiZSh5dCh7bmF2aWdhdGlvbjpWdH0sR2U/T2JqZWN0LmtleXMoR2UpLmxlbmd0aD09PTA/e2FjdGlvbkRhdGE6bnVsbH06e2FjdGlvbkRhdGE6R2V9Ont9LGFuLmxlbmd0aD4wP3tmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfTp7fSkse2ZsdXNoU3luYzpwZX0pfWFuLmZvckVhY2goR2U9PntaLmhhcyhHZS5rZXkpJiZtdChHZS5rZXkpLEdlLmNvbnRyb2xsZXImJlouc2V0KEdlLmtleSxHZS5jb250cm9sbGVyKX0pO2xldCBScj0oKT0+YW4uZm9yRWFjaChHZT0+bXQoR2Uua2V5KSk7JCYmJC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFJyKTtsZXR7cmVzdWx0czp6cyxsb2FkZXJSZXN1bHRzOlFmLGZldGNoZXJSZXN1bHRzOmZsfT1hd2FpdCBsbihTLm1hdGNoZXMseix1dCxhbixSKTtpZihSLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07JCYmJC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFJyKSxhbi5mb3JFYWNoKEdlPT5aLmRlbGV0ZShHZS5rZXkpKTtsZXQgc3I9Z18oenMpO2lmKHNyKXtpZihzci5pZHg+PXV0Lmxlbmd0aCl7bGV0IEdlPWFuW3NyLmlkeC11dC5sZW5ndGhdLmtleTtBLmFkZChHZSl9cmV0dXJuIGF3YWl0IGF0KFMsc3IucmVzdWx0LHtyZXBsYWNlOmdlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1sZXR7bG9hZGVyRGF0YTpadSxlcnJvcnM6SmZ9PWZfKFMseix1dCxRZixNZSxhbixmbCxkZSk7ZGUuZm9yRWFjaCgoR2UsWm4pPT57R2Uuc3Vic2NyaWJlKGt0PT57KGt0fHxHZS5kb25lKSYmZGUuZGVsZXRlKFpuKX0pfSk7bGV0IHFmPV9vKCksZWg9anMoayksaGw9cWZ8fGVofHxhbi5sZW5ndGg+MDtyZXR1cm4geXQoe2xvYWRlckRhdGE6WnUsZXJyb3JzOkpmfSxobD97ZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX06e30pfWZ1bmN0aW9uIGxyKFIsSSx6LFkpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJyb3V0ZXIuZmV0Y2goKSB3YXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmVyIHJlbmRlciwgYnV0IGl0IHNob3VsZG4ndCBiZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBhIHVzZUZldGNoZXIoKSBtZXRob2QgaW4gdGhlIGJvZHkgb2YgeW91ciBjb21wb25lbnQuIFRyeSBtb3ZpbmcgaXQgdG8gYSB1c2VFZmZlY3Qgb3IgYSBjYWxsYmFjay4iKTtaLmhhcyhSKSYmbXQoUik7bGV0IGxlPShZJiZZLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxrZT1zfHxsLGdlPVpnKFMubG9jYXRpb24sUy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUseixJLFk9PW51bGw/dm9pZCAwOlkucmVsYXRpdmUpLHBlPUJsKGtlLGdlLGEpO2lmKCFwZSl7QXQoUixJLEduKDQwNCx7cGF0aG5hbWU6Z2V9KSx7Zmx1c2hTeW5jOmxlfSk7cmV0dXJufWxldHtwYXRoOnVlLHN1Ym1pc3Npb246TWUsZXJyb3I6VnR9PXNfKHUudjdfbm9ybWFsaXplRm9ybU1ldGhvZCwhMCxnZSxZKTtpZihWdCl7QXQoUixJLFZ0LHtmbHVzaFN5bmM6bGV9KTtyZXR1cm59bGV0ICRlPVlnKHBlLHVlKTtpZihUPShZJiZZLnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxNZSYmcHIoTWUuZm9ybU1ldGhvZCkpe3plKFIsSSx1ZSwkZSxwZSxsZSxNZSk7cmV0dXJufU4uc2V0KFIse3JvdXRlSWQ6SSxwYXRoOnVlfSksVHQoUixJLHVlLCRlLHBlLGxlLE1lKX1hc3luYyBmdW5jdGlvbiB6ZShSLEkseixZLGxlLGtlLGdlKXtpZihFbigpLE4uZGVsZXRlKFIpLCFZLnJvdXRlLmFjdGlvbiYmIVkucm91dGUubGF6eSl7bGV0IGt0PUduKDQwNSx7bWV0aG9kOmdlLmZvcm1NZXRob2QscGF0aG5hbWU6eixyb3V0ZUlkOkl9KTtBdChSLEksa3Qse2ZsdXNoU3luYzprZX0pO3JldHVybn1sZXQgcGU9Uy5mZXRjaGVycy5nZXQoUik7X3QoUixzSShnZSxwZSkse2ZsdXNoU3luYzprZX0pO2xldCB1ZT1uZXcgQWJvcnRDb250cm9sbGVyLE1lPW5hKHQuaGlzdG9yeSx6LHVlLnNpZ25hbCxnZSk7Wi5zZXQoUix1ZSk7bGV0IFZ0PUMsJGU9YXdhaXQgdGEoImFjdGlvbiIsTWUsWSxsZSxvLGksYSk7aWYoTWUuc2lnbmFsLmFib3J0ZWQpe1ouZ2V0KFIpPT09dWUmJlouZGVsZXRlKFIpO3JldHVybn1pZihLLmhhcyhSKSl7X3QoUixQaSh2b2lkIDApKTtyZXR1cm59aWYocWwoJGUpKWlmKFouZGVsZXRlKFIpLGs+VnQpe190KFIsUGkodm9pZCAwKSk7cmV0dXJufWVsc2UgcmV0dXJuIEEuYWRkKFIpLF90KFIscmEoZ2UpKSxhdChTLCRlLHtmZXRjaGVyU3VibWlzc2lvbjpnZX0pO2lmKE1hKCRlKSl7QXQoUixJLCRlLmVycm9yKTtyZXR1cm59aWYoUG8oJGUpKXRocm93IEduKDQwMCx7dHlwZToiZGVmZXItYWN0aW9uIn0pO2xldCBaZT1TLm5hdmlnYXRpb24ubG9jYXRpb258fFMubG9jYXRpb24sdXQ9bmEodC5oaXN0b3J5LFplLHVlLnNpZ25hbCksYW49c3x8bCxScj1TLm5hdmlnYXRpb24uc3RhdGUhPT0iaWRsZSI/QmwoYW4sUy5uYXZpZ2F0aW9uLmxvY2F0aW9uLGEpOlMubWF0Y2hlcztPZShSciwiRGlkbid0IGZpbmQgYW55IG1hdGNoZXMgYWZ0ZXIgZmV0Y2hlciBhY3Rpb24iKTtsZXQgenM9KytDO0Uuc2V0KFIsenMpO2xldCBRZj1yYShnZSwkZS5kYXRhKTtTLmZldGNoZXJzLnNldChSLFFmKTtsZXRbZmwsc3JdPWFfKHQuaGlzdG9yeSxTLFJyLGdlLFplLEIsb2UsSCxLLE4sQSxhbixhLHtbWS5yb3V0ZS5pZF06JGUuZGF0YX0sdm9pZCAwKTtzci5maWx0ZXIoa3Q9Pmt0LmtleSE9PVIpLmZvckVhY2goa3Q9PntsZXQgd289a3Qua2V5LHV5PVMuZmV0Y2hlcnMuZ2V0KHdvKSxtYj1yYSh2b2lkIDAsdXk/dXkuZGF0YTp2b2lkIDApO1MuZmV0Y2hlcnMuc2V0KHdvLG1iKSxaLmhhcyh3bykmJm10KHdvKSxrdC5jb250cm9sbGVyJiZaLnNldCh3byxrdC5jb250cm9sbGVyKX0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSk7bGV0IFp1PSgpPT5zci5mb3JFYWNoKGt0PT5tdChrdC5rZXkpKTt1ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KTtsZXR7cmVzdWx0czpKZixsb2FkZXJSZXN1bHRzOnFmLGZldGNoZXJSZXN1bHRzOmVofT1hd2FpdCBsbihTLm1hdGNoZXMsUnIsZmwsc3IsdXQpO2lmKHVlLnNpZ25hbC5hYm9ydGVkKXJldHVybjt1ZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KSxFLmRlbGV0ZShSKSxaLmRlbGV0ZShSKSxzci5mb3JFYWNoKGt0PT5aLmRlbGV0ZShrdC5rZXkpKTtsZXQgaGw9Z18oSmYpO2lmKGhsKXtpZihobC5pZHg+PWZsLmxlbmd0aCl7bGV0IGt0PXNyW2hsLmlkeC1mbC5sZW5ndGhdLmtleTtBLmFkZChrdCl9cmV0dXJuIGF0KFMsaGwucmVzdWx0KX1sZXR7bG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm59PWZfKFMsUy5tYXRjaGVzLGZsLHFmLHZvaWQgMCxzcixlaCxkZSk7aWYoUy5mZXRjaGVycy5oYXMoUikpe2xldCBrdD1QaSgkZS5kYXRhKTtTLmZldGNoZXJzLnNldChSLGt0KX1qcyh6cyksUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiZ6cz5rPyhPZShiLCJFeHBlY3RlZCBwZW5kaW5nIGFjdGlvbiIpLCQmJiQuYWJvcnQoKSxSZShTLm5hdmlnYXRpb24ubG9jYXRpb24se21hdGNoZXM6UnIsbG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm4sZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pKTooYmUoe2Vycm9yczpabixsb2FkZXJEYXRhOmhfKFMubG9hZGVyRGF0YSxHZSxScixabiksZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pLEI9ITEpfWFzeW5jIGZ1bmN0aW9uIFR0KFIsSSx6LFksbGUsa2UsZ2Upe2xldCBwZT1TLmZldGNoZXJzLmdldChSKTtfdChSLHJhKGdlLHBlP3BlLmRhdGE6dm9pZCAwKSx7Zmx1c2hTeW5jOmtlfSk7bGV0IHVlPW5ldyBBYm9ydENvbnRyb2xsZXIsTWU9bmEodC5oaXN0b3J5LHosdWUuc2lnbmFsKTtaLnNldChSLHVlKTtsZXQgVnQ9QywkZT1hd2FpdCB0YSgibG9hZGVyIixNZSxZLGxlLG8saSxhKTtpZihQbygkZSkmJigkZT1hd2FpdCBGaygkZSxNZS5zaWduYWwsITApfHwkZSksWi5nZXQoUik9PT11ZSYmWi5kZWxldGUoUiksIU1lLnNpZ25hbC5hYm9ydGVkKXtpZihLLmhhcyhSKSl7X3QoUixQaSh2b2lkIDApKTtyZXR1cm59aWYocWwoJGUpKWlmKGs+VnQpe190KFIsUGkodm9pZCAwKSk7cmV0dXJufWVsc2V7QS5hZGQoUiksYXdhaXQgYXQoUywkZSk7cmV0dXJufWlmKE1hKCRlKSl7QXQoUixJLCRlLmVycm9yKTtyZXR1cm59T2UoIVBvKCRlKSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpLF90KFIsUGkoJGUuZGF0YSkpfX1hc3luYyBmdW5jdGlvbiBhdChSLEkseil7bGV0e3N1Ym1pc3Npb246WSxmZXRjaGVyU3VibWlzc2lvbjpsZSxyZXBsYWNlOmtlfT16PT09dm9pZCAwP3t9Ono7SS5yZXZhbGlkYXRlJiYoQj0hMCk7bGV0IGdlPWt1KFIubG9jYXRpb24sSS5sb2NhdGlvbix7X2lzUmVkaXJlY3Q6ITB9KTtpZihPZShnZSwiRXhwZWN0ZWQgYSBsb2NhdGlvbiBvbiB0aGUgcmVkaXJlY3QgbmF2aWdhdGlvbiIpLG4pe2xldCBaZT0hMTtpZihJLnJlbG9hZERvY3VtZW50KVplPSEwO2Vsc2UgaWYoSWsudGVzdChJLmxvY2F0aW9uKSl7Y29uc3QgdXQ9dC5oaXN0b3J5LmNyZWF0ZVVSTChJLmxvY2F0aW9uKTtaZT11dC5vcmlnaW4hPT1lLmxvY2F0aW9uLm9yaWdpbnx8SHUodXQucGF0aG5hbWUsYSk9PW51bGx9aWYoWmUpe2tlP2UubG9jYXRpb24ucmVwbGFjZShJLmxvY2F0aW9uKTplLmxvY2F0aW9uLmFzc2lnbihJLmxvY2F0aW9uKTtyZXR1cm59fSQ9bnVsbDtsZXQgcGU9a2U9PT0hMD93dC5SZXBsYWNlOnd0LlB1c2gse2Zvcm1NZXRob2Q6dWUsZm9ybUFjdGlvbjpNZSxmb3JtRW5jVHlwZTpWdH09Ui5uYXZpZ2F0aW9uOyFZJiYhbGUmJnVlJiZNZSYmVnQmJihZPXZfKFIubmF2aWdhdGlvbikpO2xldCAkZT1ZfHxsZTtpZihHTC5oYXMoSS5zdGF0dXMpJiYkZSYmcHIoJGUuZm9ybU1ldGhvZCkpYXdhaXQgUWUocGUsZ2Use3N1Ym1pc3Npb246eXQoe30sJGUse2Zvcm1BY3Rpb246SS5sb2NhdGlvbn0pLHByZXZlbnRTY3JvbGxSZXNldDpUfSk7ZWxzZXtsZXQgWmU9R2goZ2UsWSk7YXdhaXQgUWUocGUsZ2Use292ZXJyaWRlTmF2aWdhdGlvbjpaZSxmZXRjaGVyU3VibWlzc2lvbjpsZSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VH0pfX1hc3luYyBmdW5jdGlvbiBsbihSLEkseixZLGxlKXtsZXQga2U9YXdhaXQgUHJvbWlzZS5hbGwoWy4uLnoubWFwKHVlPT50YSgibG9hZGVyIixsZSx1ZSxJLG8saSxhKSksLi4uWS5tYXAodWU9PnVlLm1hdGNoZXMmJnVlLm1hdGNoJiZ1ZS5jb250cm9sbGVyP3RhKCJsb2FkZXIiLG5hKHQuaGlzdG9yeSx1ZS5wYXRoLHVlLmNvbnRyb2xsZXIuc2lnbmFsKSx1ZS5tYXRjaCx1ZS5tYXRjaGVzLG8saSxhKTp7dHlwZTpTdC5lcnJvcixlcnJvcjpHbig0MDQse3BhdGhuYW1lOnVlLnBhdGh9KX0pXSksZ2U9a2Uuc2xpY2UoMCx6Lmxlbmd0aCkscGU9a2Uuc2xpY2Uoei5sZW5ndGgpO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbChbbV8oUix6LGdlLGdlLm1hcCgoKT0+bGUuc2lnbmFsKSwhMSxTLmxvYWRlckRhdGEpLG1fKFIsWS5tYXAodWU9PnVlLm1hdGNoKSxwZSxZLm1hcCh1ZT0+dWUuY29udHJvbGxlcj91ZS5jb250cm9sbGVyLnNpZ25hbDpudWxsKSwhMCldKSx7cmVzdWx0czprZSxsb2FkZXJSZXN1bHRzOmdlLGZldGNoZXJSZXN1bHRzOnBlfX1mdW5jdGlvbiBFbigpe0I9ITAsb2UucHVzaCguLi5YZigpKSxOLmZvckVhY2goKFIsSSk9PntaLmhhcyhJKSYmKEgucHVzaChJKSxtdChJKSl9KX1mdW5jdGlvbiBfdChSLEkseil7ej09PXZvaWQgMCYmKHo9e30pLFMuZmV0Y2hlcnMuc2V0KFIsSSksYmUoe2ZldGNoZXJzOm5ldyBNYXAoUy5mZXRjaGVycyl9LHtmbHVzaFN5bmM6KHomJnouZmx1c2hTeW5jKT09PSEwfSl9ZnVuY3Rpb24gQXQoUixJLHosWSl7WT09PXZvaWQgMCYmKFk9e30pO2xldCBsZT1BYShTLm1hdGNoZXMsSSk7UG4oUiksYmUoe2Vycm9yczp7W2xlLnJvdXRlLmlkXTp6fSxmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSx7Zmx1c2hTeW5jOihZJiZZLmZsdXNoU3luYyk9PT0hMH0pfWZ1bmN0aW9uIHNuKFIpe3JldHVybiB1LnY3X2ZldGNoZXJQZXJzaXN0JiYoRi5zZXQoUiwoRi5nZXQoUil8fDApKzEpLEsuaGFzKFIpJiZLLmRlbGV0ZShSKSksUy5mZXRjaGVycy5nZXQoUil8fFlMfWZ1bmN0aW9uIFBuKFIpe2xldCBJPVMuZmV0Y2hlcnMuZ2V0KFIpO1ouaGFzKFIpJiYhKEkmJkkuc3RhdGU9PT0ibG9hZGluZyImJkUuaGFzKFIpKSYmbXQoUiksTi5kZWxldGUoUiksRS5kZWxldGUoUiksQS5kZWxldGUoUiksSy5kZWxldGUoUiksUy5mZXRjaGVycy5kZWxldGUoUil9ZnVuY3Rpb24gcXIoUil7aWYodS52N19mZXRjaGVyUGVyc2lzdCl7bGV0IEk9KEYuZ2V0KFIpfHwwKS0xO0k8PTA/KEYuZGVsZXRlKFIpLEsuYWRkKFIpKTpGLnNldChSLEkpfWVsc2UgUG4oUik7YmUoe2ZldGNoZXJzOm5ldyBNYXAoUy5mZXRjaGVycyl9KX1mdW5jdGlvbiBtdChSKXtsZXQgST1aLmdldChSKTtPZShJLCJFeHBlY3RlZCBmZXRjaCBjb250cm9sbGVyOiAiK1IpLEkuYWJvcnQoKSxaLmRlbGV0ZShSKX1mdW5jdGlvbiBOcihSKXtmb3IobGV0IEkgb2YgUil7bGV0IHo9c24oSSksWT1QaSh6LmRhdGEpO1MuZmV0Y2hlcnMuc2V0KEksWSl9fWZ1bmN0aW9uIF9vKCl7bGV0IFI9W10sST0hMTtmb3IobGV0IHogb2YgQSl7bGV0IFk9Uy5mZXRjaGVycy5nZXQoeik7T2UoWSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxZLnN0YXRlPT09ImxvYWRpbmciJiYoQS5kZWxldGUoeiksUi5wdXNoKHopLEk9ITApfXJldHVybiBOcihSKSxJfWZ1bmN0aW9uIGpzKFIpe2xldCBJPVtdO2ZvcihsZXRbeixZXW9mIEUpaWYoWTxSKXtsZXQgbGU9Uy5mZXRjaGVycy5nZXQoeik7T2UobGUsIkV4cGVjdGVkIGZldGNoZXI6ICIreiksbGUuc3RhdGU9PT0ibG9hZGluZyImJihtdCh6KSxFLmRlbGV0ZSh6KSxJLnB1c2goeikpfXJldHVybiBOcihJKSxJLmxlbmd0aD4wfWZ1bmN0aW9uIGZiKFIsSSl7bGV0IHo9Uy5ibG9ja2Vycy5nZXQoUil8fGVhO3JldHVybiBzZS5nZXQoUikhPT1JJiZzZS5zZXQoUixJKSx6fWZ1bmN0aW9uIG95KFIpe1MuYmxvY2tlcnMuZGVsZXRlKFIpLHNlLmRlbGV0ZShSKX1mdW5jdGlvbiBLdShSLEkpe2xldCB6PVMuYmxvY2tlcnMuZ2V0KFIpfHxlYTtPZSh6LnN0YXRlPT09InVuYmxvY2tlZCImJkkuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0icHJvY2VlZGluZyJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0idW5ibG9ja2VkInx8ei5zdGF0ZT09PSJwcm9jZWVkaW5nIiYmSS5zdGF0ZT09PSJ1bmJsb2NrZWQiLCJJbnZhbGlkIGJsb2NrZXIgc3RhdGUgdHJhbnNpdGlvbjogIit6LnN0YXRlKyIgLT4gIitJLnN0YXRlKTtsZXQgWT1uZXcgTWFwKFMuYmxvY2tlcnMpO1kuc2V0KFIsSSksYmUoe2Jsb2NrZXJzOll9KX1mdW5jdGlvbiBseShSKXtsZXR7Y3VycmVudExvY2F0aW9uOkksbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpZfT1SO2lmKHNlLnNpemU9PT0wKXJldHVybjtzZS5zaXplPjEmJnFvKCExLCJBIHJvdXRlciBvbmx5IHN1cHBvcnRzIG9uZSBibG9ja2VyIGF0IGEgdGltZSIpO2xldCBsZT1BcnJheS5mcm9tKHNlLmVudHJpZXMoKSksW2tlLGdlXT1sZVtsZS5sZW5ndGgtMV0scGU9Uy5ibG9ja2Vycy5nZXQoa2UpO2lmKCEocGUmJnBlLnN0YXRlPT09InByb2NlZWRpbmciKSYmZ2Uoe2N1cnJlbnRMb2NhdGlvbjpJLG5leHRMb2NhdGlvbjp6LGhpc3RvcnlBY3Rpb246WX0pKXJldHVybiBrZX1mdW5jdGlvbiBYZihSKXtsZXQgST1bXTtyZXR1cm4gZGUuZm9yRWFjaCgoeixZKT0+eyghUnx8UihZKSkmJih6LmNhbmNlbCgpLEkucHVzaChZKSxkZS5kZWxldGUoWSkpfSksSX1mdW5jdGlvbiBoYihSLEkseil7aWYoZj1SLG09SSxoPXp8fG51bGwsIWcmJlMubmF2aWdhdGlvbj09PVpoKXtnPSEwO2xldCBZPWF5KFMubG9jYXRpb24sUy5tYXRjaGVzKTtZIT1udWxsJiZiZSh7cmVzdG9yZVNjcm9sbFBvc2l0aW9uOll9KX1yZXR1cm4oKT0+e2Y9bnVsbCxtPW51bGwsaD1udWxsfX1mdW5jdGlvbiBzeShSLEkpe3JldHVybiBoJiZoKFIsSS5tYXAoWT0+Q0woWSxTLmxvYWRlckRhdGEpKSl8fFIua2V5fWZ1bmN0aW9uIHBiKFIsSSl7aWYoZiYmbSl7bGV0IHo9c3koUixJKTtmW3pdPW0oKX19ZnVuY3Rpb24gYXkoUixJKXtpZihmKXtsZXQgej1zeShSLEkpLFk9Zlt6XTtpZih0eXBlb2YgWT09Im51bWJlciIpcmV0dXJuIFl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZ2IoUil7bz17fSxzPUtnKFIsaSx2b2lkIDAsbyl9cmV0dXJuIHg9e2dldCBiYXNlbmFtZSgpe3JldHVybiBhfSxnZXQgc3RhdGUoKXtyZXR1cm4gU30sZ2V0IHJvdXRlcygpe3JldHVybiBsfSxnZXQgd2luZG93KCl7cmV0dXJuIGV9LGluaXRpYWxpemU6TmUsc3Vic2NyaWJlOmplLGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uOmhiLG5hdmlnYXRlOndlLGZldGNoOmxyLHJldmFsaWRhdGU6SWUsY3JlYXRlSHJlZjpSPT50Lmhpc3RvcnkuY3JlYXRlSHJlZihSKSxlbmNvZGVMb2NhdGlvbjpSPT50Lmhpc3RvcnkuZW5jb2RlTG9jYXRpb24oUiksZ2V0RmV0Y2hlcjpzbixkZWxldGVGZXRjaGVyOnFyLGRpc3Bvc2U6USxnZXRCbG9ja2VyOmZiLGRlbGV0ZUJsb2NrZXI6b3ksX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczpaLF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczpkZSxfaW50ZXJuYWxTZXRSb3V0ZXM6Z2J9LHh9ZnVuY3Rpb24gSkwodCl7cmV0dXJuIHQhPW51bGwmJigiZm9ybURhdGEiaW4gdCYmdC5mb3JtRGF0YSE9bnVsbHx8ImJvZHkiaW4gdCYmdC5ib2R5IT09dm9pZCAwKX1mdW5jdGlvbiBaZyh0LGUsbixyLGksbyxsKXtsZXQgcyxhO2lmKG8pe3M9W107Zm9yKGxldCBjIG9mIGUpaWYocy5wdXNoKGMpLGMucm91dGUuaWQ9PT1vKXthPWM7YnJlYWt9fWVsc2Ugcz1lLGE9ZVtlLmxlbmd0aC0xXTtsZXQgdT1BayhpfHwiLiIsUGsocyksSHUodC5wYXRobmFtZSxuKXx8dC5wYXRobmFtZSxsPT09InBhdGgiKTtyZXR1cm4gaT09bnVsbCYmKHUuc2VhcmNoPXQuc2VhcmNoLHUuaGFzaD10Lmhhc2gpLChpPT1udWxsfHxpPT09IiJ8fGk9PT0iLiIpJiZhJiZhLnJvdXRlLmluZGV4JiYhUXYodS5zZWFyY2gpJiYodS5zZWFyY2g9dS5zZWFyY2g/dS5zZWFyY2gucmVwbGFjZSgvXlw/LywiP2luZGV4JiIpOiI/aW5kZXgiKSxyJiZuIT09Ii8iJiYodS5wYXRobmFtZT11LnBhdGhuYW1lPT09Ii8iP246ZW8oW24sdS5wYXRobmFtZV0pKSxWdSh1KX1mdW5jdGlvbiBzXyh0LGUsbixyKXtpZighcnx8IUpMKHIpKXJldHVybntwYXRoOm59O2lmKHIuZm9ybU1ldGhvZCYmIW9JKHIuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixlcnJvcjpHbig0MDUse21ldGhvZDpyLmZvcm1NZXRob2R9KX07bGV0IGk9KCk9Pih7cGF0aDpuLGVycm9yOkduKDQwMCx7dHlwZToiaW52YWxpZC1ib2R5In0pfSksbz1yLmZvcm1NZXRob2R8fCJnZXQiLGw9dD9vLnRvVXBwZXJDYXNlKCk6by50b0xvd2VyQ2FzZSgpLHM9emsobik7aWYoci5ib2R5IT09dm9pZCAwKXtpZihyLmZvcm1FbmNUeXBlPT09InRleHQvcGxhaW4iKXtpZighcHIobCkpcmV0dXJuIGkoKTtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9yLmJvZHk6ci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGF8fHIuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9BcnJheS5mcm9tKHIuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoaCxtKT0+e2xldFtnLHddPW07cmV0dXJuIiIraCtnKyI9Iit3K2AKYH0sIiIpOlN0cmluZyhyLmJvZHkpO3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OmZ9fX1lbHNlIGlmKHIuZm9ybUVuY1R5cGU9PT0iYXBwbGljYXRpb24vanNvbiIpe2lmKCFwcihsKSlyZXR1cm4gaSgpO3RyeXtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9KU09OLnBhcnNlKHIuYm9keSk6ci5ib2R5O3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOmYsdGV4dDp2b2lkIDB9fX1jYXRjaHtyZXR1cm4gaSgpfX19T2UodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iLCJGb3JtRGF0YSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKTtsZXQgYSx1O2lmKHIuZm9ybURhdGEpYT1HZyhyLmZvcm1EYXRhKSx1PXIuZm9ybURhdGE7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSlhPUdnKHIuYm9keSksdT1yLmJvZHk7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpYT1yLmJvZHksdT1kXyhhKTtlbHNlIGlmKHIuYm9keT09bnVsbClhPW5ldyBVUkxTZWFyY2hQYXJhbXMsdT1uZXcgRm9ybURhdGE7ZWxzZSB0cnl7YT1uZXcgVVJMU2VhcmNoUGFyYW1zKHIuYm9keSksdT1kXyhhKX1jYXRjaHtyZXR1cm4gaSgpfWxldCBjPXtmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnImJnIuZm9ybUVuY1R5cGV8fCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGZvcm1EYXRhOnUsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9O2lmKHByKGMuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOmN9O2xldCBkPWtpKG4pO3JldHVybiBlJiZkLnNlYXJjaCYmUXYoZC5zZWFyY2gpJiZhLmFwcGVuZCgiaW5kZXgiLCIiKSxkLnNlYXJjaD0iPyIrYSx7cGF0aDpWdShkKSxzdWJtaXNzaW9uOmN9fWZ1bmN0aW9uIHFMKHQsZSl7bGV0IG49dDtpZihlKXtsZXQgcj10LmZpbmRJbmRleChpPT5pLnJvdXRlLmlkPT09ZSk7cj49MCYmKG49dC5zbGljZSgwLHIpKX1yZXR1cm4gbn1mdW5jdGlvbiBhXyh0LGUsbixyLGksbyxsLHMsYSx1LGMsZCxmLGgsbSl7bGV0IGc9bT9PYmplY3QudmFsdWVzKG0pWzBdOmg/T2JqZWN0LnZhbHVlcyhoKVswXTp2b2lkIDAsdz10LmNyZWF0ZVVSTChlLmxvY2F0aW9uKSx2PXQuY3JlYXRlVVJMKGkpLHk9bT9PYmplY3Qua2V5cyhtKVswXTp2b2lkIDAsUz1xTChuLHkpLmZpbHRlcigoVCwkKT0+e2lmKFQucm91dGUubGF6eSlyZXR1cm4hMDtpZihULnJvdXRlLmxvYWRlcj09bnVsbClyZXR1cm4hMTtpZihlSShlLmxvYWRlckRhdGEsZS5tYXRjaGVzWyRdLFQpfHxsLnNvbWUoUD0+UD09PVQucm91dGUuaWQpKXJldHVybiEwO2xldCBPPWUubWF0Y2hlc1skXSxMPVQ7cmV0dXJuIHVfKFQseXQoe2N1cnJlbnRVcmw6dyxjdXJyZW50UGFyYW1zOk8ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOkwucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfHx3LnBhdGhuYW1lK3cuc2VhcmNoPT09di5wYXRobmFtZSt2LnNlYXJjaHx8dy5zZWFyY2ghPT12LnNlYXJjaHx8amsoTyxMKX0pKX0pLGI9W107cmV0dXJuIHUuZm9yRWFjaCgoVCwkKT0+e2lmKCFuLnNvbWUoQj0+Qi5yb3V0ZS5pZD09PVQucm91dGVJZCl8fGEuaGFzKCQpKXJldHVybjtsZXQgTz1CbChkLFQucGF0aCxmKTtpZighTyl7Yi5wdXNoKHtrZXk6JCxyb3V0ZUlkOlQucm91dGVJZCxwYXRoOlQucGF0aCxtYXRjaGVzOm51bGwsbWF0Y2g6bnVsbCxjb250cm9sbGVyOm51bGx9KTtyZXR1cm59bGV0IEw9ZS5mZXRjaGVycy5nZXQoJCksUD1ZZyhPLFQucGF0aCksRD0hMTtjLmhhcygkKT9EPSExOnMuaW5jbHVkZXMoJCk/RD0hMDpMJiZMLnN0YXRlIT09ImlkbGUiJiZMLmRhdGE9PT12b2lkIDA/RD1vOkQ9dV8oUCx5dCh7Y3VycmVudFVybDp3LGN1cnJlbnRQYXJhbXM6ZS5tYXRjaGVzW2UubWF0Y2hlcy5sZW5ndGgtMV0ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOm5bbi5sZW5ndGgtMV0ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfSkpLEQmJmIucHVzaCh7a2V5OiQscm91dGVJZDpULnJvdXRlSWQscGF0aDpULnBhdGgsbWF0Y2hlczpPLG1hdGNoOlAsY29udHJvbGxlcjpuZXcgQWJvcnRDb250cm9sbGVyfSl9KSxbUyxiXX1mdW5jdGlvbiBlSSh0LGUsbil7bGV0IHI9IWV8fG4ucm91dGUuaWQhPT1lLnJvdXRlLmlkLGk9dFtuLnJvdXRlLmlkXT09PXZvaWQgMDtyZXR1cm4gcnx8aX1mdW5jdGlvbiBqayh0LGUpe2xldCBuPXQucm91dGUucGF0aDtyZXR1cm4gdC5wYXRobmFtZSE9PWUucGF0aG5hbWV8fG4hPW51bGwmJm4uZW5kc1dpdGgoIioiKSYmdC5wYXJhbXNbIioiXSE9PWUucGFyYW1zWyIqIl19ZnVuY3Rpb24gdV8odCxlKXtpZih0LnJvdXRlLnNob3VsZFJldmFsaWRhdGUpe2xldCBuPXQucm91dGUuc2hvdWxkUmV2YWxpZGF0ZShlKTtpZih0eXBlb2Ygbj09ImJvb2xlYW4iKXJldHVybiBufXJldHVybiBlLmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlfWFzeW5jIGZ1bmN0aW9uIGNfKHQsZSxuKXtpZighdC5sYXp5KXJldHVybjtsZXQgcj1hd2FpdCB0LmxhenkoKTtpZighdC5sYXp5KXJldHVybjtsZXQgaT1uW3QuaWRdO09lKGksIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0Iik7bGV0IG89e307Zm9yKGxldCBsIGluIHIpe2xldCBhPWlbbF0hPT12b2lkIDAmJmwhPT0iaGFzRXJyb3JCb3VuZGFyeSI7cW8oIWEsJ1JvdXRlICInK2kuaWQrJyIgaGFzIGEgc3RhdGljIHByb3BlcnR5ICInK2wrJyIgZGVmaW5lZCBidXQgaXRzIGxhenkgZnVuY3Rpb24gaXMgYWxzbyByZXR1cm5pbmcgYSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eS4gJysoJ1RoZSBsYXp5IHJvdXRlIHByb3BlcnR5ICInK2wrJyIgd2lsbCBiZSBpZ25vcmVkLicpKSwhYSYmIVNMLmhhcyhsKSYmKG9bbF09cltsXSl9T2JqZWN0LmFzc2lnbihpLG8pLE9iamVjdC5hc3NpZ24oaSx5dCh7fSxlKGkpLHtsYXp5OnZvaWQgMH0pKX1hc3luYyBmdW5jdGlvbiB0YSh0LGUsbixyLGksbyxsLHMpe3M9PT12b2lkIDAmJihzPXt9KTtsZXQgYSx1LGMsZD1tPT57bGV0IGcsdz1uZXcgUHJvbWlzZSgodix5KT0+Zz15KTtyZXR1cm4gYz0oKT0+ZygpLGUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixjKSxQcm9taXNlLnJhY2UoW20oe3JlcXVlc3Q6ZSxwYXJhbXM6bi5wYXJhbXMsY29udGV4dDpzLnJlcXVlc3RDb250ZXh0fSksd10pfTt0cnl7bGV0IG09bi5yb3V0ZVt0XTtpZihuLnJvdXRlLmxhenkpaWYobSl7bGV0IGcsdz1hd2FpdCBQcm9taXNlLmFsbChbZChtKS5jYXRjaCh2PT57Zz12fSksY18obi5yb3V0ZSxvLGkpXSk7aWYoZyl0aHJvdyBnO3U9d1swXX1lbHNlIGlmKGF3YWl0IGNfKG4ucm91dGUsbyxpKSxtPW4ucm91dGVbdF0sbSl1PWF3YWl0IGQobSk7ZWxzZSBpZih0PT09ImFjdGlvbiIpe2xldCBnPW5ldyBVUkwoZS51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDUse21ldGhvZDplLm1ldGhvZCxwYXRobmFtZTp3LHJvdXRlSWQ6bi5yb3V0ZS5pZH0pfWVsc2UgcmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnZvaWQgMH07ZWxzZSBpZihtKXU9YXdhaXQgZChtKTtlbHNle2xldCBnPW5ldyBVUkwoZS51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDQse3BhdGhuYW1lOnd9KX1PZSh1IT09dm9pZCAwLCJZb3UgZGVmaW5lZCAiKyh0PT09ImFjdGlvbiI/ImFuIGFjdGlvbiI6ImEgbG9hZGVyIikrIiBmb3Igcm91dGUgIisoJyInK24ucm91dGUuaWQrIlwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgIit0KyJgICIpKyJmdW5jdGlvbi4gUGxlYXNlIHJldHVybiBhIHZhbHVlIG9yIGBudWxsYC4iKX1jYXRjaChtKXthPVN0LmVycm9yLHU9bX1maW5hbGx5e2MmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixjKX1pZihpSSh1KSl7bGV0IG09dS5zdGF0dXM7aWYoWkwuaGFzKG0pKXtsZXQgdj11LmhlYWRlcnMuZ2V0KCJMb2NhdGlvbiIpO2lmKE9lKHYsIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyIiksIUlrLnRlc3Qodikpdj1aZyhuZXcgVVJMKGUudXJsKSxyLnNsaWNlKDAsci5pbmRleE9mKG4pKzEpLGwsITAsdik7ZWxzZSBpZighcy5pc1N0YXRpY1JlcXVlc3Qpe2xldCB5PW5ldyBVUkwoZS51cmwpLHg9di5zdGFydHNXaXRoKCIvLyIpP25ldyBVUkwoeS5wcm90b2NvbCt2KTpuZXcgVVJMKHYpLFM9SHUoeC5wYXRobmFtZSxsKSE9bnVsbDt4Lm9yaWdpbj09PXkub3JpZ2luJiZTJiYodj14LnBhdGhuYW1lK3guc2VhcmNoK3guaGFzaCl9aWYocy5pc1N0YXRpY1JlcXVlc3QpdGhyb3cgdS5oZWFkZXJzLnNldCgiTG9jYXRpb24iLHYpLHU7cmV0dXJue3R5cGU6U3QucmVkaXJlY3Qsc3RhdHVzOm0sbG9jYXRpb246dixyZXZhbGlkYXRlOnUuaGVhZGVycy5nZXQoIlgtUmVtaXgtUmV2YWxpZGF0ZSIpIT09bnVsbCxyZWxvYWREb2N1bWVudDp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudCIpIT09bnVsbH19aWYocy5pc1JvdXRlUmVxdWVzdCl0aHJvd3t0eXBlOmE9PT1TdC5lcnJvcj9TdC5lcnJvcjpTdC5kYXRhLHJlc3BvbnNlOnV9O2xldCBnLHc9dS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIik7cmV0dXJuIHcmJi9cYmFwcGxpY2F0aW9uXC9qc29uXGIvLnRlc3Qodyk/Zz1hd2FpdCB1Lmpzb24oKTpnPWF3YWl0IHUudGV4dCgpLGE9PT1TdC5lcnJvcj97dHlwZTphLGVycm9yOm5ldyBYdihtLHUuc3RhdHVzVGV4dCxnKSxoZWFkZXJzOnUuaGVhZGVyc306e3R5cGU6U3QuZGF0YSxkYXRhOmcsc3RhdHVzQ29kZTp1LnN0YXR1cyxoZWFkZXJzOnUuaGVhZGVyc319aWYoYT09PVN0LmVycm9yKXJldHVybnt0eXBlOmEsZXJyb3I6dX07aWYockkodSkpe3ZhciBmLGg7cmV0dXJue3R5cGU6U3QuZGVmZXJyZWQsZGVmZXJyZWREYXRhOnUsc3RhdHVzQ29kZTooZj11LmluaXQpPT1udWxsP3ZvaWQgMDpmLnN0YXR1cyxoZWFkZXJzOigoaD11LmluaXQpPT1udWxsP3ZvaWQgMDpoLmhlYWRlcnMpJiZuZXcgSGVhZGVycyh1LmluaXQuaGVhZGVycyl9fXJldHVybnt0eXBlOlN0LmRhdGEsZGF0YTp1fX1mdW5jdGlvbiBuYSh0LGUsbixyKXtsZXQgaT10LmNyZWF0ZVVSTCh6ayhlKSkudG9TdHJpbmcoKSxvPXtzaWduYWw6bn07aWYociYmcHIoci5mb3JtTWV0aG9kKSl7bGV0e2Zvcm1NZXRob2Q6bCxmb3JtRW5jVHlwZTpzfT1yO28ubWV0aG9kPWwudG9VcHBlckNhc2UoKSxzPT09ImFwcGxpY2F0aW9uL2pzb24iPyhvLmhlYWRlcnM9bmV3IEhlYWRlcnMoeyJDb250ZW50LVR5cGUiOnN9KSxvLmJvZHk9SlNPTi5zdHJpbmdpZnkoci5qc29uKSk6cz09PSJ0ZXh0L3BsYWluIj9vLmJvZHk9ci50ZXh0OnM9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmci5mb3JtRGF0YT9vLmJvZHk9R2coci5mb3JtRGF0YSk6by5ib2R5PXIuZm9ybURhdGF9cmV0dXJuIG5ldyBSZXF1ZXN0KGksbyl9ZnVuY3Rpb24gR2codCl7bGV0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcztmb3IobGV0W24scl1vZiB0LmVudHJpZXMoKSllLmFwcGVuZChuLHR5cGVvZiByPT0ic3RyaW5nIj9yOnIubmFtZSk7cmV0dXJuIGV9ZnVuY3Rpb24gZF8odCl7bGV0IGU9bmV3IEZvcm1EYXRhO2ZvcihsZXRbbixyXW9mIHQuZW50cmllcygpKWUuYXBwZW5kKG4scik7cmV0dXJuIGV9ZnVuY3Rpb24gdEkodCxlLG4scixpKXtsZXQgbz17fSxsPW51bGwscyxhPSExLHU9e307cmV0dXJuIG4uZm9yRWFjaCgoYyxkKT0+e2xldCBmPWVbZF0ucm91dGUuaWQ7aWYoT2UoIXFsKGMpLCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGEiKSxNYShjKSl7bGV0IGg9QWEodCxmKSxtPWMuZXJyb3I7ciYmKG09T2JqZWN0LnZhbHVlcyhyKVswXSxyPXZvaWQgMCksbD1sfHx7fSxsW2gucm91dGUuaWRdPT1udWxsJiYobFtoLnJvdXRlLmlkXT1tKSxvW2ZdPXZvaWQgMCxhfHwoYT0hMCxzPU1rKGMuZXJyb3IpP2MuZXJyb3Iuc3RhdHVzOjUwMCksYy5oZWFkZXJzJiYodVtmXT1jLmhlYWRlcnMpfWVsc2UgUG8oYyk/KGkuc2V0KGYsYy5kZWZlcnJlZERhdGEpLG9bZl09Yy5kZWZlcnJlZERhdGEuZGF0YSk6b1tmXT1jLmRhdGEsYy5zdGF0dXNDb2RlIT1udWxsJiZjLnN0YXR1c0NvZGUhPT0yMDAmJiFhJiYocz1jLnN0YXR1c0NvZGUpLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX0pLHImJihsPXIsb1tPYmplY3Qua2V5cyhyKVswXV09dm9pZCAwKSx7bG9hZGVyRGF0YTpvLGVycm9yczpsLHN0YXR1c0NvZGU6c3x8MjAwLGxvYWRlckhlYWRlcnM6dX19ZnVuY3Rpb24gZl8odCxlLG4scixpLG8sbCxzKXtsZXR7bG9hZGVyRGF0YTphLGVycm9yczp1fT10SShlLG4scixpLHMpO2ZvcihsZXQgYz0wO2M8by5sZW5ndGg7YysrKXtsZXR7a2V5OmQsbWF0Y2g6Zixjb250cm9sbGVyOmh9PW9bY107T2UobCE9PXZvaWQgMCYmbFtjXSE9PXZvaWQgMCwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHQiKTtsZXQgbT1sW2NdO2lmKCEoaCYmaC5zaWduYWwuYWJvcnRlZCkpaWYoTWEobSkpe2xldCBnPUFhKHQubWF0Y2hlcyxmPT1udWxsP3ZvaWQgMDpmLnJvdXRlLmlkKTt1JiZ1W2cucm91dGUuaWRdfHwodT15dCh7fSx1LHtbZy5yb3V0ZS5pZF06bS5lcnJvcn0pKSx0LmZldGNoZXJzLmRlbGV0ZShkKX1lbHNlIGlmKHFsKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciByZXZhbGlkYXRpb24gcmVkaXJlY3QiKTtlbHNlIGlmKFBvKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7ZWxzZXtsZXQgZz1QaShtLmRhdGEpO3QuZmV0Y2hlcnMuc2V0KGQsZyl9fXJldHVybntsb2FkZXJEYXRhOmEsZXJyb3JzOnV9fWZ1bmN0aW9uIGhfKHQsZSxuLHIpe2xldCBpPXl0KHt9LGUpO2ZvcihsZXQgbyBvZiBuKXtsZXQgbD1vLnJvdXRlLmlkO2lmKGUuaGFzT3duUHJvcGVydHkobCk/ZVtsXSE9PXZvaWQgMCYmKGlbbF09ZVtsXSk6dFtsXSE9PXZvaWQgMCYmby5yb3V0ZS5sb2FkZXImJihpW2xdPXRbbF0pLHImJnIuaGFzT3duUHJvcGVydHkobCkpYnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gQWEodCxlKXtyZXR1cm4oZT90LnNsaWNlKDAsdC5maW5kSW5kZXgocj0+ci5yb3V0ZS5pZD09PWUpKzEpOlsuLi50XSkucmV2ZXJzZSgpLmZpbmQocj0+ci5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5PT09ITApfHx0WzBdfWZ1bmN0aW9uIHBfKHQpe2xldCBlPXQubGVuZ3RoPT09MT90WzBdOnQuZmluZChuPT5uLmluZGV4fHwhbi5wYXRofHxuLnBhdGg9PT0iLyIpfHx7aWQ6Il9fc2hpbS1lcnJvci1yb3V0ZV9fIn07cmV0dXJue21hdGNoZXM6W3twYXJhbXM6e30scGF0aG5hbWU6IiIscGF0aG5hbWVCYXNlOiIiLHJvdXRlOmV9XSxyb3V0ZTplfX1mdW5jdGlvbiBHbih0LGUpe2xldHtwYXRobmFtZTpuLHJvdXRlSWQ6cixtZXRob2Q6aSx0eXBlOm99PWU9PT12b2lkIDA/e306ZSxsPSJVbmtub3duIFNlcnZlciBFcnJvciIscz0iVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvciI7cmV0dXJuIHQ9PT00MDA/KGw9IkJhZCBSZXF1ZXN0IixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGEgYGxvYWRlcmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6bz09PSJkZWZlci1hY3Rpb24iP3M9ImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zIjpvPT09ImludmFsaWQtYm9keSImJihzPSJVbmFibGUgdG8gZW5jb2RlIHN1Ym1pc3Npb24gYm9keSIpKTp0PT09NDAzPyhsPSJGb3JiaWRkZW4iLHM9J1JvdXRlICInK3IrJyIgZG9lcyBub3QgbWF0Y2ggVVJMICInK24rJyInKTp0PT09NDA0PyhsPSJOb3QgRm91bmQiLHM9J05vIHJvdXRlIG1hdGNoZXMgVVJMICInK24rJyInKTp0PT09NDA1JiYobD0iTWV0aG9kIE5vdCBBbGxvd2VkIixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpLnRvVXBwZXJDYXNlKCkrJyByZXF1ZXN0IHRvICInK24rJyIgYnV0ICcrKCdkaWQgbm90IHByb3ZpZGUgYW4gYGFjdGlvbmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6aSYmKHM9J0ludmFsaWQgcmVxdWVzdCBtZXRob2QgIicraS50b1VwcGVyQ2FzZSgpKyciJykpLG5ldyBYdih0fHw1MDAsbCxuZXcgRXJyb3IocyksITApfWZ1bmN0aW9uIGdfKHQpe2ZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKXtsZXQgbj10W2VdO2lmKHFsKG4pKXJldHVybntyZXN1bHQ6bixpZHg6ZX19fWZ1bmN0aW9uIHprKHQpe2xldCBlPXR5cGVvZiB0PT0ic3RyaW5nIj9raSh0KTp0O3JldHVybiBWdSh5dCh7fSxlLHtoYXNoOiIifSkpfWZ1bmN0aW9uIG5JKHQsZSl7cmV0dXJuIHQucGF0aG5hbWUhPT1lLnBhdGhuYW1lfHx0LnNlYXJjaCE9PWUuc2VhcmNoPyExOnQuaGFzaD09PSIiP2UuaGFzaCE9PSIiOnQuaGFzaD09PWUuaGFzaD8hMDplLmhhc2ghPT0iIn1mdW5jdGlvbiBQbyh0KXtyZXR1cm4gdC50eXBlPT09U3QuZGVmZXJyZWR9ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHQudHlwZT09PVN0LmVycm9yfWZ1bmN0aW9uIHFsKHQpe3JldHVybih0JiZ0LnR5cGUpPT09U3QucmVkaXJlY3R9ZnVuY3Rpb24gckkodCl7bGV0IGU9dDtyZXR1cm4gZSYmdHlwZW9mIGU9PSJvYmplY3QiJiZ0eXBlb2YgZS5kYXRhPT0ib2JqZWN0IiYmdHlwZW9mIGUuc3Vic2NyaWJlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZS5jYW5jZWw9PSJmdW5jdGlvbiImJnR5cGVvZiBlLnJlc29sdmVEYXRhPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIGlJKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdC5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIHQuaGVhZGVycz09Im9iamVjdCImJnR5cGVvZiB0LmJvZHk8InUifWZ1bmN0aW9uIG9JKHQpe3JldHVybiBLTC5oYXModC50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBwcih0KXtyZXR1cm4gVkwuaGFzKHQudG9Mb3dlckNhc2UoKSl9YXN5bmMgZnVuY3Rpb24gbV8odCxlLG4scixpLG8pe2ZvcihsZXQgbD0wO2w8bi5sZW5ndGg7bCsrKXtsZXQgcz1uW2xdLGE9ZVtsXTtpZighYSljb250aW51ZTtsZXQgdT10LmZpbmQoZD0+ZC5yb3V0ZS5pZD09PWEucm91dGUuaWQpLGM9dSE9bnVsbCYmIWprKHUsYSkmJihvJiZvW2Eucm91dGUuaWRdKSE9PXZvaWQgMDtpZihQbyhzKSYmKGl8fGMpKXtsZXQgZD1yW2xdO09lKGQsIkV4cGVjdGVkIGFuIEFib3J0U2lnbmFsIGZvciByZXZhbGlkYXRpbmcgZmV0Y2hlciBkZWZlcnJlZCByZXN1bHQiKSxhd2FpdCBGayhzLGQsaSkudGhlbihmPT57ZiYmKG5bbF09Znx8bltsXSl9KX19fWFzeW5jIGZ1bmN0aW9uIEZrKHQsZSxuKXtpZihuPT09dm9pZCAwJiYobj0hMSksIWF3YWl0IHQuZGVmZXJyZWREYXRhLnJlc29sdmVEYXRhKGUpKXtpZihuKXRyeXtyZXR1cm57dHlwZTpTdC5kYXRhLGRhdGE6dC5kZWZlcnJlZERhdGEudW53cmFwcGVkRGF0YX19Y2F0Y2goaSl7cmV0dXJue3R5cGU6U3QuZXJyb3IsZXJyb3I6aX19cmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnQuZGVmZXJyZWREYXRhLmRhdGF9fX1mdW5jdGlvbiBRdih0KXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh0KS5nZXRBbGwoImluZGV4Iikuc29tZShlPT5lPT09IiIpfWZ1bmN0aW9uIFlnKHQsZSl7bGV0IG49dHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpLnNlYXJjaDplLnNlYXJjaDtpZih0W3QubGVuZ3RoLTFdLnJvdXRlLmluZGV4JiZRdihufHwiIikpcmV0dXJuIHRbdC5sZW5ndGgtMV07bGV0IHI9T2sodCk7cmV0dXJuIHJbci5sZW5ndGgtMV19ZnVuY3Rpb24gdl8odCl7bGV0e2Zvcm1NZXRob2Q6ZSxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cix0ZXh0OmksZm9ybURhdGE6byxqc29uOmx9PXQ7aWYoISghZXx8IW58fCFyKSl7aWYoaSE9bnVsbClyZXR1cm57Zm9ybU1ldGhvZDplLGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0Oml9O2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6ZSxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTpvLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihsIT09dm9pZCAwKXJldHVybntmb3JtTWV0aG9kOmUsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6dm9pZCAwLGpzb246bCx0ZXh0OnZvaWQgMH19fWZ1bmN0aW9uIEdoKHQsZSl7cmV0dXJuIGU/e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dH06e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9fWZ1bmN0aW9uIGxJKHQsZSl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dH19ZnVuY3Rpb24gcmEodCxlKXtyZXR1cm4gdD97c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dCxkYXRhOmV9OntzdGF0ZToibG9hZGluZyIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOmV9fWZ1bmN0aW9uIHNJKHQsZSl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHQsZGF0YTplP2UuZGF0YTp2b2lkIDB9fWZ1bmN0aW9uIFBpKHQpe3JldHVybntzdGF0ZToiaWRsZSIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOnR9fWZ1bmN0aW9uIGFJKHQsZSl7dHJ5e2xldCBuPXQuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShEayk7aWYobil7bGV0IHI9SlNPTi5wYXJzZShuKTtmb3IobGV0W2ksb11vZiBPYmplY3QuZW50cmllcyhyfHx7fSkpbyYmQXJyYXkuaXNBcnJheShvKSYmZS5zZXQoaSxuZXcgU2V0KG98fFtdKSl9fWNhdGNoe319ZnVuY3Rpb24gdUkodCxlKXtpZihlLnNpemU+MCl7bGV0IG49e307Zm9yKGxldFtyLGldb2YgZSluW3JdPVsuLi5pXTt0cnl7dC5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKERrLEpTT04uc3RyaW5naWZ5KG4pKX1jYXRjaChyKXtxbyghMSwiRmFpbGVkIHRvIHNhdmUgYXBwbGllZCB2aWV3IHRyYW5zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlICgiK3IrIikuIil9fX0vKioKICogUmVhY3QgUm91dGVyIHY2LjIwLjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBxZCgpe3JldHVybiBxZD1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LHFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jb25zdCBWZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksQms9cC5jcmVhdGVDb250ZXh0KG51bGwpLEhmPXAuY3JlYXRlQ29udGV4dChudWxsKSxLZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksZGw9cC5jcmVhdGVDb250ZXh0KHtvdXRsZXQ6bnVsbCxtYXRjaGVzOltdLGlzRGF0YVJvdXRlOiExfSksVWs9cC5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIFpmKCl7cmV0dXJuIHAudXNlQ29udGV4dChLZikhPW51bGx9ZnVuY3Rpb24gV2soKXtyZXR1cm4gWmYoKXx8T2UoITEpLHAudXNlQ29udGV4dChLZikubG9jYXRpb259ZnVuY3Rpb24gVmsodCl7cC51c2VDb250ZXh0KEhmKS5zdGF0aWN8fHAudXNlTGF5b3V0RWZmZWN0KHQpfWZ1bmN0aW9uIEp2KCl7bGV0e2lzRGF0YVJvdXRlOnR9PXAudXNlQ29udGV4dChkbCk7cmV0dXJuIHQ/U0koKTpjSSgpfWZ1bmN0aW9uIGNJKCl7WmYoKXx8T2UoITEpO2xldCB0PXAudXNlQ29udGV4dChWZikse2Jhc2VuYW1lOmUsbmF2aWdhdG9yOm59PXAudXNlQ29udGV4dChIZikse21hdGNoZXM6cn09cC51c2VDb250ZXh0KGRsKSx7cGF0aG5hbWU6aX09V2soKSxvPUpTT04uc3RyaW5naWZ5KFBrKHIpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QWsoYSxKU09OLnBhcnNlKG8pLGksdS5yZWxhdGl2ZT09PSJwYXRoIik7dD09bnVsbCYmZSE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj9lOmVvKFtlLGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFtlLG4sbyxpLHRdKX1mdW5jdGlvbiBkSSgpe2xldHttYXRjaGVzOnR9PXAudXNlQ29udGV4dChkbCksZT10W3QubGVuZ3RoLTFdO3JldHVybiBlP2UucGFyYW1zOnt9fWZ1bmN0aW9uIGZJKHQsZSxuKXtaZigpfHxPZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoSGYpLHttYXRjaGVzOml9PXAudXNlQ29udGV4dChkbCksbz1pW2kubGVuZ3RoLTFdLGw9bz9vLnBhcmFtczp7fTtvJiZvLnBhdGhuYW1lO2xldCBzPW8/by5wYXRobmFtZUJhc2U6Ii8iO28mJm8ucm91dGU7bGV0IGE9V2soKSx1O2lmKGUpe3ZhciBjO2xldCBnPXR5cGVvZiBlPT0ic3RyaW5nIj9raShlKTplO3M9PT0iLyJ8fChjPWcucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fE9lKCExKSx1PWd9ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1CbCh0LHtwYXRobmFtZTpmfSksbT12SShoJiZoLm1hcChnPT5PYmplY3QuYXNzaWduKHt9LGcse3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsZy5wYXJhbXMpLHBhdGhuYW1lOmVvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihnLnBhdGhuYW1lKS5wYXRobmFtZTpnLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOmcucGF0aG5hbWVCYXNlPT09Ii8iP3M6ZW8oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKGcucGF0aG5hbWVCYXNlKS5wYXRobmFtZTpnLnBhdGhuYW1lQmFzZV0pfSkpLGksbik7cmV0dXJuIGUmJm0/cC5jcmVhdGVFbGVtZW50KEtmLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246cWQoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOnd0LlBvcH19LG0pOm19ZnVuY3Rpb24gaEkoKXtsZXQgdD13SSgpLGU9TWsodCk/dC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dDp0IGluc3RhbmNlb2YgRXJyb3I/dC5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KHQpLG49dCBpbnN0YW5jZW9mIEVycm9yP3Quc3RhY2s6bnVsbCxpPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LG89bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sZSksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOml9LG4pOm51bGwsbyl9Y29uc3QgcEk9cC5jcmVhdGVFbGVtZW50KGhJLG51bGwpO2NsYXNzIGdJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5zdGF0ZT17bG9jYXRpb246ZS5sb2NhdGlvbixyZXZhbGlkYXRpb246ZS5yZXZhbGlkYXRpb24sZXJyb3I6ZS5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlKXtyZXR1cm57ZXJyb3I6ZX19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhlLG4pe3JldHVybiBuLmxvY2F0aW9uIT09ZS5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJmUucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjplLmVycm9yLGxvY2F0aW9uOmUubG9jYXRpb24scmV2YWxpZGF0aW9uOmUucmV2YWxpZGF0aW9ufTp7ZXJyb3I6ZS5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjplLnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKGUsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLGUsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFVrLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIG1JKHQpe2xldHtyb3V0ZUNvbnRleHQ6ZSxtYXRjaDpuLGNoaWxkcmVuOnJ9PXQsaT1wLnVzZUNvbnRleHQoVmYpO3JldHVybiBpJiZpLnN0YXRpYyYmaS5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihpLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTplfSxyKX1mdW5jdGlvbiB2SSh0LGUsbil7dmFyIHI7aWYoZT09PXZvaWQgMCYmKGU9W10pLG49PT12b2lkIDAmJihuPW51bGwpLHQ9PW51bGwpe3ZhciBpO2lmKChpPW4pIT1udWxsJiZpLmVycm9ycyl0PW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBvPXQsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9by5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHxPZSghMSksbz1vLnNsaWNlKDAsTWF0aC5taW4oby5sZW5ndGgscysxKSl9cmV0dXJuIG8ucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8cEkpO2xldCBmPWUuY29uY2F0KG8uc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IG07cmV0dXJuIGM/bT1kOmEucm91dGUuQ29tcG9uZW50P209cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9tPWEucm91dGUuZWxlbWVudDptPXMscC5jcmVhdGVFbGVtZW50KG1JLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOm19KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KGdJLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBIaz1mdW5jdGlvbih0KXtyZXR1cm4gdC5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIix0LlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsdC5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLHR9KEhrfHx7fSksZWY9ZnVuY3Rpb24odCl7cmV0dXJuIHQuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsdC5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIix0LlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLHQuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsdC5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIix0LlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIix0LlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLHQuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIix0LlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsdC5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIix0fShlZnx8e30pO2Z1bmN0aW9uIHlJKHQpe2xldCBlPXAudXNlQ29udGV4dChWZik7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIHhJKHQpe2xldCBlPXAudXNlQ29udGV4dChCayk7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIF9JKHQpe2xldCBlPXAudXNlQ29udGV4dChkbCk7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIEtrKHQpe2xldCBlPV9JKCksbj1lLm1hdGNoZXNbZS5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8T2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gd0koKXt2YXIgdDtsZXQgZT1wLnVzZUNvbnRleHQoVWspLG49eEkoZWYuVXNlUm91dGVFcnJvcikscj1LayhlZi5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gZXx8KCh0PW4uZXJyb3JzKT09bnVsbD92b2lkIDA6dFtyXSl9ZnVuY3Rpb24gU0koKXtsZXR7cm91dGVyOnR9PXlJKEhrLlVzZU5hdmlnYXRlU3RhYmxlKSxlPUtrKGVmLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGksbyl7bz09PXZvaWQgMCYmKG89e30pLG4uY3VycmVudCYmKHR5cGVvZiBpPT0ibnVtYmVyIj90Lm5hdmlnYXRlKGkpOnQubmF2aWdhdGUoaSxxZCh7ZnJvbVJvdXRlSWQ6ZX0sbykpKX0sW3QsZV0pfWZ1bmN0aW9uIEVJKHQpe2xldHtiYXNlbmFtZTplPSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTppPXd0LlBvcCxuYXZpZ2F0b3I6byxzdGF0aWM6bD0hMX09dDtaZigpJiZPZSghMSk7bGV0IHM9ZS5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOm8sc3RhdGljOmx9KSxbcyxvLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPWtpKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsbT1wLnVzZU1lbW8oKCk9PntsZXQgZz1IdSh1LHMpO3JldHVybiBnPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTpnLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTppfX0sW3MsdSxjLGQsZixoLGldKTtyZXR1cm4gbT09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChIZi5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KEtmLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOm19KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBDSSh0KXtsZXQgZT17aGFzRXJyb3JCb3VuZGFyeTp0LkVycm9yQm91bmRhcnkhPW51bGx8fHQuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gdC5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24oZSx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQodC5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSx0LkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24oZSx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudCh0LkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksZX1jb25zdCBaaz1yZS5jcmVhdGVDb250ZXh0KG51bGwpLGtJPXQ9Pnt2YXIgcyxhO2NvbnN0IGU9cmUudXNlQ29udGV4dChaayksW24scl09am4uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgodCksaT0ocz1lPT1udWxsP3ZvaWQgMDplW25dKT09bnVsbD92b2lkIDA6cy5zb3VyY2Usbz0oYT1lPT1udWxsP3ZvaWQgMDplW25dKT09bnVsbD92b2lkIDA6YS5zY2hlbWE7aWYoIWl8fCFvKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGU6ICIrbik7Y29uc3QgbD1qbi5yZXNvbHZlUGF0aChyLGksbyk7cmV0dXJue21vZHVsZUlkOm4sbW9kdWxlU291cmNlOmwuc291cmNlLG1vZHVsZVNjaGVtYTpsLnNjaGVtYX19LGJJPSh7YXBpOnR9KT0+e3ZhciAkLE87Y29uc3R7IioiOmV9PWRJKCksW24scl09cC51c2VTdGF0ZShudWxsKSxbaSxvXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoKSxbYV09bD9qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChsKTpbdm9pZCAwLHZvaWQgMF0sdT1hJiYoKCQ9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOiQuc291cmNlKSxjPWEmJigoTz1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6Ty5zY2hlbWEpLGQ9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFtMLFBdKT0+UC5lcnJvcnM/UC5lcnJvcnMuZmF0YWw/UC5lcnJvcnMuZmF0YWwubWFwKEQ9Pih7aWQ6TCwuLi5EfSkpOltdOltdKSxmPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLExdKT0+TC5lcnJvcnMmJkwuZXJyb3JzLnZhbGlkYXRpb24/W0wuZXJyb3JzLnZhbGlkYXRpb25dOltdKTtpZihkJiZkLmxlbmd0aD4wKXtjb25zdCBMPWQubGVuZ3RoPT09MT9kWzBdLm1lc3NhZ2U6YE11bHRpcGxlIGVycm9ycyBkZXRlY3RlZDoKJHtkLm1hcCgoRCxCKT0+YCR7QisxfS4gWyR7RC5pZH1dOiAke0QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAxLiAke2RbMF0ubWVzc2FnZX1gLFA9bmV3IEVycm9yKEwpO3Rocm93IFAuc3RhY2s9ZFswXS5zdGFjayxQfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKGU/YC8ke2V9YDpsKX0sW2VdKTtjb25zdFtoLG1dPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFA9PntsZXQgRDt0cnl7RD1KU09OLnBhcnNlKFAuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihEPT1udWxsP3ZvaWQgMDpELmhhc2gpPT0ic3RyaW5nIiYmKEQ9PW51bGw/dm9pZCAwOkQuYWN0aW9uKT09PSJidWlsdCImJm0oRC5oYXNoKX0pfWNhdGNoKEwpe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIixMKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSx0LmdldFRyZWUoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oTD0+e0xvLmlzT2soTCk/cihMLnZhbHVlLm1vZHVsZXMpOihvKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK0wuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihMLmVycm9yKSl9KX0sW2hdKTtjb25zdCBnPWgzKHQpLHc9SnYoKSxbdix5XT1oNSgpLHtwYXRjaGVzOngsc2V0UGF0Y2hSZXNldElkOlN9PWY1KGcsdCksYj1yZS51c2VSZWYobnVsbCksVD1wLnVzZUNhbGxiYWNrKEw9PmFzeW5jIFA9Pntjb25zdFtELEJdPWpuLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKEwpLG9lPWF3YWl0IFAoam4uY3JlYXRlUGF0Y2hKU09OUGF0aChCKSk7cmV0dXJuIHQucG9zdFBhdGNoZXMoRCxvZSkudGhlbihIPT57aWYoTG8uaXNFcnIoSCkpdGhyb3cgSC5lcnJvcjtpZighaClyZXR1cm4gUyhaPT5aKzEpLHQuZ2V0VHJlZSh7dHJlZVBhdGg6RCxwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKFo9PntMby5pc09rKFopP3IoQz0+KHsuLi5DLC4uLloudmFsdWUubW9kdWxlc30pKToobygiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIitaLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoWi5lcnJvcikpfSl9KS5jYXRjaChIPT57Y29uc29sZS5lcnJvcihIKX0pfSxbXSk7cmV0dXJuIF8uanN4KF9DLlByb3ZpZGVyLHt2YWx1ZTp7dGhlbWU6dixzZXRUaGVtZTp5LGFwaTp0LGVkaXRNb2RlOiJmdWxsIixzZXNzaW9uOmcsaGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6dixjaGlsZHJlbjpbXy5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOl8uanN4KGM1LHthcGk6dCxwYXRjaGVzOngsb25Db21taXQ6KCk9PlMoTD0+TCsxKX0pfSksXy5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOmJ9KSxfLmpzeChHay5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTpiPT1udWxsP3ZvaWQgMDpiLmN1cnJlbnR9LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjpfLmpzeHMoRWEse2NoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjpfLmpzeChrayx7fSl9KSxfLmpzeChTYSx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP18uanN4KExJLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOkw9Pnt3KEwpfX0pOiFpJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOltfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjpfLmpzeChlNSx7fSl9KSxfLmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltpJiZfLmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsaV19KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZfLmpzeChaay5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjpfLmpzeChUSSx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDpUfSl9KV19KV19KX0pfSldfSl9KX0sR2s9cmUuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSwkST0oKT0+cmUudXNlQ29udGV4dChHayk7ZnVuY3Rpb24gVEkoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6aX0pe2NvbnN0WyxvXT1qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aCh0KSxsPWpuLnJlc29sdmVQYXRoKG8sZSxuKTtpZighbCl0aHJvdyBFcnJvcigiQ291bGQgbm90IHJlc29sdmUgbW9kdWxlOiAiK3QpO3JldHVybiBfLmpzeChZayx7cGF0aDp0LHNvdXJjZTpsLnNvdXJjZSxzY2hlbWE6bC5zY2hlbWEsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOiEwfSl9ZnVuY3Rpb24gWWsoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDppLGluaXRPblN1Ym1pdDpvLHRvcDpsfSl7cmV0dXJuIGU9PT1udWxsfHxuLm9wdD9fLmpzeChQSSx7cGF0aDp0LHNvdXJjZTplLHNjaGVtYTpuLGZpZWxkOmksaW5pdE9uU3VibWl0Om8sc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0ib2JqZWN0Ij90eXBlb2YgZSE9Im9iamVjdCJ8fExhKGUpP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0LCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpfLmpzeChYayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLGluaXRPblN1Ym1pdDpvLHNldFNlbGVjdGVkUGF0aDpyLHRvcDpsfSk6bi50eXBlPT09ImFycmF5Ij90eXBlb2YgZSE9Im9iamVjdCJ8fCFMYShlKT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIGFycmF5LCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpfLmpzeChRayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09InJlY29yZCI/dHlwZW9mIGUhPSJvYmplY3QiP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0IGZvciAiLG4udHlwZSwiLCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpMYShlKT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGRpZCBub3QgZXhwZWN0IGFycmF5IGZvciAiLG4udHlwZV19KTpfLmpzeChOSSx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InB5LTIgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGVmdCIsY2hpbGRyZW46aXx8dH0pLF8uanN4KENrLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6byh0KX0pXX0pfWZ1bmN0aW9uIFhrKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOm99KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZTpfZigiZmxleCBmbGV4LWNvbCBnYXAteS04Iix7ImJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02Ijohb30pLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKG4uaXRlbXMpLm1hcCgoW2wsc10pPT57Y29uc3QgYT1idSh0LGwpO3JldHVybiBfLmpzeChZayx7cGF0aDphLHNvdXJjZTplW2xdLHNjaGVtYTpzLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOmwsaW5pdE9uU3VibWl0Oml9LGEpfSl9LHQpfWZ1bmN0aW9uIE5JKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBpPUp2KCk7cmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjpPYmplY3QuZW50cmllcyhlKS5tYXAoKFtvLGxdKT0+e2NvbnN0IHM9YnUodCxvKTtyZXR1cm4gXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLGkocyl9LGNoaWxkcmVuOl8uanN4KFJJLHtyZWNvcmRLZXk6byxwYXRoOnMsc291cmNlOmwsc2NoZW1hOm4uaXRlbX0pfSxzKX0pfSx0KX1jb25zdCBYZz0xNzA7ZnVuY3Rpb24gUkkoe3JlY29yZEtleTp0LHBhdGg6ZSxzb3VyY2U6bixzY2hlbWE6cn0pe2NvbnN0IGk9cmUudXNlUmVmKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kuY3VycmVudCYmaS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49WGcmJmwoITApfSxbXSksXy5qc3hzKFl2LHtyZWY6aSxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpYZ30sY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOnR9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChxdix7cGF0aDplLHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sZSl9ZnVuY3Rpb24gUWsoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IGk9SnYoKTtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOmUubWFwKChvLGwpPT57Y29uc3Qgcz1idSh0LGwpO3JldHVybiBfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksaShzKX0sY2hpbGRyZW46Xy5qc3goT0kse2luZGV4OmwscGF0aDpzLHNvdXJjZTpvLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSx0KX1jb25zdCB5Xz1YZztmdW5jdGlvbiBPSSh7aW5kZXg6dCxwYXRoOmUsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBpPXJlLnVzZVJlZihudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQmJmkuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PXlfJiZsKCEwKX0sW10pLF8uanN4cyhZdix7cmVmOmksY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6eV99LGNoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46dCsxPDEwP2AwJHt0KzF9YDp0KzF9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChxdix7cGF0aDplLHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uIGJ1KHQsZSl7Y29uc3Qgbj1qbi5jcmVhdGVWYWxQYXRoT2ZJdGVtKHQsZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7dH0gb2YgJHtlPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gcXYoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOm99PSRJKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT5fLmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W18uanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLF8uanN4KCJzcGFuIix7Y2hpbGRyZW46Xy5qc3gocXYse3NvdXJjZTooZT09bnVsbD92b2lkIDA6ZVtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDpidSh0LGwpfSl9KV19LGJ1KHQsbCkpKX0sdCk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpBcnJheS5pc0FycmF5KGUpP18uanN4cygic3BhbiIse2NoaWxkcmVuOltfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmUubGVuZ3RofSksXy5qc3goInNwYW4iLHtjaGlsZHJlbjplLmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sdCk6Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSx0KTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiBlPT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LHQpOnR5cGVvZiBlIT0ib2JqZWN0Ij9fLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgZSwiIG5vdCBhbiBvYmplY3QiXX0sdCk6IShubiBpbiBlKXx8ZVtubl0hPT0icmljaHRleHQiP18uanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LHQpOl8uanN4KElJLHtjaGlsZHJlbjokUyhlKX0sdCk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIGU9PT1udWxsP18uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sdCk6Xy5qc3goInNwYW4iLHtjaGlsZHJlbjplfSk7aWYobi50eXBlPT09ImltYWdlIil7aWYoZT09PW51bGwpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sdCk7aWYodHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSx0KTtpZighKFJuIGluIGUpfHx0eXBlb2YgZVtSbl0hPSJzdHJpbmciKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSx0KTtjb25zdCBsPWpuLmNvbnZlcnRGaWxlU291cmNlKGUpLnVybDtyZXR1cm4gXy5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e2koe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e2kobnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W18uanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOmVbUm5dfSksciYmbyYmR3IuY3JlYXRlUG9ydGFsKF8uanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksbyldfSx0KX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmU/InRydWUiOiJmYWxzZSJ9LHQpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiBlPT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LHQpOl8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZS50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmUudG9TdHJpbmcoKX0sdCl9cmV0dXJuIF8uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LHQpfWZ1bmN0aW9uIFBJKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksZmllbGQ6b30pe2NvbnN0W2wsc109cC51c2VTdGF0ZShlIT09bnVsbCk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltvP18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOltfLmpzeChIZyx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxfLmpzeCgic3BhbiIse2NoaWxkcmVuOm99KV19KTpfLmpzeChIZyx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZfLmpzeChBSSx7c291cmNlOmUsc2NoZW1hOm4scGF0aDp0LHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSldfSx0KX1mdW5jdGlvbiBBSSh7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIHQ9PSJvYmplY3QiJiYodD09PW51bGx8fExhKHQpKSlyZXR1cm4gXy5qc3goUWsse3NvdXJjZTp0PT09bnVsbD9bXTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmKHQ9PT1udWxsfHwhTGEodCkpKXJldHVybiBfLmpzeChYayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIF8uanN4KENrLHtwYXRoOmUsZGlzYWJsZWQ6ITEsc291cmNlOnQsc2NoZW1hOm4sb25TdWJtaXQ6aShlKX0sZSk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIHQsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gTUkodCl7Y29uc3QgZT17fTtyZXR1cm4gdC5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIobz0+byE9PSIiKTtsZXQgaT1lO3IuZm9yRWFjaChvPT57aVtvXXx8KGlbb109e30pLGk9aVtvXX0pfSksZX1mdW5jdGlvbiBMSSh7cGF0aHM6dCxzZXRTZWxlY3RlZE1vZHVsZUlkOmV9KXtjb25zdCBuPU1JKHQpO3JldHVybiBfLmpzeCh2Uyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixpXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46Xy5qc3goSmsse25hbWU6cix0cmVlOmksbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOmV9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24gSmsoe25hbWU6dCx0cmVlOmUsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjp0fSksT2JqZWN0LmVudHJpZXMoZSkubWFwKChbaSxvXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46Xy5qc3goSmsse25hbWU6aSx0cmVlOm8sbW9kdWxlSWQ6YCR7bn0vJHtpfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7aX1gKSldfSl9Y29uc3QgeF89e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gSUkoe2NoaWxkcmVuOnR9KXtjb25zdCBlPXQ7ZnVuY3Rpb24gbihvLGwpe2NvbnN0IHM9eF8udGFnc1tvXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKG8sbCl7Y29uc3Qgcz14Xy5jbGFzc2VzW29dO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIGkobyxsKXt2YXIgdSxjO2lmKHR5cGVvZiBvPT0ic3RyaW5nIilyZXR1cm4gbztpZihvLnRhZz09PSJwIilyZXR1cm4gXy5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJpbWciKXJldHVybiBfLmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzpvLnNyY30sbCk7aWYoby50YWc9PT0idWwiKXJldHVybiBfLmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ib2wiKXJldHVybiBfLmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ibGkiKXJldHVybiBfLmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ic3BhbiIpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOm8uY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMSIpcmV0dXJuIF8uanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMiIpcmV0dXJuIF8uanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMyIpcmV0dXJuIF8uanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNCIpcmV0dXJuIF8uanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNSIpcmV0dXJuIF8uanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNiIpcmV0dXJuIF8uanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJiciIpcmV0dXJuIF8uanN4KCJiciIse30sbCk7aWYoby50YWc9PT0iYSIpcmV0dXJuIF8uanN4KCJhIix7aHJlZjpvLmhyZWYsY2hpbGRyZW46by5jaGlsZHJlbi5tYXAoKGQsZik9PmkoZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixvLnRhZyk7Y29uc3QgYT1vLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/cmUuY3JlYXRlRWxlbWVudChhLnRhZyx7a2V5OmwsY2xhc3NOYW1lOih1PWEuY2xhc3MpPT1udWxsP3ZvaWQgMDp1LmpvaW4oIiAiKSxjaGlsZHJlbjooYz1hLmNoaWxkcmVuKT09bnVsbD92b2lkIDA6Yy5tYXAoaSl9KTpudWxsfXJldHVybiBfLmpzeCgic3BhbiIseyJkYXRhLXZhbC1wYXRoIjplLnZhbFBhdGgsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoKG8sbCk9PmkobyxsKSl9KX1jb25zdCBEST1wLmNyZWF0ZUNvbnRleHQobnVsbCksWWg9e2RpZENhdGNoOiExLGVycm9yOm51bGx9O2NsYXNzIGpJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5yZXNldEVycm9yQm91bmRhcnk9dGhpcy5yZXNldEVycm9yQm91bmRhcnkuYmluZCh0aGlzKSx0aGlzLnN0YXRlPVlofXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZSl7cmV0dXJue2RpZENhdGNoOiEwLGVycm9yOmV9fXJlc2V0RXJyb3JCb3VuZGFyeSgpe2NvbnN0e2Vycm9yOmV9PXRoaXMuc3RhdGU7aWYoZSE9PW51bGwpe2Zvcih2YXIgbixyLGk9YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShpKSxsPTA7bDxpO2wrKylvW2xdPWFyZ3VtZW50c1tsXTsobj0ocj10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fG49PT12b2lkIDB8fG4uY2FsbChyLHthcmdzOm8scmVhc29uOiJpbXBlcmF0aXZlLWFwaSJ9KSx0aGlzLnNldFN0YXRlKFloKX19Y29tcG9uZW50RGlkQ2F0Y2goZSxuKXt2YXIgcixpOyhyPShpPXRoaXMucHJvcHMpLm9uRXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKGksZSxuKX1jb21wb25lbnREaWRVcGRhdGUoZSxuKXtjb25zdHtkaWRDYXRjaDpyfT10aGlzLnN0YXRlLHtyZXNldEtleXM6aX09dGhpcy5wcm9wcztpZihyJiZuLmVycm9yIT09bnVsbCYmekkoZS5yZXNldEtleXMsaSkpe3ZhciBvLGw7KG89KGw9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxvPT09dm9pZCAwfHxvLmNhbGwobCx7bmV4dDppLHByZXY6ZS5yZXNldEtleXMscmVhc29uOiJrZXlzIn0pLHRoaXMuc2V0U3RhdGUoWWgpfX1yZW5kZXIoKXtjb25zdHtjaGlsZHJlbjplLGZhbGxiYWNrUmVuZGVyOm4sRmFsbGJhY2tDb21wb25lbnQ6cixmYWxsYmFjazppfT10aGlzLnByb3BzLHtkaWRDYXRjaDpvLGVycm9yOmx9PXRoaXMuc3RhdGU7bGV0IHM9ZTtpZihvKXtjb25zdCBhPXtlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX07aWYocC5pc1ZhbGlkRWxlbWVudChpKSlzPWk7ZWxzZSBpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilzPW4oYSk7ZWxzZSBpZihyKXM9cC5jcmVhdGVFbGVtZW50KHIsYSk7ZWxzZSB0aHJvdyBsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoREkuUHJvdmlkZXIse3ZhbHVlOntkaWRDYXRjaDpvLGVycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fX0scyl9fWZ1bmN0aW9uIHpJKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOltdLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3JldHVybiB0Lmxlbmd0aCE9PWUubGVuZ3RofHx0LnNvbWUoKG4scik9PiFPYmplY3QuaXMobixlW3JdKSl9Y29uc3QgcWs9IkNvbGxhcHNpYmxlIixbRkksZWJdPW9sKHFrKSxbQkksZXldPUZJKHFrKSxVST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixvcGVuOnIsZGVmYXVsdE9wZW46aSxkaXNhYmxlZDpvLG9uT3BlbkNoYW5nZTpsLC4uLnN9PXQsW2E9ITEsdV09bXMoe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOmx9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEJJLHtzY29wZTpuLGRpc2FibGVkOm8sY29udGVudElkOkRmKCksb3BlbjphLG9uT3BlblRvZ2dsZTpwLnVzZUNhbGxiYWNrKCgpPT51KGM9PiFjKSxbdV0pfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zdGF0ZSI6dHkoYSksImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwfSxzLHtyZWY6ZX0pKSl9KSxXST0iQ29sbGFwc2libGVUcmlnZ2VyIixWST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6biwuLi5yfT10LGk9ZXkoV0ksbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIsImFyaWEtY29udHJvbHMiOmkuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjppLm9wZW58fCExLCJkYXRhLXN0YXRlIjp0eShpLm9wZW4pLCJkYXRhLWRpc2FibGVkIjppLmRpc2FibGVkPyIiOnZvaWQgMCxkaXNhYmxlZDppLmRpc2FibGVkfSxyLHtyZWY6ZSxvbkNsaWNrOm50KHQub25DbGljayxpLm9uT3BlblRvZ2dsZSl9KSl9KSx0Yj0iQ29sbGFwc2libGVDb250ZW50IixIST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPWV5KHRiLHQuX19zY29wZUNvbGxhcHNpYmxlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fGkub3Blbn0sKHtwcmVzZW50Om99KT0+cC5jcmVhdGVFbGVtZW50KEtJLGllKHt9LHIse3JlZjplLHByZXNlbnQ6b30pKSl9KSxLST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixwcmVzZW50OnIsY2hpbGRyZW46aSwuLi5vfT10LGw9ZXkodGIsbiksW3MsYV09cC51c2VTdGF0ZShyKSx1PXAudXNlUmVmKG51bGwpLGM9c3QoZSx1KSxkPXAudXNlUmVmKDApLGY9ZC5jdXJyZW50LGg9cC51c2VSZWYoMCksbT1oLmN1cnJlbnQsZz1sLm9wZW58fHMsdz1wLnVzZVJlZihnKSx2PXAudXNlUmVmKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgeT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PncuY3VycmVudD0hMSk7cmV0dXJuKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfSxbXSksVW4oKCk9Pntjb25zdCB5PXUuY3VycmVudDtpZih5KXt2LmN1cnJlbnQ9di5jdXJyZW50fHx7dHJhbnNpdGlvbkR1cmF0aW9uOnkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6eS5zdHlsZS5hbmltYXRpb25OYW1lfSx5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT0ibm9uZSI7Y29uc3QgeD15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2QuY3VycmVudD14LmhlaWdodCxoLmN1cnJlbnQ9eC53aWR0aCx3LmN1cnJlbnR8fCh5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj12LmN1cnJlbnQudHJhbnNpdGlvbkR1cmF0aW9uLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT12LmN1cnJlbnQuYW5pbWF0aW9uTmFtZSksYShyKX19LFtsLm9wZW4scl0pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXN0YXRlIjp0eShsLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpsLmRpc2FibGVkPyIiOnZvaWQgMCxpZDpsLmNvbnRlbnRJZCxoaWRkZW46IWd9LG8se3JlZjpjLHN0eWxlOnsiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCI6Zj9gJHtmfXB4YDp2b2lkIDAsIi0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6bT9gJHttfXB4YDp2b2lkIDAsLi4udC5zdHlsZX19KSxnJiZpKX0pO2Z1bmN0aW9uIHR5KHQpe3JldHVybiB0PyJvcGVuIjoiY2xvc2VkIn1jb25zdCBaST1VSSxHST1WSSxZST1ISSx4bz0iQWNjb3JkaW9uIixYST1bIkhvbWUiLCJFbmQiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCJdLFtueSxRSSxKSV09TEMoeG8pLFtHZixNRF09b2woeG8sW0pJLGViXSkscnk9ZWIoKSxuYj1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PXQsaT1yLG89cjtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChueS5Qcm92aWRlcix7c2NvcGU6dC5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9yZS5jcmVhdGVFbGVtZW50KG5ELGllKHt9LG8se3JlZjplfSkpOnJlLmNyZWF0ZUVsZW1lbnQodEQsaWUoe30saSx7cmVmOmV9KSkpfSk7bmIucHJvcFR5cGVzPXt0eXBlKHQpe2NvbnN0IGU9dC52YWx1ZXx8dC5kZWZhdWx0VmFsdWU7cmV0dXJuIHQudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyh0LnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6dC50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIGU9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6dC50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkoZSk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W3JiLHFJXT1HZih4byksW2liLGVEXT1HZih4byx7Y29sbGFwc2libGU6ITF9KSx0RD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LGNvbGxhcHNpYmxlOm89ITEsLi4ubH09dCxbcyxhXT1tcyh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6aX0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KHJiLHtzY29wZTp0Ll9fc2NvcGVBY2NvcmRpb24sdmFsdWU6cz9bc106W10sb25JdGVtT3BlbjphLG9uSXRlbUNsb3NlOnJlLnVzZUNhbGxiYWNrKCgpPT5vJiZhKCIiKSxbbyxhXSl9LHJlLmNyZWF0ZUVsZW1lbnQoaWIse3Njb3BlOnQuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTpvfSxyZS5jcmVhdGVFbGVtZW50KG9iLGllKHt9LGwse3JlZjplfSkpKSl9KSxuRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LC4uLm99PXQsW2w9W10sc109bXMoe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOml9KSxhPXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5kLmZpbHRlcihmPT5mIT09YykpLFtzXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQocmIse3Njb3BlOnQuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxyZS5jcmVhdGVFbGVtZW50KGliLHtzY29wZTp0Ll9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LHJlLmNyZWF0ZUVsZW1lbnQob2IsaWUoe30sbyx7cmVmOmV9KSkpKX0pLFtyRCxZZl09R2YoeG8pLG9iPXJlLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6aSxvcmllbnRhdGlvbjpvPSJ2ZXJ0aWNhbCIsLi4ubH09dCxzPXJlLnVzZVJlZihudWxsKSxhPXN0KHMsZSksdT1RSShuKSxkPVhtKGkpPT09Imx0ciIsZj1udCh0Lm9uS2V5RG93bixoPT57dmFyIG07aWYoIVhJLmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgZz1oLnRhcmdldCx3PXUoKS5maWx0ZXIoTD0+e3ZhciBQO3JldHVybiEoKFA9TC5yZWYuY3VycmVudCkhPT1udWxsJiZQIT09dm9pZCAwJiZQLmRpc2FibGVkKX0pLHY9dy5maW5kSW5kZXgoTD0+TC5yZWYuY3VycmVudD09PWcpLHk9dy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IHg9djtjb25zdCBTPTAsYj15LTEsVD0oKT0+e3g9disxLHg+YiYmKHg9Uyl9LCQ9KCk9Pnt4PXYtMSx4PFMmJih4PWIpfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6eD1TO2JyZWFrO2Nhc2UiRW5kIjp4PWI7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjpvPT09Imhvcml6b250YWwiJiYoZD9UKCk6JCgpKTticmVhaztjYXNlIkFycm93RG93biI6bz09PSJ2ZXJ0aWNhbCImJlQoKTticmVhaztjYXNlIkFycm93TGVmdCI6bz09PSJob3Jpem9udGFsIiYmKGQ/JCgpOlQoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjpvPT09InZlcnRpY2FsIiYmJCgpO2JyZWFrfWNvbnN0IE89eCV5OyhtPXdbT10ucmVmLmN1cnJlbnQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5mb2N1cygpfSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQockQse3Njb3BlOm4sZGlzYWJsZWQ6cixkaXJlY3Rpb246aSxvcmllbnRhdGlvbjpvfSxyZS5jcmVhdGVFbGVtZW50KG55LlNsb3Qse3Njb3BlOm59LHJlLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjpvLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxRZz0iQWNjb3JkaW9uSXRlbSIsW2lELGl5XT1HZihRZyksb0Q9cmUuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246bix2YWx1ZTpyLC4uLml9PXQsbz1ZZihRZyxuKSxsPXFJKFFnLG4pLHM9cnkobiksYT1EZigpLHU9ciYmbC52YWx1ZS5pbmNsdWRlcyhyKXx8ITEsYz1vLmRpc2FibGVkfHx0LmRpc2FibGVkO3JldHVybiByZS5jcmVhdGVFbGVtZW50KGlELHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxyZS5jcmVhdGVFbGVtZW50KFpJLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bGIodSl9LHMsaSx7cmVmOmUsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSxsRD0iQWNjb3JkaW9uSGVhZGVyIixzRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PXQsaT1ZZih4byxuKSxvPWl5KGxELG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KEtlLmgzLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bGIoby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjplfSkpfSksX189IkFjY29yZGlvblRyaWdnZXIiLGFEPXJlLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09dCxpPVlmKHhvLG4pLG89aXkoX18sbiksbD1lRChfXyxuKSxzPXJ5KG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KG55Lkl0ZW1TbG90LHtzY29wZTpufSxyZS5jcmVhdGVFbGVtZW50KEdJLGllKHsiYXJpYS1kaXNhYmxlZCI6by5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLGlkOm8udHJpZ2dlcklkfSxzLHIse3JlZjplfSkpKX0pLHVEPSJBY2NvcmRpb25Db250ZW50IixjRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PXQsaT1ZZih4byxuKSxvPWl5KHVELG4pLGw9cnkobik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoWUksaWUoe3JvbGU6InJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSI6by50cmlnZ2VySWQsImRhdGEtb3JpZW50YXRpb24iOmkub3JpZW50YXRpb259LGwscix7cmVmOmUsc3R5bGU6eyItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KSIsIi0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKSIsLi4udC5zdHlsZX19KSl9KTtmdW5jdGlvbiBsYih0KXtyZXR1cm4gdD8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgZEQ9bmIsZkQ9b0QsaEQ9c0Qsc2I9YUQsYWI9Y0QscEQ9ZEQsdWI9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KGZELHtyZWY6bixjbGFzc05hbWU6eHQoImJvcmRlci1iIix0KSwuLi5lfSkpO3ViLmRpc3BsYXlOYW1lPSJBY2NvcmRpb25JdGVtIjtjb25zdCBjYj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLC4uLm59LHIpPT5fLmpzeChoRCx7Y2xhc3NOYW1lOiJmbGV4IixjaGlsZHJlbjpfLmpzeHMoc2Ise3JlZjpyLGNsYXNzTmFtZTp4dCgiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00IGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhvdmVyOnVuZGVybGluZSBbJltkYXRhLXN0YXRlPW9wZW5dPnN2Z106cm90YXRlLTE4MCIsdCksLi4ubixjaGlsZHJlbjpbZSxfLmpzeChiQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBzaHJpbmstMCJ9KV19KX0pKTtjYi5kaXNwbGF5TmFtZT1zYi5kaXNwbGF5TmFtZTtjb25zdCBkYj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLC4uLm59LHIpPT5fLmpzeChhYix7cmVmOnIsY2xhc3NOYW1lOnh0KCJvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24iLHQpLC4uLm4sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToicHQtMCBwYi00IixjaGlsZHJlbjplfSl9KSk7ZGIuZGlzcGxheU5hbWU9YWIuZGlzcGxheU5hbWU7LyoqCiAqIFJlYWN0IFJvdXRlciBET00gdjYuMjAuMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHRmKCl7cmV0dXJuIHRmPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH0sdGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdEKHQsZSl7cmV0dXJuIFFMKHtiYXNlbmFtZTplPT1udWxsP3ZvaWQgMDplLmJhc2VuYW1lLGZ1dHVyZTp0Zih7fSxlPT1udWxsP3ZvaWQgMDplLmZ1dHVyZSx7djdfcHJlcGVuZEJhc2VuYW1lOiEwfSksaGlzdG9yeTp4TCh7d2luZG93OmU9PW51bGw/dm9pZCAwOmUud2luZG93fSksaHlkcmF0aW9uRGF0YTooZT09bnVsbD92b2lkIDA6ZS5oeWRyYXRpb25EYXRhKXx8bUQoKSxyb3V0ZXM6dCxtYXBSb3V0ZVByb3BlcnRpZXM6Q0ksd2luZG93OmU9PW51bGw/dm9pZCAwOmUud2luZG93fSkuaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIG1EKCl7dmFyIHQ7bGV0IGU9KHQ9d2luZG93KT09bnVsbD92b2lkIDA6dC5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7cmV0dXJuIGUmJmUuZXJyb3JzJiYoZT10Zih7fSxlLHtlcnJvcnM6dkQoZS5lcnJvcnMpfSkpLGV9ZnVuY3Rpb24gdkQodCl7aWYoIXQpcmV0dXJuIG51bGw7bGV0IGU9T2JqZWN0LmVudHJpZXModCksbj17fTtmb3IobGV0W3IsaV1vZiBlKWlmKGkmJmkuX190eXBlPT09IlJvdXRlRXJyb3JSZXNwb25zZSIpbltyXT1uZXcgWHYoaS5zdGF0dXMsaS5zdGF0dXNUZXh0LGkuZGF0YSxpLmludGVybmFsPT09ITApO2Vsc2UgaWYoaSYmaS5fX3R5cGU9PT0iRXJyb3IiKXtpZihpLl9fc3ViVHlwZSl7bGV0IG89d2luZG93W2kuX19zdWJUeXBlXTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil0cnl7bGV0IGw9bmV3IG8oaS5tZXNzYWdlKTtsLnN0YWNrPSIiLG5bcl09bH1jYXRjaHt9fWlmKG5bcl09PW51bGwpe2xldCBvPW5ldyBFcnJvcihpLm1lc3NhZ2UpO28uc3RhY2s9IiIsbltyXT1vfX1lbHNlIG5bcl09aTtyZXR1cm4gbn1jb25zdCB5RD1wLmNyZWF0ZUNvbnRleHQoe2lzVHJhbnNpdGlvbmluZzohMX0pLHhEPXAuY3JlYXRlQ29udGV4dChuZXcgTWFwKSxfRD0ic3RhcnRUcmFuc2l0aW9uIix3Xz1NX1tfRF0sd0Q9ImZsdXNoU3luYyIsU189alRbd0RdO2Z1bmN0aW9uIFNEKHQpe3dfP3dfKHQpOnQoKX1mdW5jdGlvbiBpYSh0KXtTXz9TXyh0KTp0KCl9Y2xhc3MgRUR7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXR1cz0icGVuZGluZyIsdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKChlLG4pPT57dGhpcy5yZXNvbHZlPXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZXNvbHZlZCIsZShyKSl9LHRoaXMucmVqZWN0PXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZWplY3RlZCIsbihyKSl9fSl9fWZ1bmN0aW9uIENEKHQpe2xldHtmYWxsYmFja0VsZW1lbnQ6ZSxyb3V0ZXI6bixmdXR1cmU6cn09dCxbaSxvXT1wLnVzZVN0YXRlKG4uc3RhdGUpLFtsLHNdPXAudXNlU3RhdGUoKSxbYSx1XT1wLnVzZVN0YXRlKHtpc1RyYW5zaXRpb25pbmc6ITF9KSxbYyxkXT1wLnVzZVN0YXRlKCksW2YsaF09cC51c2VTdGF0ZSgpLFttLGddPXAudXNlU3RhdGUoKSx3PXAudXNlUmVmKG5ldyBNYXApLHt2N19zdGFydFRyYW5zaXRpb246dn09cnx8e30seT1wLnVzZUNhbGxiYWNrKCQ9Pnt2P1NEKCQpOiQoKX0sW3ZdKSx4PXAudXNlQ2FsbGJhY2soKCQsTyk9PntsZXR7ZGVsZXRlZEZldGNoZXJzOkwsdW5zdGFibGVfZmx1c2hTeW5jOlAsdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOkR9PU87TC5mb3JFYWNoKG9lPT53LmN1cnJlbnQuZGVsZXRlKG9lKSksJC5mZXRjaGVycy5mb3JFYWNoKChvZSxIKT0+e29lLmRhdGEhPT12b2lkIDAmJncuY3VycmVudC5zZXQoSCxvZS5kYXRhKX0pO2xldCBCPW4ud2luZG93PT1udWxsfHx0eXBlb2Ygbi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiE9ImZ1bmN0aW9uIjtpZighRHx8Qil7UD9pYSgoKT0+bygkKSk6eSgoKT0+bygkKSk7cmV0dXJufWlmKFApe2lhKCgpPT57ZiYmKGMmJmMucmVzb2x2ZSgpLGYuc2tpcFRyYW5zaXRpb24oKSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSl9KTtsZXQgb2U9bi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKT0+e2lhKCgpPT5vKCQpKX0pO29lLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntpYSgoKT0+e2Qodm9pZCAwKSxoKHZvaWQgMCkscyh2b2lkIDApLHUoe2lzVHJhbnNpdGlvbmluZzohMX0pfSl9KSxpYSgoKT0+aChvZSkpO3JldHVybn1mPyhjJiZjLnJlc29sdmUoKSxmLnNraXBUcmFuc2l0aW9uKCksZyh7c3RhdGU6JCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSkpOihzKCQpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxmbHVzaFN5bmM6ITEsY3VycmVudExvY2F0aW9uOkQuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpELm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyx3LHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoeCksW24seF0pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJiFhLmZsdXNoU3luYyYmZChuZXcgRUQpfSxbYV0pLHAudXNlRWZmZWN0KCgpPT57aWYoYyYmbCYmbi53aW5kb3cpe2xldCAkPWwsTz1jLnByb21pc2UsTD1uLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jKCk9Pnt5KCgpPT5vKCQpKSxhd2FpdCBPfSk7TC5maW5pc2hlZC5maW5hbGx5KCgpPT57ZCh2b2lkIDApLGgodm9pZCAwKSxzKHZvaWQgMCksdSh7aXNUcmFuc2l0aW9uaW5nOiExfSl9KSxoKEwpfX0sW3ksbCxjLG4ud2luZG93XSkscC51c2VFZmZlY3QoKCk9PntjJiZsJiZpLmxvY2F0aW9uLmtleT09PWwubG9jYXRpb24ua2V5JiZjLnJlc29sdmUoKX0sW2MsZixpLmxvY2F0aW9uLGxdKSxwLnVzZUVmZmVjdCgoKT0+eyFhLmlzVHJhbnNpdGlvbmluZyYmbSYmKHMobS5zdGF0ZSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMSxjdXJyZW50TG9jYXRpb246bS5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOm0ubmV4dExvY2F0aW9ufSksZyh2b2lkIDApKX0sW2EuaXNUcmFuc2l0aW9uaW5nLG1dKTtsZXQgUz1wLnVzZU1lbW8oKCk9Pih7Y3JlYXRlSHJlZjpuLmNyZWF0ZUhyZWYsZW5jb2RlTG9jYXRpb246bi5lbmNvZGVMb2NhdGlvbixnbzokPT5uLm5hdmlnYXRlKCQpLHB1c2g6KCQsTyxMKT0+bi5uYXZpZ2F0ZSgkLHtzdGF0ZTpPLHByZXZlbnRTY3JvbGxSZXNldDpMPT1udWxsP3ZvaWQgMDpMLnByZXZlbnRTY3JvbGxSZXNldH0pLHJlcGxhY2U6KCQsTyxMKT0+bi5uYXZpZ2F0ZSgkLHtyZXBsYWNlOiEwLHN0YXRlOk8scHJldmVudFNjcm9sbFJlc2V0Okw9PW51bGw/dm9pZCAwOkwucHJldmVudFNjcm9sbFJlc2V0fSl9KSxbbl0pLGI9bi5iYXNlbmFtZXx8Ii8iLFQ9cC51c2VNZW1vKCgpPT4oe3JvdXRlcjpuLG5hdmlnYXRvcjpTLHN0YXRpYzohMSxiYXNlbmFtZTpifSksW24sUyxiXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KFZmLlByb3ZpZGVyLHt2YWx1ZTpUfSxwLmNyZWF0ZUVsZW1lbnQoQmsuUHJvdmlkZXIse3ZhbHVlOml9LHAuY3JlYXRlRWxlbWVudCh4RC5Qcm92aWRlcix7dmFsdWU6dy5jdXJyZW50fSxwLmNyZWF0ZUVsZW1lbnQoeUQuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudChFSSx7YmFzZW5hbWU6Yixsb2NhdGlvbjppLmxvY2F0aW9uLG5hdmlnYXRpb25UeXBlOmkuaGlzdG9yeUFjdGlvbixuYXZpZ2F0b3I6U30saS5pbml0aWFsaXplZD9wLmNyZWF0ZUVsZW1lbnQoa0Qse3JvdXRlczpuLnJvdXRlcyxzdGF0ZTppfSk6ZSkpKSkpLG51bGwpfWZ1bmN0aW9uIGtEKHQpe2xldHtyb3V0ZXM6ZSxzdGF0ZTpufT10O3JldHVybiBmSShlLHZvaWQgMCxuKX12YXIgRV87KGZ1bmN0aW9uKHQpe3QuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIix0LlVzZVN1Ym1pdD0idXNlU3VibWl0Iix0LlVzZVN1Ym1pdEZldGNoZXI9InVzZVN1Ym1pdEZldGNoZXIiLHQuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsdC51c2VWaWV3VHJhbnNpdGlvblN0YXRlPSJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlIn0pKEVffHwoRV89e30pKTt2YXIgQ187KGZ1bmN0aW9uKHQpe3QuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsdC5Vc2VGZXRjaGVycz0idXNlRmV0Y2hlcnMiLHQuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIn0pKENffHwoQ189e30pKTtmdW5jdGlvbiBiRCh7ZXJyb3I6dCxyZXNldEVycm9yQm91bmRhcnk6ZX0pe3JldHVybiBjb25zb2xlLmVycm9yKHQpLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIHRvcC0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LXNjcmVlbiBoLXNjcmVlbiBiZy1jYXJkLWZvcmVncm91bmQiLGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCIsY2hpbGRyZW46Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCBiZy1jYXJkIHRleHQtcHJpbWFyeSIsY2hpbGRyZW46W18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLVswLjVlbV0gdGV4dC1sZyBmb250LWJvbGQgdGV4dC1jZW50ZXIgcHktMiIsY2hpbGRyZW46W18uanN4KGtrLHt9KSwiIGVuY291bnRlcmVkIGFuIGVycm9yIl19KSxfLmpzeCgiYnV0dG9uIix7b25DbGljazplLGNoaWxkcmVuOl8uanN4KHU1LHt9KX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtNHhsIGZvbnQtbm9ybWFsICIsY2hpbGRyZW46Ik1lc3NhZ2U6In0pLF8uanN4KCJwcmUiLHtjaGlsZHJlbjp0Lm1lc3NhZ2V9KSx0LnN0YWNrJiZfLmpzeChwRCx7dHlwZToic2luZ2xlIixjbGFzc05hbWU6ImZvbnQtc2VyaWYiLGNvbGxhcHNpYmxlOiEwLGRlZmF1bHRWYWx1ZToiZXJyb3IiLGNoaWxkcmVuOl8uanN4cyh1Yix7dmFsdWU6ImVycm9yIixjaGlsZHJlbjpbXy5qc3goY2Ise2NoaWxkcmVuOiJTdGFjayB0cmFjZToifSksXy5qc3goZGIse2NsYXNzTmFtZToicC00IGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQiLGNoaWxkcmVuOnQuc3RhY2smJl8uanN4KCJwcmUiLHtjaGlsZHJlbjp0LnN0YWNrfSl9KV19KX0pXX0pfSl9KX1mdW5jdGlvbiAkRCgpe2NvbnN0IHQ9Z0QoW3twYXRoOiIvKiIsZWxlbWVudDpfLmpzeChqSSx7ZmFsbGJhY2tSZW5kZXI6YkQsY2hpbGRyZW46Xy5qc3goYkkse2FwaTpuZXcgWk4oIi9hcGkvdmFsIil9KX0pfV0se2Jhc2VuYW1lOiIvYXBpL3ZhbC9zdGF0aWMvZWRpdCJ9KTtyZXR1cm4gXy5qc3goQ0Qse3JvdXRlcjp0fSl9WGguY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIocmUuY3JlYXRlRWxlbWVudChyZS5TdHJpY3RNb2RlLG51bGwscmUuY3JlYXRlRWxlbWVudCgkRCxudWxsKSkpOwo=","/assets/index-cokqEj6u.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1mZWF0dXJlLXNldHRpbmdzOmluaGVyaXQ7Zm9udC12YXJpYXRpb24tc2V0dGluZ3M6aW5oZXJpdDtmb250LXNpemU6MTAwJTtmb250LXdlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6aW5oZXJpdDttYXJnaW46MDtwYWRkaW5nOjB9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6YXV0b306LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX1wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPXNlYXJjaF17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19YmxvY2txdW90ZSxkbCxkZCxoMSxoMixoMyxoNCxoNSxoNixocixmaWd1cmUscCxwcmV7bWFyZ2luOjB9ZmllbGRzZXR7bWFyZ2luOjA7cGFkZGluZzowfWxlZ2VuZHtwYWRkaW5nOjB9b2wsdWwsbWVudXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfWRpYWxvZ3twYWRkaW5nOjB9dGV4dGFyZWF7cmVzaXplOnZlcnRpY2FsfWlucHV0OjotbW96LXBsYWNlaG9sZGVyLHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MTtjb2xvcjojOWNhM2FmfWlucHV0OjpwbGFjZWhvbGRlcix0ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9YnV0dG9uLFtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9OmRpc2FibGVke2N1cnNvcjpkZWZhdWx0fWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7ZGlzcGxheTpibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX06aG9zdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19OnJvb3R7LS1iYWNrZ3JvdW5kOiAwIDAlIDEwMCU7LS1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLWNhcmQ6IDAgMCUgMTAwJTstLWNhcmQtZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyOiAwIDAlIDEwMCU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcHJpbWFyeTogMjIyLjIgNDcuNCUgMTEuMiU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tc2Vjb25kYXJ5OiAyMTAgNDAlIDk2LjElOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tbXV0ZWQ6IDAgMCUgNTcuMyU7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUuNCAxNi4zJSA0Ni45JTstLWFjY2VudDogMTU5LCA2MCUsIDUxJSwgMTstLWFjY2VudC1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLWRlc3RydWN0aXZlOiAwIDg0LjIlIDYwLjIlOy0tZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1ib3JkZXI6IDIxNC4zIDMxLjglIDkxLjQlOy0taW5wdXQ6IDIxNC4zIDMxLjglIDkxLjQlOy0tcmluZzogMjIyLjIgODQlIDQuOSU7LS1yYWRpdXM6IC41cmVtfSpbZGF0YS1tb2RlPWRhcmtdey0tYmFja2dyb3VuZDogMCAwJSA0JTstLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tY2FyZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcG9wb3ZlcjogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcHJpbWFyeTogMjEwIDQwJSA5OCU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tc2Vjb25kYXJ5OiAyMTcuMiAzMi42JSAxNy41JTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLW11dGVkOiAxNzgsIDIzJSwgNzYlLCAxOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1IDIwLjIlIDY1LjElOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tZGVzdHJ1Y3RpdmU6IDAgNjIuOCUgMzAuNiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE3LjIgMzIuNiUgMTcuNSU7LS1pbnB1dDogMjE3LjIgMzIuNiUgMTcuNSU7LS1yaW5nOiAyMTIuNyAyNi44JSA4My45JX0qe2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSk7Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0qLDpiZWZvcmUsOmFmdGVyey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9OjpiYWNrZHJvcHstLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7LS10dy1ib3JkZXItc3BhY2luZy15OiAwOy0tdHctdHJhbnNsYXRlLXg6IDA7LS10dy10cmFuc2xhdGUteTogMDstLXR3LXJvdGF0ZTogMDstLXR3LXNrZXcteDogMDstLXR3LXNrZXcteTogMDstLXR3LXNjYWxlLXg6IDE7LS10dy1zY2FsZS15OiAxOy0tdHctcGFuLXg6IDstLXR3LXBhbi15OiA7LS10dy1waW5jaC16b29tOiA7LS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7LS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiA7LS10dy1vcmRpbmFsOiA7LS10dy1zbGFzaGVkLXplcm86IDstLXR3LW51bWVyaWMtZmlndXJlOiA7LS10dy1udW1lcmljLXNwYWNpbmc6IDstLXR3LW51bWVyaWMtZnJhY3Rpb246IDstLXR3LXJpbmctaW5zZXQ6IDstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjstLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gLjUpOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7LS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwOy0tdHctYmx1cjogOy0tdHctYnJpZ2h0bmVzczogOy0tdHctY29udHJhc3Q6IDstLXR3LWdyYXlzY2FsZTogOy0tdHctaHVlLXJvdGF0ZTogOy0tdHctaW52ZXJ0OiA7LS10dy1zYXR1cmF0ZTogOy0tdHctc2VwaWE6IDstLXR3LWRyb3Atc2hhZG93OiA7LS10dy1iYWNrZHJvcC1ibHVyOiA7LS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiA7LS10dy1iYWNrZHJvcC1jb250cmFzdDogOy0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiA7LS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiA7LS10dy1iYWNrZHJvcC1pbnZlcnQ6IDstLXR3LWJhY2tkcm9wLW9wYWNpdHk6IDstLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiA7LS10dy1iYWNrZHJvcC1zZXBpYTogfS5zci1vbmx5e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItd2lkdGg6MH0ucG9pbnRlci1ldmVudHMtbm9uZXtwb2ludGVyLWV2ZW50czpub25lfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LmZpeGVke3Bvc2l0aW9uOmZpeGVkfS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0aWNreXtwb3NpdGlvbjpzdGlja3l9Lmluc2V0LTB7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjB9Lmluc2V0LXktMHt0b3A6MDtib3R0b206MH0uLWxlZnQtMntsZWZ0Oi0uNXJlbX0uLXJpZ2h0LVxbMTBweFxde3JpZ2h0Oi0xMHB4fS4tdG9wLVxbMTBweFxde3RvcDotMTBweH0uLXRvcC1cWzRweFxde3RvcDotNHB4fS5ib3R0b20tMHtib3R0b206MH0uYm90dG9tLTR7Ym90dG9tOjFyZW19LmxlZnQtMHtsZWZ0OjB9LmxlZnQtMXtsZWZ0Oi4yNXJlbX0ubGVmdC0xXC8ye2xlZnQ6NTAlfS5sZWZ0LTJ7bGVmdDouNXJlbX0ubGVmdC1cWzUwXCVcXXtsZWZ0OjUwJX0ucmlnaHQtMHtyaWdodDowfS5yaWdodC0xe3JpZ2h0Oi4yNXJlbX0ucmlnaHQtNHtyaWdodDoxcmVtfS5yaWdodC1cWzE2cHhcXXtyaWdodDoxNnB4fS50b3AtMHt0b3A6MH0udG9wLTR7dG9wOjFyZW19LnRvcC1cWzUwXCVcXXt0b3A6NTAlfS56LTUwe3otaW5kZXg6NTB9LnotXFs1XF17ei1pbmRleDo1fS56LW92ZXJsYXl7ei1pbmRleDo0fS4tbXgtMXttYXJnaW4tbGVmdDotLjI1cmVtO21hcmdpbi1yaWdodDotLjI1cmVtfS4tbXktMnttYXJnaW4tdG9wOi0uNXJlbTttYXJnaW4tYm90dG9tOi0uNXJlbX0uLW15LVxbMTAwcHhcXXttYXJnaW4tdG9wOi0xMDBweDttYXJnaW4tYm90dG9tOi0xMDBweH0ubXgtMnttYXJnaW4tbGVmdDouNXJlbTttYXJnaW4tcmlnaHQ6LjVyZW19Lm15LTF7bWFyZ2luLXRvcDouMjVyZW07bWFyZ2luLWJvdHRvbTouMjVyZW19Lm1iLTR7bWFyZ2luLWJvdHRvbToxcmVtfS5tbC0ye21hcmdpbi1sZWZ0Oi41cmVtfS5tbC00e21hcmdpbi1sZWZ0OjFyZW19Lm1sLVxbMjBweFxde21hcmdpbi1sZWZ0OjIwcHh9Lm1sLWF1dG97bWFyZ2luLWxlZnQ6YXV0b30ubXItMnttYXJnaW4tcmlnaHQ6LjVyZW19Lm10LTJ7bWFyZ2luLXRvcDouNXJlbX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmFzcGVjdC1zcXVhcmV7YXNwZWN0LXJhdGlvOjEgLyAxfS5oLTEwe2hlaWdodDoyLjVyZW19LmgtMTF7aGVpZ2h0OjIuNzVyZW19LmgtMntoZWlnaHQ6LjVyZW19LmgtMlwuNXtoZWlnaHQ6LjYyNXJlbX0uaC0ze2hlaWdodDouNzVyZW19LmgtM1wuNXtoZWlnaHQ6Ljg3NXJlbX0uaC00e2hlaWdodDoxcmVtfS5oLTd7aGVpZ2h0OjEuNzVyZW19LmgtOXtoZWlnaHQ6Mi4yNXJlbX0uaC1cWzE0cHhcXXtoZWlnaHQ6MTRweH0uaC1cWzE4cHhcXXtoZWlnaHQ6MThweH0uaC1cWzFweFxde2hlaWdodDoxcHh9LmgtXFsyMHB4XF17aGVpZ2h0OjIwcHh9LmgtXFsyMnB4XF17aGVpZ2h0OjIycHh9LmgtXFsyNHB4XF17aGVpZ2h0OjI0cHh9LmgtXFszMnB4XF17aGVpZ2h0OjMycHh9LmgtXFs1MHB4XF17aGVpZ2h0OjUwcHh9LmgtXFs3NXB4XF17aGVpZ2h0Ojc1cHh9LmgtXFs5cHhcXXtoZWlnaHQ6OXB4fS5oLVxbdmFyXCgtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodFwpXF17aGVpZ2h0OnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmgtZnVsbHtoZWlnaHQ6MTAwJX0uaC1weHtoZWlnaHQ6MXB4fS5oLXNjcmVlbntoZWlnaHQ6MTAwdmh9Lm1heC1oLVxbMzAwcHhcXXttYXgtaGVpZ2h0OjMwMHB4fS5taW4taC1cWzIwMHB4XF17bWluLWhlaWdodDoyMDBweH0ubWluLWgtXFszMDBweFxde21pbi1oZWlnaHQ6MzAwcHh9Lm1pbi1oLXNjcmVlbnttaW4taGVpZ2h0OjEwMHZofS53LTFcLzN7d2lkdGg6MzMuMzMzMzMzJX0udy0xMHt3aWR0aDoyLjVyZW19LnctMnt3aWR0aDouNXJlbX0udy0yXC41e3dpZHRoOi42MjVyZW19LnctM3t3aWR0aDouNzVyZW19LnctM1wuNXt3aWR0aDouODc1cmVtfS53LTR7d2lkdGg6MXJlbX0udy01e3dpZHRoOjEuMjVyZW19LnctN3t3aWR0aDoxLjc1cmVtfS53LTcye3dpZHRoOjE4cmVtfS53LTl7d2lkdGg6Mi4yNXJlbX0udy1cWzE0cHhcXXt3aWR0aDoxNHB4fS53LVxbMXB4XF17d2lkdGg6MXB4fS53LVxbMjBweFxde3dpZHRoOjIwcHh9LnctXFsyNHB4XF17d2lkdGg6MjRweH0udy1cWzMycHhcXXt3aWR0aDozMnB4fS53LVxbNDRweFxde3dpZHRoOjQ0cHh9LnctXFs5cHhcXXt3aWR0aDo5cHh9LnctZml0e3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9LnctZnVsbHt3aWR0aDoxMDAlfS53LXNjcmVlbnt3aWR0aDoxMDB2d30ubWluLXctMHttaW4td2lkdGg6MHB4fS5taW4tdy1cWzMyMHB4XF17bWluLXdpZHRoOjMyMHB4fS5taW4tdy1cWzUwMHB4XF17bWluLXdpZHRoOjUwMHB4fS5taW4tdy1cWzhyZW1cXXttaW4td2lkdGg6OHJlbX0ubWluLXctXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGhcKVxde21pbi13aWR0aDp2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCl9Lm1heC13LTR4bHttYXgtd2lkdGg6NTZyZW19Lm1heC13LVxbMTAwMHB4XF17bWF4LXdpZHRoOjEwMDBweH0ubWF4LXctXFsxMHZ3XF17bWF4LXdpZHRoOjEwdnd9Lm1heC13LVxbMzAwcHhcXXttYXgtd2lkdGg6MzAwcHh9Lm1heC13LVxbOTB2d1xde21heC13aWR0aDo5MHZ3fS5tYXgtdy1sZ3ttYXgtd2lkdGg6MzJyZW19LmZsZXgtMXtmbGV4OjEgMSAwJX0uZmxleC1hdXRve2ZsZXg6MSAxIGF1dG99LmZsZXgtc2hyaW5rLTAsLnNocmluay0we2ZsZXgtc2hyaW5rOjB9LmZsZXgtZ3Jvd3tmbGV4LWdyb3c6MX0uYm9yZGVyLWNvbGxhcHNle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uLXRyYW5zbGF0ZS14LTFcLzIsLnRyYW5zbGF0ZS14LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS14OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2xhdGUteS1cWy01MFwlXF17LS10dy10cmFuc2xhdGUteTogLTUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uLXJvdGF0ZS05MHstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtOTB7LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFstOTBkZWdcXXstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFs5MGRlZ1xdey0tdHctcm90YXRlOiA5MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0udHJhbnNmb3Jte3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5jdXJzb3ItY29sLXJlc2l6ZXtjdXJzb3I6Y29sLXJlc2l6ZX0uY3Vyc29yLWRlZmF1bHR7Y3Vyc29yOmRlZmF1bHR9LmN1cnNvci1ncmFie2N1cnNvcjpncmFifS5jdXJzb3ItcG9pbnRlcntjdXJzb3I6cG9pbnRlcn0uY3Vyc29yLXNlLXJlc2l6ZXtjdXJzb3I6c2UtcmVzaXplfS50b3VjaC1ub25le3RvdWNoLWFjdGlvbjpub25lfS5zZWxlY3Qtbm9uZXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnJlc2l6ZS1ub25le3Jlc2l6ZTpub25lfS5yZXNpemV7cmVzaXplOmJvdGh9Lmxpc3QtZGVjaW1hbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH0ubGlzdC1kaXNje2xpc3Qtc3R5bGUtdHlwZTpkaXNjfS5ncmlkLWNvbHMtXFttaW4tY29udGVudF8xZnJcXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgMWZyfS5ncmlkLXJvd3MtXFsxZnJcLF9taW4tY29udGVudFxde2dyaWQtdGVtcGxhdGUtcm93czoxZnIgbWluLWNvbnRlbnR9LmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uZmxleC1jb2x7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LWNvbC1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5pdGVtcy1zdGFydHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5pdGVtcy1jZW50ZXJ7YWxpZ24taXRlbXM6Y2VudGVyfS5qdXN0aWZ5LXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5qdXN0aWZ5LWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lmp1c3RpZnktY2VudGVye2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uZ2FwLTF7Z2FwOi4yNXJlbX0uZ2FwLTJ7Z2FwOi41cmVtfS5nYXAtM3tnYXA6Ljc1cmVtfS5nYXAtNHtnYXA6MXJlbX0uZ2FwLTV7Z2FwOjEuMjVyZW19LmdhcC1cWzBcLjVlbVxde2dhcDouNWVtfS5nYXAtXFszNnB4XF17Z2FwOjM2cHh9LmdhcC14LTJ7LW1vei1jb2x1bW4tZ2FwOi41cmVtO2NvbHVtbi1nYXA6LjVyZW19LmdhcC14LTN7LW1vei1jb2x1bW4tZ2FwOi43NXJlbTtjb2x1bW4tZ2FwOi43NXJlbX0uZ2FwLXgtNHstbW96LWNvbHVtbi1nYXA6MXJlbTtjb2x1bW4tZ2FwOjFyZW19LmdhcC15LTJ7cm93LWdhcDouNXJlbX0uZ2FwLXktNHtyb3ctZ2FwOjFyZW19LmdhcC15LTZ7cm93LWdhcDoxLjVyZW19LmdhcC15LTh7cm93LWdhcDoycmVtfS5zcGFjZS14LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYyguMjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNwYWNlLXktMT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMjVyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc3BhY2UteS0xXC41Pjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYyguMzc1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMzc1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKC41cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktND46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5vdmVyZmxvdy1hdXRve292ZXJmbG93OmF1dG99Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LWNsaXB7b3ZlcmZsb3c6Y2xpcH0ub3ZlcmZsb3ctc2Nyb2xse292ZXJmbG93OnNjcm9sbH0ub3ZlcmZsb3cteS1hdXRve292ZXJmbG93LXk6YXV0b30ub3ZlcmZsb3cteC1oaWRkZW57b3ZlcmZsb3cteDpoaWRkZW59Lm92ZXJmbG93LXktc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsfS50cnVuY2F0ZXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LndoaXRlc3BhY2Utbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0ucm91bmRlZHtib3JkZXItcmFkaXVzOi4yNXJlbX0ucm91bmRlZC1cW2luaGVyaXRcXXtib3JkZXItcmFkaXVzOmluaGVyaXR9LnJvdW5kZWQtZnVsbHtib3JkZXItcmFkaXVzOjk5OTlweH0ucm91bmRlZC1sZ3tib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LnJvdW5kZWQtbWR7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpfS5yb3VuZGVkLXNte2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gNHB4KX0uYm9yZGVye2JvcmRlci13aWR0aDoxcHh9LmJvcmRlci0yLC5ib3JkZXItXFsycHhcXXtib3JkZXItd2lkdGg6MnB4fS5ib3JkZXIteXtib3JkZXItdG9wLXdpZHRoOjFweDtib3JkZXItYm90dG9tLXdpZHRoOjFweH0uYm9yZGVyLWJ7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1se2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uYm9yZGVyLWwtMntib3JkZXItbGVmdC13aWR0aDoycHh9LmJvcmRlci1ye2JvcmRlci1yaWdodC13aWR0aDoxcHh9LmJvcmRlci10e2JvcmRlci10b3Atd2lkdGg6MXB4fS5ib3JkZXItYWNjZW50e2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJvcmRlci1ib3JkZXJ7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uYm9yZGVyLWNhcmR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1jYXJkKSl9LmJvcmRlci1ncmF5LTQwMHstLXR3LWJvcmRlci1vcGFjaXR5OiAxO2JvcmRlci1jb2xvcjpyZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpfS5ib3JkZXItaW5wdXR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1pbnB1dCkpfS5ib3JkZXItcHJpbWFyeXtib3JkZXItY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uYm9yZGVyLXRyYW5zcGFyZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uYm9yZGVyLWwtdHJhbnNwYXJlbnR7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci10LXRyYW5zcGFyZW50e2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9LmJnLWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYmctYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmJnLWJhY2tncm91bmRcLzgwe2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpIC8gLjgpfS5iZy1ib3JkZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJnLWNhcmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5iZy1jYXJkLWZvcmVncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tY2FyZC1mb3JlZ3JvdW5kKSl9LmJnLWRlc3RydWN0aXZle2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlKSl9LmJnLWdyYXktMzAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMDkgMjEzIDIxOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctZ3JheS01MDB7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1tdXRlZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS5iZy1wb3BvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXBvcG92ZXIpKX0uYmctcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJnLXJlZC01MDB7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDIzOSA2OCA2OCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkpfS5iZy10cmFuc3BhcmVudHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5iZy13aGl0ZXstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYWRpZW50LXRvLWJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHZhcigtLXR3LWdyYWRpZW50LXN0b3BzKSl9LmZyb20tdHJhbnNwYXJlbnR7LS10dy1ncmFkaWVudC1mcm9tOiB0cmFuc3BhcmVudCB2YXIoLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uKTstLXR3LWdyYWRpZW50LXRvOiByZ2IoMCAwIDAgLyAwKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbik7LS10dy1ncmFkaWVudC1zdG9wczogdmFyKC0tdHctZ3JhZGllbnQtZnJvbSksIHZhcigtLXR3LWdyYWRpZW50LXRvKX0udG8tYmFja2dyb3VuZHstLXR3LWdyYWRpZW50LXRvOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpIHZhcigtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uKX0uZmlsbC1jdXJyZW50e2ZpbGw6Y3VycmVudENvbG9yfS5maWxsLXdoaXRle2ZpbGw6I2ZmZn0uc3Ryb2tlLVxbMnB4XF17c3Ryb2tlLXdpZHRoOjJweH0uc3Ryb2tlLVxbM3B4XF17c3Ryb2tlLXdpZHRoOjNweH0ub2JqZWN0LWNvbnRhaW57LW8tb2JqZWN0LWZpdDpjb250YWluO29iamVjdC1maXQ6Y29udGFpbn0ucC0we3BhZGRpbmc6MH0ucC0xe3BhZGRpbmc6LjI1cmVtfS5wLTEwe3BhZGRpbmc6Mi41cmVtfS5wLTJ7cGFkZGluZzouNXJlbX0ucC0ze3BhZGRpbmc6Ljc1cmVtfS5wLTR7cGFkZGluZzoxcmVtfS5wLTZ7cGFkZGluZzoxLjVyZW19LnAtXFsxcHhcXXtwYWRkaW5nOjFweH0ucHgtMXtwYWRkaW5nLWxlZnQ6LjI1cmVtO3BhZGRpbmctcmlnaHQ6LjI1cmVtfS5weC0ye3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5weC0yXC41e3BhZGRpbmctbGVmdDouNjI1cmVtO3BhZGRpbmctcmlnaHQ6LjYyNXJlbX0ucHgtM3twYWRkaW5nLWxlZnQ6Ljc1cmVtO3BhZGRpbmctcmlnaHQ6Ljc1cmVtfS5weC00e3BhZGRpbmctbGVmdDoxcmVtO3BhZGRpbmctcmlnaHQ6MXJlbX0ucHgtNXtwYWRkaW5nLWxlZnQ6MS4yNXJlbTtwYWRkaW5nLXJpZ2h0OjEuMjVyZW19LnB4LTh7cGFkZGluZy1sZWZ0OjJyZW07cGFkZGluZy1yaWdodDoycmVtfS5weC1cWzI0cHhcXXtwYWRkaW5nLWxlZnQ6MjRweDtwYWRkaW5nLXJpZ2h0OjI0cHh9LnB5LTF7cGFkZGluZy10b3A6LjI1cmVtO3BhZGRpbmctYm90dG9tOi4yNXJlbX0ucHktMVwuNXtwYWRkaW5nLXRvcDouMzc1cmVtO3BhZGRpbmctYm90dG9tOi4zNzVyZW19LnB5LTJ7cGFkZGluZy10b3A6LjVyZW07cGFkZGluZy1ib3R0b206LjVyZW19LnB5LTN7cGFkZGluZy10b3A6Ljc1cmVtO3BhZGRpbmctYm90dG9tOi43NXJlbX0ucHktNHtwYWRkaW5nLXRvcDoxcmVtO3BhZGRpbmctYm90dG9tOjFyZW19LnB5LTZ7cGFkZGluZy10b3A6MS41cmVtO3BhZGRpbmctYm90dG9tOjEuNXJlbX0ucHktN3twYWRkaW5nLXRvcDoxLjc1cmVtO3BhZGRpbmctYm90dG9tOjEuNzVyZW19LnB5LVxbMnB4XF17cGFkZGluZy10b3A6MnB4O3BhZGRpbmctYm90dG9tOjJweH0ucGItMHtwYWRkaW5nLWJvdHRvbTowfS5wYi0yMHtwYWRkaW5nLWJvdHRvbTo1cmVtfS5wYi00e3BhZGRpbmctYm90dG9tOjFyZW19LnBsLTZ7cGFkZGluZy1sZWZ0OjEuNXJlbX0ucGwtOHtwYWRkaW5nLWxlZnQ6MnJlbX0ucHItMntwYWRkaW5nLXJpZ2h0Oi41cmVtfS5wdC0we3BhZGRpbmctdG9wOjB9LnB0LTF7cGFkZGluZy10b3A6LjI1cmVtfS5wdC0ye3BhZGRpbmctdG9wOi41cmVtfS5wdC00e3BhZGRpbmctdG9wOjFyZW19LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LXN0YXJ0e3RleHQtYWxpZ246c3RhcnR9LmZvbnQtc2Fuc3tmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZn0uZm9udC1zZXJpZntmb250LWZhbWlseTpTcGFjZSBNb25vLG1vbm9zcGFjZX0udGV4dC0yeGx7Zm9udC1zaXplOjEuNXJlbTtsaW5lLWhlaWdodDoycmVtfS50ZXh0LTN4bHtmb250LXNpemU6MS44NzVyZW07bGluZS1oZWlnaHQ6Mi4yNXJlbX0udGV4dC00eGx7Zm9udC1zaXplOjIuMjVyZW07bGluZS1oZWlnaHQ6Mi41cmVtfS50ZXh0LVxbMFwuOHJlbVxde2ZvbnQtc2l6ZTouOHJlbX0udGV4dC1cWzEycHhcXXtmb250LXNpemU6MTJweH0udGV4dC1sZ3tmb250LXNpemU6MS4xMjVyZW07bGluZS1oZWlnaHQ6MS43NXJlbX0udGV4dC1zbXtmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS50ZXh0LXhse2ZvbnQtc2l6ZToxLjI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQteHN7Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5mb250LVxbMTJweFxde2ZvbnQtd2VpZ2h0OjEycHh9LmZvbnQtXFs0MDBcXXtmb250LXdlaWdodDo0MDB9LmZvbnQtXFs1MDBcXXtmb250LXdlaWdodDo1MDB9LmZvbnQtXFs1NTBcXXtmb250LXdlaWdodDo1NTB9LmZvbnQtYm9sZHtmb250LXdlaWdodDo3MDB9LmZvbnQtZXh0cmFib2xke2ZvbnQtd2VpZ2h0OjgwMH0uZm9udC1tZWRpdW17Zm9udC13ZWlnaHQ6NTAwfS5mb250LW5vcm1hbHtmb250LXdlaWdodDo0MDB9LmZvbnQtc2VtaWJvbGR7Zm9udC13ZWlnaHQ6NjAwfS51cHBlcmNhc2V7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS5pdGFsaWN7Zm9udC1zdHlsZTppdGFsaWN9LmxlYWRpbmctNHtsaW5lLWhlaWdodDoxcmVtfS5sZWFkaW5nLW5vbmV7bGluZS1oZWlnaHQ6MX0udHJhY2tpbmctXFswXC4wNGVtXF17bGV0dGVyLXNwYWNpbmc6LjA0ZW19LnRyYWNraW5nLXRpZ2h0e2xldHRlci1zcGFjaW5nOi0uMDI1ZW19LnRyYWNraW5nLXdpZGVye2xldHRlci1zcGFjaW5nOi4wNWVtfS50cmFja2luZy13aWRlc3R7bGV0dGVyLXNwYWNpbmc6LjFlbX0udGV4dC1hY2NlbnR7Y29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS50ZXh0LWFjY2VudC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS50ZXh0LWJhY2tncm91bmR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0udGV4dC1jYXJkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS50ZXh0LWN1cnJlbnR7Y29sb3I6Y3VycmVudENvbG9yfS50ZXh0LWRlc3RydWN0aXZle2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS50ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlLWZvcmVncm91bmQpKX0udGV4dC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LnRleHQtbXV0ZWR7Y29sb3I6aHNsKHZhcigtLW11dGVkKSl9LnRleHQtbXV0ZWQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS50ZXh0LXBvcG92ZXItZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tcG9wb3Zlci1mb3JlZ3JvdW5kKSl9LnRleHQtcHJpbWFyeXtjb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS50ZXh0LXByaW1hcnktZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LnRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXNlY29uZGFyeS1mb3JlZ3JvdW5kKSl9LnRleHQtd2hpdGV7LS10dy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSl9LnVuZGVybGluZXt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxpbmV9LmxpbmUtdGhyb3VnaHt0ZXh0LWRlY29yYXRpb24tbGluZTpsaW5lLXRocm91Z2h9LnVuZGVybGluZS1vZmZzZXQtNHt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NHB4fS5hbnRpYWxpYXNlZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0ub3BhY2l0eS0we29wYWNpdHk6MH0ub3BhY2l0eS0xMDB7b3BhY2l0eToxfS5vcGFjaXR5LTUwe29wYWNpdHk6LjV9Lm9wYWNpdHktNjB7b3BhY2l0eTouNn0ub3BhY2l0eS03MHtvcGFjaXR5Oi43fS5vcGFjaXR5LTc1e29wYWNpdHk6Ljc1fS5zaGFkb3d7LS10dy1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYigwIDAgMCAvIC4xKSwgMCAxcHggMnB4IC0xcHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDNweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMXB4IDJweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LWxney0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIC4xKSwgMCA0cHggNnB4IC00cHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5zaGFkb3ctbWR7LS10dy1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgNHB4IDZweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMnB4IDRweCAtMnB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LXNtey0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAuMDUpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDJweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0ub3V0bGluZS1ub25le291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0ub3V0bGluZXtvdXRsaW5lLXN0eWxlOnNvbGlkfS5yaW5nLTB7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygwcHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5yaW5nLW9mZnNldC1iYWNrZ3JvdW5key0tdHctcmluZy1vZmZzZXQtY29sb3I6IGhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmRyb3Atc2hhZG93LTJ4bHstLXR3LWRyb3Atc2hhZG93OiBkcm9wLXNoYWRvdygwIDI1cHggMjVweCByZ2IoMCAwIDAgLyAuMTUpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZHJvcC1zaGFkb3ctXFswcHhfMHB4XzEycHhfcmdiYVwoNTZcLDIwNVwsMTUyXCwwXC42MFwpXF17LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMHB4IDBweCAxMnB4IHJnYmEoNTYsMjA1LDE1MiwuNikpO2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5maWx0ZXJ7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmJhY2tkcm9wLWJsdXItc217LS10dy1iYWNrZHJvcC1ibHVyOiBibHVyKDRweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpO2JhY2tkcm9wLWZpbHRlcjp2YXIoLS10dy1iYWNrZHJvcC1ibHVyKSB2YXIoLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzKSB2YXIoLS10dy1iYWNrZHJvcC1jb250cmFzdCkgdmFyKC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlKSB2YXIoLS10dy1iYWNrZHJvcC1odWUtcm90YXRlKSB2YXIoLS10dy1iYWNrZHJvcC1pbnZlcnQpIHZhcigtLXR3LWJhY2tkcm9wLW9wYWNpdHkpIHZhcigtLXR3LWJhY2tkcm9wLXNhdHVyYXRlKSB2YXIoLS10dy1iYWNrZHJvcC1zZXBpYSl9LnRyYW5zaXRpb24tYWxse3RyYW5zaXRpb24tcHJvcGVydHk6YWxsO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1jb2xvcnN7dHJhbnNpdGlvbi1wcm9wZXJ0eTpjb2xvcixiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcix0ZXh0LWRlY29yYXRpb24tY29sb3IsZmlsbCxzdHJva2U7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS50cmFuc2l0aW9uLW9wYWNpdHl7dHJhbnNpdGlvbi1wcm9wZXJ0eTpvcGFjaXR5O3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi10cmFuc2Zvcm17dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm07dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0xNTB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMnN9LmVhc2UtaW4tb3V0e3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfUBrZXlmcmFtZXMgZW50ZXJ7MCV7b3BhY2l0eTp2YXIoLS10dy1lbnRlci1vcGFjaXR5LCAxKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QodmFyKC0tdHctZW50ZXItdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSx2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZW50ZXItcm90YXRlLCAwKSl9fUBrZXlmcmFtZXMgZXhpdHt0b3tvcGFjaXR5OnZhcigtLXR3LWV4aXQtb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXksIDApLDApIHNjYWxlM2QodmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSkpIHJvdGF0ZSh2YXIoLS10dy1leGl0LXJvdGF0ZSwgMCkpfX0uYW5pbWF0ZS1pbnthbmltYXRpb24tbmFtZTplbnRlcjthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWVudGVyLW9wYWNpdHk6IGluaXRpYWw7LS10dy1lbnRlci1zY2FsZTogaW5pdGlhbDstLXR3LWVudGVyLXJvdGF0ZTogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXk6IGluaXRpYWx9LmZhZGUtaW4tMHstLXR3LWVudGVyLW9wYWNpdHk6IDB9Lnpvb20taW4tOTV7LS10dy1lbnRlci1zY2FsZTogLjk1fS5kdXJhdGlvbi0xNTB7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXN9LmR1cmF0aW9uLTIwMHthbmltYXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfS5maWxlXDpib3JkZXItMDo6ZmlsZS1zZWxlY3Rvci1idXR0b257Ym9yZGVyLXdpZHRoOjBweH0uZmlsZVw6YmctdHJhbnNwYXJlbnQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmZpbGVcOnRleHQtc206OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmZpbGVcOmZvbnQtbWVkaXVtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXdlaWdodDo1MDB9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0ucGxhY2Vob2xkZXJcOnRleHQtbXV0ZWQtZm9yZWdyb3VuZDo6cGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZm9jdXMtd2l0aGluXDpyZWxhdGl2ZTpmb2N1cy13aXRoaW57cG9zaXRpb246cmVsYXRpdmV9LmhvdmVyXDp3LVxbMnB4XF06aG92ZXJ7d2lkdGg6MnB4fS5ob3Zlclw6dy1cWzNweFxdOmhvdmVye3dpZHRoOjNweH0uaG92ZXJcOmN1cnNvci1wb2ludGVyOmhvdmVye2N1cnNvcjpwb2ludGVyfS5ob3Zlclw6cm91bmRlZC1sZzpob3Zlcntib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LmhvdmVyXDpiZy1hY2NlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmhvdmVyXDpiZy1iYWNrZ3JvdW5kOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uaG92ZXJcOmJnLWJvcmRlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uaG92ZXJcOmJnLWRlc3RydWN0aXZlXC85MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkgLyAuOSl9LmhvdmVyXDpiZy1tdXRlZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS5ob3Zlclw6YmctcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmhvdmVyXDpiZy1wcmltYXJ5XC85MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSAvIC45KX0uaG92ZXJcOmJnLXJlZC03MDA6aG92ZXJ7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDE4NSAyOCAyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tc2Vjb25kYXJ5KSAvIC44KX0uaG92ZXJcOnRleHQtYWNjZW50LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uaG92ZXJcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uaG92ZXJcOnRleHQtd2hpdGU6aG92ZXJ7LS10dy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSl9LmhvdmVyXDp1bmRlcmxpbmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5ob3Zlclw6b3BhY2l0eS0xMDA6aG92ZXJ7b3BhY2l0eToxfS5mb2N1c1w6YmctYWNjZW50OmZvY3Vze2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5mb2N1c1w6YmctcHJpbWFyeTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmZvY3VzXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5mb2N1c1w6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQ6Zm9jdXN7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS5mb2N1c1w6b3V0bGluZS1ub25lOmZvY3Vze291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0uZm9jdXNcOnJpbmctMjpmb2N1c3stLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTstLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDJweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLHZhcigtLXR3LXJpbmctc2hhZG93KSx2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCl9LmZvY3VzXDpyaW5nLXJpbmc6Zm9jdXN7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1c1w6cmluZy1vZmZzZXQtMjpmb2N1c3stLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtbm9uZTpmb2N1cy12aXNpYmxle291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS1hY2NlbnQ6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXMtdmlzaWJsZVw6cmluZy0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1cy12aXNpYmxlXDpyaW5nLXJpbmc6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6IGhzbCh2YXIoLS1yaW5nKSl9LmZvY3VzLXZpc2libGVcOnJpbmctb2Zmc2V0LTI6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHh9LmZvY3VzLXZpc2libGVcOnJpbmctb2Zmc2V0LWJhY2tncm91bmQ6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kaXNhYmxlZFw6cG9pbnRlci1ldmVudHMtbm9uZTpkaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lfS5kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2VkOmRpc2FibGVke2N1cnNvcjpub3QtYWxsb3dlZH0uZGlzYWJsZWRcOnRleHQtYmFja2dyb3VuZDpkaXNhYmxlZHtjb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kaXNhYmxlZFw6b3BhY2l0eS01MDpkaXNhYmxlZHtvcGFjaXR5Oi41fS5wZWVyOmRpc2FibGVkfi5wZWVyLWRpc2FibGVkXDpjdXJzb3Itbm90LWFsbG93ZWR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5wZWVyOmRpc2FibGVkfi5wZWVyLWRpc2FibGVkXDpvcGFjaXR5LTcwe29wYWNpdHk6Ljd9LmFyaWEtc2VsZWN0ZWRcOmJnLWFjY2VudFthcmlhLXNlbGVjdGVkPXRydWVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5hcmlhLXNlbGVjdGVkXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2FyaWEtc2VsZWN0ZWQ9dHJ1ZV17Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmFyaWEtc2VsZWN0ZWRcOm9wYWNpdHktMTAwW2FyaWEtc2VsZWN0ZWQ9dHJ1ZV17b3BhY2l0eToxfS5kYXRhLVxbZGlzYWJsZWRcXVw6cG9pbnRlci1ldmVudHMtbm9uZVtkYXRhLWRpc2FibGVkXXtwb2ludGVyLWV2ZW50czpub25lfS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPWJvdHRvbV17LS10dy10cmFuc2xhdGUteTogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDotdHJhbnNsYXRlLXgtMVtkYXRhLXNpZGU9bGVmdF17LS10dy10cmFuc2xhdGUteDogLS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LXRyYW5zbGF0ZS14OiAuMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD10b3BcXVw6LXRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPXRvcF17LS10dy10cmFuc2xhdGUteTogLS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOnRyYW5zbGF0ZS14LTVbZGF0YS1zdGF0ZT1jaGVja2VkXXstLXR3LXRyYW5zbGF0ZS14OiAxLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc3RhdGVcPXVuY2hlY2tlZFxdXDp0cmFuc2xhdGUteC0wW2RhdGEtc3RhdGU9dW5jaGVja2VkXXstLXR3LXRyYW5zbGF0ZS14OiAwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9QGtleWZyYW1lcyBhY2NvcmRpb24tdXB7MCV7aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9dG97aGVpZ2h0OjB9fS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLWFjY29yZGlvbi11cFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uOmFjY29yZGlvbi11cCAuMnMgZWFzZS1vdXR9QGtleWZyYW1lcyBhY2NvcmRpb24tZG93bnswJXtoZWlnaHQ6MH10b3toZWlnaHQ6dmFyKC0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0KX19LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWFjY29yZGlvbi1kb3duW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uOmFjY29yZGlvbi1kb3duIC4ycyBlYXNlLW91dH0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6YmctYmFja2dyb3VuZFtkYXRhLXN0YXRlPWFjdGl2ZV17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctYWNjZW50W2RhdGEtc3RhdGU9Y2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDpiZy1wcmltYXJ5W2RhdGEtc3RhdGU9Y2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPW9uXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPW9uXSwuZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPW9wZW5de2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPXVuY2hlY2tlZFxdXDpiZy1wcmltYXJ5W2RhdGEtc3RhdGU9dW5jaGVja2VkXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOnRleHQtZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWFjdGl2ZV17Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9Y2hlY2tlZF17Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9uXF1cOnRleHQtYWNjZW50LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1vbl17Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmRbZGF0YS1zdGF0ZT1vcGVuXXtjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbZGlzYWJsZWRcXVw6b3BhY2l0eS01MFtkYXRhLWRpc2FibGVkXXtvcGFjaXR5Oi41fS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDpzaGFkb3ctc21bZGF0YS1zdGF0ZT1hY3RpdmVdey0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAuMDUpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDJweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmFuaW1hdGUtaW5bZGF0YS1zdGF0ZT1vcGVuXXthbmltYXRpb24tbmFtZTplbnRlcjthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWVudGVyLW9wYWNpdHk6IGluaXRpYWw7LS10dy1lbnRlci1zY2FsZTogaW5pdGlhbDstLXR3LWVudGVyLXJvdGF0ZTogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXk6IGluaXRpYWx9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOmFuaW1hdGUtb3V0W2RhdGEtc3RhdGU9Y2xvc2VkXXthbmltYXRpb24tbmFtZTpleGl0O2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzOy0tdHctZXhpdC1vcGFjaXR5OiBpbml0aWFsOy0tdHctZXhpdC1zY2FsZTogaW5pdGlhbDstLXR3LWV4aXQtcm90YXRlOiBpbml0aWFsOy0tdHctZXhpdC10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXk6IGluaXRpYWx9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOmZhZGUtb3V0LTBbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1vcGFjaXR5OiAwfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6ZmFkZS1pbi0wW2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci1vcGFjaXR5OiAwfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDp6b29tLW91dC05NVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXNjYWxlOiAuOTV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDp6b29tLWluLTk1W2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci1zY2FsZTogLjk1fS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnNsaWRlLWluLWZyb20tdG9wLTJbZGF0YS1zaWRlPWJvdHRvbV17LS10dy1lbnRlci10cmFuc2xhdGUteTogLS41cmVtfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWxlZnRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6IC41cmVtfS5kYXRhLVxbc2lkZVw9cmlnaHRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtLjVyZW19LmRhdGEtXFtzaWRlXD10b3BcXVw6c2xpZGUtaW4tZnJvbS1ib3R0b20tMltkYXRhLXNpZGU9dG9wXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAuNXJlbX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLWxlZnQtMVwvMltkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpzbGlkZS1vdXQtdG8tdG9wLVxbNDhcJVxdW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtdHJhbnNsYXRlLXk6IC00OCV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpzbGlkZS1pbi1mcm9tLWxlZnQtMVwvMltkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItdHJhbnNsYXRlLXg6IC01MCV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpzbGlkZS1pbi1mcm9tLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC00OCV9OmlzKFtkYXRhLW1vZGU9ZGFya10gLmRhcmtcOmJvcmRlci13aGl0ZSl7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX1AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpey5zbVw6bXQtMHttYXJnaW4tdG9wOjB9LnNtXDpibG9ja3tkaXNwbGF5OmJsb2NrfS5zbVw6ZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5zbVw6anVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zbVw6c3BhY2UteC0yPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC41cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYyguNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXgtND46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYygxcmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYygxcmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zbVw6c3BhY2UteS0wPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYygwcHggKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDBweCAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zbVw6cm91bmRlZC1sZ3tib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LnNtXDpwLTB7cGFkZGluZzowfS5zbVw6dGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH19QG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KXsubWRcOnctZnVsbHt3aWR0aDoxMDAlfX0uXFtcJlw6aGFzXChcW2FyaWEtc2VsZWN0ZWRcXVwpXF1cOmJnLWFjY2VudDpoYXMoW2FyaWEtc2VsZWN0ZWRdKXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZmlyc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLWwtbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ubGFzdFw6XFtcJlw6aGFzXChcW2FyaWEtc2VsZWN0ZWRcXVwpXF1cOnJvdW5kZWQtci1tZDpoYXMoW2FyaWEtc2VsZWN0ZWRdKTpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCk7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0uXFtcJlxbZGF0YS1zdGF0ZVw9b3BlblxdXD5zdmdcXVw6cm90YXRlLTE4MFtkYXRhLXN0YXRlPW9wZW5dPnN2Z3stLXR3LXJvdGF0ZTogMTgwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6cHgtMiBbY21kay1ncm91cC1oZWFkaW5nXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB5LTFcLjUgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC14cyBbY21kay1ncm91cC1oZWFkaW5nXXtmb250LXNpemU6Ljc1cmVtO2xpbmUtaGVpZ2h0OjFyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpmb250LW1lZGl1bSBbY21kay1ncm91cC1oZWFkaW5nXXtmb250LXdlaWdodDo1MDB9LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmQgW2NtZGstZ3JvdXAtaGVhZGluZ117Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uXFtcJl9cW2NtZGstZ3JvdXBcXVw6bm90XChcW2hpZGRlblxdXClfXH5cW2NtZGstZ3JvdXBcXVxdXDpwdC0wIFtjbWRrLWdyb3VwXTpub3QoW2hpZGRlbl0pfltjbWRrLWdyb3VwXXtwYWRkaW5nLXRvcDowfS5cW1wmX1xbY21kay1ncm91cFxdXF1cOnB4LTIgW2NtZGstZ3JvdXBde3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOmgtNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7aGVpZ2h0OjEuMjVyZW19LlxbXCZfXFtjbWRrLWlucHV0LXdyYXBwZXJcXV9zdmdcXVw6dy01IFtjbWRrLWlucHV0LXdyYXBwZXJdIHN2Z3t3aWR0aDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dFxdXF1cOmgtMTIgW2NtZGstaW5wdXRde2hlaWdodDozcmVtfS5cW1wmX1xbY21kay1pdGVtXF1cXVw6cHgtMiBbY21kay1pdGVtXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB5LTMgW2NtZGstaXRlbV17cGFkZGluZy10b3A6Ljc1cmVtO3BhZGRpbmctYm90dG9tOi43NXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDpoLTUgW2NtZGstaXRlbV0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pdGVtXF1fc3ZnXF1cOnctNSBbY21kay1pdGVtXSBzdmd7d2lkdGg6MS4yNXJlbX0K","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtM091VGtfcnAuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSIvYXBpL3ZhbC9zdGF0aWMvYXNzZXRzL2luZGV4LWNva3FFajZ1LmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0icm9vdCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=="}`
|
|
20
|
+
`{"/assets/index-cokqEj6u.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1mZWF0dXJlLXNldHRpbmdzOmluaGVyaXQ7Zm9udC12YXJpYXRpb24tc2V0dGluZ3M6aW5oZXJpdDtmb250LXNpemU6MTAwJTtmb250LXdlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6aW5oZXJpdDttYXJnaW46MDtwYWRkaW5nOjB9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixbdHlwZT1idXR0b25dLFt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6YXV0b306LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX1wcm9ncmVzc3t2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPXNlYXJjaF17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19YmxvY2txdW90ZSxkbCxkZCxoMSxoMixoMyxoNCxoNSxoNixocixmaWd1cmUscCxwcmV7bWFyZ2luOjB9ZmllbGRzZXR7bWFyZ2luOjA7cGFkZGluZzowfWxlZ2VuZHtwYWRkaW5nOjB9b2wsdWwsbWVudXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowfWRpYWxvZ3twYWRkaW5nOjB9dGV4dGFyZWF7cmVzaXplOnZlcnRpY2FsfWlucHV0OjotbW96LXBsYWNlaG9sZGVyLHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MTtjb2xvcjojOWNhM2FmfWlucHV0OjpwbGFjZWhvbGRlcix0ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9YnV0dG9uLFtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9OmRpc2FibGVke2N1cnNvcjpkZWZhdWx0fWltZyxzdmcsdmlkZW8sY2FudmFzLGF1ZGlvLGlmcmFtZSxlbWJlZCxvYmplY3R7ZGlzcGxheTpibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9aW1nLHZpZGVve21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX06aG9zdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19OnJvb3R7LS1iYWNrZ3JvdW5kOiAwIDAlIDEwMCU7LS1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLWNhcmQ6IDAgMCUgMTAwJTstLWNhcmQtZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyOiAwIDAlIDEwMCU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcHJpbWFyeTogMjIyLjIgNDcuNCUgMTEuMiU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tc2Vjb25kYXJ5OiAyMTAgNDAlIDk2LjElOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tbXV0ZWQ6IDAgMCUgNTcuMyU7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUuNCAxNi4zJSA0Ni45JTstLWFjY2VudDogMTU5LCA2MCUsIDUxJSwgMTstLWFjY2VudC1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLWRlc3RydWN0aXZlOiAwIDg0LjIlIDYwLjIlOy0tZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1ib3JkZXI6IDIxNC4zIDMxLjglIDkxLjQlOy0taW5wdXQ6IDIxNC4zIDMxLjglIDkxLjQlOy0tcmluZzogMjIyLjIgODQlIDQuOSU7LS1yYWRpdXM6IC41cmVtfSpbZGF0YS1tb2RlPWRhcmtdey0tYmFja2dyb3VuZDogMCAwJSA0JTstLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tY2FyZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcG9wb3ZlcjogMjIyLjIgODQlIDQuOSU7LS1wb3BvdmVyLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tcHJpbWFyeTogMjEwIDQwJSA5OCU7LS1wcmltYXJ5LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tc2Vjb25kYXJ5OiAyMTcuMiAzMi42JSAxNy41JTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLW11dGVkOiAxNzgsIDIzJSwgNzYlLCAxOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1IDIwLjIlIDY1LjElOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tZGVzdHJ1Y3RpdmU6IDAgNjIuOCUgMzAuNiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE3LjIgMzIuNiUgMTcuNSU7LS1pbnB1dDogMjE3LjIgMzIuNiUgMTcuNSU7LS1yaW5nOiAyMTIuNyAyNi44JSA4My45JX0qe2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSk7Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0qLDpiZWZvcmUsOmFmdGVyey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9OjpiYWNrZHJvcHstLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7LS10dy1ib3JkZXItc3BhY2luZy15OiAwOy0tdHctdHJhbnNsYXRlLXg6IDA7LS10dy10cmFuc2xhdGUteTogMDstLXR3LXJvdGF0ZTogMDstLXR3LXNrZXcteDogMDstLXR3LXNrZXcteTogMDstLXR3LXNjYWxlLXg6IDE7LS10dy1zY2FsZS15OiAxOy0tdHctcGFuLXg6IDstLXR3LXBhbi15OiA7LS10dy1waW5jaC16b29tOiA7LS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7LS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiA7LS10dy1vcmRpbmFsOiA7LS10dy1zbGFzaGVkLXplcm86IDstLXR3LW51bWVyaWMtZmlndXJlOiA7LS10dy1udW1lcmljLXNwYWNpbmc6IDstLXR3LW51bWVyaWMtZnJhY3Rpb246IDstLXR3LXJpbmctaW5zZXQ6IDstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjstLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gLjUpOy0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7LS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwOy0tdHctYmx1cjogOy0tdHctYnJpZ2h0bmVzczogOy0tdHctY29udHJhc3Q6IDstLXR3LWdyYXlzY2FsZTogOy0tdHctaHVlLXJvdGF0ZTogOy0tdHctaW52ZXJ0OiA7LS10dy1zYXR1cmF0ZTogOy0tdHctc2VwaWE6IDstLXR3LWRyb3Atc2hhZG93OiA7LS10dy1iYWNrZHJvcC1ibHVyOiA7LS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiA7LS10dy1iYWNrZHJvcC1jb250cmFzdDogOy0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiA7LS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiA7LS10dy1iYWNrZHJvcC1pbnZlcnQ6IDstLXR3LWJhY2tkcm9wLW9wYWNpdHk6IDstLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiA7LS10dy1iYWNrZHJvcC1zZXBpYTogfS5zci1vbmx5e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItd2lkdGg6MH0ucG9pbnRlci1ldmVudHMtbm9uZXtwb2ludGVyLWV2ZW50czpub25lfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59LnN0YXRpY3twb3NpdGlvbjpzdGF0aWN9LmZpeGVke3Bvc2l0aW9uOmZpeGVkfS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LnN0aWNreXtwb3NpdGlvbjpzdGlja3l9Lmluc2V0LTB7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjB9Lmluc2V0LXktMHt0b3A6MDtib3R0b206MH0uLWxlZnQtMntsZWZ0Oi0uNXJlbX0uLXJpZ2h0LVxbMTBweFxde3JpZ2h0Oi0xMHB4fS4tdG9wLVxbMTBweFxde3RvcDotMTBweH0uLXRvcC1cWzRweFxde3RvcDotNHB4fS5ib3R0b20tMHtib3R0b206MH0uYm90dG9tLTR7Ym90dG9tOjFyZW19LmxlZnQtMHtsZWZ0OjB9LmxlZnQtMXtsZWZ0Oi4yNXJlbX0ubGVmdC0xXC8ye2xlZnQ6NTAlfS5sZWZ0LTJ7bGVmdDouNXJlbX0ubGVmdC1cWzUwXCVcXXtsZWZ0OjUwJX0ucmlnaHQtMHtyaWdodDowfS5yaWdodC0xe3JpZ2h0Oi4yNXJlbX0ucmlnaHQtNHtyaWdodDoxcmVtfS5yaWdodC1cWzE2cHhcXXtyaWdodDoxNnB4fS50b3AtMHt0b3A6MH0udG9wLTR7dG9wOjFyZW19LnRvcC1cWzUwXCVcXXt0b3A6NTAlfS56LTUwe3otaW5kZXg6NTB9LnotXFs1XF17ei1pbmRleDo1fS56LW92ZXJsYXl7ei1pbmRleDo0fS4tbXgtMXttYXJnaW4tbGVmdDotLjI1cmVtO21hcmdpbi1yaWdodDotLjI1cmVtfS4tbXktMnttYXJnaW4tdG9wOi0uNXJlbTttYXJnaW4tYm90dG9tOi0uNXJlbX0uLW15LVxbMTAwcHhcXXttYXJnaW4tdG9wOi0xMDBweDttYXJnaW4tYm90dG9tOi0xMDBweH0ubXgtMnttYXJnaW4tbGVmdDouNXJlbTttYXJnaW4tcmlnaHQ6LjVyZW19Lm15LTF7bWFyZ2luLXRvcDouMjVyZW07bWFyZ2luLWJvdHRvbTouMjVyZW19Lm1iLTR7bWFyZ2luLWJvdHRvbToxcmVtfS5tbC0ye21hcmdpbi1sZWZ0Oi41cmVtfS5tbC00e21hcmdpbi1sZWZ0OjFyZW19Lm1sLVxbMjBweFxde21hcmdpbi1sZWZ0OjIwcHh9Lm1sLWF1dG97bWFyZ2luLWxlZnQ6YXV0b30ubXItMnttYXJnaW4tcmlnaHQ6LjVyZW19Lm10LTJ7bWFyZ2luLXRvcDouNXJlbX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0udGFibGV7ZGlzcGxheTp0YWJsZX0uZ3JpZHtkaXNwbGF5OmdyaWR9LmhpZGRlbntkaXNwbGF5Om5vbmV9LmFzcGVjdC1zcXVhcmV7YXNwZWN0LXJhdGlvOjEgLyAxfS5oLTEwe2hlaWdodDoyLjVyZW19LmgtMTF7aGVpZ2h0OjIuNzVyZW19LmgtMntoZWlnaHQ6LjVyZW19LmgtMlwuNXtoZWlnaHQ6LjYyNXJlbX0uaC0ze2hlaWdodDouNzVyZW19LmgtM1wuNXtoZWlnaHQ6Ljg3NXJlbX0uaC00e2hlaWdodDoxcmVtfS5oLTd7aGVpZ2h0OjEuNzVyZW19LmgtOXtoZWlnaHQ6Mi4yNXJlbX0uaC1cWzE0cHhcXXtoZWlnaHQ6MTRweH0uaC1cWzE4cHhcXXtoZWlnaHQ6MThweH0uaC1cWzFweFxde2hlaWdodDoxcHh9LmgtXFsyMHB4XF17aGVpZ2h0OjIwcHh9LmgtXFsyMnB4XF17aGVpZ2h0OjIycHh9LmgtXFsyNHB4XF17aGVpZ2h0OjI0cHh9LmgtXFszMnB4XF17aGVpZ2h0OjMycHh9LmgtXFs1MHB4XF17aGVpZ2h0OjUwcHh9LmgtXFs3NXB4XF17aGVpZ2h0Ojc1cHh9LmgtXFs5cHhcXXtoZWlnaHQ6OXB4fS5oLVxbdmFyXCgtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodFwpXF17aGVpZ2h0OnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCl9LmgtZnVsbHtoZWlnaHQ6MTAwJX0uaC1weHtoZWlnaHQ6MXB4fS5oLXNjcmVlbntoZWlnaHQ6MTAwdmh9Lm1heC1oLVxbMzAwcHhcXXttYXgtaGVpZ2h0OjMwMHB4fS5taW4taC1cWzIwMHB4XF17bWluLWhlaWdodDoyMDBweH0ubWluLWgtXFszMDBweFxde21pbi1oZWlnaHQ6MzAwcHh9Lm1pbi1oLXNjcmVlbnttaW4taGVpZ2h0OjEwMHZofS53LTFcLzN7d2lkdGg6MzMuMzMzMzMzJX0udy0xMHt3aWR0aDoyLjVyZW19LnctMnt3aWR0aDouNXJlbX0udy0yXC41e3dpZHRoOi42MjVyZW19LnctM3t3aWR0aDouNzVyZW19LnctM1wuNXt3aWR0aDouODc1cmVtfS53LTR7d2lkdGg6MXJlbX0udy01e3dpZHRoOjEuMjVyZW19LnctN3t3aWR0aDoxLjc1cmVtfS53LTcye3dpZHRoOjE4cmVtfS53LTl7d2lkdGg6Mi4yNXJlbX0udy1cWzE0cHhcXXt3aWR0aDoxNHB4fS53LVxbMXB4XF17d2lkdGg6MXB4fS53LVxbMjBweFxde3dpZHRoOjIwcHh9LnctXFsyNHB4XF17d2lkdGg6MjRweH0udy1cWzMycHhcXXt3aWR0aDozMnB4fS53LVxbNDRweFxde3dpZHRoOjQ0cHh9LnctXFs5cHhcXXt3aWR0aDo5cHh9LnctZml0e3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9LnctZnVsbHt3aWR0aDoxMDAlfS53LXNjcmVlbnt3aWR0aDoxMDB2d30ubWluLXctMHttaW4td2lkdGg6MHB4fS5taW4tdy1cWzMyMHB4XF17bWluLXdpZHRoOjMyMHB4fS5taW4tdy1cWzUwMHB4XF17bWluLXdpZHRoOjUwMHB4fS5taW4tdy1cWzhyZW1cXXttaW4td2lkdGg6OHJlbX0ubWluLXctXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGhcKVxde21pbi13aWR0aDp2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCl9Lm1heC13LTR4bHttYXgtd2lkdGg6NTZyZW19Lm1heC13LVxbMTAwMHB4XF17bWF4LXdpZHRoOjEwMDBweH0ubWF4LXctXFsxMHZ3XF17bWF4LXdpZHRoOjEwdnd9Lm1heC13LVxbMzAwcHhcXXttYXgtd2lkdGg6MzAwcHh9Lm1heC13LVxbOTB2d1xde21heC13aWR0aDo5MHZ3fS5tYXgtdy1sZ3ttYXgtd2lkdGg6MzJyZW19LmZsZXgtMXtmbGV4OjEgMSAwJX0uZmxleC1hdXRve2ZsZXg6MSAxIGF1dG99LmZsZXgtc2hyaW5rLTAsLnNocmluay0we2ZsZXgtc2hyaW5rOjB9LmZsZXgtZ3Jvd3tmbGV4LWdyb3c6MX0uYm9yZGVyLWNvbGxhcHNle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uLXRyYW5zbGF0ZS14LTFcLzIsLnRyYW5zbGF0ZS14LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS14OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2xhdGUteS1cWy01MFwlXF17LS10dy10cmFuc2xhdGUteTogLTUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uLXJvdGF0ZS05MHstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtOTB7LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFstOTBkZWdcXXstLXR3LXJvdGF0ZTogLTkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5yb3RhdGUtXFs5MGRlZ1xdey0tdHctcm90YXRlOiA5MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0udHJhbnNmb3Jte3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5jdXJzb3ItY29sLXJlc2l6ZXtjdXJzb3I6Y29sLXJlc2l6ZX0uY3Vyc29yLWRlZmF1bHR7Y3Vyc29yOmRlZmF1bHR9LmN1cnNvci1ncmFie2N1cnNvcjpncmFifS5jdXJzb3ItcG9pbnRlcntjdXJzb3I6cG9pbnRlcn0uY3Vyc29yLXNlLXJlc2l6ZXtjdXJzb3I6c2UtcmVzaXplfS50b3VjaC1ub25le3RvdWNoLWFjdGlvbjpub25lfS5zZWxlY3Qtbm9uZXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnJlc2l6ZS1ub25le3Jlc2l6ZTpub25lfS5yZXNpemV7cmVzaXplOmJvdGh9Lmxpc3QtZGVjaW1hbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH0ubGlzdC1kaXNje2xpc3Qtc3R5bGUtdHlwZTpkaXNjfS5ncmlkLWNvbHMtXFttaW4tY29udGVudF8xZnJcXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgMWZyfS5ncmlkLXJvd3MtXFsxZnJcLF9taW4tY29udGVudFxde2dyaWQtdGVtcGxhdGUtcm93czoxZnIgbWluLWNvbnRlbnR9LmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uZmxleC1jb2x7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LWNvbC1yZXZlcnNle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5pdGVtcy1zdGFydHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5pdGVtcy1jZW50ZXJ7YWxpZ24taXRlbXM6Y2VudGVyfS5qdXN0aWZ5LXN0YXJ0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5qdXN0aWZ5LWVuZHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lmp1c3RpZnktY2VudGVye2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lmp1c3RpZnktYmV0d2VlbntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uZ2FwLTF7Z2FwOi4yNXJlbX0uZ2FwLTJ7Z2FwOi41cmVtfS5nYXAtM3tnYXA6Ljc1cmVtfS5nYXAtNHtnYXA6MXJlbX0uZ2FwLTV7Z2FwOjEuMjVyZW19LmdhcC1cWzBcLjVlbVxde2dhcDouNWVtfS5nYXAtXFszNnB4XF17Z2FwOjM2cHh9LmdhcC14LTJ7LW1vei1jb2x1bW4tZ2FwOi41cmVtO2NvbHVtbi1nYXA6LjVyZW19LmdhcC14LTN7LW1vei1jb2x1bW4tZ2FwOi43NXJlbTtjb2x1bW4tZ2FwOi43NXJlbX0uZ2FwLXgtNHstbW96LWNvbHVtbi1nYXA6MXJlbTtjb2x1bW4tZ2FwOjFyZW19LmdhcC15LTJ7cm93LWdhcDouNXJlbX0uZ2FwLXktNHtyb3ctZ2FwOjFyZW19LmdhcC15LTZ7cm93LWdhcDoxLjVyZW19LmdhcC15LTh7cm93LWdhcDoycmVtfS5zcGFjZS14LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYyguMjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNwYWNlLXktMT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMjVyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc3BhY2UteS0xXC41Pjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYyguMzc1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguMzc1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKC41cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktND46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5vdmVyZmxvdy1hdXRve292ZXJmbG93OmF1dG99Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW59Lm92ZXJmbG93LWNsaXB7b3ZlcmZsb3c6Y2xpcH0ub3ZlcmZsb3ctc2Nyb2xse292ZXJmbG93OnNjcm9sbH0ub3ZlcmZsb3cteS1hdXRve292ZXJmbG93LXk6YXV0b30ub3ZlcmZsb3cteC1oaWRkZW57b3ZlcmZsb3cteDpoaWRkZW59Lm92ZXJmbG93LXktc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsfS50cnVuY2F0ZXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LndoaXRlc3BhY2Utbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0ucm91bmRlZHtib3JkZXItcmFkaXVzOi4yNXJlbX0ucm91bmRlZC1cW2luaGVyaXRcXXtib3JkZXItcmFkaXVzOmluaGVyaXR9LnJvdW5kZWQtZnVsbHtib3JkZXItcmFkaXVzOjk5OTlweH0ucm91bmRlZC1sZ3tib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LnJvdW5kZWQtbWR7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpfS5yb3VuZGVkLXNte2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gNHB4KX0uYm9yZGVye2JvcmRlci13aWR0aDoxcHh9LmJvcmRlci0yLC5ib3JkZXItXFsycHhcXXtib3JkZXItd2lkdGg6MnB4fS5ib3JkZXIteXtib3JkZXItdG9wLXdpZHRoOjFweDtib3JkZXItYm90dG9tLXdpZHRoOjFweH0uYm9yZGVyLWJ7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1se2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uYm9yZGVyLWwtMntib3JkZXItbGVmdC13aWR0aDoycHh9LmJvcmRlci1ye2JvcmRlci1yaWdodC13aWR0aDoxcHh9LmJvcmRlci10e2JvcmRlci10b3Atd2lkdGg6MXB4fS5ib3JkZXItYWNjZW50e2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJvcmRlci1ib3JkZXJ7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uYm9yZGVyLWNhcmR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1jYXJkKSl9LmJvcmRlci1ncmF5LTQwMHstLXR3LWJvcmRlci1vcGFjaXR5OiAxO2JvcmRlci1jb2xvcjpyZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpfS5ib3JkZXItaW5wdXR7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1pbnB1dCkpfS5ib3JkZXItcHJpbWFyeXtib3JkZXItY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uYm9yZGVyLXRyYW5zcGFyZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uYm9yZGVyLWwtdHJhbnNwYXJlbnR7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci10LXRyYW5zcGFyZW50e2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9LmJnLWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYmctYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmJnLWJhY2tncm91bmRcLzgwe2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpIC8gLjgpfS5iZy1ib3JkZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJnLWNhcmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5iZy1jYXJkLWZvcmVncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tY2FyZC1mb3JlZ3JvdW5kKSl9LmJnLWRlc3RydWN0aXZle2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlKSl9LmJnLWdyYXktMzAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMDkgMjEzIDIxOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctZ3JheS01MDB7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1tdXRlZHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS5iZy1wb3BvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXBvcG92ZXIpKX0uYmctcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJnLXJlZC01MDB7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDIzOSA2OCA2OCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkpfS5iZy10cmFuc3BhcmVudHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5iZy13aGl0ZXstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYWRpZW50LXRvLWJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHZhcigtLXR3LWdyYWRpZW50LXN0b3BzKSl9LmZyb20tdHJhbnNwYXJlbnR7LS10dy1ncmFkaWVudC1mcm9tOiB0cmFuc3BhcmVudCB2YXIoLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uKTstLXR3LWdyYWRpZW50LXRvOiByZ2IoMCAwIDAgLyAwKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbik7LS10dy1ncmFkaWVudC1zdG9wczogdmFyKC0tdHctZ3JhZGllbnQtZnJvbSksIHZhcigtLXR3LWdyYWRpZW50LXRvKX0udG8tYmFja2dyb3VuZHstLXR3LWdyYWRpZW50LXRvOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpIHZhcigtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uKX0uZmlsbC1jdXJyZW50e2ZpbGw6Y3VycmVudENvbG9yfS5maWxsLXdoaXRle2ZpbGw6I2ZmZn0uc3Ryb2tlLVxbMnB4XF17c3Ryb2tlLXdpZHRoOjJweH0uc3Ryb2tlLVxbM3B4XF17c3Ryb2tlLXdpZHRoOjNweH0ub2JqZWN0LWNvbnRhaW57LW8tb2JqZWN0LWZpdDpjb250YWluO29iamVjdC1maXQ6Y29udGFpbn0ucC0we3BhZGRpbmc6MH0ucC0xe3BhZGRpbmc6LjI1cmVtfS5wLTEwe3BhZGRpbmc6Mi41cmVtfS5wLTJ7cGFkZGluZzouNXJlbX0ucC0ze3BhZGRpbmc6Ljc1cmVtfS5wLTR7cGFkZGluZzoxcmVtfS5wLTZ7cGFkZGluZzoxLjVyZW19LnAtXFsxcHhcXXtwYWRkaW5nOjFweH0ucHgtMXtwYWRkaW5nLWxlZnQ6LjI1cmVtO3BhZGRpbmctcmlnaHQ6LjI1cmVtfS5weC0ye3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5weC0yXC41e3BhZGRpbmctbGVmdDouNjI1cmVtO3BhZGRpbmctcmlnaHQ6LjYyNXJlbX0ucHgtM3twYWRkaW5nLWxlZnQ6Ljc1cmVtO3BhZGRpbmctcmlnaHQ6Ljc1cmVtfS5weC00e3BhZGRpbmctbGVmdDoxcmVtO3BhZGRpbmctcmlnaHQ6MXJlbX0ucHgtNXtwYWRkaW5nLWxlZnQ6MS4yNXJlbTtwYWRkaW5nLXJpZ2h0OjEuMjVyZW19LnB4LTh7cGFkZGluZy1sZWZ0OjJyZW07cGFkZGluZy1yaWdodDoycmVtfS5weC1cWzI0cHhcXXtwYWRkaW5nLWxlZnQ6MjRweDtwYWRkaW5nLXJpZ2h0OjI0cHh9LnB5LTF7cGFkZGluZy10b3A6LjI1cmVtO3BhZGRpbmctYm90dG9tOi4yNXJlbX0ucHktMVwuNXtwYWRkaW5nLXRvcDouMzc1cmVtO3BhZGRpbmctYm90dG9tOi4zNzVyZW19LnB5LTJ7cGFkZGluZy10b3A6LjVyZW07cGFkZGluZy1ib3R0b206LjVyZW19LnB5LTN7cGFkZGluZy10b3A6Ljc1cmVtO3BhZGRpbmctYm90dG9tOi43NXJlbX0ucHktNHtwYWRkaW5nLXRvcDoxcmVtO3BhZGRpbmctYm90dG9tOjFyZW19LnB5LTZ7cGFkZGluZy10b3A6MS41cmVtO3BhZGRpbmctYm90dG9tOjEuNXJlbX0ucHktN3twYWRkaW5nLXRvcDoxLjc1cmVtO3BhZGRpbmctYm90dG9tOjEuNzVyZW19LnB5LVxbMnB4XF17cGFkZGluZy10b3A6MnB4O3BhZGRpbmctYm90dG9tOjJweH0ucGItMHtwYWRkaW5nLWJvdHRvbTowfS5wYi0yMHtwYWRkaW5nLWJvdHRvbTo1cmVtfS5wYi00e3BhZGRpbmctYm90dG9tOjFyZW19LnBsLTZ7cGFkZGluZy1sZWZ0OjEuNXJlbX0ucGwtOHtwYWRkaW5nLWxlZnQ6MnJlbX0ucHItMntwYWRkaW5nLXJpZ2h0Oi41cmVtfS5wdC0we3BhZGRpbmctdG9wOjB9LnB0LTF7cGFkZGluZy10b3A6LjI1cmVtfS5wdC0ye3BhZGRpbmctdG9wOi41cmVtfS5wdC00e3BhZGRpbmctdG9wOjFyZW19LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LXN0YXJ0e3RleHQtYWxpZ246c3RhcnR9LmZvbnQtc2Fuc3tmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZn0uZm9udC1zZXJpZntmb250LWZhbWlseTpTcGFjZSBNb25vLG1vbm9zcGFjZX0udGV4dC0yeGx7Zm9udC1zaXplOjEuNXJlbTtsaW5lLWhlaWdodDoycmVtfS50ZXh0LTN4bHtmb250LXNpemU6MS44NzVyZW07bGluZS1oZWlnaHQ6Mi4yNXJlbX0udGV4dC00eGx7Zm9udC1zaXplOjIuMjVyZW07bGluZS1oZWlnaHQ6Mi41cmVtfS50ZXh0LVxbMFwuOHJlbVxde2ZvbnQtc2l6ZTouOHJlbX0udGV4dC1cWzEycHhcXXtmb250LXNpemU6MTJweH0udGV4dC1sZ3tmb250LXNpemU6MS4xMjVyZW07bGluZS1oZWlnaHQ6MS43NXJlbX0udGV4dC1zbXtmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS50ZXh0LXhse2ZvbnQtc2l6ZToxLjI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQteHN7Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5mb250LVxbMTJweFxde2ZvbnQtd2VpZ2h0OjEycHh9LmZvbnQtXFs0MDBcXXtmb250LXdlaWdodDo0MDB9LmZvbnQtXFs1MDBcXXtmb250LXdlaWdodDo1MDB9LmZvbnQtXFs1NTBcXXtmb250LXdlaWdodDo1NTB9LmZvbnQtYm9sZHtmb250LXdlaWdodDo3MDB9LmZvbnQtZXh0cmFib2xke2ZvbnQtd2VpZ2h0OjgwMH0uZm9udC1tZWRpdW17Zm9udC13ZWlnaHQ6NTAwfS5mb250LW5vcm1hbHtmb250LXdlaWdodDo0MDB9LmZvbnQtc2VtaWJvbGR7Zm9udC13ZWlnaHQ6NjAwfS51cHBlcmNhc2V7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS5pdGFsaWN7Zm9udC1zdHlsZTppdGFsaWN9LmxlYWRpbmctNHtsaW5lLWhlaWdodDoxcmVtfS5sZWFkaW5nLW5vbmV7bGluZS1oZWlnaHQ6MX0udHJhY2tpbmctXFswXC4wNGVtXF17bGV0dGVyLXNwYWNpbmc6LjA0ZW19LnRyYWNraW5nLXRpZ2h0e2xldHRlci1zcGFjaW5nOi0uMDI1ZW19LnRyYWNraW5nLXdpZGVye2xldHRlci1zcGFjaW5nOi4wNWVtfS50cmFja2luZy13aWRlc3R7bGV0dGVyLXNwYWNpbmc6LjFlbX0udGV4dC1hY2NlbnR7Y29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS50ZXh0LWFjY2VudC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS50ZXh0LWJhY2tncm91bmR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0udGV4dC1jYXJkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS50ZXh0LWN1cnJlbnR7Y29sb3I6Y3VycmVudENvbG9yfS50ZXh0LWRlc3RydWN0aXZle2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS50ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLWRlc3RydWN0aXZlLWZvcmVncm91bmQpKX0udGV4dC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LnRleHQtbXV0ZWR7Y29sb3I6aHNsKHZhcigtLW11dGVkKSl9LnRleHQtbXV0ZWQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS50ZXh0LXBvcG92ZXItZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tcG9wb3Zlci1mb3JlZ3JvdW5kKSl9LnRleHQtcHJpbWFyeXtjb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS50ZXh0LXByaW1hcnktZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LnRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXNlY29uZGFyeS1mb3JlZ3JvdW5kKSl9LnRleHQtd2hpdGV7LS10dy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSl9LnVuZGVybGluZXt0ZXh0LWRlY29yYXRpb24tbGluZTp1bmRlcmxpbmV9LmxpbmUtdGhyb3VnaHt0ZXh0LWRlY29yYXRpb24tbGluZTpsaW5lLXRocm91Z2h9LnVuZGVybGluZS1vZmZzZXQtNHt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6NHB4fS5hbnRpYWxpYXNlZHstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0ub3BhY2l0eS0we29wYWNpdHk6MH0ub3BhY2l0eS0xMDB7b3BhY2l0eToxfS5vcGFjaXR5LTUwe29wYWNpdHk6LjV9Lm9wYWNpdHktNjB7b3BhY2l0eTouNn0ub3BhY2l0eS03MHtvcGFjaXR5Oi43fS5vcGFjaXR5LTc1e29wYWNpdHk6Ljc1fS5zaGFkb3d7LS10dy1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYigwIDAgMCAvIC4xKSwgMCAxcHggMnB4IC0xcHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDNweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMXB4IDJweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LWxney0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIC4xKSwgMCA0cHggNnB4IC00cHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSx2YXIoLS10dy1zaGFkb3cpfS5zaGFkb3ctbWR7LS10dy1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gLjEpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgNHB4IDZweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMnB4IDRweCAtMnB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LXNtey0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAuMDUpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDJweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0ub3V0bGluZS1ub25le291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0ub3V0bGluZXtvdXRsaW5lLXN0eWxlOnNvbGlkfS5yaW5nLTB7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygwcHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5yaW5nLW9mZnNldC1iYWNrZ3JvdW5key0tdHctcmluZy1vZmZzZXQtY29sb3I6IGhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmRyb3Atc2hhZG93LTJ4bHstLXR3LWRyb3Atc2hhZG93OiBkcm9wLXNoYWRvdygwIDI1cHggMjVweCByZ2IoMCAwIDAgLyAuMTUpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZHJvcC1zaGFkb3ctXFswcHhfMHB4XzEycHhfcmdiYVwoNTZcLDIwNVwsMTUyXCwwXC42MFwpXF17LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMHB4IDBweCAxMnB4IHJnYmEoNTYsMjA1LDE1MiwuNikpO2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5maWx0ZXJ7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmJhY2tkcm9wLWJsdXItc217LS10dy1iYWNrZHJvcC1ibHVyOiBibHVyKDRweCk7LXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpO2JhY2tkcm9wLWZpbHRlcjp2YXIoLS10dy1iYWNrZHJvcC1ibHVyKSB2YXIoLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzKSB2YXIoLS10dy1iYWNrZHJvcC1jb250cmFzdCkgdmFyKC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlKSB2YXIoLS10dy1iYWNrZHJvcC1odWUtcm90YXRlKSB2YXIoLS10dy1iYWNrZHJvcC1pbnZlcnQpIHZhcigtLXR3LWJhY2tkcm9wLW9wYWNpdHkpIHZhcigtLXR3LWJhY2tkcm9wLXNhdHVyYXRlKSB2YXIoLS10dy1iYWNrZHJvcC1zZXBpYSl9LnRyYW5zaXRpb24tYWxse3RyYW5zaXRpb24tcHJvcGVydHk6YWxsO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1jb2xvcnN7dHJhbnNpdGlvbi1wcm9wZXJ0eTpjb2xvcixiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcix0ZXh0LWRlY29yYXRpb24tY29sb3IsZmlsbCxzdHJva2U7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS50cmFuc2l0aW9uLW9wYWNpdHl7dHJhbnNpdGlvbi1wcm9wZXJ0eTpvcGFjaXR5O3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi10cmFuc2Zvcm17dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm07dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0xNTB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7dHJhbnNpdGlvbi1kdXJhdGlvbjouMnN9LmVhc2UtaW4tb3V0e3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfUBrZXlmcmFtZXMgZW50ZXJ7MCV7b3BhY2l0eTp2YXIoLS10dy1lbnRlci1vcGFjaXR5LCAxKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QodmFyKC0tdHctZW50ZXItdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSx2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZW50ZXItcm90YXRlLCAwKSl9fUBrZXlmcmFtZXMgZXhpdHt0b3tvcGFjaXR5OnZhcigtLXR3LWV4aXQtb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXgsIDApLHZhcigtLXR3LWV4aXQtdHJhbnNsYXRlLXksIDApLDApIHNjYWxlM2QodmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSksdmFyKC0tdHctZXhpdC1zY2FsZSwgMSkpIHJvdGF0ZSh2YXIoLS10dy1leGl0LXJvdGF0ZSwgMCkpfX0uYW5pbWF0ZS1pbnthbmltYXRpb24tbmFtZTplbnRlcjthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWVudGVyLW9wYWNpdHk6IGluaXRpYWw7LS10dy1lbnRlci1zY2FsZTogaW5pdGlhbDstLXR3LWVudGVyLXJvdGF0ZTogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXk6IGluaXRpYWx9LmZhZGUtaW4tMHstLXR3LWVudGVyLW9wYWNpdHk6IDB9Lnpvb20taW4tOTV7LS10dy1lbnRlci1zY2FsZTogLjk1fS5kdXJhdGlvbi0xNTB7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXN9LmR1cmF0aW9uLTIwMHthbmltYXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpfS5maWxlXDpib3JkZXItMDo6ZmlsZS1zZWxlY3Rvci1idXR0b257Ym9yZGVyLXdpZHRoOjBweH0uZmlsZVw6YmctdHJhbnNwYXJlbnQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmZpbGVcOnRleHQtc206OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuMjVyZW19LmZpbGVcOmZvbnQtbWVkaXVtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXdlaWdodDo1MDB9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0ucGxhY2Vob2xkZXJcOnRleHQtbXV0ZWQtZm9yZWdyb3VuZDo6cGxhY2Vob2xkZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZm9jdXMtd2l0aGluXDpyZWxhdGl2ZTpmb2N1cy13aXRoaW57cG9zaXRpb246cmVsYXRpdmV9LmhvdmVyXDp3LVxbMnB4XF06aG92ZXJ7d2lkdGg6MnB4fS5ob3Zlclw6dy1cWzNweFxdOmhvdmVye3dpZHRoOjNweH0uaG92ZXJcOmN1cnNvci1wb2ludGVyOmhvdmVye2N1cnNvcjpwb2ludGVyfS5ob3Zlclw6cm91bmRlZC1sZzpob3Zlcntib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LmhvdmVyXDpiZy1hY2NlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmhvdmVyXDpiZy1iYWNrZ3JvdW5kOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uaG92ZXJcOmJnLWJvcmRlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX0uaG92ZXJcOmJnLWRlc3RydWN0aXZlXC85MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkgLyAuOSl9LmhvdmVyXDpiZy1tdXRlZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS5ob3Zlclw6YmctcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmhvdmVyXDpiZy1wcmltYXJ5XC85MDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSAvIC45KX0uaG92ZXJcOmJnLXJlZC03MDA6aG92ZXJ7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDE4NSAyOCAyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uaG92ZXJcOmJnLXNlY29uZGFyeVwvODA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tc2Vjb25kYXJ5KSAvIC44KX0uaG92ZXJcOnRleHQtYWNjZW50LWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6aG92ZXJ7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uaG92ZXJcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uaG92ZXJcOnRleHQtd2hpdGU6aG92ZXJ7LS10dy10ZXh0LW9wYWNpdHk6IDE7Y29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSl9LmhvdmVyXDp1bmRlcmxpbmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5ob3Zlclw6b3BhY2l0eS0xMDA6aG92ZXJ7b3BhY2l0eToxfS5mb2N1c1w6YmctYWNjZW50OmZvY3Vze2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5mb2N1c1w6YmctcHJpbWFyeTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmZvY3VzXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5mb2N1c1w6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQ6Zm9jdXN7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS5mb2N1c1w6b3V0bGluZS1ub25lOmZvY3Vze291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0uZm9jdXNcOnJpbmctMjpmb2N1c3stLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTstLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDJweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLHZhcigtLXR3LXJpbmctc2hhZG93KSx2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCl9LmZvY3VzXDpyaW5nLXJpbmc6Zm9jdXN7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1c1w6cmluZy1vZmZzZXQtMjpmb2N1c3stLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtbm9uZTpmb2N1cy12aXNpYmxle291dGxpbmU6MnB4IHNvbGlkIHRyYW5zcGFyZW50O291dGxpbmUtb2Zmc2V0OjJweH0uZm9jdXMtdmlzaWJsZVw6b3V0bGluZS1hY2NlbnQ6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXMtdmlzaWJsZVw6cmluZy0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1cy12aXNpYmxlXDpyaW5nLXJpbmc6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctY29sb3I6IGhzbCh2YXIoLS1yaW5nKSl9LmZvY3VzLXZpc2libGVcOnJpbmctb2Zmc2V0LTI6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHh9LmZvY3VzLXZpc2libGVcOnJpbmctb2Zmc2V0LWJhY2tncm91bmQ6Zm9jdXMtdmlzaWJsZXstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kaXNhYmxlZFw6cG9pbnRlci1ldmVudHMtbm9uZTpkaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lfS5kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2VkOmRpc2FibGVke2N1cnNvcjpub3QtYWxsb3dlZH0uZGlzYWJsZWRcOnRleHQtYmFja2dyb3VuZDpkaXNhYmxlZHtjb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kaXNhYmxlZFw6b3BhY2l0eS01MDpkaXNhYmxlZHtvcGFjaXR5Oi41fS5wZWVyOmRpc2FibGVkfi5wZWVyLWRpc2FibGVkXDpjdXJzb3Itbm90LWFsbG93ZWR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5wZWVyOmRpc2FibGVkfi5wZWVyLWRpc2FibGVkXDpvcGFjaXR5LTcwe29wYWNpdHk6Ljd9LmFyaWEtc2VsZWN0ZWRcOmJnLWFjY2VudFthcmlhLXNlbGVjdGVkPXRydWVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5hcmlhLXNlbGVjdGVkXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2FyaWEtc2VsZWN0ZWQ9dHJ1ZV17Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmFyaWEtc2VsZWN0ZWRcOm9wYWNpdHktMTAwW2FyaWEtc2VsZWN0ZWQ9dHJ1ZV17b3BhY2l0eToxfS5kYXRhLVxbZGlzYWJsZWRcXVw6cG9pbnRlci1ldmVudHMtbm9uZVtkYXRhLWRpc2FibGVkXXtwb2ludGVyLWV2ZW50czpub25lfS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPWJvdHRvbV17LS10dy10cmFuc2xhdGUteTogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDotdHJhbnNsYXRlLXgtMVtkYXRhLXNpZGU9bGVmdF17LS10dy10cmFuc2xhdGUteDogLS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LXRyYW5zbGF0ZS14OiAuMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD10b3BcXVw6LXRyYW5zbGF0ZS15LTFbZGF0YS1zaWRlPXRvcF17LS10dy10cmFuc2xhdGUteTogLS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOnRyYW5zbGF0ZS14LTVbZGF0YS1zdGF0ZT1jaGVja2VkXXstLXR3LXRyYW5zbGF0ZS14OiAxLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc3RhdGVcPXVuY2hlY2tlZFxdXDp0cmFuc2xhdGUteC0wW2RhdGEtc3RhdGU9dW5jaGVja2VkXXstLXR3LXRyYW5zbGF0ZS14OiAwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9QGtleWZyYW1lcyBhY2NvcmRpb24tdXB7MCV7aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9dG97aGVpZ2h0OjB9fS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLWFjY29yZGlvbi11cFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uOmFjY29yZGlvbi11cCAuMnMgZWFzZS1vdXR9QGtleWZyYW1lcyBhY2NvcmRpb24tZG93bnswJXtoZWlnaHQ6MH10b3toZWlnaHQ6dmFyKC0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0KX19LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWFjY29yZGlvbi1kb3duW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uOmFjY29yZGlvbi1kb3duIC4ycyBlYXNlLW91dH0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6YmctYmFja2dyb3VuZFtkYXRhLXN0YXRlPWFjdGl2ZV17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctYWNjZW50W2RhdGEtc3RhdGU9Y2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDpiZy1wcmltYXJ5W2RhdGEtc3RhdGU9Y2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPW9uXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPW9uXSwuZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPW9wZW5de2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPXVuY2hlY2tlZFxdXDpiZy1wcmltYXJ5W2RhdGEtc3RhdGU9dW5jaGVja2VkXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOnRleHQtZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWFjdGl2ZV17Y29sb3I6aHNsKHZhcigtLWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9Y2hlY2tlZF17Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9uXF1cOnRleHQtYWNjZW50LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1vbl17Y29sb3I6aHNsKHZhcigtLWFjY2VudC1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmRbZGF0YS1zdGF0ZT1vcGVuXXtjb2xvcjpoc2wodmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbZGlzYWJsZWRcXVw6b3BhY2l0eS01MFtkYXRhLWRpc2FibGVkXXtvcGFjaXR5Oi41fS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDpzaGFkb3ctc21bZGF0YS1zdGF0ZT1hY3RpdmVdey0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAuMDUpOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDJweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmFuaW1hdGUtaW5bZGF0YS1zdGF0ZT1vcGVuXXthbmltYXRpb24tbmFtZTplbnRlcjthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWVudGVyLW9wYWNpdHk6IGluaXRpYWw7LS10dy1lbnRlci1zY2FsZTogaW5pdGlhbDstLXR3LWVudGVyLXJvdGF0ZTogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiBpbml0aWFsOy0tdHctZW50ZXItdHJhbnNsYXRlLXk6IGluaXRpYWx9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOmFuaW1hdGUtb3V0W2RhdGEtc3RhdGU9Y2xvc2VkXXthbmltYXRpb24tbmFtZTpleGl0O2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzOy0tdHctZXhpdC1vcGFjaXR5OiBpbml0aWFsOy0tdHctZXhpdC1zY2FsZTogaW5pdGlhbDstLXR3LWV4aXQtcm90YXRlOiBpbml0aWFsOy0tdHctZXhpdC10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXk6IGluaXRpYWx9LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOmZhZGUtb3V0LTBbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1vcGFjaXR5OiAwfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6ZmFkZS1pbi0wW2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci1vcGFjaXR5OiAwfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDp6b29tLW91dC05NVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXNjYWxlOiAuOTV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDp6b29tLWluLTk1W2RhdGEtc3RhdGU9b3Blbl17LS10dy1lbnRlci1zY2FsZTogLjk1fS5kYXRhLVxbc2lkZVw9Ym90dG9tXF1cOnNsaWRlLWluLWZyb20tdG9wLTJbZGF0YS1zaWRlPWJvdHRvbV17LS10dy1lbnRlci10cmFuc2xhdGUteTogLS41cmVtfS5kYXRhLVxbc2lkZVw9bGVmdFxdXDpzbGlkZS1pbi1mcm9tLXJpZ2h0LTJbZGF0YS1zaWRlPWxlZnRdey0tdHctZW50ZXItdHJhbnNsYXRlLXg6IC41cmVtfS5kYXRhLVxbc2lkZVw9cmlnaHRcXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTJbZGF0YS1zaWRlPXJpZ2h0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtLjVyZW19LmRhdGEtXFtzaWRlXD10b3BcXVw6c2xpZGUtaW4tZnJvbS1ib3R0b20tMltkYXRhLXNpZGU9dG9wXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAuNXJlbX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLWxlZnQtMVwvMltkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpzbGlkZS1vdXQtdG8tdG9wLVxbNDhcJVxdW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtdHJhbnNsYXRlLXk6IC00OCV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpzbGlkZS1pbi1mcm9tLWxlZnQtMVwvMltkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItdHJhbnNsYXRlLXg6IC01MCV9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpzbGlkZS1pbi1mcm9tLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC00OCV9OmlzKFtkYXRhLW1vZGU9ZGFya10gLmRhcmtcOmJvcmRlci13aGl0ZSl7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX1AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpey5zbVw6bXQtMHttYXJnaW4tdG9wOjB9LnNtXDpibG9ja3tkaXNwbGF5OmJsb2NrfS5zbVw6ZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5zbVw6anVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zbVw6c3BhY2UteC0yPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC41cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYyguNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXgtND46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYygxcmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7bWFyZ2luLWxlZnQ6Y2FsYygxcmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zbVw6c3BhY2UteS0wPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteS1yZXZlcnNlOiAwO21hcmdpbi10b3A6Y2FsYygwcHggKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDBweCAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zbVw6cm91bmRlZC1sZ3tib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyl9LnNtXDpwLTB7cGFkZGluZzowfS5zbVw6dGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH19QG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KXsubWRcOnctZnVsbHt3aWR0aDoxMDAlfX0uXFtcJlw6aGFzXChcW2FyaWEtc2VsZWN0ZWRcXVwpXF1cOmJnLWFjY2VudDpoYXMoW2FyaWEtc2VsZWN0ZWRdKXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZmlyc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLWwtbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ubGFzdFw6XFtcJlw6aGFzXChcW2FyaWEtc2VsZWN0ZWRcXVwpXF1cOnJvdW5kZWQtci1tZDpoYXMoW2FyaWEtc2VsZWN0ZWRdKTpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCk7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0uXFtcJlxbZGF0YS1zdGF0ZVw9b3BlblxdXD5zdmdcXVw6cm90YXRlLTE4MFtkYXRhLXN0YXRlPW9wZW5dPnN2Z3stLXR3LXJvdGF0ZTogMTgwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6cHgtMiBbY21kay1ncm91cC1oZWFkaW5nXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB5LTFcLjUgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC14cyBbY21kay1ncm91cC1oZWFkaW5nXXtmb250LXNpemU6Ljc1cmVtO2xpbmUtaGVpZ2h0OjFyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpmb250LW1lZGl1bSBbY21kay1ncm91cC1oZWFkaW5nXXtmb250LXdlaWdodDo1MDB9LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDp0ZXh0LW11dGVkLWZvcmVncm91bmQgW2NtZGstZ3JvdXAtaGVhZGluZ117Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uXFtcJl9cW2NtZGstZ3JvdXBcXVw6bm90XChcW2hpZGRlblxdXClfXH5cW2NtZGstZ3JvdXBcXVxdXDpwdC0wIFtjbWRrLWdyb3VwXTpub3QoW2hpZGRlbl0pfltjbWRrLWdyb3VwXXtwYWRkaW5nLXRvcDowfS5cW1wmX1xbY21kay1ncm91cFxdXF1cOnB4LTIgW2NtZGstZ3JvdXBde3BhZGRpbmctbGVmdDouNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOmgtNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7aGVpZ2h0OjEuMjVyZW19LlxbXCZfXFtjbWRrLWlucHV0LXdyYXBwZXJcXV9zdmdcXVw6dy01IFtjbWRrLWlucHV0LXdyYXBwZXJdIHN2Z3t3aWR0aDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dFxdXF1cOmgtMTIgW2NtZGstaW5wdXRde2hlaWdodDozcmVtfS5cW1wmX1xbY21kay1pdGVtXF1cXVw6cHgtMiBbY21kay1pdGVtXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB5LTMgW2NtZGstaXRlbV17cGFkZGluZy10b3A6Ljc1cmVtO3BhZGRpbmctYm90dG9tOi43NXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDpoLTUgW2NtZGstaXRlbV0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pdGVtXF1fc3ZnXF1cOnctNSBbY21kay1pdGVtXSBzdmd7d2lkdGg6MS4yNXJlbX0K","/assets/index-ytYjbYsf.js":"dmFyIHZiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeWI9KHQsZSxuKT0+ZSBpbiB0P3ZiKHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjt2YXIgSmU9KHQsZSxuKT0+KHliKHQsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSxuKSxuKSx4Yj0odCxlLG4pPT57aWYoIWUuaGFzKHQpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciB0aD0odCxlLG4pPT57aWYoZS5oYXModCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ZSBpbnN0YW5jZW9mIFdlYWtTZXQ/ZS5hZGQodCk6ZS5zZXQodCxuKX07dmFyIEd1PSh0LGUsbik9Pih4Yih0LGUsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIGtfKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9ZVtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgaSBpbiByKWlmKGkhPT0iZGVmYXVsdCImJiEoaSBpbiB0KSl7Y29uc3Qgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSk7byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltpXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKGUmJmUuc3VwcG9ydHMmJmUuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IGkgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIoaSk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoaT0+e2Zvcihjb25zdCBvIG9mIGkpaWYoby50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2Ygby5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4oaSl7Y29uc3Qgbz17fTtyZXR1cm4gaS5pbnRlZ3JpdHkmJihvLmludGVncml0eT1pLmludGVncml0eSksaS5yZWZlcnJlclBvbGljeSYmKG8ucmVmZXJyZXJQb2xpY3k9aS5yZWZlcnJlclBvbGljeSksaS5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP28uY3JlZGVudGlhbHM9ImluY2x1ZGUiOmkuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9vLmNyZWRlbnRpYWxzPSJvbWl0IjpvLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsb31mdW5jdGlvbiByKGkpe2lmKGkuZXApcmV0dXJuO2kuZXA9ITA7Y29uc3Qgbz1uKGkpO2ZldGNoKGkuaHJlZixvKX19KSgpO2Z1bmN0aW9uIFR1KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9dmFyIGJfPXtleHBvcnRzOnt9fSxQZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBOdT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksX2I9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksd2I9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxTYj1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLEViPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksQ2I9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxrYj1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksYmI9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSwkYj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFRiPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxOYj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksY3k9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFJiKHQpe3JldHVybiB0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiP251bGw6KHQ9Y3kmJnRbY3ldfHx0WyJAQGl0ZXJhdG9yIl0sdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dDpudWxsKX12YXIgJF89e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LFRfPU9iamVjdC5hc3NpZ24sTl89e307ZnVuY3Rpb24geXModCxlLG4pe3RoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLnJlZnM9Tl8sdGhpcy51cGRhdGVyPW58fCRffXlzLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O3lzLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiImJnQhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyx0LGUsInNldFN0YXRlIil9O3lzLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsdCwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gUl8oKXt9Ul8ucHJvdG90eXBlPXlzLnByb3RvdHlwZTtmdW5jdGlvbiBKZyh0LGUsbil7dGhpcy5wcm9wcz10LHRoaXMuY29udGV4dD1lLHRoaXMucmVmcz1OXyx0aGlzLnVwZGF0ZXI9bnx8JF99dmFyIHFnPUpnLnByb3RvdHlwZT1uZXcgUl87cWcuY29uc3RydWN0b3I9Smc7VF8ocWcseXMucHJvdG90eXBlKTtxZy5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgZHk9QXJyYXkuaXNBcnJheSxPXz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGVtPXtjdXJyZW50Om51bGx9LFBfPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gQV8odCxlLG4pe3ZhciByLGk9e30sbz1udWxsLGw9bnVsbDtpZihlIT1udWxsKWZvcihyIGluIGUucmVmIT09dm9pZCAwJiYobD1lLnJlZiksZS5rZXkhPT12b2lkIDAmJihvPSIiK2Uua2V5KSxlKU9fLmNhbGwoZSxyKSYmIVBfLmhhc093blByb3BlcnR5KHIpJiYoaVtyXT1lW3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpaS5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtpLmNoaWxkcmVuPWF9aWYodCYmdC5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz10LmRlZmF1bHRQcm9wcyxzKWlbcl09PT12b2lkIDAmJihpW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpOdSx0eXBlOnQsa2V5Om8scmVmOmwscHJvcHM6aSxfb3duZXI6ZW0uY3VycmVudH19ZnVuY3Rpb24gT2IodCxlKXtyZXR1cm57JCR0eXBlb2Y6TnUsdHlwZTp0LnR5cGUsa2V5OmUscmVmOnQucmVmLHByb3BzOnQucHJvcHMsX293bmVyOnQuX293bmVyfX1mdW5jdGlvbiB0bSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmdC4kJHR5cGVvZj09PU51fWZ1bmN0aW9uIFBiKHQpe3ZhciBlPXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK3QucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfSl9dmFyIGZ5PS9cLysvZztmdW5jdGlvbiBuaCh0LGUpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsJiZ0LmtleSE9bnVsbD9QYigiIit0LmtleSk6ZS50b1N0cmluZygzNil9ZnVuY3Rpb24gVGModCxlLG4scixpKXt2YXIgbz10eXBlb2YgdDsobz09PSJ1bmRlZmluZWQifHxvPT09ImJvb2xlYW4iKSYmKHQ9bnVsbCk7dmFyIGw9ITE7aWYodD09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChvKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIE51OmNhc2UgX2I6bD0hMH19aWYobClyZXR1cm4gbD10LGk9aShsKSx0PXI9PT0iIj8iLiIrbmgobCwwKTpyLGR5KGkpPyhuPSIiLHQhPW51bGwmJihuPXQucmVwbGFjZShmeSwiJCYvIikrIi8iKSxUYyhpLGUsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTppIT1udWxsJiYodG0oaSkmJihpPU9iKGksbisoIWkua2V5fHxsJiZsLmtleT09PWkua2V5PyIiOigiIitpLmtleSkucmVwbGFjZShmeSwiJCYvIikrIi8iKSt0KSksZS5wdXNoKGkpKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsZHkodCkpZm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKyspe289dFtzXTt2YXIgYT1yK25oKG8scyk7bCs9VGMobyxlLG4sYSxpKX1lbHNlIGlmKGE9UmIodCksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKHQ9YS5jYWxsKHQpLHM9MDshKG89dC5uZXh0KCkpLmRvbmU7KW89by52YWx1ZSxhPXIrbmgobyxzKyspLGwrPVRjKG8sZSxuLGEsaSk7ZWxzZSBpZihvPT09Im9iamVjdCIpdGhyb3cgZT1TdHJpbmcodCksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisoZT09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHQpLmpvaW4oIiwgIikrIn0iOmUpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gWXUodCxlLG4pe2lmKHQ9PW51bGwpcmV0dXJuIHQ7dmFyIHI9W10saT0wO3JldHVybiBUYyh0LHIsIiIsIiIsZnVuY3Rpb24obyl7cmV0dXJuIGUuY2FsbChuLG8saSsrKX0pLHJ9ZnVuY3Rpb24gQWIodCl7aWYodC5fc3RhdHVzPT09LTEpe3ZhciBlPXQuX3Jlc3VsdDtlPWUoKSxlLnRoZW4oZnVuY3Rpb24obil7KHQuX3N0YXR1cz09PTB8fHQuX3N0YXR1cz09PS0xKSYmKHQuX3N0YXR1cz0xLHQuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KHQuX3N0YXR1cz09PTB8fHQuX3N0YXR1cz09PS0xKSYmKHQuX3N0YXR1cz0yLHQuX3Jlc3VsdD1uKX0pLHQuX3N0YXR1cz09PS0xJiYodC5fc3RhdHVzPTAsdC5fcmVzdWx0PWUpfWlmKHQuX3N0YXR1cz09PTEpcmV0dXJuIHQuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IHQuX3Jlc3VsdH12YXIgeG49e2N1cnJlbnQ6bnVsbH0sTmM9e3RyYW5zaXRpb246bnVsbH0sTWI9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6eG4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6TmMsUmVhY3RDdXJyZW50T3duZXI6ZW19O1BlLkNoaWxkcmVuPXttYXA6WXUsZm9yRWFjaDpmdW5jdGlvbih0LGUsbil7WXUodCxmdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm4gWXUodCxmdW5jdGlvbigpe2UrK30pLGV9LHRvQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIFl1KHQsZnVuY3Rpb24oZSl7cmV0dXJuIGV9KXx8W119LG9ubHk6ZnVuY3Rpb24odCl7aWYoIXRtKHQpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gdH19O1BlLkNvbXBvbmVudD15cztQZS5GcmFnbWVudD13YjtQZS5Qcm9maWxlcj1FYjtQZS5QdXJlQ29tcG9uZW50PUpnO1BlLlN0cmljdE1vZGU9U2I7UGUuU3VzcGVuc2U9JGI7UGUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9TWI7UGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXtpZih0PT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK3QrIi4iKTt2YXIgcj1UXyh7fSx0LnByb3BzKSxpPXQua2V5LG89dC5yZWYsbD10Ll9vd25lcjtpZihlIT1udWxsKXtpZihlLnJlZiE9PXZvaWQgMCYmKG89ZS5yZWYsbD1lbS5jdXJyZW50KSxlLmtleSE9PXZvaWQgMCYmKGk9IiIrZS5rZXkpLHQudHlwZSYmdC50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz10LnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIGUpT18uY2FsbChlLGEpJiYhUF8uaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPWVbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTplW2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOk51LHR5cGU6dC50eXBlLGtleTppLHJlZjpvLHByb3BzOnIsX293bmVyOmx9fTtQZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXskJHR5cGVvZjprYixfY3VycmVudFZhbHVlOnQsX2N1cnJlbnRWYWx1ZTI6dCxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LHQuUHJvdmlkZXI9eyQkdHlwZW9mOkNiLF9jb250ZXh0OnR9LHQuQ29uc3VtZXI9dH07UGUuY3JlYXRlRWxlbWVudD1BXztQZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKHQpe3ZhciBlPUFfLmJpbmQobnVsbCx0KTtyZXR1cm4gZS50eXBlPXQsZX07UGUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1BlLmZvcndhcmRSZWY9ZnVuY3Rpb24odCl7cmV0dXJueyQkdHlwZW9mOmJiLHJlbmRlcjp0fX07UGUuaXNWYWxpZEVsZW1lbnQ9dG07UGUubGF6eT1mdW5jdGlvbih0KXtyZXR1cm57JCR0eXBlb2Y6TmIsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDp0fSxfaW5pdDpBYn19O1BlLm1lbW89ZnVuY3Rpb24odCxlKXtyZXR1cm57JCR0eXBlb2Y6VGIsdHlwZTp0LGNvbXBhcmU6ZT09PXZvaWQgMD9udWxsOmV9fTtQZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9TmMudHJhbnNpdGlvbjtOYy50cmFuc2l0aW9uPXt9O3RyeXt0KCl9ZmluYWxseXtOYy50cmFuc2l0aW9uPWV9fTtQZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07UGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4geG4uY3VycmVudC51c2VDYWxsYmFjayh0LGUpfTtQZS51c2VDb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jdXJyZW50LnVzZUNvbnRleHQodCl9O1BlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1BlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZSh0KX07UGUudXNlRWZmZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhuLmN1cnJlbnQudXNlRWZmZWN0KHQsZSl9O1BlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlSWQoKX07UGUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZSh0LGUsbil9O1BlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB4bi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdCh0LGUpfTtQZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geG4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QodCxlKX07UGUudXNlTWVtbz1mdW5jdGlvbih0LGUpe3JldHVybiB4bi5jdXJyZW50LnVzZU1lbW8odCxlKX07UGUudXNlUmVkdWNlcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlUmVkdWNlcih0LGUsbil9O1BlLnVzZVJlZj1mdW5jdGlvbih0KXtyZXR1cm4geG4uY3VycmVudC51c2VSZWYodCl9O1BlLnVzZVN0YXRlPWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jdXJyZW50LnVzZVN0YXRlKHQpfTtQZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHhuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUodCxlLG4pfTtQZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHhuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtQZS52ZXJzaW9uPSIxOC4yLjAiO2JfLmV4cG9ydHM9UGU7dmFyIHA9Yl8uZXhwb3J0cztjb25zdCByZT1UdShwKSxNXz1rXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpyZX0sW3BdKTt2YXIgWGg9e30sTF89e2V4cG9ydHM6e319LFZuPXt9LElfPXtleHBvcnRzOnt9fSxEXz17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShFLEEpe3ZhciBOPUUubGVuZ3RoO0UucHVzaChBKTtlOmZvcig7MDxOOyl7dmFyIEY9Ti0xPj4+MSxLPUVbRl07aWYoMDxpKEssQSkpRVtGXT1BLEVbTl09SyxOPUY7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBuKEUpe3JldHVybiBFLmxlbmd0aD09PTA/bnVsbDpFWzBdfWZ1bmN0aW9uIHIoRSl7aWYoRS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciBBPUVbMF0sTj1FLnBvcCgpO2lmKE4hPT1BKXtFWzBdPU47ZTpmb3IodmFyIEY9MCxLPUUubGVuZ3RoLGRlPUs+Pj4xO0Y8ZGU7KXt2YXIgc2U9MiooRisxKS0xLEFlPUVbc2VdLE5lPXNlKzEsUT1FW05lXTtpZigwPmkoQWUsTikpTmU8SyYmMD5pKFEsQWUpPyhFW0ZdPVEsRVtOZV09TixGPU5lKTooRVtGXT1BZSxFW3NlXT1OLEY9c2UpO2Vsc2UgaWYoTmU8SyYmMD5pKFEsTikpRVtGXT1RLEVbTmVdPU4sRj1OZTtlbHNlIGJyZWFrIGV9fXJldHVybiBBfWZ1bmN0aW9uIGkoRSxBKXt2YXIgTj1FLnNvcnRJbmRleC1BLnNvcnRJbmRleDtyZXR1cm4gTiE9PTA/TjpFLmlkLUEuaWR9aWYodHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIG89cGVyZm9ybWFuY2U7dC51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gby5ub3coKX19ZWxzZXt2YXIgbD1EYXRlLHM9bC5ub3coKTt0LnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpLXN9fXZhciBhPVtdLHU9W10sYz0xLGQ9bnVsbCxmPTMsaD0hMSxtPSExLGc9ITEsdz10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHk9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24geChFKXtmb3IodmFyIEE9bih1KTtBIT09bnVsbDspe2lmKEEuY2FsbGJhY2s9PT1udWxsKXIodSk7ZWxzZSBpZihBLnN0YXJ0VGltZTw9RSlyKHUpLEEuc29ydEluZGV4PUEuZXhwaXJhdGlvblRpbWUsZShhLEEpO2Vsc2UgYnJlYWs7QT1uKHUpfX1mdW5jdGlvbiBTKEUpe2lmKGc9ITEseChFKSwhbSlpZihuKGEpIT09bnVsbCltPSEwLEMoYik7ZWxzZXt2YXIgQT1uKHUpO0EhPT1udWxsJiZrKFMsQS5zdGFydFRpbWUtRSl9fWZ1bmN0aW9uIGIoRSxBKXttPSExLGcmJihnPSExLHYoTyksTz0tMSksaD0hMDt2YXIgTj1mO3RyeXtmb3IoeChBKSxkPW4oYSk7ZCE9PW51bGwmJighKGQuZXhwaXJhdGlvblRpbWU+QSl8fEUmJiFEKCkpOyl7dmFyIEY9ZC5jYWxsYmFjaztpZih0eXBlb2YgRj09ImZ1bmN0aW9uIil7ZC5jYWxsYmFjaz1udWxsLGY9ZC5wcmlvcml0eUxldmVsO3ZhciBLPUYoZC5leHBpcmF0aW9uVGltZTw9QSk7QT10LnVuc3RhYmxlX25vdygpLHR5cGVvZiBLPT0iZnVuY3Rpb24iP2QuY2FsbGJhY2s9SzpkPT09bihhKSYmcihhKSx4KEEpfWVsc2UgcihhKTtkPW4oYSl9aWYoZCE9PW51bGwpdmFyIGRlPSEwO2Vsc2V7dmFyIHNlPW4odSk7c2UhPT1udWxsJiZrKFMsc2Uuc3RhcnRUaW1lLUEpLGRlPSExfXJldHVybiBkZX1maW5hbGx5e2Q9bnVsbCxmPU4saD0hMX19dmFyIFQ9ITEsJD1udWxsLE89LTEsTD01LFA9LTE7ZnVuY3Rpb24gRCgpe3JldHVybiEodC51bnN0YWJsZV9ub3coKS1QPEwpfWZ1bmN0aW9uIEIoKXtpZigkIT09bnVsbCl7dmFyIEU9dC51bnN0YWJsZV9ub3coKTtQPUU7dmFyIEE9ITA7dHJ5e0E9JCghMCxFKX1maW5hbGx5e0E/b2UoKTooVD0hMSwkPW51bGwpfX1lbHNlIFQ9ITF9dmFyIG9lO2lmKHR5cGVvZiB5PT0iZnVuY3Rpb24iKW9lPWZ1bmN0aW9uKCl7eShCKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgSD1uZXcgTWVzc2FnZUNoYW5uZWwsWj1ILnBvcnQyO0gucG9ydDEub25tZXNzYWdlPUIsb2U9ZnVuY3Rpb24oKXtaLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIG9lPWZ1bmN0aW9uKCl7dyhCLDApfTtmdW5jdGlvbiBDKEUpeyQ9RSxUfHwoVD0hMCxvZSgpKX1mdW5jdGlvbiBrKEUsQSl7Tz13KGZ1bmN0aW9uKCl7RSh0LnVuc3RhYmxlX25vdygpKX0sQSl9dC51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSx0LnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsdC51bnN0YWJsZV9Mb3dQcmlvcml0eT00LHQudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9Myx0LnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLHQudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9Mix0LnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKEUpe0UuY2FsbGJhY2s9bnVsbH0sdC51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe218fGh8fChtPSEwLEMoYikpfSx0LnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKEUpezA+RXx8MTI1PEU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6TD0wPEU/TWF0aC5mbG9vcigxZTMvRSk6NX0sdC51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBmfSx0LnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oYSl9LHQudW5zdGFibGVfbmV4dD1mdW5jdGlvbihFKXtzd2l0Y2goZil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIEE9MzticmVhaztkZWZhdWx0OkE9Zn12YXIgTj1mO2Y9QTt0cnl7cmV0dXJuIEUoKX1maW5hbGx5e2Y9Tn19LHQudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9LHQudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fSx0LnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihFLEEpe3N3aXRjaChFKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6RT0zfXZhciBOPWY7Zj1FO3RyeXtyZXR1cm4gQSgpfWZpbmFsbHl7Zj1OfX0sdC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKEUsQSxOKXt2YXIgRj10LnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgTj09Im9iamVjdCImJk4hPT1udWxsPyhOPU4uZGVsYXksTj10eXBlb2YgTj09Im51bWJlciImJjA8Tj9GK046Rik6Tj1GLEUpe2Nhc2UgMTp2YXIgSz0tMTticmVhaztjYXNlIDI6Sz0yNTA7YnJlYWs7Y2FzZSA1Oks9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6Sz0xZTQ7YnJlYWs7ZGVmYXVsdDpLPTVlM31yZXR1cm4gSz1OK0ssRT17aWQ6YysrLGNhbGxiYWNrOkEscHJpb3JpdHlMZXZlbDpFLHN0YXJ0VGltZTpOLGV4cGlyYXRpb25UaW1lOkssc29ydEluZGV4Oi0xfSxOPkY/KEUuc29ydEluZGV4PU4sZSh1LEUpLG4oYSk9PT1udWxsJiZFPT09bih1KSYmKGc/KHYoTyksTz0tMSk6Zz0hMCxrKFMsTi1GKSkpOihFLnNvcnRJbmRleD1LLGUoYSxFKSxtfHxofHwobT0hMCxDKGIpKSksRX0sdC51bnN0YWJsZV9zaG91bGRZaWVsZD1ELHQudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKEUpe3ZhciBBPWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIE49ZjtmPUE7dHJ5e3JldHVybiBFLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2Y9Tn19fX0pKERfKTtJXy5leHBvcnRzPURfO3ZhciBMYj1JXy5leHBvcnRzOy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBqXz1wLEJuPUxiO2Z1bmN0aW9uIFcodCl7Zm9yKHZhciBlPSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK3Qsbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZSs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrdCsiOyB2aXNpdCAiK2UrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgel89bmV3IFNldCxJYT17fTtmdW5jdGlvbiBlbCh0LGUpe2VzKHQsZSksZXModCsiQ2FwdHVyZSIsZSl9ZnVuY3Rpb24gZXModCxlKXtmb3IoSWFbdF09ZSx0PTA7dDxlLmxlbmd0aDt0Kyspel8uYWRkKGVbdF0pfXZhciBkaT0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksUWg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJYj0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGh5PXt9LHB5PXt9O2Z1bmN0aW9uIERiKHQpe3JldHVybiBRaC5jYWxsKHB5LHQpPyEwOlFoLmNhbGwoaHksdCk/ITE6SWIudGVzdCh0KT9weVt0XT0hMDooaHlbdF09ITAsITEpfWZ1bmN0aW9uIGpiKHQsZSxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOih0PXQudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLHQhPT0iZGF0YS0iJiZ0IT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gemIodCxlLG4scil7aWYoZT09PW51bGx8fHR5cGVvZiBlPiJ1Inx8amIodCxlLG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIWU7Y2FzZSA0OnJldHVybiBlPT09ITE7Y2FzZSA1OnJldHVybiBpc05hTihlKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGUpfHwxPmV9cmV0dXJuITF9ZnVuY3Rpb24gX24odCxlLG4scixpLG8sbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9ZT09PTJ8fGU9PT0zfHxlPT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1pLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9dCx0aGlzLnR5cGU9ZSx0aGlzLnNhbml0aXplVVJMPW8sdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBHdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsMCwhMSx0LG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF07R3RbZV09bmV3IF9uKGUsMSwhMSx0WzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0d0W3RdPW5ldyBfbih0LDIsITEsdC50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwyLCExLHQsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0d0W3RdPW5ldyBfbih0LDMsITEsdC50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwzLCEwLHQsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsNCwhMSx0LG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCw2LCExLHQsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24odCl7R3RbdF09bmV3IF9uKHQsNSwhMSx0LnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgbm09L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHJtKHQpe3JldHVybiB0WzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKG5tLHJtKTtHdFtlXT1uZXcgX24oZSwxLCExLHQsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwxLCExLHQudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0d0LnhsaW5rSHJlZj1uZXcgX24oInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbih0KXtHdFt0XT1uZXcgX24odCwxLCExLHQudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIGltKHQsZSxuLHIpe3ZhciBpPUd0Lmhhc093blByb3BlcnR5KGUpP0d0W2VdOm51bGw7KGkhPT1udWxsP2kudHlwZSE9PTA6cnx8ISgyPGUubGVuZ3RoKXx8ZVswXSE9PSJvIiYmZVswXSE9PSJPInx8ZVsxXSE9PSJuIiYmZVsxXSE9PSJOIikmJih6YihlLG4saSxyKSYmKG49bnVsbCkscnx8aT09PW51bGw/RGIoZSkmJihuPT09bnVsbD90LnJlbW92ZUF0dHJpYnV0ZShlKTp0LnNldEF0dHJpYnV0ZShlLCIiK24pKTppLm11c3RVc2VQcm9wZXJ0eT90W2kucHJvcGVydHlOYW1lXT1uPT09bnVsbD9pLnR5cGU9PT0zPyExOiIiOm46KGU9aS5hdHRyaWJ1dGVOYW1lLHI9aS5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/dC5yZW1vdmVBdHRyaWJ1dGUoZSk6KGk9aS50eXBlLG49aT09PTN8fGk9PT00JiZuPT09ITA/IiI6IiIrbixyP3Quc2V0QXR0cmlidXRlTlMocixlLG4pOnQuc2V0QXR0cmlidXRlKGUsbikpKSl9dmFyIHhpPWpfLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELFh1PVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxibD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSwkbD1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLG9tPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksSmg9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxGXz1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLEJfPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxsbT1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLHFoPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksZXA9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLHNtPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxBaT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksVV89U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIiksZ3k9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEZzKHQpe3JldHVybiB0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiP251bGw6KHQ9Z3kmJnRbZ3ldfHx0WyJAQGl0ZXJhdG9yIl0sdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dDpudWxsKX12YXIgZ3Q9T2JqZWN0LmFzc2lnbixyaDtmdW5jdGlvbiBvYSh0KXtpZihyaD09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgZT1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7cmg9ZSYmZVsxXXx8IiJ9cmV0dXJuYApgK3JoK3R9dmFyIGloPSExO2Z1bmN0aW9uIG9oKHQsZSl7aWYoIXR8fGloKXJldHVybiIiO2loPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoZSlpZihlPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KGUsW10pfWNhdGNoKHUpe3ZhciByPXV9UmVmbGVjdC5jb25zdHJ1Y3QodCxbXSxlKX1lbHNle3RyeXtlLmNhbGwoKX1jYXRjaCh1KXtyPXV9dC5jYWxsKGUucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3I9dX10KCl9fWNhdGNoKHUpe2lmKHUmJnImJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBpPXUuc3RhY2suc3BsaXQoYApgKSxvPXIuc3RhY2suc3BsaXQoYApgKSxsPWkubGVuZ3RoLTEscz1vLmxlbmd0aC0xOzE8PWwmJjA8PXMmJmlbbF0hPT1vW3NdOylzLS07Zm9yKDsxPD1sJiYwPD1zO2wtLSxzLS0paWYoaVtsXSE9PW9bc10pe2lmKGwhPT0xfHxzIT09MSlkbyBpZihsLS0scy0tLDA+c3x8aVtsXSE9PW9bc10pe3ZhciBhPWAKYCtpW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiB0LmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+Iix0LmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7aWg9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4odD10P3QuZGlzcGxheU5hbWV8fHQubmFtZToiIik/b2EodCk6IiJ9ZnVuY3Rpb24gRmIodCl7c3dpdGNoKHQudGFnKXtjYXNlIDU6cmV0dXJuIG9hKHQudHlwZSk7Y2FzZSAxNjpyZXR1cm4gb2EoIkxhenkiKTtjYXNlIDEzOnJldHVybiBvYSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBvYSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiB0PW9oKHQudHlwZSwhMSksdDtjYXNlIDExOnJldHVybiB0PW9oKHQudHlwZS5yZW5kZXIsITEpLHQ7Y2FzZSAxOnJldHVybiB0PW9oKHQudHlwZSwhMCksdDtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiB0cCh0KXtpZih0PT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fG51bGw7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlICRsOnJldHVybiJGcmFnbWVudCI7Y2FzZSBibDpyZXR1cm4iUG9ydGFsIjtjYXNlIEpoOnJldHVybiJQcm9maWxlciI7Y2FzZSBvbTpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBxaDpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgZXA6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIHQ9PSJvYmplY3QiKXN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIEJfOnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgRl86cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBsbTp2YXIgZT10LnJlbmRlcjtyZXR1cm4gdD10LmRpc3BsYXlOYW1lLHR8fCh0PWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdD10IT09IiI/IkZvcndhcmRSZWYoIit0KyIpIjoiRm9yd2FyZFJlZiIpLHQ7Y2FzZSBzbTpyZXR1cm4gZT10LmRpc3BsYXlOYW1lfHxudWxsLGUhPT1udWxsP2U6dHAodC50eXBlKXx8Ik1lbW8iO2Nhc2UgQWk6ZT10Ll9wYXlsb2FkLHQ9dC5faW5pdDt0cnl7cmV0dXJuIHRwKHQoZSkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gQmIodCl7dmFyIGU9dC50eXBlO3N3aXRjaCh0LnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4oZS5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybihlLl9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gdD1lLnJlbmRlcix0PXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZS5kaXNwbGF5TmFtZXx8KHQhPT0iIj8iRm9yd2FyZFJlZigiK3QrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiBlO2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gdHAoZSk7Y2FzZSA4OnJldHVybiBlPT09b20/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8bnVsbDtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdG8odCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiB0O2Nhc2Uib2JqZWN0IjpyZXR1cm4gdDtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBXXyh0KXt2YXIgZT10LnR5cGU7cmV0dXJuKHQ9dC5ub2RlTmFtZSkmJnQudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihlPT09ImNoZWNrYm94Inx8ZT09PSJyYWRpbyIpfWZ1bmN0aW9uIFViKHQpe3ZhciBlPVdfKHQpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSxlKSxyPSIiK3RbZV07aWYoIXQuaGFzT3duUHJvcGVydHkoZSkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBpPW4uZ2V0LG89bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7cj0iIitsLG8uY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGwpe3I9IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7dC5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIHRbZV19fX19ZnVuY3Rpb24gUXUodCl7dC5fdmFsdWVUcmFja2VyfHwodC5fdmFsdWVUcmFja2VyPVViKHQpKX1mdW5jdGlvbiBWXyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10Ll92YWx1ZVRyYWNrZXI7aWYoIWUpcmV0dXJuITA7dmFyIG49ZS5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIHQmJihyPVdfKHQpP3QuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjp0LnZhbHVlKSx0PXIsdCE9PW4/KGUuc2V0VmFsdWUodCksITApOiExfWZ1bmN0aW9uIFljKHQpe2lmKHQ9dHx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgdD4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiB0LmFjdGl2ZUVsZW1lbnR8fHQuYm9keX1jYXRjaHtyZXR1cm4gdC5ib2R5fX1mdW5jdGlvbiBucCh0LGUpe3ZhciBuPWUuY2hlY2tlZDtyZXR1cm4gZ3Qoe30sZSx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/dC5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gbXkodCxlKXt2YXIgbj1lLmRlZmF1bHRWYWx1ZT09bnVsbD8iIjplLmRlZmF1bHRWYWx1ZSxyPWUuY2hlY2tlZCE9bnVsbD9lLmNoZWNrZWQ6ZS5kZWZhdWx0Q2hlY2tlZDtuPXRvKGUudmFsdWUhPW51bGw/ZS52YWx1ZTpuKSx0Ll93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDplLnR5cGU9PT0iY2hlY2tib3gifHxlLnR5cGU9PT0icmFkaW8iP2UuY2hlY2tlZCE9bnVsbDplLnZhbHVlIT1udWxsfX1mdW5jdGlvbiBIXyh0LGUpe2U9ZS5jaGVja2VkLGUhPW51bGwmJmltKHQsImNoZWNrZWQiLGUsITEpfWZ1bmN0aW9uIHJwKHQsZSl7SF8odCxlKTt2YXIgbj10byhlLnZhbHVlKSxyPWUudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJnQudmFsdWU9PT0iInx8dC52YWx1ZSE9bikmJih0LnZhbHVlPSIiK24pOnQudmFsdWUhPT0iIituJiYodC52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe3QucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn1lLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP2lwKHQsZS50eXBlLG4pOmUuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZpcCh0LGUudHlwZSx0byhlLmRlZmF1bHRWYWx1ZSkpLGUuY2hlY2tlZD09bnVsbCYmZS5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKHQuZGVmYXVsdENoZWNrZWQ9ISFlLmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiB2eSh0LGUsbil7aWYoZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8ZS5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPWUudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fGUudmFsdWUhPT12b2lkIDAmJmUudmFsdWUhPT1udWxsKSlyZXR1cm47ZT0iIit0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fGU9PT10LnZhbHVlfHwodC52YWx1ZT1lKSx0LmRlZmF1bHRWYWx1ZT1lfW49dC5uYW1lLG4hPT0iIiYmKHQubmFtZT0iIiksdC5kZWZhdWx0Q2hlY2tlZD0hIXQuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJih0Lm5hbWU9bil9ZnVuY3Rpb24gaXAodCxlLG4peyhlIT09Im51bWJlciJ8fFljKHQub3duZXJEb2N1bWVudCkhPT10KSYmKG49PW51bGw/dC5kZWZhdWx0VmFsdWU9IiIrdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTp0LmRlZmF1bHRWYWx1ZSE9PSIiK24mJih0LmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIGxhPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gVWwodCxlLG4scil7aWYodD10Lm9wdGlvbnMsZSl7ZT17fTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyllWyIkIituW2ldXT0hMDtmb3Iobj0wO248dC5sZW5ndGg7bisrKWk9ZS5oYXNPd25Qcm9wZXJ0eSgiJCIrdFtuXS52YWx1ZSksdFtuXS5zZWxlY3RlZCE9PWkmJih0W25dLnNlbGVjdGVkPWkpLGkmJnImJih0W25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIit0byhuKSxlPW51bGwsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZih0W2ldLnZhbHVlPT09bil7dFtpXS5zZWxlY3RlZD0hMCxyJiYodFtpXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1lIT09bnVsbHx8dFtpXS5kaXNhYmxlZHx8KGU9dFtpXSl9ZSE9PW51bGwmJihlLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gb3AodCxlKXtpZihlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKFcoOTEpKTtyZXR1cm4gZ3Qoe30sZSx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIHl5KHQsZSl7dmFyIG49ZS52YWx1ZTtpZihuPT1udWxsKXtpZihuPWUuY2hpbGRyZW4sZT1lLmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZihlIT1udWxsKXRocm93IEVycm9yKFcoOTIpKTtpZihsYShuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihXKDkzKSk7bj1uWzBdfWU9bn1lPT1udWxsJiYoZT0iIiksbj1lfXQuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOnRvKG4pfX1mdW5jdGlvbiBLXyh0LGUpe3ZhciBuPXRvKGUudmFsdWUpLHI9dG8oZS5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PXQudmFsdWUmJih0LnZhbHVlPW4pLGUuZGVmYXVsdFZhbHVlPT1udWxsJiZ0LmRlZmF1bHRWYWx1ZSE9PW4mJih0LmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKHQuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIHh5KHQpe3ZhciBlPXQudGV4dENvbnRlbnQ7ZT09PXQuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJmUhPT0iIiYmZSE9PW51bGwmJih0LnZhbHVlPWUpfWZ1bmN0aW9uIFpfKHQpe3N3aXRjaCh0KXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gbHAodCxlKXtyZXR1cm4gdD09bnVsbHx8dD09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9aXyhlKTp0PT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmZT09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6dH12YXIgSnUsR189ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGUsbixyLGkpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIHQoZSxuLHIsaSl9KX06dH0oZnVuY3Rpb24odCxlKXtpZih0Lm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gdCl0LmlubmVySFRNTD1lO2Vsc2V7Zm9yKEp1PUp1fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxKdS5pbm5lckhUTUw9Ijxzdmc+IitlLnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLGU9SnUuZmlyc3RDaGlsZDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtmb3IoO2UuZmlyc3RDaGlsZDspdC5hcHBlbmRDaGlsZChlLmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIERhKHQsZSl7aWYoZSl7dmFyIG49dC5maXJzdENoaWxkO2lmKG4mJm49PT10Lmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPWU7cmV0dXJufX10LnRleHRDb250ZW50PWV9dmFyIGhhPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxXYj1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGhhKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1diLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSksaGFbZV09aGFbdF19KX0pO2Z1bmN0aW9uIFlfKHQsZSxuKXtyZXR1cm4gZT09bnVsbHx8dHlwZW9mIGU9PSJib29sZWFuInx8ZT09PSIiPyIiOm58fHR5cGVvZiBlIT0ibnVtYmVyInx8ZT09PTB8fGhhLmhhc093blByb3BlcnR5KHQpJiZoYVt0XT8oIiIrZSkudHJpbSgpOmUrInB4In1mdW5jdGlvbiBYXyh0LGUpe3Q9dC5zdHlsZTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLGk9WV8obixlW25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP3Quc2V0UHJvcGVydHkobixpKTp0W25dPWl9fXZhciBWYj1ndCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBzcCh0LGUpe2lmKGUpe2lmKFZiW3RdJiYoZS5jaGlsZHJlbiE9bnVsbHx8ZS5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoVygxMzcsdCkpO2lmKGUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKGUuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoVyg2MCkpO2lmKHR5cGVvZiBlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIGUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKFcoNjEpKX1pZihlLnN0eWxlIT1udWxsJiZ0eXBlb2YgZS5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoVyg2MikpfX1mdW5jdGlvbiBhcCh0LGUpe2lmKHQuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiBlLmlzPT0ic3RyaW5nIjtzd2l0Y2godCl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgdXA9bnVsbDtmdW5jdGlvbiBhbSh0KXtyZXR1cm4gdD10LnRhcmdldHx8dC5zcmNFbGVtZW50fHx3aW5kb3csdC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKHQ9dC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksdC5ub2RlVHlwZT09PTM/dC5wYXJlbnROb2RlOnR9dmFyIGNwPW51bGwsV2w9bnVsbCxWbD1udWxsO2Z1bmN0aW9uIF95KHQpe2lmKHQ9UHUodCkpe2lmKHR5cGVvZiBjcCE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihXKDI4MCkpO3ZhciBlPXQuc3RhdGVOb2RlO2UmJihlPWFmKGUpLGNwKHQuc3RhdGVOb2RlLHQudHlwZSxlKSl9fWZ1bmN0aW9uIFFfKHQpe1dsP1ZsP1ZsLnB1c2godCk6Vmw9W3RdOldsPXR9ZnVuY3Rpb24gSl8oKXtpZihXbCl7dmFyIHQ9V2wsZT1WbDtpZihWbD1XbD1udWxsLF95KHQpLGUpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKylfeShlW3RdKX19ZnVuY3Rpb24gcV8odCxlKXtyZXR1cm4gdChlKX1mdW5jdGlvbiBlMSgpe312YXIgbGg9ITE7ZnVuY3Rpb24gdDEodCxlLG4pe2lmKGxoKXJldHVybiB0KGUsbik7bGg9ITA7dHJ5e3JldHVybiBxXyh0LGUsbil9ZmluYWxseXtsaD0hMSwoV2whPT1udWxsfHxWbCE9PW51bGwpJiYoZTEoKSxKXygpKX19ZnVuY3Rpb24gamEodCxlKXt2YXIgbj10LnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj1hZihuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbZV07ZTpzd2l0Y2goZSl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KHQ9dC50eXBlLHI9ISh0PT09ImJ1dHRvbiJ8fHQ9PT0iaW5wdXQifHx0PT09InNlbGVjdCJ8fHQ9PT0idGV4dGFyZWEiKSksdD0hcjticmVhayBlO2RlZmF1bHQ6dD0hMX1pZih0KXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMjMxLGUsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgZHA9ITE7aWYoZGkpdHJ5e3ZhciBCcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQnMsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtkcD0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsQnMsQnMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixCcyxCcyl9Y2F0Y2h7ZHA9ITF9ZnVuY3Rpb24gSGIodCxlLG4scixpLG8sbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7ZS5hcHBseShuLHUpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIHBhPSExLFhjPW51bGwsUWM9ITEsZnA9bnVsbCxLYj17b25FcnJvcjpmdW5jdGlvbih0KXtwYT0hMCxYYz10fX07ZnVuY3Rpb24gWmIodCxlLG4scixpLG8sbCxzLGEpe3BhPSExLFhjPW51bGwsSGIuYXBwbHkoS2IsYXJndW1lbnRzKX1mdW5jdGlvbiBHYih0LGUsbixyLGksbyxsLHMsYSl7aWYoWmIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHBhKXtpZihwYSl7dmFyIHU9WGM7cGE9ITEsWGM9bnVsbH1lbHNlIHRocm93IEVycm9yKFcoMTk4KSk7UWN8fChRYz0hMCxmcD11KX19ZnVuY3Rpb24gdGwodCl7dmFyIGU9dCxuPXQ7aWYodC5hbHRlcm5hdGUpZm9yKDtlLnJldHVybjspZT1lLnJldHVybjtlbHNle3Q9ZTtkbyBlPXQsZS5mbGFncyY0MDk4JiYobj1lLnJldHVybiksdD1lLnJldHVybjt3aGlsZSh0KX1yZXR1cm4gZS50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBuMSh0KXtpZih0LnRhZz09PTEzKXt2YXIgZT10Lm1lbW9pemVkU3RhdGU7aWYoZT09PW51bGwmJih0PXQuYWx0ZXJuYXRlLHQhPT1udWxsJiYoZT10Lm1lbW9pemVkU3RhdGUpKSxlIT09bnVsbClyZXR1cm4gZS5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIHd5KHQpe2lmKHRsKHQpIT09dCl0aHJvdyBFcnJvcihXKDE4OCkpfWZ1bmN0aW9uIFliKHQpe3ZhciBlPXQuYWx0ZXJuYXRlO2lmKCFlKXtpZihlPXRsKHQpLGU9PT1udWxsKXRocm93IEVycm9yKFcoMTg4KSk7cmV0dXJuIGUhPT10P251bGw6dH1mb3IodmFyIG49dCxyPWU7Oyl7dmFyIGk9bi5yZXR1cm47aWYoaT09PW51bGwpYnJlYWs7dmFyIG89aS5hbHRlcm5hdGU7aWYobz09PW51bGwpe2lmKHI9aS5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihpLmNoaWxkPT09by5jaGlsZCl7Zm9yKG89aS5jaGlsZDtvOyl7aWYobz09PW4pcmV0dXJuIHd5KGkpLHQ7aWYobz09PXIpcmV0dXJuIHd5KGkpLGU7bz1vLnNpYmxpbmd9dGhyb3cgRXJyb3IoVygxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49aSxyPW87ZWxzZXtmb3IodmFyIGw9ITEscz1pLmNoaWxkO3M7KXtpZihzPT09bil7bD0hMCxuPWkscj1vO2JyZWFrfWlmKHM9PT1yKXtsPSEwLHI9aSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihXKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoVygxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoVygxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/dDplfWZ1bmN0aW9uIHIxKHQpe3JldHVybiB0PVliKHQpLHQhPT1udWxsP2kxKHQpOm51bGx9ZnVuY3Rpb24gaTEodCl7aWYodC50YWc9PT01fHx0LnRhZz09PTYpcmV0dXJuIHQ7Zm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspe3ZhciBlPWkxKHQpO2lmKGUhPT1udWxsKXJldHVybiBlO3Q9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBvMT1Cbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFN5PUJuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFhiPUJuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFFiPUJuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxDdD1Cbi51bnN0YWJsZV9ub3csSmI9Qm4udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsdW09Qm4udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksbDE9Qm4udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksSmM9Qm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkscWI9Qm4udW5zdGFibGVfTG93UHJpb3JpdHksczE9Qm4udW5zdGFibGVfSWRsZVByaW9yaXR5LHJmPW51bGwsenI9bnVsbDtmdW5jdGlvbiBlJCh0KXtpZih6ciYmdHlwZW9mIHpyLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt6ci5vbkNvbW1pdEZpYmVyUm9vdChyZix0LHZvaWQgMCwodC5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIHhyPU1hdGguY2x6MzI/TWF0aC5jbHozMjpyJCx0JD1NYXRoLmxvZyxuJD1NYXRoLkxOMjtmdW5jdGlvbiByJCh0KXtyZXR1cm4gdD4+Pj0wLHQ9PT0wPzMyOjMxLSh0JCh0KS9uJHwwKXwwfXZhciBxdT02NCxlYz00MTk0MzA0O2Z1bmN0aW9uIHNhKHQpe3N3aXRjaCh0Ji10KXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gdCY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIHQmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBxYyh0LGUpe3ZhciBuPXQucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsaT10LnN1c3BlbmRlZExhbmVzLG89dC5waW5nZWRMYW5lcyxsPW4mMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5pO3MhPT0wP3I9c2Eocyk6KG8mPWwsbyE9PTAmJihyPXNhKG8pKSl9ZWxzZSBsPW4mfmksbCE9PTA/cj1zYShsKTpvIT09MCYmKHI9c2EobykpO2lmKHI9PT0wKXJldHVybiAwO2lmKGUhPT0wJiZlIT09ciYmIShlJmkpJiYoaT1yJi1yLG89ZSYtZSxpPj1vfHxpPT09MTYmJihvJjQxOTQyNDApIT09MCkpcmV0dXJuIGU7aWYociY0JiYocnw9biYxNiksZT10LmVudGFuZ2xlZExhbmVzLGUhPT0wKWZvcih0PXQuZW50YW5nbGVtZW50cyxlJj1yOzA8ZTspbj0zMS14cihlKSxpPTE8PG4scnw9dFtuXSxlJj1+aTtyZXR1cm4gcn1mdW5jdGlvbiBpJCh0LGUpe3N3aXRjaCh0KXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gZSsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBlKzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiBvJCh0LGUpe2Zvcih2YXIgbj10LnN1c3BlbmRlZExhbmVzLHI9dC5waW5nZWRMYW5lcyxpPXQuZXhwaXJhdGlvblRpbWVzLG89dC5wZW5kaW5nTGFuZXM7MDxvOyl7dmFyIGw9MzEteHIobykscz0xPDxsLGE9aVtsXTthPT09LTE/KCEocyZuKXx8cyZyKSYmKGlbbF09aSQocyxlKSk6YTw9ZSYmKHQuZXhwaXJlZExhbmVzfD1zKSxvJj1+c319ZnVuY3Rpb24gaHAodCl7cmV0dXJuIHQ9dC5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsdCE9PTA/dDp0JjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIGExKCl7dmFyIHQ9cXU7cmV0dXJuIHF1PDw9MSwhKHF1JjQxOTQyNDApJiYocXU9NjQpLHR9ZnVuY3Rpb24gc2godCl7Zm9yKHZhciBlPVtdLG49MDszMT5uO24rKyllLnB1c2godCk7cmV0dXJuIGV9ZnVuY3Rpb24gUnUodCxlLG4pe3QucGVuZGluZ0xhbmVzfD1lLGUhPT01MzY4NzA5MTImJih0LnN1c3BlbmRlZExhbmVzPTAsdC5waW5nZWRMYW5lcz0wKSx0PXQuZXZlbnRUaW1lcyxlPTMxLXhyKGUpLHRbZV09bn1mdW5jdGlvbiBsJCh0LGUpe3ZhciBuPXQucGVuZGluZ0xhbmVzJn5lO3QucGVuZGluZ0xhbmVzPWUsdC5zdXNwZW5kZWRMYW5lcz0wLHQucGluZ2VkTGFuZXM9MCx0LmV4cGlyZWRMYW5lcyY9ZSx0Lm11dGFibGVSZWFkTGFuZXMmPWUsdC5lbnRhbmdsZWRMYW5lcyY9ZSxlPXQuZW50YW5nbGVtZW50czt2YXIgcj10LmV2ZW50VGltZXM7Zm9yKHQ9dC5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIGk9MzEteHIobiksbz0xPDxpO2VbaV09MCxyW2ldPS0xLHRbaV09LTEsbiY9fm99fWZ1bmN0aW9uIGNtKHQsZSl7dmFyIG49dC5lbnRhbmdsZWRMYW5lc3w9ZTtmb3IodD10LmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLXhyKG4pLGk9MTw8cjtpJmV8dFtyXSZlJiYodFtyXXw9ZSksbiY9fml9fXZhciBXZT0wO2Z1bmN0aW9uIHUxKHQpe3JldHVybiB0Jj0tdCwxPHQ/NDx0P3QmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIGMxLGRtLGQxLGYxLGgxLHBwPSExLHRjPVtdLFZpPW51bGwsSGk9bnVsbCxLaT1udWxsLHphPW5ldyBNYXAsRmE9bmV3IE1hcCxJaT1bXSxzJD0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBFeSh0LGUpe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOlZpPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjpIaT1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0IjpLaT1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6emEuZGVsZXRlKGUucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6RmEuZGVsZXRlKGUucG9pbnRlcklkKX19ZnVuY3Rpb24gVXModCxlLG4scixpLG8pe3JldHVybiB0PT09bnVsbHx8dC5uYXRpdmVFdmVudCE9PW8/KHQ9e2Jsb2NrZWRPbjplLGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDpvLHRhcmdldENvbnRhaW5lcnM6W2ldfSxlIT09bnVsbCYmKGU9UHUoZSksZSE9PW51bGwmJmRtKGUpKSx0KToodC5ldmVudFN5c3RlbUZsYWdzfD1yLGU9dC50YXJnZXRDb250YWluZXJzLGkhPT1udWxsJiZlLmluZGV4T2YoaSk9PT0tMSYmZS5wdXNoKGkpLHQpfWZ1bmN0aW9uIGEkKHQsZSxuLHIsaSl7c3dpdGNoKGUpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIFZpPVVzKFZpLHQsZSxuLHIsaSksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiBIaT1VcyhIaSx0LGUsbixyLGkpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gS2k9VXMoS2ksdCxlLG4scixpKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgbz1pLnBvaW50ZXJJZDtyZXR1cm4gemEuc2V0KG8sVXMoemEuZ2V0KG8pfHxudWxsLHQsZSxuLHIsaSkpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBvPWkucG9pbnRlcklkLEZhLnNldChvLFVzKEZhLmdldChvKXx8bnVsbCx0LGUsbixyLGkpKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBwMSh0KXt2YXIgZT1Ubyh0LnRhcmdldCk7aWYoZSE9PW51bGwpe3ZhciBuPXRsKGUpO2lmKG4hPT1udWxsKXtpZihlPW4udGFnLGU9PT0xMyl7aWYoZT1uMShuKSxlIT09bnVsbCl7dC5ibG9ja2VkT249ZSxoMSh0LnByaW9yaXR5LGZ1bmN0aW9uKCl7ZDEobil9KTtyZXR1cm59fWVsc2UgaWYoZT09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3QuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19dC5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBSYyh0KXtpZih0LmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciBlPXQudGFyZ2V0Q29udGFpbmVyczswPGUubGVuZ3RoOyl7dmFyIG49Z3AodC5kb21FdmVudE5hbWUsdC5ldmVudFN5c3RlbUZsYWdzLGVbMF0sdC5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249dC5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7dXA9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLHVwPW51bGx9ZWxzZSByZXR1cm4gZT1QdShuKSxlIT09bnVsbCYmZG0oZSksdC5ibG9ja2VkT249biwhMTtlLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gQ3kodCxlLG4pe1JjKHQpJiZuLmRlbGV0ZShlKX1mdW5jdGlvbiB1JCgpe3BwPSExLFZpIT09bnVsbCYmUmMoVmkpJiYoVmk9bnVsbCksSGkhPT1udWxsJiZSYyhIaSkmJihIaT1udWxsKSxLaSE9PW51bGwmJlJjKEtpKSYmKEtpPW51bGwpLHphLmZvckVhY2goQ3kpLEZhLmZvckVhY2goQ3kpfWZ1bmN0aW9uIFdzKHQsZSl7dC5ibG9ja2VkT249PT1lJiYodC5ibG9ja2VkT249bnVsbCxwcHx8KHBwPSEwLEJuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soQm4udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksdSQpKSl9ZnVuY3Rpb24gQmEodCl7ZnVuY3Rpb24gZShpKXtyZXR1cm4gV3MoaSx0KX1pZigwPHRjLmxlbmd0aCl7V3ModGNbMF0sdCk7Zm9yKHZhciBuPTE7bjx0Yy5sZW5ndGg7bisrKXt2YXIgcj10Y1tuXTtyLmJsb2NrZWRPbj09PXQmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKFZpIT09bnVsbCYmV3MoVmksdCksSGkhPT1udWxsJiZXcyhIaSx0KSxLaSE9PW51bGwmJldzKEtpLHQpLHphLmZvckVhY2goZSksRmEuZm9yRWFjaChlKSxuPTA7bjxJaS5sZW5ndGg7bisrKXI9SWlbbl0sci5ibG9ja2VkT249PT10JiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPElpLmxlbmd0aCYmKG49SWlbMF0sbi5ibG9ja2VkT249PT1udWxsKTspcDEobiksbi5ibG9ja2VkT249PT1udWxsJiZJaS5zaGlmdCgpfXZhciBIbD14aS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxlZD0hMDtmdW5jdGlvbiBjJCh0LGUsbixyKXt2YXIgaT1XZSxvPUhsLnRyYW5zaXRpb247SGwudHJhbnNpdGlvbj1udWxsO3RyeXtXZT0xLGZtKHQsZSxuLHIpfWZpbmFsbHl7V2U9aSxIbC50cmFuc2l0aW9uPW99fWZ1bmN0aW9uIGQkKHQsZSxuLHIpe3ZhciBpPVdlLG89SGwudHJhbnNpdGlvbjtIbC50cmFuc2l0aW9uPW51bGw7dHJ5e1dlPTQsZm0odCxlLG4scil9ZmluYWxseXtXZT1pLEhsLnRyYW5zaXRpb249b319ZnVuY3Rpb24gZm0odCxlLG4scil7aWYoZWQpe3ZhciBpPWdwKHQsZSxuLHIpO2lmKGk9PT1udWxsKXZoKHQsZSxyLHRkLG4pLEV5KHQscik7ZWxzZSBpZihhJChpLHQsZSxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihFeSh0LHIpLGUmNCYmLTE8cyQuaW5kZXhPZih0KSl7Zm9yKDtpIT09bnVsbDspe3ZhciBvPVB1KGkpO2lmKG8hPT1udWxsJiZjMShvKSxvPWdwKHQsZSxuLHIpLG89PT1udWxsJiZ2aCh0LGUscix0ZCxuKSxvPT09aSlicmVhaztpPW99aSE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSB2aCh0LGUscixudWxsLG4pfX12YXIgdGQ9bnVsbDtmdW5jdGlvbiBncCh0LGUsbixyKXtpZih0ZD1udWxsLHQ9YW0ociksdD1Ubyh0KSx0IT09bnVsbClpZihlPXRsKHQpLGU9PT1udWxsKXQ9bnVsbDtlbHNlIGlmKG49ZS50YWcsbj09PTEzKXtpZih0PW4xKGUpLHQhPT1udWxsKXJldHVybiB0O3Q9bnVsbH1lbHNlIGlmKG49PT0zKXtpZihlLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiBlLnRhZz09PTM/ZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3Q9bnVsbH1lbHNlIGUhPT10JiYodD1udWxsKTtyZXR1cm4gdGQ9dCxudWxsfWZ1bmN0aW9uIGcxKHQpe3N3aXRjaCh0KXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaChKYigpKXtjYXNlIHVtOnJldHVybiAxO2Nhc2UgbDE6cmV0dXJuIDQ7Y2FzZSBKYzpjYXNlIHFiOnJldHVybiAxNjtjYXNlIHMxOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBGaT1udWxsLGhtPW51bGwsT2M9bnVsbDtmdW5jdGlvbiBtMSgpe2lmKE9jKXJldHVybiBPYzt2YXIgdCxlPWhtLG49ZS5sZW5ndGgscixpPSJ2YWx1ZSJpbiBGaT9GaS52YWx1ZTpGaS50ZXh0Q29udGVudCxvPWkubGVuZ3RoO2Zvcih0PTA7dDxuJiZlW3RdPT09aVt0XTt0KyspO3ZhciBsPW4tdDtmb3Iocj0xO3I8PWwmJmVbbi1yXT09PWlbby1yXTtyKyspO3JldHVybiBPYz1pLnNsaWNlKHQsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIFBjKHQpe3ZhciBlPXQua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gdD8odD10LmNoYXJDb2RlLHQ9PT0wJiZlPT09MTMmJih0PTEzKSk6dD1lLHQ9PT0xMCYmKHQ9MTMpLDMyPD10fHx0PT09MTM/dDowfWZ1bmN0aW9uIG5jKCl7cmV0dXJuITB9ZnVuY3Rpb24ga3koKXtyZXR1cm4hMX1mdW5jdGlvbiBIbih0KXtmdW5jdGlvbiBlKG4scixpLG8sbCl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1pLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9byx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiB0KXQuaGFzT3duUHJvcGVydHkocykmJihuPXRbc10sdGhpc1tzXT1uP24obyk6b1tzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShvLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/by5kZWZhdWx0UHJldmVudGVkOm8ucmV0dXJuVmFsdWU9PT0hMSk/bmM6a3ksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1reSx0aGlzfXJldHVybiBndChlLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPW5jKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPW5jKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50Om5jfSksZX12YXIgeHM9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbih0KXtyZXR1cm4gdC50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0scG09SG4oeHMpLE91PWd0KHt9LHhzLHt2aWV3OjAsZGV0YWlsOjB9KSxmJD1IbihPdSksYWgsdWgsVnMsb2Y9Z3Qoe30sT3Use3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6Z20sYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVsYXRlZFRhcmdldD09PXZvaWQgMD90LmZyb21FbGVtZW50PT09dC5zcmNFbGVtZW50P3QudG9FbGVtZW50OnQuZnJvbUVsZW1lbnQ6dC5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24odCl7cmV0dXJuIm1vdmVtZW50WCJpbiB0P3QubW92ZW1lbnRYOih0IT09VnMmJihWcyYmdC50eXBlPT09Im1vdXNlbW92ZSI/KGFoPXQuc2NyZWVuWC1Wcy5zY3JlZW5YLHVoPXQuc2NyZWVuWS1Wcy5zY3JlZW5ZKTp1aD1haD0wLFZzPXQpLGFoKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKHQpe3JldHVybiJtb3ZlbWVudFkiaW4gdD90Lm1vdmVtZW50WTp1aH19KSxieT1IbihvZiksaCQ9Z3Qoe30sb2Yse2RhdGFUcmFuc2ZlcjowfSkscCQ9SG4oaCQpLGckPWd0KHt9LE91LHtyZWxhdGVkVGFyZ2V0OjB9KSxjaD1IbihnJCksbSQ9Z3Qoe30seHMse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLHYkPUhuKG0kKSx5JD1ndCh7fSx4cyx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiB0P3QuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSx4JD1Ibih5JCksXyQ9Z3Qoe30seHMse2RhdGE6MH0pLCR5PUhuKF8kKSx3JD17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sUyQ9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxFJD17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIEMkKHQpe3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGUuZ2V0TW9kaWZpZXJTdGF0ZT9lLmdldE1vZGlmaWVyU3RhdGUodCk6KHQ9RSRbdF0pPyEhZVt0XTohMX1mdW5jdGlvbiBnbSgpe3JldHVybiBDJH12YXIgayQ9Z3Qoe30sT3Use2tleTpmdW5jdGlvbih0KXtpZih0LmtleSl7dmFyIGU9dyRbdC5rZXldfHx0LmtleTtpZihlIT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIGV9cmV0dXJuIHQudHlwZT09PSJrZXlwcmVzcyI/KHQ9UGModCksdD09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSk6dC50eXBlPT09ImtleWRvd24ifHx0LnR5cGU9PT0ia2V5dXAiP1MkW3Qua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTpnbSxjaGFyQ29kZTpmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT09ImtleXByZXNzIj9QYyh0KTowfSxrZXlDb2RlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PT0ia2V5ZG93biJ8fHQudHlwZT09PSJrZXl1cCI/dC5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PT0ia2V5cHJlc3MiP1BjKHQpOnQudHlwZT09PSJrZXlkb3duInx8dC50eXBlPT09ImtleXVwIj90LmtleUNvZGU6MH19KSxiJD1IbihrJCksJCQ9Z3Qoe30sb2Yse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksVHk9SG4oJCQpLFQkPWd0KHt9LE91LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6Z219KSxOJD1IbihUJCksUiQ9Z3Qoe30seHMse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksTyQ9SG4oUiQpLFAkPWd0KHt9LG9mLHtkZWx0YVg6ZnVuY3Rpb24odCl7cmV0dXJuImRlbHRhWCJpbiB0P3QuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiB0Py10LndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbih0KXtyZXR1cm4iZGVsdGFZImluIHQ/dC5kZWx0YVk6IndoZWVsRGVsdGFZImluIHQ/LXQud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gdD8tdC53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksQSQ9SG4oUCQpLE0kPVs5LDEzLDI3LDMyXSxtbT1kaSYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGdhPW51bGw7ZGkmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihnYT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBMJD1kaSYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFnYSx2MT1kaSYmKCFtbXx8Z2EmJjg8Z2EmJjExPj1nYSksTnk9IiAiLFJ5PSExO2Z1bmN0aW9uIHkxKHQsZSl7c3dpdGNoKHQpe2Nhc2Uia2V5dXAiOnJldHVybiBNJC5pbmRleE9mKGUua2V5Q29kZSkhPT0tMTtjYXNlImtleWRvd24iOnJldHVybiBlLmtleUNvZGUhPT0yMjk7Y2FzZSJrZXlwcmVzcyI6Y2FzZSJtb3VzZWRvd24iOmNhc2UiZm9jdXNvdXQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHgxKHQpe3JldHVybiB0PXQuZGV0YWlsLHR5cGVvZiB0PT0ib2JqZWN0IiYmImRhdGEiaW4gdD90LmRhdGE6bnVsbH12YXIgVGw9ITE7ZnVuY3Rpb24gSSQodCxlKXtzd2l0Y2godCl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHgxKGUpO2Nhc2Uia2V5cHJlc3MiOnJldHVybiBlLndoaWNoIT09MzI/bnVsbDooUnk9ITAsTnkpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4gdD1lLmRhdGEsdD09PU55JiZSeT9udWxsOnQ7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gRCQodCxlKXtpZihUbClyZXR1cm4gdD09PSJjb21wb3NpdGlvbmVuZCJ8fCFtbSYmeTEodCxlKT8odD1tMSgpLE9jPWhtPUZpPW51bGwsVGw9ITEsdCk6bnVsbDtzd2l0Y2godCl7Y2FzZSJwYXN0ZSI6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoIShlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpfHxlLmN0cmxLZXkmJmUuYWx0S2V5KXtpZihlLmNoYXImJjE8ZS5jaGFyLmxlbmd0aClyZXR1cm4gZS5jaGFyO2lmKGUud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIHYxJiZlLmxvY2FsZSE9PSJrbyI/bnVsbDplLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIGokPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBPeSh0KXt2YXIgZT10JiZ0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGU9PT0iaW5wdXQiPyEhaiRbdC50eXBlXTplPT09InRleHRhcmVhIn1mdW5jdGlvbiBfMSh0LGUsbixyKXtRXyhyKSxlPW5kKGUsIm9uQ2hhbmdlIiksMDxlLmxlbmd0aCYmKG49bmV3IHBtKCJvbkNoYW5nZSIsImNoYW5nZSIsbnVsbCxuLHIpLHQucHVzaCh7ZXZlbnQ6bixsaXN0ZW5lcnM6ZX0pKX12YXIgbWE9bnVsbCxVYT1udWxsO2Z1bmN0aW9uIHokKHQpe08xKHQsMCl9ZnVuY3Rpb24gbGYodCl7dmFyIGU9T2wodCk7aWYoVl8oZSkpcmV0dXJuIHR9ZnVuY3Rpb24gRiQodCxlKXtpZih0PT09ImNoYW5nZSIpcmV0dXJuIGV9dmFyIHcxPSExO2lmKGRpKXt2YXIgZGg7aWYoZGkpe3ZhciBmaD0ib25pbnB1dCJpbiBkb2N1bWVudDtpZighZmgpe3ZhciBQeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQeS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCJyZXR1cm47IiksZmg9dHlwZW9mIFB5Lm9uaW5wdXQ9PSJmdW5jdGlvbiJ9ZGg9Zmh9ZWxzZSBkaD0hMTt3MT1kaCYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiBBeSgpe21hJiYobWEuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLFMxKSxVYT1tYT1udWxsKX1mdW5jdGlvbiBTMSh0KXtpZih0LnByb3BlcnR5TmFtZT09PSJ2YWx1ZSImJmxmKFVhKSl7dmFyIGU9W107XzEoZSxVYSx0LGFtKHQpKSx0MSh6JCxlKX19ZnVuY3Rpb24gQiQodCxlLG4pe3Q9PT0iZm9jdXNpbiI/KEF5KCksbWE9ZSxVYT1uLG1hLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixTMSkpOnQ9PT0iZm9jdXNvdXQiJiZBeSgpfWZ1bmN0aW9uIFUkKHQpe2lmKHQ9PT0ic2VsZWN0aW9uY2hhbmdlInx8dD09PSJrZXl1cCJ8fHQ9PT0ia2V5ZG93biIpcmV0dXJuIGxmKFVhKX1mdW5jdGlvbiBXJCh0LGUpe2lmKHQ9PT0iY2xpY2siKXJldHVybiBsZihlKX1mdW5jdGlvbiBWJCh0LGUpe2lmKHQ9PT0iaW5wdXQifHx0PT09ImNoYW5nZSIpcmV0dXJuIGxmKGUpfWZ1bmN0aW9uIEgkKHQsZSl7cmV0dXJuIHQ9PT1lJiYodCE9PTB8fDEvdD09PTEvZSl8fHQhPT10JiZlIT09ZX12YXIgRXI9dHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6SCQ7ZnVuY3Rpb24gV2EodCxlKXtpZihFcih0LGUpKXJldHVybiEwO2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXModCkscj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoIVFoLmNhbGwoZSxpKXx8IUVyKHRbaV0sZVtpXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gTXkodCl7Zm9yKDt0JiZ0LmZpcnN0Q2hpbGQ7KXQ9dC5maXJzdENoaWxkO3JldHVybiB0fWZ1bmN0aW9uIEx5KHQsZSl7dmFyIG49TXkodCk7dD0wO2Zvcih2YXIgcjtuOyl7aWYobi5ub2RlVHlwZT09PTMpe2lmKHI9dCtuLnRleHRDb250ZW50Lmxlbmd0aCx0PD1lJiZyPj1lKXJldHVybntub2RlOm4sb2Zmc2V0OmUtdH07dD1yfWU6e2Zvcig7bjspe2lmKG4ubmV4dFNpYmxpbmcpe249bi5uZXh0U2libGluZzticmVhayBlfW49bi5wYXJlbnROb2RlfW49dm9pZCAwfW49TXkobil9fWZ1bmN0aW9uIEUxKHQsZSl7cmV0dXJuIHQmJmU/dD09PWU/ITA6dCYmdC5ub2RlVHlwZT09PTM/ITE6ZSYmZS5ub2RlVHlwZT09PTM/RTEodCxlLnBhcmVudE5vZGUpOiJjb250YWlucyJpbiB0P3QuY29udGFpbnMoZSk6dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hISh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpJjE2KTohMTohMX1mdW5jdGlvbiBDMSgpe2Zvcih2YXIgdD13aW5kb3csZT1ZYygpO2UgaW5zdGFuY2VvZiB0LkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPXR5cGVvZiBlLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZj09InN0cmluZyJ9Y2F0Y2h7bj0hMX1pZihuKXQ9ZS5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7ZT1ZYyh0LmRvY3VtZW50KX1yZXR1cm4gZX1mdW5jdGlvbiB2bSh0KXt2YXIgZT10JiZ0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihlPT09ImlucHV0IiYmKHQudHlwZT09PSJ0ZXh0Inx8dC50eXBlPT09InNlYXJjaCJ8fHQudHlwZT09PSJ0ZWwifHx0LnR5cGU9PT0idXJsInx8dC50eXBlPT09InBhc3N3b3JkIil8fGU9PT0idGV4dGFyZWEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIil9ZnVuY3Rpb24gSyQodCl7dmFyIGU9QzEoKSxuPXQuZm9jdXNlZEVsZW0scj10LnNlbGVjdGlvblJhbmdlO2lmKGUhPT1uJiZuJiZuLm93bmVyRG9jdW1lbnQmJkUxKG4ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbikpe2lmKHIhPT1udWxsJiZ2bShuKSl7aWYoZT1yLnN0YXJ0LHQ9ci5lbmQsdD09PXZvaWQgMCYmKHQ9ZSksInNlbGVjdGlvblN0YXJ0ImluIG4pbi5zZWxlY3Rpb25TdGFydD1lLG4uc2VsZWN0aW9uRW5kPU1hdGgubWluKHQsbi52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYodD0oZT1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmZS5kZWZhdWx0Vmlld3x8d2luZG93LHQuZ2V0U2VsZWN0aW9uKXt0PXQuZ2V0U2VsZWN0aW9uKCk7dmFyIGk9bi50ZXh0Q29udGVudC5sZW5ndGgsbz1NYXRoLm1pbihyLnN0YXJ0LGkpO3I9ci5lbmQ9PT12b2lkIDA/bzpNYXRoLm1pbihyLmVuZCxpKSwhdC5leHRlbmQmJm8+ciYmKGk9cixyPW8sbz1pKSxpPUx5KG4sbyk7dmFyIGw9THkobixyKTtpJiZsJiYodC5yYW5nZUNvdW50IT09MXx8dC5hbmNob3JOb2RlIT09aS5ub2RlfHx0LmFuY2hvck9mZnNldCE9PWkub2Zmc2V0fHx0LmZvY3VzTm9kZSE9PWwubm9kZXx8dC5mb2N1c09mZnNldCE9PWwub2Zmc2V0KSYmKGU9ZS5jcmVhdGVSYW5nZSgpLGUuc2V0U3RhcnQoaS5ub2RlLGkub2Zmc2V0KSx0LnJlbW92ZUFsbFJhbmdlcygpLG8+cj8odC5hZGRSYW5nZShlKSx0LmV4dGVuZChsLm5vZGUsbC5vZmZzZXQpKTooZS5zZXRFbmQobC5ub2RlLGwub2Zmc2V0KSx0LmFkZFJhbmdlKGUpKSl9fWZvcihlPVtdLHQ9bjt0PXQucGFyZW50Tm9kZTspdC5ub2RlVHlwZT09PTEmJmUucHVzaCh7ZWxlbWVudDp0LGxlZnQ6dC5zY3JvbGxMZWZ0LHRvcDp0LnNjcm9sbFRvcH0pO2Zvcih0eXBlb2Ygbi5mb2N1cz09ImZ1bmN0aW9uIiYmbi5mb2N1cygpLG49MDtuPGUubGVuZ3RoO24rKyl0PWVbbl0sdC5lbGVtZW50LnNjcm9sbExlZnQ9dC5sZWZ0LHQuZWxlbWVudC5zY3JvbGxUb3A9dC50b3B9fXZhciBaJD1kaSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxObD1udWxsLG1wPW51bGwsdmE9bnVsbCx2cD0hMTtmdW5jdGlvbiBJeSh0LGUsbil7dmFyIHI9bi53aW5kb3c9PT1uP24uZG9jdW1lbnQ6bi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQ7dnB8fE5sPT1udWxsfHxObCE9PVljKHIpfHwocj1ObCwic2VsZWN0aW9uU3RhcnQiaW4gciYmdm0ocik/cj17c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxyPXthbmNob3JOb2RlOnIuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9KSx2YSYmV2EodmEscil8fCh2YT1yLHI9bmQobXAsIm9uU2VsZWN0IiksMDxyLmxlbmd0aCYmKGU9bmV3IHBtKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCxlLG4pLHQucHVzaCh7ZXZlbnQ6ZSxsaXN0ZW5lcnM6cn0pLGUudGFyZ2V0PU5sKSkpfWZ1bmN0aW9uIHJjKHQsZSl7dmFyIG49e307cmV0dXJuIG5bdC50b0xvd2VyQ2FzZSgpXT1lLnRvTG93ZXJDYXNlKCksblsiV2Via2l0Iit0XT0id2Via2l0IitlLG5bIk1veiIrdF09Im1veiIrZSxufXZhciBSbD17YW5pbWF0aW9uZW5kOnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cmMoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OnJjKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6cmMoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LGhoPXt9LGsxPXt9O2RpJiYoazE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBSbC5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBSbC5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgUmwudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBzZih0KXtpZihoaFt0XSlyZXR1cm4gaGhbdF07aWYoIVJsW3RdKXJldHVybiB0O3ZhciBlPVJsW3RdLG47Zm9yKG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pJiZuIGluIGsxKXJldHVybiBoaFt0XT1lW25dO3JldHVybiB0fXZhciBiMT1zZigiYW5pbWF0aW9uZW5kIiksJDE9c2YoImFuaW1hdGlvbml0ZXJhdGlvbiIpLFQxPXNmKCJhbmltYXRpb25zdGFydCIpLE4xPXNmKCJ0cmFuc2l0aW9uZW5kIiksUjE9bmV3IE1hcCxEeT0iYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7ZnVuY3Rpb24gZ28odCxlKXtSMS5zZXQodCxlKSxlbChlLFt0XSl9Zm9yKHZhciBwaD0wO3BoPER5Lmxlbmd0aDtwaCsrKXt2YXIgZ2g9RHlbcGhdLEckPWdoLnRvTG93ZXJDYXNlKCksWSQ9Z2hbMF0udG9VcHBlckNhc2UoKStnaC5zbGljZSgxKTtnbyhHJCwib24iK1kkKX1nbyhiMSwib25BbmltYXRpb25FbmQiKTtnbygkMSwib25BbmltYXRpb25JdGVyYXRpb24iKTtnbyhUMSwib25BbmltYXRpb25TdGFydCIpO2dvKCJkYmxjbGljayIsIm9uRG91YmxlQ2xpY2siKTtnbygiZm9jdXNpbiIsIm9uRm9jdXMiKTtnbygiZm9jdXNvdXQiLCJvbkJsdXIiKTtnbyhOMSwib25UcmFuc2l0aW9uRW5kIik7ZXMoIm9uTW91c2VFbnRlciIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtlcygib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO2VzKCJvblBvaW50ZXJFbnRlciIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7ZXMoIm9uUG9pbnRlckxlYXZlIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtlbCgib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7ZWwoIm9uU2VsZWN0IiwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtlbCgib25CZWZvcmVJbnB1dCIsWyJjb21wb3NpdGlvbmVuZCIsImtleXByZXNzIiwidGV4dElucHV0IiwicGFzdGUiXSk7ZWwoIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7ZWwoIm9uQ29tcG9zaXRpb25TdGFydCIsImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO2VsKCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3ZhciBhYT0iYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIiksWCQ9bmV3IFNldCgiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdChhYSkpO2Z1bmN0aW9uIGp5KHQsZSxuKXt2YXIgcj10LnR5cGV8fCJ1bmtub3duLWV2ZW50Ijt0LmN1cnJlbnRUYXJnZXQ9bixHYihyLGUsdm9pZCAwLHQpLHQuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIE8xKHQsZSl7ZT0oZSY0KSE9PTA7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl0saT1yLmV2ZW50O3I9ci5saXN0ZW5lcnM7ZTp7dmFyIG89dm9pZCAwO2lmKGUpZm9yKHZhciBsPXIubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0O2lmKHM9cy5saXN0ZW5lcixhIT09byYmaS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7ankoaSxzLHUpLG89YX1lbHNlIGZvcihsPTA7bDxyLmxlbmd0aDtsKyspe2lmKHM9cltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQscz1zLmxpc3RlbmVyLGEhPT1vJiZpLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtqeShpLHMsdSksbz1hfX19aWYoUWMpdGhyb3cgdD1mcCxRYz0hMSxmcD1udWxsLHR9ZnVuY3Rpb24gZXQodCxlKXt2YXIgbj1lW1NwXTtuPT09dm9pZCAwJiYobj1lW1NwXT1uZXcgU2V0KTt2YXIgcj10KyJfX2J1YmJsZSI7bi5oYXMocil8fChQMShlLHQsMiwhMSksbi5hZGQocikpfWZ1bmN0aW9uIG1oKHQsZSxuKXt2YXIgcj0wO2UmJihyfD00KSxQMShuLHQscixlKX12YXIgaWM9Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gVmEodCl7aWYoIXRbaWNdKXt0W2ljXT0hMCx6Xy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24hPT0ic2VsZWN0aW9uY2hhbmdlIiYmKFgkLmhhcyhuKXx8bWgobiwhMSx0KSxtaChuLCEwLHQpKX0pO3ZhciBlPXQubm9kZVR5cGU9PT05P3Q6dC5vd25lckRvY3VtZW50O2U9PT1udWxsfHxlW2ljXXx8KGVbaWNdPSEwLG1oKCJzZWxlY3Rpb25jaGFuZ2UiLCExLGUpKX19ZnVuY3Rpb24gUDEodCxlLG4scil7c3dpdGNoKGcxKGUpKXtjYXNlIDE6dmFyIGk9YyQ7YnJlYWs7Y2FzZSA0Omk9ZCQ7YnJlYWs7ZGVmYXVsdDppPWZtfW49aS5iaW5kKG51bGwsZSxuLHQpLGk9dm9pZCAwLCFkcHx8ZSE9PSJ0b3VjaHN0YXJ0IiYmZSE9PSJ0b3VjaG1vdmUiJiZlIT09IndoZWVsInx8KGk9ITApLHI/aSE9PXZvaWQgMD90LmFkZEV2ZW50TGlzdGVuZXIoZSxuLHtjYXB0dXJlOiEwLHBhc3NpdmU6aX0pOnQuYWRkRXZlbnRMaXN0ZW5lcihlLG4sITApOmkhPT12b2lkIDA/dC5hZGRFdmVudExpc3RlbmVyKGUsbix7cGFzc2l2ZTppfSk6dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhMSl9ZnVuY3Rpb24gdmgodCxlLG4scixpKXt2YXIgbz1yO2lmKCEoZSYxKSYmIShlJjIpJiZyIT09bnVsbCllOmZvcig7Oyl7aWYocj09PW51bGwpcmV0dXJuO3ZhciBsPXIudGFnO2lmKGw9PT0zfHxsPT09NCl7dmFyIHM9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihzPT09aXx8cy5ub2RlVHlwZT09PTgmJnMucGFyZW50Tm9kZT09PWkpYnJlYWs7aWYobD09PTQpZm9yKGw9ci5yZXR1cm47bCE9PW51bGw7KXt2YXIgYT1sLnRhZztpZigoYT09PTN8fGE9PT00KSYmKGE9bC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxhPT09aXx8YS5ub2RlVHlwZT09PTgmJmEucGFyZW50Tm9kZT09PWkpKXJldHVybjtsPWwucmV0dXJufWZvcig7cyE9PW51bGw7KXtpZihsPVRvKHMpLGw9PT1udWxsKXJldHVybjtpZihhPWwudGFnLGE9PT01fHxhPT09Nil7cj1vPWw7Y29udGludWUgZX1zPXMucGFyZW50Tm9kZX19cj1yLnJldHVybn10MShmdW5jdGlvbigpe3ZhciB1PW8sYz1hbShuKSxkPVtdO2U6e3ZhciBmPVIxLmdldCh0KTtpZihmIT09dm9pZCAwKXt2YXIgaD1wbSxtPXQ7c3dpdGNoKHQpe2Nhc2Uia2V5cHJlc3MiOmlmKFBjKG4pPT09MClicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6aD1iJDticmVhaztjYXNlImZvY3VzaW4iOm09ImZvY3VzIixoPWNoO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOm09ImJsdXIiLGg9Y2g7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6aD1jaDticmVhaztjYXNlImNsaWNrIjppZihuLmJ1dHRvbj09PTIpYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOmg9Ynk7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6aD1wJDticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpoPU4kO2JyZWFrO2Nhc2UgYjE6Y2FzZSAkMTpjYXNlIFQxOmg9diQ7YnJlYWs7Y2FzZSBOMTpoPU8kO2JyZWFrO2Nhc2Uic2Nyb2xsIjpoPWYkO2JyZWFrO2Nhc2Uid2hlZWwiOmg9QSQ7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6aD14JDticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpoPVR5fXZhciBnPShlJjQpIT09MCx3PSFnJiZ0PT09InNjcm9sbCIsdj1nP2YhPT1udWxsP2YrIkNhcHR1cmUiOm51bGw6ZjtnPVtdO2Zvcih2YXIgeT11LHg7eSE9PW51bGw7KXt4PXk7dmFyIFM9eC5zdGF0ZU5vZGU7aWYoeC50YWc9PT01JiZTIT09bnVsbCYmKHg9Uyx2IT09bnVsbCYmKFM9amEoeSx2KSxTIT1udWxsJiZnLnB1c2goSGEoeSxTLHgpKSkpLHcpYnJlYWs7eT15LnJldHVybn0wPGcubGVuZ3RoJiYoZj1uZXcgaChmLG0sbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6ZixsaXN0ZW5lcnM6Z30pKX19aWYoIShlJjcpKXtlOntpZihmPXQ9PT0ibW91c2VvdmVyInx8dD09PSJwb2ludGVyb3ZlciIsaD10PT09Im1vdXNlb3V0Inx8dD09PSJwb2ludGVyb3V0IixmJiZuIT09dXAmJihtPW4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkmJihUbyhtKXx8bVtmaV0pKWJyZWFrIGU7aWYoKGh8fGYpJiYoZj1jLndpbmRvdz09PWM/YzooZj1jLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdyxoPyhtPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQsaD11LG09bT9UbyhtKTpudWxsLG0hPT1udWxsJiYodz10bChtKSxtIT09d3x8bS50YWchPT01JiZtLnRhZyE9PTYpJiYobT1udWxsKSk6KGg9bnVsbCxtPXUpLGghPT1tKSl7aWYoZz1ieSxTPSJvbk1vdXNlTGVhdmUiLHY9Im9uTW91c2VFbnRlciIseT0ibW91c2UiLCh0PT09InBvaW50ZXJvdXQifHx0PT09InBvaW50ZXJvdmVyIikmJihnPVR5LFM9Im9uUG9pbnRlckxlYXZlIix2PSJvblBvaW50ZXJFbnRlciIseT0icG9pbnRlciIpLHc9aD09bnVsbD9mOk9sKGgpLHg9bT09bnVsbD9mOk9sKG0pLGY9bmV3IGcoUyx5KyJsZWF2ZSIsaCxuLGMpLGYudGFyZ2V0PXcsZi5yZWxhdGVkVGFyZ2V0PXgsUz1udWxsLFRvKGMpPT09dSYmKGc9bmV3IGcodix5KyJlbnRlciIsbSxuLGMpLGcudGFyZ2V0PXgsZy5yZWxhdGVkVGFyZ2V0PXcsUz1nKSx3PVMsaCYmbSl0Ontmb3IoZz1oLHY9bSx5PTAseD1nO3g7eD1wbCh4KSl5Kys7Zm9yKHg9MCxTPXY7UztTPXBsKFMpKXgrKztmb3IoOzA8eS14OylnPXBsKGcpLHktLTtmb3IoOzA8eC15Oyl2PXBsKHYpLHgtLTtmb3IoO3ktLTspe2lmKGc9PT12fHx2IT09bnVsbCYmZz09PXYuYWx0ZXJuYXRlKWJyZWFrIHQ7Zz1wbChnKSx2PXBsKHYpfWc9bnVsbH1lbHNlIGc9bnVsbDtoIT09bnVsbCYmenkoZCxmLGgsZywhMSksbSE9PW51bGwmJnchPT1udWxsJiZ6eShkLHcsbSxnLCEwKX19ZTp7aWYoZj11P09sKHUpOndpbmRvdyxoPWYubm9kZU5hbWUmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxoPT09InNlbGVjdCJ8fGg9PT0iaW5wdXQiJiZmLnR5cGU9PT0iZmlsZSIpdmFyIGI9RiQ7ZWxzZSBpZihPeShmKSlpZih3MSliPVYkO2Vsc2V7Yj1VJDt2YXIgVD1CJH1lbHNlKGg9Zi5ub2RlTmFtZSkmJmgudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihmLnR5cGU9PT0iY2hlY2tib3gifHxmLnR5cGU9PT0icmFkaW8iKSYmKGI9VyQpO2lmKGImJihiPWIodCx1KSkpe18xKGQsYixuLGMpO2JyZWFrIGV9VCYmVCh0LGYsdSksdD09PSJmb2N1c291dCImJihUPWYuX3dyYXBwZXJTdGF0ZSkmJlQuY29udHJvbGxlZCYmZi50eXBlPT09Im51bWJlciImJmlwKGYsIm51bWJlciIsZi52YWx1ZSl9c3dpdGNoKFQ9dT9PbCh1KTp3aW5kb3csdCl7Y2FzZSJmb2N1c2luIjooT3koVCl8fFQuY29udGVudEVkaXRhYmxlPT09InRydWUiKSYmKE5sPVQsbXA9dSx2YT1udWxsKTticmVhaztjYXNlImZvY3Vzb3V0Ijp2YT1tcD1ObD1udWxsO2JyZWFrO2Nhc2UibW91c2Vkb3duIjp2cD0hMDticmVhaztjYXNlImNvbnRleHRtZW51IjpjYXNlIm1vdXNldXAiOmNhc2UiZHJhZ2VuZCI6dnA9ITEsSXkoZCxuLGMpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uY2hhbmdlIjppZihaJClicmVhaztjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOkl5KGQsbixjKX12YXIgJDtpZihtbSllOntzd2l0Y2godCl7Y2FzZSJjb21wb3NpdGlvbnN0YXJ0Ijp2YXIgTz0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOk89Im9uQ29tcG9zaXRpb25FbmQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Tz0ib25Db21wb3NpdGlvblVwZGF0ZSI7YnJlYWsgZX1PPXZvaWQgMH1lbHNlIFRsP3kxKHQsbikmJihPPSJvbkNvbXBvc2l0aW9uRW5kIik6dD09PSJrZXlkb3duIiYmbi5rZXlDb2RlPT09MjI5JiYoTz0ib25Db21wb3NpdGlvblN0YXJ0Iik7TyYmKHYxJiZuLmxvY2FsZSE9PSJrbyImJihUbHx8TyE9PSJvbkNvbXBvc2l0aW9uU3RhcnQiP089PT0ib25Db21wb3NpdGlvbkVuZCImJlRsJiYoJD1tMSgpKTooRmk9YyxobT0idmFsdWUiaW4gRmk/RmkudmFsdWU6RmkudGV4dENvbnRlbnQsVGw9ITApKSxUPW5kKHUsTyksMDxULmxlbmd0aCYmKE89bmV3ICR5KE8sdCxudWxsLG4sYyksZC5wdXNoKHtldmVudDpPLGxpc3RlbmVyczpUfSksJD9PLmRhdGE9JDooJD14MShuKSwkIT09bnVsbCYmKE8uZGF0YT0kKSkpKSwoJD1MJD9JJCh0LG4pOkQkKHQsbikpJiYodT1uZCh1LCJvbkJlZm9yZUlucHV0IiksMDx1Lmxlbmd0aCYmKGM9bmV3ICR5KCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOnV9KSxjLmRhdGE9JCkpfU8xKGQsZSl9KX1mdW5jdGlvbiBIYSh0LGUsbil7cmV0dXJue2luc3RhbmNlOnQsbGlzdGVuZXI6ZSxjdXJyZW50VGFyZ2V0Om59fWZ1bmN0aW9uIG5kKHQsZSl7Zm9yKHZhciBuPWUrIkNhcHR1cmUiLHI9W107dCE9PW51bGw7KXt2YXIgaT10LG89aS5zdGF0ZU5vZGU7aS50YWc9PT01JiZvIT09bnVsbCYmKGk9byxvPWphKHQsbiksbyE9bnVsbCYmci51bnNoaWZ0KEhhKHQsbyxpKSksbz1qYSh0LGUpLG8hPW51bGwmJnIucHVzaChIYSh0LG8saSkpKSx0PXQucmV0dXJufXJldHVybiByfWZ1bmN0aW9uIHBsKHQpe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2RvIHQ9dC5yZXR1cm47d2hpbGUodCYmdC50YWchPT01KTtyZXR1cm4gdHx8bnVsbH1mdW5jdGlvbiB6eSh0LGUsbixyLGkpe2Zvcih2YXIgbz1lLl9yZWFjdE5hbWUsbD1bXTtuIT09bnVsbCYmbiE9PXI7KXt2YXIgcz1uLGE9cy5hbHRlcm5hdGUsdT1zLnN0YXRlTm9kZTtpZihhIT09bnVsbCYmYT09PXIpYnJlYWs7cy50YWc9PT01JiZ1IT09bnVsbCYmKHM9dSxpPyhhPWphKG4sbyksYSE9bnVsbCYmbC51bnNoaWZ0KEhhKG4sYSxzKSkpOml8fChhPWphKG4sbyksYSE9bnVsbCYmbC5wdXNoKEhhKG4sYSxzKSkpKSxuPW4ucmV0dXJufWwubGVuZ3RoIT09MCYmdC5wdXNoKHtldmVudDplLGxpc3RlbmVyczpsfSl9dmFyIFEkPS9cclxuPy9nLEokPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gRnkodCl7cmV0dXJuKHR5cGVvZiB0PT0ic3RyaW5nIj90OiIiK3QpLnJlcGxhY2UoUSQsYApgKS5yZXBsYWNlKEokLCIiKX1mdW5jdGlvbiBvYyh0LGUsbil7aWYoZT1GeShlKSxGeSh0KSE9PWUmJm4pdGhyb3cgRXJyb3IoVyg0MjUpKX1mdW5jdGlvbiByZCgpe312YXIgeXA9bnVsbCx4cD1udWxsO2Z1bmN0aW9uIF9wKHQsZSl7cmV0dXJuIHQ9PT0idGV4dGFyZWEifHx0PT09Im5vc2NyaXB0Inx8dHlwZW9mIGUuY2hpbGRyZW49PSJzdHJpbmcifHx0eXBlb2YgZS5jaGlsZHJlbj09Im51bWJlciJ8fHR5cGVvZiBlLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT0ib2JqZWN0IiYmZS5kYW5nZXJvdXNseVNldElubmVySFRNTCE9PW51bGwmJmUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIT1udWxsfXZhciB3cD10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0OnZvaWQgMCxxJD10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDp2b2lkIDAsQnk9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZTp2b2lkIDAsZVQ9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOnR5cGVvZiBCeTwidSI/ZnVuY3Rpb24odCl7cmV0dXJuIEJ5LnJlc29sdmUobnVsbCkudGhlbih0KS5jYXRjaCh0VCl9OndwO2Z1bmN0aW9uIHRUKHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9ZnVuY3Rpb24geWgodCxlKXt2YXIgbj1lLHI9MDtkb3t2YXIgaT1uLm5leHRTaWJsaW5nO2lmKHQucmVtb3ZlQ2hpbGQobiksaSYmaS5ub2RlVHlwZT09PTgpaWYobj1pLmRhdGEsbj09PSIvJCIpe2lmKHI9PT0wKXt0LnJlbW92ZUNoaWxkKGkpLEJhKGUpO3JldHVybn1yLS19ZWxzZSBuIT09IiQiJiZuIT09IiQ/IiYmbiE9PSIkISJ8fHIrKztuPWl9d2hpbGUobik7QmEoZSl9ZnVuY3Rpb24gWmkodCl7Zm9yKDt0IT1udWxsO3Q9dC5uZXh0U2libGluZyl7dmFyIGU9dC5ub2RlVHlwZTtpZihlPT09MXx8ZT09PTMpYnJlYWs7aWYoZT09PTgpe2lmKGU9dC5kYXRhLGU9PT0iJCJ8fGU9PT0iJCEifHxlPT09IiQ/IilicmVhaztpZihlPT09Ii8kIilyZXR1cm4gbnVsbH19cmV0dXJuIHR9ZnVuY3Rpb24gVXkodCl7dD10LnByZXZpb3VzU2libGluZztmb3IodmFyIGU9MDt0Oyl7aWYodC5ub2RlVHlwZT09PTgpe3ZhciBuPXQuZGF0YTtpZihuPT09IiQifHxuPT09IiQhInx8bj09PSIkPyIpe2lmKGU9PT0wKXJldHVybiB0O2UtLX1lbHNlIG49PT0iLyQiJiZlKyt9dD10LnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgX3M9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksTXI9Il9fcmVhY3RGaWJlciQiK19zLEthPSJfX3JlYWN0UHJvcHMkIitfcyxmaT0iX19yZWFjdENvbnRhaW5lciQiK19zLFNwPSJfX3JlYWN0RXZlbnRzJCIrX3MsblQ9Il9fcmVhY3RMaXN0ZW5lcnMkIitfcyxyVD0iX19yZWFjdEhhbmRsZXMkIitfcztmdW5jdGlvbiBUbyh0KXt2YXIgZT10W01yXTtpZihlKXJldHVybiBlO2Zvcih2YXIgbj10LnBhcmVudE5vZGU7bjspe2lmKGU9bltmaV18fG5bTXJdKXtpZihuPWUuYWx0ZXJuYXRlLGUuY2hpbGQhPT1udWxsfHxuIT09bnVsbCYmbi5jaGlsZCE9PW51bGwpZm9yKHQ9VXkodCk7dCE9PW51bGw7KXtpZihuPXRbTXJdKXJldHVybiBuO3Q9VXkodCl9cmV0dXJuIGV9dD1uLG49dC5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIFB1KHQpe3JldHVybiB0PXRbTXJdfHx0W2ZpXSwhdHx8dC50YWchPT01JiZ0LnRhZyE9PTYmJnQudGFnIT09MTMmJnQudGFnIT09Mz9udWxsOnR9ZnVuY3Rpb24gT2wodCl7aWYodC50YWc9PT01fHx0LnRhZz09PTYpcmV0dXJuIHQuc3RhdGVOb2RlO3Rocm93IEVycm9yKFcoMzMpKX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdFtLYV18fG51bGx9dmFyIEVwPVtdLFBsPS0xO2Z1bmN0aW9uIG1vKHQpe3JldHVybntjdXJyZW50OnR9fWZ1bmN0aW9uIGl0KHQpezA+UGx8fCh0LmN1cnJlbnQ9RXBbUGxdLEVwW1BsXT1udWxsLFBsLS0pfWZ1bmN0aW9uIFhlKHQsZSl7UGwrKyxFcFtQbF09dC5jdXJyZW50LHQuY3VycmVudD1lfXZhciBubz17fSxybj1tbyhubyksJG49bW8oITEpLEZvPW5vO2Z1bmN0aW9uIHRzKHQsZSl7dmFyIG49dC50eXBlLmNvbnRleHRUeXBlcztpZighbilyZXR1cm4gbm87dmFyIHI9dC5zdGF0ZU5vZGU7aWYociYmci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09ZSlyZXR1cm4gci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgaT17fSxvO2ZvcihvIGluIG4paVtvXT1lW29dO3JldHVybiByJiYodD10LnN0YXRlTm9kZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLGl9ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQ9dC5jaGlsZENvbnRleHRUeXBlcyx0IT1udWxsfWZ1bmN0aW9uIGlkKCl7aXQoJG4pLGl0KHJuKX1mdW5jdGlvbiBXeSh0LGUsbil7aWYocm4uY3VycmVudCE9PW5vKXRocm93IEVycm9yKFcoMTY4KSk7WGUocm4sZSksWGUoJG4sbil9ZnVuY3Rpb24gQTEodCxlLG4pe3ZhciByPXQuc3RhdGVOb2RlO2lmKGU9ZS5jaGlsZENvbnRleHRUeXBlcyx0eXBlb2Ygci5nZXRDaGlsZENvbnRleHQhPSJmdW5jdGlvbiIpcmV0dXJuIG47cj1yLmdldENoaWxkQ29udGV4dCgpO2Zvcih2YXIgaSBpbiByKWlmKCEoaSBpbiBlKSl0aHJvdyBFcnJvcihXKDEwOCxCYih0KXx8IlVua25vd24iLGkpKTtyZXR1cm4gZ3Qoe30sbixyKX1mdW5jdGlvbiBvZCh0KXtyZXR1cm4gdD0odD10LnN0YXRlTm9kZSkmJnQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fG5vLEZvPXJuLmN1cnJlbnQsWGUocm4sdCksWGUoJG4sJG4uY3VycmVudCksITB9ZnVuY3Rpb24gVnkodCxlLG4pe3ZhciByPXQuc3RhdGVOb2RlO2lmKCFyKXRocm93IEVycm9yKFcoMTY5KSk7bj8odD1BMSh0LGUsRm8pLHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ9dCxpdCgkbiksaXQocm4pLFhlKHJuLHQpKTppdCgkbiksWGUoJG4sbil9dmFyIGlpPW51bGwsdWY9ITEseGg9ITE7ZnVuY3Rpb24gTTEodCl7aWk9PT1udWxsP2lpPVt0XTppaS5wdXNoKHQpfWZ1bmN0aW9uIGlUKHQpe3VmPSEwLE0xKHQpfWZ1bmN0aW9uIHZvKCl7aWYoIXhoJiZpaSE9PW51bGwpe3hoPSEwO3ZhciB0PTAsZT1XZTt0cnl7dmFyIG49aWk7Zm9yKFdlPTE7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ZG8gcj1yKCEwKTt3aGlsZShyIT09bnVsbCl9aWk9bnVsbCx1Zj0hMX1jYXRjaChpKXt0aHJvdyBpaSE9PW51bGwmJihpaT1paS5zbGljZSh0KzEpKSxvMSh1bSx2byksaX1maW5hbGx5e1dlPWUseGg9ITF9fXJldHVybiBudWxsfXZhciBBbD1bXSxNbD0wLGxkPW51bGwsc2Q9MCxZbj1bXSxYbj0wLEJvPW51bGwsc2k9MSxhaT0iIjtmdW5jdGlvbiBDbyh0LGUpe0FsW01sKytdPXNkLEFsW01sKytdPWxkLGxkPXQsc2Q9ZX1mdW5jdGlvbiBMMSh0LGUsbil7WW5bWG4rK109c2ksWW5bWG4rK109YWksWW5bWG4rK109Qm8sQm89dDt2YXIgcj1zaTt0PWFpO3ZhciBpPTMyLXhyKHIpLTE7ciY9figxPDxpKSxuKz0xO3ZhciBvPTMyLXhyKGUpK2k7aWYoMzA8byl7dmFyIGw9aS1pJTU7bz0ociYoMTw8bCktMSkudG9TdHJpbmcoMzIpLHI+Pj1sLGktPWwsc2k9MTw8MzIteHIoZSkraXxuPDxpfHIsYWk9byt0fWVsc2Ugc2k9MTw8b3xuPDxpfHIsYWk9dH1mdW5jdGlvbiB5bSh0KXt0LnJldHVybiE9PW51bGwmJihDbyh0LDEpLEwxKHQsMSwwKSl9ZnVuY3Rpb24geG0odCl7Zm9yKDt0PT09bGQ7KWxkPUFsWy0tTWxdLEFsW01sXT1udWxsLHNkPUFsWy0tTWxdLEFsW01sXT1udWxsO2Zvcig7dD09PUJvOylCbz1ZblstLVhuXSxZbltYbl09bnVsbCxhaT1ZblstLVhuXSxZbltYbl09bnVsbCxzaT1ZblstLVhuXSxZbltYbl09bnVsbH12YXIgRG49bnVsbCxJbj1udWxsLG90PSExLGdyPW51bGw7ZnVuY3Rpb24gSTEodCxlKXt2YXIgbj1xbig1LG51bGwsbnVsbCwwKTtuLmVsZW1lbnRUeXBlPSJERUxFVEVEIixuLnN0YXRlTm9kZT1lLG4ucmV0dXJuPXQsZT10LmRlbGV0aW9ucyxlPT09bnVsbD8odC5kZWxldGlvbnM9W25dLHQuZmxhZ3N8PTE2KTplLnB1c2gobil9ZnVuY3Rpb24gSHkodCxlKXtzd2l0Y2godC50YWcpe2Nhc2UgNTp2YXIgbj10LnR5cGU7cmV0dXJuIGU9ZS5ub2RlVHlwZSE9PTF8fG4udG9Mb3dlckNhc2UoKSE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmUsZSE9PW51bGw/KHQuc3RhdGVOb2RlPWUsRG49dCxJbj1aaShlLmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIGU9dC5wZW5kaW5nUHJvcHM9PT0iInx8ZS5ub2RlVHlwZSE9PTM/bnVsbDplLGUhPT1udWxsPyh0LnN0YXRlTm9kZT1lLERuPXQsSW49bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gZT1lLm5vZGVUeXBlIT09OD9udWxsOmUsZSE9PW51bGw/KG49Qm8hPT1udWxsP3tpZDpzaSxvdmVyZmxvdzphaX06bnVsbCx0Lm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6ZSx0cmVlQ29udGV4dDpuLHJldHJ5TGFuZToxMDczNzQxODI0fSxuPXFuKDE4LG51bGwsbnVsbCwwKSxuLnN0YXRlTm9kZT1lLG4ucmV0dXJuPXQsdC5jaGlsZD1uLERuPXQsSW49bnVsbCwhMCk6ITE7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gQ3AodCl7cmV0dXJuKHQubW9kZSYxKSE9PTAmJih0LmZsYWdzJjEyOCk9PT0wfWZ1bmN0aW9uIGtwKHQpe2lmKG90KXt2YXIgZT1JbjtpZihlKXt2YXIgbj1lO2lmKCFIeSh0LGUpKXtpZihDcCh0KSl0aHJvdyBFcnJvcihXKDQxOCkpO2U9Wmkobi5uZXh0U2libGluZyk7dmFyIHI9RG47ZSYmSHkodCxlKT9JMShyLG4pOih0LmZsYWdzPXQuZmxhZ3MmLTQwOTd8MixvdD0hMSxEbj10KX19ZWxzZXtpZihDcCh0KSl0aHJvdyBFcnJvcihXKDQxOCkpO3QuZmxhZ3M9dC5mbGFncyYtNDA5N3wyLG90PSExLERuPXR9fX1mdW5jdGlvbiBLeSh0KXtmb3IodD10LnJldHVybjt0IT09bnVsbCYmdC50YWchPT01JiZ0LnRhZyE9PTMmJnQudGFnIT09MTM7KXQ9dC5yZXR1cm47RG49dH1mdW5jdGlvbiBsYyh0KXtpZih0IT09RG4pcmV0dXJuITE7aWYoIW90KXJldHVybiBLeSh0KSxvdD0hMCwhMTt2YXIgZTtpZigoZT10LnRhZyE9PTMpJiYhKGU9dC50YWchPT01KSYmKGU9dC50eXBlLGU9ZSE9PSJoZWFkIiYmZSE9PSJib2R5IiYmIV9wKHQudHlwZSx0Lm1lbW9pemVkUHJvcHMpKSxlJiYoZT1Jbikpe2lmKENwKHQpKXRocm93IEQxKCksRXJyb3IoVyg0MTgpKTtmb3IoO2U7KUkxKHQsZSksZT1aaShlLm5leHRTaWJsaW5nKX1pZihLeSh0KSx0LnRhZz09PTEzKXtpZih0PXQubWVtb2l6ZWRTdGF0ZSx0PXQhPT1udWxsP3QuZGVoeWRyYXRlZDpudWxsLCF0KXRocm93IEVycm9yKFcoMzE3KSk7ZTp7Zm9yKHQ9dC5uZXh0U2libGluZyxlPTA7dDspe2lmKHQubm9kZVR5cGU9PT04KXt2YXIgbj10LmRhdGE7aWYobj09PSIvJCIpe2lmKGU9PT0wKXtJbj1aaSh0Lm5leHRTaWJsaW5nKTticmVhayBlfWUtLX1lbHNlIG4hPT0iJCImJm4hPT0iJCEiJiZuIT09IiQ/Inx8ZSsrfXQ9dC5uZXh0U2libGluZ31Jbj1udWxsfX1lbHNlIEluPURuP1ppKHQuc3RhdGVOb2RlLm5leHRTaWJsaW5nKTpudWxsO3JldHVybiEwfWZ1bmN0aW9uIEQxKCl7Zm9yKHZhciB0PUluO3Q7KXQ9WmkodC5uZXh0U2libGluZyl9ZnVuY3Rpb24gbnMoKXtJbj1Ebj1udWxsLG90PSExfWZ1bmN0aW9uIF9tKHQpe2dyPT09bnVsbD9ncj1bdF06Z3IucHVzaCh0KX12YXIgb1Q9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gZnIodCxlKXtpZih0JiZ0LmRlZmF1bHRQcm9wcyl7ZT1ndCh7fSxlKSx0PXQuZGVmYXVsdFByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09PT12b2lkIDAmJihlW25dPXRbbl0pO3JldHVybiBlfXJldHVybiBlfXZhciBhZD1tbyhudWxsKSx1ZD1udWxsLExsPW51bGwsd209bnVsbDtmdW5jdGlvbiBTbSgpe3dtPUxsPXVkPW51bGx9ZnVuY3Rpb24gRW0odCl7dmFyIGU9YWQuY3VycmVudDtpdChhZCksdC5fY3VycmVudFZhbHVlPWV9ZnVuY3Rpb24gYnAodCxlLG4pe2Zvcig7dCE9PW51bGw7KXt2YXIgcj10LmFsdGVybmF0ZTtpZigodC5jaGlsZExhbmVzJmUpIT09ZT8odC5jaGlsZExhbmVzfD1lLHIhPT1udWxsJiYoci5jaGlsZExhbmVzfD1lKSk6ciE9PW51bGwmJihyLmNoaWxkTGFuZXMmZSkhPT1lJiYoci5jaGlsZExhbmVzfD1lKSx0PT09bilicmVhazt0PXQucmV0dXJufX1mdW5jdGlvbiBLbCh0LGUpe3VkPXQsd209TGw9bnVsbCx0PXQuZGVwZW5kZW5jaWVzLHQhPT1udWxsJiZ0LmZpcnN0Q29udGV4dCE9PW51bGwmJih0LmxhbmVzJmUmJihibj0hMCksdC5maXJzdENvbnRleHQ9bnVsbCl9ZnVuY3Rpb24gbnIodCl7dmFyIGU9dC5fY3VycmVudFZhbHVlO2lmKHdtIT09dClpZih0PXtjb250ZXh0OnQsbWVtb2l6ZWRWYWx1ZTplLG5leHQ6bnVsbH0sTGw9PT1udWxsKXtpZih1ZD09PW51bGwpdGhyb3cgRXJyb3IoVygzMDgpKTtMbD10LHVkLmRlcGVuZGVuY2llcz17bGFuZXM6MCxmaXJzdENvbnRleHQ6dH19ZWxzZSBMbD1MbC5uZXh0PXQ7cmV0dXJuIGV9dmFyIE5vPW51bGw7ZnVuY3Rpb24gQ20odCl7Tm89PT1udWxsP05vPVt0XTpOby5wdXNoKHQpfWZ1bmN0aW9uIGoxKHQsZSxuLHIpe3ZhciBpPWUuaW50ZXJsZWF2ZWQ7cmV0dXJuIGk9PT1udWxsPyhuLm5leHQ9bixDbShlKSk6KG4ubmV4dD1pLm5leHQsaS5uZXh0PW4pLGUuaW50ZXJsZWF2ZWQ9bixoaSh0LHIpfWZ1bmN0aW9uIGhpKHQsZSl7dC5sYW5lc3w9ZTt2YXIgbj10LmFsdGVybmF0ZTtmb3IobiE9PW51bGwmJihuLmxhbmVzfD1lKSxuPXQsdD10LnJldHVybjt0IT09bnVsbDspdC5jaGlsZExhbmVzfD1lLG49dC5hbHRlcm5hdGUsbiE9PW51bGwmJihuLmNoaWxkTGFuZXN8PWUpLG49dCx0PXQucmV0dXJuO3JldHVybiBuLnRhZz09PTM/bi5zdGF0ZU5vZGU6bnVsbH12YXIgTWk9ITE7ZnVuY3Rpb24ga20odCl7dC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOnQubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1mdW5jdGlvbiB6MSh0LGUpe3Q9dC51cGRhdGVRdWV1ZSxlLnVwZGF0ZVF1ZXVlPT09dCYmKGUudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTp0LmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6dC5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6dC5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6dC5zaGFyZWQsZWZmZWN0czp0LmVmZmVjdHN9KX1mdW5jdGlvbiB1aSh0LGUpe3JldHVybntldmVudFRpbWU6dCxsYW5lOmUsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBHaSh0LGUsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtpZihyPXIuc2hhcmVkLExlJjIpe3ZhciBpPXIucGVuZGluZztyZXR1cm4gaT09PW51bGw/ZS5uZXh0PWU6KGUubmV4dD1pLm5leHQsaS5uZXh0PWUpLHIucGVuZGluZz1lLGhpKHQsbil9cmV0dXJuIGk9ci5pbnRlcmxlYXZlZCxpPT09bnVsbD8oZS5uZXh0PWUsQ20ocikpOihlLm5leHQ9aS5uZXh0LGkubmV4dD1lKSxyLmludGVybGVhdmVkPWUsaGkodCxuKX1mdW5jdGlvbiBBYyh0LGUsbil7aWYoZT1lLnVwZGF0ZVF1ZXVlLGUhPT1udWxsJiYoZT1lLnNoYXJlZCwobiY0MTk0MjQwKSE9PTApKXt2YXIgcj1lLmxhbmVzO3ImPXQucGVuZGluZ0xhbmVzLG58PXIsZS5sYW5lcz1uLGNtKHQsbil9fWZ1bmN0aW9uIFp5KHQsZSl7dmFyIG49dC51cGRhdGVRdWV1ZSxyPXQuYWx0ZXJuYXRlO2lmKHIhPT1udWxsJiYocj1yLnVwZGF0ZVF1ZXVlLG49PT1yKSl7dmFyIGk9bnVsbCxvPW51bGw7aWYobj1uLmZpcnN0QmFzZVVwZGF0ZSxuIT09bnVsbCl7ZG97dmFyIGw9e2V2ZW50VGltZTpuLmV2ZW50VGltZSxsYW5lOm4ubGFuZSx0YWc6bi50YWcscGF5bG9hZDpuLnBheWxvYWQsY2FsbGJhY2s6bi5jYWxsYmFjayxuZXh0Om51bGx9O289PT1udWxsP2k9bz1sOm89by5uZXh0PWwsbj1uLm5leHR9d2hpbGUobiE9PW51bGwpO289PT1udWxsP2k9bz1lOm89by5uZXh0PWV9ZWxzZSBpPW89ZTtuPXtiYXNlU3RhdGU6ci5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmksbGFzdEJhc2VVcGRhdGU6byxzaGFyZWQ6ci5zaGFyZWQsZWZmZWN0czpyLmVmZmVjdHN9LHQudXBkYXRlUXVldWU9bjtyZXR1cm59dD1uLmxhc3RCYXNlVXBkYXRlLHQ9PT1udWxsP24uZmlyc3RCYXNlVXBkYXRlPWU6dC5uZXh0PWUsbi5sYXN0QmFzZVVwZGF0ZT1lfWZ1bmN0aW9uIGNkKHQsZSxuLHIpe3ZhciBpPXQudXBkYXRlUXVldWU7TWk9ITE7dmFyIG89aS5maXJzdEJhc2VVcGRhdGUsbD1pLmxhc3RCYXNlVXBkYXRlLHM9aS5zaGFyZWQucGVuZGluZztpZihzIT09bnVsbCl7aS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBhPXMsdT1hLm5leHQ7YS5uZXh0PW51bGwsbD09PW51bGw/bz11OmwubmV4dD11LGw9YTt2YXIgYz10LmFsdGVybmF0ZTtjIT09bnVsbCYmKGM9Yy51cGRhdGVRdWV1ZSxzPWMubGFzdEJhc2VVcGRhdGUscyE9PWwmJihzPT09bnVsbD9jLmZpcnN0QmFzZVVwZGF0ZT11OnMubmV4dD11LGMubGFzdEJhc2VVcGRhdGU9YSkpfWlmKG8hPT1udWxsKXt2YXIgZD1pLmJhc2VTdGF0ZTtsPTAsYz11PWE9bnVsbCxzPW87ZG97dmFyIGY9cy5sYW5lLGg9cy5ldmVudFRpbWU7aWYoKHImZik9PT1mKXtjIT09bnVsbCYmKGM9Yy5uZXh0PXtldmVudFRpbWU6aCxsYW5lOjAsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSk7ZTp7dmFyIG09dCxnPXM7c3dpdGNoKGY9ZSxoPW4sZy50YWcpe2Nhc2UgMTppZihtPWcucGF5bG9hZCx0eXBlb2YgbT09ImZ1bmN0aW9uIil7ZD1tLmNhbGwoaCxkLGYpO2JyZWFrIGV9ZD1tO2JyZWFrIGU7Y2FzZSAzOm0uZmxhZ3M9bS5mbGFncyYtNjU1Mzd8MTI4O2Nhc2UgMDppZihtPWcucGF5bG9hZCxmPXR5cGVvZiBtPT0iZnVuY3Rpb24iP20uY2FsbChoLGQsZik6bSxmPT1udWxsKWJyZWFrIGU7ZD1ndCh7fSxkLGYpO2JyZWFrIGU7Y2FzZSAyOk1pPSEwfX1zLmNhbGxiYWNrIT09bnVsbCYmcy5sYW5lIT09MCYmKHQuZmxhZ3N8PTY0LGY9aS5lZmZlY3RzLGY9PT1udWxsP2kuZWZmZWN0cz1bc106Zi5wdXNoKHMpKX1lbHNlIGg9e2V2ZW50VGltZTpoLGxhbmU6Zix0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9LGM9PT1udWxsPyh1PWM9aCxhPWQpOmM9Yy5uZXh0PWgsbHw9ZjtpZihzPXMubmV4dCxzPT09bnVsbCl7aWYocz1pLnNoYXJlZC5wZW5kaW5nLHM9PT1udWxsKWJyZWFrO2Y9cyxzPWYubmV4dCxmLm5leHQ9bnVsbCxpLmxhc3RCYXNlVXBkYXRlPWYsaS5zaGFyZWQucGVuZGluZz1udWxsfX13aGlsZSghMCk7aWYoYz09PW51bGwmJihhPWQpLGkuYmFzZVN0YXRlPWEsaS5maXJzdEJhc2VVcGRhdGU9dSxpLmxhc3RCYXNlVXBkYXRlPWMsZT1pLnNoYXJlZC5pbnRlcmxlYXZlZCxlIT09bnVsbCl7aT1lO2RvIGx8PWkubGFuZSxpPWkubmV4dDt3aGlsZShpIT09ZSl9ZWxzZSBvPT09bnVsbCYmKGkuc2hhcmVkLmxhbmVzPTApO1dvfD1sLHQubGFuZXM9bCx0Lm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gR3kodCxlLG4pe2lmKHQ9ZS5lZmZlY3RzLGUuZWZmZWN0cz1udWxsLHQhPT1udWxsKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciByPXRbZV0saT1yLmNhbGxiYWNrO2lmKGkhPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTkxLGkpKTtpLmNhbGwocil9fX12YXIgRjE9bmV3IGpfLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gJHAodCxlLG4scil7ZT10Lm1lbW9pemVkU3RhdGUsbj1uKHIsZSksbj1uPT1udWxsP2U6Z3Qoe30sZSxuKSx0Lm1lbW9pemVkU3RhdGU9bix0LmxhbmVzPT09MCYmKHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBjZj17aXNNb3VudGVkOmZ1bmN0aW9uKHQpe3JldHVybih0PXQuX3JlYWN0SW50ZXJuYWxzKT90bCh0KT09PXQ6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbih0LGUsbil7dD10Ll9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkodCksbz11aShyLGkpO28ucGF5bG9hZD1lLG4hPW51bGwmJihvLmNhbGxiYWNrPW4pLGU9R2kodCxvLGkpLGUhPT1udWxsJiYoX3IoZSx0LGksciksQWMoZSx0LGkpKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUsbil7dD10Ll9yZWFjdEludGVybmFsczt2YXIgcj12bigpLGk9WGkodCksbz11aShyLGkpO28udGFnPTEsby5wYXlsb2FkPWUsbiE9bnVsbCYmKG8uY2FsbGJhY2s9biksZT1HaSh0LG8saSksZSE9PW51bGwmJihfcihlLHQsaSxyKSxBYyhlLHQsaSkpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24odCxlKXt0PXQuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPXZuKCkscj1YaSh0KSxpPXVpKG4scik7aS50YWc9MixlIT1udWxsJiYoaS5jYWxsYmFjaz1lKSxlPUdpKHQsaSxyKSxlIT09bnVsbCYmKF9yKGUsdCxyLG4pLEFjKGUsdCxyKSl9fTtmdW5jdGlvbiBZeSh0LGUsbixyLGksbyxsKXtyZXR1cm4gdD10LnN0YXRlTm9kZSx0eXBlb2YgdC5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/dC5zaG91bGRDb21wb25lbnRVcGRhdGUocixvLGwpOmUucHJvdG90eXBlJiZlLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hV2EobixyKXx8IVdhKGksbyk6ITB9ZnVuY3Rpb24gQjEodCxlLG4pe3ZhciByPSExLGk9bm8sbz1lLmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP289bnIobyk6KGk9VG4oZSk/Rm86cm4uY3VycmVudCxyPWUuY29udGV4dFR5cGVzLG89KHI9ciE9bnVsbCk/dHModCxpKTpubyksZT1uZXcgZShuLG8pLHQubWVtb2l6ZWRTdGF0ZT1lLnN0YXRlIT09bnVsbCYmZS5zdGF0ZSE9PXZvaWQgMD9lLnN0YXRlOm51bGwsZS51cGRhdGVyPWNmLHQuc3RhdGVOb2RlPWUsZS5fcmVhY3RJbnRlcm5hbHM9dCxyJiYodD10LnN0YXRlTm9kZSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9aSx0Ll9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PW8pLGV9ZnVuY3Rpb24gWHkodCxlLG4scil7dD1lLnN0YXRlLHR5cGVvZiBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJmUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksZS5zdGF0ZSE9PXQmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpfWZ1bmN0aW9uIFRwKHQsZSxuLHIpe3ZhciBpPXQuc3RhdGVOb2RlO2kucHJvcHM9bixpLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxpLnJlZnM9RjEsa20odCk7dmFyIG89ZS5jb250ZXh0VHlwZTt0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsP2kuY29udGV4dD1ucihvKToobz1UbihlKT9Gbzpybi5jdXJyZW50LGkuY29udGV4dD10cyh0LG8pKSxpLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxvPWUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBvPT0iZnVuY3Rpb24iJiYoJHAodCxlLG8sbiksaS5zdGF0ZT10Lm1lbW9pemVkU3RhdGUpLHR5cGVvZiBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KGU9aS5zdGF0ZSx0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksZSE9PWkuc3RhdGUmJmNmLmVucXVldWVSZXBsYWNlU3RhdGUoaSxpLnN0YXRlLG51bGwpLGNkKHQsbixpLHIpLGkuc3RhdGU9dC5tZW1vaXplZFN0YXRlKSx0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIEhzKHQsZSxuKXtpZih0PW4ucmVmLHQhPT1udWxsJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVygzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihXKDE0Nyx0KSk7dmFyIGk9cixvPSIiK3Q7cmV0dXJuIGUhPT1udWxsJiZlLnJlZiE9PW51bGwmJnR5cGVvZiBlLnJlZj09ImZ1bmN0aW9uIiYmZS5yZWYuX3N0cmluZ1JlZj09PW8/ZS5yZWY6KGU9ZnVuY3Rpb24obCl7dmFyIHM9aS5yZWZzO3M9PT1GMSYmKHM9aS5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tvXTpzW29dPWx9LGUuX3N0cmluZ1JlZj1vLGUpfWlmKHR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBFcnJvcihXKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihXKDI5MCx0KSl9cmV0dXJuIHR9ZnVuY3Rpb24gc2ModCxlKXt0aHJvdyB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSxFcnJvcihXKDMxLHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSl9ZnVuY3Rpb24gUXkodCl7dmFyIGU9dC5faW5pdDtyZXR1cm4gZSh0Ll9wYXlsb2FkKX1mdW5jdGlvbiBVMSh0KXtmdW5jdGlvbiBlKHYseSl7aWYodCl7dmFyIHg9di5kZWxldGlvbnM7eD09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6eC5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIXQpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspZSh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBpKHYseSl7cmV0dXJuIHY9UWkodix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBvKHYseSx4KXtyZXR1cm4gdi5pbmRleD14LHQ/KHg9di5hbHRlcm5hdGUseCE9PW51bGw/KHg9eC5pbmRleCx4PHk/KHYuZmxhZ3N8PTIseSk6eCk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIHQmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHkseCxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT1iaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHkpOih5PWkoeSx4KSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LHgsUyl7dmFyIGI9eC50eXBlO3JldHVybiBiPT09JGw/Yyh2LHkseC5wcm9wcy5jaGlsZHJlbixTLHgua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1ifHx0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsJiZiLiQkdHlwZW9mPT09QWkmJlF5KGIpPT09eS50eXBlKT8oUz1pKHkseC5wcm9wcyksUy5yZWY9SHModix5LHgpLFMucmV0dXJuPXYsUyk6KFM9emMoeC50eXBlLHgua2V5LHgucHJvcHMsbnVsbCx2Lm1vZGUsUyksUy5yZWY9SHModix5LHgpLFMucmV0dXJuPXYsUyl9ZnVuY3Rpb24gdSh2LHkseCxTKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXguY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT14LmltcGxlbWVudGF0aW9uPyh5PSRoKHgsdi5tb2RlLFMpLHkucmV0dXJuPXYseSk6KHk9aSh5LHguY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LHgsUyxiKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1Nbyh4LHYubW9kZSxTLGIpLHkucmV0dXJuPXYseSk6KHk9aSh5LHgpLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHkseCl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT1iaCgiIit5LHYubW9kZSx4KSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIHg9emMoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUseCkseC5yZWY9SHModixudWxsLHkpLHgucmV0dXJuPXYseDtjYXNlIGJsOnJldHVybiB5PSRoKHksdi5tb2RlLHgpLHkucmV0dXJuPXYseTtjYXNlIEFpOnZhciBTPXkuX2luaXQ7cmV0dXJuIGQodixTKHkuX3BheWxvYWQpLHgpfWlmKGxhKHkpfHxGcyh5KSlyZXR1cm4geT1Nbyh5LHYubW9kZSx4LG51bGwpLHkucmV0dXJuPXYseTtzYyh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LHgsUyl7dmFyIGI9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiKXJldHVybiBiIT09bnVsbD9udWxsOnModix5LCIiK3gsUyk7aWYodHlwZW9mIHg9PSJvYmplY3QiJiZ4IT09bnVsbCl7c3dpdGNoKHguJCR0eXBlb2Ype2Nhc2UgWHU6cmV0dXJuIHgua2V5PT09Yj9hKHYseSx4LFMpOm51bGw7Y2FzZSBibDpyZXR1cm4geC5rZXk9PT1iP3Uodix5LHgsUyk6bnVsbDtjYXNlIEFpOnJldHVybiBiPXguX2luaXQsZih2LHksYih4Ll9wYXlsb2FkKSxTKX1pZihsYSh4KXx8RnMoeCkpcmV0dXJuIGIhPT1udWxsP251bGw6Yyh2LHkseCxTLG51bGwpO3NjKHYseCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHkseCxTLGIpe2lmKHR5cGVvZiBTPT0ic3RyaW5nIiYmUyE9PSIifHx0eXBlb2YgUz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoeCl8fG51bGwscyh5LHYsIiIrUyxiKTtpZih0eXBlb2YgUz09Im9iamVjdCImJlMhPT1udWxsKXtzd2l0Y2goUy4kJHR5cGVvZil7Y2FzZSBYdTpyZXR1cm4gdj12LmdldChTLmtleT09PW51bGw/eDpTLmtleSl8fG51bGwsYSh5LHYsUyxiKTtjYXNlIGJsOnJldHVybiB2PXYuZ2V0KFMua2V5PT09bnVsbD94OlMua2V5KXx8bnVsbCx1KHksdixTLGIpO2Nhc2UgQWk6dmFyIFQ9Uy5faW5pdDtyZXR1cm4gaCh2LHkseCxUKFMuX3BheWxvYWQpLGIpfWlmKGxhKFMpfHxGcyhTKSlyZXR1cm4gdj12LmdldCh4KXx8bnVsbCxjKHksdixTLGIsbnVsbCk7c2MoeSxTKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtKHYseSx4LFMpe2Zvcih2YXIgYj1udWxsLFQ9bnVsbCwkPXksTz15PTAsTD1udWxsOyQhPT1udWxsJiZPPHgubGVuZ3RoO08rKyl7JC5pbmRleD5PPyhMPSQsJD1udWxsKTpMPSQuc2libGluZzt2YXIgUD1mKHYsJCx4W09dLFMpO2lmKFA9PT1udWxsKXskPT09bnVsbCYmKCQ9TCk7YnJlYWt9dCYmJCYmUC5hbHRlcm5hdGU9PT1udWxsJiZlKHYsJCkseT1vKFAseSxPKSxUPT09bnVsbD9iPVA6VC5zaWJsaW5nPVAsVD1QLCQ9TH1pZihPPT09eC5sZW5ndGgpcmV0dXJuIG4odiwkKSxvdCYmQ28odixPKSxiO2lmKCQ9PT1udWxsKXtmb3IoO088eC5sZW5ndGg7TysrKSQ9ZCh2LHhbT10sUyksJCE9PW51bGwmJih5PW8oJCx5LE8pLFQ9PT1udWxsP2I9JDpULnNpYmxpbmc9JCxUPSQpO3JldHVybiBvdCYmQ28odixPKSxifWZvcigkPXIodiwkKTtPPHgubGVuZ3RoO08rKylMPWgoJCx2LE8seFtPXSxTKSxMIT09bnVsbCYmKHQmJkwuYWx0ZXJuYXRlIT09bnVsbCYmJC5kZWxldGUoTC5rZXk9PT1udWxsP086TC5rZXkpLHk9byhMLHksTyksVD09PW51bGw/Yj1MOlQuc2libGluZz1MLFQ9TCk7cmV0dXJuIHQmJiQuZm9yRWFjaChmdW5jdGlvbihEKXtyZXR1cm4gZSh2LEQpfSksb3QmJkNvKHYsTyksYn1mdW5jdGlvbiBnKHYseSx4LFMpe3ZhciBiPUZzKHgpO2lmKHR5cGVvZiBiIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTUwKSk7aWYoeD1iLmNhbGwoeCkseD09bnVsbCl0aHJvdyBFcnJvcihXKDE1MSkpO2Zvcih2YXIgVD1iPW51bGwsJD15LE89eT0wLEw9bnVsbCxQPXgubmV4dCgpOyQhPT1udWxsJiYhUC5kb25lO08rKyxQPXgubmV4dCgpKXskLmluZGV4Pk8/KEw9JCwkPW51bGwpOkw9JC5zaWJsaW5nO3ZhciBEPWYodiwkLFAudmFsdWUsUyk7aWYoRD09PW51bGwpeyQ9PT1udWxsJiYoJD1MKTticmVha310JiYkJiZELmFsdGVybmF0ZT09PW51bGwmJmUodiwkKSx5PW8oRCx5LE8pLFQ9PT1udWxsP2I9RDpULnNpYmxpbmc9RCxUPUQsJD1MfWlmKFAuZG9uZSlyZXR1cm4gbih2LCQpLG90JiZDbyh2LE8pLGI7aWYoJD09PW51bGwpe2Zvcig7IVAuZG9uZTtPKyssUD14Lm5leHQoKSlQPWQodixQLnZhbHVlLFMpLFAhPT1udWxsJiYoeT1vKFAseSxPKSxUPT09bnVsbD9iPVA6VC5zaWJsaW5nPVAsVD1QKTtyZXR1cm4gb3QmJkNvKHYsTyksYn1mb3IoJD1yKHYsJCk7IVAuZG9uZTtPKyssUD14Lm5leHQoKSlQPWgoJCx2LE8sUC52YWx1ZSxTKSxQIT09bnVsbCYmKHQmJlAuYWx0ZXJuYXRlIT09bnVsbCYmJC5kZWxldGUoUC5rZXk9PT1udWxsP086UC5rZXkpLHk9byhQLHksTyksVD09PW51bGw/Yj1QOlQuc2libGluZz1QLFQ9UCk7cmV0dXJuIHQmJiQuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gZSh2LEIpfSksb3QmJkNvKHYsTyksYn1mdW5jdGlvbiB3KHYseSx4LFMpe2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJngudHlwZT09PSRsJiZ4LmtleT09PW51bGwmJih4PXgucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwpe3N3aXRjaCh4LiQkdHlwZW9mKXtjYXNlIFh1OmU6e2Zvcih2YXIgYj14LmtleSxUPXk7VCE9PW51bGw7KXtpZihULmtleT09PWIpe2lmKGI9eC50eXBlLGI9PT0kbCl7aWYoVC50YWc9PT03KXtuKHYsVC5zaWJsaW5nKSx5PWkoVCx4LnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKFQuZWxlbWVudFR5cGU9PT1ifHx0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsJiZiLiQkdHlwZW9mPT09QWkmJlF5KGIpPT09VC50eXBlKXtuKHYsVC5zaWJsaW5nKSx5PWkoVCx4LnByb3BzKSx5LnJlZj1Icyh2LFQseCkseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsVCk7YnJlYWt9ZWxzZSBlKHYsVCk7VD1ULnNpYmxpbmd9eC50eXBlPT09JGw/KHk9TW8oeC5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsUyx4LmtleSkseS5yZXR1cm49dix2PXkpOihTPXpjKHgudHlwZSx4LmtleSx4LnByb3BzLG51bGwsdi5tb2RlLFMpLFMucmVmPUhzKHYseSx4KSxTLnJldHVybj12LHY9Uyl9cmV0dXJuIGwodik7Y2FzZSBibDplOntmb3IoVD14LmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09VClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT14LmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09eC5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1pKHkseC5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSBlKHYseSk7eT15LnNpYmxpbmd9eT0kaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIEFpOnJldHVybiBUPXguX2luaXQsdyh2LHksVCh4Ll9wYXlsb2FkKSxTKX1pZihsYSh4KSlyZXR1cm4gbSh2LHkseCxTKTtpZihGcyh4KSlyZXR1cm4gZyh2LHkseCxTKTtzYyh2LHgpfXJldHVybiB0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiPyh4PSIiK3gseSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1pKHkseCkseS5yZXR1cm49dix2PXkpOihuKHYseSkseT1iaCh4LHYubW9kZSxTKSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiB3fXZhciBycz1VMSghMCksVzE9VTEoITEpLEF1PXt9LEZyPW1vKEF1KSxaYT1tbyhBdSksR2E9bW8oQXUpO2Z1bmN0aW9uIFJvKHQpe2lmKHQ9PT1BdSl0aHJvdyBFcnJvcihXKDE3NCkpO3JldHVybiB0fWZ1bmN0aW9uIGJtKHQsZSl7c3dpdGNoKFhlKEdhLGUpLFhlKFphLHQpLFhlKEZyLEF1KSx0PWUubm9kZVR5cGUsdCl7Y2FzZSA5OmNhc2UgMTE6ZT0oZT1lLmRvY3VtZW50RWxlbWVudCk/ZS5uYW1lc3BhY2VVUkk6bHAobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDp0PXQ9PT04P2UucGFyZW50Tm9kZTplLGU9dC5uYW1lc3BhY2VVUkl8fG51bGwsdD10LnRhZ05hbWUsZT1scChlLHQpfWl0KEZyKSxYZShGcixlKX1mdW5jdGlvbiBpcygpe2l0KEZyKSxpdChaYSksaXQoR2EpfWZ1bmN0aW9uIFYxKHQpe1JvKEdhLmN1cnJlbnQpO3ZhciBlPVJvKEZyLmN1cnJlbnQpLG49bHAoZSx0LnR5cGUpO2UhPT1uJiYoWGUoWmEsdCksWGUoRnIsbikpfWZ1bmN0aW9uICRtKHQpe1phLmN1cnJlbnQ9PT10JiYoaXQoRnIpLGl0KFphKSl9dmFyIGR0PW1vKDApO2Z1bmN0aW9uIGRkKHQpe2Zvcih2YXIgZT10O2UhPT1udWxsOyl7aWYoZS50YWc9PT0xMyl7dmFyIG49ZS5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiBlfWVsc2UgaWYoZS50YWc9PT0xOSYmZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZihlLmZsYWdzJjEyOClyZXR1cm4gZX1lbHNlIGlmKGUuY2hpbGQhPT1udWxsKXtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZDtjb250aW51ZX1pZihlPT09dClicmVhaztmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClyZXR1cm4gbnVsbDtlPWUucmV0dXJufWUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIF9oPVtdO2Z1bmN0aW9uIFRtKCl7Zm9yKHZhciB0PTA7dDxfaC5sZW5ndGg7dCsrKV9oW3RdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7X2gubGVuZ3RoPTB9dmFyIE1jPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsd2g9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsVW89MCxodD1udWxsLFJ0PW51bGwsSXQ9bnVsbCxmZD0hMSx5YT0hMSxZYT0wLGxUPTA7ZnVuY3Rpb24gWXQoKXt0aHJvdyBFcnJvcihXKDMyMSkpfWZ1bmN0aW9uIE5tKHQsZSl7aWYoZT09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aCYmbjx0Lmxlbmd0aDtuKyspaWYoIUVyKHRbbl0sZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUm0odCxlLG4scixpLG8pe2lmKFVvPW8saHQ9ZSxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGwsZS5sYW5lcz0wLE1jLmN1cnJlbnQ9dD09PW51bGx8fHQubWVtb2l6ZWRTdGF0ZT09PW51bGw/Y1Q6ZFQsdD1uKHIsaSkseWEpe289MDtkb3tpZih5YT0hMSxZYT0wLDI1PD1vKXRocm93IEVycm9yKFcoMzAxKSk7bys9MSxJdD1SdD1udWxsLGUudXBkYXRlUXVldWU9bnVsbCxNYy5jdXJyZW50PWZULHQ9bihyLGkpfXdoaWxlKHlhKX1pZihNYy5jdXJyZW50PWhkLGU9UnQhPT1udWxsJiZSdC5uZXh0IT09bnVsbCxVbz0wLEl0PVJ0PWh0PW51bGwsZmQ9ITEsZSl0aHJvdyBFcnJvcihXKDMwMCkpO3JldHVybiB0fWZ1bmN0aW9uIE9tKCl7dmFyIHQ9WWEhPT0wO3JldHVybiBZYT0wLHR9ZnVuY3Rpb24gUHIoKXt2YXIgdD17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gSXQ9PT1udWxsP2h0Lm1lbW9pemVkU3RhdGU9SXQ9dDpJdD1JdC5uZXh0PXQsSXR9ZnVuY3Rpb24gcnIoKXtpZihSdD09PW51bGwpe3ZhciB0PWh0LmFsdGVybmF0ZTt0PXQhPT1udWxsP3QubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgdD1SdC5uZXh0O3ZhciBlPUl0PT09bnVsbD9odC5tZW1vaXplZFN0YXRlOkl0Lm5leHQ7aWYoZSE9PW51bGwpSXQ9ZSxSdD10O2Vsc2V7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoVygzMTApKTtSdD10LHQ9e21lbW9pemVkU3RhdGU6UnQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6UnQuYmFzZVN0YXRlLGJhc2VRdWV1ZTpSdC5iYXNlUXVldWUscXVldWU6UnQucXVldWUsbmV4dDpudWxsfSxJdD09PW51bGw/aHQubWVtb2l6ZWRTdGF0ZT1JdD10Okl0PUl0Lm5leHQ9dH1yZXR1cm4gSXR9ZnVuY3Rpb24gWGEodCxlKXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplfWZ1bmN0aW9uIFNoKHQpe3ZhciBlPXJyKCksbj1lLnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPXQ7dmFyIHI9UnQsaT1yLmJhc2VRdWV1ZSxvPW4ucGVuZGluZztpZihvIT09bnVsbCl7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9by5uZXh0LG8ubmV4dD1sfXIuYmFzZVF1ZXVlPWk9byxuLnBlbmRpbmc9bnVsbH1pZihpIT09bnVsbCl7bz1pLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9bztkb3t2YXIgYz11LmxhbmU7aWYoKFVvJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTp0KHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLGh0LmxhbmVzfD1jLFdvfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09byk7YT09PW51bGw/bD1yOmEubmV4dD1zLEVyKHIsZS5tZW1vaXplZFN0YXRlKXx8KGJuPSEwKSxlLm1lbW9pemVkU3RhdGU9cixlLmJhc2VTdGF0ZT1sLGUuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKHQ9bi5pbnRlcmxlYXZlZCx0IT09bnVsbCl7aT10O2RvIG89aS5sYW5lLGh0LmxhbmVzfD1vLFdvfD1vLGk9aS5uZXh0O3doaWxlKGkhPT10KX1lbHNlIGk9PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bZS5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIEVoKHQpe3ZhciBlPXJyKCksbj1lLnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPXQ7dmFyIHI9bi5kaXNwYXRjaCxpPW4ucGVuZGluZyxvPWUubWVtb2l6ZWRTdGF0ZTtpZihpIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9aT1pLm5leHQ7ZG8gbz10KG8sbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1pKTtFcihvLGUubWVtb2l6ZWRTdGF0ZSl8fChibj0hMCksZS5tZW1vaXplZFN0YXRlPW8sZS5iYXNlUXVldWU9PT1udWxsJiYoZS5iYXNlU3RhdGU9byksbi5sYXN0UmVuZGVyZWRTdGF0ZT1vfXJldHVybltvLHJdfWZ1bmN0aW9uIEgxKCl7fWZ1bmN0aW9uIEsxKHQsZSl7dmFyIG49aHQscj1ycigpLGk9ZSgpLG89IUVyKHIubWVtb2l6ZWRTdGF0ZSxpKTtpZihvJiYoci5tZW1vaXplZFN0YXRlPWksYm49ITApLHI9ci5xdWV1ZSxQbShZMS5iaW5kKG51bGwsbixyLHQpLFt0XSksci5nZXRTbmFwc2hvdCE9PWV8fG98fEl0IT09bnVsbCYmSXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxRYSg5LEcxLmJpbmQobnVsbCxuLHIsaSxlKSx2b2lkIDAsbnVsbCksQnQ9PT1udWxsKXRocm93IEVycm9yKFcoMzQ5KSk7VW8mMzB8fFoxKG4sZSxpKX1yZXR1cm4gaX1mdW5jdGlvbiBaMSh0LGUsbil7dC5mbGFnc3w9MTYzODQsdD17Z2V0U25hcHNob3Q6ZSx2YWx1ZTpufSxlPWh0LnVwZGF0ZVF1ZXVlLGU9PT1udWxsPyhlPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGh0LnVwZGF0ZVF1ZXVlPWUsZS5zdG9yZXM9W3RdKToobj1lLnN0b3JlcyxuPT09bnVsbD9lLnN0b3Jlcz1bdF06bi5wdXNoKHQpKX1mdW5jdGlvbiBHMSh0LGUsbixyKXtlLnZhbHVlPW4sZS5nZXRTbmFwc2hvdD1yLFgxKGUpJiZRMSh0KX1mdW5jdGlvbiBZMSh0LGUsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtYMShlKSYmUTEodCl9KX1mdW5jdGlvbiBYMSh0KXt2YXIgZT10LmdldFNuYXBzaG90O3Q9dC52YWx1ZTt0cnl7dmFyIG49ZSgpO3JldHVybiFFcih0LG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBRMSh0KXt2YXIgZT1oaSh0LDEpO2UhPT1udWxsJiZfcihlLHQsMSwtMSl9ZnVuY3Rpb24gSnkodCl7dmFyIGU9UHIoKTtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiImJih0PXQoKSksZS5tZW1vaXplZFN0YXRlPWUuYmFzZVN0YXRlPXQsdD17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6WGEsbGFzdFJlbmRlcmVkU3RhdGU6dH0sZS5xdWV1ZT10LHQ9dC5kaXNwYXRjaD11VC5iaW5kKG51bGwsaHQsdCksW2UubWVtb2l6ZWRTdGF0ZSx0XX1mdW5jdGlvbiBRYSh0LGUsbixyKXtyZXR1cm4gdD17dGFnOnQsY3JlYXRlOmUsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LGU9aHQudXBkYXRlUXVldWUsZT09PW51bGw/KGU9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0saHQudXBkYXRlUXVldWU9ZSxlLmxhc3RFZmZlY3Q9dC5uZXh0PXQpOihuPWUubGFzdEVmZmVjdCxuPT09bnVsbD9lLmxhc3RFZmZlY3Q9dC5uZXh0PXQ6KHI9bi5uZXh0LG4ubmV4dD10LHQubmV4dD1yLGUubGFzdEVmZmVjdD10KSksdH1mdW5jdGlvbiBKMSgpe3JldHVybiBycigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gTGModCxlLG4scil7dmFyIGk9UHIoKTtodC5mbGFnc3w9dCxpLm1lbW9pemVkU3RhdGU9UWEoMXxlLG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBkZih0LGUsbixyKXt2YXIgaT1ycigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIG89dm9pZCAwO2lmKFJ0IT09bnVsbCl7dmFyIGw9UnQubWVtb2l6ZWRTdGF0ZTtpZihvPWwuZGVzdHJveSxyIT09bnVsbCYmTm0ocixsLmRlcHMpKXtpLm1lbW9pemVkU3RhdGU9UWEoZSxuLG8scik7cmV0dXJufX1odC5mbGFnc3w9dCxpLm1lbW9pemVkU3RhdGU9UWEoMXxlLG4sbyxyKX1mdW5jdGlvbiBxeSh0LGUpe3JldHVybiBMYyg4MzkwNjU2LDgsdCxlKX1mdW5jdGlvbiBQbSh0LGUpe3JldHVybiBkZigyMDQ4LDgsdCxlKX1mdW5jdGlvbiBxMSh0LGUpe3JldHVybiBkZig0LDIsdCxlKX1mdW5jdGlvbiBldyh0LGUpe3JldHVybiBkZig0LDQsdCxlKX1mdW5jdGlvbiB0dyh0LGUpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiB0PXQoKSxlKHQpLGZ1bmN0aW9uKCl7ZShudWxsKX07aWYoZSE9bnVsbClyZXR1cm4gdD10KCksZS5jdXJyZW50PXQsZnVuY3Rpb24oKXtlLmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gbncodCxlLG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW3RdKTpudWxsLGRmKDQsNCx0dy5iaW5kKG51bGwsZSx0KSxuKX1mdW5jdGlvbiBBbSgpe31mdW5jdGlvbiBydyh0LGUpe3ZhciBuPXJyKCk7ZT1lPT09dm9pZCAwP251bGw6ZTt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZlIT09bnVsbCYmTm0oZSxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W3QsZV0sdCl9ZnVuY3Rpb24gaXcodCxlKXt2YXIgbj1ycigpO2U9ZT09PXZvaWQgMD9udWxsOmU7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmZSE9PW51bGwmJk5tKGUsclsxXSk/clswXToodD10KCksbi5tZW1vaXplZFN0YXRlPVt0LGVdLHQpfWZ1bmN0aW9uIG93KHQsZSxuKXtyZXR1cm4gVW8mMjE/KEVyKG4sZSl8fChuPWExKCksaHQubGFuZXN8PW4sV298PW4sdC5iYXNlU3RhdGU9ITApLGUpOih0LmJhc2VTdGF0ZSYmKHQuYmFzZVN0YXRlPSExLGJuPSEwKSx0Lm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gc1QodCxlKXt2YXIgbj1XZTtXZT1uIT09MCYmND5uP246NCx0KCEwKTt2YXIgcj13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249e307dHJ5e3QoITEpLGUoKX1maW5hbGx5e1dlPW4sd2gudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBsdygpe3JldHVybiBycigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYVQodCxlLG4pe3ZhciByPVhpKHQpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LHN3KHQpKWF3KGUsbik7ZWxzZSBpZihuPWoxKHQsZSxuLHIpLG4hPT1udWxsKXt2YXIgaT12bigpO19yKG4sdCxyLGkpLHV3KG4sZSxyKX19ZnVuY3Rpb24gdVQodCxlLG4pe3ZhciByPVhpKHQpLGk9e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKHN3KHQpKWF3KGUsaSk7ZWxzZXt2YXIgbz10LmFsdGVybmF0ZTtpZih0LmxhbmVzPT09MCYmKG89PT1udWxsfHxvLmxhbmVzPT09MCkmJihvPWUubGFzdFJlbmRlcmVkUmVkdWNlcixvIT09bnVsbCkpdHJ5e3ZhciBsPWUubGFzdFJlbmRlcmVkU3RhdGUscz1vKGwsbik7aWYoaS5oYXNFYWdlclN0YXRlPSEwLGkuZWFnZXJTdGF0ZT1zLEVyKHMsbCkpe3ZhciBhPWUuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KGkubmV4dD1pLENtKGUpKTooaS5uZXh0PWEubmV4dCxhLm5leHQ9aSksZS5pbnRlcmxlYXZlZD1pO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49ajEodCxlLGksciksbiE9PW51bGwmJihpPXZuKCksX3Iobix0LHIsaSksdXcobixlLHIpKX19ZnVuY3Rpb24gc3codCl7dmFyIGU9dC5hbHRlcm5hdGU7cmV0dXJuIHQ9PT1odHx8ZSE9PW51bGwmJmU9PT1odH1mdW5jdGlvbiBhdyh0LGUpe3lhPWZkPSEwO3ZhciBuPXQucGVuZGluZztuPT09bnVsbD9lLm5leHQ9ZTooZS5uZXh0PW4ubmV4dCxuLm5leHQ9ZSksdC5wZW5kaW5nPWV9ZnVuY3Rpb24gdXcodCxlLG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9ZS5sYW5lcztyJj10LnBlbmRpbmdMYW5lcyxufD1yLGUubGFuZXM9bixjbSh0LG4pfX12YXIgaGQ9e3JlYWRDb250ZXh0Om5yLHVzZUNhbGxiYWNrOll0LHVzZUNvbnRleHQ6WXQsdXNlRWZmZWN0Oll0LHVzZUltcGVyYXRpdmVIYW5kbGU6WXQsdXNlSW5zZXJ0aW9uRWZmZWN0Oll0LHVzZUxheW91dEVmZmVjdDpZdCx1c2VNZW1vOll0LHVzZVJlZHVjZXI6WXQsdXNlUmVmOll0LHVzZVN0YXRlOll0LHVzZURlYnVnVmFsdWU6WXQsdXNlRGVmZXJyZWRWYWx1ZTpZdCx1c2VUcmFuc2l0aW9uOll0LHVzZU11dGFibGVTb3VyY2U6WXQsdXNlU3luY0V4dGVybmFsU3RvcmU6WXQsdXNlSWQ6WXQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxjVD17cmVhZENvbnRleHQ6bnIsdXNlQ2FsbGJhY2s6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUHIoKS5tZW1vaXplZFN0YXRlPVt0LGU9PT12b2lkIDA/bnVsbDplXSx0fSx1c2VDb250ZXh0Om5yLHVzZUVmZmVjdDpxeSx1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFt0XSk6bnVsbCxMYyg0MTk0MzA4LDQsdHcuYmluZChudWxsLGUsdCksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiBMYyg0MTk0MzA4LDQsdCxlKX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExjKDQsMix0LGUpfSx1c2VNZW1vOmZ1bmN0aW9uKHQsZSl7dmFyIG49UHIoKTtyZXR1cm4gZT1lPT09dm9pZCAwP251bGw6ZSx0PXQoKSxuLm1lbW9pemVkU3RhdGU9W3QsZV0sdH0sdXNlUmVkdWNlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9UHIoKTtyZXR1cm4gZT1uIT09dm9pZCAwP24oZSk6ZSxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9ZSx0PXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjp0LGxhc3RSZW5kZXJlZFN0YXRlOmV9LHIucXVldWU9dCx0PXQuZGlzcGF0Y2g9YVQuYmluZChudWxsLGh0LHQpLFtyLm1lbW9pemVkU3RhdGUsdF19LHVzZVJlZjpmdW5jdGlvbih0KXt2YXIgZT1QcigpO3JldHVybiB0PXtjdXJyZW50OnR9LGUubWVtb2l6ZWRTdGF0ZT10fSx1c2VTdGF0ZTpKeSx1c2VEZWJ1Z1ZhbHVlOkFtLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIFByKCkubWVtb2l6ZWRTdGF0ZT10fSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9SnkoITEpLGU9dFswXTtyZXR1cm4gdD1zVC5iaW5kKG51bGwsdFsxXSksUHIoKS5tZW1vaXplZFN0YXRlPXQsW2UsdF19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1odCxpPVByKCk7aWYob3Qpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVyg0MDcpKTtuPW4oKX1lbHNle2lmKG49ZSgpLEJ0PT09bnVsbCl0aHJvdyBFcnJvcihXKDM0OSkpO1VvJjMwfHxaMShyLGUsbil9aS5tZW1vaXplZFN0YXRlPW47dmFyIG89e3ZhbHVlOm4sZ2V0U25hcHNob3Q6ZX07cmV0dXJuIGkucXVldWU9byxxeShZMS5iaW5kKG51bGwscixvLHQpLFt0XSksci5mbGFnc3w9MjA0OCxRYSg5LEcxLmJpbmQobnVsbCxyLG8sbixlKSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgdD1QcigpLGU9QnQuaWRlbnRpZmllclByZWZpeDtpZihvdCl7dmFyIG49YWkscj1zaTtuPShyJn4oMTw8MzIteHIociktMSkpLnRvU3RyaW5nKDMyKStuLGU9IjoiK2UrIlIiK24sbj1ZYSsrLDA8biYmKGUrPSJIIituLnRvU3RyaW5nKDMyKSksZSs9IjoifWVsc2Ugbj1sVCsrLGU9IjoiK2UrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gdC5tZW1vaXplZFN0YXRlPWV9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZFQ9e3JlYWRDb250ZXh0Om5yLHVzZUNhbGxiYWNrOnJ3LHVzZUNvbnRleHQ6bnIsdXNlRWZmZWN0OlBtLHVzZUltcGVyYXRpdmVIYW5kbGU6bncsdXNlSW5zZXJ0aW9uRWZmZWN0OnExLHVzZUxheW91dEVmZmVjdDpldyx1c2VNZW1vOml3LHVzZVJlZHVjZXI6U2gsdXNlUmVmOkoxLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIFNoKFhhKX0sdXNlRGVidWdWYWx1ZTpBbSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXJyKCk7cmV0dXJuIG93KGUsUnQubWVtb2l6ZWRTdGF0ZSx0KX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciB0PVNoKFhhKVswXSxlPXJyKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bdCxlXX0sdXNlTXV0YWJsZVNvdXJjZTpIMSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpLMSx1c2VJZDpsdyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGZUPXtyZWFkQ29udGV4dDpucix1c2VDYWxsYmFjazpydyx1c2VDb250ZXh0Om5yLHVzZUVmZmVjdDpQbSx1c2VJbXBlcmF0aXZlSGFuZGxlOm53LHVzZUluc2VydGlvbkVmZmVjdDpxMSx1c2VMYXlvdXRFZmZlY3Q6ZXcsdXNlTWVtbzppdyx1c2VSZWR1Y2VyOkVoLHVzZVJlZjpKMSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBFaChYYSl9LHVzZURlYnVnVmFsdWU6QW0sdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1ycigpO3JldHVybiBSdD09PW51bGw/ZS5tZW1vaXplZFN0YXRlPXQ6b3coZSxSdC5tZW1vaXplZFN0YXRlLHQpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9RWgoWGEpWzBdLGU9cnIoKS5tZW1vaXplZFN0YXRlO3JldHVyblt0LGVdfSx1c2VNdXRhYmxlU291cmNlOkgxLHVzZVN5bmNFeHRlcm5hbFN0b3JlOksxLHVzZUlkOmx3LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gb3ModCxlKXt0cnl7dmFyIG49IiIscj1lO2RvIG4rPUZiKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIGk9bn1jYXRjaChvKXtpPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtvLm1lc3NhZ2UrYApgK28uc3RhY2t9cmV0dXJue3ZhbHVlOnQsc291cmNlOmUsc3RhY2s6aSxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gQ2godCxlLG4pe3JldHVybnt2YWx1ZTp0LHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OmU/P251bGx9fWZ1bmN0aW9uIE5wKHQsZSl7dHJ5e2NvbnNvbGUuZXJyb3IoZS52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGhUPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGN3KHQsZSxuKXtuPXVpKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPWUudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtnZHx8KGdkPSEwLHpwPXIpLE5wKHQsZSl9LG59ZnVuY3Rpb24gZHcodCxlLG4pe249dWkoLTEsbiksbi50YWc9Mzt2YXIgcj10LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgaT1lLnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKGkpfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7TnAodCxlKX19dmFyIG89dC5zdGF0ZU5vZGU7cmV0dXJuIG8hPT1udWxsJiZ0eXBlb2Ygby5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtOcCh0LGUpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsP1lpPW5ldyBTZXQoW3RoaXNdKTpZaS5hZGQodGhpcykpO3ZhciBsPWUuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChlLnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIGUwKHQsZSxuKXt2YXIgcj10LnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj10LnBpbmdDYWNoZT1uZXcgaFQ7dmFyIGk9bmV3IFNldDtyLnNldChlLGkpfWVsc2UgaT1yLmdldChlKSxpPT09dm9pZCAwJiYoaT1uZXcgU2V0LHIuc2V0KGUsaSkpO2kuaGFzKG4pfHwoaS5hZGQobiksdD0kVC5iaW5kKG51bGwsdCxlLG4pLGUudGhlbih0LHQpKX1mdW5jdGlvbiB0MCh0KXtkb3t2YXIgZTtpZigoZT10LnRhZz09PTEzKSYmKGU9dC5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkIT09bnVsbDohMCksZSlyZXR1cm4gdDt0PXQucmV0dXJufXdoaWxlKHQhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBuMCh0LGUsbixyLGkpe3JldHVybiB0Lm1vZGUmMT8odC5mbGFnc3w9NjU1MzYsdC5sYW5lcz1pLHQpOih0PT09ZT90LmZsYWdzfD02NTUzNjoodC5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3OihlPXVpKC0xLDEpLGUudGFnPTIsR2kobixlLDEpKSksbi5sYW5lc3w9MSksdCl9dmFyIHBUPXhpLlJlYWN0Q3VycmVudE93bmVyLGJuPSExO2Z1bmN0aW9uIHVuKHQsZSxuLHIpe2UuY2hpbGQ9dD09PW51bGw/VzEoZSxudWxsLG4scik6cnMoZSx0LmNoaWxkLG4scil9ZnVuY3Rpb24gcjAodCxlLG4scixpKXtuPW4ucmVuZGVyO3ZhciBvPWUucmVmO3JldHVybiBLbChlLGkpLHI9Um0odCxlLG4scixvLGkpLG49T20oKSx0IT09bnVsbCYmIWJuPyhlLnVwZGF0ZVF1ZXVlPXQudXBkYXRlUXVldWUsZS5mbGFncyY9LTIwNTMsdC5sYW5lcyY9fmkscGkodCxlLGkpKToob3QmJm4mJnltKGUpLGUuZmxhZ3N8PTEsdW4odCxlLHIsaSksZS5jaGlsZCl9ZnVuY3Rpb24gaTAodCxlLG4scixpKXtpZih0PT09bnVsbCl7dmFyIG89bi50eXBlO3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIiYmIUJtKG8pJiZvLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KGUudGFnPTE1LGUudHlwZT1vLGZ3KHQsZSxvLHIsaSkpOih0PXpjKG4udHlwZSxudWxsLHIsZSxlLm1vZGUsaSksdC5yZWY9ZS5yZWYsdC5yZXR1cm49ZSxlLmNoaWxkPXQpfWlmKG89dC5jaGlsZCwhKHQubGFuZXMmaSkpe3ZhciBsPW8ubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246V2EsbihsLHIpJiZ0LnJlZj09PWUucmVmKXJldHVybiBwaSh0LGUsaSl9cmV0dXJuIGUuZmxhZ3N8PTEsdD1RaShvLHIpLHQucmVmPWUucmVmLHQucmV0dXJuPWUsZS5jaGlsZD10fWZ1bmN0aW9uIGZ3KHQsZSxuLHIsaSl7aWYodCE9PW51bGwpe3ZhciBvPXQubWVtb2l6ZWRQcm9wcztpZihXYShvLHIpJiZ0LnJlZj09PWUucmVmKWlmKGJuPSExLGUucGVuZGluZ1Byb3BzPXI9bywodC5sYW5lcyZpKSE9PTApdC5mbGFncyYxMzEwNzImJihibj0hMCk7ZWxzZSByZXR1cm4gZS5sYW5lcz10LmxhbmVzLHBpKHQsZSxpKX1yZXR1cm4gUnAodCxlLG4scixpKX1mdW5jdGlvbiBodyh0LGUsbil7dmFyIHI9ZS5wZW5kaW5nUHJvcHMsaT1yLmNoaWxkcmVuLG89dCE9PW51bGw/dC5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoIShlLm1vZGUmMSkpZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxYZShEbCxBbiksQW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIHQ9byE9PW51bGw/by5iYXNlTGFuZXN8bjpuLGUubGFuZXM9ZS5jaGlsZExhbmVzPTEwNzM3NDE4MjQsZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6dCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxlLnVwZGF0ZVF1ZXVlPW51bGwsWGUoRGwsQW4pLEFufD10LG51bGw7ZS5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPW8hPT1udWxsP28uYmFzZUxhbmVzOm4sWGUoRGwsQW4pLEFufD1yfWVsc2UgbyE9PW51bGw/KHI9by5iYXNlTGFuZXN8bixlLm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFhlKERsLEFuKSxBbnw9cjtyZXR1cm4gdW4odCxlLGksbiksZS5jaGlsZH1mdW5jdGlvbiBwdyh0LGUpe3ZhciBuPWUucmVmOyh0PT09bnVsbCYmbiE9PW51bGx8fHQhPT1udWxsJiZ0LnJlZiE9PW4pJiYoZS5mbGFnc3w9NTEyLGUuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIFJwKHQsZSxuLHIsaSl7dmFyIG89VG4obik/Rm86cm4uY3VycmVudDtyZXR1cm4gbz10cyhlLG8pLEtsKGUsaSksbj1SbSh0LGUsbixyLG8saSkscj1PbSgpLHQhPT1udWxsJiYhYm4/KGUudXBkYXRlUXVldWU9dC51cGRhdGVRdWV1ZSxlLmZsYWdzJj0tMjA1Myx0LmxhbmVzJj1+aSxwaSh0LGUsaSkpOihvdCYmciYmeW0oZSksZS5mbGFnc3w9MSx1bih0LGUsbixpKSxlLmNoaWxkKX1mdW5jdGlvbiBvMCh0LGUsbixyLGkpe2lmKFRuKG4pKXt2YXIgbz0hMDtvZChlKX1lbHNlIG89ITE7aWYoS2woZSxpKSxlLnN0YXRlTm9kZT09PW51bGwpSWModCxlKSxCMShlLG4sciksVHAoZSxuLHIsaSkscj0hMDtlbHNlIGlmKHQ9PT1udWxsKXt2YXIgbD1lLnN0YXRlTm9kZSxzPWUubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9bnIodSk6KHU9VG4obik/Rm86cm4uY3VycmVudCx1PXRzKGUsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmWHkoZSxsLHIsdSksTWk9ITE7dmFyIGY9ZS5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixjZChlLHIsbCxpKSxhPWUubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fCRuLmN1cnJlbnR8fE1pPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKCRwKGUsbixjLHIpLGE9ZS5tZW1vaXplZFN0YXRlKSwocz1NaXx8WXkoZSxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpLGUubWVtb2l6ZWRQcm9wcz1yLGUubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPWUuc3RhdGVOb2RlLHoxKHQsZSkscz1lLm1lbW9pemVkUHJvcHMsdT1lLnR5cGU9PT1lLmVsZW1lbnRUeXBlP3M6ZnIoZS50eXBlLHMpLGwucHJvcHM9dSxkPWUucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9bnIoYSk6KGE9VG4obik/Rm86cm4uY3VycmVudCxhPXRzKGUsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmWHkoZSxsLHIsYSksTWk9ITEsZj1lLm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLGNkKGUscixsLGkpO3ZhciBtPWUubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PW18fCRuLmN1cnJlbnR8fE1pPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKCRwKGUsbixoLHIpLG09ZS5tZW1vaXplZFN0YXRlKSwodT1NaXx8WXkoZSxuLHUscixmLG0sYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixtLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsbSxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJihlLmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PXQubWVtb2l6ZWRQcm9wcyYmZj09PXQubWVtb2l6ZWRTdGF0ZXx8KGUuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09dC5tZW1vaXplZFByb3BzJiZmPT09dC5tZW1vaXplZFN0YXRlfHwoZS5mbGFnc3w9MTAyNCksZS5tZW1vaXplZFByb3BzPXIsZS5tZW1vaXplZFN0YXRlPW0pLGwucHJvcHM9cixsLnN0YXRlPW0sbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09dC5tZW1vaXplZFByb3BzJiZmPT09dC5tZW1vaXplZFN0YXRlfHwoZS5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT10Lm1lbW9pemVkUHJvcHMmJmY9PT10Lm1lbW9pemVkU3RhdGV8fChlLmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gT3AodCxlLG4scixvLGkpfWZ1bmN0aW9uIE9wKHQsZSxuLHIsaSxvKXtwdyh0LGUpO3ZhciBsPShlLmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gaSYmVnkoZSxuLCExKSxwaSh0LGUsbyk7cj1lLnN0YXRlTm9kZSxwVC5jdXJyZW50PWU7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gZS5mbGFnc3w9MSx0IT09bnVsbCYmbD8oZS5jaGlsZD1ycyhlLHQuY2hpbGQsbnVsbCxvKSxlLmNoaWxkPXJzKGUsbnVsbCxzLG8pKTp1bih0LGUscyxvKSxlLm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxpJiZWeShlLG4sITApLGUuY2hpbGR9ZnVuY3Rpb24gZ3codCl7dmFyIGU9dC5zdGF0ZU5vZGU7ZS5wZW5kaW5nQ29udGV4dD9XeSh0LGUucGVuZGluZ0NvbnRleHQsZS5wZW5kaW5nQ29udGV4dCE9PWUuY29udGV4dCk6ZS5jb250ZXh0JiZXeSh0LGUuY29udGV4dCwhMSksYm0odCxlLmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIGwwKHQsZSxuLHIsaSl7cmV0dXJuIG5zKCksX20oaSksZS5mbGFnc3w9MjU2LHVuKHQsZSxuLHIpLGUuY2hpbGR9dmFyIFBwPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gQXAodCl7cmV0dXJue2Jhc2VMYW5lczp0LGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIG13KHQsZSxuKXt2YXIgcj1lLnBlbmRpbmdQcm9wcyxpPWR0LmN1cnJlbnQsbz0hMSxsPShlLmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPXQhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihpJjIpIT09MCkscz8obz0hMCxlLmZsYWdzJj0tMTI5KToodD09PW51bGx8fHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYoaXw9MSksWGUoZHQsaSYxKSx0PT09bnVsbClyZXR1cm4ga3AoZSksdD1lLm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJih0PXQuZGVoeWRyYXRlZCx0IT09bnVsbCk/KGUubW9kZSYxP3QuZGF0YT09PSIkISI/ZS5sYW5lcz04OmUubGFuZXM9MTA3Mzc0MTgyNDplLmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbix0PXIuZmFsbGJhY2ssbz8ocj1lLm1vZGUsbz1lLmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZvIT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5wZW5kaW5nUHJvcHM9bCk6bz1wZihsLHIsMCxudWxsKSx0PU1vKHQscixuLG51bGwpLG8ucmV0dXJuPWUsdC5yZXR1cm49ZSxvLnNpYmxpbmc9dCxlLmNoaWxkPW8sZS5jaGlsZC5tZW1vaXplZFN0YXRlPUFwKG4pLGUubWVtb2l6ZWRTdGF0ZT1QcCx0KTpNbShlLGwpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKHM9aS5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gZ1QodCxlLGwscixzLGksbik7aWYobyl7bz1yLmZhbGxiYWNrLGw9ZS5tb2RlLGk9dC5jaGlsZCxzPWkuc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJmUuY2hpbGQhPT1pPyhyPWUuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSxlLmRlbGV0aW9ucz1udWxsKToocj1RaShpLGEpLHIuc3VidHJlZUZsYWdzPWkuc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9vPVFpKHMsbyk6KG89TW8obyxsLG4sbnVsbCksby5mbGFnc3w9Miksby5yZXR1cm49ZSxyLnJldHVybj1lLHIuc2libGluZz1vLGUuY2hpbGQ9cixyPW8sbz1lLmNoaWxkLGw9dC5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/QXAobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LG8ubWVtb2l6ZWRTdGF0ZT1sLG8uY2hpbGRMYW5lcz10LmNoaWxkTGFuZXMmfm4sZS5tZW1vaXplZFN0YXRlPVBwLHJ9cmV0dXJuIG89dC5jaGlsZCx0PW8uc2libGluZyxyPVFpKG8se21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKGUubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49ZSxyLnNpYmxpbmc9bnVsbCx0IT09bnVsbCYmKG49ZS5kZWxldGlvbnMsbj09PW51bGw/KGUuZGVsZXRpb25zPVt0XSxlLmZsYWdzfD0xNik6bi5wdXNoKHQpKSxlLmNoaWxkPXIsZS5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBNbSh0LGUpe3JldHVybiBlPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjplfSx0Lm1vZGUsMCxudWxsKSxlLnJldHVybj10LHQuY2hpbGQ9ZX1mdW5jdGlvbiBhYyh0LGUsbixyKXtyZXR1cm4gciE9PW51bGwmJl9tKHIpLHJzKGUsdC5jaGlsZCxudWxsLG4pLHQ9TW0oZSxlLnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksdC5mbGFnc3w9MixlLm1lbW9pemVkU3RhdGU9bnVsbCx0fWZ1bmN0aW9uIGdUKHQsZSxuLHIsaSxvLGwpe2lmKG4pcmV0dXJuIGUuZmxhZ3MmMjU2PyhlLmZsYWdzJj0tMjU3LHI9Q2goRXJyb3IoVyg0MjIpKSksYWModCxlLGwscikpOmUubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KGUuY2hpbGQ9dC5jaGlsZCxlLmZsYWdzfD0xMjgsbnVsbCk6KG89ci5mYWxsYmFjayxpPWUubW9kZSxyPXBmKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxpLDAsbnVsbCksbz1NbyhvLGksbCxudWxsKSxvLmZsYWdzfD0yLHIucmV0dXJuPWUsby5yZXR1cm49ZSxyLnNpYmxpbmc9byxlLmNoaWxkPXIsZS5tb2RlJjEmJnJzKGUsdC5jaGlsZCxudWxsLGwpLGUuY2hpbGQubWVtb2l6ZWRTdGF0ZT1BcChsKSxlLm1lbW9pemVkU3RhdGU9UHAsbyk7aWYoIShlLm1vZGUmMSkpcmV0dXJuIGFjKHQsZSxsLG51bGwpO2lmKGkuZGF0YT09PSIkISIpe2lmKHI9aS5uZXh0U2libGluZyYmaS5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsbz1FcnJvcihXKDQxOSkpLHI9Q2gobyxyLHZvaWQgMCksYWModCxlLGwscil9aWYocz0obCZ0LmNoaWxkTGFuZXMpIT09MCxibnx8cyl7aWYocj1CdCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDppPTI7YnJlYWs7Y2FzZSAxNjppPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Omk9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6aT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDppPTB9aT1pJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6aSxpIT09MCYmaSE9PW8ucmV0cnlMYW5lJiYoby5yZXRyeUxhbmU9aSxoaSh0LGkpLF9yKHIsdCxpLC0xKSl9cmV0dXJuIEZtKCkscj1DaChFcnJvcihXKDQyMSkpKSxhYyh0LGUsbCxyKX1yZXR1cm4gaS5kYXRhPT09IiQ/Ij8oZS5mbGFnc3w9MTI4LGUuY2hpbGQ9dC5jaGlsZCxlPVRULmJpbmQobnVsbCx0KSxpLl9yZWFjdFJldHJ5PWUsbnVsbCk6KHQ9by50cmVlQ29udGV4dCxJbj1aaShpLm5leHRTaWJsaW5nKSxEbj1lLG90PSEwLGdyPW51bGwsdCE9PW51bGwmJihZbltYbisrXT1zaSxZbltYbisrXT1haSxZbltYbisrXT1CbyxzaT10LmlkLGFpPXQub3ZlcmZsb3csQm89ZSksZT1NbShlLHIuY2hpbGRyZW4pLGUuZmxhZ3N8PTQwOTYsZSl9ZnVuY3Rpb24gczAodCxlLG4pe3QubGFuZXN8PWU7dmFyIHI9dC5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD1lKSxicCh0LnJldHVybixlLG4pfWZ1bmN0aW9uIGtoKHQsZSxuLHIsaSl7dmFyIG89dC5tZW1vaXplZFN0YXRlO289PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6ZSxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOml9OihvLmlzQmFja3dhcmRzPWUsby5yZW5kZXJpbmc9bnVsbCxvLnJlbmRlcmluZ1N0YXJ0VGltZT0wLG8ubGFzdD1yLG8udGFpbD1uLG8udGFpbE1vZGU9aSl9ZnVuY3Rpb24gdncodCxlLG4pe3ZhciByPWUucGVuZGluZ1Byb3BzLGk9ci5yZXZlYWxPcmRlcixvPXIudGFpbDtpZih1bih0LGUsci5jaGlsZHJlbixuKSxyPWR0LmN1cnJlbnQsciYyKXI9ciYxfDIsZS5mbGFnc3w9MTI4O2Vsc2V7aWYodCE9PW51bGwmJnQuZmxhZ3MmMTI4KWU6Zm9yKHQ9ZS5jaGlsZDt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpdC5tZW1vaXplZFN0YXRlIT09bnVsbCYmczAodCxuLGUpO2Vsc2UgaWYodC50YWc9PT0xOSlzMCh0LG4sZSk7ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWsgZTtmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlicmVhayBlO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ31yJj0xfWlmKFhlKGR0LHIpLCEoZS5tb2RlJjEpKWUubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKGkpe2Nhc2UiZm9yd2FyZHMiOmZvcihuPWUuY2hpbGQsaT1udWxsO24hPT1udWxsOyl0PW4uYWx0ZXJuYXRlLHQhPT1udWxsJiZkZCh0KT09PW51bGwmJihpPW4pLG49bi5zaWJsaW5nO249aSxuPT09bnVsbD8oaT1lLmNoaWxkLGUuY2hpbGQ9bnVsbCk6KGk9bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxraChlLCExLGksbixvKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxpPWUuY2hpbGQsZS5jaGlsZD1udWxsO2khPT1udWxsOyl7aWYodD1pLmFsdGVybmF0ZSx0IT09bnVsbCYmZGQodCk9PT1udWxsKXtlLmNoaWxkPWk7YnJlYWt9dD1pLnNpYmxpbmcsaS5zaWJsaW5nPW4sbj1pLGk9dH1raChlLCEwLG4sbnVsbCxvKTticmVhaztjYXNlInRvZ2V0aGVyIjpraChlLCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6ZS5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGUuY2hpbGR9ZnVuY3Rpb24gSWModCxlKXshKGUubW9kZSYxKSYmdCE9PW51bGwmJih0LmFsdGVybmF0ZT1udWxsLGUuYWx0ZXJuYXRlPW51bGwsZS5mbGFnc3w9Mil9ZnVuY3Rpb24gcGkodCxlLG4pe2lmKHQhPT1udWxsJiYoZS5kZXBlbmRlbmNpZXM9dC5kZXBlbmRlbmNpZXMpLFdvfD1lLmxhbmVzLCEobiZlLmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKHQhPT1udWxsJiZlLmNoaWxkIT09dC5jaGlsZCl0aHJvdyBFcnJvcihXKDE1MykpO2lmKGUuY2hpbGQhPT1udWxsKXtmb3IodD1lLmNoaWxkLG49UWkodCx0LnBlbmRpbmdQcm9wcyksZS5jaGlsZD1uLG4ucmV0dXJuPWU7dC5zaWJsaW5nIT09bnVsbDspdD10LnNpYmxpbmcsbj1uLnNpYmxpbmc9UWkodCx0LnBlbmRpbmdQcm9wcyksbi5yZXR1cm49ZTtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gZS5jaGlsZH1mdW5jdGlvbiBtVCh0LGUsbil7c3dpdGNoKGUudGFnKXtjYXNlIDM6Z3coZSksbnMoKTticmVhaztjYXNlIDU6VjEoZSk7YnJlYWs7Y2FzZSAxOlRuKGUudHlwZSkmJm9kKGUpO2JyZWFrO2Nhc2UgNDpibShlLGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9ZS50eXBlLl9jb250ZXh0LGk9ZS5tZW1vaXplZFByb3BzLnZhbHVlO1hlKGFkLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWk7YnJlYWs7Y2FzZSAxMzppZihyPWUubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oWGUoZHQsZHQuY3VycmVudCYxKSxlLmZsYWdzfD0xMjgsbnVsbCk6biZlLmNoaWxkLmNoaWxkTGFuZXM/bXcodCxlLG4pOihYZShkdCxkdC5jdXJyZW50JjEpLHQ9cGkodCxlLG4pLHQhPT1udWxsP3Quc2libGluZzpudWxsKTtYZShkdCxkdC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZlLmNoaWxkTGFuZXMpIT09MCx0LmZsYWdzJjEyOCl7aWYocilyZXR1cm4gdncodCxlLG4pO2UuZmxhZ3N8PTEyOH1pZihpPWUubWVtb2l6ZWRTdGF0ZSxpIT09bnVsbCYmKGkucmVuZGVyaW5nPW51bGwsaS50YWlsPW51bGwsaS5sYXN0RWZmZWN0PW51bGwpLFhlKGR0LGR0LmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBlLmxhbmVzPTAsaHcodCxlLG4pfXJldHVybiBwaSh0LGUsbil9dmFyIHl3LE1wLHh3LF93O3l3PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09Nil0LmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT1lKWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT1lKXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtNcD1mdW5jdGlvbigpe307eHc9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC5tZW1vaXplZFByb3BzO2lmKGkhPT1yKXt0PWUuc3RhdGVOb2RlLFJvKEZyLmN1cnJlbnQpO3ZhciBvPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOmk9bnAodCxpKSxyPW5wKHQsciksbz1bXTticmVhaztjYXNlInNlbGVjdCI6aT1ndCh7fSxpLHt2YWx1ZTp2b2lkIDB9KSxyPWd0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLG89W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aT1vcCh0LGkpLHI9b3AodCxyKSxvPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKHQub25jbGljaz1yZCl9c3AobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gaSlpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmaS5oYXNPd25Qcm9wZXJ0eSh1KSYmaVt1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9aVt1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihJYS5oYXNPd25Qcm9wZXJ0eSh1KT9vfHwobz1bXSk6KG89b3x8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPWkhPW51bGw/aVt1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChvfHwobz1bXSksby5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihvPW98fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwobz1vfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoSWEuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIix0KSxvfHxzPT09YXx8KG89W10pKToobz1vfHxbXSkucHVzaCh1LGEpKX1uJiYobz1vfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PW87KGUudXBkYXRlUXVldWU9dSkmJihlLmZsYWdzfD00KX19O193PWZ1bmN0aW9uKHQsZSxuLHIpe24hPT1yJiYoZS5mbGFnc3w9NCl9O2Z1bmN0aW9uIEtzKHQsZSl7aWYoIW90KXN3aXRjaCh0LnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6ZT10LnRhaWw7Zm9yKHZhciBuPW51bGw7ZSE9PW51bGw7KWUuYWx0ZXJuYXRlIT09bnVsbCYmKG49ZSksZT1lLnNpYmxpbmc7bj09PW51bGw/dC50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49dC50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP2V8fHQudGFpbD09PW51bGw/dC50YWlsPW51bGw6dC50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gWHQodCl7dmFyIGU9dC5hbHRlcm5hdGUhPT1udWxsJiZ0LmFsdGVybmF0ZS5jaGlsZD09PXQuY2hpbGQsbj0wLHI9MDtpZihlKWZvcih2YXIgaT10LmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1pLmZsYWdzJjE0NjgwMDY0LGkucmV0dXJuPXQsaT1pLnNpYmxpbmc7ZWxzZSBmb3IoaT10LmNoaWxkO2khPT1udWxsOylufD1pLmxhbmVzfGkuY2hpbGRMYW5lcyxyfD1pLnN1YnRyZWVGbGFncyxyfD1pLmZsYWdzLGkucmV0dXJuPXQsaT1pLnNpYmxpbmc7cmV0dXJuIHQuc3VidHJlZUZsYWdzfD1yLHQuY2hpbGRMYW5lcz1uLGV9ZnVuY3Rpb24gdlQodCxlLG4pe3ZhciByPWUucGVuZGluZ1Byb3BzO3N3aXRjaCh4bShlKSxlLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFh0KGUpLG51bGw7Y2FzZSAxOnJldHVybiBUbihlLnR5cGUpJiZpZCgpLFh0KGUpLG51bGw7Y2FzZSAzOnJldHVybiByPWUuc3RhdGVOb2RlLGlzKCksaXQoJG4pLGl0KHJuKSxUbSgpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLCh0PT09bnVsbHx8dC5jaGlsZD09PW51bGwpJiYobGMoZSk/ZS5mbGFnc3w9NDp0PT09bnVsbHx8dC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmIShlLmZsYWdzJjI1Nil8fChlLmZsYWdzfD0xMDI0LGdyIT09bnVsbCYmKFVwKGdyKSxncj1udWxsKSkpLE1wKHQsZSksWHQoZSksbnVsbDtjYXNlIDU6JG0oZSk7dmFyIGk9Um8oR2EuY3VycmVudCk7aWYobj1lLnR5cGUsdCE9PW51bGwmJmUuc3RhdGVOb2RlIT1udWxsKXh3KHQsZSxuLHIsaSksdC5yZWYhPT1lLnJlZiYmKGUuZmxhZ3N8PTUxMixlLmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZihlLnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVygxNjYpKTtyZXR1cm4gWHQoZSksbnVsbH1pZih0PVJvKEZyLmN1cnJlbnQpLGxjKGUpKXtyPWUuc3RhdGVOb2RlLG49ZS50eXBlO3ZhciBvPWUubWVtb2l6ZWRQcm9wcztzd2l0Y2gocltNcl09ZSxyW0thXT1vLHQ9KGUubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOmV0KCJjYW5jZWwiLHIpLGV0KCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpldCgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPGFhLmxlbmd0aDtpKyspZXQoYWFbaV0scik7YnJlYWs7Y2FzZSJzb3VyY2UiOmV0KCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6ZXQoImVycm9yIixyKSxldCgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpteShyLG8pLGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIW8ubXVsdGlwbGV9LGV0KCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjp5eShyLG8pLGV0KCJpbnZhbGlkIixyKX1zcChuLG8pLGk9bnVsbDtmb3IodmFyIGwgaW4gbylpZihvLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1vW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKG8uc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm9jKHIudGV4dENvbnRlbnQscyx0KSxpPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoby5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci50ZXh0Q29udGVudCxzLHQpLGk9WyJjaGlsZHJlbiIsIiIrc10pOklhLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmZXQoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHIpLHZ5KHIsbywhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUocikseHkocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9cmQpfXI9aSxlLnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJihlLmZsYWdzfD00KX1lbHNle2w9aS5ub2RlVHlwZT09PTk/aTppLm93bmVyRG9jdW1lbnQsdD09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKHQ9Wl8obikpLHQ9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyh0PWwuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsdD10LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj90PWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KHQ9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9dCxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTp0PWwuY3JlYXRlRWxlbWVudE5TKHQsbiksdFtNcl09ZSx0W0thXT1yLHl3KHQsZSwhMSwhMSksZS5zdGF0ZU5vZGU9dDtlOntzd2l0Y2gobD1hcChuLHIpLG4pe2Nhc2UiZGlhbG9nIjpldCgiY2FuY2VsIix0KSxldCgiY2xvc2UiLHQpLGk9cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOmV0KCJsb2FkIix0KSxpPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPGFhLmxlbmd0aDtpKyspZXQoYWFbaV0sdCk7aT1yO2JyZWFrO2Nhc2Uic291cmNlIjpldCgiZXJyb3IiLHQpLGk9cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpldCgiZXJyb3IiLHQpLGV0KCJsb2FkIix0KSxpPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpldCgidG9nZ2xlIix0KSxpPXI7YnJlYWs7Y2FzZSJpbnB1dCI6bXkodCxyKSxpPW5wKHQsciksZXQoImludmFsaWQiLHQpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOnQuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxpPWd0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGV0KCJpbnZhbGlkIix0KTticmVhaztjYXNlInRleHRhcmVhIjp5eSh0LHIpLGk9b3AodCxyKSxldCgiaW52YWxpZCIsdCk7YnJlYWs7ZGVmYXVsdDppPXJ9c3AobixpKSxzPWk7Zm9yKG8gaW4gcylpZihzLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1zW29dO289PT0ic3R5bGUiP1hfKHQsYSk6bz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmR18odCxhKSk6bz09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmRGEodCxhKTp0eXBlb2YgYT09Im51bWJlciImJkRhKHQsIiIrYSk6byE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZvIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJm8hPT0iYXV0b0ZvY3VzIiYmKElhLmhhc093blByb3BlcnR5KG8pP2EhPW51bGwmJm89PT0ib25TY3JvbGwiJiZldCgic2Nyb2xsIix0KTphIT1udWxsJiZpbSh0LG8sYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOlF1KHQpLHZ5KHQsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UXUodCkseHkodCk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp0Lm11bHRpcGxlPSEhci5tdWx0aXBsZSxvPXIudmFsdWUsbyE9bnVsbD9VbCh0LCEhci5tdWx0aXBsZSxvLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmVWwodCwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGkub25DbGljaz09ImZ1bmN0aW9uIiYmKHQub25jbGljaz1yZCl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJihlLmZsYWdzfD00KX1lLnJlZiE9PW51bGwmJihlLmZsYWdzfD01MTIsZS5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIFh0KGUpLG51bGw7Y2FzZSA2OmlmKHQmJmUuc3RhdGVOb2RlIT1udWxsKV93KHQsZSx0Lm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJmUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2NikpO2lmKG49Um8oR2EuY3VycmVudCksUm8oRnIuY3VycmVudCksbGMoZSkpe2lmKHI9ZS5zdGF0ZU5vZGUsbj1lLm1lbW9pemVkUHJvcHMscltNcl09ZSwobz1yLm5vZGVWYWx1ZSE9PW4pJiYodD1Ebix0IT09bnVsbCkpc3dpdGNoKHQudGFnKXtjYXNlIDM6b2Moci5ub2RlVmFsdWUsbiwodC5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OnQubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmb2Moci5ub2RlVmFsdWUsbiwodC5tb2RlJjEpIT09MCl9byYmKGUuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbTXJdPWUsZS5zdGF0ZU5vZGU9cn1yZXR1cm4gWHQoZSksbnVsbDtjYXNlIDEzOmlmKGl0KGR0KSxyPWUubWVtb2l6ZWRTdGF0ZSx0PT09bnVsbHx8dC5tZW1vaXplZFN0YXRlIT09bnVsbCYmdC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihvdCYmSW4hPT1udWxsJiZlLm1vZGUmMSYmIShlLmZsYWdzJjEyOCkpRDEoKSxucygpLGUuZmxhZ3N8PTk4NTYwLG89ITE7ZWxzZSBpZihvPWxjKGUpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0PT09bnVsbCl7aWYoIW8pdGhyb3cgRXJyb3IoVygzMTgpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvPW8hPT1udWxsP28uZGVoeWRyYXRlZDpudWxsLCFvKXRocm93IEVycm9yKFcoMzE3KSk7b1tNcl09ZX1lbHNlIG5zKCksIShlLmZsYWdzJjEyOCkmJihlLm1lbW9pemVkU3RhdGU9bnVsbCksZS5mbGFnc3w9NDtYdChlKSxvPSExfWVsc2UgZ3IhPT1udWxsJiYoVXAoZ3IpLGdyPW51bGwpLG89ITA7aWYoIW8pcmV0dXJuIGUuZmxhZ3MmNjU1MzY/ZTpudWxsfXJldHVybiBlLmZsYWdzJjEyOD8oZS5sYW5lcz1uLGUpOihyPXIhPT1udWxsLHIhPT0odCE9PW51bGwmJnQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYoZS5jaGlsZC5mbGFnc3w9ODE5MixlLm1vZGUmMSYmKHQ9PT1udWxsfHxkdC5jdXJyZW50JjE/UHQ9PT0wJiYoUHQ9Myk6Rm0oKSkpLGUudXBkYXRlUXVldWUhPT1udWxsJiYoZS5mbGFnc3w9NCksWHQoZSksbnVsbCk7Y2FzZSA0OnJldHVybiBpcygpLE1wKHQsZSksdD09PW51bGwmJlZhKGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFh0KGUpLG51bGw7Y2FzZSAxMDpyZXR1cm4gRW0oZS50eXBlLl9jb250ZXh0KSxYdChlKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFRuKGUudHlwZSkmJmlkKCksWHQoZSksbnVsbDtjYXNlIDE5OmlmKGl0KGR0KSxvPWUubWVtb2l6ZWRTdGF0ZSxvPT09bnVsbClyZXR1cm4gWHQoZSksbnVsbDtpZihyPShlLmZsYWdzJjEyOCkhPT0wLGw9by5yZW5kZXJpbmcsbD09PW51bGwpaWYocilLcyhvLCExKTtlbHNle2lmKFB0IT09MHx8dCE9PW51bGwmJnQuZmxhZ3MmMTI4KWZvcih0PWUuY2hpbGQ7dCE9PW51bGw7KXtpZihsPWRkKHQpLGwhPT1udWxsKXtmb3IoZS5mbGFnc3w9MTI4LEtzKG8sITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKGUudXBkYXRlUXVldWU9cixlLmZsYWdzfD00KSxlLnN1YnRyZWVGbGFncz0wLHI9bixuPWUuY2hpbGQ7biE9PW51bGw7KW89bix0PXIsby5mbGFncyY9MTQ2ODAwNjYsbD1vLmFsdGVybmF0ZSxsPT09bnVsbD8oby5jaGlsZExhbmVzPTAsby5sYW5lcz10LG8uY2hpbGQ9bnVsbCxvLnN1YnRyZWVGbGFncz0wLG8ubWVtb2l6ZWRQcm9wcz1udWxsLG8ubWVtb2l6ZWRTdGF0ZT1udWxsLG8udXBkYXRlUXVldWU9bnVsbCxvLmRlcGVuZGVuY2llcz1udWxsLG8uc3RhdGVOb2RlPW51bGwpOihvLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLG8ubGFuZXM9bC5sYW5lcyxvLmNoaWxkPWwuY2hpbGQsby5zdWJ0cmVlRmxhZ3M9MCxvLmRlbGV0aW9ucz1udWxsLG8ubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsby5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxvLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsby50eXBlPWwudHlwZSx0PWwuZGVwZW5kZW5jaWVzLG8uZGVwZW5kZW5jaWVzPXQ9PT1udWxsP251bGw6e2xhbmVzOnQubGFuZXMsZmlyc3RDb250ZXh0OnQuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIFhlKGR0LGR0LmN1cnJlbnQmMXwyKSxlLmNoaWxkfXQ9dC5zaWJsaW5nfW8udGFpbCE9PW51bGwmJkN0KCk+bHMmJihlLmZsYWdzfD0xMjgscj0hMCxLcyhvLCExKSxlLmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYodD1kZChsKSx0IT09bnVsbCl7aWYoZS5mbGFnc3w9MTI4LHI9ITAsbj10LnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYoZS51cGRhdGVRdWV1ZT1uLGUuZmxhZ3N8PTQpLEtzKG8sITApLG8udGFpbD09PW51bGwmJm8udGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhb3QpcmV0dXJuIFh0KGUpLG51bGx9ZWxzZSAyKkN0KCktby5yZW5kZXJpbmdTdGFydFRpbWU+bHMmJm4hPT0xMDczNzQxODI0JiYoZS5mbGFnc3w9MTI4LHI9ITAsS3MobywhMSksZS5sYW5lcz00MTk0MzA0KTtvLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9ZS5jaGlsZCxlLmNoaWxkPWwpOihuPW8ubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDplLmNoaWxkPWwsby5sYXN0PWwpfXJldHVybiBvLnRhaWwhPT1udWxsPyhlPW8udGFpbCxvLnJlbmRlcmluZz1lLG8udGFpbD1lLnNpYmxpbmcsby5yZW5kZXJpbmdTdGFydFRpbWU9Q3QoKSxlLnNpYmxpbmc9bnVsbCxuPWR0LmN1cnJlbnQsWGUoZHQscj9uJjF8MjpuJjEpLGUpOihYdChlKSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHptKCkscj1lLm1lbW9pemVkU3RhdGUhPT1udWxsLHQhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKGUuZmxhZ3N8PTgxOTIpLHImJmUubW9kZSYxP0FuJjEwNzM3NDE4MjQmJihYdChlKSxlLnN1YnRyZWVGbGFncyY2JiYoZS5mbGFnc3w9ODE5MikpOlh0KGUpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFcoMTU2LGUudGFnKSl9ZnVuY3Rpb24geVQodCxlKXtzd2l0Y2goeG0oZSksZS50YWcpe2Nhc2UgMTpyZXR1cm4gVG4oZS50eXBlKSYmaWQoKSx0PWUuZmxhZ3MsdCY2NTUzNj8oZS5mbGFncz10Ji02NTUzN3wxMjgsZSk6bnVsbDtjYXNlIDM6cmV0dXJuIGlzKCksaXQoJG4pLGl0KHJuKSxUbSgpLHQ9ZS5mbGFncyx0JjY1NTM2JiYhKHQmMTI4KT8oZS5mbGFncz10Ji02NTUzN3wxMjgsZSk6bnVsbDtjYXNlIDU6cmV0dXJuICRtKGUpLG51bGw7Y2FzZSAxMzppZihpdChkdCksdD1lLm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJnQuZGVoeWRyYXRlZCE9PW51bGwpe2lmKGUuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MCkpO25zKCl9cmV0dXJuIHQ9ZS5mbGFncyx0JjY1NTM2PyhlLmZsYWdzPXQmLTY1NTM3fDEyOCxlKTpudWxsO2Nhc2UgMTk6cmV0dXJuIGl0KGR0KSxudWxsO2Nhc2UgNDpyZXR1cm4gaXMoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIEVtKGUudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHptKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB1Yz0hMSxKdD0hMSx4VD10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxuZT1udWxsO2Z1bmN0aW9uIElsKHQsZSl7dmFyIG49dC5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7dnQodCxlLHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24gTHAodCxlLG4pe3RyeXtuKCl9Y2F0Y2gocil7dnQodCxlLHIpfX12YXIgYTA9ITE7ZnVuY3Rpb24gX1QodCxlKXtpZih5cD1lZCx0PUMxKCksdm0odCkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiB0KXZhciBuPXtzdGFydDp0LnNlbGVjdGlvblN0YXJ0LGVuZDp0LnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPXQub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgaT1yLmFuY2hvck9mZnNldCxvPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxvLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBsPTAscz0tMSxhPS0xLHU9MCxjPTAsZD10LGY9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBoO2QhPT1ufHxpIT09MCYmZC5ub2RlVHlwZSE9PTN8fChzPWwraSksZCE9PW98fHIhPT0wJiZkLm5vZGVUeXBlIT09M3x8KGE9bCtyKSxkLm5vZGVUeXBlPT09MyYmKGwrPWQubm9kZVZhbHVlLmxlbmd0aCksKGg9ZC5maXJzdENoaWxkKSE9PW51bGw7KWY9ZCxkPWg7Zm9yKDs7KXtpZihkPT09dClicmVhayB0O2lmKGY9PT1uJiYrK3U9PT1pJiYocz1sKSxmPT09byYmKytjPT09ciYmKGE9bCksKGg9ZC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO2Q9ZixmPWQucGFyZW50Tm9kZX1kPWh9bj1zPT09LTF8fGE9PT0tMT9udWxsOntzdGFydDpzLGVuZDphfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3IoeHA9e2ZvY3VzZWRFbGVtOnQsc2VsZWN0aW9uUmFuZ2U6bn0sZWQ9ITEsbmU9ZTtuZSE9PW51bGw7KWlmKGU9bmUsdD1lLmNoaWxkLChlLnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJnQhPT1udWxsKXQucmV0dXJuPWUsbmU9dDtlbHNlIGZvcig7bmUhPT1udWxsOyl7ZT1uZTt0cnl7dmFyIG09ZS5hbHRlcm5hdGU7aWYoZS5mbGFncyYxMDI0KXN3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyx3PW0ubWVtb2l6ZWRTdGF0ZSx2PWUuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShlLmVsZW1lbnRUeXBlPT09ZS50eXBlP2c6ZnIoZS50eXBlLGcpLHcpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIHg9ZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzt4Lm5vZGVUeXBlPT09MT94LnRleHRDb250ZW50PSIiOngubm9kZVR5cGU9PT05JiZ4LmRvY3VtZW50RWxlbWVudCYmeC5yZW1vdmVDaGlsZCh4LmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYzKSl9fWNhdGNoKFMpe3Z0KGUsZS5yZXR1cm4sUyl9aWYodD1lLnNpYmxpbmcsdCE9PW51bGwpe3QucmV0dXJuPWUucmV0dXJuLG5lPXQ7YnJlYWt9bmU9ZS5yZXR1cm59cmV0dXJuIG09YTAsYTA9ITEsbX1mdW5jdGlvbiB4YSh0LGUsbil7dmFyIHI9ZS51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgaT1yPXIubmV4dDtkb3tpZigoaS50YWcmdCk9PT10KXt2YXIgbz1pLmRlc3Ryb3k7aS5kZXN0cm95PXZvaWQgMCxvIT09dm9pZCAwJiZMcChlLG4sbyl9aT1pLm5leHR9d2hpbGUoaSE9PXIpfX1mdW5jdGlvbiBmZih0LGUpe2lmKGU9ZS51cGRhdGVRdWV1ZSxlPWUhPT1udWxsP2UubGFzdEVmZmVjdDpudWxsLGUhPT1udWxsKXt2YXIgbj1lPWUubmV4dDtkb3tpZigobi50YWcmdCk9PT10KXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT1lKX19ZnVuY3Rpb24gSXAodCl7dmFyIGU9dC5yZWY7aWYoZSE9PW51bGwpe3ZhciBuPXQuc3RhdGVOb2RlO3N3aXRjaCh0LnRhZyl7Y2FzZSA1OnQ9bjticmVhaztkZWZhdWx0OnQ9bn10eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUuY3VycmVudD10fX1mdW5jdGlvbiB3dyh0KXt2YXIgZT10LmFsdGVybmF0ZTtlIT09bnVsbCYmKHQuYWx0ZXJuYXRlPW51bGwsd3coZSkpLHQuY2hpbGQ9bnVsbCx0LmRlbGV0aW9ucz1udWxsLHQuc2libGluZz1udWxsLHQudGFnPT09NSYmKGU9dC5zdGF0ZU5vZGUsZSE9PW51bGwmJihkZWxldGUgZVtNcl0sZGVsZXRlIGVbS2FdLGRlbGV0ZSBlW1NwXSxkZWxldGUgZVtuVF0sZGVsZXRlIGVbclRdKSksdC5zdGF0ZU5vZGU9bnVsbCx0LnJldHVybj1udWxsLHQuZGVwZW5kZW5jaWVzPW51bGwsdC5tZW1vaXplZFByb3BzPW51bGwsdC5tZW1vaXplZFN0YXRlPW51bGwsdC5wZW5kaW5nUHJvcHM9bnVsbCx0LnN0YXRlTm9kZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBTdyh0KXtyZXR1cm4gdC50YWc9PT01fHx0LnRhZz09PTN8fHQudGFnPT09NH1mdW5jdGlvbiB1MCh0KXtlOmZvcig7Oyl7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHxTdyh0LnJldHVybikpcmV0dXJuIG51bGw7dD10LnJldHVybn1mb3IodC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZzt0LnRhZyE9PTUmJnQudGFnIT09NiYmdC50YWchPT0xODspe2lmKHQuZmxhZ3MmMnx8dC5jaGlsZD09PW51bGx8fHQudGFnPT09NCljb250aW51ZSBlO3QuY2hpbGQucmV0dXJuPXQsdD10LmNoaWxkfWlmKCEodC5mbGFncyYyKSlyZXR1cm4gdC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIERwKHQsZSxuKXt2YXIgcj10LnRhZztpZihyPT09NXx8cj09PTYpdD10LnN0YXRlTm9kZSxlP24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCxlKTpuLmluc2VydEJlZm9yZSh0LGUpOihuLm5vZGVUeXBlPT09OD8oZT1uLnBhcmVudE5vZGUsZS5pbnNlcnRCZWZvcmUodCxuKSk6KGU9bixlLmFwcGVuZENoaWxkKHQpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHxlLm9uY2xpY2shPT1udWxsfHwoZS5vbmNsaWNrPXJkKSk7ZWxzZSBpZihyIT09NCYmKHQ9dC5jaGlsZCx0IT09bnVsbCkpZm9yKERwKHQsZSxuKSx0PXQuc2libGluZzt0IT09bnVsbDspRHAodCxlLG4pLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIGpwKHQsZSxuKXt2YXIgcj10LnRhZztpZihyPT09NXx8cj09PTYpdD10LnN0YXRlTm9kZSxlP24uaW5zZXJ0QmVmb3JlKHQsZSk6bi5hcHBlbmRDaGlsZCh0KTtlbHNlIGlmKHIhPT00JiYodD10LmNoaWxkLHQhPT1udWxsKSlmb3IoanAodCxlLG4pLHQ9dC5zaWJsaW5nO3QhPT1udWxsOylqcCh0LGUsbiksdD10LnNpYmxpbmd9dmFyIEh0PW51bGwsaHI9ITE7ZnVuY3Rpb24gYmkodCxlLG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KUV3KHQsZSxuKSxuPW4uc2libGluZ31mdW5jdGlvbiBFdyh0LGUsbil7aWYoenImJnR5cGVvZiB6ci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7enIub25Db21taXRGaWJlclVubW91bnQocmYsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1Okp0fHxJbChuLGUpO2Nhc2UgNjp2YXIgcj1IdCxpPWhyO0h0PW51bGwsYmkodCxlLG4pLEh0PXIsaHI9aSxIdCE9PW51bGwmJihocj8odD1IdCxuPW4uc3RhdGVOb2RlLHQubm9kZVR5cGU9PT04P3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTp0LnJlbW92ZUNoaWxkKG4pKTpIdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6SHQhPT1udWxsJiYoaHI/KHQ9SHQsbj1uLnN0YXRlTm9kZSx0Lm5vZGVUeXBlPT09OD95aCh0LnBhcmVudE5vZGUsbik6dC5ub2RlVHlwZT09PTEmJnloKHQsbiksQmEodCkpOnloKEh0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9SHQsaT1ocixIdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGhyPSEwLGJpKHQsZSxuKSxIdD1yLGhyPWk7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFKdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe2k9cj1yLm5leHQ7ZG97dmFyIG89aSxsPW8uZGVzdHJveTtvPW8udGFnLGwhPT12b2lkIDAmJihvJjJ8fG8mNCkmJkxwKG4sZSxsKSxpPWkubmV4dH13aGlsZShpIT09cil9YmkodCxlLG4pO2JyZWFrO2Nhc2UgMTppZighSnQmJihJbChuLGUpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7dnQobixlLHMpfWJpKHQsZSxuKTticmVhaztjYXNlIDIxOmJpKHQsZSxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhKdD0ocj1KdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsYmkodCxlLG4pLEp0PXIpOmJpKHQsZSxuKTticmVhaztkZWZhdWx0OmJpKHQsZSxuKX19ZnVuY3Rpb24gYzAodCl7dmFyIGU9dC51cGRhdGVRdWV1ZTtpZihlIT09bnVsbCl7dC51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPXQuc3RhdGVOb2RlO249PT1udWxsJiYobj10LnN0YXRlTm9kZT1uZXcgeFQpLGUuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgaT1OVC5iaW5kKG51bGwsdCxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihpLGkpKX0pfX1mdW5jdGlvbiBhcih0LGUpe3ZhciBuPWUuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO3RyeXt2YXIgbz10LGw9ZSxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6SHQ9cy5zdGF0ZU5vZGUsaHI9ITE7YnJlYWsgZTtjYXNlIDM6SHQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxocj0hMDticmVhayBlO2Nhc2UgNDpIdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGhyPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihIdD09PW51bGwpdGhyb3cgRXJyb3IoVygxNjApKTtFdyhvLGwsaSksSHQ9bnVsbCxocj0hMTt2YXIgYT1pLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLGkucmV0dXJuPW51bGx9Y2F0Y2godSl7dnQoaSxlLHUpfX1pZihlLnN1YnRyZWVGbGFncyYxMjg1NClmb3IoZT1lLmNoaWxkO2UhPT1udWxsOylDdyhlLHQpLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIEN3KHQsZSl7dmFyIG49dC5hbHRlcm5hdGUscj10LmZsYWdzO3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKGFyKGUsdCksT3IodCksciY0KXt0cnl7eGEoMyx0LHQucmV0dXJuKSxmZigzLHQpfWNhdGNoKGcpe3Z0KHQsdC5yZXR1cm4sZyl9dHJ5e3hhKDUsdCx0LnJldHVybil9Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19YnJlYWs7Y2FzZSAxOmFyKGUsdCksT3IodCksciY1MTImJm4hPT1udWxsJiZJbChuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoYXIoZSx0KSxPcih0KSxyJjUxMiYmbiE9PW51bGwmJklsKG4sbi5yZXR1cm4pLHQuZmxhZ3MmMzIpe3ZhciBpPXQuc3RhdGVOb2RlO3RyeXtEYShpLCIiKX1jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfX1pZihyJjQmJihpPXQuc3RhdGVOb2RlLGkhPW51bGwpKXt2YXIgbz10Lm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6byxzPXQudHlwZSxhPXQudXBkYXRlUXVldWU7aWYodC51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmby50eXBlPT09InJhZGlvIiYmby5uYW1lIT1udWxsJiZIXyhpLG8pLGFwKHMsbCk7dmFyIHU9YXAocyxvKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9YXyhpLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP0dfKGksZCk6Yz09PSJjaGlsZHJlbiI/RGEoaSxkKTppbShpLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6cnAoaSxvKTticmVhaztjYXNlInRleHRhcmVhIjpLXyhpLG8pO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1pLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7aS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhby5tdWx0aXBsZTt2YXIgaD1vLnZhbHVlO2ghPW51bGw/VWwoaSwhIW8ubXVsdGlwbGUsaCwhMSk6ZiE9PSEhby5tdWx0aXBsZSYmKG8uZGVmYXVsdFZhbHVlIT1udWxsP1VsKGksISFvLm11bHRpcGxlLG8uZGVmYXVsdFZhbHVlLCEwKTpVbChpLCEhby5tdWx0aXBsZSxvLm11bHRpcGxlP1tdOiIiLCExKSl9aVtLYV09b31jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfX1icmVhaztjYXNlIDY6aWYoYXIoZSx0KSxPcih0KSxyJjQpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2MikpO2k9dC5zdGF0ZU5vZGUsbz10Lm1lbW9pemVkUHJvcHM7dHJ5e2kubm9kZVZhbHVlPW99Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19YnJlYWs7Y2FzZSAzOmlmKGFyKGUsdCksT3IodCksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7QmEoZS5jb250YWluZXJJbmZvKX1jYXRjaChnKXt2dCh0LHQucmV0dXJuLGcpfWJyZWFrO2Nhc2UgNDphcihlLHQpLE9yKHQpO2JyZWFrO2Nhc2UgMTM6YXIoZSx0KSxPcih0KSxpPXQuY2hpbGQsaS5mbGFncyY4MTkyJiYobz1pLm1lbW9pemVkU3RhdGUhPT1udWxsLGkuc3RhdGVOb2RlLmlzSGlkZGVuPW8sIW98fGkuYWx0ZXJuYXRlIT09bnVsbCYmaS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChEbT1DdCgpKSksciY0JiZjMCh0KTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsdC5tb2RlJjE/KEp0PSh1PUp0KXx8YyxhcihlLHQpLEp0PXUpOmFyKGUsdCksT3IodCksciY4MTkyKXtpZih1PXQubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKHQuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmdC5tb2RlJjEpZm9yKG5lPXQsYz10LmNoaWxkO2MhPT1udWxsOyl7Zm9yKGQ9bmU9YztuZSE9PW51bGw7KXtzd2l0Y2goZj1uZSxoPWYuY2hpbGQsZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTp4YSg0LGYsZi5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpJbChmLGYucmV0dXJuKTt2YXIgbT1mLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj1mLG49Zi5yZXR1cm47dHJ5e2U9cixtLnByb3BzPWUubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7dnQocixuLGcpfX1icmVhaztjYXNlIDU6SWwoZixmLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihmLm1lbW9pemVkU3RhdGUhPT1udWxsKXtmMChkKTtjb250aW51ZX19aCE9PW51bGw/KGgucmV0dXJuPWYsbmU9aCk6ZjAoZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9dDs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e2k9ZC5zdGF0ZU5vZGUsdT8obz1pLnN0eWxlLHR5cGVvZiBvLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP28uc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6by5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsYT1kLm1lbW9pemVkUHJvcHMuc3R5bGUsbD1hIT1udWxsJiZhLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/YS5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PVlfKCJkaXNwbGF5IixsKSl9Y2F0Y2goZyl7dnQodCx0LnJldHVybixnKX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKGcpe3Z0KHQsdC5yZXR1cm4sZyl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT10KSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT10KWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PXQpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTphcihlLHQpLE9yKHQpLHImNCYmYzAodCk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmFyKGUsdCksT3IodCl9fWZ1bmN0aW9uIE9yKHQpe3ZhciBlPXQuZmxhZ3M7aWYoZSYyKXt0cnl7ZTp7Zm9yKHZhciBuPXQucmV0dXJuO24hPT1udWxsOyl7aWYoU3cobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKFcoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIGk9ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKERhKGksIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIG89dTAodCk7anAodCxvLGkpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGw9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPXUwKHQpO0RwKHQscyxsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYxKSl9fWNhdGNoKGEpe3Z0KHQsdC5yZXR1cm4sYSl9dC5mbGFncyY9LTN9ZSY0MDk2JiYodC5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIHdUKHQsZSxuKXtuZT10LGt3KHQpfWZ1bmN0aW9uIGt3KHQsZSxuKXtmb3IodmFyIHI9KHQubW9kZSYxKSE9PTA7bmUhPT1udWxsOyl7dmFyIGk9bmUsbz1pLmNoaWxkO2lmKGkudGFnPT09MjImJnIpe3ZhciBsPWkubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fHVjO2lmKCFsKXt2YXIgcz1pLmFsdGVybmF0ZSxhPXMhPT1udWxsJiZzLm1lbW9pemVkU3RhdGUhPT1udWxsfHxKdDtzPXVjO3ZhciB1PUp0O2lmKHVjPWwsKEp0PWEpJiYhdSlmb3IobmU9aTtuZSE9PW51bGw7KWw9bmUsYT1sLmNoaWxkLGwudGFnPT09MjImJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGw/aDAoaSk6YSE9PW51bGw/KGEucmV0dXJuPWwsbmU9YSk6aDAoaSk7Zm9yKDtvIT09bnVsbDspbmU9byxrdyhvKSxvPW8uc2libGluZztuZT1pLHVjPXMsSnQ9dX1kMCh0KX1lbHNlIGkuc3VidHJlZUZsYWdzJjg3NzImJm8hPT1udWxsPyhvLnJldHVybj1pLG5lPW8pOmQwKHQpfX1mdW5jdGlvbiBkMCh0KXtmb3IoO25lIT09bnVsbDspe3ZhciBlPW5lO2lmKGUuZmxhZ3MmODc3Mil7dmFyIG49ZS5hbHRlcm5hdGU7dHJ5e2lmKGUuZmxhZ3MmODc3Milzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6SnR8fGZmKDUsZSk7YnJlYWs7Y2FzZSAxOnZhciByPWUuc3RhdGVOb2RlO2lmKGUuZmxhZ3MmNCYmIUp0KWlmKG49PT1udWxsKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBpPWUuZWxlbWVudFR5cGU9PT1lLnR5cGU/bi5tZW1vaXplZFByb3BzOmZyKGUudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKGksbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBvPWUudXBkYXRlUXVldWU7byE9PW51bGwmJkd5KGUsbyxyKTticmVhaztjYXNlIDM6dmFyIGw9ZS51cGRhdGVRdWV1ZTtpZihsIT09bnVsbCl7aWYobj1udWxsLGUuY2hpbGQhPT1udWxsKXN3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1Om49ZS5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOm49ZS5jaGlsZC5zdGF0ZU5vZGV9R3koZSxsLG4pfWJyZWFrO2Nhc2UgNTp2YXIgcz1lLnN0YXRlTm9kZTtpZihuPT09bnVsbCYmZS5mbGFncyY0KXtuPXM7dmFyIGE9ZS5tZW1vaXplZFByb3BzO3N3aXRjaChlLnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6YS5hdXRvRm9jdXMmJm4uZm9jdXMoKTticmVhaztjYXNlImltZyI6YS5zcmMmJihuLnNyYz1hLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKGUubWVtb2l6ZWRTdGF0ZT09PW51bGwpe3ZhciB1PWUuYWx0ZXJuYXRlO2lmKHUhPT1udWxsKXt2YXIgYz11Lm1lbW9pemVkU3RhdGU7aWYoYyE9PW51bGwpe3ZhciBkPWMuZGVoeWRyYXRlZDtkIT09bnVsbCYmQmEoZCl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMTYzKSl9SnR8fGUuZmxhZ3MmNTEyJiZJcChlKX1jYXRjaChmKXt2dChlLGUucmV0dXJuLGYpfX1pZihlPT09dCl7bmU9bnVsbDticmVha31pZihuPWUuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49ZS5yZXR1cm4sbmU9bjticmVha31uZT1lLnJldHVybn19ZnVuY3Rpb24gZjAodCl7Zm9yKDtuZSE9PW51bGw7KXt2YXIgZT1uZTtpZihlPT09dCl7bmU9bnVsbDticmVha312YXIgbj1lLnNpYmxpbmc7aWYobiE9PW51bGwpe24ucmV0dXJuPWUucmV0dXJuLG5lPW47YnJlYWt9bmU9ZS5yZXR1cm59fWZ1bmN0aW9uIGgwKHQpe2Zvcig7bmUhPT1udWxsOyl7dmFyIGU9bmU7dHJ5e3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj1lLnJldHVybjt0cnl7ZmYoNCxlKX1jYXRjaChhKXt2dChlLG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPWUuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgaT1lLnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe3Z0KGUsaSxhKX19dmFyIG89ZS5yZXR1cm47dHJ5e0lwKGUpfWNhdGNoKGEpe3Z0KGUsbyxhKX1icmVhaztjYXNlIDU6dmFyIGw9ZS5yZXR1cm47dHJ5e0lwKGUpfWNhdGNoKGEpe3Z0KGUsbCxhKX19fWNhdGNoKGEpe3Z0KGUsZS5yZXR1cm4sYSl9aWYoZT09PXQpe25lPW51bGw7YnJlYWt9dmFyIHM9ZS5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj1lLnJldHVybixuZT1zO2JyZWFrfW5lPWUucmV0dXJufX12YXIgU1Q9TWF0aC5jZWlsLHBkPXhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTG09eGkuUmVhY3RDdXJyZW50T3duZXIsdHI9eGkuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsTGU9MCxCdD1udWxsLGJ0PW51bGwsWnQ9MCxBbj0wLERsPW1vKDApLFB0PTAsSmE9bnVsbCxXbz0wLGhmPTAsSW09MCxfYT1udWxsLGtuPW51bGwsRG09MCxscz0xLzAsdGk9bnVsbCxnZD0hMSx6cD1udWxsLFlpPW51bGwsY2M9ITEsQmk9bnVsbCxtZD0wLHdhPTAsRnA9bnVsbCxEYz0tMSxqYz0wO2Z1bmN0aW9uIHZuKCl7cmV0dXJuIExlJjY/Q3QoKTpEYyE9PS0xP0RjOkRjPUN0KCl9ZnVuY3Rpb24gWGkodCl7cmV0dXJuIHQubW9kZSYxP0xlJjImJlp0IT09MD9adCYtWnQ6b1QudHJhbnNpdGlvbiE9PW51bGw/KGpjPT09MCYmKGpjPWExKCkpLGpjKToodD1XZSx0IT09MHx8KHQ9d2luZG93LmV2ZW50LHQ9dD09PXZvaWQgMD8xNjpnMSh0LnR5cGUpKSx0KToxfWZ1bmN0aW9uIF9yKHQsZSxuLHIpe2lmKDUwPHdhKXRocm93IHdhPTAsRnA9bnVsbCxFcnJvcihXKDE4NSkpO1J1KHQsbixyKSwoIShMZSYyKXx8dCE9PUJ0KSYmKHQ9PT1CdCYmKCEoTGUmMikmJihoZnw9biksUHQ9PT00JiZEaSh0LFp0KSksTm4odCxyKSxuPT09MSYmTGU9PT0wJiYhKGUubW9kZSYxKSYmKGxzPUN0KCkrNTAwLHVmJiZ2bygpKSl9ZnVuY3Rpb24gTm4odCxlKXt2YXIgbj10LmNhbGxiYWNrTm9kZTtvJCh0LGUpO3ZhciByPXFjKHQsdD09PUJ0P1p0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZTeShuKSx0LmNhbGxiYWNrTm9kZT1udWxsLHQuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYoZT1yJi1yLHQuY2FsbGJhY2tQcmlvcml0eSE9PWUpe2lmKG4hPW51bGwmJlN5KG4pLGU9PT0xKXQudGFnPT09MD9pVChwMC5iaW5kKG51bGwsdCkpOk0xKHAwLmJpbmQobnVsbCx0KSksZVQoZnVuY3Rpb24oKXshKExlJjYpJiZ2bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKHUxKHIpKXtjYXNlIDE6bj11bTticmVhaztjYXNlIDQ6bj1sMTticmVhaztjYXNlIDE2Om49SmM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1zMTticmVhaztkZWZhdWx0Om49SmN9bj1BdyhuLGJ3LmJpbmQobnVsbCx0KSl9dC5jYWxsYmFja1ByaW9yaXR5PWUsdC5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gYncodCxlKXtpZihEYz0tMSxqYz0wLExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTt2YXIgbj10LmNhbGxiYWNrTm9kZTtpZihabCgpJiZ0LmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9cWModCx0PT09QnQ/WnQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZ0LmV4cGlyZWRMYW5lc3x8ZSllPXZkKHQscik7ZWxzZXtlPXI7dmFyIGk9TGU7TGV8PTI7dmFyIG89VHcoKTsoQnQhPT10fHxadCE9PWUpJiYodGk9bnVsbCxscz1DdCgpKzUwMCxBbyh0LGUpKTtkbyB0cnl7a1QoKTticmVha31jYXRjaChzKXskdyh0LHMpfXdoaWxlKCEwKTtTbSgpLHBkLmN1cnJlbnQ9byxMZT1pLGJ0IT09bnVsbD9lPTA6KEJ0PW51bGwsWnQ9MCxlPVB0KX1pZihlIT09MCl7aWYoZT09PTImJihpPWhwKHQpLGkhPT0wJiYocj1pLGU9QnAodCxpKSkpLGU9PT0xKXRocm93IG49SmEsQW8odCwwKSxEaSh0LHIpLE5uKHQsQ3QoKSksbjtpZihlPT09NilEaSh0LHIpO2Vsc2V7aWYoaT10LmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFFVChpKSYmKGU9dmQodCxyKSxlPT09MiYmKG89aHAodCksbyE9PTAmJihyPW8sZT1CcCh0LG8pKSksZT09PTEpKXRocm93IG49SmEsQW8odCwwKSxEaSh0LHIpLE5uKHQsQ3QoKSksbjtzd2l0Y2godC5maW5pc2hlZFdvcms9aSx0LmZpbmlzaGVkTGFuZXM9cixlKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFcoMzQ1KSk7Y2FzZSAyOmtvKHQsa24sdGkpO2JyZWFrO2Nhc2UgMzppZihEaSh0LHIpLChyJjEzMDAyMzQyNCk9PT1yJiYoZT1EbSs1MDAtQ3QoKSwxMDxlKSl7aWYocWModCwwKSE9PTApYnJlYWs7aWYoaT10LnN1c3BlbmRlZExhbmVzLChpJnIpIT09cil7dm4oKSx0LnBpbmdlZExhbmVzfD10LnN1c3BlbmRlZExhbmVzJmk7YnJlYWt9dC50aW1lb3V0SGFuZGxlPXdwKGtvLmJpbmQobnVsbCx0LGtuLHRpKSxlKTticmVha31rbyh0LGtuLHRpKTticmVhaztjYXNlIDQ6aWYoRGkodCxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKGU9dC5ldmVudFRpbWVzLGk9LTE7MDxyOyl7dmFyIGw9MzEteHIocik7bz0xPDxsLGw9ZVtsXSxsPmkmJihpPWwpLHImPX5vfWlmKHI9aSxyPUN0KCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKlNUKHIvMTk2MCkpLXIsMTA8cil7dC50aW1lb3V0SGFuZGxlPXdwKGtvLmJpbmQobnVsbCx0LGtuLHRpKSxyKTticmVha31rbyh0LGtuLHRpKTticmVhaztjYXNlIDU6a28odCxrbix0aSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDMyOSkpfX19cmV0dXJuIE5uKHQsQ3QoKSksdC5jYWxsYmFja05vZGU9PT1uP2J3LmJpbmQobnVsbCx0KTpudWxsfWZ1bmN0aW9uIEJwKHQsZSl7dmFyIG49X2E7cmV0dXJuIHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKEFvKHQsZSkuZmxhZ3N8PTI1NiksdD12ZCh0LGUpLHQhPT0yJiYoZT1rbixrbj1uLGUhPT1udWxsJiZVcChlKSksdH1mdW5jdGlvbiBVcCh0KXtrbj09PW51bGw/a249dDprbi5wdXNoLmFwcGx5KGtuLHQpfWZ1bmN0aW9uIEVUKHQpe2Zvcih2YXIgZT10Ozspe2lmKGUuZmxhZ3MmMTYzODQpe3ZhciBuPWUudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXSxvPWkuZ2V0U25hcHNob3Q7aT1pLnZhbHVlO3RyeXtpZighRXIobygpLGkpKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj1lLmNoaWxkLGUuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj1lLGU9bjtlbHNle2lmKGU9PT10KWJyZWFrO2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8ZS5yZXR1cm49PT10KXJldHVybiEwO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gRGkodCxlKXtmb3IoZSY9fkltLGUmPX5oZix0LnN1c3BlbmRlZExhbmVzfD1lLHQucGluZ2VkTGFuZXMmPX5lLHQ9dC5leHBpcmF0aW9uVGltZXM7MDxlOyl7dmFyIG49MzEteHIoZSkscj0xPDxuO3Rbbl09LTEsZSY9fnJ9fWZ1bmN0aW9uIHAwKHQpe2lmKExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtabCgpO3ZhciBlPXFjKHQsMCk7aWYoIShlJjEpKXJldHVybiBObih0LEN0KCkpLG51bGw7dmFyIG49dmQodCxlKTtpZih0LnRhZyE9PTAmJm49PT0yKXt2YXIgcj1ocCh0KTtyIT09MCYmKGU9cixuPUJwKHQscikpfWlmKG49PT0xKXRocm93IG49SmEsQW8odCwwKSxEaSh0LGUpLE5uKHQsQ3QoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihXKDM0NSkpO3JldHVybiB0LmZpbmlzaGVkV29yaz10LmN1cnJlbnQuYWx0ZXJuYXRlLHQuZmluaXNoZWRMYW5lcz1lLGtvKHQsa24sdGkpLE5uKHQsQ3QoKSksbnVsbH1mdW5jdGlvbiBqbSh0LGUpe3ZhciBuPUxlO0xlfD0xO3RyeXtyZXR1cm4gdChlKX1maW5hbGx5e0xlPW4sTGU9PT0wJiYobHM9Q3QoKSs1MDAsdWYmJnZvKCkpfX1mdW5jdGlvbiBWbyh0KXtCaSE9PW51bGwmJkJpLnRhZz09PTAmJiEoTGUmNikmJlpsKCk7dmFyIGU9TGU7TGV8PTE7dmFyIG49dHIudHJhbnNpdGlvbixyPVdlO3RyeXtpZih0ci50cmFuc2l0aW9uPW51bGwsV2U9MSx0KXJldHVybiB0KCl9ZmluYWxseXtXZT1yLHRyLnRyYW5zaXRpb249bixMZT1lLCEoTGUmNikmJnZvKCl9fWZ1bmN0aW9uIHptKCl7QW49RGwuY3VycmVudCxpdChEbCl9ZnVuY3Rpb24gQW8odCxlKXt0LmZpbmlzaGVkV29yaz1udWxsLHQuZmluaXNoZWRMYW5lcz0wO3ZhciBuPXQudGltZW91dEhhbmRsZTtpZihuIT09LTEmJih0LnRpbWVvdXRIYW5kbGU9LTEscSQobikpLGJ0IT09bnVsbClmb3Iobj1idC5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaCh4bShyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmlkKCk7YnJlYWs7Y2FzZSAzOmlzKCksaXQoJG4pLGl0KHJuKSxUbSgpO2JyZWFrO2Nhc2UgNTokbShyKTticmVhaztjYXNlIDQ6aXMoKTticmVhaztjYXNlIDEzOml0KGR0KTticmVhaztjYXNlIDE5Oml0KGR0KTticmVhaztjYXNlIDEwOkVtKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOnptKCl9bj1uLnJldHVybn1pZihCdD10LGJ0PXQ9UWkodC5jdXJyZW50LG51bGwpLFp0PUFuPWUsUHQ9MCxKYT1udWxsLEltPWhmPVdvPTAsa249X2E9bnVsbCxObyE9PW51bGwpe2ZvcihlPTA7ZTxOby5sZW5ndGg7ZSsrKWlmKG49Tm9bZV0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIGk9ci5uZXh0LG89bi5wZW5kaW5nO2lmKG8hPT1udWxsKXt2YXIgbD1vLm5leHQ7by5uZXh0PWksci5uZXh0PWx9bi5wZW5kaW5nPXJ9Tm89bnVsbH1yZXR1cm4gdH1mdW5jdGlvbiAkdyh0LGUpe2Rve3ZhciBuPWJ0O3RyeXtpZihTbSgpLE1jLmN1cnJlbnQ9aGQsZmQpe2Zvcih2YXIgcj1odC5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIGk9ci5xdWV1ZTtpIT09bnVsbCYmKGkucGVuZGluZz1udWxsKSxyPXIubmV4dH1mZD0hMX1pZihVbz0wLEl0PVJ0PWh0PW51bGwseWE9ITEsWWE9MCxMbS5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7UHQ9MSxKYT1lLGJ0PW51bGw7YnJlYWt9ZTp7dmFyIG89dCxsPW4ucmV0dXJuLHM9bixhPWU7aWYoZT1adCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIGY9Yy5hbHRlcm5hdGU7Zj8oYy51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1mLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgaD10MChsKTtpZihoIT09bnVsbCl7aC5mbGFncyY9LTI1NyxuMChoLGwscyxvLGUpLGgubW9kZSYxJiZlMChvLHUsZSksZT1oLGE9dTt2YXIgbT1lLnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgZz1uZXcgU2V0O2cuYWRkKGEpLGUudXBkYXRlUXVldWU9Z31lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKGUmMSkpe2UwKG8sdSxlKSxGbSgpO2JyZWFrIGV9YT1FcnJvcihXKDQyNikpfX1lbHNlIGlmKG90JiZzLm1vZGUmMSl7dmFyIHc9dDAobCk7aWYodyE9PW51bGwpeyEody5mbGFncyY2NTUzNikmJih3LmZsYWdzfD0yNTYpLG4wKHcsbCxzLG8sZSksX20ob3MoYSxzKSk7YnJlYWsgZX19bz1hPW9zKGEscyksUHQhPT00JiYoUHQ9MiksX2E9PT1udWxsP19hPVtvXTpfYS5wdXNoKG8pLG89bDtkb3tzd2l0Y2goby50YWcpe2Nhc2UgMzpvLmZsYWdzfD02NTUzNixlJj0tZSxvLmxhbmVzfD1lO3ZhciB2PWN3KG8sYSxlKTtaeShvLHYpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgeT1vLnR5cGUseD1vLnN0YXRlTm9kZTtpZighKG8uZmxhZ3MmMTI4KSYmKHR5cGVvZiB5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8eCE9PW51bGwmJnR5cGVvZiB4LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoWWk9PT1udWxsfHwhWWkuaGFzKHgpKSkpe28uZmxhZ3N8PTY1NTM2LGUmPS1lLG8ubGFuZXN8PWU7dmFyIFM9ZHcobyxzLGUpO1p5KG8sUyk7YnJlYWsgZX19bz1vLnJldHVybn13aGlsZShvIT09bnVsbCl9Uncobil9Y2F0Y2goYil7ZT1iLGJ0PT09biYmbiE9PW51bGwmJihidD1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gVHcoKXt2YXIgdD1wZC5jdXJyZW50O3JldHVybiBwZC5jdXJyZW50PWhkLHQ9PT1udWxsP2hkOnR9ZnVuY3Rpb24gRm0oKXsoUHQ9PT0wfHxQdD09PTN8fFB0PT09MikmJihQdD00KSxCdD09PW51bGx8fCEoV28mMjY4NDM1NDU1KSYmIShoZiYyNjg0MzU0NTUpfHxEaShCdCxadCl9ZnVuY3Rpb24gdmQodCxlKXt2YXIgbj1MZTtMZXw9Mjt2YXIgcj1UdygpOyhCdCE9PXR8fFp0IT09ZSkmJih0aT1udWxsLEFvKHQsZSkpO2RvIHRyeXtDVCgpO2JyZWFrfWNhdGNoKGkpeyR3KHQsaSl9d2hpbGUoITApO2lmKFNtKCksTGU9bixwZC5jdXJyZW50PXIsYnQhPT1udWxsKXRocm93IEVycm9yKFcoMjYxKSk7cmV0dXJuIEJ0PW51bGwsWnQ9MCxQdH1mdW5jdGlvbiBDVCgpe2Zvcig7YnQhPT1udWxsOylOdyhidCl9ZnVuY3Rpb24ga1QoKXtmb3IoO2J0IT09bnVsbCYmIVhiKCk7KU53KGJ0KX1mdW5jdGlvbiBOdyh0KXt2YXIgZT1Qdyh0LmFsdGVybmF0ZSx0LEFuKTt0Lm1lbW9pemVkUHJvcHM9dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/UncodCk6YnQ9ZSxMbS5jdXJyZW50PW51bGx9ZnVuY3Rpb24gUncodCl7dmFyIGU9dDtkb3t2YXIgbj1lLmFsdGVybmF0ZTtpZih0PWUucmV0dXJuLGUuZmxhZ3MmMzI3Njgpe2lmKG49eVQobixlKSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsYnQ9bjtyZXR1cm59aWYodCE9PW51bGwpdC5mbGFnc3w9MzI3NjgsdC5zdWJ0cmVlRmxhZ3M9MCx0LmRlbGV0aW9ucz1udWxsO2Vsc2V7UHQ9NixidD1udWxsO3JldHVybn19ZWxzZSBpZihuPXZUKG4sZSxBbiksbiE9PW51bGwpe2J0PW47cmV0dXJufWlmKGU9ZS5zaWJsaW5nLGUhPT1udWxsKXtidD1lO3JldHVybn1idD1lPXR9d2hpbGUoZSE9PW51bGwpO1B0PT09MCYmKFB0PTUpfWZ1bmN0aW9uIGtvKHQsZSxuKXt2YXIgcj1XZSxpPXRyLnRyYW5zaXRpb247dHJ5e3RyLnRyYW5zaXRpb249bnVsbCxXZT0xLGJUKHQsZSxuLHIpfWZpbmFsbHl7dHIudHJhbnNpdGlvbj1pLFdlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gYlQodCxlLG4scil7ZG8gWmwoKTt3aGlsZShCaSE9PW51bGwpO2lmKExlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtuPXQuZmluaXNoZWRXb3JrO3ZhciBpPXQuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZih0LmZpbmlzaGVkV29yaz1udWxsLHQuZmluaXNoZWRMYW5lcz0wLG49PT10LmN1cnJlbnQpdGhyb3cgRXJyb3IoVygxNzcpKTt0LmNhbGxiYWNrTm9kZT1udWxsLHQuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBvPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGwkKHQsbyksdD09PUJ0JiYoYnQ9QnQ9bnVsbCxadD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGNjfHwoY2M9ITAsQXcoSmMsZnVuY3Rpb24oKXtyZXR1cm4gWmwoKSxudWxsfSkpLG89KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8byl7bz10ci50cmFuc2l0aW9uLHRyLnRyYW5zaXRpb249bnVsbDt2YXIgbD1XZTtXZT0xO3ZhciBzPUxlO0xlfD00LExtLmN1cnJlbnQ9bnVsbCxfVCh0LG4pLEN3KG4sdCksSyQoeHApLGVkPSEheXAseHA9eXA9bnVsbCx0LmN1cnJlbnQ9bix3VChuKSxRYigpLExlPXMsV2U9bCx0ci50cmFuc2l0aW9uPW99ZWxzZSB0LmN1cnJlbnQ9bjtpZihjYyYmKGNjPSExLEJpPXQsbWQ9aSksbz10LnBlbmRpbmdMYW5lcyxvPT09MCYmKFlpPW51bGwpLGUkKG4uc3RhdGVOb2RlKSxObih0LEN0KCkpLGUhPT1udWxsKWZvcihyPXQub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPGUubGVuZ3RoO24rKylpPWVbbl0scihpLnZhbHVlLHtjb21wb25lbnRTdGFjazppLnN0YWNrLGRpZ2VzdDppLmRpZ2VzdH0pO2lmKGdkKXRocm93IGdkPSExLHQ9enAsenA9bnVsbCx0O3JldHVybiBtZCYxJiZ0LnRhZyE9PTAmJlpsKCksbz10LnBlbmRpbmdMYW5lcyxvJjE/dD09PUZwP3dhKys6KHdhPTAsRnA9dCk6d2E9MCx2bygpLG51bGx9ZnVuY3Rpb24gWmwoKXtpZihCaSE9PW51bGwpe3ZhciB0PXUxKG1kKSxlPXRyLnRyYW5zaXRpb24sbj1XZTt0cnl7aWYodHIudHJhbnNpdGlvbj1udWxsLFdlPTE2PnQ/MTY6dCxCaT09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZih0PUJpLEJpPW51bGwsbWQ9MCxMZSY2KXRocm93IEVycm9yKFcoMzMxKSk7dmFyIGk9TGU7Zm9yKExlfD00LG5lPXQuY3VycmVudDtuZSE9PW51bGw7KXt2YXIgbz1uZSxsPW8uY2hpbGQ7aWYobmUuZmxhZ3MmMTYpe3ZhciBzPW8uZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IobmU9dTtuZSE9PW51bGw7KXt2YXIgYz1uZTtzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eGEoOCxjLG8pfXZhciBkPWMuY2hpbGQ7aWYoZCE9PW51bGwpZC5yZXR1cm49YyxuZT1kO2Vsc2UgZm9yKDtuZSE9PW51bGw7KXtjPW5lO3ZhciBmPWMuc2libGluZyxoPWMucmV0dXJuO2lmKHd3KGMpLGM9PT11KXtuZT1udWxsO2JyZWFrfWlmKGYhPT1udWxsKXtmLnJldHVybj1oLG5lPWY7YnJlYWt9bmU9aH19fXZhciBtPW8uYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgZz1tLmNoaWxkO2lmKGchPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIHc9Zy5zaWJsaW5nO2cuc2libGluZz1udWxsLGc9d313aGlsZShnIT09bnVsbCl9fW5lPW99fWlmKG8uc3VidHJlZUZsYWdzJjIwNjQmJmwhPT1udWxsKWwucmV0dXJuPW8sbmU9bDtlbHNlIGU6Zm9yKDtuZSE9PW51bGw7KXtpZihvPW5lLG8uZmxhZ3MmMjA0OClzd2l0Y2goby50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6eGEoOSxvLG8ucmV0dXJuKX12YXIgdj1vLnNpYmxpbmc7aWYodiE9PW51bGwpe3YucmV0dXJuPW8ucmV0dXJuLG5lPXY7YnJlYWsgZX1uZT1vLnJldHVybn19dmFyIHk9dC5jdXJyZW50O2ZvcihuZT15O25lIT09bnVsbDspe2w9bmU7dmFyIHg9bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZ4IT09bnVsbCl4LnJldHVybj1sLG5lPXg7ZWxzZSBlOmZvcihsPXk7bmUhPT1udWxsOyl7aWYocz1uZSxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpmZig5LHMpfX1jYXRjaChiKXt2dChzLHMucmV0dXJuLGIpfWlmKHM9PT1sKXtuZT1udWxsO2JyZWFrIGV9dmFyIFM9cy5zaWJsaW5nO2lmKFMhPT1udWxsKXtTLnJldHVybj1zLnJldHVybixuZT1TO2JyZWFrIGV9bmU9cy5yZXR1cm59fWlmKExlPWksdm8oKSx6ciYmdHlwZW9mIHpyLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7enIub25Qb3N0Q29tbWl0RmliZXJSb290KHJmLHQpfWNhdGNoe31yPSEwfXJldHVybiByfWZpbmFsbHl7V2U9bix0ci50cmFuc2l0aW9uPWV9fXJldHVybiExfWZ1bmN0aW9uIGcwKHQsZSxuKXtlPW9zKG4sZSksZT1jdyh0LGUsMSksdD1HaSh0LGUsMSksZT12bigpLHQhPT1udWxsJiYoUnUodCwxLGUpLE5uKHQsZSkpfWZ1bmN0aW9uIHZ0KHQsZSxuKXtpZih0LnRhZz09PTMpZzAodCx0LG4pO2Vsc2UgZm9yKDtlIT09bnVsbDspe2lmKGUudGFnPT09Myl7ZzAoZSx0LG4pO2JyZWFrfWVsc2UgaWYoZS50YWc9PT0xKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0eXBlb2YgZS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIHIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihZaT09PW51bGx8fCFZaS5oYXMocikpKXt0PW9zKG4sdCksdD1kdyhlLHQsMSksZT1HaShlLHQsMSksdD12bigpLGUhPT1udWxsJiYoUnUoZSwxLHQpLE5uKGUsdCkpO2JyZWFrfX1lPWUucmV0dXJufX1mdW5jdGlvbiAkVCh0LGUsbil7dmFyIHI9dC5waW5nQ2FjaGU7ciE9PW51bGwmJnIuZGVsZXRlKGUpLGU9dm4oKSx0LnBpbmdlZExhbmVzfD10LnN1c3BlbmRlZExhbmVzJm4sQnQ9PT10JiYoWnQmbik9PT1uJiYoUHQ9PT00fHxQdD09PTMmJihadCYxMzAwMjM0MjQpPT09WnQmJjUwMD5DdCgpLURtP0FvKHQsMCk6SW18PW4pLE5uKHQsZSl9ZnVuY3Rpb24gT3codCxlKXtlPT09MCYmKHQubW9kZSYxPyhlPWVjLGVjPDw9MSwhKGVjJjEzMDAyMzQyNCkmJihlYz00MTk0MzA0KSk6ZT0xKTt2YXIgbj12bigpO3Q9aGkodCxlKSx0IT09bnVsbCYmKFJ1KHQsZSxuKSxObih0LG4pKX1mdW5jdGlvbiBUVCh0KXt2YXIgZT10Lm1lbW9pemVkU3RhdGUsbj0wO2UhPT1udWxsJiYobj1lLnJldHJ5TGFuZSksT3codCxuKX1mdW5jdGlvbiBOVCh0LGUpe3ZhciBuPTA7c3dpdGNoKHQudGFnKXtjYXNlIDEzOnZhciByPXQuc3RhdGVOb2RlLGk9dC5tZW1vaXplZFN0YXRlO2khPT1udWxsJiYobj1pLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPXQuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVygzMTQpKX1yIT09bnVsbCYmci5kZWxldGUoZSksT3codCxuKX12YXIgUHc7UHc9ZnVuY3Rpb24odCxlLG4pe2lmKHQhPT1udWxsKWlmKHQubWVtb2l6ZWRQcm9wcyE9PWUucGVuZGluZ1Byb3BzfHwkbi5jdXJyZW50KWJuPSEwO2Vsc2V7aWYoISh0LmxhbmVzJm4pJiYhKGUuZmxhZ3MmMTI4KSlyZXR1cm4gYm49ITEsbVQodCxlLG4pO2JuPSEhKHQuZmxhZ3MmMTMxMDcyKX1lbHNlIGJuPSExLG90JiZlLmZsYWdzJjEwNDg1NzYmJkwxKGUsc2QsZS5pbmRleCk7c3dpdGNoKGUubGFuZXM9MCxlLnRhZyl7Y2FzZSAyOnZhciByPWUudHlwZTtJYyh0LGUpLHQ9ZS5wZW5kaW5nUHJvcHM7dmFyIGk9dHMoZSxybi5jdXJyZW50KTtLbChlLG4pLGk9Um0obnVsbCxlLHIsdCxpLG4pO3ZhciBvPU9tKCk7cmV0dXJuIGUuZmxhZ3N8PTEsdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbCYmdHlwZW9mIGkucmVuZGVyPT0iZnVuY3Rpb24iJiZpLiQkdHlwZW9mPT09dm9pZCAwPyhlLnRhZz0xLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbCxUbihyKT8obz0hMCxvZChlKSk6bz0hMSxlLm1lbW9pemVkU3RhdGU9aS5zdGF0ZSE9PW51bGwmJmkuc3RhdGUhPT12b2lkIDA/aS5zdGF0ZTpudWxsLGttKGUpLGkudXBkYXRlcj1jZixlLnN0YXRlTm9kZT1pLGkuX3JlYWN0SW50ZXJuYWxzPWUsVHAoZSxyLHQsbiksZT1PcChudWxsLGUsciwhMCxvLG4pKTooZS50YWc9MCxvdCYmbyYmeW0oZSksdW4obnVsbCxlLGksbiksZT1lLmNoaWxkKSxlO2Nhc2UgMTY6cj1lLmVsZW1lbnRUeXBlO2U6e3N3aXRjaChJYyh0LGUpLHQ9ZS5wZW5kaW5nUHJvcHMsaT1yLl9pbml0LHI9aShyLl9wYXlsb2FkKSxlLnR5cGU9cixpPWUudGFnPU9UKHIpLHQ9ZnIocix0KSxpKXtjYXNlIDA6ZT1ScChudWxsLGUscix0LG4pO2JyZWFrIGU7Y2FzZSAxOmU9bzAobnVsbCxlLHIsdCxuKTticmVhayBlO2Nhc2UgMTE6ZT1yMChudWxsLGUscix0LG4pO2JyZWFrIGU7Y2FzZSAxNDplPWkwKG51bGwsZSxyLGZyKHIudHlwZSx0KSxuKTticmVhayBlfXRocm93IEVycm9yKFcoMzA2LHIsIiIpKX1yZXR1cm4gZTtjYXNlIDA6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksUnAodCxlLHIsaSxuKTtjYXNlIDE6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksbzAodCxlLHIsaSxuKTtjYXNlIDM6ZTp7aWYoZ3coZSksdD09PW51bGwpdGhyb3cgRXJyb3IoVygzODcpKTtyPWUucGVuZGluZ1Byb3BzLG89ZS5tZW1vaXplZFN0YXRlLGk9by5lbGVtZW50LHoxKHQsZSksY2QoZSxyLG51bGwsbik7dmFyIGw9ZS5tZW1vaXplZFN0YXRlO2lmKHI9bC5lbGVtZW50LG8uaXNEZWh5ZHJhdGVkKWlmKG89e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSxlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1vLGUubWVtb2l6ZWRTdGF0ZT1vLGUuZmxhZ3MmMjU2KXtpPW9zKEVycm9yKFcoNDIzKSksZSksZT1sMCh0LGUscixuLGkpO2JyZWFrIGV9ZWxzZSBpZihyIT09aSl7aT1vcyhFcnJvcihXKDQyNCkpLGUpLGU9bDAodCxlLHIsbixpKTticmVhayBlfWVsc2UgZm9yKEluPVppKGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksRG49ZSxvdD0hMCxncj1udWxsLG49VzEoZSxudWxsLHIsbiksZS5jaGlsZD1uO247KW4uZmxhZ3M9bi5mbGFncyYtM3w0MDk2LG49bi5zaWJsaW5nO2Vsc2V7aWYobnMoKSxyPT09aSl7ZT1waSh0LGUsbik7YnJlYWsgZX11bih0LGUscixuKX1lPWUuY2hpbGR9cmV0dXJuIGU7Y2FzZSA1OnJldHVybiBWMShlKSx0PT09bnVsbCYma3AoZSkscj1lLnR5cGUsaT1lLnBlbmRpbmdQcm9wcyxvPXQhPT1udWxsP3QubWVtb2l6ZWRQcm9wczpudWxsLGw9aS5jaGlsZHJlbixfcChyLGkpP2w9bnVsbDpvIT09bnVsbCYmX3AocixvKSYmKGUuZmxhZ3N8PTMyKSxwdyh0LGUpLHVuKHQsZSxsLG4pLGUuY2hpbGQ7Y2FzZSA2OnJldHVybiB0PT09bnVsbCYma3AoZSksbnVsbDtjYXNlIDEzOnJldHVybiBtdyh0LGUsbik7Y2FzZSA0OnJldHVybiBibShlLGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLHI9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/ZS5jaGlsZD1ycyhlLG51bGwscixuKTp1bih0LGUscixuKSxlLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSkscjAodCxlLHIsaSxuKTtjYXNlIDc6cmV0dXJuIHVuKHQsZSxlLnBlbmRpbmdQcm9wcyxuKSxlLmNoaWxkO2Nhc2UgODpyZXR1cm4gdW4odCxlLGUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLGUuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gdW4odCxlLGUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLGUuY2hpbGQ7Y2FzZSAxMDplOntpZihyPWUudHlwZS5fY29udGV4dCxpPWUucGVuZGluZ1Byb3BzLG89ZS5tZW1vaXplZFByb3BzLGw9aS52YWx1ZSxYZShhZCxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1sLG8hPT1udWxsKWlmKEVyKG8udmFsdWUsbCkpe2lmKG8uY2hpbGRyZW49PT1pLmNoaWxkcmVuJiYhJG4uY3VycmVudCl7ZT1waSh0LGUsbik7YnJlYWsgZX19ZWxzZSBmb3Iobz1lLmNoaWxkLG8hPT1udWxsJiYoby5yZXR1cm49ZSk7byE9PW51bGw7KXt2YXIgcz1vLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1vLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PXIpe2lmKG8udGFnPT09MSl7YT11aSgtMSxuJi1uKSxhLnRhZz0yO3ZhciB1PW8udXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIGM9dS5wZW5kaW5nO2M9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9Yy5uZXh0LGMubmV4dD1hKSx1LnBlbmRpbmc9YX19by5sYW5lc3w9bixhPW8uYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9biksYnAoby5yZXR1cm4sbixlKSxzLmxhbmVzfD1uO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKG8udGFnPT09MTApbD1vLnR5cGU9PT1lLnR5cGU/bnVsbDpvLmNoaWxkO2Vsc2UgaWYoby50YWc9PT0xOCl7aWYobD1vLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MSkpO2wubGFuZXN8PW4scz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PW4pLGJwKGwsbixlKSxsPW8uc2libGluZ31lbHNlIGw9by5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1vO2Vsc2UgZm9yKGw9bztsIT09bnVsbDspe2lmKGw9PT1lKXtsPW51bGw7YnJlYWt9aWYobz1sLnNpYmxpbmcsbyE9PW51bGwpe28ucmV0dXJuPWwucmV0dXJuLGw9bzticmVha31sPWwucmV0dXJufW89bH11bih0LGUsaS5jaGlsZHJlbixuKSxlPWUuY2hpbGR9cmV0dXJuIGU7Y2FzZSA5OnJldHVybiBpPWUudHlwZSxyPWUucGVuZGluZ1Byb3BzLmNoaWxkcmVuLEtsKGUsbiksaT1ucihpKSxyPXIoaSksZS5mbGFnc3w9MSx1bih0LGUscixuKSxlLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIHI9ZS50eXBlLGk9ZnIocixlLnBlbmRpbmdQcm9wcyksaT1mcihyLnR5cGUsaSksaTAodCxlLHIsaSxuKTtjYXNlIDE1OnJldHVybiBmdyh0LGUsZS50eXBlLGUucGVuZGluZ1Byb3BzLG4pO2Nhc2UgMTc6cmV0dXJuIHI9ZS50eXBlLGk9ZS5wZW5kaW5nUHJvcHMsaT1lLmVsZW1lbnRUeXBlPT09cj9pOmZyKHIsaSksSWModCxlKSxlLnRhZz0xLFRuKHIpPyh0PSEwLG9kKGUpKTp0PSExLEtsKGUsbiksQjEoZSxyLGkpLFRwKGUscixpLG4pLE9wKG51bGwsZSxyLCEwLHQsbik7Y2FzZSAxOTpyZXR1cm4gdncodCxlLG4pO2Nhc2UgMjI6cmV0dXJuIGh3KHQsZSxuKX10aHJvdyBFcnJvcihXKDE1NixlLnRhZykpfTtmdW5jdGlvbiBBdyh0LGUpe3JldHVybiBvMSh0LGUpfWZ1bmN0aW9uIFJUKHQsZSxuLHIpe3RoaXMudGFnPXQsdGhpcy5rZXk9bix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPWUsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXIsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIHFuKHQsZSxuLHIpe3JldHVybiBuZXcgUlQodCxlLG4scil9ZnVuY3Rpb24gQm0odCl7cmV0dXJuIHQ9dC5wcm90b3R5cGUsISghdHx8IXQuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gT1QodCl7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIEJtKHQpPzE6MDtpZih0IT1udWxsKXtpZih0PXQuJCR0eXBlb2YsdD09PWxtKXJldHVybiAxMTtpZih0PT09c20pcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIFFpKHQsZSl7dmFyIG49dC5hbHRlcm5hdGU7cmV0dXJuIG49PT1udWxsPyhuPXFuKHQudGFnLGUsdC5rZXksdC5tb2RlKSxuLmVsZW1lbnRUeXBlPXQuZWxlbWVudFR5cGUsbi50eXBlPXQudHlwZSxuLnN0YXRlTm9kZT10LnN0YXRlTm9kZSxuLmFsdGVybmF0ZT10LHQuYWx0ZXJuYXRlPW4pOihuLnBlbmRpbmdQcm9wcz1lLG4udHlwZT10LnR5cGUsbi5mbGFncz0wLG4uc3VidHJlZUZsYWdzPTAsbi5kZWxldGlvbnM9bnVsbCksbi5mbGFncz10LmZsYWdzJjE0NjgwMDY0LG4uY2hpbGRMYW5lcz10LmNoaWxkTGFuZXMsbi5sYW5lcz10LmxhbmVzLG4uY2hpbGQ9dC5jaGlsZCxuLm1lbW9pemVkUHJvcHM9dC5tZW1vaXplZFByb3BzLG4ubWVtb2l6ZWRTdGF0ZT10Lm1lbW9pemVkU3RhdGUsbi51cGRhdGVRdWV1ZT10LnVwZGF0ZVF1ZXVlLGU9dC5kZXBlbmRlbmNpZXMsbi5kZXBlbmRlbmNpZXM9ZT09PW51bGw/bnVsbDp7bGFuZXM6ZS5sYW5lcyxmaXJzdENvbnRleHQ6ZS5maXJzdENvbnRleHR9LG4uc2libGluZz10LnNpYmxpbmcsbi5pbmRleD10LmluZGV4LG4ucmVmPXQucmVmLG59ZnVuY3Rpb24gemModCxlLG4scixpLG8pe3ZhciBsPTI7aWYocj10LHR5cGVvZiB0PT0iZnVuY3Rpb24iKUJtKHQpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiB0PT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaCh0KXtjYXNlICRsOnJldHVybiBNbyhuLmNoaWxkcmVuLGksbyxlKTtjYXNlIG9tOmw9OCxpfD04O2JyZWFrO2Nhc2UgSmg6cmV0dXJuIHQ9cW4oMTIsbixlLGl8MiksdC5lbGVtZW50VHlwZT1KaCx0LmxhbmVzPW8sdDtjYXNlIHFoOnJldHVybiB0PXFuKDEzLG4sZSxpKSx0LmVsZW1lbnRUeXBlPXFoLHQubGFuZXM9byx0O2Nhc2UgZXA6cmV0dXJuIHQ9cW4oMTksbixlLGkpLHQuZWxlbWVudFR5cGU9ZXAsdC5sYW5lcz1vLHQ7Y2FzZSBVXzpyZXR1cm4gcGYobixpLG8sZSk7ZGVmYXVsdDppZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXN3aXRjaCh0LiQkdHlwZW9mKXtjYXNlIEZfOmw9MTA7YnJlYWsgZTtjYXNlIEJfOmw9OTticmVhayBlO2Nhc2UgbG06bD0xMTticmVhayBlO2Nhc2Ugc206bD0xNDticmVhayBlO2Nhc2UgQWk6bD0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihXKDEzMCx0PT1udWxsP3Q6dHlwZW9mIHQsIiIpKX1yZXR1cm4gZT1xbihsLG4sZSxpKSxlLmVsZW1lbnRUeXBlPXQsZS50eXBlPXIsZS5sYW5lcz1vLGV9ZnVuY3Rpb24gTW8odCxlLG4scil7cmV0dXJuIHQ9cW4oNyx0LHIsZSksdC5sYW5lcz1uLHR9ZnVuY3Rpb24gcGYodCxlLG4scil7cmV0dXJuIHQ9cW4oMjIsdCxyLGUpLHQuZWxlbWVudFR5cGU9VV8sdC5sYW5lcz1uLHQuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sdH1mdW5jdGlvbiBiaCh0LGUsbil7cmV0dXJuIHQ9cW4oNix0LG51bGwsZSksdC5sYW5lcz1uLHR9ZnVuY3Rpb24gJGgodCxlLG4pe3JldHVybiBlPXFuKDQsdC5jaGlsZHJlbiE9PW51bGw/dC5jaGlsZHJlbjpbXSx0LmtleSxlKSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86dC5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOnQuaW1wbGVtZW50YXRpb259LGV9ZnVuY3Rpb24gUFQodCxlLG4scixpKXt0aGlzLnRhZz1lLHRoaXMuY29udGFpbmVySW5mbz10LHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1zaCgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1zaCgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1zaCgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1pLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIFVtKHQsZSxuLHIsaSxvLGwscyxhKXtyZXR1cm4gdD1uZXcgUFQodCxlLG4scyxhKSxlPT09MT8oZT0xLG89PT0hMCYmKGV8PTgpKTplPTAsbz1xbigzLG51bGwsbnVsbCxlKSx0LmN1cnJlbnQ9byxvLnN0YXRlTm9kZT10LG8ubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LGttKG8pLHR9ZnVuY3Rpb24gQVQodCxlLG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpibCxrZXk6cj09bnVsbD9udWxsOiIiK3IsY2hpbGRyZW46dCxjb250YWluZXJJbmZvOmUsaW1wbGVtZW50YXRpb246bn19ZnVuY3Rpb24gTXcodCl7aWYoIXQpcmV0dXJuIG5vO3Q9dC5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYodGwodCkhPT10fHx0LnRhZyE9PTEpdGhyb3cgRXJyb3IoVygxNzApKTt2YXIgZT10O2Rve3N3aXRjaChlLnRhZyl7Y2FzZSAzOmU9ZS5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihUbihlLnR5cGUpKXtlPWUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fWU9ZS5yZXR1cm59d2hpbGUoZSE9PW51bGwpO3Rocm93IEVycm9yKFcoMTcxKSl9aWYodC50YWc9PT0xKXt2YXIgbj10LnR5cGU7aWYoVG4obikpcmV0dXJuIEExKHQsbixlKX1yZXR1cm4gZX1mdW5jdGlvbiBMdyh0LGUsbixyLGksbyxsLHMsYSl7cmV0dXJuIHQ9VW0obixyLCEwLHQsaSxvLGwscyxhKSx0LmNvbnRleHQ9TXcobnVsbCksbj10LmN1cnJlbnQscj12bigpLGk9WGkobiksbz11aShyLGkpLG8uY2FsbGJhY2s9ZT8/bnVsbCxHaShuLG8saSksdC5jdXJyZW50LmxhbmVzPWksUnUodCxpLHIpLE5uKHQsciksdH1mdW5jdGlvbiBnZih0LGUsbixyKXt2YXIgaT1lLmN1cnJlbnQsbz12bigpLGw9WGkoaSk7cmV0dXJuIG49TXcobiksZS5jb250ZXh0PT09bnVsbD9lLmNvbnRleHQ9bjplLnBlbmRpbmdDb250ZXh0PW4sZT11aShvLGwpLGUucGF5bG9hZD17ZWxlbWVudDp0fSxyPXI9PT12b2lkIDA/bnVsbDpyLHIhPT1udWxsJiYoZS5jYWxsYmFjaz1yKSx0PUdpKGksZSxsKSx0IT09bnVsbCYmKF9yKHQsaSxsLG8pLEFjKHQsaSxsKSksbH1mdW5jdGlvbiB5ZCh0KXtpZih0PXQuY3VycmVudCwhdC5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gdC5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gdC5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIG0wKHQsZSl7aWYodD10Lm1lbW9pemVkU3RhdGUsdCE9PW51bGwmJnQuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBuPXQucmV0cnlMYW5lO3QucmV0cnlMYW5lPW4hPT0wJiZuPGU/bjplfX1mdW5jdGlvbiBXbSh0LGUpe20wKHQsZSksKHQ9dC5hbHRlcm5hdGUpJiZtMCh0LGUpfWZ1bmN0aW9uIE1UKCl7cmV0dXJuIG51bGx9dmFyIEl3PXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbih0KXtjb25zb2xlLmVycm9yKHQpfTtmdW5jdGlvbiBWbSh0KXt0aGlzLl9pbnRlcm5hbFJvb3Q9dH1tZi5wcm90b3R5cGUucmVuZGVyPVZtLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGU9PT1udWxsKXRocm93IEVycm9yKFcoNDA5KSk7Z2YodCxlLG51bGwsbnVsbCl9O21mLnByb3RvdHlwZS51bm1vdW50PVZtLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgZT10LmNvbnRhaW5lckluZm87Vm8oZnVuY3Rpb24oKXtnZihudWxsLHQsbnVsbCxudWxsKX0pLGVbZmldPW51bGx9fTtmdW5jdGlvbiBtZih0KXt0aGlzLl9pbnRlcm5hbFJvb3Q9dH1tZi5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9ZjEoKTt0PXtibG9ja2VkT246bnVsbCx0YXJnZXQ6dCxwcmlvcml0eTplfTtmb3IodmFyIG49MDtuPElpLmxlbmd0aCYmZSE9PTAmJmU8SWlbbl0ucHJpb3JpdHk7bisrKTtJaS5zcGxpY2UobiwwLHQpLG49PT0wJiZwMSh0KX19O2Z1bmN0aW9uIEhtKHQpe3JldHVybiEoIXR8fHQubm9kZVR5cGUhPT0xJiZ0Lm5vZGVUeXBlIT09OSYmdC5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiB2Zih0KXtyZXR1cm4hKCF0fHx0Lm5vZGVUeXBlIT09MSYmdC5ub2RlVHlwZSE9PTkmJnQubm9kZVR5cGUhPT0xMSYmKHQubm9kZVR5cGUhPT04fHx0Lm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIHYwKCl7fWZ1bmN0aW9uIExUKHQsZSxuLHIsaSl7aWYoaSl7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBvPXI7cj1mdW5jdGlvbigpe3ZhciB1PXlkKGwpO28uY2FsbCh1KX19dmFyIGw9THcoZSxyLHQsMCxudWxsLCExLCExLCIiLHYwKTtyZXR1cm4gdC5fcmVhY3RSb290Q29udGFpbmVyPWwsdFtmaV09bC5jdXJyZW50LFZhKHQubm9kZVR5cGU9PT04P3QucGFyZW50Tm9kZTp0KSxWbygpLGx9Zm9yKDtpPXQubGFzdENoaWxkOyl0LnJlbW92ZUNoaWxkKGkpO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgdT15ZChhKTtzLmNhbGwodSl9fXZhciBhPVVtKHQsMCwhMSxudWxsLG51bGwsITEsITEsIiIsdjApO3JldHVybiB0Ll9yZWFjdFJvb3RDb250YWluZXI9YSx0W2ZpXT1hLmN1cnJlbnQsVmEodC5ub2RlVHlwZT09PTg/dC5wYXJlbnROb2RlOnQpLFZvKGZ1bmN0aW9uKCl7Z2YoZSxhLG4scil9KSxhfWZ1bmN0aW9uIHlmKHQsZSxuLHIsaSl7dmFyIG89bi5fcmVhY3RSb290Q29udGFpbmVyO2lmKG8pe3ZhciBsPW87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe3ZhciBzPWk7aT1mdW5jdGlvbigpe3ZhciBhPXlkKGwpO3MuY2FsbChhKX19Z2YoZSxsLHQsaSl9ZWxzZSBsPUxUKG4sZSx0LGkscik7cmV0dXJuIHlkKGwpfWMxPWZ1bmN0aW9uKHQpe3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnZhciBlPXQuc3RhdGVOb2RlO2lmKGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIG49c2EoZS5wZW5kaW5nTGFuZXMpO24hPT0wJiYoY20oZSxufDEpLE5uKGUsQ3QoKSksIShMZSY2KSYmKGxzPUN0KCkrNTAwLHZvKCkpKX1icmVhaztjYXNlIDEzOlZvKGZ1bmN0aW9uKCl7dmFyIHI9aGkodCwxKTtpZihyIT09bnVsbCl7dmFyIGk9dm4oKTtfcihyLHQsMSxpKX19KSxXbSh0LDEpfX07ZG09ZnVuY3Rpb24odCl7aWYodC50YWc9PT0xMyl7dmFyIGU9aGkodCwxMzQyMTc3MjgpO2lmKGUhPT1udWxsKXt2YXIgbj12bigpO19yKGUsdCwxMzQyMTc3Mjgsbil9V20odCwxMzQyMTc3MjgpfX07ZDE9ZnVuY3Rpb24odCl7aWYodC50YWc9PT0xMyl7dmFyIGU9WGkodCksbj1oaSh0LGUpO2lmKG4hPT1udWxsKXt2YXIgcj12bigpO19yKG4sdCxlLHIpfVdtKHQsZSl9fTtmMT1mdW5jdGlvbigpe3JldHVybiBXZX07aDE9ZnVuY3Rpb24odCxlKXt2YXIgbj1XZTt0cnl7cmV0dXJuIFdlPXQsZSgpfWZpbmFsbHl7V2U9bn19O2NwPWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2goZSl7Y2FzZSJpbnB1dCI6aWYocnAodCxuKSxlPW4ubmFtZSxuLnR5cGU9PT0icmFkaW8iJiZlIT1udWxsKXtmb3Iobj10O24ucGFyZW50Tm9kZTspbj1uLnBhcmVudE5vZGU7Zm9yKG49bi5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrZSkrJ11bdHlwZT0icmFkaW8iXScpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtpZihyIT09dCYmci5mb3JtPT09dC5mb3JtKXt2YXIgaT1hZihyKTtpZighaSl0aHJvdyBFcnJvcihXKDkwKSk7Vl8ocikscnAocixpKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOktfKHQsbik7YnJlYWs7Y2FzZSJzZWxlY3QiOmU9bi52YWx1ZSxlIT1udWxsJiZVbCh0LCEhbi5tdWx0aXBsZSxlLCExKX19O3FfPWptO2UxPVZvO3ZhciBJVD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbUHUsT2wsYWYsUV8sSl8sam1dfSxacz17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6VG8sYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sRFQ9e2J1bmRsZVR5cGU6WnMuYnVuZGxlVHlwZSx2ZXJzaW9uOlpzLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpacy5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOlpzLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnhpLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9cjEodCksdD09PW51bGw/bnVsbDp0LnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6WnMuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fE1ULGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiKXt2YXIgZGM9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKCFkYy5pc0Rpc2FibGVkJiZkYy5zdXBwb3J0c0ZpYmVyKXRyeXtyZj1kYy5pbmplY3QoRFQpLHpyPWRjfWNhdGNoe319Vm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9SVQ7Vm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIUhtKGUpKXRocm93IEVycm9yKFcoMjAwKSk7cmV0dXJuIEFUKHQsZSxudWxsLG4pfTtWbi5jcmVhdGVSb290PWZ1bmN0aW9uKHQsZSl7aWYoIUhtKHQpKXRocm93IEVycm9yKFcoMjk5KSk7dmFyIG49ITEscj0iIixpPUl3O3JldHVybiBlIT1udWxsJiYoZS51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSxlLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPWUuaWRlbnRpZmllclByZWZpeCksZS5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihpPWUub25SZWNvdmVyYWJsZUVycm9yKSksZT1VbSh0LDEsITEsbnVsbCxudWxsLG4sITEscixpKSx0W2ZpXT1lLmN1cnJlbnQsVmEodC5ub2RlVHlwZT09PTg/dC5wYXJlbnROb2RlOnQpLG5ldyBWbShlKX07Vm4uZmluZERPTU5vZGU9ZnVuY3Rpb24odCl7aWYodD09bnVsbClyZXR1cm4gbnVsbDtpZih0Lm5vZGVUeXBlPT09MSlyZXR1cm4gdDt2YXIgZT10Ll9yZWFjdEludGVybmFscztpZihlPT09dm9pZCAwKXRocm93IHR5cGVvZiB0LnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihXKDE4OCkpOih0PU9iamVjdC5rZXlzKHQpLmpvaW4oIiwiKSxFcnJvcihXKDI2OCx0KSkpO3JldHVybiB0PXIxKGUpLHQ9dD09PW51bGw/bnVsbDp0LnN0YXRlTm9kZSx0fTtWbi5mbHVzaFN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIFZvKHQpfTtWbi5oeWRyYXRlPWZ1bmN0aW9uKHQsZSxuKXtpZighdmYoZSkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4geWYobnVsbCx0LGUsITAsbil9O1ZuLmh5ZHJhdGVSb290PWZ1bmN0aW9uKHQsZSxuKXtpZighSG0odCkpdGhyb3cgRXJyb3IoVyg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxpPSExLG89IiIsbD1JdztpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihpPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihvPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihsPW4ub25SZWNvdmVyYWJsZUVycm9yKSksZT1MdyhlLG51bGwsdCwxLG4/P251bGwsaSwhMSxvLGwpLHRbZmldPWUuY3VycmVudCxWYSh0KSxyKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspbj1yW3RdLGk9bi5fZ2V0VmVyc2lvbixpPWkobi5fc291cmNlKSxlLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/ZS5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLGldOmUubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4saSk7cmV0dXJuIG5ldyBtZihlKX07Vm4ucmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXtpZighdmYoZSkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4geWYobnVsbCx0LGUsITEsbil9O1ZuLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24odCl7aWYoIXZmKHQpKXRocm93IEVycm9yKFcoNDApKTtyZXR1cm4gdC5fcmVhY3RSb290Q29udGFpbmVyPyhWbyhmdW5jdGlvbigpe3lmKG51bGwsbnVsbCx0LCExLGZ1bmN0aW9uKCl7dC5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsdFtmaV09bnVsbH0pfSksITApOiExfTtWbi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1qbTtWbi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixyKXtpZighdmYobikpdGhyb3cgRXJyb3IoVygyMDApKTtpZih0PT1udWxsfHx0Ll9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihXKDM4KSk7cmV0dXJuIHlmKHQsZSxuLCExLHIpfTtWbi52ZXJzaW9uPSIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDgiO2Z1bmN0aW9uIER3KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShEdyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX19RHcoKSxMXy5leHBvcnRzPVZuO3ZhciBHcj1MXy5leHBvcnRzO2NvbnN0IGp3PVR1KEdyKSxqVD1rXyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpqd30sW0dyXSk7dmFyIHkwPUdyO1hoLmNyZWF0ZVJvb3Q9eTAuY3JlYXRlUm9vdCxYaC5oeWRyYXRlUm9vdD15MC5oeWRyYXRlUm9vdDt2YXIgenc9e2V4cG9ydHM6e319LHhmPXt9Oy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHpUPXAsRlQ9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEJUPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksVVQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxXVD16VC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcixWVD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIEZ3KHQsZSxuKXt2YXIgcixpPXt9LG89bnVsbCxsPW51bGw7biE9PXZvaWQgMCYmKG89IiIrbiksZS5rZXkhPT12b2lkIDAmJihvPSIiK2Uua2V5KSxlLnJlZiE9PXZvaWQgMCYmKGw9ZS5yZWYpO2ZvcihyIGluIGUpVVQuY2FsbChlLHIpJiYhVlQuaGFzT3duUHJvcGVydHkocikmJihpW3JdPWVbcl0pO2lmKHQmJnQuZGVmYXVsdFByb3BzKWZvcihyIGluIGU9dC5kZWZhdWx0UHJvcHMsZSlpW3JdPT09dm9pZCAwJiYoaVtyXT1lW3JdKTtyZXR1cm57JCR0eXBlb2Y6RlQsdHlwZTp0LGtleTpvLHJlZjpsLHByb3BzOmksX293bmVyOldULmN1cnJlbnR9fXhmLkZyYWdtZW50PUJUO3hmLmpzeD1Gdzt4Zi5qc3hzPUZ3O3p3LmV4cG9ydHM9eGY7dmFyIF89encuZXhwb3J0cztmdW5jdGlvbiBXcCh0LGUpeyhlPT1udWxsfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIEttKHQsZSl7aWYodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiBXcCh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20odCk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gV3AodCxlKX19ZnVuY3Rpb24gWm0odCxlKXt2YXIgbj10eXBlb2YgU3ltYm9sPCJ1IiYmdFtTeW1ib2wuaXRlcmF0b3JdfHx0WyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkodCl8fChuPUttKHQpKXx8ZSYmdCYmdHlwZW9mIHQubGVuZ3RoPT0ibnVtYmVyIil7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYX0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgbz0hMCxsPSExLHM7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbCh0KX0sbjpmdW5jdGlvbigpe3ZhciBhPW4ubmV4dCgpO3JldHVybiBvPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2w9ITAscz1hfSxmOmZ1bmN0aW9uKCl7dHJ5eyFvJiZuLnJldHVybiE9bnVsbCYmbi5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgc319fX1mdW5jdGlvbiBCdyh0KXtyZXR1cm4gdC5sZW5ndGg+MH12YXIgTXU9T2JqZWN0LmZyZWV6ZSh7a2luZDoib2siLHZhbHVlOnZvaWQgMH0pO2Z1bmN0aW9uIEx1KHQpe3JldHVybiB0PT09dm9pZCAwP011OntraW5kOiJvayIsdmFsdWU6dH19ZnVuY3Rpb24gQnIodCl7cmV0dXJue2tpbmQ6ImVyciIsZXJyb3I6dH19ZnVuY3Rpb24gd3ModCl7cmV0dXJuIHQ9PT1NdXx8dC5raW5kPT09Im9rIn1mdW5jdGlvbiBHbSh0KXtyZXR1cm4gdCE9PU11JiZ0LmtpbmQ9PT0iZXJyIn1mdW5jdGlvbiBVdyh0KXt2YXIgZT1bXSxuPVtdLHI9Wm0odCksaTt0cnl7Zm9yKHIucygpOyEoaT1yLm4oKSkuZG9uZTspe3ZhciBvPWkudmFsdWU7d3Mobyk/ZS5wdXNoKG8udmFsdWUpOm4ucHVzaChvLmVycm9yKX19Y2F0Y2gobCl7ci5lKGwpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIEJ3KG4pP0JyKG4pOkx1KGUpfWZ1bmN0aW9uIEhUKHQpe3JldHVybiBVdyh0KX1mdW5jdGlvbiBLVCh0KXt2YXIgZT1bXSxuPVptKHQpLHI7dHJ5e2ZvcihuLnMoKTshKHI9bi5uKCkpLmRvbmU7KXt2YXIgaT1yLnZhbHVlO0dtKGkpJiZlLnB1c2goaS5lcnJvcil9fWNhdGNoKG8pe24uZShvKX1maW5hbGx5e24uZigpfXJldHVybiBCdyhlKT9CcihlKTpNdX1mdW5jdGlvbiBaVCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHI9THUoZSksaT0wO2k8bi5sZW5ndGgmJndzKHIpOysraSlyPXQoci52YWx1ZSxuW2ldLGkpO3JldHVybiByfX1mdW5jdGlvbiBHVCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHdzKGUpP0x1KHQoZS52YWx1ZSkpOmV9fWZ1bmN0aW9uIFlUKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gd3MoZSk/dChlLnZhbHVlKTplfX1mdW5jdGlvbiBYVCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEdtKGUpP0JyKHQoZS5lcnJvcikpOmV9fWZ1bmN0aW9uIFFUKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pP0x1KG4pOkJyKGUobikpfX12YXIgSlQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHdzKHIpP2Uoci52YWx1ZSk/cjpCcihuKHIudmFsdWUpKTpyfX0sTG89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdm9pZE9rOk11LG9rOkx1LGVycjpCcixpc09rOndzLGlzRXJyOkdtLGFsbFQ6VXcsYWxsOkhULGFsbFY6S1QsZmxhdE1hcFJlZHVjZTpaVCxtYXA6R1QsZmxhdE1hcDpZVCxtYXBFcnI6WFQsZnJvbVByZWRpY2F0ZTpRVCxmaWx0ZXJPckVsc2U6SlR9KTtmdW5jdGlvbiBxVCh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBXcCh0KX1mdW5jdGlvbiBlTih0KXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmdFtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHx0WyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20odCl9ZnVuY3Rpb24gdE4oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIG5OKHQpe3JldHVybiBxVCh0KXx8ZU4odCl8fEttKHQpfHx0TigpfWZ1bmN0aW9uIEVlKHQpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIEVlPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxFZSh0KX1mdW5jdGlvbiByTih0LGUpe2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGwpcmV0dXJuIHQ7dmFyIG49dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKG4hPT12b2lkIDApe3ZhciByPW4uY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYodHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKGU9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKSh0KX1mdW5jdGlvbiBXdyh0KXt2YXIgZT1yTih0LCJzdHJpbmciKTtyZXR1cm4gdHlwZW9mIGU9PSJzeW1ib2wiP2U6U3RyaW5nKGUpfWZ1bmN0aW9uIFVlKHQsZSxuKXtyZXR1cm4gZT1XdyhlKSxlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHgwKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gc3ModCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/eDAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe1VlKHQscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOngwKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gdH1mdW5jdGlvbiBpTih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIG9OKHQsZSl7dmFyIG49dD09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl18fHRbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwodCkpLm5leHQsZT09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09ZSk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiBsTigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBKaSh0LGUpe3JldHVybiBpTih0KXx8b04odCxlKXx8S20odCxlKXx8bE4oKX1mdW5jdGlvbiBicih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIF8wKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxXdyhyLmtleSkscil9fWZ1bmN0aW9uICRyKHQsZSxuKXtyZXR1cm4gZSYmXzAodC5wcm90b3R5cGUsZSksbiYmXzAodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIFZwKHQsZSl7cmV0dXJuIFZwPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHIsaSl7cmV0dXJuIHIuX19wcm90b19fPWkscn0sVnAodCxlKX1mdW5jdGlvbiBubCh0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZWcCh0LGUpfWZ1bmN0aW9uIHhkKHQpe3JldHVybiB4ZD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuKXtyZXR1cm4gbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihuKX0seGQodCl9ZnVuY3Rpb24gc04oKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVncodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiB0fWZ1bmN0aW9uIGFOKHQsZSl7aWYoZSYmKHR5cGVvZiBlPT0ib2JqZWN0Inx8dHlwZW9mIGU9PSJmdW5jdGlvbiIpKXJldHVybiBlO2lmKGUhPT12b2lkIDApdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gVncodCl9ZnVuY3Rpb24gcmwodCl7dmFyIGU9c04oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj14ZCh0KSxpO2lmKGUpe3ZhciBvPXhkKHRoaXMpLmNvbnN0cnVjdG9yO2k9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsbyl9ZWxzZSBpPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBhTih0aGlzLGkpfX12YXIgaWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YnIodGhpcyx0KX1yZXR1cm4gJHIodCxbe2tleToiYXBwZW5kVmFsaWRhdGlvbkVycm9yIix2YWx1ZTpmdW5jdGlvbihuLHIsaSxvKXtyZXR1cm4gbj8obltyXT9uW3JdLnB1c2goe21lc3NhZ2U6aSx2YWx1ZTpvfSk6bltyXT1be21lc3NhZ2U6aSx2YWx1ZTpvfV0sbik6VWUoe30scixbe21lc3NhZ2U6aSx2YWx1ZTpvfV0pfX1dKSx0fSgpLEZjPVN5bWJvbCgiR2V0U2NoZW1hIikscG49U3ltYm9sKCJQYXRoIiksT3Q9U3ltYm9sKCJHZXRTb3VyY2UiKTtmdW5jdGlvbiB1Tih0KXtyZXR1cm4gdFtGY119dmFyIFltPSRyKGZ1bmN0aW9uIHQoZSl7YnIodGhpcyx0KSx0aGlzLnNwYW49ZX0pLGNOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvO3JldHVybiBicih0aGlzLG4pLG89ZS5jYWxsKHRoaXMsaSksVWUoVncobyksInR5cGUiLCJTeW0iKSxvLnZhbHVlPXIsb31yZXR1cm4gJHIobixbe2tleToidHJhbnNwaWxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfX1dKSxufShZbSk7bmV3IGNOKCIoKSIpO3ZhciBubj0iX3R5cGUiLFJuPSJfcmVmIixkTj1mdW5jdGlvbih0KXtubChuLHQpO3ZhciBlPXJsKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGJyKHRoaXMsbiksaT1lLmNhbGwodGhpcyksaS5vcHRpb25zPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6bz09bnVsbD9VZSh7fSxpLFt7bWVzc2FnZToiTm9uLW9wdGlvbmFsIGltYWdlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iLHZhbHVlOm99XSk6dHlwZW9mIG9bUm5dIT0ic3RyaW5nIj9VZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIGEgZmlsZSByZWZlcmVuY2Ugc3RyaW5nLiBHb3Q6ICIuY29uY2F0KEVlKG9bUm5dKSksdmFsdWU6b31dKTpvW25uXSE9PSJmaWxlIj9VZSh7fSxpLFt7bWVzc2FnZToiSW1hZ2UgZGlkIG5vdCBoYXZlIHRoZSB2YWxpZCBmaWxlIGV4dGVuc2lvbiB0eXBlLiBHb3Q6ICIuY29uY2F0KG9bbm5dKSx2YWx1ZTpvfV0pOm8ubWV0YWRhdGE/VWUoe30saSxbe21lc3NhZ2U6IkZvdW5kIG1ldGFkYXRhLCBidXQgaXQgY291bGQgbm90IGJlIHZhbGlkYXRlZC4gSW1hZ2UgbWV0YWRhdGEgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgcmVxdWlyZWQgcHJvcHM6IHdpZHRoIChwb3NpdGl2ZSBudW1iZXIpLCBoZWlnaHQgKHBvc2l0aXZlIG51bWJlcikgYW5kIHNoYTI1NiAoc3RyaW5nIG9mIGxlbmd0aCA2NCBvZiB0aGUgYmFzZTE2IGhhc2gpLiIsdmFsdWU6byxmaXhlczpbImltYWdlOnJlcGxhY2UtbWV0YWRhdGEiXX1dKTpVZSh7fSxpLFt7bWVzc2FnZToiQ291bGQgbm90IHZhbGlkYXRlIEltYWdlIG1ldGFkYXRhLiIsdmFsdWU6byxmaXhlczpbImltYWdlOmFkZC1tZXRhZGF0YSJdfV0pfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITA6KGk9PW51bGw/dm9pZCAwOmlbUm5dKT09PSJpbWFnZSImJihpPT1udWxsP3ZvaWQgMDppW25uXSk9PT0iZmlsZSJ9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiaW1hZ2UiLG9wdGlvbnM6dGhpcy5vcHRpb25zLG9wdDp0aGlzLm9wdH19fV0pLG59KGlsKSxIdz1mdW5jdGlvbihlKXt2YXIgbjtpZighZVtSbl0uc3RhcnRzV2l0aCgiL3B1YmxpYyIpKXt2YXIgcjtyZXR1cm57dXJsOmVbUm5dKyI/c2hhMjU2PSIuY29uY2F0KChyPWUubWV0YWRhdGEpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zaGEyNTYpLG1ldGFkYXRhOmUubWV0YWRhdGF9fXJldHVybnt1cmw6ZVtSbl0uc2xpY2UoNykrIj9zaGEyNTY9Ii5jb25jYXQoKG49ZS5tZXRhZGF0YSk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLnNoYTI1NiksbWV0YWRhdGE6ZS5tZXRhZGF0YX19O2Z1bmN0aW9uIEt3KHQpe3JldHVybiBFZSh0KT09PSJvYmplY3QiJiZ0IT09bnVsbCYmdCE9PXZvaWQgMCYmKCJ2YWwiaW4gdHx8InZhbFBhdGgiaW4gdCl9ZnVuY3Rpb24gZk4odCl7cmV0dXJuIEVlKHQpPT09Im9iamVjdCImJnQhPT1udWxsJiZ0IT09dm9pZCAwJiZwbiBpbiB0JiYidmFsImluIHR9ZnVuY3Rpb24gaE4odCl7cmV0dXJuIHRbcG5dfWZ1bmN0aW9uIHBOKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIHcwKHQsZSxuKXtyZXR1cm4gZT9NdCh0KE10KGUsbikpKTpNdChlLG4pfWZ1bmN0aW9uIHFpKHQpe3JldHVybiBFZSh0KT09PSJvYmplY3QiJiZ0IT09bnVsbCYmKE90IGluIHR8fHBuIGluIHQpfWZ1bmN0aW9uIE10KHQsZSxuKXtpZihFZSh0KT09PSJvYmplY3QiKXtpZihxaSh0KSlyZXR1cm4gdDtpZihLdyh0KSlyZXR1cm4gTXQodC52YWwsdC52YWxQYXRoKX1pZih0JiZ0W1JuXSYmdFtubl09PT0iZmlsZSIpe3ZhciByPXRbUm5dO2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBmaWxlIHJlZjogIityKTtyZXR1cm4gTXQoSHcodCksZSxuKX1zd2l0Y2goRWUodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCBzZWxlY3RvciB0eXBlOiAiLmNvbmNhdChFZSh0KSwiOiAiKS5jb25jYXQodCkpO2Nhc2Uib2JqZWN0IjppZih0IT09bnVsbClyZXR1cm4gbmV3IFByb3h5KHQse2hhczpmdW5jdGlvbihvLGwpe3JldHVybiBsPT09T3R8fGw9PT1wbnx8bD09PSJhbmRUaGVuInx8bD09PUZjPyEwOmwgaW4gb30sZ2V0OmZ1bmN0aW9uKG8sbCl7aWYobD09PU90KXJldHVybiB0O2lmKGw9PT1wbilyZXR1cm4gZTtpZihsPT09RmMpcmV0dXJuIG47aWYobD09PSJhbmRUaGVuIilyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIHcwKGEsdCxlKX07aWYoQXJyYXkuaXNBcnJheShvKSl7aWYobD09PSJmaWx0ZXIiKXJldHVybiBmdW5jdGlvbihhKXt2YXIgdT1vLm1hcChmdW5jdGlvbihjLGQpe3JldHVybiBNdChjLG1yKGUsZCksbj09bnVsbD92b2lkIDA6bi5pdGVtKX0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIGlsP2EuYXNzZXJ0KFMwKGMpKTpTMChhKGMpKX0pO3JldHVybiBNdCh1LGUsbil9O2lmKGw9PT0ibWFwIilyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIHU9by5tYXAoZnVuY3Rpb24oYyxkKXt2YXIgZj1hKE10KGMsbXIoZSxkKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pLE10KGQpKTtyZXR1cm4gcWkoZik/ZjpNdChmKX0pO3JldHVybiBNdCh1LGUsbil9fWlmKEFycmF5LmlzQXJyYXkobykmJmw9PT0ibGVuZ3RoIilyZXR1cm4gTXQoby5sZW5ndGgpO3ZhciBzPVJlZmxlY3QuZ2V0KG8sbCk7cmV0dXJuIHBOKHQsbCk/TnVtYmVyLmlzTmFOKE51bWJlcihsKSk/TXQocyxtcihlLGwpLG49PW51bGw/dm9pZCAwOm4uaXRlbXNbbF0pOk10KHMsbXIoZSxOdW1iZXIobCkpLG49PW51bGw/dm9pZCAwOm4uaXRlbSk6c319KTtkZWZhdWx0OnJldHVybiBVZShVZShVZSh7ZXE6ZnVuY3Rpb24obyl7dmFyIGw9bztpZihxaShvKSYmKGw9b1tPdF0sbCBpbnN0YW5jZW9mIFltKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBNdCh0PT09bCx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKG8pe3JldHVybiB3MChvLHQ9PT12b2lkIDA/bnVsbDp0LGUpfX0sT3QsdD09PXZvaWQgMD9udWxsOnQpLHBuLGUpLEZjLG4pfX1mdW5jdGlvbiBtcih0LGUpe2lmKEVlKGUpPT09InN5bWJvbCIpdGhyb3cgRXJyb3IoIkNhbm5vdCBjcmVhdGUgdmFsIHBhdGggb2YgYXJyYXkgaXRlbSB3aXRoIHN5bWJvbCBwcm9wOiAiLmNvbmNhdChlLnRvU3RyaW5nKCkpKTtyZXR1cm4gdCYmIiIuY29uY2F0KHQsIi4iKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZSkpfWZ1bmN0aW9uIFMwKHQpe2lmKEVlKHQpPT09Im9iamVjdCImJihPdCBpbiB0fHxwbiBpbiB0KSl7dmFyIGU9dFtPdF07cmV0dXJuIGV9cmV0dXJuIHR9dmFyIGdOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLml0ZW1zPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOkVlKG8pIT09Im9iamVjdCI/VWUoe30saSxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KEVlKG8pLCInIil9XSk6QXJyYXkuaXNBcnJheShvKT9VZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXModGhpcy5pdGVtcykuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1KaShhLDIpLGM9dVswXSxkPXVbMV0sZj1tcihpLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxpLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFpJiZ0eXBlb2YgaT09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjppLCIgYXQga2V5ICIpLmNvbmNhdChjKSxvKTtlbHNle3ZhciBoPWQudmFsaWRhdGUoZixvW2NdKTtoJiZzP3M9c3Moc3Moe30saCkscyk6aCYmKHM9aCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO2Zvcih2YXIgbz0wLGw9T2JqZWN0LmVudHJpZXModGhpcy5pdGVtcyk7bzxsLmxlbmd0aDtvKyspe3ZhciBzPUppKGxbb10sMiksYT1zWzBdLHU9c1sxXTtpZighdS5hc3NlcnQoaVthXSkpcmV0dXJuITF9cmV0dXJuIEVlKGkpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJvYmplY3QiLGl0ZW1zOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5tYXAoZnVuY3Rpb24oaSl7dmFyIG89SmkoaSwyKSxsPW9bMF0scz1vWzFdO3JldHVybltsLHMuc2VyaWFsaXplKCldfSkpLG9wdDp0aGlzLm9wdH19fV0pLG59KGlsKSxtTj1mdW5jdGlvbih0KXtubChuLHQpO3ZhciBlPXJsKG4pO2Z1bmN0aW9uIG4ocil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIGJyKHRoaXMsbiksaT1lLmNhbGwodGhpcyksaS5pdGVtPXIsaS5vcHQ9byxpfXJldHVybiAkcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oaSxvKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyExOkVlKG8pIT09Im9iamVjdCJ8fCFBcnJheS5pc0FycmF5KG8pP1VlKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnYXJyYXknLCBnb3QgJyIuY29uY2F0KEVlKG8pLCInIil9XSk6KG8uZm9yRWFjaChmdW5jdGlvbihhLHUpe3ZhciBjPW1yKGksdSk7aWYoIWMpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBpbmRleCAiKS5jb25jYXQodSksbyk7ZWxzZXt2YXIgZD1sLml0ZW0udmFsaWRhdGUoYyxhKTtkJiZzP3M9c3Moc3Moe30sZCkscyk6ZCYmKHM9ZCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe2lmKHRoaXMub3B0JiZpPT1udWxsKXJldHVybiEwO2lmKCFpKXJldHVybiExO3ZhciBvPVptKGkpLGw7dHJ5e2ZvcihvLnMoKTshKGw9by5uKCkpLmRvbmU7KXt2YXIgcz1sLnZhbHVlO2lmKCF0aGlzLml0ZW0uYXNzZXJ0KHMpKXJldHVybiExfX1jYXRjaChhKXtvLmUoYSl9ZmluYWxseXtvLmYoKX1yZXR1cm4gRWUoaSk9PT0ib2JqZWN0IiYmQXJyYXkuaXNBcnJheShpKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLml0ZW0sITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJhcnJheSIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHZOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyLGkpe3ZhciBvLGw9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExO3JldHVybiBicih0aGlzLG4pLG89ZS5jYWxsKHRoaXMpLG8ua2V5PXIsby5pdGVtcz1pLG8ub3B0PWwsb31yZXR1cm4gJHIobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKGksbyl7cmV0dXJuITF9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKGkpe3JldHVybiEwfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMua2V5LHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgdGhpcy5rZXk9PSJzdHJpbmciP3t0eXBlOiJ1bmlvbiIsa2V5OnRoaXMua2V5LGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fTp7dHlwZToidW5pb24iLGl0ZW1zOnRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBpLnNlcmlhbGl6ZSgpfSksb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHlOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLm9wdGlvbnM9cixpLm9wdD1vLGl9cmV0dXJuICRyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3JldHVybiExfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4hMH19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLm9wdGlvbnMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJyaWNodGV4dCIsb3B0OnRoaXMub3B0fX19XSksbn0oaWwpLHhOPWZ1bmN0aW9uKHQpe25sKG4sdCk7dmFyIGU9cmwobik7ZnVuY3Rpb24gbihyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYnIodGhpcyxuKSxpPWUuY2FsbCh0aGlzKSxpLml0ZW09cixpLm9wdD1vLGl9cmV0dXJuICRyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihpLG8pe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJm89PW51bGw/ITE6RWUobykhPT0ib2JqZWN0Ij9VZSh7fSxpLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQoRWUobyksIiciKX1dKTpBcnJheS5pc0FycmF5KG8pP1VlKHt9LGksW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PUppKGEsMiksYz11WzBdLGQ9dVsxXSxmPW1yKGksYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLGksIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIWkmJnR5cGVvZiBpPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOmksIiBhdCBrZXkgIikuY29uY2F0KGQpLG8pO2Vsc2V7dmFyIGg9bC5pdGVtLnZhbGlkYXRlKGYsZCk7aCYmcz9zPXNzKHNzKHt9LGgpLHMpOmgmJihzPWgpfX0pLHMpfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihpKXtpZih0aGlzLm9wdCYmaT09bnVsbClyZXR1cm4hMDtpZighaSlyZXR1cm4hMTtmb3IodmFyIG89MCxsPU9iamVjdC5lbnRyaWVzKGkpO288bC5sZW5ndGg7bysrKXt2YXIgcz1KaShsW29dLDIpLGE9c1sxXTtpZighdGhpcy5pdGVtLmFzc2VydChhKSlyZXR1cm4hMX1yZXR1cm4gRWUoaSk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmVjb3JkIixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShpbCk7ZnVuY3Rpb24gX04odCl7dmFyIGU9dFtPdF07aWYoZSBpbnN0YW5jZW9mIFltKXRocm93IEVycm9yKCJDYW5ub3QgZ2V0IHJhdyBzb3VyY2Ugb2YgYW4gRXhwciIpO3ZhciBuPWU7cmV0dXJuIG59ZnVuY3Rpb24gd04odCl7cmV0dXJuIHQuaW5kZXhPZigiLiIpPT09LTE/W3QsIiJdOlt0LnNsaWNlKDAsdC5pbmRleE9mKCIuIikpLHQuc2xpY2UodC5pbmRleE9mKCIuIikrMSldfWZ1bmN0aW9uIFNOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZ058fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJvYmplY3QifWZ1bmN0aW9uIEVOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgeE58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJyZWNvcmQifWZ1bmN0aW9uIENOKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbU58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJhcnJheSJ9ZnVuY3Rpb24ga04odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2Tnx8RWUodCk9PT0ib2JqZWN0IiYmInR5cGUiaW4gdCYmdC50eXBlPT09InVuaW9uIn1mdW5jdGlvbiBiTih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHlOfHxFZSh0KT09PSJvYmplY3QiJiYidHlwZSJpbiB0JiZ0LnR5cGU9PT0icmljaHRleHQifWZ1bmN0aW9uICROKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZE58fEVlKHQpPT09Im9iamVjdCImJiJ0eXBlImluIHQmJnQudHlwZT09PSJpbWFnZSJ9ZnVuY3Rpb24gVE4odCxlLG4pe2Zvcih2YXIgcj1OTih0KSxpPW5OKHIpLG89bixsPWUscz1mdW5jdGlvbigpe3ZhciBjPXIuc2hpZnQoKTtpZihjPT09dm9pZCAwKXRocm93IEVycm9yKCJVbmV4cGVjdGVkIHVuZGVmaW5lZCBwYXJ0Iik7aWYoQ04obykpe2lmKE51bWJlci5pc05hTihOdW1iZXIoYykpKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IGFycmF5IHNjaGVtYSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShvKSwiIG11c3QgaGF2ZSBhIG51bWJlciBhcyBwYXRoLCBidXQgZ290ICIpLmNvbmNhdChjLCIuIFBhdGg6ICIpLmNvbmNhdCh0KSk7aWYoRWUobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBhcnJheSwgYnV0IGdvdCAiLmNvbmNhdChFZShsKSkpO2lmKCFsW2NdKXt2YXIgZDt0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzb3VyY2UgKGxlbmd0aDogIi5jb25jYXQoKGQ9bCk9PT1udWxsfHxkPT09dm9pZCAwP3ZvaWQgMDpkLmxlbmd0aCwiKSBkaWQgbm90IGhhdmUgaW5kZXggIikuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdCh0KSl9bD1sW2NdLG89by5pdGVtfWVsc2UgaWYoRU4obykpe2lmKHR5cGVvZiBjIT0ic3RyaW5nIil0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc2NoZW1hICIuY29uY2F0KG8sIiBtdXN0IGhhdmUgcGF0aDogIikuY29uY2F0KGMsIiBhcyBzdHJpbmciKSk7aWYoRWUobCkhPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiByZWNvcmQsIGJ1dCBnb3QgIi5jb25jYXQoRWUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiByZWNvcmQgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KHQpKTtsPWxbY10sbz1vLml0ZW19ZWxzZSBpZihTTihvKSl7aWYoRWUobCkhPT0ib2JqZWN0Iil0aHJvdyBFcnJvcigiU2NoZW1hIHR5cGUgZXJyb3I6IGV4cGVjdGVkIHNvdXJjZSB0byBiZSB0eXBlIG9mIG9iamVjdCwgYnV0IGdvdCAiLmNvbmNhdChFZShsKSkpO2lmKCFsW2NdKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IG9iamVjdCBzb3VyY2UgZGlkIG5vdCBoYXZlIGtleSAiLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQodCkpO2w9bFtjXSxvPW8uaXRlbXNbY119ZWxzZXtpZigkTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O2lmKGtOKG8pKXt2YXIgZj1vLmtleTtpZighZilyZXR1cm57djp7cGF0aDppLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcihnKSk/SlNPTi5zdHJpbmdpZnkoZyk6Z30pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3ZhciBoPWxbZl07aWYoIWgpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogdW5pb24gc291cmNlICIuY29uY2F0KG8sIiBkaWQgbm90IGhhdmUgcmVxdWlyZWQga2V5ICIpLmNvbmNhdChmLCIgaW4gcGF0aDogIikuY29uY2F0KHQpKTt2YXIgbT1vLml0ZW1zLmZpbmQoZnVuY3Rpb24oZyl7dmFyIHc7cmV0dXJuKGc9PW51bGx8fCh3PWcuaXRlbXMpPT09bnVsbHx8dz09PXZvaWQgMHx8KHc9d1tmXSk9PT1udWxsfHx3PT09dm9pZCAwP3ZvaWQgMDp3LnZhbHVlKT09PWh9KTtpZighbSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQobywiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQodCkpO289bS5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihiTihvKSlyZXR1cm57djp7cGF0aDppLnNsaWNlKDAsaS5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiBKU09OLnN0cmluZ2lmeShnKX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkobykpKX19fSxhO3IubGVuZ3RoPjA7KWlmKGE9cygpLGEpcmV0dXJuIGEudjtpZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDppLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6byxzb3VyY2U6bH19ZnVuY3Rpb24gTk4odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOyl7dmFyIHI9IiI7aWYodFtuXT09PSciJyl7Zm9yKG4rKztuPHQubGVuZ3RoJiZ0W25dIT09JyInOyl0W25dPT09IlxcIiYmdFtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz10W25dLG4rKztpZih0W25dIT09JyInKXt2YXIgaTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKGk9dFtuXSkhPT1udWxsJiZpIT09dm9pZCAwP2k6ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KHQubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjx0Lmxlbmd0aCYmdFtuXSE9PSIuIjspcis9dFtuXSxuKys7ciE9PSIiJiZlLnB1c2gociksbisrfXJldHVybiBlfWZ1bmN0aW9uIFJOKHQpe3JldHVybiBadyhBTih0KSl9ZnVuY3Rpb24gT04odCl7cmV0dXJuIHFpKHQpP0VlKHRbT3RdKT09PSJvYmplY3QiJiZ0W090XSE9PW51bGwmJkFycmF5LmlzQXJyYXkodFtPdF0pOkFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gUE4odCl7cmV0dXJuIHFpKHQpP0VlKHRbT3RdKT09PSJvYmplY3QiJiZ0W090XSE9PW51bGwmJiFBcnJheS5pc0FycmF5KHRbT3RdKTpFZSh0KT09PSJvYmplY3QifWZ1bmN0aW9uIEFOKHQpe3ZhciBlPU10KHQpO2Z1bmN0aW9uIG4ocil7dmFyIGk9T04ociksbz1QTihyKTtpZihpKXt2YXIgbD1PdCBpbiByP3JbT3RdOnIscz1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmwubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG4ocWkoYyk/YzpNdChjLG1yKHMsZCkpKX0pLHZhbFBhdGg6c319ZWxzZSBpZihvKXt2YXIgYT1PdCBpbiByP3JbT3RdOnIsdT1wbiBpbiByP3JbcG5dOnZvaWQgMDtyZXR1cm57dmFsOmEhPT1udWxsJiZPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYSkubWFwKGZ1bmN0aW9uKGMpe3ZhciBkPUppKGMsMiksZj1kWzBdLGg9ZFsxXTtyZXR1cm5bZixuKHFpKGgpP2g6TXQoaCxtcih1LGYpKSldfSkpLHZhbFBhdGg6dX19ZWxzZSByZXR1cm4gcWkocik/e3ZhbDpuKHJbT3RdKSx2YWxQYXRoOnJbcG5dfTpyfXJldHVybiBuKGUpfWZ1bmN0aW9uIEhwKHQpe3ZhciBlPUt3KHQpP3QudmFsOnQ7c3dpdGNoKEVlKGUpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KEVlKGUpKSk7Y2FzZSJvYmplY3QiOnJldHVybiBlPT09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoSHApOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhlKS5tYXAoZnVuY3Rpb24obil7dmFyIHI9SmkobiwyKSxpPXJbMF0sbz1yWzFdO3JldHVybltpLG8mJkhwKG8pXX0pKTtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBadyh0KXt2YXIgZT10LnZhbDtzd2l0Y2goRWUoZSkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQoRWUoZSkpKTtjYXNlIm9iamVjdCI6aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm94eShlLHtoYXM6ZnVuY3Rpb24ocixpKXtyZXR1cm4gaT09PSJ2YWwifHxpPT09cG4/ITA6RTAocixpKX0sZ2V0OmZ1bmN0aW9uKHIsaSl7aWYoaT09PXBuKXJldHVybiB0LnZhbFBhdGg7aWYoaT09PSJ2YWwiKXJldHVybiBIcCh0KTtpZihBcnJheS5pc0FycmF5KHIpJiZpPT09Imxlbmd0aCIpcmV0dXJuIHIubGVuZ3RoO2lmKEUwKGUsaSkpe3ZhciBvLGw7cmV0dXJuIFp3KHt2YWw6UmVmbGVjdC5nZXQocixpKS52YWwsdmFsUGF0aDoobz0obD1SZWZsZWN0LmdldChyLGkpKT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwudmFsUGF0aCkhPT1udWxsJiZvIT09dm9pZCAwP286bXIodC52YWxQYXRoLEFycmF5LmlzQXJyYXkocik/TnVtYmVyKGkpOmkpfSl9cmV0dXJuIFJlZmxlY3QuZ2V0KHIsaSl9fSk7ZGVmYXVsdDpyZXR1cm4gVWUoVWUoe30scG4sdC52YWxQYXRoKSwidmFsIix0LnZhbCl9fWZ1bmN0aW9uIEUwKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXZhciBNTj1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLC0xMjQ1NjQzODI1LC0zNzM5NTc3MjMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsLTE4NDEzMzE1NDgsLTE0MjQyMDQwNzUsLTY3MDU4NjIxNiwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwtMjEzMjg4OTA5MCwtMTY4MDA3OTE5MywtMTA0Njc0NDcxNiwtNDU5NTc2ODk1LC0yNzI3NDI1MjIsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsLTE3NDA3NDY0MTQsLTE0NzMxMzI5NDcsLTEzNDE5NzA0ODgsLTEwODQ2NTM2MjUsLTk1ODM5NTQwNSwtNzEwNDM4NTg1LDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLC0yMTE3OTQwOTQ2LC0xODM4MDExMjU5LC0xNTY0NDgxMzc1LC0xNDc0NjY0ODg1LC0xMDM1MjM2NDk2LC05NDkyMDI1MjUsLTc3ODkwMTQ3OSwtNjk0NjE0NDkyLC0yMDAzOTUzODcsMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LC0yMDY3MjM2ODQ0LC0xOTMzMTE0ODcyLC0xODY2NTMwODIyLC0xNTM4MjMzMTA5LC0xMDkwOTM1ODE3LC05NjU2NDE5OThdLFZlPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuaW5wdXRCeXRlcz02NF09ImlucHV0Qnl0ZXMiLHRbdC5pbnB1dFdvcmRzPTE2XT0iaW5wdXRXb3JkcyIsdFt0LmhpZ2hJbmRleD0xNF09ImhpZ2hJbmRleCIsdFt0Lmxvd0luZGV4PTE1XT0ibG93SW5kZXgiLHRbdC53b3JrV29yZHM9NjRdPSJ3b3JrV29yZHMiLHRbdC5hbGxvY0J5dGVzPTgwXT0iYWxsb2NCeXRlcyIsdFt0LmFsbG9jV29yZHM9MjBdPSJhbGxvY1dvcmRzIix0W3QuYWxsb2NUb3RhbD04ZTNdPSJhbGxvY1RvdGFsIix0fShWZXx8e30pLEMwPXtzaGEyNTY6MX07ZnVuY3Rpb24gTE4odCl7aWYodCYmIUMwW3RdJiYhQzBbdC50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBtZXRob2Qgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgSU59dmFyIElOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2JyKHRoaXMsdCksVWUodGhpcywiQSIsMTc3OTAzMzcwMyksVWUodGhpcywiQiIsLTExNTA4MzMwMTkpLFVlKHRoaXMsIkMiLDEwMTM5MDQyNDIpLFVlKHRoaXMsIkQiLC0xNTIxNDg2NTM0KSxVZSh0aGlzLCJFIiwxMzU5ODkzMTE5KSxVZSh0aGlzLCJGIiwtMTY5NDE0NDM3MiksVWUodGhpcywiRyIsNTI4NzM0NjM1KSxVZSh0aGlzLCJIIiwxNTQxNDU5MjI1KSxVZSh0aGlzLCJfc2l6ZSIsMCksVWUodGhpcywiX3NwIiwwKSwoIWZjfHxHcz49VmUuYWxsb2NUb3RhbCkmJihmYz1uZXcgQXJyYXlCdWZmZXIoVmUuYWxsb2NUb3RhbCksR3M9MCksdGhpcy5fYnl0ZT1uZXcgVWludDhBcnJheShmYyxHcyxWZS5hbGxvY0J5dGVzKSx0aGlzLl93b3JkPW5ldyBJbnQzMkFycmF5KGZjLEdzLFZlLmFsbG9jV29yZHMpLEdzKz1WZS5hbGxvY0J5dGVzfXJldHVybiAkcih0LFt7a2V5OiJ1cGRhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5fdXRmOChuKTtpZihuPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdHlwZTogIitFZShuKSk7dmFyIHI9bi5ieXRlT2Zmc2V0LGk9bi5ieXRlTGVuZ3RoLG89aS9WZS5pbnB1dEJ5dGVzfDAsbD0wO2lmKG8mJiEociYzKSYmISh0aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMpKXtmb3IodmFyIHM9bmV3IEludDMyQXJyYXkobi5idWZmZXIscixvKlZlLmlucHV0V29yZHMpO28tLTspdGhpcy5faW50MzIocyxsPj4yKSxsKz1WZS5pbnB1dEJ5dGVzO3RoaXMuX3NpemUrPWx9dmFyIGE9bi5CWVRFU19QRVJfRUxFTUVOVDtpZihhIT09MSYmbi5idWZmZXIpe3ZhciB1PW5ldyBVaW50OEFycmF5KG4uYnVmZmVyLHIrbCxpLWwpO3JldHVybiB0aGlzLl91aW50OCh1KX1yZXR1cm4gbD09PWk/dGhpczp0aGlzLl91aW50OChuLGwpfX0se2tleToiX3VpbnQ4Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBpPXRoaXMuX2J5dGUsbz10aGlzLl93b3JkLGw9bi5sZW5ndGg7Zm9yKHI9cnwwO3I8bDspe2Zvcih2YXIgcz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXMsYT1zO3I8bCYmYTxWZS5pbnB1dEJ5dGVzOylpW2ErK109bltyKytdO2E+PVZlLmlucHV0Qnl0ZXMmJnRoaXMuX2ludDMyKG8pLHRoaXMuX3NpemUrPWEtc31yZXR1cm4gdGhpc319LHtrZXk6Il91dGY4Iix2YWx1ZTpmdW5jdGlvbihuKXtmb3IodmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz1uLmxlbmd0aCxsPXRoaXMuX3NwLHM9MDtzPG87KXtmb3IodmFyIGE9dGhpcy5fc2l6ZSVWZS5pbnB1dEJ5dGVzLHU9YTtzPG8mJnU8VmUuaW5wdXRCeXRlczspe3ZhciBjPW4uY2hhckNvZGVBdChzKyspfDA7YzwxMjg/clt1KytdPWM6YzwyMDQ4PyhyW3UrK109MTkyfGM+Pj42LHJbdSsrXT0xMjh8YyY2Myk6Yzw1NTI5Nnx8Yz41NzM0Mz8oclt1KytdPTIyNHxjPj4+MTIsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMpOmw/KGM9KChsJjEwMjMpPDwxMCkrKGMmMTAyMykrNjU1MzYsclt1KytdPTI0MHxjPj4+MTgsclt1KytdPTEyOHxjPj4+MTImNjMsclt1KytdPTEyOHxjPj4+NiY2MyxyW3UrK109MTI4fGMmNjMsbD0wKTpsPWN9dT49VmUuaW5wdXRCeXRlcyYmKHRoaXMuX2ludDMyKGkpLGlbMF09aVtWZS5pbnB1dFdvcmRzXSksdGhpcy5fc2l6ZSs9dS1hfXJldHVybiB0aGlzLl9zcD1sLHRoaXN9fSx7a2V5OiJfaW50MzIiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGk9dGhpcy5BLG89dGhpcy5CLGw9dGhpcy5DLHM9dGhpcy5ELGE9dGhpcy5FLHU9dGhpcy5GLGM9dGhpcy5HLGQ9dGhpcy5ILGY9MDtmb3Iocj1yfDA7ZjxWZS5pbnB1dFdvcmRzOylTb1tmKytdPXVyKG5bcisrXSk7Zm9yKGY9VmUuaW5wdXRXb3JkcztmPFZlLndvcmtXb3JkcztmKyspU29bZl09Vk4oU29bZi0yXSkrU29bZi03XStXTihTb1tmLTE1XSkrU29bZi0xNl18MDtmb3IoZj0wO2Y8VmUud29ya1dvcmRzO2YrKyl7dmFyIGg9ZCtVTihhKSt6TihhLHUsYykrTU5bZl0rU29bZl18MCxtPUJOKGkpK0ZOKGksbyxsKXwwO2Q9YyxjPXUsdT1hLGE9cytofDAscz1sLGw9byxvPWksaT1oK218MH10aGlzLkE9aSt0aGlzLkF8MCx0aGlzLkI9byt0aGlzLkJ8MCx0aGlzLkM9bCt0aGlzLkN8MCx0aGlzLkQ9cyt0aGlzLkR8MCx0aGlzLkU9YSt0aGlzLkV8MCx0aGlzLkY9dSt0aGlzLkZ8MCx0aGlzLkc9Yyt0aGlzLkd8MCx0aGlzLkg9ZCt0aGlzLkh8MH19LHtrZXk6ImRpZ2VzdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5fYnl0ZSxpPXRoaXMuX3dvcmQsbz10aGlzLl9zaXplJVZlLmlucHV0Qnl0ZXN8MDtmb3IocltvKytdPTEyODtvJjM7KXJbbysrXT0wO2lmKG8+Pj0yLG8+VmUuaGlnaEluZGV4KXtmb3IoO288VmUuaW5wdXRXb3JkczspaVtvKytdPTA7bz0wLHRoaXMuX2ludDMyKGkpfWZvcig7bzxWZS5pbnB1dFdvcmRzOylpW28rK109MDt2YXIgbD10aGlzLl9zaXplKjgscz0obCY0Mjk0OTY3Mjk1KT4+PjAsYT0obC1zKS80Mjk0OTY3Mjk2O3JldHVybiBhJiYoaVtWZS5oaWdoSW5kZXhdPXVyKGEpKSxzJiYoaVtWZS5sb3dJbmRleF09dXIocykpLHRoaXMuX2ludDMyKGkpLG49PT0iaGV4Ij90aGlzLl9oZXgoKTp0aGlzLl9iaW4oKX19LHtrZXk6Il9oZXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5IO3JldHVybiAkaShuKSskaShyKSskaShpKSskaShvKSskaShsKSskaShzKSskaShhKSskaSh1KX19LHtrZXk6Il9iaW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5BLHI9dGhpcy5CLGk9dGhpcy5DLG89dGhpcy5ELGw9dGhpcy5FLHM9dGhpcy5GLGE9dGhpcy5HLHU9dGhpcy5ILGM9dGhpcy5fYnl0ZSxkPXRoaXMuX3dvcmQ7cmV0dXJuIGRbMF09dXIobiksZFsxXT11cihyKSxkWzJdPXVyKGkpLGRbM109dXIobyksZFs0XT11cihsKSxkWzVdPXVyKHMpLGRbNl09dXIoYSksZFs3XT11cih1KSxjLnNsaWNlKDAsMzIpfX1dKSx0fSgpLFNvPW5ldyBJbnQzMkFycmF5KFZlLndvcmtXb3JkcyksZmMsR3M9MCwkaT1mdW5jdGlvbihlKXtyZXR1cm4oZSs0Mjk0OTY3Mjk2KS50b1N0cmluZygxNikuc3Vic3RyKC04KX0sRE49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8PDI0JjQyNzgxOTAwODB8ZTw8OCYxNjcxMTY4MHxlPj44JjY1MjgwfGU+PjI0JjI1NX0sak49ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHVyPUhOKCk/ak46RE4sek49ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByXmUmKG5ecil9LEZOPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gZSZufHImKGV8bil9LEJOPWZ1bmN0aW9uKGUpe3JldHVybihlPj4+MnxlPDwzMCleKGU+Pj4xM3xlPDwxOSleKGU+Pj4yMnxlPDwxMCl9LFVOPWZ1bmN0aW9uKGUpe3JldHVybihlPj4+NnxlPDwyNileKGU+Pj4xMXxlPDwyMSleKGU+Pj4yNXxlPDw3KX0sV049ZnVuY3Rpb24oZSl7cmV0dXJuKGU+Pj43fGU8PDI1KV4oZT4+PjE4fGU8PDE0KV5lPj4+M30sVk49ZnVuY3Rpb24oZSl7cmV0dXJuKGU+Pj4xN3xlPDwxNSleKGU+Pj4xOXxlPDwxMyleZT4+PjEwfTtmdW5jdGlvbiBITigpe3ZhciB0PW5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbNjUyNzldKS5idWZmZXIpO3JldHVybiB0WzBdPT09MjU0fXZhciBLTj1mdW5jdGlvbihlKXtyZXR1cm4gTE4oKS51cGRhdGUoZSkuZGlnZXN0KCJoZXgiKX07ZnVuY3Rpb24gcWEoKXtxYT1mdW5jdGlvbigpe3JldHVybiBlfTt2YXIgdCxlPXt9LG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksaT1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKEMsayxFKXtDW2tdPUUudmFsdWV9LG89dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIj9TeW1ib2w6e30sbD1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIscz1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGE9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoQyxrLEUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoQyxrLHt2YWx1ZTpFLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksQ1trXX10cnl7dSh7fSwiIil9Y2F0Y2h7dT1mdW5jdGlvbihrLEUsQSl7cmV0dXJuIGtbRV09QX19ZnVuY3Rpb24gYyhDLGssRSxBKXt2YXIgTj1rJiZrLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/azp2LEY9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSksSz1uZXcgSChBfHxbXSk7cmV0dXJuIGkoRiwiX2ludm9rZSIse3ZhbHVlOlAoQyxFLEspfSksRn1mdW5jdGlvbiBkKEMsayxFKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOkMuY2FsbChrLEUpfX1jYXRjaChBKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpBfX19ZS53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsbT0iZXhlY3V0aW5nIixnPSJjb21wbGV0ZWQiLHc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoKXt9dmFyIFM9e307dShTLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZixUPWImJmIoYihaKFtdKSkpO1QmJlQhPT1uJiZyLmNhbGwoVCxsKSYmKFM9VCk7dmFyICQ9eC5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTKTtmdW5jdGlvbiBPKEMpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihrKXt1KEMsayxmdW5jdGlvbihFKXtyZXR1cm4gdGhpcy5faW52b2tlKGssRSl9KX0pfWZ1bmN0aW9uIEwoQyxrKXtmdW5jdGlvbiBFKE4sRixLLGRlKXt2YXIgc2U9ZChDW05dLEMsRik7aWYoc2UudHlwZSE9PSJ0aHJvdyIpe3ZhciBBZT1zZS5hcmcsTmU9QWUudmFsdWU7cmV0dXJuIE5lJiZ0eXBlb2YgTmU9PSJvYmplY3QiJiZyLmNhbGwoTmUsIl9fYXdhaXQiKT9rLnJlc29sdmUoTmUuX19hd2FpdCkudGhlbihmdW5jdGlvbihRKXtFKCJuZXh0IixRLEssZGUpfSxmdW5jdGlvbihRKXtFKCJ0aHJvdyIsUSxLLGRlKX0pOmsucmVzb2x2ZShOZSkudGhlbihmdW5jdGlvbihRKXtBZS52YWx1ZT1RLEsoQWUpfSxmdW5jdGlvbihRKXtyZXR1cm4gRSgidGhyb3ciLFEsSyxkZSl9KX1kZShzZS5hcmcpfXZhciBBO2kodGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKE4sRil7ZnVuY3Rpb24gSygpe3JldHVybiBuZXcgayhmdW5jdGlvbihkZSxzZSl7RShOLEYsZGUsc2UpfSl9cmV0dXJuIEE9QT9BLnRoZW4oSyxLKTpLKCl9fSl9ZnVuY3Rpb24gUChDLGssRSl7dmFyIEE9ZjtyZXR1cm4gZnVuY3Rpb24oTixGKXtpZihBPT09bSl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihBPT09Zyl7aWYoTj09PSJ0aHJvdyIpdGhyb3cgRjtyZXR1cm57dmFsdWU6dCxkb25lOiEwfX1mb3IoRS5tZXRob2Q9TixFLmFyZz1GOzspe3ZhciBLPUUuZGVsZWdhdGU7aWYoSyl7dmFyIGRlPUQoSyxFKTtpZihkZSl7aWYoZGU9PT13KWNvbnRpbnVlO3JldHVybiBkZX19aWYoRS5tZXRob2Q9PT0ibmV4dCIpRS5zZW50PUUuX3NlbnQ9RS5hcmc7ZWxzZSBpZihFLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEE9PT1mKXRocm93IEE9ZyxFLmFyZztFLmRpc3BhdGNoRXhjZXB0aW9uKEUuYXJnKX1lbHNlIEUubWV0aG9kPT09InJldHVybiImJkUuYWJydXB0KCJyZXR1cm4iLEUuYXJnKTtBPW07dmFyIHNlPWQoQyxrLEUpO2lmKHNlLnR5cGU9PT0ibm9ybWFsIil7aWYoQT1FLmRvbmU/ZzpoLHNlLmFyZz09PXcpY29udGludWU7cmV0dXJue3ZhbHVlOnNlLmFyZyxkb25lOkUuZG9uZX19c2UudHlwZT09PSJ0aHJvdyImJihBPWcsRS5tZXRob2Q9InRocm93IixFLmFyZz1zZS5hcmcpfX19ZnVuY3Rpb24gRChDLGspe3ZhciBFPWsubWV0aG9kLEE9Qy5pdGVyYXRvcltFXTtpZihBPT09dClyZXR1cm4gay5kZWxlZ2F0ZT1udWxsLEU9PT0idGhyb3ciJiZDLml0ZXJhdG9yLnJldHVybiYmKGsubWV0aG9kPSJyZXR1cm4iLGsuYXJnPXQsRChDLGspLGsubWV0aG9kPT09InRocm93Iil8fEUhPT0icmV0dXJuIiYmKGsubWV0aG9kPSJ0aHJvdyIsay5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitFKyInIG1ldGhvZCIpKSx3O3ZhciBOPWQoQSxDLml0ZXJhdG9yLGsuYXJnKTtpZihOLnR5cGU9PT0idGhyb3ciKXJldHVybiBrLm1ldGhvZD0idGhyb3ciLGsuYXJnPU4uYXJnLGsuZGVsZWdhdGU9bnVsbCx3O3ZhciBGPU4uYXJnO3JldHVybiBGP0YuZG9uZT8oa1tDLnJlc3VsdE5hbWVdPUYudmFsdWUsay5uZXh0PUMubmV4dExvYyxrLm1ldGhvZCE9PSJyZXR1cm4iJiYoay5tZXRob2Q9Im5leHQiLGsuYXJnPXQpLGsuZGVsZWdhdGU9bnVsbCx3KTpGOihrLm1ldGhvZD0idGhyb3ciLGsuYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksay5kZWxlZ2F0ZT1udWxsLHcpfWZ1bmN0aW9uIEIoQyl7dmFyIGs9e3RyeUxvYzpDWzBdfTsxIGluIEMmJihrLmNhdGNoTG9jPUNbMV0pLDIgaW4gQyYmKGsuZmluYWxseUxvYz1DWzJdLGsuYWZ0ZXJMb2M9Q1szXSksdGhpcy50cnlFbnRyaWVzLnB1c2goayl9ZnVuY3Rpb24gb2UoQyl7dmFyIGs9Qy5jb21wbGV0aW9ufHx7fTtrLnR5cGU9Im5vcm1hbCIsZGVsZXRlIGsuYXJnLEMuY29tcGxldGlvbj1rfWZ1bmN0aW9uIEgoQyl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLEMuZm9yRWFjaChCLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFooQyl7aWYoQ3x8Qz09PSIiKXt2YXIgaz1DW2xdO2lmKGspcmV0dXJuIGsuY2FsbChDKTtpZih0eXBlb2YgQy5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBDO2lmKCFpc05hTihDLmxlbmd0aCkpe3ZhciBFPS0xLEE9ZnVuY3Rpb24gTigpe2Zvcig7KytFPEMubGVuZ3RoOylpZihyLmNhbGwoQyxFKSlyZXR1cm4gTi52YWx1ZT1DW0VdLE4uZG9uZT0hMSxOO3JldHVybiBOLnZhbHVlPXQsTi5kb25lPSEwLE59O3JldHVybiBBLm5leHQ9QX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgQysiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT14LGkoJCwiY29uc3RydWN0b3IiLHt2YWx1ZTp4LGNvbmZpZ3VyYWJsZTohMH0pLGkoeCwiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dSh4LGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksZS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKEMpe3ZhciBrPXR5cGVvZiBDPT0iZnVuY3Rpb24iJiZDLmNvbnN0cnVjdG9yO3JldHVybiEhayYmKGs9PT15fHwoay5kaXNwbGF5TmFtZXx8ay5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSxlLm1hcms9ZnVuY3Rpb24oQyl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoQyx4KTooQy5fX3Byb3RvX189eCx1KEMsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksQy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSgkKSxDfSxlLmF3cmFwPWZ1bmN0aW9uKEMpe3JldHVybntfX2F3YWl0OkN9fSxPKEwucHJvdG90eXBlKSx1KEwucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGUuQXN5bmNJdGVyYXRvcj1MLGUuYXN5bmM9ZnVuY3Rpb24oQyxrLEUsQSxOKXtOPT09dm9pZCAwJiYoTj1Qcm9taXNlKTt2YXIgRj1uZXcgTChjKEMsayxFLEEpLE4pO3JldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24oayk/RjpGLm5leHQoKS50aGVuKGZ1bmN0aW9uKEspe3JldHVybiBLLmRvbmU/Sy52YWx1ZTpGLm5leHQoKX0pfSxPKCQpLHUoJCxhLCJHZW5lcmF0b3IiKSx1KCQsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdSgkLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLGUua2V5cz1mdW5jdGlvbihDKXt2YXIgaz1PYmplY3QoQyksRT1bXTtmb3IodmFyIEEgaW4gaylFLnB1c2goQSk7cmV0dXJuIEUucmV2ZXJzZSgpLGZ1bmN0aW9uIE4oKXtmb3IoO0UubGVuZ3RoOyl7dmFyIEY9RS5wb3AoKTtpZihGIGluIGspcmV0dXJuIE4udmFsdWU9RixOLmRvbmU9ITEsTn1yZXR1cm4gTi5kb25lPSEwLE59fSxlLnZhbHVlcz1aLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKEMpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PXQsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9dCx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChvZSksIUMpZm9yKHZhciBrIGluIHRoaXMpay5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLGspJiYhaXNOYU4oK2suc2xpY2UoMSkpJiYodGhpc1trXT10KX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgQz10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihDLnR5cGU9PT0idGhyb3ciKXRocm93IEMuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKEMpe2lmKHRoaXMuZG9uZSl0aHJvdyBDO3ZhciBrPXRoaXM7ZnVuY3Rpb24gRShzZSxBZSl7cmV0dXJuIEYudHlwZT0idGhyb3ciLEYuYXJnPUMsay5uZXh0PXNlLEFlJiYoay5tZXRob2Q9Im5leHQiLGsuYXJnPXQpLCEhQWV9Zm9yKHZhciBBPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtBPj0wOy0tQSl7dmFyIE49dGhpcy50cnlFbnRyaWVzW0FdLEY9Ti5jb21wbGV0aW9uO2lmKE4udHJ5TG9jPT09InJvb3QiKXJldHVybiBFKCJlbmQiKTtpZihOLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgSz1yLmNhbGwoTiwiY2F0Y2hMb2MiKSxkZT1yLmNhbGwoTiwiZmluYWxseUxvYyIpO2lmKEsmJmRlKXtpZih0aGlzLnByZXY8Ti5jYXRjaExvYylyZXR1cm4gRShOLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8Ti5maW5hbGx5TG9jKXJldHVybiBFKE4uZmluYWxseUxvYyl9ZWxzZSBpZihLKXtpZih0aGlzLnByZXY8Ti5jYXRjaExvYylyZXR1cm4gRShOLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFkZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PE4uZmluYWxseUxvYylyZXR1cm4gRShOLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oQyxrKXtmb3IodmFyIEU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO0U+PTA7LS1FKXt2YXIgQT10aGlzLnRyeUVudHJpZXNbRV07aWYoQS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEEsImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEEuZmluYWxseUxvYyl7dmFyIE49QTticmVha319TiYmKEM9PT0iYnJlYWsifHxDPT09ImNvbnRpbnVlIikmJk4udHJ5TG9jPD1rJiZrPD1OLmZpbmFsbHlMb2MmJihOPW51bGwpO3ZhciBGPU4/Ti5jb21wbGV0aW9uOnt9O3JldHVybiBGLnR5cGU9QyxGLmFyZz1rLE4/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9Ti5maW5hbGx5TG9jLHcpOnRoaXMuY29tcGxldGUoRil9LGNvbXBsZXRlOmZ1bmN0aW9uKEMsayl7aWYoQy50eXBlPT09InRocm93Iil0aHJvdyBDLmFyZztyZXR1cm4gQy50eXBlPT09ImJyZWFrInx8Qy50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9Qy5hcmc6Qy50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1DLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOkMudHlwZT09PSJub3JtYWwiJiZrJiYodGhpcy5uZXh0PWspLHd9LGZpbmlzaDpmdW5jdGlvbihDKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgRT10aGlzLnRyeUVudHJpZXNba107aWYoRS5maW5hbGx5TG9jPT09QylyZXR1cm4gdGhpcy5jb21wbGV0ZShFLmNvbXBsZXRpb24sRS5hZnRlckxvYyksb2UoRSksd319LGNhdGNoOmZ1bmN0aW9uKEMpe2Zvcih2YXIgaz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7az49MDstLWspe3ZhciBFPXRoaXMudHJ5RW50cmllc1trXTtpZihFLnRyeUxvYz09PUMpe3ZhciBBPUUuY29tcGxldGlvbjtpZihBLnR5cGU9PT0idGhyb3ciKXt2YXIgTj1BLmFyZztvZShFKX1yZXR1cm4gTn19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihDLGssRSl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlooQykscmVzdWx0TmFtZTprLG5leHRMb2M6RX0sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz10KSx3fX0sZX1mdW5jdGlvbiBrMCh0LGUsbixyLGksbyxsKXt0cnl7dmFyIHM9dFtvXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP2UoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixpKX1mdW5jdGlvbiBHdyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe3ZhciBvPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBsKGEpe2swKG8scixpLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtrMChvLHIsaSxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19dmFyIFpOPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXticih0aGlzLHQpLHRoaXMuaG9zdD1lfXJldHVybiAkcih0LFt7a2V5OiJnZXREaXNhYmxlVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZGlzYWJsZT9yZWRpcmVjdF90bz0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG4pKX19LHtrZXk6ImdldExvZ2luVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvYXV0aG9yaXplP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0RW5hYmxlVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZW5hYmxlP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0UGF0Y2hlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1HdyhxYSgpLm1hcmsoZnVuY3Rpb24gcihpKXt2YXIgbyxsLHM7cmV0dXJuIHFhKCkud3JhcChmdW5jdGlvbih1KXtmb3IoOzspc3dpdGNoKHUucHJldj11Lm5leHQpe2Nhc2UgMDpyZXR1cm4gbz1pLnBhdGNoSWRzLGw9aS5oZWFkZXJzLHM9bz8iPyIuY29uY2F0KG8ubWFwKGZ1bmN0aW9uKGMpe3JldHVybiIiLmNvbmNhdChjLCI9IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChjKSl9KS5qb2luKCImIikpOiIiLHUuYWJydXB0KCJyZXR1cm4iLGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKS5jb25jYXQocykse2hlYWRlcnM6bHx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19KS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBYcyhjKX0pLmNhdGNoKFlzKSk7Y2FzZSAzOmNhc2UiZW5kIjpyZXR1cm4gdS5zdG9wKCl9fSxyLHRoaXMpfSkpO2Z1bmN0aW9uIG4ocil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufSgpfSx7a2V5OiJnZXRFZGl0VXJsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9zdGF0aWMvZWRpdCIpfX0se2tleToicG9zdFBhdGNoZXMiLHZhbHVlOmZ1bmN0aW9uKG4scixpKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3BhdGNoZXMvfiIpLHtoZWFkZXJzOml8fHsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LG1ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShVZSh7fSxuLHIpKX0pLnRoZW4oZnVuY3Rpb24obyl7cmV0dXJuIFhzKG8pfSkuY2F0Y2goWXMpfX0se2tleToiZ2V0U2Vzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3Nlc3Npb24iKSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gWHMobikuY2F0Y2goWXMpfSl9fSx7a2V5OiJnZXRUcmVlIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1uLnBhdGNoLGk9cj09PXZvaWQgMD8hMTpyLG89bi5pbmNsdWRlU2NoZW1hLGw9bz09PXZvaWQgMD8hMTpvLHM9bi5pbmNsdWRlU291cmNlLGE9cz09PXZvaWQgMD8hMTpzLHU9bi50cmVlUGF0aCxjPXU9PT12b2lkIDA/Ii8iOnUsZD1uLmhlYWRlcnMsZj1uZXcgVVJMU2VhcmNoUGFyYW1zO3JldHVybiBmLnNldCgicGF0Y2giLGkudG9TdHJpbmcoKSksZi5zZXQoInNjaGVtYSIsbC50b1N0cmluZygpKSxmLnNldCgic291cmNlIixhLnRvU3RyaW5nKCkpLGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi90cmVlL34iKS5jb25jYXQoYywiPyIpLmNvbmNhdChmLnRvU3RyaW5nKCkpLHtoZWFkZXJzOmR9KS50aGVuKGZ1bmN0aW9uKGgpe3JldHVybiBYcyhoKX0pLmNhdGNoKFlzKX19LHtrZXk6InBvc3RDb21taXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2hlcyxpPW4uaGVhZGVycztyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL2NvbW1pdCIpLHttZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkoe3BhdGNoZXM6cn0pLGhlYWRlcnM6aXx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19KS50aGVuKGZ1bmN0aW9uKG8pe3JldHVybiBYcyhvKX0pLmNhdGNoKFlzKX19XSksdH0oKTtmdW5jdGlvbiBZcyh0KXtyZXR1cm4gQnIoe3N0YXR1c0NvZGU6NTAwLG1lc3NhZ2U6dCBpbnN0YW5jZW9mIEVycm9yP3QubWVzc2FnZToiVW5rbm93biBlcnJvciJ9KX1mdW5jdGlvbiBYcyh0KXtyZXR1cm4gS3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEtwKCl7cmV0dXJuIEtwPUd3KHFhKCkubWFyayhmdW5jdGlvbiB0KGUpe3ZhciBuO3JldHVybiBxYSgpLndyYXAoZnVuY3Rpb24oaSl7Zm9yKDs7KXN3aXRjaChpLnByZXY9aS5uZXh0KXtjYXNlIDA6aWYoaS5wcmV2PTAsIWUub2spe2kubmV4dD05O2JyZWFrfXJldHVybiBpLnQwPUxvLGkubmV4dD01LGUuanNvbigpO2Nhc2UgNTpyZXR1cm4gaS50MT1pLnNlbnQsaS5hYnJ1cHQoInJldHVybiIsaS50MC5vay5jYWxsKGkudDAsaS50MSkpO2Nhc2UgOTpyZXR1cm4gaS5wcmV2PTksaS5uZXh0PTEyLGUuanNvbigpO2Nhc2UgMTI6cmV0dXJuIG49aS5zZW50LGkuYWJydXB0KCJyZXR1cm4iLEJyKHtzdGF0dXNDb2RlOmUuc3RhdHVzLG1lc3NhZ2U6bi5tZXNzYWdlfHxlLnN0YXR1c1RleHQsZGV0YWlsczpuLmRldGFpbHN8fE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuKS5maWx0ZXIoZnVuY3Rpb24obyl7dmFyIGw9SmkobywxKSxzPWxbMF07cmV0dXJuIHMhPT0ibWVzc2FnZSJ9KSl9KSk7Y2FzZSAxNjpyZXR1cm4gaS5wcmV2PTE2LGkudDI9aS5jYXRjaCg5KSxpLmFicnVwdCgicmV0dXJuIixCcih7c3RhdHVzQ29kZTplLnN0YXR1cyxtZXNzYWdlOmUuc3RhdHVzVGV4dH0pKTtjYXNlIDE5OmkubmV4dD0yNDticmVhaztjYXNlIDIxOnJldHVybiBpLnByZXY9MjEsaS50Mz1pLmNhdGNoKDApLGkuYWJydXB0KCJyZXR1cm4iLEJyKHttZXNzYWdlOmkudDMgaW5zdGFuY2VvZiBFcnJvcj9pLnQzLm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSkpO2Nhc2UgMjQ6Y2FzZSJlbmQiOnJldHVybiBpLnN0b3AoKX19LHQsbnVsbCxbWzAsMjFdLFs5LDE2XV0pfSkpLEtwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgam49e2NvbnZlcnRGaWxlU291cmNlOkh3LGdldFNjaGVtYTp1TixnZXRWYWxQYXRoOmhOLGdldFZhbDpSTixnZXRTb3VyY2U6X04scmVzb2x2ZVBhdGg6VE4sc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGg6d04saXNWYWw6Zk4sY3JlYXRlVmFsUGF0aE9mSXRlbTptcixnZXRTSEEyNTZIYXNoOktOLGNyZWF0ZVBhdGNoSlNPTlBhdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIi8iLmNvbmNhdChlLnNwbGl0KCIuIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuJiZHTihuKX0pLmpvaW4oIi8iKSl9LFZBTF9FTkFCTEVfQ09PS0lFX05BTUU6InZhbF9lbmFibGUiLFZBTF9TVEFURV9DT09LSUU6InZhbF9zdGF0ZSIsVkFMX1NFU1NJT05fQ09PS0lFOiJ2YWxfc2Vzc2lvbiJ9O2Z1bmN0aW9uIEdOKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaHtyZXR1cm4gdH19dmFyIFl3PXtleHBvcnRzOnt9fTsvKiEKCUNvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLgoJTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWUKCWh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXMKKi8oZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj1bXSxpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIG89YXJndW1lbnRzW2ldO2lmKG8pe3ZhciBsPXR5cGVvZiBvO2lmKGw9PT0ic3RyaW5nInx8bD09PSJudW1iZXIiKXIucHVzaChvKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobykpe2lmKG8ubGVuZ3RoKXt2YXIgcz1uLmFwcGx5KG51bGwsbyk7cyYmci5wdXNoKHMpfX1lbHNlIGlmKGw9PT0ib2JqZWN0Iil7aWYoby50b1N0cmluZyE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcmJiFvLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoIltuYXRpdmUgY29kZV0iKSl7ci5wdXNoKG8udG9TdHJpbmcoKSk7Y29udGludWV9Zm9yKHZhciBhIGluIG8pZS5jYWxsKG8sYSkmJm9bYV0mJnIucHVzaChhKX19fXJldHVybiByLmpvaW4oIiAiKX10LmV4cG9ydHM/KG4uZGVmYXVsdD1uLHQuZXhwb3J0cz1uKTp3aW5kb3cuY2xhc3NOYW1lcz1ufSkoKX0pKFl3KTt2YXIgWU49WXcuZXhwb3J0cztjb25zdCBfZj1UdShZTik7ZnVuY3Rpb24gaWUoKXtyZXR1cm4gaWU9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxpZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWE4odCxlKXt0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQhPW51bGwmJih0LmN1cnJlbnQ9ZSl9ZnVuY3Rpb24gWHcoLi4udCl7cmV0dXJuIGU9PnQuZm9yRWFjaChuPT5YTihuLGUpKX1mdW5jdGlvbiBzdCguLi50KXtyZXR1cm4gcC51c2VDYWxsYmFjayhYdyguLi50KSx0KX1jb25zdCBhcz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PXQsaT1wLkNoaWxkcmVuLnRvQXJyYXkobiksbz1pLmZpbmQoSk4pO2lmKG8pe2NvbnN0IGw9by5wcm9wcy5jaGlsZHJlbixzPWkubWFwKGE9PmE9PT1vP3AuQ2hpbGRyZW4uY291bnQobCk+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6cC5pc1ZhbGlkRWxlbWVudChsKT9sLnByb3BzLmNoaWxkcmVuOm51bGw6YSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChacCxpZSh7fSxyLHtyZWY6ZX0pLHAuaXNWYWxpZEVsZW1lbnQobCk/cC5jbG9uZUVsZW1lbnQobCx2b2lkIDAscyk6bnVsbCl9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChacCxpZSh7fSxyLHtyZWY6ZX0pLG4pfSk7YXMuZGlzcGxheU5hbWU9IlNsb3QiO2NvbnN0IFpwPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e2NoaWxkcmVuOm4sLi4ucn09dDtyZXR1cm4gcC5pc1ZhbGlkRWxlbWVudChuKT9wLmNsb25lRWxlbWVudChuLHsuLi5xTihyLG4ucHJvcHMpLHJlZjplP1h3KGUsbi5yZWYpOm4ucmVmfSk6cC5DaGlsZHJlbi5jb3VudChuKT4xP3AuQ2hpbGRyZW4ub25seShudWxsKTpudWxsfSk7WnAuZGlzcGxheU5hbWU9IlNsb3RDbG9uZSI7Y29uc3QgUU49KHtjaGlsZHJlbjp0fSk9PnAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsdCk7ZnVuY3Rpb24gSk4odCl7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQodCkmJnQudHlwZT09PVFOfWZ1bmN0aW9uIHFOKHQsZSl7Y29uc3Qgbj17Li4uZX07Zm9yKGNvbnN0IHIgaW4gZSl7Y29uc3QgaT10W3JdLG89ZVtyXTsvXm9uW0EtWl0vLnRlc3Qocik/aSYmbz9uW3JdPSguLi5zKT0+e28oLi4ucyksaSguLi5zKX06aSYmKG5bcl09aSk6cj09PSJzdHlsZSI/bltyXT17Li4uaSwuLi5vfTpyPT09ImNsYXNzTmFtZSImJihuW3JdPVtpLG9dLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIikpfXJldHVybnsuLi50LC4uLm59fWNvbnN0IGUyPVsiYSIsImJ1dHRvbiIsImRpdiIsImZvcm0iLCJoMiIsImgzIiwiaW1nIiwiaW5wdXQiLCJsYWJlbCIsImxpIiwibmF2Iiwib2wiLCJwIiwic3BhbiIsInN2ZyIsInVsIl0sS2U9ZTIucmVkdWNlKCh0LGUpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHIsaSk9Pntjb25zdHthc0NoaWxkOm8sLi4ubH09cixzPW8/YXM6ZTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt3aW5kb3dbU3ltYm9sLmZvcigicmFkaXgtdWkiKV09ITB9LFtdKSxwLmNyZWF0ZUVsZW1lbnQocyxpZSh7fSxsLHtyZWY6aX0pKX0pO3JldHVybiBuLmRpc3BsYXlOYW1lPWBQcmltaXRpdmUuJHtlfWAsey4uLnQsW2VdOm59fSx7fSk7ZnVuY3Rpb24gdDIodCxlKXt0JiZHci5mbHVzaFN5bmMoKCk9PnQuZGlzcGF0Y2hFdmVudChlKSl9Y29uc3QgVW49Z2xvYmFsVGhpcyE9bnVsbCYmZ2xvYmFsVGhpcy5kb2N1bWVudD9wLnVzZUxheW91dEVmZmVjdDooKT0+e307ZnVuY3Rpb24gbjIodCxlKXtyZXR1cm4gcC51c2VSZWR1Y2VyKChuLHIpPT57Y29uc3QgaT1lW25dW3JdO3JldHVybiBpPz9ufSx0KX1jb25zdCBTcz10PT57Y29uc3R7cHJlc2VudDplLGNoaWxkcmVuOm59PXQscj1yMihlKSxpPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oe3ByZXNlbnQ6ci5pc1ByZXNlbnR9KTpwLkNoaWxkcmVuLm9ubHkobiksbz1zdChyLnJlZixpLnJlZik7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24ifHxyLmlzUHJlc2VudD9wLmNsb25lRWxlbWVudChpLHtyZWY6b30pOm51bGx9O1NzLmRpc3BsYXlOYW1lPSJQcmVzZW5jZSI7ZnVuY3Rpb24gcjIodCl7Y29uc3RbZSxuXT1wLnVzZVN0YXRlKCkscj1wLnVzZVJlZih7fSksaT1wLnVzZVJlZih0KSxvPXAudXNlUmVmKCJub25lIiksbD10PyJtb3VudGVkIjoidW5tb3VudGVkIixbcyxhXT1uMihsLHttb3VudGVkOntVTk1PVU5UOiJ1bm1vdW50ZWQiLEFOSU1BVElPTl9PVVQ6InVubW91bnRTdXNwZW5kZWQifSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDoibW91bnRlZCIsQU5JTUFUSU9OX0VORDoidW5tb3VudGVkIn0sdW5tb3VudGVkOntNT1VOVDoibW91bnRlZCJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1oYyhyLmN1cnJlbnQpO28uY3VycmVudD1zPT09Im1vdW50ZWQiP3U6Im5vbmUifSxbc10pLFVuKCgpPT57Y29uc3QgdT1yLmN1cnJlbnQsYz1pLmN1cnJlbnQ7aWYoYyE9PXQpe2NvbnN0IGY9by5jdXJyZW50LGg9aGModSk7dD9hKCJNT1VOVCIpOmg9PT0ibm9uZSJ8fCh1PT1udWxsP3ZvaWQgMDp1LmRpc3BsYXkpPT09Im5vbmUiP2EoIlVOTU9VTlQiKTphKGMmJmYhPT1oPyJBTklNQVRJT05fT1VUIjoiVU5NT1VOVCIpLGkuY3VycmVudD10fX0sW3QsYV0pLFVuKCgpPT57aWYoZSl7Y29uc3QgdT1kPT57Y29uc3QgaD1oYyhyLmN1cnJlbnQpLmluY2x1ZGVzKGQuYW5pbWF0aW9uTmFtZSk7ZC50YXJnZXQ9PT1lJiZoJiZHci5mbHVzaFN5bmMoKCk9PmEoIkFOSU1BVElPTl9FTkQiKSl9LGM9ZD0+e2QudGFyZ2V0PT09ZSYmKG8uY3VycmVudD1oYyhyLmN1cnJlbnQpKX07cmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uc3RhcnQiLGMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uY2FuY2VsIix1KSxlLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdSksKCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpfX1lbHNlIGEoIkFOSU1BVElPTl9FTkQiKX0sW2UsYV0pLHtpc1ByZXNlbnQ6WyJtb3VudGVkIiwidW5tb3VudFN1c3BlbmRlZCJdLmluY2x1ZGVzKHMpLHJlZjpwLnVzZUNhbGxiYWNrKHU9Pnt1JiYoci5jdXJyZW50PWdldENvbXB1dGVkU3R5bGUodSkpLG4odSl9LFtdKX19ZnVuY3Rpb24gaGModCl7cmV0dXJuKHQ9PW51bGw/dm9pZCAwOnQuYW5pbWF0aW9uTmFtZSl8fCJub25lIn1mdW5jdGlvbiBvbCh0LGU9W10pe2xldCBuPVtdO2Z1bmN0aW9uIHIobyxsKXtjb25zdCBzPXAuY3JlYXRlQ29udGV4dChsKSxhPW4ubGVuZ3RoO249Wy4uLm4sbF07ZnVuY3Rpb24gdShkKXtjb25zdHtzY29wZTpmLGNoaWxkcmVuOmgsLi4ubX09ZCxnPShmPT1udWxsP3ZvaWQgMDpmW3RdW2FdKXx8cyx3PXAudXNlTWVtbygoKT0+bSxPYmplY3QudmFsdWVzKG0pKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGcuUHJvdmlkZXIse3ZhbHVlOnd9LGgpfWZ1bmN0aW9uIGMoZCxmKXtjb25zdCBoPShmPT1udWxsP3ZvaWQgMDpmW3RdW2FdKXx8cyxtPXAudXNlQ29udGV4dChoKTtpZihtKXJldHVybiBtO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7dGhyb3cgbmV3IEVycm9yKGBcYCR7ZH1cYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxgJHtvfVxgYCl9cmV0dXJuIHUuZGlzcGxheU5hbWU9bysiUHJvdmlkZXIiLFt1LGNdfWNvbnN0IGk9KCk9Pntjb25zdCBvPW4ubWFwKGw9PnAuY3JlYXRlQ29udGV4dChsKSk7cmV0dXJuIGZ1bmN0aW9uKHMpe2NvbnN0IGE9KHM9PW51bGw/dm9pZCAwOnNbdF0pfHxvO3JldHVybiBwLnVzZU1lbW8oKCk9Pih7W2BfX3Njb3BlJHt0fWBdOnsuLi5zLFt0XTphfX0pLFtzLGFdKX19O3JldHVybiBpLnNjb3BlTmFtZT10LFtyLGkyKGksLi4uZSldfWZ1bmN0aW9uIGkyKC4uLnQpe2NvbnN0IGU9dFswXTtpZih0Lmxlbmd0aD09PTEpcmV0dXJuIGU7Y29uc3Qgbj0oKT0+e2NvbnN0IHI9dC5tYXAoaT0+KHt1c2VTY29wZTppKCksc2NvcGVOYW1lOmkuc2NvcGVOYW1lfSkpO3JldHVybiBmdW5jdGlvbihvKXtjb25zdCBsPXIucmVkdWNlKChzLHt1c2VTY29wZTphLHNjb3BlTmFtZTp1fSk9Pntjb25zdCBkPWEobylbYF9fc2NvcGUke3V9YF07cmV0dXJuey4uLnMsLi4uZH19LHt9KTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZS5zY29wZU5hbWV9YF06bH0pLFtsXSl9fTtyZXR1cm4gbi5zY29wZU5hbWU9ZS5zY29wZU5hbWUsbn1mdW5jdGlvbiBlbih0KXtjb25zdCBlPXAudXNlUmVmKHQpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2UuY3VycmVudD10fSkscC51c2VNZW1vKCgpPT4oLi4ubik9Pnt2YXIgcjtyZXR1cm4ocj1lLmN1cnJlbnQpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5jYWxsKGUsLi4ubil9LFtdKX1jb25zdCBvMj1wLmNyZWF0ZUNvbnRleHQodm9pZCAwKTtmdW5jdGlvbiBYbSh0KXtjb25zdCBlPXAudXNlQ29udGV4dChvMik7cmV0dXJuIHR8fGV8fCJsdHIifWZ1bmN0aW9uIEdwKHQsW2Usbl0pe3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KGUsdCkpfWZ1bmN0aW9uIG50KHQsZSx7Y2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOm49ITB9PXt9KXtyZXR1cm4gZnVuY3Rpb24oaSl7aWYodD09bnVsbHx8dChpKSxuPT09ITF8fCFpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIGU9PW51bGw/dm9pZCAwOmUoaSl9fWZ1bmN0aW9uIGwyKHQsZSl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IGk9ZVtuXVtyXTtyZXR1cm4gaT8/bn0sdCl9Y29uc3QgUXc9IlNjcm9sbEFyZWEiLFtKdyxORF09b2woUXcpLFtzMixvcl09SncoUXcpLGEyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sdHlwZTpyPSJob3ZlciIsZGlyOmksc2Nyb2xsSGlkZURlbGF5Om89NjAwLC4uLmx9PXQsW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLFtkLGZdPXAudXNlU3RhdGUobnVsbCksW2gsbV09cC51c2VTdGF0ZShudWxsKSxbZyx3XT1wLnVzZVN0YXRlKG51bGwpLFt2LHldPXAudXNlU3RhdGUoMCksW3gsU109cC51c2VTdGF0ZSgwKSxbYixUXT1wLnVzZVN0YXRlKCExKSxbJCxPXT1wLnVzZVN0YXRlKCExKSxMPXN0KGUsRD0+YShEKSksUD1YbShpKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHMyLHtzY29wZTpuLHR5cGU6cixkaXI6UCxzY3JvbGxIaWRlRGVsYXk6byxzY3JvbGxBcmVhOnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmMsY29udGVudDpkLG9uQ29udGVudENoYW5nZTpmLHNjcm9sbGJhclg6aCxvblNjcm9sbGJhclhDaGFuZ2U6bSxzY3JvbGxiYXJYRW5hYmxlZDpiLG9uU2Nyb2xsYmFyWEVuYWJsZWRDaGFuZ2U6VCxzY3JvbGxiYXJZOmcsb25TY3JvbGxiYXJZQ2hhbmdlOncsc2Nyb2xsYmFyWUVuYWJsZWQ6JCxvblNjcm9sbGJhcllFbmFibGVkQ2hhbmdlOk8sb25Db3JuZXJXaWR0aENoYW5nZTp5LG9uQ29ybmVySGVpZ2h0Q2hhbmdlOlN9LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe2RpcjpQfSxsLHtyZWY6TCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgiOnYrInB4IiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0Ijp4KyJweCIsLi4udC5zdHlsZX19KSkpfSksdTI9IlNjcm9sbEFyZWFWaWV3cG9ydCIsYzI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixjaGlsZHJlbjpyLC4uLml9PXQsbz1vcih1MixuKSxsPXAudXNlUmVmKG51bGwpLHM9c3QoZSxsLG8ub25WaWV3cG9ydENoYW5nZSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XXtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt9W2RhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydCI6IiJ9LGkse3JlZjpzLHN0eWxlOntvdmVyZmxvd1g6by5zY3JvbGxiYXJYRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIixvdmVyZmxvd1k6by5zY3JvbGxiYXJZRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIiwuLi50LnN0eWxlfX0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOm8ub25Db250ZW50Q2hhbmdlLHN0eWxlOnttaW5XaWR0aDoiMTAwJSIsZGlzcGxheToidGFibGUifX0scikpKX0pLF9pPSJTY3JvbGxBcmVhU2Nyb2xsYmFyIixxdz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLHtvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOm8sb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpsfT1pLHM9dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIjtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PihzP28oITApOmwoITApLCgpPT57cz9vKCExKTpsKCExKX0pLFtzLG8sbF0pLGkudHlwZT09PSJob3ZlciI/cC5jcmVhdGVFbGVtZW50KGQyLGllKHt9LHIse3JlZjplLGZvcmNlTW91bnQ6bn0pKTppLnR5cGU9PT0ic2Nyb2xsIj9wLmNyZWF0ZUVsZW1lbnQoZjIsaWUoe30scix7cmVmOmUsZm9yY2VNb3VudDpufSkpOmkudHlwZT09PSJhdXRvIj9wLmNyZWF0ZUVsZW1lbnQoZVMsaWUoe30scix7cmVmOmUsZm9yY2VNb3VudDpufSkpOmkudHlwZT09PSJhbHdheXMiP3AuY3JlYXRlRWxlbWVudChRbSxpZSh7fSxyLHtyZWY6ZX0pKTpudWxsfSksZDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PXQsaT1vcihfaSx0Ll9fc2NvcGVTY3JvbGxBcmVhKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPWkuc2Nyb2xsQXJlYTtsZXQgYT0wO2lmKHMpe2NvbnN0IHU9KCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLGwoITApfSxjPSgpPT57YT13aW5kb3cuc2V0VGltZW91dCgoKT0+bCghMSksaS5zY3JvbGxIaWRlRGVsYXkpfTtyZXR1cm4gcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKSwoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoYSkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKX19fSxbaS5zY3JvbGxBcmVhLGkuc2Nyb2xsSGlkZURlbGF5XSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fG99LHAuY3JlYXRlRWxlbWVudChlUyxpZSh7ImRhdGEtc3RhdGUiOm8/InZpc2libGUiOiJoaWRkZW4ifSxyLHtyZWY6ZX0pKSl9KSxmMj1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLG89dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixsPVNmKCgpPT5hKCJTQ1JPTExfRU5EIiksMTAwKSxbcyxhXT1sMigiaGlkZGVuIix7aGlkZGVuOntTQ1JPTEw6InNjcm9sbGluZyJ9LHNjcm9sbGluZzp7U0NST0xMX0VORDoiaWRsZSIsUE9JTlRFUl9FTlRFUjoiaW50ZXJhY3RpbmcifSxpbnRlcmFjdGluZzp7U0NST0xMOiJpbnRlcmFjdGluZyIsUE9JTlRFUl9MRUFWRToiaWRsZSJ9LGlkbGU6e0hJREU6ImhpZGRlbiIsU0NST0xMOiJzY3JvbGxpbmciLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn19KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpZihzPT09ImlkbGUiKXtjb25zdCB1PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCJISURFIiksaS5zY3JvbGxIaWRlRGVsYXkpO3JldHVybigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHUpfX0sW3MsaS5zY3JvbGxIaWRlRGVsYXksYV0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1pLnZpZXdwb3J0LGM9bz8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCI7aWYodSl7bGV0IGQ9dVtjXTtjb25zdCBmPSgpPT57Y29uc3QgaD11W2NdO2QhPT1oJiYoYSgiU0NST0xMIiksbCgpKSxkPWh9O3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PnUucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtpLnZpZXdwb3J0LG8sYSxsXSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fHMhPT0iaGlkZGVuIn0scC5jcmVhdGVFbGVtZW50KFFtLGllKHsiZGF0YS1zdGF0ZSI6cz09PSJoaWRkZW4iPyJoaWRkZW4iOiJ2aXNpYmxlIn0scix7cmVmOmUsb25Qb2ludGVyRW50ZXI6bnQodC5vblBvaW50ZXJFbnRlciwoKT0+YSgiUE9JTlRFUl9FTlRFUiIpKSxvblBvaW50ZXJMZWF2ZTpudCh0Lm9uUG9pbnRlckxlYXZlLCgpPT5hKCJQT0lOVEVSX0xFQVZFIikpfSkpKX0pLGVTPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0IG49b3IoX2ksdC5fX3Njb3BlU2Nyb2xsQXJlYSkse2ZvcmNlTW91bnQ6ciwuLi5pfT10LFtvLGxdPXAudXNlU3RhdGUoITEpLHM9dC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixhPVNmKCgpPT57aWYobi52aWV3cG9ydCl7Y29uc3QgdT1uLnZpZXdwb3J0Lm9mZnNldFdpZHRoPG4udmlld3BvcnQuc2Nyb2xsV2lkdGgsYz1uLnZpZXdwb3J0Lm9mZnNldEhlaWdodDxuLnZpZXdwb3J0LnNjcm9sbEhlaWdodDtsKHM/dTpjKX19LDEwKTtyZXR1cm4gdXMobi52aWV3cG9ydCxhKSx1cyhuLmNvbnRlbnQsYSkscC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50OnJ8fG99LHAuY3JlYXRlRWxlbWVudChRbSxpZSh7ImRhdGEtc3RhdGUiOm8/InZpc2libGUiOiJoaWRkZW4ifSxpLHtyZWY6ZX0pKSl9KSxRbT1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtvcmllbnRhdGlvbjpuPSJ2ZXJ0aWNhbCIsLi4ucn09dCxpPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLG89cC51c2VSZWYobnVsbCksbD1wLnVzZVJlZigwKSxbcyxhXT1wLnVzZVN0YXRlKHtjb250ZW50OjAsdmlld3BvcnQ6MCxzY3JvbGxiYXI6e3NpemU6MCxwYWRkaW5nU3RhcnQ6MCxwYWRkaW5nRW5kOjB9fSksdT1pUyhzLnZpZXdwb3J0LHMuY29udGVudCksYz17Li4ucixzaXplczpzLG9uU2l6ZXNDaGFuZ2U6YSxoYXNUaHVtYjp1PjAmJnU8MSxvblRodW1iQ2hhbmdlOmY9Pm8uY3VycmVudD1mLG9uVGh1bWJQb2ludGVyVXA6KCk9PmwuY3VycmVudD0wLG9uVGh1bWJQb2ludGVyRG93bjpmPT5sLmN1cnJlbnQ9Zn07ZnVuY3Rpb24gZChmLGgpe3JldHVybiBfMihmLGwuY3VycmVudCxzLGgpfXJldHVybiBuPT09Imhvcml6b250YWwiP3AuY3JlYXRlRWxlbWVudChoMixpZSh7fSxjLHtyZWY6ZSxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihpLnZpZXdwb3J0JiZvLmN1cnJlbnQpe2NvbnN0IGY9aS52aWV3cG9ydC5zY3JvbGxMZWZ0LGg9YjAoZixzLGkuZGlyKTtvLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGUzZCgke2h9cHgsIDAsIDApYH19LG9uV2hlZWxTY3JvbGw6Zj0+e2kudmlld3BvcnQmJihpLnZpZXdwb3J0LnNjcm9sbExlZnQ9Zil9LG9uRHJhZ1Njcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsTGVmdD1kKGYsaS5kaXIpKX19KSk6bj09PSJ2ZXJ0aWNhbCI/cC5jcmVhdGVFbGVtZW50KHAyLGllKHt9LGMse3JlZjplLG9uVGh1bWJQb3NpdGlvbkNoYW5nZTooKT0+e2lmKGkudmlld3BvcnQmJm8uY3VycmVudCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbFRvcCxoPWIwKGYscyk7by5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoMCwgJHtofXB4LCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntpLnZpZXdwb3J0JiYoaS52aWV3cG9ydC5zY3JvbGxUb3A9Zil9LG9uRHJhZ1Njcm9sbDpmPT57aS52aWV3cG9ydCYmKGkudmlld3BvcnQuc2Nyb2xsVG9wPWQoZikpfX0pKTpudWxsfSksaDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7c2l6ZXM6bixvblNpemVzQ2hhbmdlOnIsLi4uaX09dCxvPW9yKF9pLHQuX19zY29wZVNjcm9sbEFyZWEpLFtsLHNdPXAudXNlU3RhdGUoKSxhPXAudXNlUmVmKG51bGwpLHU9c3QoZSxhLG8ub25TY3JvbGxiYXJYQ2hhbmdlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PnthLmN1cnJlbnQmJnMoZ2V0Q29tcHV0ZWRTdHlsZShhLmN1cnJlbnQpKX0sW2FdKSxwLmNyZWF0ZUVsZW1lbnQoblMsaWUoeyJkYXRhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LGkse3JlZjp1LHNpemVzOm4sc3R5bGU6e2JvdHRvbTowLGxlZnQ6by5kaXI9PT0icnRsIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCxyaWdodDpvLmRpcj09PSJsdHIiPyJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgpIjowLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoIjp3ZihuKSsicHgiLC4uLnQuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT50Lm9uVGh1bWJQb2ludGVyRG93bihjLngpLG9uRHJhZ1Njcm9sbDpjPT50Lm9uRHJhZ1Njcm9sbChjLngpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihvLnZpZXdwb3J0KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsTGVmdCtjLmRlbHRhWDt0Lm9uV2hlZWxTY3JvbGwoZiksbFMoZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJm8udmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6by52aWV3cG9ydC5zY3JvbGxXaWR0aCx2aWV3cG9ydDpvLnZpZXdwb3J0Lm9mZnNldFdpZHRoLHNjcm9sbGJhcjp7c2l6ZTphLmN1cnJlbnQuY2xpZW50V2lkdGgscGFkZGluZ1N0YXJ0Ol9kKGwucGFkZGluZ0xlZnQpLHBhZGRpbmdFbmQ6X2QobC5wYWRkaW5nUmlnaHQpfX0pfX0pKX0pLHAyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLml9PXQsbz1vcihfaSx0Ll9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PXN0KGUsYSxvLm9uU2Nyb2xsYmFyWUNoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KG5TLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6InZlcnRpY2FsIn0saSx7cmVmOnUsc2l6ZXM6bixzdHlsZTp7dG9wOjAscmlnaHQ6by5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0Om8uZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0KSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0Ijp3ZihuKSsicHgiLC4uLnQuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT50Lm9uVGh1bWJQb2ludGVyRG93bihjLnkpLG9uRHJhZ1Njcm9sbDpjPT50Lm9uRHJhZ1Njcm9sbChjLnkpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihvLnZpZXdwb3J0KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsVG9wK2MuZGVsdGFZO3Qub25XaGVlbFNjcm9sbChmKSxsUyhmLGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxvblJlc2l6ZTooKT0+e2EuY3VycmVudCYmby52aWV3cG9ydCYmbCYmcih7Y29udGVudDpvLnZpZXdwb3J0LnNjcm9sbEhlaWdodCx2aWV3cG9ydDpvLnZpZXdwb3J0Lm9mZnNldEhlaWdodCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudEhlaWdodCxwYWRkaW5nU3RhcnQ6X2QobC5wYWRkaW5nVG9wKSxwYWRkaW5nRW5kOl9kKGwucGFkZGluZ0JvdHRvbSl9fSl9fSkpfSksW2cyLHRTXT1KdyhfaSksblM9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzaXplczpyLGhhc1RodW1iOmksb25UaHVtYkNoYW5nZTpvLG9uVGh1bWJQb2ludGVyVXA6bCxvblRodW1iUG9pbnRlckRvd246cyxvblRodW1iUG9zaXRpb25DaGFuZ2U6YSxvbkRyYWdTY3JvbGw6dSxvbldoZWVsU2Nyb2xsOmMsb25SZXNpemU6ZCwuLi5mfT10LGg9b3IoX2ksbiksW20sZ109cC51c2VTdGF0ZShudWxsKSx3PXN0KGUsTD0+ZyhMKSksdj1wLnVzZVJlZihudWxsKSx5PXAudXNlUmVmKCIiKSx4PWgudmlld3BvcnQsUz1yLmNvbnRlbnQtci52aWV3cG9ydCxiPWVuKGMpLFQ9ZW4oYSksJD1TZihkLDEwKTtmdW5jdGlvbiBPKEwpe2lmKHYuY3VycmVudCl7Y29uc3QgUD1MLmNsaWVudFgtdi5jdXJyZW50LmxlZnQsRD1MLmNsaWVudFktdi5jdXJyZW50LnRvcDt1KHt4OlAseTpEfSl9fXJldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IEw9UD0+e2NvbnN0IEQ9UC50YXJnZXQ7KG09PW51bGw/dm9pZCAwOm0uY29udGFpbnMoRCkpJiZiKFAsUyl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsTCx7cGFzc2l2ZTohMX0pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsTCx7cGFzc2l2ZTohMX0pfSxbeCxtLFMsYl0pLHAudXNlRWZmZWN0KFQsW3IsVF0pLHVzKG0sJCksdXMoaC5jb250ZW50LCQpLHAuY3JlYXRlRWxlbWVudChnMix7c2NvcGU6bixzY3JvbGxiYXI6bSxoYXNUaHVtYjppLG9uVGh1bWJDaGFuZ2U6ZW4obyksb25UaHVtYlBvaW50ZXJVcDplbihsKSxvblRodW1iUG9zaXRpb25DaGFuZ2U6VCxvblRodW1iUG9pbnRlckRvd246ZW4ocyl9LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30sZix7cmVmOncsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsLi4uZi5zdHlsZX0sb25Qb2ludGVyRG93bjpudCh0Lm9uUG9pbnRlckRvd24sTD0+e0wuYnV0dG9uPT09MCYmKEwudGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKEwucG9pbnRlcklkKSx2LmN1cnJlbnQ9bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx5LmN1cnJlbnQ9ZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0LGRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdD0ibm9uZSIsaC52aWV3cG9ydCYmKGgudmlld3BvcnQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9ImF1dG8iKSxPKEwpKX0pLG9uUG9pbnRlck1vdmU6bnQodC5vblBvaW50ZXJNb3ZlLE8pLG9uUG9pbnRlclVwOm50KHQub25Qb2ludGVyVXAsTD0+e2NvbnN0IFA9TC50YXJnZXQ7UC5oYXNQb2ludGVyQ2FwdHVyZShMLnBvaW50ZXJJZCkmJlAucmVsZWFzZVBvaW50ZXJDYXB0dXJlKEwucG9pbnRlcklkKSxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9eS5jdXJyZW50LGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSIiKSx2LmN1cnJlbnQ9bnVsbH0pfSkpKX0pLFlwPSJTY3JvbGxBcmVhVGh1bWIiLG0yPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT10LGk9dFMoWXAsdC5fX3Njb3BlU2Nyb2xsQXJlYSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChTcyx7cHJlc2VudDpufHxpLmhhc1RodW1ifSxwLmNyZWF0ZUVsZW1lbnQodjIsaWUoe3JlZjplfSxyKSkpfSksdjI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzdHlsZTpyLC4uLml9PXQsbz1vcihZcCxuKSxsPXRTKFlwLG4pLHtvblRodW1iUG9zaXRpb25DaGFuZ2U6c309bCxhPXN0KGUsZD0+bC5vblRodW1iQ2hhbmdlKGQpKSx1PXAudXNlUmVmKCksYz1TZigoKT0+e3UuY3VycmVudCYmKHUuY3VycmVudCgpLHUuY3VycmVudD12b2lkIDApfSwxMDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGQ9by52aWV3cG9ydDtpZihkKXtjb25zdCBmPSgpPT57aWYoYygpLCF1LmN1cnJlbnQpe2NvbnN0IGg9dzIoZCxzKTt1LmN1cnJlbnQ9aCxzKCl9fTtyZXR1cm4gcygpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKSwoKT0+ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpfX0sW28udmlld3BvcnQsYyxzXSkscC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7ImRhdGEtc3RhdGUiOmwuaGFzVGh1bWI/InZpc2libGUiOiJoaWRkZW4ifSxpLHtyZWY6YSxzdHlsZTp7d2lkdGg6InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoKSIsaGVpZ2h0OiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi1oZWlnaHQpIiwuLi5yfSxvblBvaW50ZXJEb3duQ2FwdHVyZTpudCh0Lm9uUG9pbnRlckRvd25DYXB0dXJlLGQ9Pntjb25zdCBoPWQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG09ZC5jbGllbnRYLWgubGVmdCxnPWQuY2xpZW50WS1oLnRvcDtsLm9uVGh1bWJQb2ludGVyRG93bih7eDptLHk6Z30pfSksb25Qb2ludGVyVXA6bnQodC5vblBvaW50ZXJVcCxsLm9uVGh1bWJQb2ludGVyVXApfSkpfSksclM9IlNjcm9sbEFyZWFDb3JuZXIiLHkyPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0IG49b3IoclMsdC5fX3Njb3BlU2Nyb2xsQXJlYSkscj0hIShuLnNjcm9sbGJhclgmJm4uc2Nyb2xsYmFyWSk7cmV0dXJuIG4udHlwZSE9PSJzY3JvbGwiJiZyP3AuY3JlYXRlRWxlbWVudCh4MixpZSh7fSx0LHtyZWY6ZX0pKTpudWxsfSkseDI9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6biwuLi5yfT10LGk9b3IoclMsbiksW28sbF09cC51c2VTdGF0ZSgwKSxbcyxhXT1wLnVzZVN0YXRlKDApLHU9ISEobyYmcyk7cmV0dXJuIHVzKGkuc2Nyb2xsYmFyWCwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPWkuc2Nyb2xsYmFyWCk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldEhlaWdodCl8fDA7aS5vbkNvcm5lckhlaWdodENoYW5nZShkKSxhKGQpfSksdXMoaS5zY3JvbGxiYXJZLCgpPT57dmFyIGM7Y29uc3QgZD0oKGM9aS5zY3JvbGxiYXJZKT09PW51bGx8fGM9PT12b2lkIDA/dm9pZCAwOmMub2Zmc2V0V2lkdGgpfHwwO2kub25Db3JuZXJXaWR0aENoYW5nZShkKSxsKGQpfSksdT9wLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LHIse3JlZjplLHN0eWxlOnt3aWR0aDpvLGhlaWdodDpzLHBvc2l0aW9uOiJhYnNvbHV0ZSIscmlnaHQ6aS5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0OmkuZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOjAsLi4udC5zdHlsZX19KSk6bnVsbH0pO2Z1bmN0aW9uIF9kKHQpe3JldHVybiB0P3BhcnNlSW50KHQsMTApOjB9ZnVuY3Rpb24gaVModCxlKXtjb25zdCBuPXQvZTtyZXR1cm4gaXNOYU4obik/MDpufWZ1bmN0aW9uIHdmKHQpe2NvbnN0IGU9aVModC52aWV3cG9ydCx0LmNvbnRlbnQpLG49dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQscj0odC5zY3JvbGxiYXIuc2l6ZS1uKSplO3JldHVybiBNYXRoLm1heChyLDE4KX1mdW5jdGlvbiBfMih0LGUsbixyPSJsdHIiKXtjb25zdCBpPXdmKG4pLG89aS8yLGw9ZXx8byxzPWktbCxhPW4uc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtsLHU9bi5zY3JvbGxiYXIuc2l6ZS1uLnNjcm9sbGJhci5wYWRkaW5nRW5kLXMsYz1uLmNvbnRlbnQtbi52aWV3cG9ydCxkPXI9PT0ibHRyIj9bMCxjXTpbYyotMSwwXTtyZXR1cm4gb1MoW2EsdV0sZCkodCl9ZnVuY3Rpb24gYjAodCxlLG49Imx0ciIpe2NvbnN0IHI9d2YoZSksaT1lLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrZS5zY3JvbGxiYXIucGFkZGluZ0VuZCxvPWUuc2Nyb2xsYmFyLnNpemUtaSxsPWUuY29udGVudC1lLnZpZXdwb3J0LHM9by1yLGE9bj09PSJsdHIiP1swLGxdOltsKi0xLDBdLHU9R3AodCxhKTtyZXR1cm4gb1MoWzAsbF0sWzAsc10pKHUpfWZ1bmN0aW9uIG9TKHQsZSl7cmV0dXJuIG49PntpZih0WzBdPT09dFsxXXx8ZVswXT09PWVbMV0pcmV0dXJuIGVbMF07Y29uc3Qgcj0oZVsxXS1lWzBdKS8odFsxXS10WzBdKTtyZXR1cm4gZVswXStyKihuLXRbMF0pfX1mdW5jdGlvbiBsUyh0LGUpe3JldHVybiB0PjAmJnQ8ZX1jb25zdCB3Mj0odCxlPSgpPT57fSk9PntsZXQgbj17bGVmdDp0LnNjcm9sbExlZnQsdG9wOnQuc2Nyb2xsVG9wfSxyPTA7cmV0dXJuIGZ1bmN0aW9uIGkoKXtjb25zdCBvPXtsZWZ0OnQuc2Nyb2xsTGVmdCx0b3A6dC5zY3JvbGxUb3B9LGw9bi5sZWZ0IT09by5sZWZ0LHM9bi50b3AhPT1vLnRvcDsobHx8cykmJmUoKSxuPW8scj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpfSgpLCgpPT53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocil9O2Z1bmN0aW9uIFNmKHQsZSl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSkscC51c2VDYWxsYmFjaygoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQobixlKX0sW24sZV0pfWZ1bmN0aW9uIHVzKHQsZSl7Y29uc3Qgbj1lbihlKTtVbigoKT0+e2xldCByPTA7aWYodCl7Y29uc3QgaT1uZXcgUmVzaXplT2JzZXJ2ZXIoKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZShyKSxyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobil9KTtyZXR1cm4gaS5vYnNlcnZlKHQpLCgpPT57d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpLGkudW5vYnNlcnZlKHQpfX19LFt0LG5dKX1jb25zdCBzUz1hMixTMj1jMixFMj15MjtmdW5jdGlvbiBhUyh0KXt2YXIgZSxuLHI9IiI7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09Im51bWJlciIpcis9dDtlbHNlIGlmKHR5cGVvZiB0PT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KHQpKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXSYmKG49YVModFtlXSkpJiYociYmKHIrPSIgIikscis9bik7ZWxzZSBmb3IoZSBpbiB0KXRbZV0mJihyJiYocis9IiAiKSxyKz1lKTtyZXR1cm4gcn1mdW5jdGlvbiB1Uygpe2Zvcih2YXIgdCxlLG49MCxyPSIiO248YXJndW1lbnRzLmxlbmd0aDspKHQ9YXJndW1lbnRzW24rK10pJiYoZT1hUyh0KSkmJihyJiYocis9IiAiKSxyKz1lKTtyZXR1cm4gcn1jb25zdCBKbT0iLSI7ZnVuY3Rpb24gQzIodCl7Y29uc3QgZT1iMih0KSx7Y29uZmxpY3RpbmdDbGFzc0dyb3VwczpuLGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczpyfT10O2Z1bmN0aW9uIGkobCl7Y29uc3Qgcz1sLnNwbGl0KEptKTtyZXR1cm4gc1swXT09PSIiJiZzLmxlbmd0aCE9PTEmJnMuc2hpZnQoKSxjUyhzLGUpfHxrMihsKX1mdW5jdGlvbiBvKGwscyl7Y29uc3QgYT1uW2xdfHxbXTtyZXR1cm4gcyYmcltsXT9bLi4uYSwuLi5yW2xdXTphfXJldHVybntnZXRDbGFzc0dyb3VwSWQ6aSxnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6b319ZnVuY3Rpb24gY1ModCxlKXt2YXIgbDtpZih0Lmxlbmd0aD09PTApcmV0dXJuIGUuY2xhc3NHcm91cElkO2NvbnN0IG49dFswXSxyPWUubmV4dFBhcnQuZ2V0KG4pLGk9cj9jUyh0LnNsaWNlKDEpLHIpOnZvaWQgMDtpZihpKXJldHVybiBpO2lmKGUudmFsaWRhdG9ycy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBvPXQuam9pbihKbSk7cmV0dXJuKGw9ZS52YWxpZGF0b3JzLmZpbmQoKHt2YWxpZGF0b3I6c30pPT5zKG8pKSk9PW51bGw/dm9pZCAwOmwuY2xhc3NHcm91cElkfWNvbnN0ICQwPS9eXFsoLispXF0kLztmdW5jdGlvbiBrMih0KXtpZigkMC50ZXN0KHQpKXtjb25zdCBlPSQwLmV4ZWModClbMV0sbj1lPT1udWxsP3ZvaWQgMDplLnN1YnN0cmluZygwLGUuaW5kZXhPZigiOiIpKTtpZihuKXJldHVybiJhcmJpdHJhcnkuLiIrbn19ZnVuY3Rpb24gYjIodCl7Y29uc3R7dGhlbWU6ZSxwcmVmaXg6bn09dCxyPXtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119O3JldHVybiBUMihPYmplY3QuZW50cmllcyh0LmNsYXNzR3JvdXBzKSxuKS5mb3JFYWNoKChbbyxsXSk9PntYcChsLHIsbyxlKX0pLHJ9ZnVuY3Rpb24gWHAodCxlLG4scil7dC5mb3JFYWNoKGk9PntpZih0eXBlb2YgaT09InN0cmluZyIpe2NvbnN0IG89aT09PSIiP2U6VDAoZSxpKTtvLmNsYXNzR3JvdXBJZD1uO3JldHVybn1pZih0eXBlb2YgaT09ImZ1bmN0aW9uIil7aWYoJDIoaSkpe1hwKGkociksZSxuLHIpO3JldHVybn1lLnZhbGlkYXRvcnMucHVzaCh7dmFsaWRhdG9yOmksY2xhc3NHcm91cElkOm59KTtyZXR1cm59T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW28sbF0pPT57WHAobCxUMChlLG8pLG4scil9KX0pfWZ1bmN0aW9uIFQwKHQsZSl7bGV0IG49dDtyZXR1cm4gZS5zcGxpdChKbSkuZm9yRWFjaChyPT57bi5uZXh0UGFydC5oYXMocil8fG4ubmV4dFBhcnQuc2V0KHIse25leHRQYXJ0Om5ldyBNYXAsdmFsaWRhdG9yczpbXX0pLG49bi5uZXh0UGFydC5nZXQocil9KSxufWZ1bmN0aW9uICQyKHQpe3JldHVybiB0LmlzVGhlbWVHZXR0ZXJ9ZnVuY3Rpb24gVDIodCxlKXtyZXR1cm4gZT90Lm1hcCgoW24scl0pPT57Y29uc3QgaT1yLm1hcChvPT50eXBlb2Ygbz09InN0cmluZyI/ZStvOnR5cGVvZiBvPT0ib2JqZWN0Ij9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobykubWFwKChbbCxzXSk9PltlK2wsc10pKTpvKTtyZXR1cm5bbixpXX0pOnR9ZnVuY3Rpb24gTjIodCl7aWYodDwxKXJldHVybntnZXQ6KCk9Pnt9LHNldDooKT0+e319O2xldCBlPTAsbj1uZXcgTWFwLHI9bmV3IE1hcDtmdW5jdGlvbiBpKG8sbCl7bi5zZXQobyxsKSxlKyssZT50JiYoZT0wLHI9bixuPW5ldyBNYXApfXJldHVybntnZXQobyl7bGV0IGw9bi5nZXQobyk7aWYobCE9PXZvaWQgMClyZXR1cm4gbDtpZigobD1yLmdldChvKSkhPT12b2lkIDApcmV0dXJuIGkobyxsKSxsfSxzZXQobyxsKXtuLmhhcyhvKT9uLnNldChvLGwpOmkobyxsKX19fWNvbnN0IGRTPSIhIjtmdW5jdGlvbiBSMih0KXtjb25zdCBlPXQuc2VwYXJhdG9yLG49ZS5sZW5ndGg9PT0xLHI9ZVswXSxpPWUubGVuZ3RoO3JldHVybiBmdW5jdGlvbihsKXtjb25zdCBzPVtdO2xldCBhPTAsdT0wLGM7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2xldCB3PWxbZ107aWYoYT09PTApe2lmKHc9PT1yJiYobnx8bC5zbGljZShnLGcraSk9PT1lKSl7cy5wdXNoKGwuc2xpY2UodSxnKSksdT1nK2k7Y29udGludWV9aWYodz09PSIvIil7Yz1nO2NvbnRpbnVlfX13PT09IlsiP2ErKzp3PT09Il0iJiZhLS19Y29uc3QgZD1zLmxlbmd0aD09PTA/bDpsLnN1YnN0cmluZyh1KSxmPWQuc3RhcnRzV2l0aChkUyksaD1mP2Quc3Vic3RyaW5nKDEpOmQsbT1jJiZjPnU/Yy11OnZvaWQgMDtyZXR1cm57bW9kaWZpZXJzOnMsaGFzSW1wb3J0YW50TW9kaWZpZXI6ZixiYXNlQ2xhc3NOYW1lOmgsbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbjptfX19ZnVuY3Rpb24gTzIodCl7aWYodC5sZW5ndGg8PTEpcmV0dXJuIHQ7Y29uc3QgZT1bXTtsZXQgbj1bXTtyZXR1cm4gdC5mb3JFYWNoKHI9PntyWzBdPT09IlsiPyhlLnB1c2goLi4ubi5zb3J0KCksciksbj1bXSk6bi5wdXNoKHIpfSksZS5wdXNoKC4uLm4uc29ydCgpKSxlfWZ1bmN0aW9uIFAyKHQpe3JldHVybntjYWNoZTpOMih0LmNhY2hlU2l6ZSksc3BsaXRNb2RpZmllcnM6UjIodCksLi4uQzIodCl9fWNvbnN0IEEyPS9ccysvO2Z1bmN0aW9uIE0yKHQsZSl7Y29uc3R7c3BsaXRNb2RpZmllcnM6bixnZXRDbGFzc0dyb3VwSWQ6cixnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6aX09ZSxvPW5ldyBTZXQ7cmV0dXJuIHQudHJpbSgpLnNwbGl0KEEyKS5tYXAobD0+e2NvbnN0e21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmEsYmFzZUNsYXNzTmFtZTp1LG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Y309bihsKTtsZXQgZD1yKGM/dS5zdWJzdHJpbmcoMCxjKTp1KSxmPSEhYztpZighZCl7aWYoIWMpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtpZihkPXIodSksIWQpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtmPSExfWNvbnN0IGg9TzIocykuam9pbigiOiIpO3JldHVybntpc1RhaWx3aW5kQ2xhc3M6ITAsbW9kaWZpZXJJZDphP2grZFM6aCxjbGFzc0dyb3VwSWQ6ZCxvcmlnaW5hbENsYXNzTmFtZTpsLGhhc1Bvc3RmaXhNb2RpZmllcjpmfX0pLnJldmVyc2UoKS5maWx0ZXIobD0+e2lmKCFsLmlzVGFpbHdpbmRDbGFzcylyZXR1cm4hMDtjb25zdHttb2RpZmllcklkOnMsY2xhc3NHcm91cElkOmEsaGFzUG9zdGZpeE1vZGlmaWVyOnV9PWwsYz1zK2E7cmV0dXJuIG8uaGFzKGMpPyExOihvLmFkZChjKSxpKGEsdSkuZm9yRWFjaChkPT5vLmFkZChzK2QpKSwhMCl9KS5yZXZlcnNlKCkubWFwKGw9Pmwub3JpZ2luYWxDbGFzc05hbWUpLmpvaW4oIiAiKX1mdW5jdGlvbiBMMigpe2xldCB0PTAsZSxuLHI9IiI7Zm9yKDt0PGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1t0KytdKSYmKG49ZlMoZSkpJiYociYmKHIrPSIgIikscis9bik7cmV0dXJuIHJ9ZnVuY3Rpb24gZlModCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2xldCBlLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspdFtyXSYmKGU9ZlModFtyXSkpJiYobiYmKG4rPSIgIiksbis9ZSk7cmV0dXJuIG59ZnVuY3Rpb24gSTIodCwuLi5lKXtsZXQgbixyLGksbz1sO2Z1bmN0aW9uIGwoYSl7Y29uc3QgdT1lLnJlZHVjZSgoYyxkKT0+ZChjKSx0KCkpO3JldHVybiBuPVAyKHUpLHI9bi5jYWNoZS5nZXQsaT1uLmNhY2hlLnNldCxvPXMscyhhKX1mdW5jdGlvbiBzKGEpe2NvbnN0IHU9cihhKTtpZih1KXJldHVybiB1O2NvbnN0IGM9TTIoYSxuKTtyZXR1cm4gaShhLGMpLGN9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG8oTDIuYXBwbHkobnVsbCxhcmd1bWVudHMpKX19ZnVuY3Rpb24gcWUodCl7Y29uc3QgZT1uPT5uW3RdfHxbXTtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyPSEwLGV9Y29uc3QgaFM9L15cWyg/OihbYS16LV0rKTopPyguKylcXSQvaSxEMj0vXlxkK1wvXGQrJC8sajI9bmV3IFNldChbInB4IiwiZnVsbCIsInNjcmVlbiJdKSx6Mj0vXihcZCsoXC5cZCspPyk/KHhzfHNtfG1kfGxnfHhsKSQvLEYyPS9cZCsoJXxweHxyP2VtfFtzZGxdP3YoW2h3aWJdfG1pbnxtYXgpfHB0fHBjfGlufGNtfG1tfGNhcHxjaHxleHxyP2xofGNxKHd8aHxpfGJ8bWlufG1heCkpfFxiKGNhbGN8bWlufG1heHxjbGFtcClcKC4rXCl8XjAkLyxCMj0vXi0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxVMj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvO2Z1bmN0aW9uIGNyKHQpe3JldHVybiBPbyh0KXx8ajIuaGFzKHQpfHxEMi50ZXN0KHQpfWZ1bmN0aW9uIFRpKHQpe3JldHVybiBFcyh0LCJsZW5ndGgiLFgyKX1mdW5jdGlvbiBPbyh0KXtyZXR1cm4hIXQmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKHQpKX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gRXModCwibnVtYmVyIixPbyl9ZnVuY3Rpb24gUXModCl7cmV0dXJuISF0JiZOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcih0KSl9ZnVuY3Rpb24gVzIodCl7cmV0dXJuIHQuZW5kc1dpdGgoIiUiKSYmT28odC5zbGljZSgwLC0xKSl9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIGhTLnRlc3QodCl9ZnVuY3Rpb24gTmkodCl7cmV0dXJuIHoyLnRlc3QodCl9Y29uc3QgVjI9bmV3IFNldChbImxlbmd0aCIsInNpemUiLCJwZXJjZW50YWdlIl0pO2Z1bmN0aW9uIEgyKHQpe3JldHVybiBFcyh0LFYyLHBTKX1mdW5jdGlvbiBLMih0KXtyZXR1cm4gRXModCwicG9zaXRpb24iLHBTKX1jb25zdCBaMj1uZXcgU2V0KFsiaW1hZ2UiLCJ1cmwiXSk7ZnVuY3Rpb24gRzIodCl7cmV0dXJuIEVzKHQsWjIsSjIpfWZ1bmN0aW9uIFkyKHQpe3JldHVybiBFcyh0LCIiLFEyKX1mdW5jdGlvbiBKcygpe3JldHVybiEwfWZ1bmN0aW9uIEVzKHQsZSxuKXtjb25zdCByPWhTLmV4ZWModCk7cmV0dXJuIHI/clsxXT90eXBlb2YgZT09InN0cmluZyI/clsxXT09PWU6ZS5oYXMoclsxXSk6bihyWzJdKTohMX1mdW5jdGlvbiBYMih0KXtyZXR1cm4gRjIudGVzdCh0KX1mdW5jdGlvbiBwUygpe3JldHVybiExfWZ1bmN0aW9uIFEyKHQpe3JldHVybiBCMi50ZXN0KHQpfWZ1bmN0aW9uIEoyKHQpe3JldHVybiBVMi50ZXN0KHQpfWZ1bmN0aW9uIHEyKCl7Y29uc3QgdD1xZSgiY29sb3JzIiksZT1xZSgic3BhY2luZyIpLG49cWUoImJsdXIiKSxyPXFlKCJicmlnaHRuZXNzIiksaT1xZSgiYm9yZGVyQ29sb3IiKSxvPXFlKCJib3JkZXJSYWRpdXMiKSxsPXFlKCJib3JkZXJTcGFjaW5nIikscz1xZSgiYm9yZGVyV2lkdGgiKSxhPXFlKCJjb250cmFzdCIpLHU9cWUoImdyYXlzY2FsZSIpLGM9cWUoImh1ZVJvdGF0ZSIpLGQ9cWUoImludmVydCIpLGY9cWUoImdhcCIpLGg9cWUoImdyYWRpZW50Q29sb3JTdG9wcyIpLG09cWUoImdyYWRpZW50Q29sb3JTdG9wUG9zaXRpb25zIiksZz1xZSgiaW5zZXQiKSx3PXFlKCJtYXJnaW4iKSx2PXFlKCJvcGFjaXR5IikseT1xZSgicGFkZGluZyIpLHg9cWUoInNhdHVyYXRlIiksUz1xZSgic2NhbGUiKSxiPXFlKCJzZXBpYSIpLFQ9cWUoInNrZXciKSwkPXFlKCJzcGFjZSIpLE89cWUoInRyYW5zbGF0ZSIpLEw9KCk9PlsiYXV0byIsImNvbnRhaW4iLCJub25lIl0sUD0oKT0+WyJhdXRvIiwiaGlkZGVuIiwiY2xpcCIsInZpc2libGUiLCJzY3JvbGwiXSxEPSgpPT5bImF1dG8iLFNlLGVdLEI9KCk9PltTZSxlXSxvZT0oKT0+WyIiLGNyLFRpXSxIPSgpPT5bImF1dG8iLE9vLFNlXSxaPSgpPT5bImJvdHRvbSIsImNlbnRlciIsImxlZnQiLCJsZWZ0LWJvdHRvbSIsImxlZnQtdG9wIiwicmlnaHQiLCJyaWdodC1ib3R0b20iLCJyaWdodC10b3AiLCJ0b3AiXSxDPSgpPT5bInNvbGlkIiwiZGFzaGVkIiwiZG90dGVkIiwiZG91YmxlIiwibm9uZSJdLGs9KCk9Plsibm9ybWFsIiwibXVsdGlwbHkiLCJzY3JlZW4iLCJvdmVybGF5IiwiZGFya2VuIiwibGlnaHRlbiIsImNvbG9yLWRvZGdlIiwiY29sb3ItYnVybiIsImhhcmQtbGlnaHQiLCJzb2Z0LWxpZ2h0IiwiZGlmZmVyZW5jZSIsImV4Y2x1c2lvbiIsImh1ZSIsInNhdHVyYXRpb24iLCJjb2xvciIsImx1bWlub3NpdHkiLCJwbHVzLWxpZ2h0ZXIiXSxFPSgpPT5bInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmV0d2VlbiIsImFyb3VuZCIsImV2ZW5seSIsInN0cmV0Y2giXSxBPSgpPT5bIiIsIjAiLFNlXSxOPSgpPT5bImF1dG8iLCJhdm9pZCIsImFsbCIsImF2b2lkLXBhZ2UiLCJwYWdlIiwibGVmdCIsInJpZ2h0IiwiY29sdW1uIl0sRj0oKT0+W09vLHBjXSxLPSgpPT5bT28sU2VdO3JldHVybntjYWNoZVNpemU6NTAwLHNlcGFyYXRvcjoiOiIsdGhlbWU6e2NvbG9yczpbSnNdLHNwYWNpbmc6W2NyLFRpXSxibHVyOlsibm9uZSIsIiIsTmksU2VdLGJyaWdodG5lc3M6RigpLGJvcmRlckNvbG9yOlt0XSxib3JkZXJSYWRpdXM6WyJub25lIiwiIiwiZnVsbCIsTmksU2VdLGJvcmRlclNwYWNpbmc6QigpLGJvcmRlcldpZHRoOm9lKCksY29udHJhc3Q6RigpLGdyYXlzY2FsZTpBKCksaHVlUm90YXRlOksoKSxpbnZlcnQ6QSgpLGdhcDpCKCksZ3JhZGllbnRDb2xvclN0b3BzOlt0XSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbVzIsVGldLGluc2V0OkQoKSxtYXJnaW46RCgpLG9wYWNpdHk6RigpLHBhZGRpbmc6QigpLHNhdHVyYXRlOkYoKSxzY2FsZTpGKCksc2VwaWE6QSgpLHNrZXc6SygpLHNwYWNlOkIoKSx0cmFuc2xhdGU6QigpfSxjbGFzc0dyb3Vwczp7YXNwZWN0Olt7YXNwZWN0OlsiYXV0byIsInNxdWFyZSIsInZpZGVvIixTZV19XSxjb250YWluZXI6WyJjb250YWluZXIiXSxjb2x1bW5zOlt7Y29sdW1uczpbTmldfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6TigpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjpOKCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOlsiYXV0byIsImF2b2lkIiwiYXZvaWQtcGFnZSIsImF2b2lkLWNvbHVtbiJdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6WyJzbGljZSIsImNsb25lIl19XSxib3g6W3tib3g6WyJib3JkZXIiLCJjb250ZW50Il19XSxkaXNwbGF5OlsiYmxvY2siLCJpbmxpbmUtYmxvY2siLCJpbmxpbmUiLCJmbGV4IiwiaW5saW5lLWZsZXgiLCJ0YWJsZSIsImlubGluZS10YWJsZSIsInRhYmxlLWNhcHRpb24iLCJ0YWJsZS1jZWxsIiwidGFibGUtY29sdW1uIiwidGFibGUtY29sdW1uLWdyb3VwIiwidGFibGUtZm9vdGVyLWdyb3VwIiwidGFibGUtaGVhZGVyLWdyb3VwIiwidGFibGUtcm93LWdyb3VwIiwidGFibGUtcm93IiwiZmxvdy1yb290IiwiZ3JpZCIsImlubGluZS1ncmlkIiwiY29udGVudHMiLCJsaXN0LWl0ZW0iLCJoaWRkZW4iXSxmbG9hdDpbe2Zsb2F0OlsicmlnaHQiLCJsZWZ0Iiwibm9uZSJdfV0sY2xlYXI6W3tjbGVhcjpbImxlZnQiLCJyaWdodCIsImJvdGgiLCJub25lIl19XSxpc29sYXRpb246WyJpc29sYXRlIiwiaXNvbGF0aW9uLWF1dG8iXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6WyJjb250YWluIiwiY292ZXIiLCJmaWxsIiwibm9uZSIsInNjYWxlLWRvd24iXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OlsuLi5aKCksU2VdfV0sb3ZlcmZsb3c6W3tvdmVyZmxvdzpQKCl9XSwib3ZlcmZsb3cteCI6W3sib3ZlcmZsb3cteCI6UCgpfV0sIm92ZXJmbG93LXkiOlt7Im92ZXJmbG93LXkiOlAoKX1dLG92ZXJzY3JvbGw6W3tvdmVyc2Nyb2xsOkwoKX1dLCJvdmVyc2Nyb2xsLXgiOlt7Im92ZXJzY3JvbGwteCI6TCgpfV0sIm92ZXJzY3JvbGwteSI6W3sib3ZlcnNjcm9sbC15IjpMKCl9XSxwb3NpdGlvbjpbInN0YXRpYyIsImZpeGVkIiwiYWJzb2x1dGUiLCJyZWxhdGl2ZSIsInN0aWNreSJdLGluc2V0Olt7aW5zZXQ6W2ddfV0sImluc2V0LXgiOlt7Imluc2V0LXgiOltnXX1dLCJpbnNldC15IjpbeyJpbnNldC15IjpbZ119XSxzdGFydDpbe3N0YXJ0OltnXX1dLGVuZDpbe2VuZDpbZ119XSx0b3A6W3t0b3A6W2ddfV0scmlnaHQ6W3tyaWdodDpbZ119XSxib3R0b206W3tib3R0b206W2ddfV0sbGVmdDpbe2xlZnQ6W2ddfV0sdmlzaWJpbGl0eTpbInZpc2libGUiLCJpbnZpc2libGUiLCJjb2xsYXBzZSJdLHo6W3t6OlsiYXV0byIsUXMsU2VdfV0sYmFzaXM6W3tiYXNpczpEKCl9XSwiZmxleC1kaXJlY3Rpb24iOlt7ZmxleDpbInJvdyIsInJvdy1yZXZlcnNlIiwiY29sIiwiY29sLXJldmVyc2UiXX1dLCJmbGV4LXdyYXAiOlt7ZmxleDpbIndyYXAiLCJ3cmFwLXJldmVyc2UiLCJub3dyYXAiXX1dLGZsZXg6W3tmbGV4OlsiMSIsImF1dG8iLCJpbml0aWFsIiwibm9uZSIsU2VdfV0sZ3Jvdzpbe2dyb3c6QSgpfV0sc2hyaW5rOlt7c2hyaW5rOkEoKX1dLG9yZGVyOlt7b3JkZXI6WyJmaXJzdCIsImxhc3QiLCJub25lIixRcyxTZV19XSwiZ3JpZC1jb2xzIjpbeyJncmlkLWNvbHMiOltKc119XSwiY29sLXN0YXJ0LWVuZCI6W3tjb2w6WyJhdXRvIix7c3BhbjpbImZ1bGwiLFFzLFNlXX0sU2VdfV0sImNvbC1zdGFydCI6W3siY29sLXN0YXJ0IjpIKCl9XSwiY29sLWVuZCI6W3siY29sLWVuZCI6SCgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjpbSnNdfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlsiYXV0byIse3NwYW46W1FzLFNlXX0sU2VdfV0sInJvdy1zdGFydCI6W3sicm93LXN0YXJ0IjpIKCl9XSwicm93LWVuZCI6W3sicm93LWVuZCI6SCgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbInJvdyIsImNvbCIsImRlbnNlIiwicm93LWRlbnNlIiwiY29sLWRlbnNlIl19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIixTZV19XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIixTZV19XSxnYXA6W3tnYXA6W2ZdfV0sImdhcC14IjpbeyJnYXAteCI6W2ZdfV0sImdhcC15IjpbeyJnYXAteSI6W2ZdfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5Olsibm9ybWFsIiwuLi5FKCldfV0sImp1c3RpZnktaXRlbXMiOlt7Imp1c3RpZnktaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIl19XSwianVzdGlmeS1zZWxmIjpbeyJqdXN0aWZ5LXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbIm5vcm1hbCIsLi4uRSgpLCJiYXNlbGluZSJdfV0sImFsaWduLWl0ZW1zIjpbe2l0ZW1zOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIiwiYmFzZWxpbmUiXX1dLCJwbGFjZS1jb250ZW50IjpbeyJwbGFjZS1jb250ZW50IjpbLi4uRSgpLCJiYXNlbGluZSJdfV0sInBsYWNlLWl0ZW1zIjpbeyJwbGFjZS1pdGVtcyI6WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJhc2VsaW5lIiwic3RyZXRjaCJdfV0sInBsYWNlLXNlbGYiOlt7InBsYWNlLXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0scDpbe3A6W3ldfV0scHg6W3tweDpbeV19XSxweTpbe3B5Olt5XX1dLHBzOlt7cHM6W3ldfV0scGU6W3twZTpbeV19XSxwdDpbe3B0Olt5XX1dLHByOlt7cHI6W3ldfV0scGI6W3twYjpbeV19XSxwbDpbe3BsOlt5XX1dLG06W3ttOlt3XX1dLG14Olt7bXg6W3ddfV0sbXk6W3tteTpbd119XSxtczpbe21zOlt3XX1dLG1lOlt7bWU6W3ddfV0sbXQ6W3ttdDpbd119XSxtcjpbe21yOlt3XX1dLG1iOlt7bWI6W3ddfV0sbWw6W3ttbDpbd119XSwic3BhY2UteCI6W3sic3BhY2UteCI6WyRdfV0sInNwYWNlLXgtcmV2ZXJzZSI6WyJzcGFjZS14LXJldmVyc2UiXSwic3BhY2UteSI6W3sic3BhY2UteSI6WyRdfV0sInNwYWNlLXktcmV2ZXJzZSI6WyJzcGFjZS15LXJldmVyc2UiXSx3Olt7dzpbImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiLFNlLGVdfV0sIm1pbi13IjpbeyJtaW4tdyI6WyJtaW4iLCJtYXgiLCJmaXQiLFNlLGNyXX1dLCJtYXgtdyI6W3sibWF4LXciOlsiMCIsIm5vbmUiLCJmdWxsIiwibWluIiwibWF4IiwiZml0IiwicHJvc2UiLHtzY3JlZW46W05pXX0sTmksU2VdfV0saDpbe2g6W1NlLGUsImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiXX1dLCJtaW4taCI6W3sibWluLWgiOlsibWluIiwibWF4IiwiZml0IixjcixTZV19XSwibWF4LWgiOlt7Im1heC1oIjpbU2UsZSwibWluIiwibWF4IiwiZml0Il19XSwiZm9udC1zaXplIjpbe3RleHQ6WyJiYXNlIixOaSxUaV19XSwiZm9udC1zbW9vdGhpbmciOlsiYW50aWFsaWFzZWQiLCJzdWJwaXhlbC1hbnRpYWxpYXNlZCJdLCJmb250LXN0eWxlIjpbIml0YWxpYyIsIm5vdC1pdGFsaWMiXSwiZm9udC13ZWlnaHQiOlt7Zm9udDpbInRoaW4iLCJleHRyYWxpZ2h0IiwibGlnaHQiLCJub3JtYWwiLCJtZWRpdW0iLCJzZW1pYm9sZCIsImJvbGQiLCJleHRyYWJvbGQiLCJibGFjayIscGNdfV0sImZvbnQtZmFtaWx5Ijpbe2ZvbnQ6W0pzXX1dLCJmdm4tbm9ybWFsIjpbIm5vcm1hbC1udW1zIl0sImZ2bi1vcmRpbmFsIjpbIm9yZGluYWwiXSwiZnZuLXNsYXNoZWQtemVybyI6WyJzbGFzaGVkLXplcm8iXSwiZnZuLWZpZ3VyZSI6WyJsaW5pbmctbnVtcyIsIm9sZHN0eWxlLW51bXMiXSwiZnZuLXNwYWNpbmciOlsicHJvcG9ydGlvbmFsLW51bXMiLCJ0YWJ1bGFyLW51bXMiXSwiZnZuLWZyYWN0aW9uIjpbImRpYWdvbmFsLWZyYWN0aW9ucyIsInN0YWNrZWQtZnJhY3RvbnMiXSx0cmFja2luZzpbe3RyYWNraW5nOlsidGlnaHRlciIsInRpZ2h0Iiwibm9ybWFsIiwid2lkZSIsIndpZGVyIiwid2lkZXN0IixTZV19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6WyJub25lIixPbyxwY119XSxsZWFkaW5nOlt7bGVhZGluZzpbIm5vbmUiLCJ0aWdodCIsInNudWciLCJub3JtYWwiLCJyZWxheGVkIiwibG9vc2UiLGNyLFNlXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbIm5vbmUiLFNlXX1dLCJsaXN0LXN0eWxlLXR5cGUiOlt7bGlzdDpbIm5vbmUiLCJkaXNjIiwiZGVjaW1hbCIsU2VdfV0sImxpc3Qtc3R5bGUtcG9zaXRpb24iOlt7bGlzdDpbImluc2lkZSIsIm91dHNpZGUiXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpbdF19XSwicGxhY2Vob2xkZXItb3BhY2l0eSI6W3sicGxhY2Vob2xkZXItb3BhY2l0eSI6W3ZdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJqdXN0aWZ5Iiwic3RhcnQiLCJlbmQiXX1dLCJ0ZXh0LWNvbG9yIjpbe3RleHQ6W3RdfV0sInRleHQtb3BhY2l0eSI6W3sidGV4dC1vcGFjaXR5Ijpbdl19XSwidGV4dC1kZWNvcmF0aW9uIjpbInVuZGVybGluZSIsIm92ZXJsaW5lIiwibGluZS10aHJvdWdoIiwibm8tdW5kZXJsaW5lIl0sInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6W3tkZWNvcmF0aW9uOlsuLi5DKCksIndhdnkiXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246WyJhdXRvIiwiZnJvbS1mb250IixjcixUaV19XSwidW5kZXJsaW5lLW9mZnNldCI6W3sidW5kZXJsaW5lLW9mZnNldCI6WyJhdXRvIixjcixTZV19XSwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIjpbe2RlY29yYXRpb246W3RdfV0sInRleHQtdHJhbnNmb3JtIjpbInVwcGVyY2FzZSIsImxvd2VyY2FzZSIsImNhcGl0YWxpemUiLCJub3JtYWwtY2FzZSJdLCJ0ZXh0LW92ZXJmbG93IjpbInRydW5jYXRlIiwidGV4dC1lbGxpcHNpcyIsInRleHQtY2xpcCJdLGluZGVudDpbe2luZGVudDpCKCl9XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246WyJiYXNlbGluZSIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSIsInRleHQtdG9wIiwidGV4dC1ib3R0b20iLCJzdWIiLCJzdXBlciIsU2VdfV0sd2hpdGVzcGFjZTpbe3doaXRlc3BhY2U6WyJub3JtYWwiLCJub3dyYXAiLCJwcmUiLCJwcmUtbGluZSIsInByZS13cmFwIiwiYnJlYWstc3BhY2VzIl19XSxicmVhazpbe2JyZWFrOlsibm9ybWFsIiwid29yZHMiLCJhbGwiLCJrZWVwIl19XSxoeXBoZW5zOlt7aHlwaGVuczpbIm5vbmUiLCJtYW51YWwiLCJhdXRvIl19XSxjb250ZW50Olt7Y29udGVudDpbIm5vbmUiLFNlXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOlsiZml4ZWQiLCJsb2NhbCIsInNjcm9sbCJdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOlsiYm9yZGVyIiwicGFkZGluZyIsImNvbnRlbnQiLCJ0ZXh0Il19XSwiYmctb3BhY2l0eSI6W3siYmctb3BhY2l0eSI6W3ZdfV0sImJnLW9yaWdpbiI6W3siYmctb3JpZ2luIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50Il19XSwiYmctcG9zaXRpb24iOlt7Ymc6Wy4uLlooKSxLMl19XSwiYmctcmVwZWF0Ijpbe2JnOlsibm8tcmVwZWF0Iix7cmVwZWF0OlsiIiwieCIsInkiLCJyb3VuZCIsInNwYWNlIl19XX1dLCJiZy1zaXplIjpbe2JnOlsiYXV0byIsImNvdmVyIiwiY29udGFpbiIsSDJdfV0sImJnLWltYWdlIjpbe2JnOlsibm9uZSIseyJncmFkaWVudC10byI6WyJ0IiwidHIiLCJyIiwiYnIiLCJiIiwiYmwiLCJsIiwidGwiXX0sRzJdfV0sImJnLWNvbG9yIjpbe2JnOlt0XX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOlttXX1dLCJncmFkaWVudC12aWEtcG9zIjpbe3ZpYTpbbV19XSwiZ3JhZGllbnQtdG8tcG9zIjpbe3RvOlttXX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206W2hdfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6W2hdfV0sImdyYWRpZW50LXRvIjpbe3RvOltoXX1dLHJvdW5kZWQ6W3tyb3VuZGVkOltvXX1dLCJyb3VuZGVkLXMiOlt7InJvdW5kZWQtcyI6W29dfV0sInJvdW5kZWQtZSI6W3sicm91bmRlZC1lIjpbb119XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOltvXX1dLCJyb3VuZGVkLXIiOlt7InJvdW5kZWQtciI6W29dfV0sInJvdW5kZWQtYiI6W3sicm91bmRlZC1iIjpbb119XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOltvXX1dLCJyb3VuZGVkLXNzIjpbeyJyb3VuZGVkLXNzIjpbb119XSwicm91bmRlZC1zZSI6W3sicm91bmRlZC1zZSI6W29dfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOltvXX1dLCJyb3VuZGVkLWVzIjpbeyJyb3VuZGVkLWVzIjpbb119XSwicm91bmRlZC10bCI6W3sicm91bmRlZC10bCI6W29dfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOltvXX1dLCJyb3VuZGVkLWJyIjpbeyJyb3VuZGVkLWJyIjpbb119XSwicm91bmRlZC1ibCI6W3sicm91bmRlZC1ibCI6W29dfV0sImJvcmRlci13Ijpbe2JvcmRlcjpbc119XSwiYm9yZGVyLXcteCI6W3siYm9yZGVyLXgiOltzXX1dLCJib3JkZXItdy15IjpbeyJib3JkZXIteSI6W3NdfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjpbc119XSwiYm9yZGVyLXctZSI6W3siYm9yZGVyLWUiOltzXX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6W3NdfV0sImJvcmRlci13LXIiOlt7ImJvcmRlci1yIjpbc119XSwiYm9yZGVyLXctYiI6W3siYm9yZGVyLWIiOltzXX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6W3NdfV0sImJvcmRlci1vcGFjaXR5IjpbeyJib3JkZXItb3BhY2l0eSI6W3ZdfV0sImJvcmRlci1zdHlsZSI6W3tib3JkZXI6Wy4uLkMoKSwiaGlkZGVuIl19XSwiZGl2aWRlLXgiOlt7ImRpdmlkZS14Ijpbc119XSwiZGl2aWRlLXgtcmV2ZXJzZSI6WyJkaXZpZGUteC1yZXZlcnNlIl0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6W3NdfV0sImRpdmlkZS15LXJldmVyc2UiOlsiZGl2aWRlLXktcmV2ZXJzZSJdLCJkaXZpZGUtb3BhY2l0eSI6W3siZGl2aWRlLW9wYWNpdHkiOlt2XX1dLCJkaXZpZGUtc3R5bGUiOlt7ZGl2aWRlOkMoKX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOltpXX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOltpXX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOltpXX1dLCJib3JkZXItY29sb3ItdCI6W3siYm9yZGVyLXQiOltpXX1dLCJib3JkZXItY29sb3ItciI6W3siYm9yZGVyLXIiOltpXX1dLCJib3JkZXItY29sb3ItYiI6W3siYm9yZGVyLWIiOltpXX1dLCJib3JkZXItY29sb3ItbCI6W3siYm9yZGVyLWwiOltpXX1dLCJkaXZpZGUtY29sb3IiOlt7ZGl2aWRlOltpXX1dLCJvdXRsaW5lLXN0eWxlIjpbe291dGxpbmU6WyIiLC4uLkMoKV19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbY3IsU2VdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltjcixUaV19XSwib3V0bGluZS1jb2xvciI6W3tvdXRsaW5lOlt0XX1dLCJyaW5nLXciOlt7cmluZzpvZSgpfV0sInJpbmctdy1pbnNldCI6WyJyaW5nLWluc2V0Il0sInJpbmctY29sb3IiOlt7cmluZzpbdF19XSwicmluZy1vcGFjaXR5IjpbeyJyaW5nLW9wYWNpdHkiOlt2XX1dLCJyaW5nLW9mZnNldC13IjpbeyJyaW5nLW9mZnNldCI6W2NyLFRpXX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOlt0XX1dLHNoYWRvdzpbe3NoYWRvdzpbIiIsImlubmVyIiwibm9uZSIsTmksWTJdfV0sInNoYWRvdy1jb2xvciI6W3tzaGFkb3c6W0pzXX1dLG9wYWNpdHk6W3tvcGFjaXR5Olt2XX1dLCJtaXgtYmxlbmQiOlt7Im1peC1ibGVuZCI6aygpfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6aygpfV0sZmlsdGVyOlt7ZmlsdGVyOlsiIiwibm9uZSJdfV0sYmx1cjpbe2JsdXI6W25dfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W3JdfV0sY29udHJhc3Q6W3tjb250cmFzdDpbYV19XSwiZHJvcC1zaGFkb3ciOlt7ImRyb3Atc2hhZG93IjpbIiIsIm5vbmUiLE5pLFNlXX1dLGdyYXlzY2FsZTpbe2dyYXlzY2FsZTpbdV19XSwiaHVlLXJvdGF0ZSI6W3siaHVlLXJvdGF0ZSI6W2NdfV0saW52ZXJ0Olt7aW52ZXJ0OltkXX1dLHNhdHVyYXRlOlt7c2F0dXJhdGU6W3hdfV0sc2VwaWE6W3tzZXBpYTpbYl19XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOlsiIiwibm9uZSJdfV0sImJhY2tkcm9wLWJsdXIiOlt7ImJhY2tkcm9wLWJsdXIiOltuXX1dLCJiYWNrZHJvcC1icmlnaHRuZXNzIjpbeyJiYWNrZHJvcC1icmlnaHRuZXNzIjpbcl19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbYV19XSwiYmFja2Ryb3AtZ3JheXNjYWxlIjpbeyJiYWNrZHJvcC1ncmF5c2NhbGUiOlt1XX1dLCJiYWNrZHJvcC1odWUtcm90YXRlIjpbeyJiYWNrZHJvcC1odWUtcm90YXRlIjpbY119XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltkXX1dLCJiYWNrZHJvcC1vcGFjaXR5IjpbeyJiYWNrZHJvcC1vcGFjaXR5Ijpbdl19XSwiYmFja2Ryb3Atc2F0dXJhdGUiOlt7ImJhY2tkcm9wLXNhdHVyYXRlIjpbeF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpbYl19XSwiYm9yZGVyLWNvbGxhcHNlIjpbe2JvcmRlcjpbImNvbGxhcHNlIiwic2VwYXJhdGUiXX1dLCJib3JkZXItc3BhY2luZyI6W3siYm9yZGVyLXNwYWNpbmciOltsXX1dLCJib3JkZXItc3BhY2luZy14IjpbeyJib3JkZXItc3BhY2luZy14IjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteSI6W3siYm9yZGVyLXNwYWNpbmcteSI6W2xdfV0sInRhYmxlLWxheW91dCI6W3t0YWJsZTpbImF1dG8iLCJmaXhlZCJdfV0sY2FwdGlvbjpbe2NhcHRpb246WyJ0b3AiLCJib3R0b20iXX1dLHRyYW5zaXRpb246W3t0cmFuc2l0aW9uOlsibm9uZSIsImFsbCIsIiIsImNvbG9ycyIsIm9wYWNpdHkiLCJzaGFkb3ciLCJ0cmFuc2Zvcm0iLFNlXX1dLGR1cmF0aW9uOlt7ZHVyYXRpb246SygpfV0sZWFzZTpbe2Vhc2U6WyJsaW5lYXIiLCJpbiIsIm91dCIsImluLW91dCIsU2VdfV0sZGVsYXk6W3tkZWxheTpLKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIixTZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOltTXX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpbU119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W1NdfV0scm90YXRlOlt7cm90YXRlOltRcyxTZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbT119XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbT119XSwic2tldy14IjpbeyJza2V3LXgiOltUXX1dLCJza2V3LXkiOlt7InNrZXcteSI6W1RdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsU2VdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsdF19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0IixTZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W3RdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkIoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6QigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpCKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkIoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6QigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpCKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkIoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6QigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpCKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpCKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkIoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6QigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpCKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkIoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6QigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpCKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkIoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6QigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsU2VdfV0sZmlsbDpbe2ZpbGw6W3QsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W2NyLFRpLHBjXX1dLHN0cm9rZTpbe3N0cm9rZTpbdCwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IGVSPUkyKHEyKTtmdW5jdGlvbiB4dCguLi50KXtyZXR1cm4gZVIodVModCkpfWNvbnN0IFNhPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LGNoaWxkcmVuOmUsLi4ubn0scik9Pl8uanN4cyhzUyx7cmVmOnIsY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLHQpLC4uLm4sY2hpbGRyZW46W18uanN4KFMyLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOmV9KSxfLmpzeChnUyx7fSksXy5qc3goRTIse30pXX0pKTtTYS5kaXNwbGF5TmFtZT1zUy5kaXNwbGF5TmFtZTtjb25zdCBnUz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxvcmllbnRhdGlvbjplPSJ2ZXJ0aWNhbCIsLi4ubn0scik9Pl8uanN4KHF3LHtyZWY6cixvcmllbnRhdGlvbjplLGNsYXNzTmFtZTp4dCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIixlPT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIixlPT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsdCksLi4ubixjaGlsZHJlbjpfLmpzeChtMix7Y2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIixlPT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7Z1MuZGlzcGxheU5hbWU9cXcuZGlzcGxheU5hbWU7ZnVuY3Rpb24gRWEoe2NoaWxkcmVuOnR9KXtjb25zdCBlPXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksaT1wLnVzZVJlZigwKSxvPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxvLmN1cnJlbnQ9bnVsbCxpLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT13PT57dy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9by5jdXJyZW50PT09ImxlZnQiP2U6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1vLmN1cnJlbnQ9PT0ibGVmdCI/dy5zY3JlZW5YLWkuY3VycmVudDppLmN1cnJlbnQtdy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9dz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCB4PXc9PT0ibGVmdCI/ZTp3PT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLHgmJnguY3VycmVudCYmKGkuY3VycmVudD12LnNjcmVlblgsby5jdXJyZW50PXcseC5jdXJyZW50JiYobC5jdXJyZW50PXguY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsbSxnXT1wLkNoaWxkcmVuLnRvQXJyYXkodCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse3JlZjplLGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOltjLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSksXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6X2YoIiIseyJ3LWZ1bGwiOiFtJiYhZ30pLGNoaWxkcmVuOl8uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOltmLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxtfHxnJiZfLmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhFYS5Db2x1bW4se2NoaWxkcmVuOlttLF8uanN4KFNhLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpnfSldfSksXy5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfUVhLkNvbHVtbj0oe2NoaWxkcmVuOnR9KT0+e2NvbnN0W2Usbl09cC5DaGlsZHJlbi50b0FycmF5KHQpO3JldHVybiBfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOmV9KSxuXX0pfTtjb25zdCB0Uj0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6dCxjaGlsZHJlbjpbXy5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W18uanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLF8uanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSksXy5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLF8uanN4KCJkZWZzIix7Y2hpbGRyZW46Xy5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46Xy5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxtUz10UixuUj0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6dCxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W18uanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goImRlZnMiLHtjaGlsZHJlbjpfLmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjpfLmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHJSPW5SLGlSPSh7Y2xhc3NOYW1lOnR9KT0+Xy5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTp0LGNoaWxkcmVuOl8uanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46Xy5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksb1I9aVI7ZnVuY3Rpb24gdlMoe2NoaWxkcmVuOnQscm9vdFBhdGg6ZX0pe3JldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKHQsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W2VdfSkpfSl9dlMuTm9kZT0oe2NoaWxkcmVuOnQscGF0aHM6ZT1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6aSxzZXRBY3RpdmVQYXRoOm99KT0+e2NvbnN0IGw9ciozMCxzPWk9PT0ic3RyaW5nIj9fLmpzeChvUix7fSk6aT09PSJpbWFnZSI/Xy5qc3gobVMse2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOl8uanN4KHJSLHt9KTtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W18uanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e28mJm8obil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLF8uanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksdCYmXy5qc3goXy5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAodCxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLmUsbl19KSl9KV19KX07ZnVuY3Rpb24gcW0oKXtyZXR1cm57YXN5bmM6ITEsYnJlYWtzOiExLGV4dGVuc2lvbnM6bnVsbCxnZm06ITAsaG9va3M6bnVsbCxwZWRhbnRpYzohMSxyZW5kZXJlcjpudWxsLHNpbGVudDohMSx0b2tlbml6ZXI6bnVsbCx3YWxrVG9rZW5zOm51bGx9fWxldCBsbD1xbSgpO2Z1bmN0aW9uIHlTKHQpe2xsPXR9Y29uc3QgeFM9L1smPD4iJ10vLGxSPW5ldyBSZWdFeHAoeFMuc291cmNlLCJnIiksX1M9L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLHNSPW5ldyBSZWdFeHAoX1Muc291cmNlLCJnIiksYVI9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LE4wPXQ9PmFSW3RdO2Z1bmN0aW9uIE1uKHQsZSl7aWYoZSl7aWYoeFMudGVzdCh0KSlyZXR1cm4gdC5yZXBsYWNlKGxSLE4wKX1lbHNlIGlmKF9TLnRlc3QodCkpcmV0dXJuIHQucmVwbGFjZShzUixOMCk7cmV0dXJuIHR9Y29uc3QgdVI9LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWc7ZnVuY3Rpb24gY1IodCl7cmV0dXJuIHQucmVwbGFjZSh1UiwoZSxuKT0+KG49bi50b0xvd2VyQ2FzZSgpLG49PT0iY29sb24iPyI6IjpuLmNoYXJBdCgwKT09PSIjIj9uLmNoYXJBdCgxKT09PSJ4Ij9TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4uc3Vic3RyaW5nKDIpLDE2KSk6U3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpOiIiKSl9Y29uc3QgZFI9LyhefFteXFtdKVxeL2c7ZnVuY3Rpb24gQmUodCxlKXt0PXR5cGVvZiB0PT0ic3RyaW5nIj90OnQuc291cmNlLGU9ZXx8IiI7Y29uc3Qgbj17cmVwbGFjZToocixpKT0+KGk9dHlwZW9mIGk9PSJvYmplY3QiJiYic291cmNlImluIGk/aS5zb3VyY2U6aSxpPWkucmVwbGFjZShkUiwiJDEiKSx0PXQucmVwbGFjZShyLGkpLG4pLGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKHQsZSl9O3JldHVybiBufWZ1bmN0aW9uIFIwKHQpe3RyeXt0PWVuY29kZVVSSSh0KS5yZXBsYWNlKC8lMjUvZywiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiB0fWNvbnN0IHdkPXtleGVjOigpPT5udWxsfTtmdW5jdGlvbiBPMCh0LGUpe2NvbnN0IG49dC5yZXBsYWNlKC9cfC9nLChvLGwscyk9PntsZXQgYT0hMSx1PWw7Zm9yKDstLXU+PTAmJnNbdV09PT0iXFwiOylhPSFhO3JldHVybiBhPyJ8IjoiIHwifSkscj1uLnNwbGl0KC8gXHwvKTtsZXQgaT0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXJbci5sZW5ndGgtMV0udHJpbSgpJiZyLnBvcCgpLGUpaWYoci5sZW5ndGg+ZSlyLnNwbGljZShlKTtlbHNlIGZvcig7ci5sZW5ndGg8ZTspci5wdXNoKCIiKTtmb3IoO2k8ci5sZW5ndGg7aSsrKXJbaV09cltpXS50cmltKCkucmVwbGFjZSgvXFxcfC9nLCJ8Iik7cmV0dXJuIHJ9ZnVuY3Rpb24gZ2ModCxlLG4pe2NvbnN0IHI9dC5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IGk9MDtmb3IoO2k8cjspe2NvbnN0IG89dC5jaGFyQXQoci1pLTEpO2lmKG89PT1lJiYhbilpKys7ZWxzZSBpZihvIT09ZSYmbilpKys7ZWxzZSBicmVha31yZXR1cm4gdC5zbGljZSgwLHItaSl9ZnVuY3Rpb24gZlIodCxlKXtpZih0LmluZGV4T2YoZVsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWlmKHRbcl09PT0iXFwiKXIrKztlbHNlIGlmKHRbcl09PT1lWzBdKW4rKztlbHNlIGlmKHRbcl09PT1lWzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gUDAodCxlLG4scil7Y29uc3QgaT1lLmhyZWYsbz1lLnRpdGxlP01uKGUudGl0bGUpOm51bGwsbD10WzFdLnJlcGxhY2UoL1xcKFtcW1xdXSkvZywiJDEiKTtpZih0WzBdLmNoYXJBdCgwKSE9PSIhIil7ci5zdGF0ZS5pbkxpbms9ITA7Y29uc3Qgcz17dHlwZToibGluayIscmF3Om4saHJlZjppLHRpdGxlOm8sdGV4dDpsLHRva2VuczpyLmlubGluZVRva2VucyhsKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLHN9cmV0dXJue3R5cGU6ImltYWdlIixyYXc6bixocmVmOmksdGl0bGU6byx0ZXh0Ok1uKGwpfX1mdW5jdGlvbiBoUih0LGUpe2NvbnN0IG49dC5tYXRjaCgvXihccyspKD86YGBgKS8pO2lmKG49PT1udWxsKXJldHVybiBlO2NvbnN0IHI9blsxXTtyZXR1cm4gZS5zcGxpdChgCmApLm1hcChpPT57Y29uc3Qgbz1pLm1hdGNoKC9eXHMrLyk7aWYobz09PW51bGwpcmV0dXJuIGk7Y29uc3RbbF09bztyZXR1cm4gbC5sZW5ndGg+PXIubGVuZ3RoP2kuc2xpY2Uoci5sZW5ndGgpOml9KS5qb2luKGAKYCl9Y2xhc3MgU2R7Y29uc3RydWN0b3IoZSl7SmUodGhpcywib3B0aW9ucyIpO0plKHRoaXMsInJ1bGVzIik7SmUodGhpcywibGV4ZXIiKTt0aGlzLm9wdGlvbnM9ZXx8bGx9c3BhY2UoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhlKTtpZihuJiZuWzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3Om5bMF19fWNvZGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyhlKTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiB7MSw0fS9nbSwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuWzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/cjpnYyhyLGAKYCl9fX1mZW5jZXMoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blswXSxpPWhSKHIsblszXXx8IiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6cixsYW5nOm5bMl0/blsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzJdLHRleHQ6aX19fWhlYWRpbmcoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzJdLnRyaW0oKTtpZigvIyQvLnRlc3Qocikpe2NvbnN0IGk9Z2MociwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFpfHwvICQvLnRlc3QoaSkpJiYocj1pLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMV0ubGVuZ3RoLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX1ocihlKXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhlKTtpZihuKXJldHVybnt0eXBlOiJociIscmF3Om5bMF19fWJsb2NrcXVvdGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmJsb2NrcXVvdGUuZXhlYyhlKTtpZihuKXtjb25zdCByPWdjKG5bMF0ucmVwbGFjZSgvXiAqPlsgXHRdPy9nbSwiIiksYApgKSxpPXRoaXMubGV4ZXIuc3RhdGUudG9wO3RoaXMubGV4ZXIuc3RhdGUudG9wPSEwO2NvbnN0IG89dGhpcy5sZXhlci5ibG9ja1Rva2VucyhyKTtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS50b3A9aSx7dHlwZToiYmxvY2txdW90ZSIscmF3Om5bMF0sdG9rZW5zOm8sdGV4dDpyfX19bGlzdChlKXtsZXQgbj10aGlzLnJ1bGVzLmJsb2NrLmxpc3QuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzFdLnRyaW0oKTtjb25zdCBpPXIubGVuZ3RoPjEsbz17dHlwZToibGlzdCIscmF3OiIiLG9yZGVyZWQ6aSxzdGFydDppPytyLnNsaWNlKDAsLTEpOiIiLGxvb3NlOiExLGl0ZW1zOltdfTtyPWk/YFxcZHsxLDl9XFwke3Iuc2xpY2UoLTEpfWA6YFxcJHtyfWAsdGhpcy5vcHRpb25zLnBlZGFudGljJiYocj1pP3I6IlsqKy1dIik7Y29uc3QgbD1uZXcgUmVnRXhwKGBeKCB7MCwzfSR7cn0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCk7bGV0IHM9IiIsYT0iIix1PSExO2Zvcig7ZTspe2xldCBjPSExO2lmKCEobj1sLmV4ZWMoZSkpfHx0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3QoZSkpYnJlYWs7cz1uWzBdLGU9ZS5zdWJzdHJpbmcocy5sZW5ndGgpO2xldCBkPW5bMl0uc3BsaXQoYApgLDEpWzBdLnJlcGxhY2UoL15cdCsvLHY9PiIgIi5yZXBlYXQoMyp2Lmxlbmd0aCkpLGY9ZS5zcGxpdChgCmAsMSlbMF0saD0wO3RoaXMub3B0aW9ucy5wZWRhbnRpYz8oaD0yLGE9ZC50cmltU3RhcnQoKSk6KGg9blsyXS5zZWFyY2goL1teIF0vKSxoPWg+ND8xOmgsYT1kLnNsaWNlKGgpLGgrPW5bMV0ubGVuZ3RoKTtsZXQgbT0hMTtpZighZCYmL14gKiQvLnRlc3QoZikmJihzKz1mK2AKYCxlPWUuc3Vic3RyaW5nKGYubGVuZ3RoKzEpLGM9ITApLCFjKXtjb25zdCB2PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSx5PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSx4PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlxgXGBcYHx+fn4pYCksUz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0jYCk7Zm9yKDtlOyl7Y29uc3QgYj1lLnNwbGl0KGAKYCwxKVswXTtpZihmPWIsdGhpcy5vcHRpb25zLnBlZGFudGljJiYoZj1mLnJlcGxhY2UoL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZywiICAiKSkseC50ZXN0KGYpfHxTLnRlc3QoZil8fHYudGVzdChmKXx8eS50ZXN0KGUpKWJyZWFrO2lmKGYuc2VhcmNoKC9bXiBdLyk+PWh8fCFmLnRyaW0oKSlhKz1gCmArZi5zbGljZShoKTtlbHNle2lmKG18fGQuc2VhcmNoKC9bXiBdLyk+PTR8fHgudGVzdChkKXx8Uy50ZXN0KGQpfHx5LnRlc3QoZCkpYnJlYWs7YSs9YApgK2Z9IW0mJiFmLnRyaW0oKSYmKG09ITApLHMrPWIrYApgLGU9ZS5zdWJzdHJpbmcoYi5sZW5ndGgrMSksZD1mLnNsaWNlKGgpfX1vLmxvb3NlfHwodT9vLmxvb3NlPSEwOi9cbiAqXG4gKiQvLnRlc3QocykmJih1PSEwKSk7bGV0IGc9bnVsbCx3O3RoaXMub3B0aW9ucy5nZm0mJihnPS9eXFtbIHhYXVxdIC8uZXhlYyhhKSxnJiYodz1nWzBdIT09IlsgXSAiLGE9YS5yZXBsYWNlKC9eXFtbIHhYXVxdICsvLCIiKSkpLG8uaXRlbXMucHVzaCh7dHlwZToibGlzdF9pdGVtIixyYXc6cyx0YXNrOiEhZyxjaGVja2VkOncsbG9vc2U6ITEsdGV4dDphLHRva2VuczpbXX0pLG8ucmF3Kz1zfW8uaXRlbXNbby5pdGVtcy5sZW5ndGgtMV0ucmF3PXMudHJpbUVuZCgpLG8uaXRlbXNbby5pdGVtcy5sZW5ndGgtMV0udGV4dD1hLnRyaW1FbmQoKSxvLnJhdz1vLnJhdy50cmltRW5kKCk7Zm9yKGxldCBjPTA7YzxvLml0ZW1zLmxlbmd0aDtjKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsby5pdGVtc1tjXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhvLml0ZW1zW2NdLnRleHQsW10pLCFvLmxvb3NlKXtjb25zdCBkPW8uaXRlbXNbY10udG9rZW5zLmZpbHRlcihoPT5oLnR5cGU9PT0ic3BhY2UiKSxmPWQubGVuZ3RoPjAmJmQuc29tZShoPT4vXG4uKlxuLy50ZXN0KGgucmF3KSk7by5sb29zZT1mfWlmKG8ubG9vc2UpZm9yKGxldCBjPTA7YzxvLml0ZW1zLmxlbmd0aDtjKyspby5pdGVtc1tjXS5sb29zZT0hMDtyZXR1cm4gb319aHRtbChlKXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKGUpO2lmKG4pcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzpuWzBdLHByZTpuWzFdPT09InByZSJ8fG5bMV09PT0ic2NyaXB0Inx8blsxXT09PSJzdHlsZSIsdGV4dDpuWzBdfX1kZWYoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blsxXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCIgIiksaT1uWzJdP25bMl0ucmVwbGFjZSgvXjwoLiopPiQvLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6IiIsbz1uWzNdP25bM10uc3Vic3RyaW5nKDEsblszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpyLHJhdzpuWzBdLGhyZWY6aSx0aXRsZTpvfX19dGFibGUoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoZSk7aWYobil7aWYoIS9bOnxdLy50ZXN0KG5bMl0pKXJldHVybjtjb25zdCByPXt0eXBlOiJ0YWJsZSIscmF3Om5bMF0saGVhZGVyOk8wKG5bMV0pLm1hcChpPT4oe3RleHQ6aSx0b2tlbnM6W119KSksYWxpZ246blsyXS5yZXBsYWNlKC9eXHx8XHwgKiQvZywiIikuc3BsaXQoInwiKSxyb3dzOm5bM10mJm5bM10udHJpbSgpP25bM10ucmVwbGFjZSgvXG5bIFx0XSokLywiIikuc3BsaXQoYApgKTpbXX07aWYoci5oZWFkZXIubGVuZ3RoPT09ci5hbGlnbi5sZW5ndGgpe2xldCBpPXIuYWxpZ24ubGVuZ3RoLG8sbCxzLGE7Zm9yKG89MDtvPGk7bysrKXtjb25zdCB1PXIuYWxpZ25bb107dSYmKC9eICotKzogKiQvLnRlc3QodSk/ci5hbGlnbltvXT0icmlnaHQiOi9eICo6LSs6ICokLy50ZXN0KHUpP3IuYWxpZ25bb109ImNlbnRlciI6L14gKjotKyAqJC8udGVzdCh1KT9yLmFsaWduW29dPSJsZWZ0IjpyLmFsaWduW29dPW51bGwpfWZvcihpPXIucm93cy5sZW5ndGgsbz0wO288aTtvKyspci5yb3dzW29dPU8wKHIucm93c1tvXSxyLmhlYWRlci5sZW5ndGgpLm1hcCh1PT4oe3RleHQ6dSx0b2tlbnM6W119KSk7Zm9yKGk9ci5oZWFkZXIubGVuZ3RoLGw9MDtsPGk7bCsrKXIuaGVhZGVyW2xdLnRva2Vucz10aGlzLmxleGVyLmlubGluZShyLmhlYWRlcltsXS50ZXh0KTtmb3IoaT1yLnJvd3MubGVuZ3RoLGw9MDtsPGk7bCsrKWZvcihhPXIucm93c1tsXSxzPTA7czxhLmxlbmd0aDtzKyspYVtzXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoYVtzXS50ZXh0KTtyZXR1cm4gcn19fWxoZWFkaW5nKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKGUpO2lmKG4pcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0Om5bMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5bMV0pfX1wYXJhZ3JhcGgoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKGUpO2lmKG4pe2NvbnN0IHI9blsxXS5jaGFyQXQoblsxXS5sZW5ndGgtMSk9PT1gCmA/blsxXS5zbGljZSgwLC0xKTpuWzFdO3JldHVybnt0eXBlOiJwYXJhZ3JhcGgiLHJhdzpuWzBdLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX10ZXh0KGUpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpuWzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzBdKX19ZXNjYXBlKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToiZXNjYXBlIixyYXc6blswXSx0ZXh0Ok1uKG5bMV0pfX10YWcoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhlKTtpZihuKXJldHVybiF0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148YSAvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSEwOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rJiYvXjxcL2E+L2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSExKSwhdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjwocHJlfGNvZGV8a2JkfHNjcmlwdCkoXHN8PikvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJi9ePFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMSkse3R5cGU6Imh0bWwiLHJhdzpuWzBdLGluTGluazp0aGlzLmxleGVyLnN0YXRlLmluTGluayxpblJhd0Jsb2NrOnRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxibG9jazohMSx0ZXh0Om5bMF19fWxpbmsoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoZSk7aWYobil7Y29uc3Qgcj1uWzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiYvXjwvLnRlc3Qocikpe2lmKCEvPiQvLnRlc3QocikpcmV0dXJuO2NvbnN0IGw9Z2Moci5zbGljZSgwLC0xKSwiXFwiKTtpZigoci5sZW5ndGgtbC5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2NvbnN0IGw9ZlIoblsyXSwiKCkiKTtpZihsPi0xKXtjb25zdCBhPShuWzBdLmluZGV4T2YoIiEiKT09PTA/NTo0KStuWzFdLmxlbmd0aCtsO25bMl09blsyXS5zdWJzdHJpbmcoMCxsKSxuWzBdPW5bMF0uc3Vic3RyaW5nKDAsYSkudHJpbSgpLG5bM109IiJ9fWxldCBpPW5bMl0sbz0iIjtpZih0aGlzLm9wdGlvbnMucGVkYW50aWMpe2NvbnN0IGw9L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLy5leGVjKGkpO2wmJihpPWxbMV0sbz1sWzNdKX1lbHNlIG89blszXT9uWzNdLnNsaWNlKDEsLTEpOiIiO3JldHVybiBpPWkudHJpbSgpLC9ePC8udGVzdChpKSYmKHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmIS8+JC8udGVzdChyKT9pPWkuc2xpY2UoMSk6aT1pLnNsaWNlKDEsLTEpKSxQMChuLHtocmVmOmkmJmkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKSx0aXRsZTpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIil9LG5bMF0sdGhpcy5sZXhlcil9fXJlZmxpbmsoZSxuKXtsZXQgcjtpZigocj10aGlzLnJ1bGVzLmlubGluZS5yZWZsaW5rLmV4ZWMoZSkpfHwocj10aGlzLnJ1bGVzLmlubGluZS5ub2xpbmsuZXhlYyhlKSkpe2xldCBpPShyWzJdfHxyWzFdKS5yZXBsYWNlKC9ccysvZywiICIpO2lmKGk9bltpLnRvTG93ZXJDYXNlKCldLCFpKXtjb25zdCBvPXJbMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6byx0ZXh0Om99fXJldHVybiBQMChyLGksclswXSx0aGlzLmxleGVyKX19ZW1TdHJvbmcoZSxuLHI9IiIpe2xldCBpPXRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLmxEZWxpbS5leGVjKGUpO2lmKCFpfHxpWzNdJiZyLm1hdGNoKC9bXHB7TH1ccHtOfV0vdSkpcmV0dXJuO2lmKCEoaVsxXXx8aVsyXXx8IiIpfHwhcnx8dGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhyKSl7Y29uc3QgbD1bLi4uaVswXV0ubGVuZ3RoLTE7bGV0IHMsYSx1PWwsYz0wO2NvbnN0IGQ9aVswXVswXT09PSIqIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5yRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltVW5kO2ZvcihkLmxhc3RJbmRleD0wLG49bi5zbGljZSgtMSplLmxlbmd0aCtsKTsoaT1kLmV4ZWMobikpIT1udWxsOyl7aWYocz1pWzFdfHxpWzJdfHxpWzNdfHxpWzRdfHxpWzVdfHxpWzZdLCFzKWNvbnRpbnVlO2lmKGE9Wy4uLnNdLmxlbmd0aCxpWzNdfHxpWzRdKXt1Kz1hO2NvbnRpbnVlfWVsc2UgaWYoKGlbNV18fGlbNl0pJiZsJTMmJiEoKGwrYSklMykpe2MrPWE7Y29udGludWV9aWYodS09YSx1PjApY29udGludWU7YT1NYXRoLm1pbihhLGErdStjKTtjb25zdCBmPVsuLi5pWzBdXVswXS5sZW5ndGgsaD1lLnNsaWNlKDAsbCtpLmluZGV4K2YrYSk7aWYoTWF0aC5taW4obCxhKSUyKXtjb25zdCBnPWguc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6ImVtIixyYXc6aCx0ZXh0OmcsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGcpfX1jb25zdCBtPWguc2xpY2UoMiwtMik7cmV0dXJue3R5cGU6InN0cm9uZyIscmF3OmgsdGV4dDptLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhtKX19fX1jb2Rlc3BhbihlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZihuKXtsZXQgcj1uWzJdLnJlcGxhY2UoL1xuL2csIiAiKTtjb25zdCBpPS9bXiBdLy50ZXN0KHIpLG89L14gLy50ZXN0KHIpJiYvICQvLnRlc3Qocik7cmV0dXJuIGkmJm8mJihyPXIuc3Vic3RyaW5nKDEsci5sZW5ndGgtMSkpLHI9TW4ociwhMCkse3R5cGU6ImNvZGVzcGFuIixyYXc6blswXSx0ZXh0OnJ9fX1icihlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmJyLmV4ZWMoZSk7aWYobilyZXR1cm57dHlwZToiYnIiLHJhdzpuWzBdfX1kZWwoZSl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5kZWwuZXhlYyhlKTtpZihuKXJldHVybnt0eXBlOiJkZWwiLHJhdzpuWzBdLHRleHQ6blsyXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoblsyXSl9fWF1dG9saW5rKGUpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhlKTtpZihuKXtsZXQgcixpO3JldHVybiBuWzJdPT09IkAiPyhyPU1uKG5bMV0pLGk9Im1haWx0bzoiK3IpOihyPU1uKG5bMV0pLGk9cikse3R5cGU6ImxpbmsiLHJhdzpuWzBdLHRleHQ6cixocmVmOmksdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OnIsdGV4dDpyfV19fX11cmwoZSl7bGV0IG47aWYobj10aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhlKSl7bGV0IHIsaTtpZihuWzJdPT09IkAiKXI9TW4oblswXSksaT0ibWFpbHRvOiIrcjtlbHNle2xldCBvO2RvIG89blswXSxuWzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhuWzBdKVswXTt3aGlsZShvIT09blswXSk7cj1NbihuWzBdKSxuWzFdPT09Ind3dy4iP2k9Imh0dHA6Ly8iK25bMF06aT1uWzBdfXJldHVybnt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjppLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19aW5saW5lVGV4dChlKXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZihuKXtsZXQgcjtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrP3I9blswXTpyPU1uKG5bMF0pLHt0eXBlOiJ0ZXh0IixyYXc6blswXSx0ZXh0OnJ9fX19Y29uc3QgY2U9e25ld2xpbmU6L14oPzogKig/OlxufCQpKSsvLGNvZGU6L14oIHs0fVteXG5dKyg/OlxuKD86ICooPzpcbnwkKSkqKT8pKy8sZmVuY2VzOi9eIHswLDN9KGB7Myx9KD89W15gXG5dKig/OlxufCQpKXx+ezMsfSkoW15cbl0qKSg/OlxufCQpKD86fChbXHNcU10qPykoPzpcbnwkKSkoPzogezAsM31cMVt+YF0qICooPz1cbnwkKXwkKS8saHI6L14gezAsM30oKD86LVtcdCBdKil7Myx9fCg/Ol9bIFx0XSopezMsfXwoPzpcKlsgXHRdKil7Myx9KSg/OlxuK3wkKS8saGVhZGluZzovXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxibG9ja3F1b3RlOi9eKCB7MCwzfT4gPyhwYXJhZ3JhcGh8W15cbl0qKSg/OlxufCQpKSsvLGxpc3Q6L14oIHswLDN9YnVsbCkoWyBcdF1bXlxuXSs/KT8oPzpcbnwkKS8saHRtbDoiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxzPl1bXFxzXFxTXSo/KD86PC9cXDE+W15cXG5dKlxcbit8JCl8Y29tbWVudFteXFxuXSooXFxuK3wkKXw8XFw/W1xcc1xcU10qPyg/OlxcPz5cXG4qfCQpfDwhW0EtWl1bXFxzXFxTXSo/KD86Plxcbip8JCl8PCFcXFtDREFUQVxcW1tcXHNcXFNdKj8oPzpcXF1cXF0+XFxuKnwkKXw8Lz8odGFnKSg/OiArfFxcbnwvPz4pW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcdy1dKlxccyo+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKSkiLGRlZjovXiB7MCwzfVxbKGxhYmVsKVxdOiAqKD86XG4gKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuICopP3wgKlxuICopKHRpdGxlKSk/ICooPzpcbit8JCkvLHRhYmxlOndkLGxoZWFkaW5nOi9eKD8hYnVsbCApKCg/Oi58XG4oPyFccyo/XG58YnVsbCApKSs/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxfcGFyYWdyYXBoOi9eKFteXG5dKyg/OlxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcbilbXlxuXSspKikvLHRleHQ6L15bXlxuXSsvfTtjZS5fbGFiZWw9Lyg/IVxzKlxdKSg/OlxcLnxbXlxbXF1cXF0pKy87Y2UuX3RpdGxlPS8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvO2NlLmRlZj1CZShjZS5kZWYpLnJlcGxhY2UoImxhYmVsIixjZS5fbGFiZWwpLnJlcGxhY2UoInRpdGxlIixjZS5fdGl0bGUpLmdldFJlZ2V4KCk7Y2UuYnVsbGV0PS8oPzpbKistXXxcZHsxLDl9Wy4pXSkvO2NlLmxpc3RJdGVtU3RhcnQ9QmUoL14oICopKGJ1bGwpICovKS5yZXBsYWNlKCJidWxsIixjZS5idWxsZXQpLmdldFJlZ2V4KCk7Y2UubGlzdD1CZShjZS5saXN0KS5yZXBsYWNlKC9idWxsL2csY2UuYnVsbGV0KS5yZXBsYWNlKCJociIsIlxcbisoPz1cXDE/KD86KD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpKSIpLnJlcGxhY2UoImRlZiIsIlxcbisoPz0iK2NlLmRlZi5zb3VyY2UrIikiKS5nZXRSZWdleCgpO2NlLl90YWc9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlY3Rpb258c291cmNlfHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiO2NlLl9jb21tZW50PS88IS0tKD8hLT8+KVtcc1xTXSo/KD86LS0+fCQpLztjZS5odG1sPUJlKGNlLmh0bWwsImkiKS5yZXBsYWNlKCJjb21tZW50IixjZS5fY29tbWVudCkucmVwbGFjZSgidGFnIixjZS5fdGFnKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpO2NlLmxoZWFkaW5nPUJlKGNlLmxoZWFkaW5nKS5yZXBsYWNlKC9idWxsL2csY2UuYnVsbGV0KS5nZXRSZWdleCgpO2NlLnBhcmFncmFwaD1CZShjZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsY2UuX3RhZykuZ2V0UmVnZXgoKTtjZS5ibG9ja3F1b3RlPUJlKGNlLmJsb2NrcXVvdGUpLnJlcGxhY2UoInBhcmFncmFwaCIsY2UucGFyYWdyYXBoKS5nZXRSZWdleCgpO2NlLm5vcm1hbD17Li4uY2V9O2NlLmdmbT17Li4uY2Uubm9ybWFsLHRhYmxlOiJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSJ9O2NlLmdmbS50YWJsZT1CZShjZS5nZm0udGFibGUpLnJlcGxhY2UoImhyIixjZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIiB7NH1bXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLGNlLl90YWcpLmdldFJlZ2V4KCk7Y2UuZ2ZtLnBhcmFncmFwaD1CZShjZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ0YWJsZSIsY2UuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsY2UuX3RhZykuZ2V0UmVnZXgoKTtjZS5wZWRhbnRpYz17Li4uY2Uubm9ybWFsLGh0bWw6QmUoYF4gKig/OmNvbW1lbnQgKig/OlxcbnxcXHMqJCl8PCh0YWcpW1xcc1xcU10rPzwvXFwxPiAqKD86XFxuezIsfXxcXHMqJCl8PHRhZyg/OiJbXiJdKiJ8J1teJ10qJ3xcXHNbXiciLz5cXHNdKikqPy8/PiAqKD86XFxuezIsfXxcXHMqJCkpYCkucmVwbGFjZSgiY29tbWVudCIsY2UuX2NvbW1lbnQpLnJlcGxhY2UoL3RhZy9nLCIoPyEoPzphfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3VifHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZylcXGIpXFx3Kyg/ITp8W15cXHdcXHNAXSpAKVxcYiIpLmdldFJlZ2V4KCksZGVmOi9eICpcWyhbXlxdXSspXF06ICo8PyhbXlxzPl0rKT4/KD86ICsoWyIoXVteXG5dK1siKV0pKT8gKig/OlxuK3wkKS8saGVhZGluZzovXigjezEsNn0pKC4qKSg/OlxuK3wkKS8sZmVuY2VzOndkLGxoZWFkaW5nOi9eKC4rPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8scGFyYWdyYXBoOkJlKGNlLm5vcm1hbC5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIsY2UuaHIpLnJlcGxhY2UoImhlYWRpbmciLGAgKiN7MSw2fSAqW14KXWApLnJlcGxhY2UoImxoZWFkaW5nIixjZS5saGVhZGluZykucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJ8ZmVuY2VzIiwiIikucmVwbGFjZSgifGxpc3QiLCIiKS5yZXBsYWNlKCJ8aHRtbCIsIiIpLmdldFJlZ2V4KCl9O2NvbnN0IFg9e2VzY2FwZTovXlxcKFshIiMkJSYnKCkqKyxcLS4vOjs8PT4/QFxbXF1cXF5fYHt8fX5dKS8sYXV0b2xpbms6L148KHNjaGVtZTpbXlxzXHgwMC1ceDFmPD5dKnxlbWFpbCk+Lyx1cmw6d2QsdGFnOiJeY29tbWVudHxePC9bYS16QS1aXVtcXHc6LV0qXFxzKj58XjxbYS16QS1aXVtcXHctXSooPzphdHRyaWJ1dGUpKj9cXHMqLz8+fF48XFw/W1xcc1xcU10qP1xcPz58XjwhW2EtekEtWl0rXFxzW1xcc1xcU10qPz58XjwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPiIsbGluazovXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/OlxzKyh0aXRsZSkpP1xzKlwpLyxyZWZsaW5rOi9eIT9cWyhsYWJlbClcXVxbKHJlZilcXS8sbm9saW5rOi9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vLHJlZmxpbmtTZWFyY2g6InJlZmxpbmt8bm9saW5rKD8hXFwoKSIsZW1TdHJvbmc6e2xEZWxpbTovXig/OlwqKyg/OigoPyFcKilbcHVuY3RdKXxbXlxzKl0pKXxeXysoPzooKD8hXylbcHVuY3RdKXwoW15cc19dKSkvLHJEZWxpbUFzdDovXlteXypdKj9fX1teXypdKj9cKlteXypdKj8oPz1fXyl8W14qXSsoPz1bXipdKXwoPyFcKilbcHVuY3RdKFwqKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXCorKSg/IVwqKSg/PVtwdW5jdFxzXXwkKXwoPyFcKilbcHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pfFtcc10oXCorKSg/IVwqKSg/PVtwdW5jdF0pfCg/IVwqKVtwdW5jdF0oXCorKSg/IVwqKSg/PVtwdW5jdF0pfFtecHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pLyxyRGVsaW1VbmQ6L15bXl8qXSo/XCpcKlteXypdKj9fW15fKl0qPyg/PVwqXCopfFteX10rKD89W15fXSl8KD8hXylbcHVuY3RdKF8rKSg/PVtcc118JCl8W15wdW5jdFxzXShfKykoPyFfKSg/PVtwdW5jdFxzXXwkKXwoPyFfKVtwdW5jdFxzXShfKykoPz1bXnB1bmN0XHNdKXxbXHNdKF8rKSg/IV8pKD89W3B1bmN0XSl8KD8hXylbcHVuY3RdKF8rKSg/IV8pKD89W3B1bmN0XSkvfSxjb2RlOi9eKGArKShbXmBdfFteYF1bXHNcU10qP1teYF0pXDEoPyFgKS8sYnI6L14oIHsyLH18XFwpXG4oPyFccyokKS8sZGVsOndkLHRleHQ6L14oYCt8W15gXSkoPzooPz0gezIsfVxuKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKl9dfFxiX3wkKXxbXiBdKD89IHsyLH1cbikpKS8scHVuY3R1YXRpb246L14oKD8hWypfXSlbXHNwdW5jdHVhdGlvbl0pL307WC5fcHVuY3R1YXRpb249IlxccHtQfSQrPD0+YF58fiI7WC5wdW5jdHVhdGlvbj1CZShYLnB1bmN0dWF0aW9uLCJ1IikucmVwbGFjZSgvcHVuY3R1YXRpb24vZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLmJsb2NrU2tpcD0vXFtbXltcXV0qP1xdXChbXlwoXCldKj9cKXxgW15gXSo/YHw8W148Pl0qPz4vZztYLmFueVB1bmN0dWF0aW9uPS9cXFtwdW5jdF0vZztYLl9lc2NhcGVzPS9cXChbcHVuY3RdKS9nO1guX2NvbW1lbnQ9QmUoY2UuX2NvbW1lbnQpLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCk7WC5lbVN0cm9uZy5sRGVsaW09QmUoWC5lbVN0cm9uZy5sRGVsaW0sInUiKS5yZXBsYWNlKC9wdW5jdC9nLFguX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1guZW1TdHJvbmcuckRlbGltQXN0PUJlKFguZW1TdHJvbmcuckRlbGltQXN0LCJndSIpLnJlcGxhY2UoL3B1bmN0L2csWC5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WC5lbVN0cm9uZy5yRGVsaW1VbmQ9QmUoWC5lbVN0cm9uZy5yRGVsaW1VbmQsImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLmFueVB1bmN0dWF0aW9uPUJlKFguYW55UHVuY3R1YXRpb24sImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLl9lc2NhcGVzPUJlKFguX2VzY2FwZXMsImd1IikucmVwbGFjZSgvcHVuY3QvZyxYLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtYLl9zY2hlbWU9L1thLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0vO1guX2VtYWlsPS9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS87WC5hdXRvbGluaz1CZShYLmF1dG9saW5rKS5yZXBsYWNlKCJzY2hlbWUiLFguX3NjaGVtZSkucmVwbGFjZSgiZW1haWwiLFguX2VtYWlsKS5nZXRSZWdleCgpO1guX2F0dHJpYnV0ZT0vXHMrW2EtekEtWjpfXVtcdy46LV0qKD86XHMqPVxzKiJbXiJdKiJ8XHMqPVxzKidbXiddKid8XHMqPVxzKlteXHMiJz08PmBdKyk/LztYLnRhZz1CZShYLnRhZykucmVwbGFjZSgiY29tbWVudCIsWC5fY29tbWVudCkucmVwbGFjZSgiYXR0cmlidXRlIixYLl9hdHRyaWJ1dGUpLmdldFJlZ2V4KCk7WC5fbGFiZWw9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy87WC5faHJlZj0vPCg/OlxcLnxbXlxuPD5cXF0pKz58W15cc1x4MDAtXHgxZl0qLztYLl90aXRsZT0vIig/OlxcIj98W14iXFxdKSoifCcoPzpcXCc/fFteJ1xcXSkqJ3xcKCg/OlxcXCk/fFteKVxcXSkqXCkvO1gubGluaz1CZShYLmxpbmspLnJlcGxhY2UoImxhYmVsIixYLl9sYWJlbCkucmVwbGFjZSgiaHJlZiIsWC5faHJlZikucmVwbGFjZSgidGl0bGUiLFguX3RpdGxlKS5nZXRSZWdleCgpO1gucmVmbGluaz1CZShYLnJlZmxpbmspLnJlcGxhY2UoImxhYmVsIixYLl9sYWJlbCkucmVwbGFjZSgicmVmIixjZS5fbGFiZWwpLmdldFJlZ2V4KCk7WC5ub2xpbms9QmUoWC5ub2xpbmspLnJlcGxhY2UoInJlZiIsY2UuX2xhYmVsKS5nZXRSZWdleCgpO1gucmVmbGlua1NlYXJjaD1CZShYLnJlZmxpbmtTZWFyY2gsImciKS5yZXBsYWNlKCJyZWZsaW5rIixYLnJlZmxpbmspLnJlcGxhY2UoIm5vbGluayIsWC5ub2xpbmspLmdldFJlZ2V4KCk7WC5ub3JtYWw9ey4uLlh9O1gucGVkYW50aWM9ey4uLlgubm9ybWFsLHN0cm9uZzp7c3RhcnQ6L15fX3xcKlwqLyxtaWRkbGU6L15fXyg/PVxTKShbXHNcU10qP1xTKV9fKD8hXyl8XlwqXCooPz1cUykoW1xzXFNdKj9cUylcKlwqKD8hXCopLyxlbmRBc3Q6L1wqXCooPyFcKikvZyxlbmRVbmQ6L19fKD8hXykvZ30sZW06e3N0YXJ0Oi9eX3xcKi8sbWlkZGxlOi9eKClcKig/PVxTKShbXHNcU10qP1xTKVwqKD8hXCopfF5fKD89XFMpKFtcc1xTXSo/XFMpXyg/IV8pLyxlbmRBc3Q6L1wqKD8hXCopL2csZW5kVW5kOi9fKD8hXykvZ30sbGluazpCZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsWC5fbGFiZWwpLmdldFJlZ2V4KCkscmVmbGluazpCZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsWC5fbGFiZWwpLmdldFJlZ2V4KCl9O1guZ2ZtPXsuLi5YLm5vcm1hbCxlc2NhcGU6QmUoWC5lc2NhcGUpLnJlcGxhY2UoIl0pIiwifnxdKSIpLmdldFJlZ2V4KCksX2V4dGVuZGVkX2VtYWlsOi9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLyx1cmw6L14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nIn4oKSZdK3xcKFteKV0qXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nIn4pXSsoPyEkKSkrLyxkZWw6L14ofn4/KSg/PVteXHN+XSkoW1xzXFNdKj9bXlxzfl0pXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99O1guZ2ZtLnVybD1CZShYLmdmbS51cmwsImkiKS5yZXBsYWNlKCJlbWFpbCIsWC5nZm0uX2V4dGVuZGVkX2VtYWlsKS5nZXRSZWdleCgpO1guYnJlYWtzPXsuLi5YLmdmbSxicjpCZShYLmJyKS5yZXBsYWNlKCJ7Mix9IiwiKiIpLmdldFJlZ2V4KCksdGV4dDpCZShYLmdmbS50ZXh0KS5yZXBsYWNlKCJcXGJfIiwiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCIqIikuZ2V0UmVnZXgoKX07Y2xhc3MgSXJ7Y29uc3RydWN0b3IoZSl7SmUodGhpcywidG9rZW5zIik7SmUodGhpcywib3B0aW9ucyIpO0plKHRoaXMsInN0YXRlIik7SmUodGhpcywidG9rZW5pemVyIik7SmUodGhpcywiaW5saW5lUXVldWUiKTt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz1lfHxsbCx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBTZCx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2NvbnN0IG49e2Jsb2NrOmNlLm5vcm1hbCxpbmxpbmU6WC5ub3JtYWx9O3RoaXMub3B0aW9ucy5wZWRhbnRpYz8obi5ibG9jaz1jZS5wZWRhbnRpYyxuLmlubGluZT1YLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1jZS5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT1YLmJyZWFrczpuLmlubGluZT1YLmdmbSksdGhpcy50b2tlbml6ZXIucnVsZXM9bn1zdGF0aWMgZ2V0IHJ1bGVzKCl7cmV0dXJue2Jsb2NrOmNlLGlubGluZTpYfX1zdGF0aWMgbGV4KGUsbil7cmV0dXJuIG5ldyBJcihuKS5sZXgoZSl9c3RhdGljIGxleElubGluZShlLG4pe3JldHVybiBuZXcgSXIobikuaW5saW5lVG9rZW5zKGUpfWxleChlKXtlPWUucmVwbGFjZSgvXHJcbnxcci9nLGAKYCksdGhpcy5ibG9ja1Rva2VucyhlLHRoaXMudG9rZW5zKTtsZXQgbjtmb3IoO249dGhpcy5pbmxpbmVRdWV1ZS5zaGlmdCgpOyl0aGlzLmlubGluZVRva2VucyhuLnNyYyxuLnRva2Vucyk7cmV0dXJuIHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKGUsbj1bXSl7dGhpcy5vcHRpb25zLnBlZGFudGljP2U9ZS5yZXBsYWNlKC9cdC9nLCIgICAgIikucmVwbGFjZSgvXiArJC9nbSwiIik6ZT1lLnJlcGxhY2UoL14oICopKFx0KykvZ20sKHMsYSx1KT0+YSsiICAgICIucmVwZWF0KHUubGVuZ3RoKSk7bGV0IHIsaSxvLGw7Zm9yKDtlOylpZighKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9jayYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2suc29tZShzPT4ocj1zLmNhbGwoe2xleGVyOnRoaXN9LGUsbikpPyhlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpKXtpZihyPXRoaXMudG9rZW5pemVyLnNwYWNlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcubGVuZ3RoPT09MSYmbi5sZW5ndGg+MD9uW24ubGVuZ3RoLTFdLnJhdys9YApgOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmKGkudHlwZT09PSJwYXJhZ3JhcGgifHxpLnR5cGU9PT0idGV4dCIpPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmZlbmNlcyhlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmhlYWRpbmcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ocihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saXN0KGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHRtbChlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlZihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLGk9bltuLmxlbmd0aC0xXSxpJiYoaS50eXBlPT09InBhcmFncmFwaCJ8fGkudHlwZT09PSJ0ZXh0Iik/KGkucmF3Kz1gCmArci5yYXcsaS50ZXh0Kz1gCmArci5yYXcsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9aS50ZXh0KTp0aGlzLnRva2Vucy5saW5rc1tyLnRhZ118fCh0aGlzLnRva2Vucy5saW5rc1tyLnRhZ109e2hyZWY6ci5ocmVmLHRpdGxlOnIudGl0bGV9KTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhYmxlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGhlYWRpbmcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYobz1lLHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrKXtsZXQgcz0xLzA7Y29uc3QgYT1lLnNsaWNlKDEpO2xldCB1O3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaChjPT57dT1jLmNhbGwoe2xleGVyOnRoaXN9LGEpLHR5cGVvZiB1PT0ibnVtYmVyIiYmdT49MCYmKHM9TWF0aC5taW4ocyx1KSl9KSxzPDEvMCYmcz49MCYmKG89ZS5zdWJzdHJpbmcoMCxzKzEpKX1pZih0aGlzLnN0YXRlLnRvcCYmKHI9dGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKG8pKSl7aT1uW24ubGVuZ3RoLTFdLGwmJmkudHlwZT09PSJwYXJhZ3JhcGgiPyhpLnJhdys9YApgK3IucmF3LGkudGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPWkudGV4dCk6bi5wdXNoKHIpLGw9by5sZW5ndGghPT1lLmxlbmd0aCxlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50ZXh0KGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksaT1uW24ubGVuZ3RoLTFdLGkmJmkudHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPWAKYCtyLnJhdyxpLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1pLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihlKXtjb25zdCBzPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrZS5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3Iocyk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3Iocyl9fXJldHVybiB0aGlzLnN0YXRlLnRvcD0hMCxufWlubGluZShlLG49W10pe3JldHVybiB0aGlzLmlubGluZVF1ZXVlLnB1c2goe3NyYzplLHRva2VuczpufSksbn1pbmxpbmVUb2tlbnMoZSxuPVtdKXtsZXQgcixpLG8sbD1lLHMsYSx1O2lmKHRoaXMudG9rZW5zLmxpbmtzKXtjb25zdCBjPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihjLmxlbmd0aD4wKWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhsKSkhPW51bGw7KWMuaW5jbHVkZXMoc1swXS5zbGljZShzWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYobD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiWyIrImEiLnJlcGVhdChzWzBdLmxlbmd0aC0yKSsiXSIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhsKSkhPW51bGw7KWw9bC5zbGljZSgwLHMuaW5kZXgpKyIrKyIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoO2U7KWlmKGF8fCh1PSIiKSxhPSExLCEodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZSYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuaW5saW5lLnNvbWUoYz0+KHI9Yy5jYWxsKHtsZXhlcjp0aGlzfSxlLG4pKT8oZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5lc2NhcGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmci50eXBlPT09InRleHQiJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGluayhlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnJlZmxpbmsoZSx0aGlzLnRva2Vucy5saW5rcykpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxpPW5bbi5sZW5ndGgtMV0saSYmci50eXBlPT09InRleHQiJiZpLnR5cGU9PT0idGV4dCI/KGkucmF3Kz1yLnJhdyxpLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoZSxsLHUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4oZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5icihlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlbChlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHI9dGhpcy50b2tlbml6ZXIudXJsKGUpKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihvPWUsdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lKXtsZXQgYz0xLzA7Y29uc3QgZD1lLnNsaWNlKDEpO2xldCBmO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2goaD0+e2Y9aC5jYWxsKHtsZXhlcjp0aGlzfSxkKSx0eXBlb2YgZj09Im51bWJlciImJmY+PTAmJihjPU1hdGgubWluKGMsZikpfSksYzwxLzAmJmM+PTAmJihvPWUuc3Vic3RyaW5nKDAsYysxKSl9aWYocj10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KG8pKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcuc2xpY2UoLTEpIT09Il8iJiYodT1yLnJhdy5zbGljZSgtMSkpLGE9ITAsaT1uW24ubGVuZ3RoLTFdLGkmJmkudHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPXIucmF3LGkudGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYoZSl7Y29uc3QgYz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK2UuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGMpfX1yZXR1cm4gbn19Y2xhc3MgRWR7Y29uc3RydWN0b3IoZSl7SmUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz1lfHxsbH1jb2RlKGUsbixyKXt2YXIgbztjb25zdCBpPShvPShufHwiIikubWF0Y2goL15cUyovKSk9PW51bGw/dm9pZCAwOm9bMF07cmV0dXJuIGU9ZS5yZXBsYWNlKC9cbiQvLCIiKStgCmAsaT8nPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtJytNbihpKSsnIj4nKyhyP2U6TW4oZSwhMCkpK2A8L2NvZGU+PC9wcmU+CmA6IjxwcmU+PGNvZGU+Iisocj9lOk1uKGUsITApKStgPC9jb2RlPjwvcHJlPgpgfWJsb2NrcXVvdGUoZSl7cmV0dXJuYDxibG9ja3F1b3RlPgoke2V9PC9ibG9ja3F1b3RlPgpgfWh0bWwoZSxuKXtyZXR1cm4gZX1oZWFkaW5nKGUsbixyKXtyZXR1cm5gPGgke259PiR7ZX08L2gke259PgpgfWhyKCl7cmV0dXJuYDxocj4KYH1saXN0KGUsbixyKXtjb25zdCBpPW4/Im9sIjoidWwiLG89biYmciE9PTE/JyBzdGFydD0iJytyKyciJzoiIjtyZXR1cm4iPCIraStvK2A+CmArZSsiPC8iK2krYD4KYH1saXN0aXRlbShlLG4scil7cmV0dXJuYDxsaT4ke2V9PC9saT4KYH1jaGVja2JveChlKXtyZXR1cm4iPGlucHV0ICIrKGU/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaChlKXtyZXR1cm5gPHA+JHtlfTwvcD4KYH10YWJsZShlLG4pe3JldHVybiBuJiYobj1gPHRib2R5PiR7bn08L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCtlK2A8L3RoZWFkPgpgK24rYDwvdGFibGU+CmB9dGFibGVyb3coZSl7cmV0dXJuYDx0cj4KJHtlfTwvdHI+CmB9dGFibGVjZWxsKGUsbil7Y29uc3Qgcj1uLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKG4uYWxpZ24/YDwke3J9IGFsaWduPSIke24uYWxpZ259Ij5gOmA8JHtyfT5gKStlK2A8LyR7cn0+CmB9c3Ryb25nKGUpe3JldHVybmA8c3Ryb25nPiR7ZX08L3N0cm9uZz5gfWVtKGUpe3JldHVybmA8ZW0+JHtlfTwvZW0+YH1jb2Rlc3BhbihlKXtyZXR1cm5gPGNvZGU+JHtlfTwvY29kZT5gfWJyKCl7cmV0dXJuIjxicj4ifWRlbChlKXtyZXR1cm5gPGRlbD4ke2V9PC9kZWw+YH1saW5rKGUsbixyKXtjb25zdCBpPVIwKGUpO2lmKGk9PT1udWxsKXJldHVybiByO2U9aTtsZXQgbz0nPGEgaHJlZj0iJytlKyciJztyZXR1cm4gbiYmKG8rPScgdGl0bGU9IicrbisnIicpLG8rPSI+IityKyI8L2E+IixvfWltYWdlKGUsbixyKXtjb25zdCBpPVIwKGUpO2lmKGk9PT1udWxsKXJldHVybiByO2U9aTtsZXQgbz1gPGltZyBzcmM9IiR7ZX0iIGFsdD0iJHtyfSJgO3JldHVybiBuJiYobys9YCB0aXRsZT0iJHtufSJgKSxvKz0iPiIsb310ZXh0KGUpe3JldHVybiBlfX1jbGFzcyBldntzdHJvbmcoZSl7cmV0dXJuIGV9ZW0oZSl7cmV0dXJuIGV9Y29kZXNwYW4oZSl7cmV0dXJuIGV9ZGVsKGUpe3JldHVybiBlfWh0bWwoZSl7cmV0dXJuIGV9dGV4dChlKXtyZXR1cm4gZX1saW5rKGUsbixyKXtyZXR1cm4iIityfWltYWdlKGUsbixyKXtyZXR1cm4iIityfWJyKCl7cmV0dXJuIiJ9fWNsYXNzIERye2NvbnN0cnVjdG9yKGUpe0plKHRoaXMsIm9wdGlvbnMiKTtKZSh0aGlzLCJyZW5kZXJlciIpO0plKHRoaXMsInRleHRSZW5kZXJlciIpO3RoaXMub3B0aW9ucz1lfHxsbCx0aGlzLm9wdGlvbnMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyfHxuZXcgRWQsdGhpcy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXIsdGhpcy5yZW5kZXJlci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRleHRSZW5kZXJlcj1uZXcgZXZ9c3RhdGljIHBhcnNlKGUsbil7cmV0dXJuIG5ldyBEcihuKS5wYXJzZShlKX1zdGF0aWMgcGFyc2VJbmxpbmUoZSxuKXtyZXR1cm4gbmV3IERyKG4pLnBhcnNlSW5saW5lKGUpfXBhcnNlKGUsbj0hMCl7bGV0IHI9IiI7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2NvbnN0IG89ZVtpXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbby50eXBlXSl7Y29uc3QgbD1vLHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2wudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGwpO2lmKHMhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMobC50eXBlKSl7cis9c3x8IiI7Y29udGludWV9fXN3aXRjaChvLnR5cGUpe2Nhc2Uic3BhY2UiOmNvbnRpbnVlO2Nhc2UiaHIiOntyKz10aGlzLnJlbmRlcmVyLmhyKCk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSxsLmRlcHRoLGNSKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsdGhpcy50ZXh0UmVuZGVyZXIpKSk7Y29udGludWV9Y2FzZSJjb2RlIjp7Y29uc3QgbD1vO3IrPXRoaXMucmVuZGVyZXIuY29kZShsLnRleHQsbC5sYW5nLCEhbC5lc2NhcGVkKTtjb250aW51ZX1jYXNlInRhYmxlIjp7Y29uc3QgbD1vO2xldCBzPSIiLGE9IiI7Zm9yKGxldCBjPTA7YzxsLmhlYWRlci5sZW5ndGg7YysrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUobC5oZWFkZXJbY10udG9rZW5zKSx7aGVhZGVyOiEwLGFsaWduOmwuYWxpZ25bY119KTtzKz10aGlzLnJlbmRlcmVyLnRhYmxlcm93KGEpO2xldCB1PSIiO2ZvcihsZXQgYz0wO2M8bC5yb3dzLmxlbmd0aDtjKyspe2NvbnN0IGQ9bC5yb3dzW2NdO2E9IiI7Zm9yKGxldCBmPTA7ZjxkLmxlbmd0aDtmKyspYSs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5wYXJzZUlubGluZShkW2ZdLnRva2Vucykse2hlYWRlcjohMSxhbGlnbjpsLmFsaWduW2ZdfSk7dSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKX1yKz10aGlzLnJlbmRlcmVyLnRhYmxlKHMsdSk7Y29udGludWV9Y2FzZSJibG9ja3F1b3RlIjp7Y29uc3QgbD1vLHM9dGhpcy5wYXJzZShsLnRva2Vucyk7cis9dGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHMpO2NvbnRpbnVlfWNhc2UibGlzdCI6e2NvbnN0IGw9byxzPWwub3JkZXJlZCxhPWwuc3RhcnQsdT1sLmxvb3NlO2xldCBjPSIiO2ZvcihsZXQgZD0wO2Q8bC5pdGVtcy5sZW5ndGg7ZCsrKXtjb25zdCBmPWwuaXRlbXNbZF0saD1mLmNoZWNrZWQsbT1mLnRhc2s7bGV0IGc9IiI7aWYoZi50YXNrKXtjb25zdCB3PXRoaXMucmVuZGVyZXIuY2hlY2tib3goISFoKTt1P2YudG9rZW5zLmxlbmd0aD4wJiZmLnRva2Vuc1swXS50eXBlPT09InBhcmFncmFwaCI/KGYudG9rZW5zWzBdLnRleHQ9dysiICIrZi50b2tlbnNbMF0udGV4dCxmLnRva2Vuc1swXS50b2tlbnMmJmYudG9rZW5zWzBdLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udG9rZW5zWzBdLnR5cGU9PT0idGV4dCImJihmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dD13KyIgIitmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCkpOmYudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHRleHQ6dysiICJ9KTpnKz13KyIgIn1nKz10aGlzLnBhcnNlKGYudG9rZW5zLHUpLGMrPXRoaXMucmVuZGVyZXIubGlzdGl0ZW0oZyxtLCEhaCl9cis9dGhpcy5yZW5kZXJlci5saXN0KGMscyxhKTtjb250aW51ZX1jYXNlImh0bWwiOntjb25zdCBsPW87cis9dGhpcy5yZW5kZXJlci5odG1sKGwudGV4dCxsLmJsb2NrKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e2NvbnN0IGw9bztyKz10aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSk7Y29udGludWV9Y2FzZSJ0ZXh0Ijp7bGV0IGw9byxzPWwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dDtmb3IoO2krMTxlLmxlbmd0aCYmZVtpKzFdLnR5cGU9PT0idGV4dCI7KWw9ZVsrK2ldLHMrPWAKYCsobC50b2tlbnM/dGhpcy5wYXJzZUlubGluZShsLnRva2Vucyk6bC50ZXh0KTtyKz1uP3RoaXMucmVuZGVyZXIucGFyYWdyYXBoKHMpOnM7Y29udGludWV9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytvLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn1wYXJzZUlubGluZShlLG4pe249bnx8dGhpcy5yZW5kZXJlcjtsZXQgcj0iIjtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3Qgbz1lW2ldO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tvLnR5cGVdKXtjb25zdCBsPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tvLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxvKTtpZihsIT09ITF8fCFbImVzY2FwZSIsImh0bWwiLCJsaW5rIiwiaW1hZ2UiLCJzdHJvbmciLCJlbSIsImNvZGVzcGFuIiwiYnIiLCJkZWwiLCJ0ZXh0Il0uaW5jbHVkZXMoby50eXBlKSl7cis9bHx8IiI7Y29udGludWV9fXN3aXRjaChvLnR5cGUpe2Nhc2UiZXNjYXBlIjp7Y29uc3QgbD1vO3IrPW4udGV4dChsLnRleHQpO2JyZWFrfWNhc2UiaHRtbCI6e2NvbnN0IGw9bztyKz1uLmh0bWwobC50ZXh0KTticmVha31jYXNlImxpbmsiOntjb25zdCBsPW87cis9bi5saW5rKGwuaHJlZixsLnRpdGxlLHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiaW1hZ2UiOntjb25zdCBsPW87cis9bi5pbWFnZShsLmhyZWYsbC50aXRsZSxsLnRleHQpO2JyZWFrfWNhc2Uic3Ryb25nIjp7Y29uc3QgbD1vO3IrPW4uc3Ryb25nKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiZW0iOntjb25zdCBsPW87cis9bi5lbSh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImNvZGVzcGFuIjp7Y29uc3QgbD1vO3IrPW4uY29kZXNwYW4obC50ZXh0KTticmVha31jYXNlImJyIjp7cis9bi5icigpO2JyZWFrfWNhc2UiZGVsIjp7Y29uc3QgbD1vO3IrPW4uZGVsKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UidGV4dCI6e2NvbnN0IGw9bztyKz1uLnRleHQobC50ZXh0KTticmVha31kZWZhdWx0Ontjb25zdCBsPSdUb2tlbiB3aXRoICInK28udHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGwpLCIiO3Rocm93IG5ldyBFcnJvcihsKX19fXJldHVybiByfX1jbGFzcyBDYXtjb25zdHJ1Y3RvcihlKXtKZSh0aGlzLCJvcHRpb25zIik7dGhpcy5vcHRpb25zPWV8fGxsfXByZXByb2Nlc3MoZSl7cmV0dXJuIGV9cG9zdHByb2Nlc3MoZSl7cmV0dXJuIGV9fUplKENhLCJwYXNzVGhyb3VnaEhvb2tzIixuZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIl0pKTt2YXIgJHUsUXAsbmYsd1M7Y2xhc3MgcFJ7Y29uc3RydWN0b3IoLi4uZSl7dGgodGhpcywkdSk7dGgodGhpcyxuZik7SmUodGhpcywiZGVmYXVsdHMiLHFtKCkpO0plKHRoaXMsIm9wdGlvbnMiLHRoaXMuc2V0T3B0aW9ucyk7SmUodGhpcywicGFyc2UiLEd1KHRoaXMsJHUsUXApLmNhbGwodGhpcyxJci5sZXgsRHIucGFyc2UpKTtKZSh0aGlzLCJwYXJzZUlubGluZSIsR3UodGhpcywkdSxRcCkuY2FsbCh0aGlzLElyLmxleElubGluZSxEci5wYXJzZUlubGluZSkpO0plKHRoaXMsIlBhcnNlciIsRHIpO0plKHRoaXMsIlJlbmRlcmVyIixFZCk7SmUodGhpcywiVGV4dFJlbmRlcmVyIixldik7SmUodGhpcywiTGV4ZXIiLElyKTtKZSh0aGlzLCJUb2tlbml6ZXIiLFNkKTtKZSh0aGlzLCJIb29rcyIsQ2EpO3RoaXMudXNlKC4uLmUpfXdhbGtUb2tlbnMoZSxuKXt2YXIgaSxvO2xldCByPVtdO2Zvcihjb25zdCBsIG9mIGUpc3dpdGNoKHI9ci5jb25jYXQobi5jYWxsKHRoaXMsbCkpLGwudHlwZSl7Y2FzZSJ0YWJsZSI6e2NvbnN0IHM9bDtmb3IoY29uc3QgYSBvZiBzLmhlYWRlcilyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhhLnRva2VucyxuKSk7Zm9yKGNvbnN0IGEgb2Ygcy5yb3dzKWZvcihjb25zdCB1IG9mIGEpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnModS50b2tlbnMsbikpO2JyZWFrfWNhc2UibGlzdCI6e2NvbnN0IHM9bDtyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzLml0ZW1zLG4pKTticmVha31kZWZhdWx0Ontjb25zdCBzPWw7KG89KGk9dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zKT09bnVsbD92b2lkIDA6aS5jaGlsZFRva2VucykhPW51bGwmJm9bcy50eXBlXT90aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbcy50eXBlXS5mb3JFYWNoKGE9PntyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzW2FdLG4pKX0pOnMudG9rZW5zJiYocj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy50b2tlbnMsbikpKX19cmV0dXJuIHJ9dXNlKC4uLmUpe2NvbnN0IG49dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zfHx7cmVuZGVyZXJzOnt9LGNoaWxkVG9rZW5zOnt9fTtyZXR1cm4gZS5mb3JFYWNoKHI9Pntjb25zdCBpPXsuLi5yfTtpZihpLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fGkuYXN5bmN8fCExLHIuZXh0ZW5zaW9ucyYmKHIuZXh0ZW5zaW9ucy5mb3JFYWNoKG89PntpZighby5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gbyl7Y29uc3QgbD1uLnJlbmRlcmVyc1tvLm5hbWVdO2w/bi5yZW5kZXJlcnNbby5uYW1lXT1mdW5jdGlvbiguLi5zKXtsZXQgYT1vLnJlbmRlcmVyLmFwcGx5KHRoaXMscyk7cmV0dXJuIGE9PT0hMSYmKGE9bC5hcHBseSh0aGlzLHMpKSxhfTpuLnJlbmRlcmVyc1tvLm5hbWVdPW8ucmVuZGVyZXJ9aWYoInRva2VuaXplciJpbiBvKXtpZighby5sZXZlbHx8by5sZXZlbCE9PSJibG9jayImJm8ubGV2ZWwhPT0iaW5saW5lIil0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTtjb25zdCBsPW5bby5sZXZlbF07bD9sLnVuc2hpZnQoby50b2tlbml6ZXIpOm5bby5sZXZlbF09W28udG9rZW5pemVyXSxvLnN0YXJ0JiYoby5sZXZlbD09PSJibG9jayI/bi5zdGFydEJsb2NrP24uc3RhcnRCbG9jay5wdXNoKG8uc3RhcnQpOm4uc3RhcnRCbG9jaz1bby5zdGFydF06by5sZXZlbD09PSJpbmxpbmUiJiYobi5zdGFydElubGluZT9uLnN0YXJ0SW5saW5lLnB1c2goby5zdGFydCk6bi5zdGFydElubGluZT1bby5zdGFydF0pKX0iY2hpbGRUb2tlbnMiaW4gbyYmby5jaGlsZFRva2VucyYmKG4uY2hpbGRUb2tlbnNbby5uYW1lXT1vLmNoaWxkVG9rZW5zKX0pLGkuZXh0ZW5zaW9ucz1uKSxyLnJlbmRlcmVyKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBFZCh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnJlbmRlcmVyKXtjb25zdCBzPXIucmVuZGVyZXJbbF0sYT1sLHU9b1thXTtvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR8fCIifX1pLnJlbmRlcmVyPW99aWYoci50b2tlbml6ZXIpe2NvbnN0IG89dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBTZCh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnRva2VuaXplcil7Y29uc3Qgcz1yLnRva2VuaXplcltsXSxhPWwsdT1vW2FdO29bYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShvLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkobyxjKSksZH19aS50b2tlbml6ZXI9b31pZihyLmhvb2tzKXtjb25zdCBvPXRoaXMuZGVmYXVsdHMuaG9va3N8fG5ldyBDYTtmb3IoY29uc3QgbCBpbiByLmhvb2tzKXtjb25zdCBzPXIuaG9va3NbbF0sYT1sLHU9b1thXTtDYS5wYXNzVGhyb3VnaEhvb2tzLmhhcyhsKT9vW2FdPWM9PntpZih0aGlzLmRlZmF1bHRzLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUocy5jYWxsKG8sYykpLnRoZW4oZj0+dS5jYWxsKG8sZikpO2NvbnN0IGQ9cy5jYWxsKG8sYyk7cmV0dXJuIHUuY2FsbChvLGQpfTpvW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KG8sYykpLGR9fWkuaG9va3M9b31pZihyLndhbGtUb2tlbnMpe2NvbnN0IG89dGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zLGw9ci53YWxrVG9rZW5zO2kud2Fsa1Rva2Vucz1mdW5jdGlvbihzKXtsZXQgYT1bXTtyZXR1cm4gYS5wdXNoKGwuY2FsbCh0aGlzLHMpKSxvJiYoYT1hLmNvbmNhdChvLmNhbGwodGhpcyxzKSkpLGF9fXRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uaX19KSx0aGlzfXNldE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uZX0sdGhpc31sZXhlcihlLG4pe3JldHVybiBJci5sZXgoZSxuPz90aGlzLmRlZmF1bHRzKX1wYXJzZXIoZSxuKXtyZXR1cm4gRHIucGFyc2UoZSxuPz90aGlzLmRlZmF1bHRzKX19JHU9bmV3IFdlYWtTZXQsUXA9ZnVuY3Rpb24oZSxuKXtyZXR1cm4ocixpKT0+e2NvbnN0IG89ey4uLml9LGw9ey4uLnRoaXMuZGVmYXVsdHMsLi4ub307dGhpcy5kZWZhdWx0cy5hc3luYz09PSEwJiZvLmFzeW5jPT09ITEmJihsLnNpbGVudHx8Y29uc29sZS53YXJuKCJtYXJrZWQoKTogVGhlIGFzeW5jIG9wdGlvbiB3YXMgc2V0IHRvIHRydWUgYnkgYW4gZXh0ZW5zaW9uLiBUaGUgYXN5bmM6IGZhbHNlIG9wdGlvbiBzZW50IHRvIHBhcnNlIHdpbGwgYmUgaWdub3JlZC4iKSxsLmFzeW5jPSEwKTtjb25zdCBzPUd1KHRoaXMsbmYsd1MpLmNhbGwodGhpcywhIWwuc2lsZW50LCEhbC5hc3luYyk7aWYodHlwZW9mIHI+InUifHxyPT09bnVsbClyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiBzKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpKyIsIHN0cmluZyBleHBlY3RlZCIpKTtpZihsLmhvb2tzJiYobC5ob29rcy5vcHRpb25zPWwpLGwuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShsLmhvb2tzP2wuaG9va3MucHJlcHJvY2VzcyhyKTpyKS50aGVuKGE9PmUoYSxsKSkudGhlbihhPT5sLndhbGtUb2tlbnM/UHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKSkudGhlbigoKT0+YSk6YSkudGhlbihhPT5uKGEsbCkpLnRoZW4oYT0+bC5ob29rcz9sLmhvb2tzLnBvc3Rwcm9jZXNzKGEpOmEpLmNhdGNoKHMpO3RyeXtsLmhvb2tzJiYocj1sLmhvb2tzLnByZXByb2Nlc3MocikpO2NvbnN0IGE9ZShyLGwpO2wud2Fsa1Rva2VucyYmdGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKTtsZXQgdT1uKGEsbCk7cmV0dXJuIGwuaG9va3MmJih1PWwuaG9va3MucG9zdHByb2Nlc3ModSkpLHV9Y2F0Y2goYSl7cmV0dXJuIHMoYSl9fX0sbmY9bmV3IFdlYWtTZXQsd1M9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gcj0+e2lmKHIubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2NvbnN0IGk9IjxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPiIrTW4oci5tZXNzYWdlKyIiLCEwKSsiPC9wcmU+IjtyZXR1cm4gbj9Qcm9taXNlLnJlc29sdmUoaSk6aX1pZihuKXJldHVybiBQcm9taXNlLnJlamVjdChyKTt0aHJvdyByfX07Y29uc3QgSG89bmV3IHBSO2Z1bmN0aW9uIEhlKHQsZSl7cmV0dXJuIEhvLnBhcnNlKHQsZSl9SGUub3B0aW9ucz1IZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBIby5zZXRPcHRpb25zKHQpLEhlLmRlZmF1bHRzPUhvLmRlZmF1bHRzLHlTKEhlLmRlZmF1bHRzKSxIZX07SGUuZ2V0RGVmYXVsdHM9cW07SGUuZGVmYXVsdHM9bGw7SGUudXNlPWZ1bmN0aW9uKC4uLnQpe3JldHVybiBIby51c2UoLi4udCksSGUuZGVmYXVsdHM9SG8uZGVmYXVsdHMseVMoSGUuZGVmYXVsdHMpLEhlfTtIZS53YWxrVG9rZW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEhvLndhbGtUb2tlbnModCxlKX07SGUucGFyc2VJbmxpbmU9SG8ucGFyc2VJbmxpbmU7SGUuUGFyc2VyPURyO0hlLnBhcnNlcj1Eci5wYXJzZTtIZS5SZW5kZXJlcj1FZDtIZS5UZXh0UmVuZGVyZXI9ZXY7SGUuTGV4ZXI9SXI7SGUubGV4ZXI9SXIubGV4O0hlLlRva2VuaXplcj1TZDtIZS5Ib29rcz1DYTtIZS5wYXJzZT1IZTtIZS5vcHRpb25zO0hlLnNldE9wdGlvbnM7SGUudXNlO0hlLndhbGtUb2tlbnM7SGUucGFyc2VJbmxpbmU7RHIucGFyc2U7Y29uc3QgZ1I9SXIubGV4O2Z1bmN0aW9uIGV1KCl7ZXU9ZnVuY3Rpb24oKXtyZXR1cm4gZX07dmFyIHQsZT17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LGk9T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihDLGssRSl7Q1trXT1FLnZhbHVlfSxvPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KEMsayxFKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsayx7dmFsdWU6RSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLENba119dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oayxFLEEpe3JldHVybiBrW0VdPUF9fWZ1bmN0aW9uIGMoQyxrLEUsQSl7dmFyIE49ayYmay5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2s6dixGPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpLEs9bmV3IEgoQXx8W10pO3JldHVybiBpKEYsIl9pbnZva2UiLHt2YWx1ZTpQKEMsRSxLKX0pLEZ9ZnVuY3Rpb24gZChDLGssRSl7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzpDLmNhbGwoayxFKX19Y2F0Y2goQSl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6QX19fWUud3JhcD1jO3ZhciBmPSJzdXNwZW5kZWRTdGFydCIsaD0ic3VzcGVuZGVkWWllbGQiLG09ImV4ZWN1dGluZyIsZz0iY29tcGxldGVkIix3PXt9O2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB4KCl7fXZhciBTPXt9O3UoUyxsLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTt2YXIgYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsVD1iJiZiKGIoWihbXSkpKTtUJiZUIT09biYmci5jYWxsKFQsbCkmJihTPVQpO3ZhciAkPXgucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUyk7ZnVuY3Rpb24gTyhDKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oayl7dShDLGssZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMuX2ludm9rZShrLEUpfSl9KX1mdW5jdGlvbiBMKEMsayl7ZnVuY3Rpb24gRShOLEYsSyxkZSl7dmFyIHNlPWQoQ1tOXSxDLEYpO2lmKHNlLnR5cGUhPT0idGhyb3ciKXt2YXIgQWU9c2UuYXJnLE5lPUFlLnZhbHVlO3JldHVybiBOZSYmdHlwZW9mIE5lPT0ib2JqZWN0IiYmci5jYWxsKE5lLCJfX2F3YWl0Iik/ay5yZXNvbHZlKE5lLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24oUSl7RSgibmV4dCIsUSxLLGRlKX0sZnVuY3Rpb24oUSl7RSgidGhyb3ciLFEsSyxkZSl9KTprLnJlc29sdmUoTmUpLnRoZW4oZnVuY3Rpb24oUSl7QWUudmFsdWU9USxLKEFlKX0sZnVuY3Rpb24oUSl7cmV0dXJuIEUoInRocm93IixRLEssZGUpfSl9ZGUoc2UuYXJnKX12YXIgQTtpKHRoaXMsIl9pbnZva2UiLHt2YWx1ZTpmdW5jdGlvbihOLEYpe2Z1bmN0aW9uIEsoKXtyZXR1cm4gbmV3IGsoZnVuY3Rpb24oZGUsc2Upe0UoTixGLGRlLHNlKX0pfXJldHVybiBBPUE/QS50aGVuKEssSyk6SygpfX0pfWZ1bmN0aW9uIFAoQyxrLEUpe3ZhciBBPWY7cmV0dXJuIGZ1bmN0aW9uKE4sRil7aWYoQT09PW0pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoQT09PWcpe2lmKE49PT0idGhyb3ciKXRocm93IEY7cmV0dXJue3ZhbHVlOnQsZG9uZTohMH19Zm9yKEUubWV0aG9kPU4sRS5hcmc9Rjs7KXt2YXIgSz1FLmRlbGVnYXRlO2lmKEspe3ZhciBkZT1EKEssRSk7aWYoZGUpe2lmKGRlPT09dyljb250aW51ZTtyZXR1cm4gZGV9fWlmKEUubWV0aG9kPT09Im5leHQiKUUuc2VudD1FLl9zZW50PUUuYXJnO2Vsc2UgaWYoRS5tZXRob2Q9PT0idGhyb3ciKXtpZihBPT09Zil0aHJvdyBBPWcsRS5hcmc7RS5kaXNwYXRjaEV4Y2VwdGlvbihFLmFyZyl9ZWxzZSBFLm1ldGhvZD09PSJyZXR1cm4iJiZFLmFicnVwdCgicmV0dXJuIixFLmFyZyk7QT1tO3ZhciBzZT1kKEMsayxFKTtpZihzZS50eXBlPT09Im5vcm1hbCIpe2lmKEE9RS5kb25lP2c6aCxzZS5hcmc9PT13KWNvbnRpbnVlO3JldHVybnt2YWx1ZTpzZS5hcmcsZG9uZTpFLmRvbmV9fXNlLnR5cGU9PT0idGhyb3ciJiYoQT1nLEUubWV0aG9kPSJ0aHJvdyIsRS5hcmc9c2UuYXJnKX19fWZ1bmN0aW9uIEQoQyxrKXt2YXIgRT1rLm1ldGhvZCxBPUMuaXRlcmF0b3JbRV07aWYoQT09PXQpcmV0dXJuIGsuZGVsZWdhdGU9bnVsbCxFPT09InRocm93IiYmQy5pdGVyYXRvci5yZXR1cm4mJihrLm1ldGhvZD0icmV0dXJuIixrLmFyZz10LEQoQyxrKSxrLm1ldGhvZD09PSJ0aHJvdyIpfHxFIT09InJldHVybiImJihrLm1ldGhvZD0idGhyb3ciLGsuYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIrRSsiJyBtZXRob2QiKSksdzt2YXIgTj1kKEEsQy5pdGVyYXRvcixrLmFyZyk7aWYoTi50eXBlPT09InRocm93IilyZXR1cm4gay5tZXRob2Q9InRocm93IixrLmFyZz1OLmFyZyxrLmRlbGVnYXRlPW51bGwsdzt2YXIgRj1OLmFyZztyZXR1cm4gRj9GLmRvbmU/KGtbQy5yZXN1bHROYW1lXT1GLnZhbHVlLGsubmV4dD1DLm5leHRMb2Msay5tZXRob2QhPT0icmV0dXJuIiYmKGsubWV0aG9kPSJuZXh0IixrLmFyZz10KSxrLmRlbGVnYXRlPW51bGwsdyk6Rjooay5tZXRob2Q9InRocm93IixrLmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLGsuZGVsZWdhdGU9bnVsbCx3KX1mdW5jdGlvbiBCKEMpe3ZhciBrPXt0cnlMb2M6Q1swXX07MSBpbiBDJiYoay5jYXRjaExvYz1DWzFdKSwyIGluIEMmJihrLmZpbmFsbHlMb2M9Q1syXSxrLmFmdGVyTG9jPUNbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKGspfWZ1bmN0aW9uIG9lKEMpe3ZhciBrPUMuY29tcGxldGlvbnx8e307ay50eXBlPSJub3JtYWwiLGRlbGV0ZSBrLmFyZyxDLmNvbXBsZXRpb249a31mdW5jdGlvbiBIKEMpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxDLmZvckVhY2goQix0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBaKEMpe2lmKEN8fEM9PT0iIil7dmFyIGs9Q1tsXTtpZihrKXJldHVybiBrLmNhbGwoQyk7aWYodHlwZW9mIEMubmV4dD09ImZ1bmN0aW9uIilyZXR1cm4gQztpZighaXNOYU4oQy5sZW5ndGgpKXt2YXIgRT0tMSxBPWZ1bmN0aW9uIE4oKXtmb3IoOysrRTxDLmxlbmd0aDspaWYoci5jYWxsKEMsRSkpcmV0dXJuIE4udmFsdWU9Q1tFXSxOLmRvbmU9ITEsTjtyZXR1cm4gTi52YWx1ZT10LE4uZG9uZT0hMCxOfTtyZXR1cm4gQS5uZXh0PUF9fXRocm93IG5ldyBUeXBlRXJyb3IodHlwZW9mIEMrIiBpcyBub3QgaXRlcmFibGUiKX1yZXR1cm4geS5wcm90b3R5cGU9eCxpKCQsImNvbnN0cnVjdG9yIix7dmFsdWU6eCxjb25maWd1cmFibGU6ITB9KSxpKHgsImNvbnN0cnVjdG9yIix7dmFsdWU6eSxjb25maWd1cmFibGU6ITB9KSx5LmRpc3BsYXlOYW1lPXUoeCxhLCJHZW5lcmF0b3JGdW5jdGlvbiIpLGUuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbihDKXt2YXIgaz10eXBlb2YgQz09ImZ1bmN0aW9uIiYmQy5jb25zdHJ1Y3RvcjtyZXR1cm4hIWsmJihrPT09eXx8KGsuZGlzcGxheU5hbWV8fGsubmFtZSk9PT0iR2VuZXJhdG9yRnVuY3Rpb24iKX0sZS5tYXJrPWZ1bmN0aW9uKEMpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKEMseCk6KEMuX19wcm90b19fPXgsdShDLGEsIkdlbmVyYXRvckZ1bmN0aW9uIikpLEMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoJCksQ30sZS5hd3JhcD1mdW5jdGlvbihDKXtyZXR1cm57X19hd2FpdDpDfX0sTyhMLnByb3RvdHlwZSksdShMLnByb3RvdHlwZSxzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxlLkFzeW5jSXRlcmF0b3I9TCxlLmFzeW5jPWZ1bmN0aW9uKEMsayxFLEEsTil7Tj09PXZvaWQgMCYmKE49UHJvbWlzZSk7dmFyIEY9bmV3IEwoYyhDLGssRSxBKSxOKTtyZXR1cm4gZS5pc0dlbmVyYXRvckZ1bmN0aW9uKGspP0Y6Ri5uZXh0KCkudGhlbihmdW5jdGlvbihLKXtyZXR1cm4gSy5kb25lP0sudmFsdWU6Ri5uZXh0KCl9KX0sTygkKSx1KCQsYSwiR2VuZXJhdG9yIiksdSgkLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHUoJCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSxlLmtleXM9ZnVuY3Rpb24oQyl7dmFyIGs9T2JqZWN0KEMpLEU9W107Zm9yKHZhciBBIGluIGspRS5wdXNoKEEpO3JldHVybiBFLnJldmVyc2UoKSxmdW5jdGlvbiBOKCl7Zm9yKDtFLmxlbmd0aDspe3ZhciBGPUUucG9wKCk7aWYoRiBpbiBrKXJldHVybiBOLnZhbHVlPUYsTi5kb25lPSExLE59cmV0dXJuIE4uZG9uZT0hMCxOfX0sZS52YWx1ZXM9WixILnByb3RvdHlwZT17Y29uc3RydWN0b3I6SCxyZXNldDpmdW5jdGlvbihDKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD10LHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXQsdGhpcy50cnlFbnRyaWVzLmZvckVhY2gob2UpLCFDKWZvcih2YXIgayBpbiB0aGlzKWsuY2hhckF0KDApPT09InQiJiZyLmNhbGwodGhpcyxrKSYmIWlzTmFOKCtrLnNsaWNlKDEpKSYmKHRoaXNba109dCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIEM9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoQy50eXBlPT09InRocm93Iil0aHJvdyBDLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihDKXtpZih0aGlzLmRvbmUpdGhyb3cgQzt2YXIgaz10aGlzO2Z1bmN0aW9uIEUoc2UsQWUpe3JldHVybiBGLnR5cGU9InRocm93IixGLmFyZz1DLGsubmV4dD1zZSxBZSYmKGsubWV0aG9kPSJuZXh0IixrLmFyZz10KSwhIUFlfWZvcih2YXIgQT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7QT49MDstLUEpe3ZhciBOPXRoaXMudHJ5RW50cmllc1tBXSxGPU4uY29tcGxldGlvbjtpZihOLnRyeUxvYz09PSJyb290IilyZXR1cm4gRSgiZW5kIik7aWYoTi50cnlMb2M8PXRoaXMucHJldil7dmFyIEs9ci5jYWxsKE4sImNhdGNoTG9jIiksZGU9ci5jYWxsKE4sImZpbmFsbHlMb2MiKTtpZihLJiZkZSl7aWYodGhpcy5wcmV2PE4uY2F0Y2hMb2MpcmV0dXJuIEUoTi5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PE4uZmluYWxseUxvYylyZXR1cm4gRShOLmZpbmFsbHlMb2MpfWVsc2UgaWYoSyl7aWYodGhpcy5wcmV2PE4uY2F0Y2hMb2MpcmV0dXJuIEUoTi5jYXRjaExvYywhMCl9ZWxzZXtpZighZGUpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxOLmZpbmFsbHlMb2MpcmV0dXJuIEUoTi5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKEMsayl7Zm9yKHZhciBFPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtFPj0wOy0tRSl7dmFyIEE9dGhpcy50cnlFbnRyaWVzW0VdO2lmKEEudHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChBLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxBLmZpbmFsbHlMb2Mpe3ZhciBOPUE7YnJlYWt9fU4mJihDPT09ImJyZWFrInx8Qz09PSJjb250aW51ZSIpJiZOLnRyeUxvYzw9ayYmazw9Ti5maW5hbGx5TG9jJiYoTj1udWxsKTt2YXIgRj1OP04uY29tcGxldGlvbjp7fTtyZXR1cm4gRi50eXBlPUMsRi5hcmc9ayxOPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PU4uZmluYWxseUxvYyx3KTp0aGlzLmNvbXBsZXRlKEYpfSxjb21wbGV0ZTpmdW5jdGlvbihDLGspe2lmKEMudHlwZT09PSJ0aHJvdyIpdGhyb3cgQy5hcmc7cmV0dXJuIEMudHlwZT09PSJicmVhayJ8fEMudHlwZT09PSJjb250aW51ZSI/dGhpcy5uZXh0PUMuYXJnOkMudHlwZT09PSJyZXR1cm4iPyh0aGlzLnJ2YWw9dGhpcy5hcmc9Qy5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKTpDLnR5cGU9PT0ibm9ybWFsIiYmayYmKHRoaXMubmV4dD1rKSx3fSxmaW5pc2g6ZnVuY3Rpb24oQyl7Zm9yKHZhciBrPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtrPj0wOy0tayl7dmFyIEU9dGhpcy50cnlFbnRyaWVzW2tdO2lmKEUuZmluYWxseUxvYz09PUMpcmV0dXJuIHRoaXMuY29tcGxldGUoRS5jb21wbGV0aW9uLEUuYWZ0ZXJMb2MpLG9lKEUpLHd9fSxjYXRjaDpmdW5jdGlvbihDKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgRT10aGlzLnRyeUVudHJpZXNba107aWYoRS50cnlMb2M9PT1DKXt2YXIgQT1FLmNvbXBsZXRpb247aWYoQS50eXBlPT09InRocm93Iil7dmFyIE49QS5hcmc7b2UoRSl9cmV0dXJuIE59fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oQyxrLEUpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpaKEMpLHJlc3VsdE5hbWU6ayxuZXh0TG9jOkV9LHRoaXMubWV0aG9kPT09Im5leHQiJiYodGhpcy5hcmc9dCksd319LGV9ZnVuY3Rpb24gSnAodCxlKXsoZT09bnVsbHx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiB0dih0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSnAodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpwKHQsZSl9fWZ1bmN0aW9uIG1SKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj10dih0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAsbD0hMSxzO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtsPSEwLHM9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihsKXRocm93IHN9fX19ZnVuY3Rpb24gdlIodCxlKXtpZih0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiB0O3ZhciBuPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwodCxlfHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybihlPT09InN0cmluZyI/U3RyaW5nOk51bWJlcikodCl9ZnVuY3Rpb24geVIodCl7dmFyIGU9dlIodCwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiBlPT0ic3ltYm9sIj9lOlN0cmluZyhlKX1mdW5jdGlvbiBxdCh0LGUsbil7cmV0dXJuIGU9eVIoZSksZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiB4Uih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIF9SKHQsZSl7dmFyIG49dD09bnVsbD9udWxsOnR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl18fHRbIkBAaXRlcmF0b3IiXTtpZihuIT1udWxsKXt2YXIgcixpLG8sbCxzPVtdLGE9ITAsdT0hMTt0cnl7aWYobz0obj1uLmNhbGwodCkpLm5leHQsZT09PTApe2lmKE9iamVjdChuKSE9PW4pcmV0dXJuO2E9ITF9ZWxzZSBmb3IoOyEoYT0ocj1vLmNhbGwobikpLmRvbmUpJiYocy5wdXNoKHIudmFsdWUpLHMubGVuZ3RoIT09ZSk7YT0hMCk7fWNhdGNoKGMpe3U9ITAsaT1jfWZpbmFsbHl7dHJ5e2lmKCFhJiZuLnJldHVybiE9bnVsbCYmKGw9bi5yZXR1cm4oKSxPYmplY3QobCkhPT1sKSlyZXR1cm59ZmluYWxseXtpZih1KXRocm93IGl9fXJldHVybiBzfX1mdW5jdGlvbiB3Uigpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBTUih0LGUpe3JldHVybiB4Uih0KXx8X1IodCxlKXx8dHYodCxlKXx8d1IoKX1mdW5jdGlvbiBBMCh0LGUsbixyLGksbyxsKXt0cnl7dmFyIHM9dFtvXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP2UoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixpKX1mdW5jdGlvbiBTUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLGkpe3ZhciBvPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBsKGEpe0EwKG8scixpLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtBMChvLHIsaSxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19ZnVuY3Rpb24gRVIodCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gSnAodCl9ZnVuY3Rpb24gQ1IodCl7aWYodHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8dFsiQEBpdGVyYXRvciJdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIGtSKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBxcCh0KXtyZXR1cm4gRVIodCl8fENSKHQpfHx0dih0KXx8a1IoKX12YXIgYlI9L15kYXRhOihpbWFnZVwvKHBuZ3xqcGVnfGpwZ3xnaWZ8d2VicHxibXB8dGlmZnxpY298c3ZnXCt4bWwpKTtiYXNlNjQsLztmdW5jdGlvbiBudih0KXt2YXIgZT1iUi5leGVjKHQpO2lmKGUmJmVbMV0pcmV0dXJuIGVbMV19ZnVuY3Rpb24gcnYodCl7cmV0dXJuIHQ9PT0iaW1hZ2Uvc3ZnK3htbCI/InN2ZyI6dD09PSJpbWFnZS92bmQubWljcm9zb2Z0Lmljb24iPyJpY28iOnQuc3RhcnRzV2l0aCgiaW1hZ2UvIik/dC5zbGljZSg2KTp0fXZhciAkUj0vXmgoW1xkK10pJC87ZnVuY3Rpb24gVFIodCl7dmFyIGU9dC5jaGlsZHJlbi5tYXAoTlIpO3JldHVybiBSUihlKX1mdW5jdGlvbiBOUih0KXtpZih0LnR5cGU9PT0iaGVhZGluZyIpe3ZhciBlLG49IiIscj1OdW1iZXIoKGU9dC50YWcubWF0Y2goJFIpKT09PW51bGx8fGU9PT12b2lkIDA/dm9pZCAwOmVbMV0pO2lmKE51bWJlci5pc05hTihyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGVhZGVyIGRlcHRoIik7Zm9yKHZhciBpPTA7aTxOdW1iZXIocik7aSsrKW4rPSIjIjt2YXIgbz1bIiIuY29uY2F0KG4sIiAiKV07cmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjpvLmNvbmNhdC5hcHBseShvLHFwKHQuY2hpbGRyZW4ubWFwKHRnKSkpfX1lbHNle2lmKHQudHlwZT09PSJwYXJhZ3JhcGgiKXJldHVybiB0LmNoaWxkcmVuLmxlbmd0aD09PTA/e3R5cGU6ImJsb2NrIixjaGlsZHJlbjpbIjxiciAvPiJdfTp7dHlwZToiYmxvY2siLGNoaWxkcmVuOnQuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHMpe3JldHVybiB0ZyhzKX0pfTtpZih0LnR5cGU9PT0ibGlzdCIpcmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjp0LmNoaWxkcmVuLmZsYXRNYXAoZnVuY3Rpb24ocyxhKXtyZXR1cm4gQ1Moa1ModCkscywwLGE9PT0wKX0pfTt2YXIgbD10O3Rocm93IG5ldyBFcnJvcigiVW5oYW5kbGVkIG5vZGUgdHlwZTogIi5jb25jYXQoInR5cGUiaW4gbD8iZXhoYXVzdGl2ZUNoZWNrLnR5cGUiOiJ1bmtub3duIikpfX1mdW5jdGlvbiBSUih0KXtyZXR1cm4gZWcuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGVnKCl7cmV0dXJuIGVnPVNTKGV1KCkubWFyayhmdW5jdGlvbiB0KGUpe3ZhciBuLHIsaSxvLGwscyxhLHUsYztyZXR1cm4gZXUoKS53cmFwKGZ1bmN0aW9uKGYpe2Zvcig7Oylzd2l0Y2goZi5wcmV2PWYubmV4dCl7Y2FzZSAwOm49W2AKYF0scj1bXSxpPXt9LG89MDtjYXNlIDQ6aWYoIShvPGUubGVuZ3RoKSl7Zi5uZXh0PTQ0O2JyZWFrfWw9ZVtvXSxzPW1SKGwuY2hpbGRyZW4pLGYucHJldj03LHMucygpO2Nhc2UgOTppZigoYT1zLm4oKSkuZG9uZSl7Zi5uZXh0PTMyO2JyZWFrfWlmKHU9YS52YWx1ZSx0eXBlb2YgdSE9InN0cmluZyIpe2YubmV4dD0xNTticmVha31uW24ubGVuZ3RoLTFdKz11LGYubmV4dD0zMDticmVhaztjYXNlIDE1OmlmKHUudHlwZSE9PSJpbWFnZSIpe2YubmV4dD0yMzticmVha31yZXR1cm4gZi50MD1yLGYubmV4dD0xOSxNUih1LGkpO2Nhc2UgMTk6Zi50MT1mLnNlbnQsZi50MC5wdXNoLmNhbGwoZi50MCxmLnQxKSxmLm5leHQ9Mjk7YnJlYWs7Y2FzZSAyMzppZih1LnR5cGUhPT0ibGluayIpe2YubmV4dD0yNzticmVha31yLnB1c2goSVIodSkpLGYubmV4dD0yOTticmVhaztjYXNlIDI3OnRocm93IGM9dSxuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZSB0eXBlOiAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShjLG51bGwsMikpKTtjYXNlIDI5Om4ucHVzaCgiIik7Y2FzZSAzMDpmLm5leHQ9OTticmVhaztjYXNlIDMyOmYubmV4dD0zNzticmVhaztjYXNlIDM0OmYucHJldj0zNCxmLnQyPWYuY2F0Y2goNykscy5lKGYudDIpO2Nhc2UgMzc6cmV0dXJuIGYucHJldj0zNyxzLmYoKSxmLmZpbmlzaCgzNyk7Y2FzZSA0MDpvPT09ZS5sZW5ndGgtMT9uW24ubGVuZ3RoLTFdKz1gCmA6bltuLmxlbmd0aC0xXSs9YAoKYDtjYXNlIDQxOm8rKyxmLm5leHQ9NDticmVhaztjYXNlIDQ0OnJldHVybiBmLmFicnVwdCgicmV0dXJuIixxdChxdChxdChxdCh7fSxubiwicmljaHRleHQiKSwidGVtcGxhdGVTdHJpbmdzIixuKSwiZXhwcnMiLHIpLCJmaWxlcyIsaSkpO2Nhc2UgNDU6Y2FzZSJlbmQiOnJldHVybiBmLnN0b3AoKX19LHQsbnVsbCxbWzcsMzQsMzcsNDBdXSl9KSksZWcuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEVTKHQpe3ZhciBlPXR5cGVvZiB0LmZvcm1hdD09Im51bWJlciI/UFIodC5mb3JtYXQpOltdLG49dC50ZXh0LnRyaW1TdGFydCgpLHI9dC50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO3ZhciBpPXQudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gZS5pbmNsdWRlcygiYm9sZCIpJiZlLmluY2x1ZGVzKCJpdGFsaWMiKT9uPSIqKioiLmNvbmNhdChuLCIqKioiKTplLmluY2x1ZGVzKCJib2xkIik/bj0iKioiLmNvbmNhdChuLCIqKiIpOmUuaW5jbHVkZXMoIml0YWxpYyIpJiYobj0iXyIuY29uY2F0KG4sIl8iKSksZS5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPSJ+fiIuY29uY2F0KG4sIn5+IikpLCIiLmNvbmNhdCgiICIucmVwZWF0KHIpKS5jb25jYXQobikuY29uY2F0KCIgIi5yZXBlYXQoaSkpfWZ1bmN0aW9uIHRnKHQpe3JldHVybiB0LnR5cGU9PT0idGV4dCI/RVModCk6dC50eXBlPT09ImxpbmVicmVhayI/YApgOnR9ZnVuY3Rpb24gQ1ModCxlLG4pe3ZhciByLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG89aT8iIjpgCmAsbD1bIiIuY29uY2F0KG8pLmNvbmNhdCgiICIucmVwZWF0KG4pKS5jb25jYXQodCldO3JldHVybigocj1lLmNoaWxkcmVuKT09PW51bGx8fHI9PT12b2lkIDB8fChyPXJbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci50eXBlKSE9PSJsaXN0IiYmbC5wdXNoKCIgIiksbC5jb25jYXQoZS5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLnR5cGU9PT0ibGlzdCI/cy5jaGlsZHJlbi5mbGF0TWFwKGZ1bmN0aW9uKGEpe3JldHVybiBDUyhrUyhzKSxhLG4rNCl9KTpbdGcocyldfSkpfWZ1bmN0aW9uIGtTKHQpe2lmKHQubGlzdFR5cGU9PT0iYnVsbGV0IilyZXR1cm4iLSI7aWYodC5saXN0VHlwZT09PSJudW1iZXIiKXJldHVybiIxLiI7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgbGlzdCB0eXBlOiAiLmNvbmNhdCh0Lmxpc3RUeXBlKSl9dmFyIE9SPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gUFIodCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKE9SKS5mbGF0TWFwKGZ1bmN0aW9uKGUpe3ZhciBuPVNSKGUsMikscj1uWzBdLGk9blsxXTtyZXR1cm4oaSZ0KT09PWk/W3JdOltdfSl9dmFyIEFSPW5ldyBUZXh0RW5jb2RlcjtmdW5jdGlvbiBNUih0LGUpe3JldHVybiBuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbmcoKXtyZXR1cm4gbmc9U1MoZXUoKS5tYXJrKGZ1bmN0aW9uIHQoZSxuKXt2YXIgcixpLG8sbCxzO3JldHVybiBldSgpLndyYXAoZnVuY3Rpb24odSl7Zm9yKDs7KXN3aXRjaCh1LnByZXY9dS5uZXh0KXtjYXNlIDA6aWYoIWUuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe3UubmV4dD0xMzticmVha31yZXR1cm4gdS5uZXh0PTMsam4uZ2V0U0hBMjU2SGFzaChBUi5lbmNvZGUoZS5zcmMpKTtjYXNlIDM6aWYocj11LnNlbnQsaT1udihlLnNyYyksaSE9PXZvaWQgMCl7dS5uZXh0PTc7YnJlYWt9dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZGV0ZWN0IE1pbWUgVHlwZSBmb3IgaW1hZ2U6ICIuY29uY2F0KGUuc3JjKSk7Y2FzZSA3OnJldHVybiBvPXJ2KGkpLGw9Ii9wdWJsaWMvIi5jb25jYXQociwiLiIpLmNvbmNhdChvKSxuW2xdPWUuc3JjLHUuYWJydXB0KCJyZXR1cm4iLHF0KHF0KHF0KHt9LG5uLCJmaWxlIiksUm4sbCksIm1ldGFkYXRhIix7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS5oZWlnaHR8fDAsc2hhMjU2OnJ8fCIifSkpO2Nhc2UgMTM6cmV0dXJuIHM9TFIoInNoYTI1NiIsZS5zcmMpLHUuYWJydXB0KCJyZXR1cm4iLHF0KHF0KHF0KHt9LG5uLCJmaWxlIiksUm4sIi9wdWJsaWMiLmNvbmNhdChlLnNyYy5zcGxpdCgiPyIpWzBdKSksIm1ldGFkYXRhIix7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS5oZWlnaHR8fDAsc2hhMjU2OnN8fCIifSkpO2Nhc2UgMTU6Y2FzZSJlbmQiOnJldHVybiB1LnN0b3AoKX19LHQpfSkpLG5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBMUih0LGUpe3ZhciBuPWUuc3BsaXQoIj8iKTtpZighKG4ubGVuZ3RoPDIpKXt2YXIgcj1uWzFdLGk9bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihpLmhhcyh0KSlyZXR1cm4gaS5nZXQodCl9fWZ1bmN0aW9uIElSKHQpe3JldHVybiBxdChxdChxdCh7fSxubiwibGluayIpLCJocmVmIix0LnVybCksImNoaWxkcmVuIix0LmNoaWxkcmVuLm1hcChFUykpfWZ1bmN0aW9uIE0wKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbHQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/TTAoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3F0KHQscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk0wKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gdH12YXIgQ3I9e3ZlcnNpb246MSxmb3JtYXQ6IiIsaW5kZW50OjAsZGlyZWN0aW9uOm51bGx9O2Z1bmN0aW9uIENzKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToidGV4dCIsZm9ybWF0OiIiLHRleHQ6dH0pO2lmKCJ0YWciaW4gdClzd2l0Y2godC50YWcpe2Nhc2UiaDEiOnJldHVybiBnbCh0KTtjYXNlImgyIjpyZXR1cm4gZ2wodCk7Y2FzZSJoMyI6cmV0dXJuIGdsKHQpO2Nhc2UiaDQiOnJldHVybiBnbCh0KTtjYXNlImg1IjpyZXR1cm4gZ2wodCk7Y2FzZSJoNiI6cmV0dXJuIGdsKHQpO2Nhc2UibGkiOnJldHVybiBVUih0KTtjYXNlInAiOnJldHVybiBGUih0KTtjYXNlInVsIjpyZXR1cm4gTDAodCk7Y2FzZSJvbCI6cmV0dXJuIEwwKHQpO2Nhc2Uic3BhbiI6cmV0dXJuIGJTKHQpO2Nhc2UiYSI6cmV0dXJuIGpSKHQpO2Nhc2UiaW1nIjpyZXR1cm4gRFIodCk7Y2FzZSJiciI6cmV0dXJuIGU/bHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaW5lYnJlYWsifSk6QlIoKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdGFnOiAiK0pTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlOiAiK0pTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSl9ZnVuY3Rpb24gRFIodCl7dmFyIGU9dC5zcmM7cmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToiaW1hZ2UiLHNyYzplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSl9ZnVuY3Rpb24galIodCl7cmV0dXJuIGx0KGx0KHt9LENyKSx7fSx7dHlwZToibGluayIsdXJsOnQuaHJlZixjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIHpSKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se2Zvcm1hdDoiIix0eXBlOiJyb290IixjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIGdsKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6ImhlYWRpbmciLHRhZzp0LnRhZyxjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gQ3MoZSl9KX0pfWZ1bmN0aW9uIEZSKHQpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUsITApfSl9KX1mdW5jdGlvbiBCUigpe3JldHVybiBsdChsdCh7fSxDcikse30se3R5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46W119KX1mdW5jdGlvbiBVUih0KXtyZXR1cm4gbHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaXN0aXRlbSIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUsITApfSl9KX1mdW5jdGlvbiBMMCh0KXtyZXR1cm4gbHQobHQoe30sQ3IpLHt9LHt0eXBlOiJsaXN0IixsaXN0VHlwZTp0LnRhZz09PSJvbCI/Im51bWJlciI6ImJ1bGxldCIsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIENzKGUpfSl9LHQuZGlyP3tkaXJlY3Rpb246dC5kaXJ9OntkaXJlY3Rpb246bnVsbH0pfXZhciBXUj17Ym9sZDoxLGl0YWxpYzoyLCJsaW5lLXRocm91Z2giOjR9O2Z1bmN0aW9uIFZSKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihlLG4pe3JldHVybiBlfFdSW25dfSwwKX1mdW5jdGlvbiBiUyh0KXt2YXIgZT10LmNoaWxkcmVuWzBdO3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/bHQobHQoe30sQ3IpLHt9LHt0eXBlOiJ0ZXh0Iix0ZXh0OmUsZm9ybWF0OlZSKHQuY2xhc3Nlcyl9KTpiUyhsdChsdCh7fSxlKSx7fSx7Y2xhc3Nlczp0LmNsYXNzZXMuY29uY2F0KGUuY2xhc3Nlcyl9KSl9dmFyIENkPSc8dmFsIHZhbHVlPSInLHJnPSciPicsaWc9IjwvdmFsPiI7ZnVuY3Rpb24gZHIodCxlLG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsaT1bXSxvPWZ1bmN0aW9uKCl7dmFyIGE9dFtuXTtpZihhLnR5cGU9PT0iaGVhZGluZyIpaS5wdXNoKHt0YWc6ImgiLmNvbmNhdChhLmRlcHRoKSxjaGlsZHJlbjpkcihhLnRva2Vucz9hLnRva2VuczpbXSxlLDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0icGFyYWdyYXBoIilpLnB1c2goe3RhZzoicCIsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09InN0cm9uZyIpaS5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJib2xkIl0sY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09ImVtIilpLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbIml0YWxpYyJdLGNoaWxkcmVuOmRyKGEudG9rZW5zP2EudG9rZW5zOltdLGUsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJkZWwiKWkucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsibGluZS10aHJvdWdoIl0sY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09InRleHQiKWlmKCJ0b2tlbnMiaW4gYSYmQXJyYXkuaXNBcnJheShhLnRva2VucykpaS5wdXNoLmFwcGx5KGkscXAoZHIoYS50b2tlbnMsZSxuLHIpLmNoaWxkcmVuKSk7ZWxzZSBpZihyJiZ0eXBlb2YgYS5yYXc9PSJzdHJpbmciKXt2YXIgdT1hLnJhdy5zcGxpdChgCmApLGM9dS5mbGF0TWFwKGZ1bmN0aW9uKFMsYil7cmV0dXJuIGI9PT11Lmxlbmd0aC0xP1tTXTpbUyx7dGFnOiJiciIsY2hpbGRyZW46W119XX0pO2kucHVzaC5hcHBseShpLHFwKGMpKX1lbHNlIGkucHVzaChhLnJhdyk7ZWxzZSBpZihhLnR5cGU9PT0ibGlzdCIpaS5wdXNoKHt0YWc6YS5vcmRlcmVkPyJvbCI6InVsIixjaGlsZHJlbjpkcihhLml0ZW1zLGUsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJsaXN0X2l0ZW0iKWkucHVzaCh7dGFnOiJsaSIsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwLCEwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlIT09InNwYWNlIilpZihhLnR5cGU9PT0iaHRtbCIpe2lmKGEudGV4dD09PWlnKXJldHVybnt2OntjaGlsZHJlbjppLGN1cnNvcjpufX07dmFyIGQ9YS50ZXh0LmluZGV4T2YocmcpO2lmKGEudGV4dC5zdGFydHNXaXRoKENkKSYmZD4tMSl7dmFyIGY9TnVtYmVyKGEudGV4dC5zbGljZShDZC5sZW5ndGgsZCkpO2lmKE51bWJlci5pc05hTihmKSl0aHJvdyBFcnJvcigiSWxsZWdhbCB2YWwgaW50ZXJtZWRpYXRlIG5vZGU6ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGEpKSk7dmFyIGg9ZHIodC5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMudHlwZT09PSJsaW5rInx8Uy50eXBlPT09Imxpc3QiP3t0eXBlOiJ0ZXh0IixyYXc6Uy5yYXcsdGV4dDpTLnJhd306U30pLGUsbisxKSxtPWguY2hpbGRyZW4sZz1oLmN1cnNvcix3PWVbZl07aWYody5fdHlwZT09PSJsaW5rIilpLnB1c2goe3RhZzoiYSIsaHJlZjp3LmhyZWYsY2hpbGRyZW46bX0pO2Vsc2UgaWYody5fdHlwZT09PSJmaWxlIil7dmFyIHYseTtpLnB1c2goe3RhZzoiaW1nIixzcmM6am4uY29udmVydEZpbGVTb3VyY2UodykudXJsLHdpZHRoOih2PXcubWV0YWRhdGEpPT09bnVsbHx8dj09PXZvaWQgMD92b2lkIDA6di53aWR0aCxoZWlnaHQ6KHk9dy5tZXRhZGF0YSk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmhlaWdodCxjaGlsZHJlbjpbXX0pfW49Z312YXIgeD0vPGJyXHMqXC8/Pi9naTthLnRleHQudHJpbSgpLm1hdGNoKHgpJiZpLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSl9ZWxzZSBhLnR5cGU9PT0ibGluayI/YS5yYXc9PT1hLmhyZWY/aS5wdXNoKGEucmF3KTppLnB1c2goe3RhZzoiYSIsaHJlZjphLmhyZWYsY2hpbGRyZW46ZHIoYS50b2tlbnM/YS50b2tlbnM6W10sZSwwKS5jaGlsZHJlbn0pOmEudHlwZT09PSJiciI/aS5wdXNoKHt0YWc6ImJyIixjaGlsZHJlbjpbXX0pOmNvbnNvbGUuZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBtYXJrZG93bjogdW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogIi5jb25jYXQoYS50eXBlLCIuIEZvdW5kOiAiKS5jb25jYXQoYS5yYXcpKTtuKyt9LGw7bjx0Lmxlbmd0aDspaWYobD1vKCksbClyZXR1cm4gbC52O3JldHVybntjaGlsZHJlbjppLGN1cnNvcjpufX1mdW5jdGlvbiAkUyh0KXt2YXIgZT10LnRlbXBsYXRlU3RyaW5ncyxuPXQuZXhwcnMscj1lLmZsYXRNYXAoZnVuY3Rpb24oYSx1KXt2YXIgYz1uW3VdO3JldHVybiBjP2Nbbm5dPT09ImxpbmsiP2EuY29uY2F0KCIiLmNvbmNhdChDZCkuY29uY2F0KHUpLmNvbmNhdChyZykuY29uY2F0KGMuY2hpbGRyZW5bMF0pLmNvbmNhdChpZykpOmEuY29uY2F0KCIiLmNvbmNhdChDZCkuY29uY2F0KHUpLmNvbmNhdChyZykuY29uY2F0KGlnKSk6YX0pLmpvaW4oIiIpLGk9Z1Iocix7Z2ZtOiEwfSksbz1kcihpLG4sMCksbD1vLmNoaWxkcmVuLHM9by5jdXJzb3I7aWYocyE9PWkubGVuZ3RoKXRocm93IEVycm9yKCJVbmV4cGVjdGVkbHkgdGVybWluYXRlZCBtYXJrZG93biBwYXJzaW5nLiBQb3NzaWJsZSByZWFzb246IHVuY2xvc2VkIGh0bWwgdGFnPyIpO3JldHVybiBxdChxdCh7fSxubiwicmljaHRleHQiKSwiY2hpbGRyZW4iLGwpfXZhciB3bj17fSxqPXt9O2xldCBFZj17fSxUUz17fSx0dT17fSxrYT17fSxvZz17fSxHbD17fSxpdj17fSxsZz17fSxudT17fSxydT17fSxVaT17fSxvdj17fSxsdj17fSxOUz17fSxSUz17fSxPUz17fSxQUz17fSxBUz17fSxNUz17fSxMUz17fSxrZD17fSxJUz17fSxEUz17fSxqUz17fSx6Uz17fSxGUz17fSxCUz17fSxVUz17fSxXUz17fSxWUz17fSxzdj17fSxhdj17fSxzZz17fSxIUz17fSxLUz17fSxaUz17fTtmdW5jdGlvbiBHKHQpe2xldCBlPW5ldyBVUkxTZWFyY2hQYXJhbXM7ZS5hcHBlbmQoImNvZGUiLHQpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7dH07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke2V9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgd2k9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLEhSPXdpJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLFF0PXdpJiYvTWFjfGlQb2R8aVBob25lfGlQYWQvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxybz13aSYmL14oPyEuKlNlYW1vbmtleSkoPz0uKkZpcmVmb3gpLiovaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGJkPXdpJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFIUj8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSx1dj13aSYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLENmPXdpJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxLUj13aSYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksY3Y9d2kmJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhS1Isa2Y9dXZ8fENmfHxjdj8iwqAiOiLigIsiLFpSPXJvPyLCoCI6a2YsR1I9L15bXkEtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXSpbXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXS8sWVI9L15bXlx1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZkXHVmZTcwLVx1ZmVmY10qW0EtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXS8sSW89e2JvbGQ6MSxjb2RlOjE2LGhpZ2hsaWdodDoxMjgsaXRhbGljOjIsc3RyaWtldGhyb3VnaDo0LHN1YnNjcmlwdDozMixzdXBlcnNjcmlwdDo2NCx1bmRlcmxpbmU6OH0sWFI9e2RpcmVjdGlvbmxlc3M6MSx1bm1lcmdlYWJsZToyfSxJMD17Y2VudGVyOjIsZW5kOjYsanVzdGlmeTo0LGxlZnQ6MSxyaWdodDozLHN0YXJ0OjV9LFFSPXsyOiJjZW50ZXIiLDY6ImVuZCIsNDoianVzdGlmeSIsMToibGVmdCIsMzoicmlnaHQiLDU6InN0YXJ0In0sSlI9e25vcm1hbDowLHNlZ21lbnRlZDoyLHRva2VuOjF9LHFSPXswOiJub3JtYWwiLDI6InNlZ21lbnRlZCIsMToidG9rZW4ifSxhZz0hMSxkdj0wO2Z1bmN0aW9uIGVPKHQpe2R2PXQudGltZVN0YW1wfWZ1bmN0aW9uIFRoKHQsZSxuKXtyZXR1cm4gZS5fX2xleGljYWxMaW5lQnJlYWs9PT10fHx0W2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0hPT12b2lkIDB9ZnVuY3Rpb24gdE8odCl7cmV0dXJuIHQuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57bGV0IGU9cnQoKTtyZXR1cm4gZSE9PW51bGw/ZS5jbG9uZSgpOm51bGx9KX1mdW5jdGlvbiBHUyh0LGUsbil7YWc9ITA7bGV0IHI9MTAwPHBlcmZvcm1hbmNlLm5vdygpLWR2O3RyeXtXbih0LCgpPT57bGV0IGk9cnQoKXx8dE8odCk7dmFyIG89bmV3IE1hcCxsPXQuZ2V0Um9vdEVsZW1lbnQoKSxzPXQuX2VkaXRvclN0YXRlLGE9dC5fYmxvY2tDdXJzb3JFbGVtZW50O2xldCB1PSExLGM9IiI7Zm9yKHZhciBkPTA7ZDxlLmxlbmd0aDtkKyspe3ZhciBmPWVbZF0saD1mLnR5cGUsbT1mLnRhcmdldCxnPUR1KG0scyk7aWYoIShnPT09bnVsbCYmbSE9PWx8fHR0KGcpKSl7aWYoaD09PSJjaGFyYWN0ZXJEYXRhIil7aWYoZj1yJiZlZShnKSllOntmPWksaD1tO3ZhciB3PWc7aWYodmUoZikpe3ZhciB2PWYuYW5jaG9yLmdldE5vZGUoKTtpZih2LmlzKHcpJiZmLmZvcm1hdCE9PXYuZ2V0Rm9ybWF0KCkpe2Y9ITE7YnJlYWsgZX19Zj1oLm5vZGVUeXBlPT09MyYmdy5pc0F0dGFjaGVkKCl9ZiYmKHc9WHIodC5fd2luZG93KSxoPWY9bnVsbCx3IT09bnVsbCYmdy5hbmNob3JOb2RlPT09bSYmKGY9dy5hbmNob3JPZmZzZXQsaD13LmZvY3VzT2Zmc2V0KSxtPW0ubm9kZVZhbHVlLG0hPT1udWxsJiZ2dihnLG0sZixoLCExKSl9ZWxzZSBpZihoPT09ImNoaWxkTGlzdCIpe2Zvcih1PSEwLGg9Zi5hZGRlZE5vZGVzLHc9MDt3PGgubGVuZ3RoO3crKyl7dj1oW3ddO3ZhciB5PXRFKHYpLHg9di5wYXJlbnROb2RlO3g9PW51bGx8fHY9PT1hfHx5IT09bnVsbHx8di5ub2RlTmFtZT09PSJCUiImJlRoKHYseCx0KXx8KHJvJiYoeT12LmlubmVyVGV4dHx8di5ub2RlVmFsdWUpJiYoYys9eSkseC5yZW1vdmVDaGlsZCh2KSl9aWYoZj1mLnJlbW92ZWROb2RlcyxoPWYubGVuZ3RoLDA8aCl7Zm9yKHc9MCx2PTA7djxoO3YrKyl4PWZbdl0sKHgubm9kZU5hbWU9PT0iQlIiJiZUaCh4LG0sdCl8fGE9PT14KSYmKG0uYXBwZW5kQ2hpbGQoeCksdysrKTtoIT09dyYmKG09PT1sJiYoZz1zLl9ub2RlTWFwLmdldCgicm9vdCIpKSxvLnNldChtLGcpKX19fX1pZigwPG8uc2l6ZSlmb3IobGV0W1MsYl1vZiBvKWlmKFUoYikpZm9yKG89Yi5nZXRDaGlsZHJlbktleXMoKSxsPVMuZmlyc3RDaGlsZCxzPTA7czxvLmxlbmd0aDtzKyspYT10LmdldEVsZW1lbnRCeUtleShvW3NdKSxhIT09bnVsbCYmKGw9PW51bGw/KFMuYXBwZW5kQ2hpbGQoYSksbD1hKTpsIT09YSYmUy5yZXBsYWNlQ2hpbGQoYSxsKSxsPWwubmV4dFNpYmxpbmcpO2Vsc2UgZWUoYikmJmIubWFya0RpcnR5KCk7aWYobz1uLnRha2VSZWNvcmRzKCksMDxvLmxlbmd0aCl7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IoYT1vW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKWc9c1tkXSxtPWcucGFyZW50Tm9kZSxtPT1udWxsfHxnLm5vZGVOYW1lIT09IkJSInx8VGgoZyxhLHQpfHxtLnJlbW92ZUNoaWxkKGcpO24udGFrZVJlY29yZHMoKX1pIT09bnVsbCYmKHUmJihpLmRpcnR5PSEwLFdyKGkpKSxybyYmb0UodCkmJmkuaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e2FnPSExfX1mdW5jdGlvbiBZUyh0KXtsZXQgZT10Ll9vYnNlcnZlcjtpZihlIT09bnVsbCl7bGV0IG49ZS50YWtlUmVjb3JkcygpO0dTKHQsbixlKX19ZnVuY3Rpb24gWFModCl7ZHY9PT0wJiYkZih0KS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGVPLCEwKSx0Ll9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigoZSxuKT0+e0dTKHQsZSxuKX0pfWZ1bmN0aW9uIEQwKHQsZSl7bGV0IG49dC5fX21vZGUscj10Ll9fZm9ybWF0O3Q9dC5fX3N0eWxlO2xldCBpPWUuX19tb2RlLG89ZS5fX2Zvcm1hdDtyZXR1cm4gZT1lLl9fc3R5bGUsKG49PT1udWxsfHxuPT09aSkmJihyPT09bnVsbHx8cj09PW8pJiYodD09PW51bGx8fHQ9PT1lKX1mdW5jdGlvbiBqMCh0LGUpe2xldCBuPXQubWVyZ2VXaXRoU2libGluZyhlKSxyPXB0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQodC5fX2tleSksci5hZGQoZS5fX2tleSksbn1mdW5jdGlvbiBRUyh0KXtpZih0Ll9fdGV4dD09PSIiJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkpdC5yZW1vdmUoKTtlbHNle2Zvcih2YXIgZTsoZT10LmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJmVlKGUpJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCk7KWlmKGUuX190ZXh0PT09IiIpZS5yZW1vdmUoKTtlbHNle0QwKGUsdCkmJih0PWowKGUsdCkpO2JyZWFrfWZvcih2YXIgbjsobj10LmdldE5leHRTaWJsaW5nKCkpIT09bnVsbCYmZWUobikmJm4uaXNTaW1wbGVUZXh0KCkmJiFuLmlzVW5tZXJnZWFibGUoKTspaWYobi5fX3RleHQ9PT0iIiluLnJlbW92ZSgpO2Vsc2V7RDAodCxuKSYmajAodCxuKTticmVha319fWZ1bmN0aW9uIGZ2KHQpe3JldHVybiB6MCh0LmFuY2hvciksejAodC5mb2N1cyksdH1mdW5jdGlvbiB6MCh0KXtmb3IoO3QudHlwZT09PSJlbGVtZW50Ijspe3ZhciBlPXQuZ2V0Tm9kZSgpLG49dC5vZmZzZXQ7aWYobj09PWUuZ2V0Q2hpbGRyZW5TaXplKCk/KGU9ZS5nZXRDaGlsZEF0SW5kZXgobi0xKSxuPSEwKTooZT1lLmdldENoaWxkQXRJbmRleChuKSxuPSExKSxlZShlKSl7dC5zZXQoZS5fX2tleSxuP2UuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIVUoZSkpYnJlYWs7dC5zZXQoZS5fX2tleSxuP2UuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgbk89MSxyTz10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dD0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4odCl9O2Z1bmN0aW9uIGh2KHQpe2xldCBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoZT09PW51bGwpcmV0dXJuITE7bGV0IG49ZS5ub2RlTmFtZTtyZXR1cm4gdHQoRHUodCkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHxlLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmZS5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEl1KHQsZSxuKXtsZXQgcj10LmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyhlKSYmci5jb250YWlucyhuKSYmZSE9PW51bGwmJiFodihlKSYmcHYoZSk9PT10fWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBwdih0KXtmb3IoO3QhPW51bGw7KXtsZXQgZT10Ll9fbGV4aWNhbEVkaXRvcjtpZihlIT1udWxsKXJldHVybiBlO3Q9YmYodCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdWcodCl7cmV0dXJuIHQuaXNUb2tlbigpfHx0LmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gJGQodCl7Zm9yKDt0IT1udWxsOyl7aWYodC5ub2RlVHlwZT09PTMpcmV0dXJuIHQ7dD10LmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSlModCxlLG4pe3JldHVybiBlPUlvW2VdLHQmZSYmKG49PT1udWxsfHwhKG4mZSkpP3ReZTpuPT09bnVsbHx8biZlP3R8ZTp0fWZ1bmN0aW9uIHFTKHQpe3JldHVybiBlZSh0KXx8c3UodCl8fHR0KHQpfWZ1bmN0aW9uIGVFKHQsZSl7aWYoZSE9bnVsbCl0Ll9fa2V5PWU7ZWxzZXtobigpLDk5PGF1JiZHKDE0KSxlPXB0KCk7dmFyIG49UXIoKSxyPSIiK25PKys7bi5fbm9kZU1hcC5zZXQocix0KSxVKHQpP2UuX2RpcnR5RWxlbWVudHMuc2V0KHIsITApOmUuX2RpcnR5TGVhdmVzLmFkZChyKSxlLl9jbG9uZU5vdE5lZWRlZC5hZGQociksZS5fZGlydHlUeXBlPTEsdC5fX2tleT1yfX1mdW5jdGlvbiBEbyh0KXt2YXIgZT10LmdldFBhcmVudCgpO2lmKGUhPT1udWxsKXtsZXQgaT10LmdldFdyaXRhYmxlKCk7ZT1lLmdldFdyaXRhYmxlKCk7dmFyIG49dC5nZXRQcmV2aW91c1NpYmxpbmcoKTtpZih0PXQuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbClpZih0IT09bnVsbCl7dmFyIHI9dC5nZXRXcml0YWJsZSgpO2UuX19maXJzdD10Ll9fa2V5LHIuX19wcmV2PW51bGx9ZWxzZSBlLl9fZmlyc3Q9bnVsbDtlbHNle2lmKHI9bi5nZXRXcml0YWJsZSgpLHQhPT1udWxsKXtsZXQgbz10LmdldFdyaXRhYmxlKCk7by5fX3ByZXY9ci5fX2tleSxyLl9fbmV4dD1vLl9fa2V5fWVsc2Ugci5fX25leHQ9bnVsbDtpLl9fcHJldj1udWxsfXQ9PT1udWxsP24hPT1udWxsPyh0PW4uZ2V0V3JpdGFibGUoKSxlLl9fbGFzdD1uLl9fa2V5LHQuX19uZXh0PW51bGwpOmUuX19sYXN0PW51bGw6KHQ9dC5nZXRXcml0YWJsZSgpLG4hPT1udWxsPyhuPW4uZ2V0V3JpdGFibGUoKSxuLl9fbmV4dD10Ll9fa2V5LHQuX19wcmV2PW4uX19rZXkpOnQuX19wcmV2PW51bGwsaS5fX25leHQ9bnVsbCksZS5fX3NpemUtLSxpLl9fcGFyZW50PW51bGx9fWZ1bmN0aW9uIFRkKHQpezk5PGF1JiZHKDE0KTt2YXIgZT10LmdldExhdGVzdCgpLG49ZS5fX3BhcmVudCxyPVFyKCk7bGV0IGk9cHQoKSxvPXIuX25vZGVNYXA7aWYocj1pLl9kaXJ0eUVsZW1lbnRzLG4hPT1udWxsKWU6Zm9yKDtuIT09bnVsbDspe2lmKHIuaGFzKG4pKWJyZWFrIGU7bGV0IGw9by5nZXQobik7aWYobD09PXZvaWQgMClicmVhaztyLnNldChuLCExKSxuPWwuX19wYXJlbnR9ZT1lLl9fa2V5LGkuX2RpcnR5VHlwZT0xLFUodCk/ci5zZXQoZSwhMCk6aS5fZGlydHlMZWF2ZXMuYWRkKGUpfWZ1bmN0aW9uIEt0KHQpe2huKCk7dmFyIGU9cHQoKTtsZXQgbj1lLl9jb21wb3NpdGlvbktleTt0IT09biYmKGUuX2NvbXBvc2l0aW9uS2V5PXQsbiE9PW51bGwmJihlPUR0KG4pLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpLHQhPT1udWxsJiYodD1EdCh0KSx0IT09bnVsbCYmdC5nZXRXcml0YWJsZSgpKSl9ZnVuY3Rpb24gV2koKXtyZXR1cm4gTnMoKT9udWxsOnB0KCkuX2NvbXBvc2l0aW9uS2V5fWZ1bmN0aW9uIER0KHQsZSl7cmV0dXJuIHQ9KGV8fFFyKCkpLl9ub2RlTWFwLmdldCh0KSx0PT09dm9pZCAwP251bGw6dH1mdW5jdGlvbiB0RSh0LGUpe2xldCBuPXB0KCk7cmV0dXJuIHQ9dFtgX19sZXhpY2FsS2V5XyR7bi5fa2V5fWBdLHQhPT12b2lkIDA/RHQodCxlKTpudWxsfWZ1bmN0aW9uIER1KHQsZSl7Zm9yKDt0IT1udWxsOyl7bGV0IG49dEUodCxlKTtpZihuIT09bnVsbClyZXR1cm4gbjt0PWJmKHQpfXJldHVybiBudWxsfWZ1bmN0aW9uIG5FKHQpe2xldCBlPU9iamVjdC5hc3NpZ24oe30sdC5fZGVjb3JhdG9ycyk7cmV0dXJuIHQuX3BlbmRpbmdEZWNvcmF0b3JzPWV9ZnVuY3Rpb24gRjAodCl7cmV0dXJuIHQucmVhZCgoKT0+WXIoKS5nZXRUZXh0Q29udGVudCgpKX1mdW5jdGlvbiBpTyh0LGUpe1duKHQsKCk9Pnt2YXIgbj1RcigpO2lmKCFuLmlzRW1wdHkoKSlpZihlPT09InJvb3QiKVlyKCkubWFya0RpcnR5KCk7ZWxzZXtuPW4uX25vZGVNYXA7Zm9yKGxldFsscl1vZiBuKXIubWFya0RpcnR5KCl9fSx0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsP3t0YWc6Imhpc3RvcnktbWVyZ2UifTp2b2lkIDApfWZ1bmN0aW9uIFlyKCl7cmV0dXJuIFFyKCkuX25vZGVNYXAuZ2V0KCJyb290Iil9ZnVuY3Rpb24gV3IodCl7aG4oKTtsZXQgZT1RcigpO3QhPT1udWxsJiYodC5kaXJ0eT0hMCx0Ll9jYWNoZWROb2Rlcz1udWxsKSxlLl9zZWxlY3Rpb249dH1mdW5jdGlvbiBqbCh0KXt2YXIgZT1wdCgpLG47ZTp7Zm9yKG49dDtuIT1udWxsOyl7bGV0IHI9bltgX19sZXhpY2FsS2V5XyR7ZS5fa2V5fWBdO2lmKHIhPT12b2lkIDApe249cjticmVhayBlfW49YmYobil9bj1udWxsfXJldHVybiBuPT09bnVsbD8oZT1lLmdldFJvb3RFbGVtZW50KCksdD09PWU/RHQoInJvb3QiKTpudWxsKTpEdChuKX1mdW5jdGlvbiByRSh0KXtyZXR1cm4vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2cudGVzdCh0KX1mdW5jdGlvbiBndih0KXtsZXQgZT1bXTtmb3IoO3QhPT1udWxsOyllLnB1c2godCksdD10Ll9wYXJlbnRFZGl0b3I7cmV0dXJuIGV9ZnVuY3Rpb24gaUUoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvW15hLXpdKy9nLCIiKS5zdWJzdHIoMCw1KX1mdW5jdGlvbiBtdih0LGUsbil7aWYoZT1YcihlLl93aW5kb3cpLGUhPT1udWxsKXt2YXIgcj1lLmFuY2hvck5vZGUse2FuY2hvck9mZnNldDppLGZvY3VzT2Zmc2V0Om99PWU7aWYociE9PW51bGwmJihlPXIubm9kZVR5cGU9PT0zP3Iubm9kZVZhbHVlOm51bGwscj1EdShyKSxlIT09bnVsbCYmZWUocikpKXtpZihlPT09a2YmJm4pe2xldCBsPW4ubGVuZ3RoO2U9bixvPWk9bH1lIT09bnVsbCYmdnYocixlLGksbyx0KX19fWZ1bmN0aW9uIHZ2KHQsZSxuLHIsaSl7bGV0IG89dDtpZihvLmlzQXR0YWNoZWQoKSYmKGl8fCFvLmlzRGlydHkoKSkpe2xldCB1PW8uaXNDb21wb3NpbmcoKSxjPWU7aWYoKHV8fGkpJiZlW2UubGVuZ3RoLTFdPT09a2YmJihjPWUuc2xpY2UoMCwtMSkpLGU9by5nZXRUZXh0Q29udGVudCgpLGl8fGMhPT1lKWlmKGM9PT0iIilpZihLdChudWxsKSx1dnx8Q2Z8fGN2KW8ucmVtb3ZlKCk7ZWxzZXtsZXQgZD1wdCgpO3NldFRpbWVvdXQoKCk9PntkLnVwZGF0ZSgoKT0+e28uaXNBdHRhY2hlZCgpJiZvLnJlbW92ZSgpfSl9LDIwKX1lbHNle2k9by5nZXRQYXJlbnQoKSxlPVRzKCk7dmFyIGw9by5nZXRUZXh0Q29udGVudFNpemUoKSxzPVdpKCksYT1vLmdldEtleSgpO28uaXNUb2tlbigpfHxzIT09bnVsbCYmYT09PXMmJiF1fHx2ZShlKSYmKGkhPT1udWxsJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJmUuYW5jaG9yLm9mZnNldD09PTB8fGUuYW5jaG9yLmtleT09PXQuX19rZXkmJmUuYW5jaG9yLm9mZnNldD09PTAmJiFvLmNhbkluc2VydFRleHRCZWZvcmUoKXx8ZS5mb2N1cy5rZXk9PT10Ll9fa2V5JiZlLmZvY3VzLm9mZnNldD09PWwmJiFvLmNhbkluc2VydFRleHRBZnRlcigpKT9vLm1hcmtEaXJ0eSgpOih0PXJ0KCksdmUodCkmJm4hPT1udWxsJiZyIT09bnVsbCYmKHQuc2V0VGV4dE5vZGVSYW5nZShvLG4sbyxyKSxvLmlzU2VnbWVudGVkKCkmJihuPW8uZ2V0VGV4dENvbnRlbnQoKSxuPUx0KG4pLG8ucmVwbGFjZShuKSxvPW4pKSxvLnNldFRleHRDb250ZW50KGMpKX19fWZ1bmN0aW9uIG9PKHQsZSl7aWYoZS5pc1NlZ21lbnRlZCgpKXJldHVybiEwO2lmKCF0LmlzQ29sbGFwc2VkKCkpcmV0dXJuITE7dD10LmFuY2hvci5vZmZzZXQ7bGV0IG49ZS5nZXRQYXJlbnRPclRocm93KCkscj1lLmlzVG9rZW4oKTtyZXR1cm4gdD09PTA/KCh0PSFlLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IW4uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHxyKXx8KGU9ZS5nZXRQcmV2aW91c1NpYmxpbmcoKSx0PShlZShlKXx8VShlKSYmZS5pc0lubGluZSgpKSYmIWUuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLHQpOnQ9PT1lLmdldFRleHRDb250ZW50U2l6ZSgpPyFlLmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiBiYSh0LGUpe3QuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJih0Ll9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj10Ll9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9bltlXTtyZXR1cm4gciE9PXZvaWQgMD9yOih0PXRbZV0sdHlwZW9mIHQ9PSJzdHJpbmciPyh0PXQuc3BsaXQoIiAiKSxuW2VdPXQpOnQpfWZ1bmN0aW9uIHl2KHQsZSxuLHIsaSl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LGU9ZS5nZXQobiksZT09PXZvaWQgMCYmRygzMyxuKSxuPWUua2xhc3MsZT10LmdldChuKSxlPT09dm9pZCAwJiYoZT1uZXcgTWFwLHQuc2V0KG4sZSkpLHQ9ZS5nZXQociksbj10PT09ImRlc3Ryb3llZCImJmk9PT0iY3JlYXRlZCIsKHQ9PT12b2lkIDB8fG4pJiZlLnNldChyLG4/InVwZGF0ZWQiOmkpKX1mdW5jdGlvbiBCMCh0LGUsbil7bGV0IHI9dC5nZXRQYXJlbnQoKSxpPW47cmV0dXJuIHIhPT1udWxsJiYoZSYmbj09PTA/KGk9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLHQ9cik6ZXx8biE9PXQuZ2V0Q2hpbGRyZW5TaXplKCl8fChpPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLHQ9cikpLHQuZ2V0Q2hpbGRBdEluZGV4KGU/aS0xOmkpfWZ1bmN0aW9uIGNnKHQsZSl7dmFyIG49dC5vZmZzZXQ7cmV0dXJuIHQudHlwZT09PSJlbGVtZW50Ij8odD10LmdldE5vZGUoKSxCMCh0LGUsbikpOih0PXQuZ2V0Tm9kZSgpLGUmJm49PT0wfHwhZSYmbj09PXQuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49ZT90LmdldFByZXZpb3VzU2libGluZygpOnQuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD9CMCh0LmdldFBhcmVudE9yVGhyb3coKSxlLHQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsoZT8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBvRSh0KXtyZXR1cm4gdD0odD0kZih0KS5ldmVudCkmJnQuaW5wdXRUeXBlLHQ9PT0iaW5zZXJ0RnJvbVBhc3RlInx8dD09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24gTmQodCl7cmV0dXJuIWduKHQpJiYhdC5pc0xhc3RDaGlsZCgpJiYhdC5pc0lubGluZSgpfWZ1bmN0aW9uIFJkKHQsZSl7cmV0dXJuIHQ9dC5fa2V5VG9ET01NYXAuZ2V0KGUpLHQ9PT12b2lkIDAmJkcoNzUsZSksdH1mdW5jdGlvbiBiZih0KXtyZXR1cm4gdD10LmFzc2lnbmVkU2xvdHx8dC5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0Lm5vZGVUeXBlPT09MTE/dC5ob3N0OnR9ZnVuY3Rpb24gT2QodCxlKXtmb3IodD10LmdldFBhcmVudCgpO3QhPT1udWxsOyl7aWYodC5pcyhlKSlyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gJGYodCl7cmV0dXJuIHQ9dC5fd2luZG93LHQ9PT1udWxsJiZHKDc4KSx0fWZ1bmN0aW9uIGxFKHQpe2Zvcih0PXQuZ2V0UGFyZW50T3JUaHJvdygpO3QhPT1udWxsJiYhdnIodCk7KXQ9dC5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHR9ZnVuY3Rpb24gdnIodCl7cmV0dXJuIGduKHQpfHxVKHQpJiZ0LmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIHNFKHQpe3JldHVybiB0PXQuY29uc3RydWN0b3IuY2xvbmUodCksZUUodCxudWxsKSx0fWZ1bmN0aW9uIGp1KHQpe3ZhciBlPXB0KCk7bGV0IG49dC5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIGU9ZS5fbm9kZXMuZ2V0KG4pLGU9PT12b2lkIDAmJkcoOTcpLGU9ZS5yZXBsYWNlLGUhPT1udWxsPyhlPWUodCksZSBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3J8fEcoOTgpLGUpOnR9ZnVuY3Rpb24gTmgodCxlKXt0PXQuZ2V0UGFyZW50KCksIWduKHQpfHxVKGUpfHx0dChlKXx8Ryg5OSl9ZnVuY3Rpb24gUmgodCl7cmV0dXJuKHR0KHQpfHxVKHQpJiYhdC5jYW5CZUVtcHR5KCkpJiYhdC5pc0lubGluZSgpfWZ1bmN0aW9uIGRnKHQsZSxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLGUuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLGU9dC5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIFhyKHQpe3JldHVybiB3aT8odHx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIGFFKHQsZSl7bGV0IG49dC5nZXRDaGlsZEF0SW5kZXgoZSk7bj09bnVsbCYmKG49dCksdnIodCkmJkcoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPXZyKHMpLHU9bCE9PW58fGE/c0UobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtpLG9dPXIobik7cmV0dXJuW2ksb119ZnVuY3Rpb24gUGQodCxlKXtmb3IoO3QhPT1ZcigpJiZ0IT1udWxsOyl7aWYoZSh0KSlyZXR1cm4gdDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbE8odCl7bGV0IGU9W10sbj1bdF07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZHKDExMiksVShyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PXQmJmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBUZih0KXtyZXR1cm4gdC5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gdUUodCxlLG4scixpLG8pe2Zvcih0PXQuZ2V0Rmlyc3RDaGlsZCgpO3QhPT1udWxsOyl7bGV0IGw9dC5fX2tleTt0Ll9fcGFyZW50PT09ZSYmKFUodCkmJnVFKHQsbCxuLHIsaSxvKSxuLmhhcyhsKXx8by5kZWxldGUobCksaS5wdXNoKGwpKSx0PXQuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24gc08odCxlLG4scil7dD10Ll9ub2RlTWFwLGU9ZS5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0W29db2Ygcil7bGV0IGw9ZS5nZXQobyk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChVKGwpJiZ1RShsLG8sdCxlLGksciksdC5oYXMobyl8fHIuZGVsZXRlKG8pLGkucHVzaChvKSl9Zm9yKGxldCBvIG9mIGkpZS5kZWxldGUobyk7Zm9yKGxldCBvIG9mIG4pcj1lLmdldChvKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KHQuaGFzKG8pfHxuLmRlbGV0ZShvKSxlLmRlbGV0ZShvKSl9bGV0IE50PSIiLGZuPSIiLG9pPSIiLGlvLHRuLGl1LGNFPSExLHh2PSExLE5mLEJjPW51bGwsZmcsaGcsS28sb28scGcsb3U7ZnVuY3Rpb24gVWModCxlKXtsZXQgbj1Lby5nZXQodCk7aWYoZSE9PW51bGwpe2xldCByPXZnKHQpO3IucGFyZW50Tm9kZT09PWUmJmUucmVtb3ZlQ2hpbGQocil9b28uaGFzKHQpfHx0bi5fa2V5VG9ET01NYXAuZGVsZXRlKHQpLFUobikmJih0PUFkKG4sS28pLGdnKHQsMCx0Lmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZ5dihvdSxpdSxOZixuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBnZyh0LGUsbixyKXtmb3IoO2U8PW47KytlKXtsZXQgaT10W2VdO2khPT12b2lkIDAmJlVjKGkscil9fWZ1bmN0aW9uIEVvKHQsZSl7dC5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsZSl9ZnVuY3Rpb24gZEUodCxlKXt2YXIgbj1pby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj10LmNsYXNzTGlzdC5jb250YWlucyhuKTswPGUmJiFyP3QuY2xhc3NMaXN0LmFkZChuKToxPmUmJnImJnQuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4Iix0LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsZT09PTA/IiI6YGNhbGMoJHtlfSAqICR7bn0pYCl9ZnVuY3Rpb24gZkUodCxlKXt0PXQuc3R5bGUsZT09PTA/RW8odCwiIik6ZT09PTE/RW8odCwibGVmdCIpOmU9PT0yP0VvKHQsImNlbnRlciIpOmU9PT0zP0VvKHQsInJpZ2h0Iik6ZT09PTQ/RW8odCwianVzdGlmeSIpOmU9PT01P0VvKHQsInN0YXJ0Iik6ZT09PTYmJkVvKHQsImVuZCIpfWZ1bmN0aW9uIFdjKHQsZSxuKXtsZXQgcj1vby5nZXQodCk7cj09PXZvaWQgMCYmRyg2MCk7bGV0IGk9ci5jcmVhdGVET00oaW8sdG4pO3ZhciBvPXRuLl9rZXlUb0RPTU1hcDtpZihpWyJfX2xleGljYWxLZXlfIit0bi5fa2V5XT10LG8uc2V0KHQsaSksZWUocik/aS5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC10ZXh0IiwidHJ1ZSIpOnR0KHIpJiZpLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWRlY29yYXRvciIsInRydWUiKSxVKHIpKXtpZih0PXIuX19pbmRlbnQsbz1yLl9fc2l6ZSx0IT09MCYmZEUoaSx0KSxvIT09MCl7LS1vLHQ9QWQocixvbyk7dmFyIGw9Zm47Zm49IiIsbWcodCxyLDAsbyxpLG51bGwpLHBFKHIsaSksZm49bH10PXIuX19mb3JtYXQsdCE9PTAmJmZFKGksdCksci5pc0lubGluZSgpfHxoRShudWxsLHIsaSksTmQocikmJihOdCs9YAoKYCxvaSs9YAoKYCl9ZWxzZSBvPXIuZ2V0VGV4dENvbnRlbnQoKSx0dChyKT8obD1yLmRlY29yYXRlKHRuLGlvKSxsIT09bnVsbCYmZ0UodCxsKSxpLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiKTplZShyKSYmKHIuaXNEaXJlY3Rpb25sZXNzKCl8fChmbis9bykpLE50Kz1vLG9pKz1vO3JldHVybiBlIT09bnVsbCYmKG4hPW51bGw/ZS5pbnNlcnRCZWZvcmUoaSxuKToobj1lLl9fbGV4aWNhbExpbmVCcmVhayxuIT1udWxsP2UuaW5zZXJ0QmVmb3JlKGksbik6ZS5hcHBlbmRDaGlsZChpKSkpLHl2KG91LGl1LE5mLHIsImNyZWF0ZWQiKSxpfWZ1bmN0aW9uIG1nKHQsZSxuLHIsaSxvKXtsZXQgbD1OdDtmb3IoTnQ9IiI7bjw9cjsrK24pV2ModFtuXSxpLG8pO05kKGUpJiYoTnQrPWAKCmApLGkuX19sZXhpY2FsVGV4dENvbnRlbnQ9TnQsTnQ9bCtOdH1mdW5jdGlvbiBVMCh0LGUpe3JldHVybiB0PWUuZ2V0KHQpLHN1KHQpfHx0dCh0KSYmdC5pc0lubGluZSgpfWZ1bmN0aW9uIGhFKHQsZSxuKXt0PXQhPT1udWxsJiYodC5fX3NpemU9PT0wfHxVMCh0Ll9fbGFzdCxLbykpLGU9ZS5fX3NpemU9PT0wfHxVMChlLl9fbGFzdCxvbyksdD9lfHwoZT1uLl9fbGV4aWNhbExpbmVCcmVhayxlIT1udWxsJiZuLnJlbW92ZUNoaWxkKGUpLG4uX19sZXhpY2FsTGluZUJyZWFrPW51bGwpOmUmJihlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIiksbi5fX2xleGljYWxMaW5lQnJlYWs9ZSxuLmFwcGVuZENoaWxkKGUpKX1mdW5jdGlvbiBwRSh0LGUpe3ZhciBuPWUuX19sZXhpY2FsRGlyO2lmKGUuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQhPT1mbnx8biE9PUJjKXtsZXQgbz1mbj09PSIiO2lmKG8pdmFyIHI9QmM7ZWxzZSByPWZuLHI9R1IudGVzdChyKT8icnRsIjpZUi50ZXN0KHIpPyJsdHIiOm51bGw7aWYociE9PW4pe2xldCBsPWUuY2xhc3NMaXN0LHM9aW8udGhlbWU7dmFyIGk9biE9PW51bGw/c1tuXTp2b2lkIDA7bGV0IGE9ciE9PW51bGw/c1tyXTp2b2lkIDA7aSE9PXZvaWQgMCYmKHR5cGVvZiBpPT0ic3RyaW5nIiYmKGk9aS5zcGxpdCgiICIpLGk9c1tuXT1pKSxsLnJlbW92ZSguLi5pKSkscj09PW51bGx8fG8mJnI9PT0ibHRyIj9lLnJlbW92ZUF0dHJpYnV0ZSgiZGlyIik6KGEhPT12b2lkIDAmJih0eXBlb2YgYT09InN0cmluZyImJihuPWEuc3BsaXQoIiAiKSxhPXNbcl09biksYSE9PXZvaWQgMCYmbC5hZGQoLi4uYSkpLGUuZGlyPXIpLHh2fHwodC5nZXRXcml0YWJsZSgpLl9fZGlyPXIpfUJjPXIsZS5fX2xleGljYWxEaXJUZXh0Q29udGVudD1mbixlLl9fbGV4aWNhbERpcj1yfX1mdW5jdGlvbiBBZCh0LGUpe2xldCBuPVtdO2Zvcih0PXQuX19maXJzdDt0IT09bnVsbDspe2xldCByPWUuZ2V0KHQpO3I9PT12b2lkIDAmJkcoMTAxKSxuLnB1c2godCksdD1yLl9fbmV4dH1yZXR1cm4gbn1mdW5jdGlvbiB1YSh0LGUpe3ZhciBuPUtvLmdldCh0KSxyPW9vLmdldCh0KTtuIT09dm9pZCAwJiZyIT09dm9pZCAwfHxHKDYxKTt2YXIgaT1jRXx8aGcuaGFzKHQpfHxmZy5oYXModCk7bGV0IG89UmQodG4sdCk7aWYobj09PXImJiFpKXJldHVybiBVKG4pPyhyPW8uX19sZXhpY2FsVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKE50Kz1yLG9pKz1yKSxyPW8uX19sZXhpY2FsRGlyVGV4dENvbnRlbnQsciE9PXZvaWQgMCYmKGZuKz1yKSk6KHI9bi5nZXRUZXh0Q29udGVudCgpLGVlKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKGZuKz1yKSxvaSs9cixOdCs9ciksbztpZihuIT09ciYmaSYmeXYob3UsaXUsTmYsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4sbyxpbykpcmV0dXJuIHI9V2ModCxudWxsLG51bGwpLGU9PT1udWxsJiZHKDYyKSxlLnJlcGxhY2VDaGlsZChyLG8pLFVjKHQsbnVsbCkscjtpZihVKG4pJiZVKHIpKXtpZih0PXIuX19pbmRlbnQsdCE9PW4uX19pbmRlbnQmJmRFKG8sdCksdD1yLl9fZm9ybWF0LHQhPT1uLl9fZm9ybWF0JiZmRShvLHQpLGkpe3Q9cixpPWZuLGZuPSIiLGU9TnQ7dmFyIGw9bi5fX3NpemUscz10Ll9fc2l6ZTtpZihOdD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PXQuX19maXJzdDtpZihhPT09dSl1YShhLG8pO2Vsc2V7dmFyIGM9dmcoYSk7dT1XYyh1LG51bGwsbnVsbCksby5yZXBsYWNlQ2hpbGQodSxjKSxVYyhhLG51bGwpfX1lbHNle3U9QWQobixLbyk7dmFyIGQ9QWQodCxvbyk7aWYobD09PTApcyE9PTAmJm1nKGQsdCwwLHMtMSxvLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPW8uX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLGdnKHUsMCxsLTEsYT9udWxsOm8pLGEmJihvLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgbT1vLmZpcnN0Q2hpbGQsZz0wO2ZvcihzPTA7Zzw9ZCYmczw9bDspe3ZhciBoPWZbZ107bGV0IHc9dVtzXTtpZihoPT09dyltPU9oKHVhKHcsbykpLGcrKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKHcpO3Y/KHk/KGg9UmQodG4sdyksaD09PW0/bT1PaCh1YSh3LG8pKToobSE9bnVsbD9vLmluc2VydEJlZm9yZShoLG0pOm8uYXBwZW5kQ2hpbGQoaCksdWEodyxvKSksZysrKTpXYyh3LG8sbSkscysrKToobT1PaCh2ZyhoKSksVWMoaCxvKSxnKyspfX1hPWc+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6dG4uZ2V0RWxlbWVudEJ5S2V5KGEpLG1nKHUsdCxzLGwsbyxhKSk6YyYmIWEmJmdnKGYsZyxkLG8pfX1OZCh0KSYmKE50Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PU50LE50PWUrTnQscEUodCxvKSxmbj1pLGduKHIpfHxyLmlzSW5saW5lKCl8fGhFKG4scixvKX1OZChyKSYmKE50Kz1gCgpgLG9pKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLHR0KHIpPyhpPXIuZGVjb3JhdGUodG4saW8pLGkhPT1udWxsJiZnRSh0LGkpKTplZShyKSYmIXIuaXNEaXJlY3Rpb25sZXNzKCkmJihmbis9biksTnQrPW4sb2krPW47cmV0dXJuIXh2JiZnbihyKSYmci5fX2NhY2hlZFRleHQhPT1vaSYmKHI9ci5nZXRXcml0YWJsZSgpLHIuX19jYWNoZWRUZXh0PW9pKSxvfWZ1bmN0aW9uIGdFKHQsZSl7bGV0IG49dG4uX3BlbmRpbmdEZWNvcmF0b3JzLHI9dG4uX2RlY29yYXRvcnM7aWYobj09PW51bGwpe2lmKHJbdF09PT1lKXJldHVybjtuPW5FKHRuKX1uW3RdPWV9ZnVuY3Rpb24gT2godCl7cmV0dXJuIHQ9dC5uZXh0U2libGluZyx0IT09bnVsbCYmdD09PXRuLl9ibG9ja0N1cnNvckVsZW1lbnQmJih0PXQubmV4dFNpYmxpbmcpLHR9ZnVuY3Rpb24gdmcodCl7bGV0IGU9cGcuZ2V0KHQpO3JldHVybiBlPT09dm9pZCAwJiZHKDc1LHQpLGV9bGV0IGVpPU9iamVjdC5mcmVlemUoe30pLHlnPVtbImtleWRvd24iLGdPXSxbInBvaW50ZXJkb3duIix1T10sWyJjb21wb3NpdGlvbnN0YXJ0IixoT10sWyJjb21wb3NpdGlvbmVuZCIscE9dLFsiaW5wdXQiLGZPXSxbImNsaWNrIixhT10sWyJjdXQiLGVpXSxbImNvcHkiLGVpXSxbImRyYWdzdGFydCIsZWldLFsiZHJhZ292ZXIiLGVpXSxbImRyYWdlbmQiLGVpXSxbInBhc3RlIixlaV0sWyJmb2N1cyIsZWldLFsiYmx1ciIsZWldLFsiZHJvcCIsZWldXTtiZCYmeWcucHVzaChbImJlZm9yZWlucHV0IiwodCxlKT0+ZE8odCxlKV0pO2xldCBsdT0wLG1FPTAsdkU9MCxDbD1udWxsLCRhPTAseGc9ITEsX2c9ITEsVGE9ITEsY2E9ITEseUU9WzAsIiIsMCwicm9vdCIsMF07ZnVuY3Rpb24geEUodCxlLG4scixpKXtsZXQgbz10LmFuY2hvcixsPXQuZm9jdXMscz1vLmdldE5vZGUoKTt2YXIgYT1wdCgpO2xldCB1PVhyKGEuX3dpbmRvdyksYz11IT09bnVsbD91LmFuY2hvck5vZGU6bnVsbCxkPW8ua2V5O2E9YS5nZXRFbGVtZW50QnlLZXkoZCk7bGV0IGY9bi5sZW5ndGg7cmV0dXJuIGQhPT1sLmtleXx8IWVlKHMpfHwoIWkmJighYmR8fHZFPHIrNTApfHxzLmlzRGlydHkoKSYmMj5mfHxyRShuKSkmJm8ub2Zmc2V0IT09bC5vZmZzZXQmJiFzLmlzQ29tcG9zaW5nKCl8fHVnKHMpfHxzLmlzRGlydHkoKSYmMTxmfHwoaXx8IWJkKSYmYSE9PW51bGwmJiFzLmlzQ29tcG9zaW5nKCkmJmMhPT0kZChhKXx8dSE9PW51bGwmJmUhPT1udWxsJiYoIWUuY29sbGFwc2VkfHxlLnN0YXJ0Q29udGFpbmVyIT09dS5hbmNob3JOb2RlfHxlLnN0YXJ0T2Zmc2V0IT09dS5hbmNob3JPZmZzZXQpfHxzLmdldEZvcm1hdCgpIT09dC5mb3JtYXR8fHMuZ2V0U3R5bGUoKSE9PXQuc3R5bGV8fG9PKHQscyl9ZnVuY3Rpb24gVzAodCxlKXtyZXR1cm4gdCE9PW51bGwmJnQubm9kZVZhbHVlIT09bnVsbCYmdC5ub2RlVHlwZT09PTMmJmUhPT0wJiZlIT09dC5ub2RlVmFsdWUubGVuZ3RofWZ1bmN0aW9uIFYwKHQsZSxuKXtsZXR7YW5jaG9yTm9kZTpyLGFuY2hvck9mZnNldDppLGZvY3VzTm9kZTpvLGZvY3VzT2Zmc2V0Omx9PXQ7eGcmJih4Zz0hMSxXMChyLGkpJiZXMChvLGwpKXx8V24oZSwoKT0+e2lmKCFuKVdyKG51bGwpO2Vsc2UgaWYoSXUoZSxyLG8pKXt2YXIgcz1ydCgpO2lmKHZlKHMpKXt2YXIgYT1zLmFuY2hvcix1PWEuZ2V0Tm9kZSgpO2lmKHMuaXNDb2xsYXBzZWQoKSl7dC50eXBlPT09IlJhbmdlIiYmdC5hbmNob3JOb2RlPT09dC5mb2N1c05vZGUmJihzLmRpcnR5PSEwKTt2YXIgYz0kZihlKS5ldmVudDtjPWM/Yy50aW1lU3RhbXA6cGVyZm9ybWFuY2Uubm93KCk7bGV0W2QsZixoLG0sZ109eUU7YzxnKzIwMCYmYS5vZmZzZXQ9PT1oJiZhLmtleT09PW0/KHMuZm9ybWF0PWQscy5zdHlsZT1mKTphLnR5cGU9PT0idGV4dCI/KHMuZm9ybWF0PXUuZ2V0Rm9ybWF0KCkscy5zdHlsZT11LmdldFN0eWxlKCkpOmEudHlwZT09PSJlbGVtZW50IiYmKHMuZm9ybWF0PTAscy5zdHlsZT0iIil9ZWxzZXthPTI1NSx1PSExLGM9cy5nZXROb2RlcygpO2xldCBkPWMubGVuZ3RoO2ZvcihsZXQgZj0wO2Y8ZDtmKyspe2xldCBoPWNbZl07aWYoZWUoaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1KKGUsRWYsdm9pZCAwKX19KX1mdW5jdGlvbiBhTyh0LGUpe1duKGUsKCk9PntsZXQgbj1ydCgpO3ZhciByPVhyKGUuX3dpbmRvdyk7bGV0IGk9VHMoKTtpZihyKWlmKHZlKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgbz1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhZ24obykmJllyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZvLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJmkhPT1udWxsJiZuLmlzKGkpPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOnQuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxvIT09ciYmKFUobyk/by5zZWxlY3QoMCk6by5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSB0LnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKG89ci5hbmNob3JOb2RlLG8hPT1udWxsJiYobz1vLm5vZGVUeXBlLG89PT0xfHxvPT09MykpJiYocj13dihpLHIsZSksV3IocikpO0ooZSxUUyx0KX0pfWZ1bmN0aW9uIHVPKHQsZSl7bGV0IG49dC50YXJnZXQ7dD10LnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZ0IT09InRvdWNoIiYmV24oZSwoKT0+e3R0KER1KG4pKXx8KF9nPSEwKX0pfWZ1bmN0aW9uIF9FKHQpe3JldHVybiB0LmdldFRhcmdldFJhbmdlcz8odD10LmdldFRhcmdldFJhbmdlcygpLHQubGVuZ3RoPT09MD9udWxsOnRbMF0pOm51bGx9ZnVuY3Rpb24gY08odCxlKXtyZXR1cm4gdCE9PWV8fFUodCl8fFUoZSl8fCF0LmlzVG9rZW4oKXx8IWUuaXNUb2tlbigpfWZ1bmN0aW9uIGRPKHQsZSl7bGV0IG49dC5pbnB1dFR5cGUscj1fRSh0KTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fHJvJiZvRShlKXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZXbihlLCgpPT57bGV0IGk9cnQoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKGk9PT1udWxsKXt2YXIgbz1UcygpO2lmKCF2ZShvKSlyZXR1cm47V3Ioby5jbG9uZSgpKX1pZih2ZShpKSl7bUU9PT0yMjkmJnQudGltZVN0YW1wPGx1KzMwJiZlLmlzQ29tcG9zaW5nKCkmJmkuYW5jaG9yLmtleT09PWkuZm9jdXMua2V5PyhLdChudWxsKSxsdT0wLHNldFRpbWVvdXQoKCk9PntXbihlLCgpPT57S3QobnVsbCl9KX0sMzApLHZlKGkpJiYobz1pLmFuY2hvci5nZXROb2RlKCksby5tYXJrRGlydHkoKSxpLmZvcm1hdD1vLmdldEZvcm1hdCgpLGkuc3R5bGU9by5nZXRTdHlsZSgpKSk6KHQucHJldmVudERlZmF1bHQoKSxKKGUsdHUsITApKTtyZXR1cm59fWlmKHZlKGkpKXtvPXQuZGF0YSxDbCE9PW51bGwmJm12KCExLGUsQ2wpLGkuZGlydHkmJkNsPT09bnVsbHx8IWkuaXNDb2xsYXBzZWQoKXx8Z24oaS5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fGkuYXBwbHlET01SYW5nZShyKSxDbD1udWxsO3ZhciBsPWkuZm9jdXMscz1pLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpbz09PWAKYD8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxrYSwhMSkpOm89PT1gCgpgPyh0LnByZXZlbnREZWZhdWx0KCksSihlLG9nLHZvaWQgMCkpOm89PW51bGwmJnQuZGF0YVRyYW5zZmVyPyhvPXQuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSx0LnByZXZlbnREZWZhdWx0KCksaS5pbnNlcnRSYXdUZXh0KG8pKTpvIT1udWxsJiZ4RShpLHIsbyx0LnRpbWVTdGFtcCwhMCk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsR2wsbykpOkNsPW8sdkU9dC50aW1lU3RhbXA7ZWxzZSBzd2l0Y2godC5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpKKGUsR2wsdCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOkt0KG51bGwpLEooZSxHbCx0KTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6S3QobnVsbCksSihlLGthLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6S3QobnVsbCksVGEmJiFDZj8oVGE9ITEsSihlLGthLCExKSk6SihlLG9nLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOkooZSxpdix0KTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOmNPKHMsbCkmJkooZSxsZyx0KTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6SihlLGxnLHQpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6SihlLHR1LCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6SihlLG51LCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpKKGUsbnUsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpKKGUscnUsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6SihlLHJ1LCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOkooZSxVaSwic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6SihlLFVpLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOkooZSxVaSwiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOkooZSxVaSwidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6SihlLG92LHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6SihlLGx2LHZvaWQgMCl9fX0pfWZ1bmN0aW9uIGZPKHQsZSl7dC5zdG9wUHJvcGFnYXRpb24oKSxXbihlLCgpPT57dmFyIG49cnQoKSxyPXQuZGF0YSxpPV9FKHQpO2lmKHIhPW51bGwmJnZlKG4pJiZ4RShuLGkscix0LnRpbWVTdGFtcCwhMSkpe2NhJiYod2coZSxyKSxjYT0hMSk7dmFyIG89bi5hbmNob3IsbD1vLmdldE5vZGUoKTtpZihpPVhyKGUuX3dpbmRvdyksaT09PW51bGwpcmV0dXJuO2xldCBzPW8ub2Zmc2V0OyhvPWJkJiYhbi5pc0NvbGxhcHNlZCgpJiZlZShsKSYmaS5hbmNob3JOb2RlIT09bnVsbCkmJihsPWwuZ2V0VGV4dENvbnRlbnQoKS5zbGljZSgwLHMpK3IrbC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKHMrbi5mb2N1cy5vZmZzZXQpLGk9aS5hbmNob3JOb2RlLG89bD09PShpLm5vZGVUeXBlPT09Mz9pLm5vZGVWYWx1ZTpudWxsKSksb3x8SihlLEdsLHIpLHI9ci5sZW5ndGgscm8mJjE8ciYmdC5pbnB1dFR5cGU9PT0iaW5zZXJ0Q29tcG9zaXRpb25UZXh0IiYmIWUuaXNDb21wb3NpbmcoKSYmKG4uYW5jaG9yLm9mZnNldC09ciksdXZ8fENmfHxjdnx8IWUuaXNDb21wb3NpbmcoKXx8KGx1PTAsS3QobnVsbCkpfWVsc2UgbXYoITEsZSxyIT09bnVsbD9yOnZvaWQgMCksY2EmJih3ZyhlLHJ8fHZvaWQgMCksY2E9ITEpO2huKCksbj1wdCgpLFlTKG4pfSksQ2w9bnVsbH1mdW5jdGlvbiBoTyh0LGUpe1duKGUsKCk9PntsZXQgbj1ydCgpO2lmKHZlKG4pJiYhZS5pc0NvbXBvc2luZygpKXtsZXQgcj1uLmFuY2hvcixpPW4uYW5jaG9yLmdldE5vZGUoKTtLdChyLmtleSksKHQudGltZVN0YW1wPGx1KzMwfHxyLnR5cGU9PT0iZWxlbWVudCJ8fCFuLmlzQ29sbGFwc2VkKCl8fGkuZ2V0Rm9ybWF0KCkhPT1uLmZvcm1hdHx8aS5nZXRTdHlsZSgpIT09bi5zdHlsZSkmJkooZSxHbCxaUil9fSl9ZnVuY3Rpb24gd2codCxlKXt2YXIgbj10Ll9jb21wb3NpdGlvbktleTtpZihLdChudWxsKSxuIT09bnVsbCYmZSE9bnVsbCl7aWYoZT09PSIiKXtlPUR0KG4pLHQ9JGQodC5nZXRFbGVtZW50QnlLZXkobikpLHQhPT1udWxsJiZ0Lm5vZGVWYWx1ZSE9PW51bGwmJmVlKGUpJiZ2dihlLHQubm9kZVZhbHVlLG51bGwsbnVsbCwhMCk7cmV0dXJufWlmKGVbZS5sZW5ndGgtMV09PT1gCmAmJihuPXJ0KCksdmUobikpKXtlPW4uZm9jdXMsbi5hbmNob3Iuc2V0KGUua2V5LGUub2Zmc2V0LGUudHlwZSksSih0LGtkLG51bGwpO3JldHVybn19bXYoITAsdCxlKX1mdW5jdGlvbiBwTyh0LGUpe3JvP2NhPSEwOlduKGUsKCk9Pnt3ZyhlLHQuZGF0YSl9KX1mdW5jdGlvbiBnTyh0LGUpe2lmKGx1PXQudGltZVN0YW1wLG1FPXQua2V5Q29kZSwhZS5pc0NvbXBvc2luZygpKXt2YXJ7a2V5Q29kZTpuLHNoaWZ0S2V5OnIsY3RybEtleTppLG1ldGFLZXk6byxhbHRLZXk6bH09dDtpZighSihlLE5TLHQpKXtpZihuIT09Mzl8fGl8fG98fGwpaWYobiE9PTM5fHxsfHxyfHwhaSYmIW8paWYobiE9PTM3fHxpfHxvfHxsKWlmKG4hPT0zN3x8bHx8cnx8IWkmJiFvKWlmKG4hPT0zOHx8aXx8bylpZihuIT09NDB8fGl8fG8paWYobj09PTEzJiZyKVRhPSEwLEooZSxrZCx0KTtlbHNlIGlmKG49PT0zMilKKGUsSVMsdCk7ZWxzZSBpZihRdCYmaSYmbj09PTc5KXQucHJldmVudERlZmF1bHQoKSxUYT0hMCxKKGUsa2EsITApO2Vsc2UgaWYobiE9PTEzfHxyKXt2YXIgcz1RdD9sfHxvPyExOm49PT04fHxuPT09NzImJmk6aXx8bHx8bz8hMTpuPT09ODtzP249PT04P0ooZSxEUyx0KToodC5wcmV2ZW50RGVmYXVsdCgpLEooZSx0dSwhMCkpOm49PT0yNz9KKGUsalMsdCk6KHM9UXQ/cnx8bHx8bz8hMTpuPT09NDZ8fG49PT02OCYmaTppfHxsfHxvPyExOm49PT00NixzP249PT00Nj9KKGUselMsdCk6KHQucHJldmVudERlZmF1bHQoKSxKKGUsdHUsITEpKTpuPT09OCYmKFF0P2w6aSk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsbnUsITApKTpuPT09NDYmJihRdD9sOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLG51LCExKSk6UXQmJm8mJm49PT04Pyh0LnByZXZlbnREZWZhdWx0KCksSihlLHJ1LCEwKSk6UXQmJm8mJm49PT00Nj8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxydSwhMSkpOm49PT02NiYmIWwmJihRdD9vOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLFVpLCJib2xkIikpOm49PT04NSYmIWwmJihRdD9vOmkpPyh0LnByZXZlbnREZWZhdWx0KCksSihlLFVpLCJ1bmRlcmxpbmUiKSk6bj09PTczJiYhbCYmKFF0P286aSk/KHQucHJldmVudERlZmF1bHQoKSxKKGUsVWksIml0YWxpYyIpKTpuIT09OXx8bHx8aXx8bz9uPT09OTAmJiFyJiYoUXQ/bzppKT8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxvdix2b2lkIDApKToocz1RdD9uPT09OTAmJm8mJnI6bj09PTg5JiZpfHxuPT09OTAmJmkmJnIscz8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxsdix2b2lkIDApKTokcyhlLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9uKT8ocz1yPyExOm49PT02Nz9RdD9vOmk6ITEscz8odC5wcmV2ZW50RGVmYXVsdCgpLEooZSxzdix0KSk6KHM9cj8hMTpuPT09ODg/UXQ/bzppOiExLHM/KHQucHJldmVudERlZmF1bHQoKSxKKGUsYXYsdCkpOm49PT02NSYmKFF0P286aSkmJih0LnByZXZlbnREZWZhdWx0KCksSihlLHNnLHQpKSkpOiFybyYmbj09PTY1JiYoUXQ/bzppKSYmKHQucHJldmVudERlZmF1bHQoKSxKKGUsc2csdCkpKTpKKGUsRlMsdCkpfWVsc2UgVGE9ITEsSihlLGtkLHQpO2Vsc2UgSihlLExTLHQpO2Vsc2UgSihlLE1TLHQpO2Vsc2UgSihlLEFTLHQpO2Vsc2UgSihlLFBTLHQpO2Vsc2UgSihlLE9TLHQpO2Vsc2UgSihlLFJTLHQpOyhpfHxyfHxsfHxvKSYmSihlLFpTLHQpfX19ZnVuY3Rpb24gd0UodCl7bGV0IGU9dC5fX2xleGljYWxFdmVudEhhbmRsZXM7cmV0dXJuIGU9PT12b2lkIDAmJihlPVtdLHQuX19sZXhpY2FsRXZlbnRIYW5kbGVzPWUpLGV9bGV0IFlsPW5ldyBNYXA7ZnVuY3Rpb24gU0UodCl7dD10LnRhcmdldDtsZXQgZT1Ycih0PT1udWxsP251bGw6dC5ub2RlVHlwZT09PTk/dC5kZWZhdWx0Vmlldzp0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO2lmKGUhPT1udWxsKXt2YXIgbj1wdihlLmFuY2hvck5vZGUpO2lmKG4hPT1udWxsKXtfZyYmKF9nPSExLFduKG4sKCk9Pnt2YXIgbD1UcygpLHM9ZS5hbmNob3JOb2RlO3MhPT1udWxsJiYocz1zLm5vZGVUeXBlLHM9PT0xfHxzPT09MykmJihsPXd2KGwsZSxuKSxXcihsKSl9KSksdD1ndihuKSx0PXRbdC5sZW5ndGgtMV07dmFyIHI9dC5fa2V5LGk9WWwuZ2V0KHIpLG89aXx8dDtvIT09biYmVjAoZSxvLCExKSxWMChlLG4sITApLG4hPT10P1lsLnNldChyLG4pOmkmJllsLmRlbGV0ZShyKX19fWZ1bmN0aW9uIG1PKHQsZSl7JGE9PT0wJiZ0Lm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixTRSksJGErKyx0Ll9fbGV4aWNhbEVkaXRvcj1lO2xldCBuPXdFKHQpO2ZvcihsZXQgcj0wO3I8eWcubGVuZ3RoO3IrKyl7bGV0W2ksb109eWdbcl0sbD10eXBlb2Ygbz09ImZ1bmN0aW9uIj9zPT57cy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLGUuaXNFZGl0YWJsZSgpJiZvKHMsZSkpfTpzPT57aWYocy5fbGV4aWNhbEhhbmRsZWQhPT0hMCYmKHMuX2xleGljYWxIYW5kbGVkPSEwLGUuaXNFZGl0YWJsZSgpKSlzd2l0Y2goaSl7Y2FzZSJjdXQiOnJldHVybiBKKGUsYXYscyk7Y2FzZSJjb3B5IjpyZXR1cm4gSihlLHN2LHMpO2Nhc2UicGFzdGUiOnJldHVybiBKKGUsaXYscyk7Y2FzZSJkcmFnc3RhcnQiOnJldHVybiBKKGUsVVMscyk7Y2FzZSJkcmFnb3ZlciI6cmV0dXJuIEooZSxXUyxzKTtjYXNlImRyYWdlbmQiOnJldHVybiBKKGUsVlMscyk7Y2FzZSJmb2N1cyI6cmV0dXJuIEooZSxIUyxzKTtjYXNlImJsdXIiOnJldHVybiBKKGUsS1Mscyk7Y2FzZSJkcm9wIjpyZXR1cm4gSihlLEJTLHMpfX07dC5hZGRFdmVudExpc3RlbmVyKGksbCksbi5wdXNoKCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKGksbCl9KX19ZnVuY3Rpb24gU2codCxlLG4pe2huKCk7dmFyIHI9dC5fX2tleTtsZXQgaT10LmdldFBhcmVudCgpO2lmKGkhPT1udWxsKXt2YXIgbz1ydCgpO2lmKHZlKG8pJiZVKHQpKXt2YXJ7YW5jaG9yOmwsZm9jdXM6c309byxhPWwuZ2V0Tm9kZSgpLHU9cy5nZXROb2RlKCk7T2QoYSx0KSYmbC5zZXQodC5fX2tleSwwLCJlbGVtZW50IiksT2QodSx0KSYmcy5zZXQodC5fX2tleSwwLCJlbGVtZW50Iil9aWYoYT1vLHU9ITEsdmUoYSkmJmUpe289YS5hbmNob3I7bGV0IGM9YS5mb2N1cztvLmtleT09PXImJihMZChvLHQsaSx0LmdldFByZXZpb3VzU2libGluZygpLHQuZ2V0TmV4dFNpYmxpbmcoKSksdT0hMCksYy5rZXk9PT1yJiYoTGQoYyx0LGksdC5nZXRQcmV2aW91c1NpYmxpbmcoKSx0LmdldE5leHRTaWJsaW5nKCkpLHU9ITApfWVsc2UgJHMoYSkmJmUmJnQuaXNTZWxlY3RlZCgpJiZ0LnNlbGVjdFByZXZpb3VzKCk7dmUoYSkmJmUmJiF1PyhyPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxEbyh0KSxNZChhLGksciwtMSkpOkRvKHQpLG58fHZyKGkpfHxpLmNhbkJlRW1wdHkoKXx8IWkuaXNFbXB0eSgpfHxTZyhpLGUpLGUmJmduKGkpJiZpLmlzRW1wdHkoKSYmaS5zZWxlY3RFbmQoKX19Y2xhc3MgenV7c3RhdGljIGdldFR5cGUoKXtHKDY0LHRoaXMubmFtZSl9c3RhdGljIGNsb25lKCl7Ryg2NSx0aGlzLm5hbWUpfWNvbnN0cnVjdG9yKGUpe3RoaXMuX190eXBlPXRoaXMuY29uc3RydWN0b3IuZ2V0VHlwZSgpLHRoaXMuX19uZXh0PXRoaXMuX19wcmV2PXRoaXMuX19wYXJlbnQ9bnVsbCxlRSh0aGlzLGUpfWdldFR5cGUoKXtyZXR1cm4gdGhpcy5fX3R5cGV9aXNBdHRhY2hlZCgpe2Zvcih2YXIgZT10aGlzLl9fa2V5O2UhPT1udWxsOyl7aWYoZT09PSJyb290IilyZXR1cm4hMDtpZihlPUR0KGUpLGU9PT1udWxsKWJyZWFrO2U9ZS5fX3BhcmVudH1yZXR1cm4hMX1pc1NlbGVjdGVkKGUpe2lmKGU9ZXx8cnQoKSxlPT1udWxsKXJldHVybiExO2xldCBuPWUuZ2V0Tm9kZXMoKS5zb21lKHI9PnIuX19rZXk9PT10aGlzLl9fa2V5KTtyZXR1cm4gZWUodGhpcyk/bjp2ZShlKSYmZS5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmZS5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZlLmFuY2hvci5rZXk9PT1lLmZvY3VzLmtleSYmZS5hbmNob3Iub2Zmc2V0PT09ZS5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciBlPXRoaXMuZ2V0UGFyZW50KCk7aWYoZT09PW51bGwpcmV0dXJuLTE7ZT1lLmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7ZSE9PW51bGw7KXtpZih0aGlzLmlzKGUpKXJldHVybiBuO24rKyxlPWUuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgZT10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiBlPT09bnVsbD9udWxsOkR0KGUpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgZT10aGlzLmdldFBhcmVudCgpO3JldHVybiBlPT09bnVsbCYmRyg2Nix0aGlzLl9fa2V5KSxlfWdldFRvcExldmVsRWxlbWVudCgpe2xldCBlPXRoaXM7Zm9yKDtlIT09bnVsbDspe2xldCBuPWUuZ2V0UGFyZW50KCk7aWYodnIobikpcmV0dXJuIGU7ZT1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgZT10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiBlPT09bnVsbCYmRyg2Nyx0aGlzLl9fa2V5KSxlfWdldFBhcmVudHMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspZS5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gZX1nZXRQYXJlbnRLZXlzKCl7bGV0IGU9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIGV9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIGU9PT1udWxsP251bGw6RHQoZSl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCBlPVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIGU7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyllLnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIGV9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgZT10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gZT09PW51bGw/bnVsbDpEdChlKX1nZXROZXh0U2libGluZ3MoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyllLnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIGV9Z2V0Q29tbW9uQW5jZXN0b3IoZSl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9ZS5nZXRQYXJlbnRzKCk7VSh0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLFUoZSkmJnIudW5zaGlmdChlKSxlPW4ubGVuZ3RoO3ZhciBpPXIubGVuZ3RoO2lmKGU9PT0wfHxpPT09MHx8bltlLTFdIT09cltpLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksaT0wO2k8ZTtpKyspe2xldCBvPW5baV07aWYoci5oYXMobykpcmV0dXJuIG99cmV0dXJuIG51bGx9aXMoZSl7cmV0dXJuIGU9PW51bGw/ITE6dGhpcy5fX2tleT09PWUuX19rZXl9aXNCZWZvcmUoZSl7aWYodGhpcz09PWUpcmV0dXJuITE7aWYoZS5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZihlKSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKGUpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgaT1yLmdldFBhcmVudE9yVGhyb3coKTtpZihpPT09bil7aT1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1pfWZvcihyPWU7Oyl7aWYoZT1yLmdldFBhcmVudE9yVGhyb3coKSxlPT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1lfXJldHVybiBpPG59aXNQYXJlbnRPZihlKXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT1lLl9fa2V5KXJldHVybiExO2Zvcig7ZSE9PW51bGw7KXtpZihlLl9fa2V5PT09bilyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKGUpe2xldCBuPXRoaXMuaXNCZWZvcmUoZSkscj1bXSxpPW5ldyBTZXQ7Zm9yKHZhciBvPXRoaXM7Oyl7dmFyIGw9by5fX2tleTtpZihpLmhhcyhsKXx8KGkuYWRkKGwpLHIucHVzaChvKSksbz09PWUpYnJlYWs7aWYobD1VKG8pP24/by5nZXRGaXJzdENoaWxkKCk6by5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKW89bDtlbHNlIGlmKGw9bj9vLmdldE5leHRTaWJsaW5nKCk6by5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClvPWw7ZWxzZXtpZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGkuaGFzKG8uX19rZXkpfHxyLnB1c2gobyksbz09PWUpYnJlYWs7bD1vO2RvIGw9PT1udWxsJiZHKDY4KSxvPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYobyE9PW51bGx8fGkuaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKG89PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCBlPXB0KCkuX2RpcnR5TGVhdmVzO3JldHVybiBlIT09bnVsbCYmZS5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IGU9RHQodGhpcy5fX2tleSk7cmV0dXJuIGU9PT1udWxsJiZHKDExMyksZX1nZXRXcml0YWJsZSgpe2huKCk7dmFyIGU9UXIoKSxuPXB0KCk7ZT1lLl9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksaT10aGlzLmdldExhdGVzdCgpLG89aS5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPXJ0KCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KFRkKGkpLGkpOihsPWkuY29uc3RydWN0b3IuY2xvbmUoaSksbC5fX3BhcmVudD1vLGwuX19uZXh0PWkuX19uZXh0LGwuX19wcmV2PWkuX19wcmV2LFUoaSkmJlUobCk/KGwuX19maXJzdD1pLl9fZmlyc3QsbC5fX2xhc3Q9aS5fX2xhc3QsbC5fX3NpemU9aS5fX3NpemUsbC5fX2luZGVudD1pLl9faW5kZW50LGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fZGlyPWkuX19kaXIpOmVlKGkpJiZlZShsKSYmKGwuX19mb3JtYXQ9aS5fX2Zvcm1hdCxsLl9fc3R5bGU9aS5fX3N0eWxlLGwuX19tb2RlPWkuX19tb2RlLGwuX19kZXRhaWw9aS5fX2RldGFpbCksbi5hZGQociksbC5fX2tleT1yLFRkKGwpLGUuc2V0KHIsbCksbCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm4iIn1nZXRUZXh0Q29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aH1jcmVhdGVET00oKXtHKDcwKX11cGRhdGVET00oKXtHKDcxKX1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6dGhpcy5jcmVhdGVET00oZS5fY29uZmlnLGUpfX1leHBvcnRKU09OKCl7Ryg3Mil9c3RhdGljIGltcG9ydEpTT04oKXtHKDE4LHRoaXMubmFtZSl9c3RhdGljIHRyYW5zZm9ybSgpe3JldHVybiBudWxsfXJlbW92ZShlKXtTZyh0aGlzLCEwLGUpfXJlcGxhY2UoZSxuKXtobigpO3ZhciByPXJ0KCk7ciE9PW51bGwmJihyPXIuY2xvbmUoKSksTmgodGhpcyxlKTtsZXQgaT10aGlzLmdldExhdGVzdCgpLG89dGhpcy5fX2tleSxsPWUuX19rZXkscz1lLmdldFdyaXRhYmxlKCk7ZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBhPWUuX19zaXplO0RvKHMpO2xldCB1PWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksYz1pLmdldE5leHRTaWJsaW5nKCksZD1pLl9fcHJldixmPWkuX19uZXh0LGg9aS5fX3BhcmVudDtyZXR1cm4gU2coaSwhMSwhMCksdT09PW51bGw/ZS5fX2ZpcnN0PWw6dS5nZXRXcml0YWJsZSgpLl9fbmV4dD1sLHMuX19wcmV2PWQsYz09PW51bGw/ZS5fX2xhc3Q9bDpjLmdldFdyaXRhYmxlKCkuX19wcmV2PWwscy5fX25leHQ9ZixzLl9fcGFyZW50PWgsZS5fX3NpemU9YSxuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57cy5hcHBlbmQobSl9KSx2ZShyKSYmKFdyKHIpLG49ci5hbmNob3Iscj1yLmZvY3VzLG4ua2V5PT09byYmWjAobixzKSxyLmtleT09PW8mJlowKHIscykpLFdpKCk9PT1vJiZLdChsKSxzfWluc2VydEFmdGVyKGUsbj0hMCl7aG4oKSxOaCh0aGlzLGUpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgaT1lLmdldFdyaXRhYmxlKCk7dmFyIG89aS5nZXRQYXJlbnQoKTtsZXQgbD1ydCgpO3ZhciBzPSExLGE9ITE7aWYobyE9PW51bGwpe3ZhciB1PWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtEbyhpKSx2ZShsKSYmKGE9by5fX2tleSxzPWwuYW5jaG9yLG89bC5mb2N1cyxzPXMudHlwZT09PSJlbGVtZW50IiYmcy5rZXk9PT1hJiZzLm9mZnNldD09PXUrMSxhPW8udHlwZT09PSJlbGVtZW50IiYmby5rZXk9PT1hJiZvLm9mZnNldD09PXUrMSl9bz10aGlzLmdldE5leHRTaWJsaW5nKCksdT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpO2xldCBjPWkuX19rZXksZD1yLl9fbmV4dDtyZXR1cm4gbz09PW51bGw/dS5fX2xhc3Q9YzpvLmdldFdyaXRhYmxlKCkuX19wcmV2PWMsdS5fX3NpemUrKyxyLl9fbmV4dD1jLGkuX19uZXh0PWQsaS5fX3ByZXY9ci5fX2tleSxpLl9fcGFyZW50PXIuX19wYXJlbnQsbiYmdmUobCkmJihuPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxNZChsLHUsbisxKSxyPXUuX19rZXkscyYmbC5hbmNob3Iuc2V0KHIsbisyLCJlbGVtZW50IiksYSYmbC5mb2N1cy5zZXQocixuKzIsImVsZW1lbnQiKSksZX1pbnNlcnRCZWZvcmUoZSxuPSEwKXtobigpLE5oKHRoaXMsZSk7dmFyIHI9dGhpcy5nZXRXcml0YWJsZSgpO2xldCBpPWUuZ2V0V3JpdGFibGUoKSxvPWkuX19rZXk7RG8oaSk7bGV0IGw9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxzPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCksYT1yLl9fcHJldix1PXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTtyZXR1cm4gbD09PW51bGw/cy5fX2ZpcnN0PW86bC5nZXRXcml0YWJsZSgpLl9fbmV4dD1vLHMuX19zaXplKyssci5fX3ByZXY9byxpLl9fcHJldj1hLGkuX19uZXh0PXIuX19rZXksaS5fX3BhcmVudD1yLl9fcGFyZW50LHI9cnQoKSxuJiZ2ZShyKSYmKG49dGhpcy5nZXRQYXJlbnRPclRocm93KCksTWQocixuLHUpKSxlfWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMX1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiBabygpfXNlbGVjdFByZXZpb3VzKGUsbil7aG4oKTtsZXQgcj10aGlzLmdldFByZXZpb3VzU2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KDAsMCk6VShyKT9yLnNlbGVjdCgpOmVlKHIpP3Iuc2VsZWN0KGUsbik6KGU9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsaS5zZWxlY3QoZSxlKSl9c2VsZWN0TmV4dChlLG4pe2huKCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLGk9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP2kuc2VsZWN0KCk6VShyKT9yLnNlbGVjdCgwLDApOmVlKHIpP3Iuc2VsZWN0KGUsbik6KGU9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpLGkuc2VsZWN0KGUsZSkpfW1hcmtEaXJ0eSgpe3RoaXMuZ2V0V3JpdGFibGUoKX19Y2xhc3Mga3MgZXh0ZW5kcyB6dXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaW5lYnJlYWsifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IGtzKGUuX19rZXkpfWNvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWdldFRleHRDb250ZW50KCl7cmV0dXJuYApgfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YnI6ZT0+e2xldCBuPWUucGFyZW50RWxlbWVudCxyLGk7cmV0dXJuIG4hPT1udWxsJiYoKHI9bi5maXJzdENoaWxkKT09PWV8fHIubmV4dFNpYmxpbmc9PT1lJiZyLm5vZGVUeXBlPT09MyYmKHIudGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKSYmKChpPW4ubGFzdENoaWxkKT09PWV8fGkucHJldmlvdXNTaWJsaW5nPT09ZSYmaS5ub2RlVHlwZT09PTMmJihpLnRleHRDb250ZW50fHwiIikubWF0Y2goL14oIHxcdHxccj9cbikrJC8pIT09bnVsbCk/bnVsbDp7Y29udmVyc2lvbjp2Tyxwcmlvcml0eTowfX19fXN0YXRpYyBpbXBvcnRKU09OKCl7cmV0dXJuIGNzKCl9ZXhwb3J0SlNPTigpe3JldHVybnt0eXBlOiJsaW5lYnJlYWsiLHZlcnNpb246MX19fWZ1bmN0aW9uIHZPKCl7cmV0dXJue25vZGU6Y3MoKX19ZnVuY3Rpb24gY3MoKXtyZXR1cm4ganUobmV3IGtzKX1mdW5jdGlvbiBzdSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGtzfWZ1bmN0aW9uIFBoKHQsZSl7cmV0dXJuIGUmMTY/ImNvZGUiOmUmMTI4PyJtYXJrIjplJjMyPyJzdWIiOmUmNjQ/InN1cCI6bnVsbH1mdW5jdGlvbiBBaCh0LGUpe3JldHVybiBlJjE/InN0cm9uZyI6ZSYyPyJlbSI6InNwYW4ifWZ1bmN0aW9uIE1oKHQsZSxuLHIsaSl7dD1yLmNsYXNzTGlzdCxyPWJhKGksImJhc2UiKSxyIT09dm9pZCAwJiZ0LmFkZCguLi5yKSxyPWJhKGksInVuZGVybGluZVN0cmlrZXRocm91Z2giKTtsZXQgbz0hMSxsPWUmOCYmZSY0O3ZhciBzPW4mOCYmbiY0O3IhPT12b2lkIDAmJihzPyhvPSEwLGx8fHQuYWRkKC4uLnIpKTpsJiZ0LnJlbW92ZSguLi5yKSk7Zm9yKGxldCBhIGluIElvKXM9SW9bYV0scj1iYShpLGEpLHIhPT12b2lkIDAmJihuJnM/IW98fGEhPT0idW5kZXJsaW5lIiYmYSE9PSJzdHJpa2V0aHJvdWdoIj8oIShlJnMpfHxsJiZhPT09InVuZGVybGluZSJ8fGE9PT0ic3RyaWtldGhyb3VnaCIpJiZ0LmFkZCguLi5yKTplJnMmJnQucmVtb3ZlKC4uLnIpOmUmcyYmdC5yZW1vdmUoLi4ucikpfWZ1bmN0aW9uIExoKHQsZSxuKXtsZXQgcj1lLmZpcnN0Q2hpbGQ7aWYobj1uLmlzQ29tcG9zaW5nKCksdCs9bj9rZjoiIixyPT1udWxsKWUudGV4dENvbnRlbnQ9dDtlbHNlIGlmKGU9ci5ub2RlVmFsdWUsZSE9PXQpaWYobnx8cm8pe249ZS5sZW5ndGg7bGV0IGk9dC5sZW5ndGgsbz0wLGw9MDtmb3IoO288biYmbzxpJiZlW29dPT09dFtvXTspbysrO2Zvcig7bCtvPG4mJmwrbzxpJiZlW24tbC0xXT09PXRbaS1sLTFdOylsKys7dD1bbyxuLW8tbCx0LnNsaWNlKG8saS1sKV07bGV0W3MsYSx1XT10O2EhPT0wJiZyLmRlbGV0ZURhdGEocyxhKSxyLmluc2VydERhdGEocyx1KX1lbHNlIHIubm9kZVZhbHVlPXR9ZnVuY3Rpb24gbWModCxlKXtyZXR1cm4gZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLGUuYXBwZW5kQ2hpbGQodCksZX1jbGFzcyBzbCBleHRlbmRzIHp1e3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInRleHQifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IHNsKGUuX190ZXh0LGUuX19rZXkpfWNvbnN0cnVjdG9yKGUsbil7c3VwZXIobiksdGhpcy5fX3RleHQ9ZSx0aGlzLl9fZm9ybWF0PTAsdGhpcy5fX3N0eWxlPSIiLHRoaXMuX19kZXRhaWw9dGhpcy5fX21vZGU9MH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXREZXRhaWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbH1nZXRNb2RlKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKTtyZXR1cm4gcVJbZS5fX21vZGVdfWdldFN0eWxlKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zdHlsZX1pc1Rva2VuKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09MX1pc0NvbXBvc2luZygpe3JldHVybiB0aGlzLl9fa2V5PT09V2koKX1pc1NlZ21lbnRlZCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fbW9kZT09PTJ9aXNEaXJlY3Rpb25sZXNzKCl7cmV0dXJuKHRoaXMuZ2V0TGF0ZXN0KCkuX19kZXRhaWwmMSkhPT0wfWlzVW5tZXJnZWFibGUoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYyKSE9PTB9aGFzRm9ybWF0KGUpe3JldHVybiBlPUlvW2VdLCh0aGlzLmdldEZvcm1hdCgpJmUpIT09MH1pc1NpbXBsZVRleHQoKXtyZXR1cm4gdGhpcy5fX3R5cGU9PT0idGV4dCImJnRoaXMuX19tb2RlPT09MH1nZXRUZXh0Q29udGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGV4dH1nZXRGb3JtYXRGbGFncyhlLG4pe2xldCByPXRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXQ7cmV0dXJuIEpTKHIsZSxuKX1jcmVhdGVET00oZSl7dmFyIG49dGhpcy5fX2Zvcm1hdCxyPVBoKHRoaXMsbik7bGV0IGk9QWgodGhpcyxuKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj09PW51bGw/aTpyKSxsPW87cmV0dXJuIHRoaXMuaGFzRm9ybWF0KCJjb2RlIikmJm8uc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwiZmFsc2UiKSxyIT09bnVsbCYmKGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpKSxvLmFwcGVuZENoaWxkKGwpKSxyPWwsTGgodGhpcy5fX3RleHQscix0aGlzKSxlPWUudGhlbWUudGV4dCxlIT09dm9pZCAwJiZNaChpLDAsbixyLGUpLG49dGhpcy5fX3N0eWxlLG4hPT0iIiYmKG8uc3R5bGUuY3NzVGV4dD1uKSxvfXVwZGF0ZURPTShlLG4scil7bGV0IGk9dGhpcy5fX3RleHQ7dmFyIG89ZS5fX2Zvcm1hdCxsPXRoaXMuX19mb3JtYXQscz1QaCh0aGlzLG8pO2xldCBhPVBoKHRoaXMsbCk7dmFyIHU9QWgodGhpcyxvKTtsZXQgYz1BaCh0aGlzLGwpO3JldHVybihzPT09bnVsbD91OnMpIT09KGE9PT1udWxsP2M6YSk/ITA6cz09PWEmJnUhPT1jPyhvPW4uZmlyc3RDaGlsZCxvPT1udWxsJiZHKDQ4KSxlPXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjKSxMaChpLGUsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmTWgoYywwLGwsZSxyKSxuLnJlcGxhY2VDaGlsZChzLG8pLCExKToodT1uLGEhPT1udWxsJiZzIT09bnVsbCYmKHU9bi5maXJzdENoaWxkLHU9PW51bGwmJkcoNDkpKSxMaChpLHUsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmbyE9PWwmJk1oKGMsbyxsLHUsciksbD10aGlzLl9fc3R5bGUsZS5fX3N0eWxlIT09bCYmKG4uc3R5bGUuY3NzVGV4dD1sKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnsiI3RleHQiOigpPT4oe2NvbnZlcnNpb246X08scHJpb3JpdHk6MH0pLGI6KCk9Pih7Y29udmVyc2lvbjp4Tyxwcmlvcml0eTowfSksY29kZTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxlbTooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSxpOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHM6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksc3BhbjooKT0+KHtjb252ZXJzaW9uOnlPLHByaW9yaXR5OjB9KSxzdHJvbmc6KCk9Pih7Y29udmVyc2lvbjpSaSxwcmlvcml0eTowfSksc3ViOigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pLHN1cDooKT0+KHtjb252ZXJzaW9uOlJpLHByaW9yaXR5OjB9KSx1OigpPT4oe2NvbnZlcnNpb246UmkscHJpb3JpdHk6MH0pfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1MdChlLnRleHQpO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXREZXRhaWwoZS5kZXRhaWwpLG4uc2V0TW9kZShlLm1vZGUpLG4uc2V0U3R5bGUoZS5zdHlsZSksbn1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUhPT1udWxsJiZUZihlKXx8RygxMzIpLGUuc3R5bGUud2hpdGVTcGFjZT0icHJlLXdyYXAiLHRoaXMuaGFzRm9ybWF0KCJib2xkIikmJihlPW1jKGUsImIiKSksdGhpcy5oYXNGb3JtYXQoIml0YWxpYyIpJiYoZT1tYyhlLCJpIikpLHRoaXMuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikmJihlPW1jKGUsInMiKSksdGhpcy5oYXNGb3JtYXQoInVuZGVybGluZSIpJiYoZT1tYyhlLCJ1IikpLHtlbGVtZW50OmV9fWV4cG9ydEpTT04oKXtyZXR1cm57ZGV0YWlsOnRoaXMuZ2V0RGV0YWlsKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0KCksbW9kZTp0aGlzLmdldE1vZGUoKSxzdHlsZTp0aGlzLmdldFN0eWxlKCksdGV4dDp0aGlzLmdldFRleHRDb250ZW50KCksdHlwZToidGV4dCIsdmVyc2lvbjoxfX1zZWxlY3Rpb25UcmFuc2Zvcm0oKXt9c2V0Rm9ybWF0KGUpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2Zvcm1hdD10eXBlb2YgZT09InN0cmluZyI/SW9bZV06ZSxufXNldERldGFpbChlKXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kZXRhaWw9dHlwZW9mIGU9PSJzdHJpbmciP1hSW2VdOmUsbn1zZXRTdHlsZShlKXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19zdHlsZT1lLG59dG9nZ2xlRm9ybWF0KGUpe3JldHVybiBlPUlvW2VdLHRoaXMuc2V0Rm9ybWF0KHRoaXMuZ2V0Rm9ybWF0KCleZSl9dG9nZ2xlRGlyZWN0aW9ubGVzcygpe2xldCBlPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gZS5fX2RldGFpbF49MSxlfXRvZ2dsZVVubWVyZ2VhYmxlKCl7bGV0IGU9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBlLl9fZGV0YWlsXj0yLGV9c2V0TW9kZShlKXtpZihlPUpSW2VdLHRoaXMuX19tb2RlPT09ZSlyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19tb2RlPWUsbn1zZXRUZXh0Q29udGVudChlKXtpZih0aGlzLl9fdGV4dD09PWUpcmV0dXJuIHRoaXM7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fdGV4dD1lLG59c2VsZWN0KGUsbil7aG4oKTtsZXQgcj1ydCgpO3ZhciBpPXRoaXMuZ2V0VGV4dENvbnRlbnQoKTtsZXQgbz10aGlzLl9fa2V5O2lmKHR5cGVvZiBpPT0ic3RyaW5nIj8oaT1pLmxlbmd0aCxlPT09dm9pZCAwJiYoZT1pKSxuPT09dm9pZCAwJiYobj1pKSk6bj1lPTAsdmUocikpaT1XaSgpLGkhPT1yLmFuY2hvci5rZXkmJmkhPT1yLmZvY3VzLmtleXx8S3Qobyksci5zZXRUZXh0Tm9kZVJhbmdlKHRoaXMsZSx0aGlzLG4pO2Vsc2UgcmV0dXJuIGtFKG8sZSxvLG4sInRleHQiLCJ0ZXh0Iik7cmV0dXJuIHJ9c3BsaWNlVGV4dChlLG4scixpKXtsZXQgbz10aGlzLmdldFdyaXRhYmxlKCksbD1vLl9fdGV4dCxzPXIubGVuZ3RoLGE9ZTswPmEmJihhPXMrYSwwPmEmJihhPTApKTtsZXQgdT1ydCgpO3JldHVybiBpJiZ2ZSh1KSYmKGUrPXMsdS5zZXRUZXh0Tm9kZVJhbmdlKG8sZSxvLGUpKSxuPWwuc2xpY2UoMCxhKStyK2wuc2xpY2UoYStuKSxvLl9fdGV4dD1uLG99Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfXNwbGl0VGV4dCguLi5lKXtobigpO3ZhciBuPXRoaXMuZ2V0TGF0ZXN0KCkscj1uLmdldFRleHRDb250ZW50KCksaT1uLl9fa2V5LG89V2koKSxsPW5ldyBTZXQoZSk7ZT1bXTtmb3IodmFyIHM9ci5sZW5ndGgsYT0iIix1PTA7dTxzO3UrKylhIT09IiImJmwuaGFzKHUpJiYoZS5wdXNoKGEpLGE9IiIpLGErPXJbdV07aWYoYSE9PSIiJiZlLnB1c2goYSksbD1lLmxlbmd0aCxsPT09MClyZXR1cm5bXTtpZihlWzBdPT09cilyZXR1cm5bbl07dmFyIGM9ZVswXTtyPW4uZ2V0UGFyZW50T3JUaHJvdygpLHU9bi5nZXRGb3JtYXQoKTtsZXQgZD1uLmdldFN0eWxlKCksZj1uLl9fZGV0YWlsO3M9ITEsbi5pc1NlZ21lbnRlZCgpPyhhPUx0KGMpLGEuX19mb3JtYXQ9dSxhLl9fc3R5bGU9ZCxhLl9fZGV0YWlsPWYscz0hMCk6KGE9bi5nZXRXcml0YWJsZSgpLGEuX190ZXh0PWMpLG49cnQoKSxhPVthXSxjPWMubGVuZ3RoO2ZvcihsZXQgZz0xO2c8bDtnKyspe3ZhciBoPWVbZ10sbT1oLmxlbmd0aDtoPUx0KGgpLmdldFdyaXRhYmxlKCksaC5fX2Zvcm1hdD11LGguX19zdHlsZT1kLGguX19kZXRhaWw9ZjtsZXQgdz1oLl9fa2V5O2lmKG09YyttLHZlKG4pKXtsZXQgdj1uLmFuY2hvcix5PW4uZm9jdXM7di5rZXk9PT1pJiZ2LnR5cGU9PT0idGV4dCImJnYub2Zmc2V0PmMmJnYub2Zmc2V0PD1tJiYodi5rZXk9dyx2Lm9mZnNldC09YyxuLmRpcnR5PSEwKSx5LmtleT09PWkmJnkudHlwZT09PSJ0ZXh0IiYmeS5vZmZzZXQ+YyYmeS5vZmZzZXQ8PW0mJih5LmtleT13LHkub2Zmc2V0LT1jLG4uZGlydHk9ITApfW89PT1pJiZLdCh3KSxjPW0sYS5wdXNoKGgpfXJldHVybiBpPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCksbz10aGlzLmdldE5leHRTaWJsaW5nKCksaSE9PW51bGwmJlRkKGkpLG8hPT1udWxsJiZUZChvKSxpPXIuZ2V0V3JpdGFibGUoKSxvPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxzPyhpLnNwbGljZShvLDAsYSksdGhpcy5yZW1vdmUoKSk6aS5zcGxpY2UobywxLGEpLHZlKG4pJiZNZChuLHIsbyxsLTEpLGF9bWVyZ2VXaXRoU2libGluZyhlKXt2YXIgbj1lPT09dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKTtufHxlPT09dGhpcy5nZXROZXh0U2libGluZygpfHxHKDUwKTt2YXIgcj10aGlzLl9fa2V5O2xldCBpPWUuX19rZXksbz10aGlzLl9fdGV4dCxsPW8ubGVuZ3RoO1dpKCk9PT1pJiZLdChyKTtsZXQgcz1ydCgpO2lmKHZlKHMpKXtsZXQgYT1zLmFuY2hvcix1PXMuZm9jdXM7YSE9PW51bGwmJmEua2V5PT09aSYmKGV4KGEsbixyLGUsbCkscy5kaXJ0eT0hMCksdSE9PW51bGwmJnUua2V5PT09aSYmKGV4KHUsbixyLGUsbCkscy5kaXJ0eT0hMCl9cmV0dXJuIHI9ZS5fX3RleHQsdGhpcy5zZXRUZXh0Q29udGVudChuP3IrbzpvK3IpLG49dGhpcy5nZXRXcml0YWJsZSgpLGUucmVtb3ZlKCksbn1pc1RleHRFbnRpdHkoKXtyZXR1cm4hMX19ZnVuY3Rpb24geU8odCl7bGV0IGU9dC5zdHlsZS5mb250V2VpZ2h0PT09IjcwMCIsbj10LnN0eWxlLnRleHREZWNvcmF0aW9uPT09ImxpbmUtdGhyb3VnaCIscj10LnN0eWxlLmZvbnRTdHlsZT09PSJpdGFsaWMiLGk9dC5zdHlsZS50ZXh0RGVjb3JhdGlvbj09PSJ1bmRlcmxpbmUiLG89dC5zdHlsZS52ZXJ0aWNhbEFsaWduO3JldHVybntmb3JDaGlsZDpsPT4oZWUobCkmJihlJiZsLnRvZ2dsZUZvcm1hdCgiYm9sZCIpLG4mJmwudG9nZ2xlRm9ybWF0KCJzdHJpa2V0aHJvdWdoIiksciYmbC50b2dnbGVGb3JtYXQoIml0YWxpYyIpLGkmJmwudG9nZ2xlRm9ybWF0KCJ1bmRlcmxpbmUiKSxvPT09InN1YiImJmwudG9nZ2xlRm9ybWF0KCJzdWJzY3JpcHQiKSxvPT09InN1cGVyIiYmbC50b2dnbGVGb3JtYXQoInN1cGVyc2NyaXB0IikpLGwpLG5vZGU6bnVsbH19ZnVuY3Rpb24geE8odCl7bGV0IGU9dC5zdHlsZS5mb250V2VpZ2h0PT09Im5vcm1hbCI7cmV0dXJue2ZvckNoaWxkOm49PihlZShuKSYmIWUmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgSDA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gX08odCl7dC5wYXJlbnRFbGVtZW50PT09bnVsbCYmRygxMjkpO2Zvcih2YXIgZT10LnRleHRDb250ZW50fHwiIixuLHI9dC5wYXJlbnROb2RlLGk9W3RdO3IhPT1udWxsJiYobj1IMC5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KWkucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxpLmxlbmd0aDtyKyspSDAuc2V0KGlbcl0sbik7aWYobiE9PW51bGwpe2ZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSx0PVtdLGk9ZS5sZW5ndGgsbj0wO248aTtuKyspcj1lW25dLHI9PT1gCmB8fHI9PT1gXHIKYD90LnB1c2goY3MoKSk6cj09PSIJIj90LnB1c2goUmYoKSk6ciE9PSIiJiZ0LnB1c2goTHQocikpO3JldHVybntub2RlOnR9fWlmKGU9ZS5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksZT09PSIiKXJldHVybntub2RlOm51bGx9O2lmKGVbMF09PT0iICIpe2ZvcihpPXQsbj0hMDtpIT09bnVsbCYmKGk9SzAoaSwhMSkpIT09bnVsbDspaWYocj1pLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJihlPWUuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKGU9ZS5zbGljZSgxKSl9aWYoZVtlLmxlbmd0aC0xXT09PSIgIil7Zm9yKGk9ITA7dCE9PW51bGwmJih0PUswKHQsITApKSE9PW51bGw7KWlmKDA8KHQudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7aT0hMTticmVha31pJiYoZT1lLnNsaWNlKDAsZS5sZW5ndGgtMSkpfXJldHVybiBlPT09IiI/e25vZGU6bnVsbH06e25vZGU6THQoZSl9fWxldCB3Tz1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gSzAodCxlKXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49ZT90Lm5leHRTaWJsaW5nOnQucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKHQ9dC5wYXJlbnRFbGVtZW50LHQ9PT1udWxsKXJldHVybiBudWxsO2lmKHQ9bix0Lm5vZGVUeXBlPT09MSYmKG49dC5zdHlsZS5kaXNwbGF5LG49PT0iIiYmdC5ub2RlTmFtZS5tYXRjaCh3Tyk9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPWU/dC5maXJzdENoaWxkOnQubGFzdENoaWxkKSE9PW51bGw7KXQ9bjtpZih0Lm5vZGVUeXBlPT09MylyZXR1cm4gdDtpZih0Lm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IFNPPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIFJpKHQpe2xldCBlPVNPW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIGU9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihlZShuKSYmIW4uaGFzRm9ybWF0KGUpJiZuLnRvZ2dsZUZvcm1hdChlKSxuKSxub2RlOm51bGx9fWZ1bmN0aW9uIEx0KHQ9IiIpe3JldHVybiBqdShuZXcgc2wodCkpfWZ1bmN0aW9uIGVlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygc2x9Y2xhc3MgYnMgZXh0ZW5kcyBzbHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJ0YWIifXN0YXRpYyBjbG9uZShlKXtsZXQgbj1uZXcgYnMoZS5fX2tleSk7cmV0dXJuIG4uX190ZXh0PWUuX190ZXh0LG4uX19mb3JtYXQ9ZS5fX2Zvcm1hdCxuLl9fc3R5bGU9ZS5fX3N0eWxlLG59Y29uc3RydWN0b3IoZSl7c3VwZXIoIgkiLGUpLHRoaXMuX19kZXRhaWw9Mn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49UmYoKTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0U3R5bGUoZS5zdHlsZSksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJ0YWIiLHZlcnNpb246MX19c2V0VGV4dENvbnRlbnQoKXtHKDEyNil9c2V0RGV0YWlsKCl7RygxMjcpfXNldE1vZGUoKXtHKDEyOCl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfX1mdW5jdGlvbiBSZigpe3JldHVybiBqdShuZXcgYnMpfWNsYXNzIFZye2NvbnN0cnVjdG9yKGUsbixyKXt0aGlzLl9zZWxlY3Rpb249bnVsbCx0aGlzLmtleT1lLHRoaXMub2Zmc2V0PW4sdGhpcy50eXBlPXJ9aXMoZSl7cmV0dXJuIHRoaXMua2V5PT09ZS5rZXkmJnRoaXMub2Zmc2V0PT09ZS5vZmZzZXQmJnRoaXMudHlwZT09PWUudHlwZX1pc0JlZm9yZShlKXtsZXQgbj10aGlzLmdldE5vZGUoKSxyPWUuZ2V0Tm9kZSgpLGk9dGhpcy5vZmZzZXQ7aWYoZT1lLm9mZnNldCxVKG4pKXt2YXIgbz1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpO249bz8/bn1yZXR1cm4gVShyKSYmKG89ci5nZXREZXNjZW5kYW50QnlJbmRleChlKSxyPW8/P3IpLG49PT1yP2k8ZTpuLmlzQmVmb3JlKHIpfWdldE5vZGUoKXtsZXQgZT1EdCh0aGlzLmtleSk7cmV0dXJuIGU9PT1udWxsJiZHKDIwKSxlfXNldChlLG4scil7bGV0IGk9dGhpcy5fc2VsZWN0aW9uLG89dGhpcy5rZXk7dGhpcy5rZXk9ZSx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yLE5zKCl8fChXaSgpPT09byYmS3QoZSksaSE9PW51bGwmJihpLl9jYWNoZWROb2Rlcz1udWxsLGkuZGlydHk9ITApKX19ZnVuY3Rpb24gSWgodCxlKXtsZXQgbj1lLl9fa2V5LHI9dC5vZmZzZXQsaT0iZWxlbWVudCI7aWYoZWUoZSkpaT0idGV4dCIsZT1lLmdldFRleHRDb250ZW50U2l6ZSgpLHI+ZSYmKHI9ZSk7ZWxzZSBpZighVShlKSl7dmFyIG89ZS5nZXROZXh0U2libGluZygpO2VlKG8pPyhuPW8uX19rZXkscj0wLGk9InRleHQiKToobz1lLmdldFBhcmVudCgpKSYmKG49by5fX2tleSxyPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxKX10LnNldChuLHIsaSl9ZnVuY3Rpb24gWjAodCxlKXtpZihVKGUpKXtsZXQgbj1lLmdldExhc3REZXNjZW5kYW50KCk7VShuKXx8ZWUobik/SWgodCxuKTpJaCh0LGUpfWVsc2UgSWgodCxlKX1mdW5jdGlvbiBHMCh0LGUsbixyKXtsZXQgaT10LmdldE5vZGUoKSxvPWkuZ2V0Q2hpbGRBdEluZGV4KHQub2Zmc2V0KSxsPUx0KCkscz1nbihpKT9abygpLmFwcGVuZChsKTpsO2wuc2V0Rm9ybWF0KG4pLGwuc2V0U3R5bGUociksbz09PW51bGw/aS5hcHBlbmQocyk6KG8uaW5zZXJ0QmVmb3JlKHMpLGUudHlwZT09PSJlbGVtZW50IiYmZS5rZXk9PT10LmtleSYmZS5vZmZzZXQhPT10Lm9mZnNldCYmZS5zZXQoZS5rZXksZS5vZmZzZXQrMSwiZWxlbWVudCIpKSx0LmlzKGUpJiZlLnNldChsLl9fa2V5LDAsInRleHQiKSx0LnNldChsLl9fa2V5LDAsInRleHQiKX1mdW5jdGlvbiBMaSh0LGUsbixyKXt0LmtleT1lLHQub2Zmc2V0PW4sdC50eXBlPXJ9Y2xhc3MgT2Z7Y29uc3RydWN0b3IoZSl7dGhpcy5kaXJ0eT0hMSx0aGlzLl9ub2Rlcz1lLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aXMoZSl7aWYoISRzKGUpKXJldHVybiExO2xldCBuPXRoaXMuX25vZGVzLHI9ZS5fbm9kZXM7cmV0dXJuIG4uc2l6ZT09PXIuc2l6ZSYmQXJyYXkuZnJvbShuKS5ldmVyeShpPT5yLmhhcyhpKSl9YWRkKGUpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuYWRkKGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9ZGVsZXRlKGUpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuZGVsZXRlKGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xlYXIoKXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmNsZWFyKCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1oYXMoZSl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyhlKX1jbG9uZSgpe3JldHVybiBuZXcgT2YobmV3IFNldCh0aGlzLl9ub2RlcykpfWV4dHJhY3QoKXtyZXR1cm4gdGhpcy5nZXROb2RlcygpfWluc2VydFJhd1RleHQoKXt9aW5zZXJ0VGV4dCgpe31pbnNlcnROb2RlcyhlLG4pe2xldCByPXRoaXMuZ2V0Tm9kZXMoKSxpPXIubGVuZ3RoO3ZhciBvPXJbaS0xXTtpZihlZShvKSlvPW8uc2VsZWN0KCk7ZWxzZXtsZXQgbD1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtvPW8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihvLmluc2VydE5vZGVzKGUsbiksZT0wO2U8aTtlKyspcltlXS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciBlPXRoaXMuX2NhY2hlZE5vZGVzO2lmKGUhPT1udWxsKXJldHVybiBlO3ZhciBuPXRoaXMuX25vZGVzO2U9W107Zm9yKGxldCByIG9mIG4pbj1EdChyKSxuIT09bnVsbCYmZS5wdXNoKG4pO3JldHVybiBOcygpfHwodGhpcy5fY2FjaGVkTm9kZXM9ZSksZX1nZXRUZXh0Q29udGVudCgpe2xldCBlPXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWVbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gdmUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBhbH1mdW5jdGlvbiBFZyh0KXtsZXRbZSwsbl09JEUodCk7dD1uLmdldENoaWxkcmVuKCk7bGV0IHI9dC5sZW5ndGg7dmFyIGk9dFswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgbz1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKW9bbF09QXJyYXkoaSk7Zm9yKGk9MDtpPHI7aSsrKXtsPXRbaV0uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO29baV1bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspb1tpK2ZdW3MraF09dTtpZihlPT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6aSxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIFBme2NvbnN0cnVjdG9yKGUsbixyKXt0aGlzLmdyaWRLZXk9ZSx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXMoZSl7cmV0dXJuIF92KGUpP3RoaXMuZ3JpZEtleT09PWUuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXMoZS5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKGUuZm9jdXMpOiExfXNldChlLG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9ZSx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IFBmKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBWYyh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXMoZSxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gZnYoci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXMoZSxuKX1nZXRTaGFwZSgpe3ZhciBlPUR0KHRoaXMuYW5jaG9yLmtleSk7aWYoUW4oZSl8fEcoMTAzKSxlPUVnKGUpLGU9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49RHQodGhpcy5mb2N1cy5rZXkpO1FuKG4pfHxHKDEwNCk7bGV0IHI9RWcobik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKGUuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IGk9TWF0aC5tYXgoZS5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxvPU1hdGgubWluKGUucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIGU9TWF0aC5tYXgoZS5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixpKSxmcm9tWTpNYXRoLm1pbihvLGUpLHRvWDpNYXRoLm1heChuLGkpLHRvWTpNYXRoLm1heChvLGUpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIGUodyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Onh9PXc7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSx4KSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQseCt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPVBkKHIsUW4pO3ZhciBpPVBkKG4sUW4pO1FuKHIpfHxHKDEwMyksUW4oaSl8fEcoMTA0KSxuPXIuZ2V0UGFyZW50KCksdXUobil8fEcoMTA1KSxuPW4uZ2V0UGFyZW50KCksa3Yobil8fEcoMTA2KTtsZXRbbyxsLHNdPWJFKG4scixpKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxpPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxpfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIG09aC1pOy0tcjtmb3IodmFyIGc9MDtnPD1tO2crKyllKG9baStnXVtyXSl9aWYodTxpKWZvcihtPWYtciwtLWksZz0wO2c8PW07ZysrKWUob1tpXVtyK2ddKTtpZihjPmYpZm9yKG09aC1pLGYrPTEsZz0wO2c8PW07ZysrKWUob1tpK2ddW2ZdKTtpZihkPmgpZm9yKG09Zi1yLGgrPTEsZz0wO2c8PW07ZysrKWUob1toXVtyK2ddKX1mb3Iobj1bbl0scj1udWxsLGk9dTtpPD1kO2krKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1vW2ldW2ZdKSxtPWguZ2V0UGFyZW50KCksdXUobSl8fEcoMTA3KSxtIT09ciYmbi5wdXNoKG0pLG4ucHVzaChoLC4uLmxPKGgpKSxyPW07cmV0dXJuIE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IGU9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspbis9ZVtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBfdih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFBmfWNsYXNzIGFse2NvbnN0cnVjdG9yKGUsbixyLGkpe3RoaXMuYW5jaG9yPWUsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPWksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCxlLl9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyhlKXtyZXR1cm4gdmUoZSk/dGhpcy5hbmNob3IuaXMoZS5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKGUuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PWUuZm9ybWF0JiZ0aGlzLnN0eWxlPT09ZS5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIGU9dGhpcy5fY2FjaGVkTm9kZXM7aWYoZSE9PW51bGwpcmV0dXJuIGU7ZT10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9ZS5pc0JlZm9yZShuKSxpPXI/ZTpuO3I9cj9uOmUsZT1pLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBvPWkub2Zmc2V0O3JldHVybiBpPXIub2Zmc2V0LFUoZSkmJihyPWUuZ2V0RGVzY2VuZGFudEJ5SW5kZXgobyksZT1yPz9lKSxVKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KGkpLHIhPT1udWxsJiZyIT09ZSYmbi5nZXRDaGlsZEF0SW5kZXgoaSk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLGU9ZS5pcyhuKT9VKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCk/W106W2VdOmUuZ2V0Tm9kZXNCZXR3ZWVuKG4pLE5zKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1lKSxlfXNldFRleHROb2RlUmFuZ2UoZSxuLHIsaSl7TGkodGhpcy5hbmNob3IsZS5fX2tleSxuLCJ0ZXh0IiksTGkodGhpcy5mb2N1cyxyLl9fa2V5LGksInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgZT10aGlzLmdldE5vZGVzKCk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPWVbMF0scj1lW2UubGVuZ3RoLTFdLGk9dGhpcy5hbmNob3Isbz10aGlzLmZvY3VzLGw9aS5pc0JlZm9yZShvKSxbcyxhXT1WYyh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDtkKyspe2xldCBmPWVbZF07aWYoVShmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsZWUoZikpe2xldCBoPWYuZ2V0VGV4dENvbnRlbnQoKTtmPT09bj9mPT09cj8oaS50eXBlIT09ImVsZW1lbnQifHxvLnR5cGUhPT0iZWxlbWVudCJ8fG8ub2Zmc2V0PT09aS5vZmZzZXQpJiYoaD1zPGE/aC5zbGljZShzLGEpOmguc2xpY2UoYSxzKSk6aD1sP2guc2xpY2Uocyk6aC5zbGljZShhKTpmPT09ciYmKGg9bD9oLnNsaWNlKDAsYSk6aC5zbGljZSgwLHMpKSx1Kz1ofWVsc2UhdHQoZikmJiFzdShmKXx8Zj09PXImJnRoaXMuaXNDb2xsYXBzZWQoKXx8KHUrPWYuZ2V0VGV4dENvbnRlbnQoKSl9cmV0dXJuIHV9YXBwbHlET01SYW5nZShlKXtsZXQgbj1wdCgpLHI9bi5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb247aWYoZT1DRShlLnN0YXJ0Q29udGFpbmVyLGUuc3RhcnRPZmZzZXQsZS5lbmRDb250YWluZXIsZS5lbmRPZmZzZXQsbixyKSxlIT09bnVsbCl7dmFyW2ksb109ZTtMaSh0aGlzLmFuY2hvcixpLmtleSxpLm9mZnNldCxpLnR5cGUpLExpKHRoaXMuZm9jdXMsby5rZXksby5vZmZzZXQsby50eXBlKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfX1jbG9uZSgpe2xldCBlPXRoaXMuYW5jaG9yLG49dGhpcy5mb2N1cztyZXR1cm4gbmV3IGFsKG5ldyBWcihlLmtleSxlLm9mZnNldCxlLnR5cGUpLG5ldyBWcihuLmtleSxuLm9mZnNldCxuLnR5cGUpLHRoaXMuZm9ybWF0LHRoaXMuc3R5bGUpfXRvZ2dsZUZvcm1hdChlKXt0aGlzLmZvcm1hdD1KUyh0aGlzLmZvcm1hdCxlLG51bGwpLHRoaXMuZGlydHk9ITB9c2V0U3R5bGUoZSl7dGhpcy5zdHlsZT1lLHRoaXMuZGlydHk9ITB9aGFzRm9ybWF0KGUpe3JldHVybih0aGlzLmZvcm1hdCZJb1tlXSkhPT0wfWluc2VydFJhd1RleHQoZSl7ZT1lLnNwbGl0KC8oXHI/XG58XHQpLyk7bGV0IG49W10scj1lLmxlbmd0aDtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgbz1lW2ldO289PT1gCmB8fG89PT1gXHIKYD9uLnB1c2goY3MoKSk6bz09PSIJIj9uLnB1c2goUmYoKSk6bi5wdXNoKEx0KG8pKX10aGlzLmluc2VydE5vZGVzKG4pfWluc2VydFRleHQoZSl7dmFyIG49dGhpcy5hbmNob3Iscj10aGlzLmZvY3VzLGk9dGhpcy5pc0NvbGxhcHNlZCgpfHxuLmlzQmVmb3JlKHIpLG89dGhpcy5mb3JtYXQsbD10aGlzLnN0eWxlO2kmJm4udHlwZT09PSJlbGVtZW50Ij9HMChuLHIsbyxsKTppfHxyLnR5cGUhPT0iZWxlbWVudCJ8fEcwKHIsbixvLGwpO3ZhciBzPXRoaXMuZ2V0Tm9kZXMoKSxhPXMubGVuZ3RoLHU9aT9yOm47cj0oaT9uOnIpLm9mZnNldDt2YXIgYz11Lm9mZnNldDtuPXNbMF0sZWUobil8fEcoMjYpLGk9bi5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDt2YXIgZD1uLmdldFBhcmVudE9yVGhyb3coKSxmPXNbYS0xXTtpZih0aGlzLmlzQ29sbGFwc2VkKCkmJnI9PT1pJiYobi5pc1NlZ21lbnRlZCgpfHxuLmlzVG9rZW4oKXx8IW4uY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fCFkLmNhbkluc2VydFRleHRBZnRlcigpJiZuLmdldE5leHRTaWJsaW5nKCk9PT1udWxsKSl7dmFyIGg9bi5nZXROZXh0U2libGluZygpO2lmKGVlKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIXVnKGgpfHwoaD1MdCgpLGguc2V0Rm9ybWF0KG8pLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCxlIT09IiIpe3RoaXMuaW5zZXJ0VGV4dChlKTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIWVlKGgpfHx1ZyhoKSkmJihoPUx0KCksaC5zZXRGb3JtYXQobyksZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCk/bi5pbnNlcnRCZWZvcmUoaCk6ZC5pbnNlcnRCZWZvcmUoaCkpLGguc2VsZWN0KCksbj1oLGUhPT0iIil7dGhpcy5pbnNlcnRUZXh0KGUpO3JldHVybn19ZWxzZSBpZihuLmlzU2VnbWVudGVkKCkmJnIhPT1pKWQ9THQobi5nZXRUZXh0Q29udGVudCgpKSxkLnNldEZvcm1hdChvKSxuLnJlcGxhY2UoZCksbj1kO2Vsc2UgaWYoISh0aGlzLmlzQ29sbGFwc2VkKCl8fGU9PT0iInx8KGg9Zi5nZXRQYXJlbnQoKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKSYmZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmKCFVKGgpfHxoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmaC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSkpKSl7dGhpcy5pbnNlcnRUZXh0KCIiKSxFRSh0aGlzLmFuY2hvcix0aGlzLmZvY3VzLG51bGwpLHRoaXMuaW5zZXJ0VGV4dChlKTtyZXR1cm59aWYoYT09PTEpaWYobi5pc1Rva2VuKCkpZT1MdChlKSxlLnNlbGVjdCgpLG4ucmVwbGFjZShlKTtlbHNle2lmKHM9bi5nZXRGb3JtYXQoKSxhPW4uZ2V0U3R5bGUoKSxyPT09YyYmKHMhPT1vfHxhIT09bCkpaWYobi5nZXRUZXh0Q29udGVudCgpPT09IiIpbi5zZXRGb3JtYXQobyksbi5zZXRTdHlsZShsKTtlbHNle3M9THQoZSkscy5zZXRGb3JtYXQobykscy5zZXRTdHlsZShsKSxzLnNlbGVjdCgpLHI9PT0wP24uaW5zZXJ0QmVmb3JlKHMsITEpOihbYV09bi5zcGxpdFRleHQociksYS5pbnNlcnRBZnRlcihzLCExKSkscy5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT1lLmxlbmd0aCk7cmV0dXJufW49bi5zcGxpY2VUZXh0KHIsYy1yLGUsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6dGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKG4uaXNDb21wb3NpbmcoKT90aGlzLmFuY2hvci5vZmZzZXQtPWUubGVuZ3RoOih0aGlzLmZvcm1hdD1zLHRoaXMuc3R5bGU9YSkpfWVsc2V7aWYobz1uZXcgU2V0KFsuLi5uLmdldFBhcmVudEtleXMoKSwuLi5mLmdldFBhcmVudEtleXMoKV0pLGg9VShuKT9uOm4uZ2V0UGFyZW50T3JUaHJvdygpLGw9VShmKT9mOmYuZ2V0UGFyZW50T3JUaHJvdygpLGQ9ZiwhaC5pcyhsKSYmbC5pc0lubGluZSgpKWRvIGQ9bCxsPWwuZ2V0UGFyZW50T3JUaHJvdygpO3doaWxlKGwuaXNJbmxpbmUoKSk7aWYodS50eXBlPT09InRleHQiJiYoYyE9PTB8fGYuZ2V0VGV4dENvbnRlbnQoKT09PSIiKXx8dS50eXBlPT09ImVsZW1lbnQiJiZmLmdldEluZGV4V2l0aGluUGFyZW50KCk8YylpZihlZShmKSYmIWYuaXNUb2tlbigpJiZjIT09Zi5nZXRUZXh0Q29udGVudFNpemUoKSl7aWYoZi5pc1NlZ21lbnRlZCgpKXt2YXIgbT1MdChmLmdldFRleHRDb250ZW50KCkpO2YucmVwbGFjZShtKSxmPW19Z24odS5nZXROb2RlKCkpfHwoZj1mLnNwbGljZVRleHQoMCxjLCIiKSksby5hZGQoZi5fX2tleSl9ZWxzZSB1PWYuZ2V0UGFyZW50T3JUaHJvdygpLHUuY2FuQmVFbXB0eSgpfHx1LmdldENoaWxkcmVuU2l6ZSgpIT09MT9mLnJlbW92ZSgpOnUucmVtb3ZlKCk7ZWxzZSBvLmFkZChmLl9fa2V5KTtmb3IodT1sLmdldENoaWxkcmVuKCksYz1uZXcgU2V0KHMpLGY9aC5pcyhsKSxoPWguaXNJbmxpbmUoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbD9oOm4sbT11Lmxlbmd0aC0xOzA8PW07bS0tKXtsZXQgZz11W21dO2lmKGcuaXMobil8fFUoZykmJmcuaXNQYXJlbnRPZihuKSlicmVhaztnLmlzQXR0YWNoZWQoKSYmKCFjLmhhcyhnKXx8Zy5pcyhkKT9mfHxoLmluc2VydEFmdGVyKGcsITEpOmcucmVtb3ZlKCkpfWlmKCFmKWZvcih1PWwsYz1udWxsO3UhPT1udWxsOylsPXUuZ2V0Q2hpbGRyZW4oKSxmPWwubGVuZ3RoLChmPT09MHx8bFtmLTFdLmlzKGMpKSYmKG8uZGVsZXRlKHUuX19rZXkpLGM9dSksdT11LmdldFBhcmVudCgpO2ZvcihuLmlzVG9rZW4oKT9yPT09aT9uLnNlbGVjdCgpOihlPUx0KGUpLGUuc2VsZWN0KCksbi5yZXBsYWNlKGUpKToobj1uLnNwbGljZVRleHQocixpLXIsZSwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTpuLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPWUubGVuZ3RoKSksZT0xO2U8YTtlKyspbj1zW2VdLG8uaGFzKG4uX19rZXkpfHxuLnJlbW92ZSgpfX1yZW1vdmVUZXh0KCl7dGhpcy5pbnNlcnRUZXh0KCIiKX1mb3JtYXRUZXh0KGUpe2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl0aGlzLnRvZ2dsZUZvcm1hdChlKSxLdChudWxsKTtlbHNle3ZhciBuPXRoaXMuZ2V0Tm9kZXMoKSxyPVtdO2Zvcih2YXIgaSBvZiBuKWVlKGkpJiZyLnB1c2goaSk7dmFyIG89ci5sZW5ndGg7aWYobz09PTApdGhpcy50b2dnbGVGb3JtYXQoZSksS3QobnVsbCk7ZWxzZXtpPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDppLGk9cz9pOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyhlLG51bGwpO3ZhciBjPW8tMSxkPXJbY107aWYobz1pLnR5cGU9PT0idGV4dCI/aS5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1vJiYobD09PTAmJm89PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOihlPXUuc3BsaXRUZXh0KGwsbyksZT1sPT09MD9lWzBdOmVbMV0sZS5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldChlLl9fa2V5LDAsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KGUuX19rZXksby1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyhlLHMpO2ZvcigwPG8mJihvIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChvKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBtPWguZ2V0Rm9ybWF0RmxhZ3MoZSxmKTtoLnNldEZvcm1hdChtKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxpLnR5cGU9PT0idGV4dCImJmkuc2V0KGQuX19rZXksbywidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXMoZSxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLGk9ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihpPWk/aS5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1pJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBvPUx0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKG8pfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYobz1MdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKG8pKTtvJiYodGhpcy5mb2N1cy5zZXQoby5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KG8uX19rZXksMCwidGV4dCIpKX19bz10aGlzLmFuY2hvcixyPW8ub2Zmc2V0O3ZhciBsPW8uZ2V0Tm9kZSgpO2k9bCxvLnR5cGU9PT0iZWxlbWVudCImJihvPW8uZ2V0Tm9kZSgpLGk9by5nZXRDaGlsZEF0SW5kZXgoci0xKSxpPWk9PT1udWxsP286aSksbz1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9dnIobCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihlZShsKSlpZihpPWwuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgscj09PTAmJmkhPT0wKWk9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPWkhPT1udWxsP2k6bC5nZXRQYXJlbnRPclRocm93KCksby5wdXNoKGwpO2Vsc2UgaWYocj09PWkpaT1sO2Vsc2V7aWYobC5pc1Rva2VuKCkpcmV0dXJuITE7W2ksbF09bC5zcGxpdFRleHQociksby5wdXNoKGwpfWw9aSxvLnB1c2goLi4ucykscz1lWzBdO3ZhciB1PSExLGM9bnVsbDtmb3IobGV0IG09MDttPGUubGVuZ3RoO20rKyl7dmFyIGQ9ZVttXTtpZih2cihpKXx8dHQoaSl8fCFVKGQpfHxkLmlzSW5saW5lKCkpdSYmIVUoZCkmJiF0dChkKSYmdnIoaS5nZXRQYXJlbnQoKSkmJkcoMjgpO2Vsc2V7aWYoZC5pcyhzKSl7aWYoVShpKSYmaS5pc0VtcHR5KCkmJmkuY2FuUmVwbGFjZVdpdGgoZCkpe2kucmVwbGFjZShkKSxpPWQsdT0hMDtjb250aW51ZX1pZih1PWQuZ2V0Rmlyc3REZXNjZW5kYW50KCkscVModSkpe2Zvcih2YXIgZj11LmdldFBhcmVudE9yVGhyb3coKTtmLmlzSW5saW5lKCk7KWY9Zi5nZXRQYXJlbnRPclRocm93KCk7aWYoYz1mLmdldENoaWxkcmVuKCksdT1jLmxlbmd0aCxVKGkpKXt2YXIgaD1pLmdldEZpcnN0Q2hpbGQoKTtmb3IobGV0IGc9MDtnPHU7ZysrKXtsZXQgdz1jW2ddO2g9PT1udWxsP2kuYXBwZW5kKHcpOmguaW5zZXJ0QWZ0ZXIodyksaD13fX1lbHNle2ZvcihoPXUtMTswPD1oO2gtLSlpLmluc2VydEFmdGVyKGNbaF0pO2k9aS5nZXRQYXJlbnRPclRocm93KCl9aWYoYz1jW3UtMV0sZi5yZW1vdmUoKSx1PSEwLGYuaXMoZCkpY29udGludWV9fWVlKGkpJiYoYT09PW51bGwmJkcoMjcpLGk9YSl9dT0hMSxVKGkpJiYhaS5pc0lubGluZSgpPyhjPWQsdHQoZCkmJiFkLmlzSW5saW5lKCk/aT1lLmxlbmd0aD09PTEmJmkuY2FuQmVFbXB0eSgpJiZpLmlzRW1wdHkoKT9pLmluc2VydEJlZm9yZShkLCExKTppLmluc2VydEFmdGVyKGQsITEpOlUoZCk/KGQuY2FuQmVFbXB0eSgpfHwhZC5pc0VtcHR5KCkpJiYoZ24oaSk/KGY9aS5nZXRDaGlsZEF0SW5kZXgociksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6aS5hcHBlbmQoZCksaT1kKTpkLmlzSW5saW5lKCk/KGkuYXBwZW5kKGQpLGk9ZCk6aT1pLmluc2VydEFmdGVyKGQsITEpKTooZj1pLmdldEZpcnN0Q2hpbGQoKSxmIT09bnVsbD9mLmluc2VydEJlZm9yZShkKTppLmFwcGVuZChkKSxpPWQpKTohVShkKXx8VShkKSYmZC5pc0lubGluZSgpfHx0dChpKSYmIWkuaXNJbmxpbmUoKT8oYz1kLHZlKHRoaXMpJiZ0dChkKSYmKFUoaSl8fGVlKGkpKSYmIWQuaXNJbmxpbmUoKT8oZWUoaSk/KGY9aS5nZXRQYXJlbnRPclRocm93KCksW2ldPWkuc3BsaXRUZXh0KHIpLGk9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpOihmPWksaT1yKSxbLGldPWFFKGYsaSksaT1pLmluc2VydEJlZm9yZShkKSk6aT1pLmluc2VydEFmdGVyKGQsITEpKTooZD1pLmdldFBhcmVudE9yVGhyb3coKSxzdShpKSYmaS5yZW1vdmUoKSxpPWQsbS0tKX1pZihuJiYoZWUobCk/bC5zZWxlY3QoKTooZT1pLmdldFByZXZpb3VzU2libGluZygpLGVlKGUpP2Uuc2VsZWN0KCk6KGU9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChlLGUpKSkpLFUoaSkpe2lmKGU9ZWUoYyk/YzpVKGMpJiZjLmlzSW5saW5lKCk/Yy5nZXRMYXN0RGVzY2VuZGFudCgpOmkuZ2V0TGFzdERlc2NlbmRhbnQoKSxufHwoZT09PW51bGw/aS5zZWxlY3QoKTplZShlKT9lLmdldFRleHRDb250ZW50KCk9PT0iIj9lLnNlbGVjdFByZXZpb3VzKCk6ZS5zZWxlY3QoKTplLnNlbGVjdE5leHQoKSksby5sZW5ndGghPT0wKWZvcihuPWksZT1vLmxlbmd0aC0xOzA8PWU7ZS0tKXI9b1tlXSxhPXIuZ2V0UGFyZW50T3JUaHJvdygpLCFVKGkpfHxDZyhyKXx8dHQocikmJighci5pc0lubGluZSgpfHxyLmlzSXNvbGF0ZWQoKSk/VShpKXx8Q2cocik/VShyKSYmIXIuY2FuSW5zZXJ0QWZ0ZXIoaSk/KGw9YS5jb25zdHJ1Y3Rvci5jbG9uZShhKSxVKGwpfHxHKDI5KSxsLmFwcGVuZChyKSxpLmluc2VydEFmdGVyKGwpKTppLmluc2VydEFmdGVyKHIpOihpLmluc2VydEJlZm9yZShyKSxpPXIpOihuPT09aT9pLmFwcGVuZChyKTppLmluc2VydEJlZm9yZShyKSxpPXIpLGEuaXNFbXB0eSgpJiYhYS5jYW5CZUVtcHR5KCkmJmEucmVtb3ZlKCl9ZWxzZSBufHwoZWUoaSk/aS5zZWxlY3QoKToobj1pLmdldFBhcmVudE9yVGhyb3coKSxlPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KGUsZSkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciBlPXRoaXMuYW5jaG9yLG49ZS5vZmZzZXQscj1bXTtpZihlLnR5cGU9PT0idGV4dCIpe3ZhciBpPWUuZ2V0Tm9kZSgpLG89aS5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1pLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTppLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP28ucHVzaChpKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1pLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxpXT1pLnNwbGl0VGV4dChuKSxvLnB1c2goaSkpKX1lbHNle2lmKGw9ZS5nZXROb2RlKCksdnIobCkpe289Wm8oKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLG8uc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUobywhMSk6bC5hcHBlbmQobyk7cmV0dXJufW89bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihpPW8ubGVuZ3RoLG49PT0wJiYwPGkmJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxvPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksVShvKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKW8uYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihVKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKGUuZ2V0Tm9kZSgpKXx8YSYmYS5pcyhlLmdldE5vZGUoKSkpJiYwPGkpbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCxlPXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspZS5hcHBlbmQoclthXSk7aWYoaSE9PTApZm9yKHI9MDtyPGk7cisrKW49b1tyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsoZSl7bGV0IG49Y3MoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLGduKHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSxlP3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4gVmModGhpcyl9ZXh0cmFjdCgpe3ZhciBlPXRoaXMuZ2V0Tm9kZXMoKSxuPWUubGVuZ3RoLHI9bi0xLGk9dGhpcy5hbmNob3I7bGV0IG89dGhpcy5mb2N1czt2YXIgbD1lWzBdO2xldCBzPWVbcl0sW2EsdV09VmModGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP2VlKGwpJiYhdGhpcy5pc0NvbGxhcHNlZCgpPyhlPWE+dT91OmEscj1sLnNwbGl0VGV4dChlLGE+dT9hOnUpLGU9ZT09PTA/clswXTpyWzFdLGUhPW51bGw/W2VdOltdKTpbbF06KG49aS5pc0JlZm9yZShvKSxlZShsKSYmKGk9bj9hOnUsaT09PWwuZ2V0VGV4dENvbnRlbnRTaXplKCk/ZS5zaGlmdCgpOmkhPT0wJiYoWyxsXT1sLnNwbGl0VGV4dChpKSxlWzBdPWwpKSxlZShzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP2UucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksZVtyXT1zKSksZSl9bW9kaWZ5KGUsbixyKXt2YXIgaT10aGlzLmZvY3VzLG89dGhpcy5hbmNob3IsbD1lPT09Im1vdmUiLHM9Y2coaSxuKTtpZih0dChzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj1rZygpLG4uYWRkKHMuX19rZXkpLFdyKG4pKTooZT1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLGVlKGUpPyhzPWUuX19rZXksbj1uP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCxpLnNldChzLG4sInRleHQiKSxsJiZvLnNldChzLG4sInRleHQiKSk6KHI9cy5nZXRQYXJlbnRPclRocm93KCksVShlKT8ocj1lLl9fa2V5LHM9bj9lLmdldENoaWxkcmVuU2l6ZSgpOjApOihzPXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxyPXIuX19rZXksbnx8cysrKSxpLnNldChyLHMsImVsZW1lbnQiKSxsJiZvLnNldChyLHMsImVsZW1lbnQiKSkpO2Vsc2UgaWYobz1wdCgpLGk9WHIoby5fd2luZG93KSl7dmFyIGE9by5fYmxvY2tDdXJzb3JFbGVtZW50LHU9by5fcm9vdEVsZW1lbnQ7aWYodT09PW51bGx8fGE9PT1udWxsfHwhVShzKXx8cy5pc0lubGluZSgpfHxzLmNhbkJlRW1wdHkoKXx8ZGcoYSxvLHUpLGkubW9kaWZ5KGUsbj8iYmFja3dhcmQiOiJmb3J3YXJkIixyKSwwPGkucmFuZ2VDb3VudCYmKHM9aS5nZXRSYW5nZUF0KDApLG89dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLG89Z24obyk/bzpsRShvKSx0aGlzLmFwcGx5RE9NUmFuZ2UocyksdGhpcy5kaXJ0eT0hMCwhbCkpe2ZvcihsPXRoaXMuZ2V0Tm9kZXMoKSxlPVtdLHI9ITEsYT0wO2E8bC5sZW5ndGg7YSsrKXU9bFthXSxPZCh1LG8pP2UucHVzaCh1KTpyPSEwO3ImJjA8ZS5sZW5ndGgmJihuPyhuPWVbMF0sVShuKT9uLnNlbGVjdFN0YXJ0KCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0U3RhcnQoKSk6KG49ZVtlLmxlbmd0aC0xXSxVKG4pP24uc2VsZWN0RW5kKCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0RW5kKCkpKSwoaS5hbmNob3JOb2RlIT09cy5zdGFydENvbnRhaW5lcnx8aS5hbmNob3JPZmZzZXQhPT1zLnN0YXJ0T2Zmc2V0KSYmKG49dGhpcy5mb2N1cyxsPXRoaXMuYW5jaG9yLGk9bC5rZXkscz1sLm9mZnNldCxvPWwudHlwZSxMaShsLG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksTGkobixpLHMsbyksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCl9fX1kZWxldGVDaGFyYWN0ZXIoZSl7bGV0IG49dGhpcy5pc0NvbGxhcHNlZCgpO2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl7dmFyIHI9dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLG89ci5nZXROb2RlKCk7aWYoIWUmJihyLnR5cGU9PT0iZWxlbWVudCImJlUobykmJnIub2Zmc2V0PT09by5nZXRDaGlsZHJlblNpemUoKXx8ci50eXBlPT09InRleHQiJiZyLm9mZnNldD09PW8uZ2V0VGV4dENvbnRlbnRTaXplKCkpKXt2YXIgbD1vLmdldFBhcmVudCgpO2lmKGw9by5nZXROZXh0U2libGluZygpfHwobD09PW51bGw/bnVsbDpsLmdldE5leHRTaWJsaW5nKCkpLFUobCkmJmwuaXNTaGFkb3dSb290KCkpcmV0dXJufWlmKGw9Y2coaSxlKSx0dChsKSYmIWwuaXNJc29sYXRlZCgpKXtsLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCkmJlUobykmJm8uZ2V0Q2hpbGRyZW5TaXplKCk9PT0wPyhvLnJlbW92ZSgpLGU9a2coKSxlLmFkZChsLl9fa2V5KSxXcihlKSk6KGwucmVtb3ZlKCkscHQoKS5kaXNwYXRjaENvbW1hbmQoRWYsdm9pZCAwKSk7cmV0dXJufWlmKCFlJiZVKGwpJiZVKG8pJiZvLmlzRW1wdHkoKSl7by5yZW1vdmUoKSxsLnNlbGVjdFN0YXJ0KCk7cmV0dXJufWlmKHRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImNoYXJhY3RlciIpLHRoaXMuaXNDb2xsYXBzZWQoKSl7aWYoZSYmci5vZmZzZXQ9PT0wJiYoci50eXBlPT09ImVsZW1lbnQiP3IuZ2V0Tm9kZSgpOnIuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKSkuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKXJldHVybn1lbHNle2lmKGw9aS50eXBlPT09InRleHQiP2kuZ2V0Tm9kZSgpOm51bGwsbz1yLnR5cGU9PT0idGV4dCI/ci5nZXROb2RlKCk6bnVsbCxsIT09bnVsbCYmbC5pc1NlZ21lbnRlZCgpKXtpZihyPWkub2Zmc2V0LGk9bC5nZXRUZXh0Q29udGVudFNpemUoKSxsLmlzKG8pfHxlJiZyIT09aXx8IWUmJnIhPT0wKXtYMChsLGUscik7cmV0dXJufX1lbHNlIGlmKG8hPT1udWxsJiZvLmlzU2VnbWVudGVkKCkmJihyPXIub2Zmc2V0LGk9by5nZXRUZXh0Q29udGVudFNpemUoKSxvLmlzKGwpfHxlJiZyIT09MHx8IWUmJnIhPT1pKSl7WDAobyxlLHIpO3JldHVybn1pZihvPXRoaXMuYW5jaG9yLGw9dGhpcy5mb2N1cyxyPW8uZ2V0Tm9kZSgpLGk9bC5nZXROb2RlKCkscj09PWkmJm8udHlwZT09PSJ0ZXh0IiYmbC50eXBlPT09InRleHQiKXt2YXIgcz1vLm9mZnNldCxhPWwub2Zmc2V0O2xldCB1PXM8YTtpPXU/czphLGE9dT9hOnMscz1hLTEsaSE9PXMmJihyPXIuZ2V0VGV4dENvbnRlbnQoKS5zbGljZShpLGEpLHJFKHIpfHwoZT9sLm9mZnNldD1zOm8ub2Zmc2V0PXMpKX19fXRoaXMucmVtb3ZlVGV4dCgpLGUmJiFuJiZ0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnRoaXMuYW5jaG9yLm9mZnNldD09PTAmJihlPXRoaXMuYW5jaG9yLmdldE5vZGUoKSxlLmlzRW1wdHkoKSYmZ24oZS5nZXRQYXJlbnQoKSkmJmUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKT09PTAmJmUuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKX1kZWxldGVMaW5lKGUpe3RoaXMuaXNDb2xsYXBzZWQoKSYmKHRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJnRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImxpbmVib3VuZGFyeSIpLChlP3RoaXMuZm9jdXM6dGhpcy5hbmNob3IpLm9mZnNldD09PTAmJnRoaXMubW9kaWZ5KCJleHRlbmQiLGUsImNoYXJhY3RlciIpKSx0aGlzLnJlbW92ZVRleHQoKX1kZWxldGVXb3JkKGUpe3RoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5tb2RpZnkoImV4dGVuZCIsZSwid29yZCIpLHRoaXMucmVtb3ZlVGV4dCgpfX1mdW5jdGlvbiAkcyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE9mfWZ1bmN0aW9uIFkwKHQpe2xldCBlPXQub2Zmc2V0O3JldHVybiB0LnR5cGU9PT0idGV4dCI/ZToodD10LmdldE5vZGUoKSxlPT09dC5nZXRDaGlsZHJlblNpemUoKT90LmdldFRleHRDb250ZW50KCkubGVuZ3RoOjApfWZ1bmN0aW9uIFZjKHQpe2xldCBlPXQuYW5jaG9yO3JldHVybiB0PXQuZm9jdXMsZS50eXBlPT09ImVsZW1lbnQiJiZ0LnR5cGU9PT0iZWxlbWVudCImJmUua2V5PT09dC5rZXkmJmUub2Zmc2V0PT09dC5vZmZzZXQ/WzAsMF06W1kwKGUpLFkwKHQpXX1mdW5jdGlvbiBYMCh0LGUsbil7bGV0IHI9dC5nZXRUZXh0Q29udGVudCgpLnNwbGl0KC8oPz1ccykvZyksaT1yLmxlbmd0aCxvPTAsbD0wO2ZvcihsZXQgcz0wO3M8aTtzKyspe2xldCBhPXJbc10sdT1zPT09aS0xO2lmKGw9byxvKz1hLmxlbmd0aCxlJiZvPT09bnx8bz5ufHx1KXtyLnNwbGljZShzLDEpLHUmJihsPXZvaWQgMCk7YnJlYWt9fWU9ci5qb2luKCIiKS50cmltKCksZT09PSIiP3QucmVtb3ZlKCk6KHQuc2V0VGV4dENvbnRlbnQoZSksdC5zZWxlY3QobCxsKSl9ZnVuY3Rpb24gUTAodCxlLG4scil7dmFyIGk9ZTtpZih0Lm5vZGVUeXBlPT09MSl7bGV0IHM9ITE7dmFyIG89dC5jaGlsZE5vZGVzLGw9by5sZW5ndGg7aT09PWwmJihzPSEwLGk9bC0xKTtsZXQgYT1vW2ldO2lmKGw9ITEsYT09PXIuX2Jsb2NrQ3Vyc29yRWxlbWVudD8oYT1vW2krMV0sbD0hMCk6ci5fYmxvY2tDdXJzb3JFbGVtZW50IT09bnVsbCYmaS0tLHI9amwoYSksZWUocikpaT1zP3IuZ2V0VGV4dENvbnRlbnRTaXplKCk6MDtlbHNle2lmKG89amwodCksbz09PW51bGwpcmV0dXJuIG51bGw7aWYoVShvKT8odD1vLmdldENoaWxkQXRJbmRleChpKSwoZT1VKHQpKSYmKGU9dC5nZXRQYXJlbnQoKSxlPW49PT1udWxsfHxlPT09bnVsbHx8IWUuY2FuQmVFbXB0eSgpfHxlIT09bi5nZXROb2RlKCkpLGUmJihuPXM/dC5nZXRMYXN0RGVzY2VuZGFudCgpOnQuZ2V0Rmlyc3REZXNjZW5kYW50KCksbj09PW51bGw/KG89dCxpPTApOih0PW4sbz1VKHQpP3Q6dC5nZXRQYXJlbnRPclRocm93KCkpKSxlZSh0KT8ocj10LG89bnVsbCxpPXM/dC5nZXRUZXh0Q29udGVudFNpemUoKTowKTp0IT09byYmcyYmIWwmJmkrKyk6KGk9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGk9ZT09PTAmJnR0KG8pJiZqbCh0KT09PW8/aTppKzEsbz1vLmdldFBhcmVudE9yVGhyb3coKSksVShvKSlyZXR1cm4gbmV3IFZyKG8uX19rZXksaSwiZWxlbWVudCIpfX1lbHNlIHI9amwodCk7cmV0dXJuIGVlKHIpP25ldyBWcihyLl9fa2V5LGksInRleHQiKTpudWxsfWZ1bmN0aW9uIEowKHQsZSxuKXt2YXIgcj10Lm9mZnNldCxpPXQuZ2V0Tm9kZSgpO3I9PT0wPyhyPWkuZ2V0UHJldmlvdXNTaWJsaW5nKCksaT1pLmdldFBhcmVudCgpLGU/KG58fCFlKSYmcj09PW51bGwmJlUoaSkmJmkuaXNJbmxpbmUoKSYmKGU9aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlZShlKSYmKHQua2V5PWUuX19rZXksdC5vZmZzZXQ9ZS5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOlUocikmJiFuJiZyLmlzSW5saW5lKCk/KHQua2V5PXIuX19rZXksdC5vZmZzZXQ9ci5nZXRDaGlsZHJlblNpemUoKSx0LnR5cGU9ImVsZW1lbnQiKTplZShyKSYmKHQua2V5PXIuX19rZXksdC5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1pLmdldE5leHRTaWJsaW5nKCksaT1pLmdldFBhcmVudCgpLGUmJlUocikmJnIuaXNJbmxpbmUoKT8odC5rZXk9ci5fX2tleSx0Lm9mZnNldD0wLHQudHlwZT0iZWxlbWVudCIpOihufHxlKSYmcj09PW51bGwmJlUoaSkmJmkuaXNJbmxpbmUoKSYmIWkuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJihlPWkuZ2V0TmV4dFNpYmxpbmcoKSxlZShlKSYmKHQua2V5PWUuX19rZXksdC5vZmZzZXQ9MCkpKX1mdW5jdGlvbiBFRSh0LGUsbil7aWYodC50eXBlPT09InRleHQiJiZlLnR5cGU9PT0idGV4dCIpe3ZhciByPXQuaXNCZWZvcmUoZSk7bGV0IGk9dC5pcyhlKTtKMCh0LHIsaSksSjAoZSwhcixpKSxpJiYoZS5rZXk9dC5rZXksZS5vZmZzZXQ9dC5vZmZzZXQsZS50eXBlPXQudHlwZSkscj1wdCgpLHIuaXNDb21wb3NpbmcoKSYmci5fY29tcG9zaXRpb25LZXkhPT10LmtleSYmdmUobikmJihyPW4uYW5jaG9yLG49bi5mb2N1cyxMaSh0LHIua2V5LHIub2Zmc2V0LHIudHlwZSksTGkoZSxuLmtleSxuLm9mZnNldCxuLnR5cGUpKX19ZnVuY3Rpb24gQ0UodCxlLG4scixpLG8pe3JldHVybiB0PT09bnVsbHx8bj09PW51bGx8fCFJdShpLHQsbil8fChlPVEwKHQsZSx2ZShvKT9vLmFuY2hvcjpudWxsLGkpLGU9PT1udWxsKXx8KHI9UTAobixyLHZlKG8pP28uZm9jdXM6bnVsbCxpKSxyPT09bnVsbHx8ZS50eXBlPT09ImVsZW1lbnQiJiZyLnR5cGU9PT0iZWxlbWVudCImJih0PWpsKHQpLG49amwobiksdHQodCkmJnR0KG4pKSk/bnVsbDooRUUoZSxyLG8pLFtlLHJdKX1mdW5jdGlvbiBDZyh0KXtyZXR1cm4gVSh0KSYmIXQuaXNJbmxpbmUoKX1mdW5jdGlvbiBrRSh0LGUsbixyLGksbyl7bGV0IGw9UXIoKTtyZXR1cm4gdD1uZXcgYWwobmV3IFZyKHQsZSxpKSxuZXcgVnIobixyLG8pLDAsIiIpLHQuZGlydHk9ITAsbC5fc2VsZWN0aW9uPXR9ZnVuY3Rpb24ga2coKXtyZXR1cm4gbmV3IE9mKG5ldyBTZXQpfWZ1bmN0aW9uIEVPKHQpe2xldCBlPXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLG49WHIodC5fd2luZG93KTtyZXR1cm4gJHMoZSl8fF92KGUpP2UuY2xvbmUoKTp3dihlLG4sdCl9ZnVuY3Rpb24gd3YodCxlLG4pe3ZhciByPW4uX3dpbmRvdztpZihyPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgaT1yLmV2ZW50LG89aT9pLnR5cGU6dm9pZCAwO3I9bz09PSJzZWxlY3Rpb25jaGFuZ2UiLGk9IWFnJiYocnx8bz09PSJiZWZvcmVpbnB1dCJ8fG89PT0iY29tcG9zaXRpb25zdGFydCJ8fG89PT0iY29tcG9zaXRpb25lbmQifHxvPT09ImNsaWNrIiYmaSYmaS5kZXRhaWw9PT0zfHxvPT09ImRyb3AifHxvPT09dm9pZCAwKTtsZXQgbDtpZighdmUodCl8fGkpe2lmKGU9PT1udWxsKXJldHVybiBudWxsO2lmKGk9ZS5hbmNob3JOb2RlLG89ZS5mb2N1c05vZGUsbD1lLmFuY2hvck9mZnNldCxlPWUuZm9jdXNPZmZzZXQsciYmdmUodCkmJiFJdShuLGksbykpcmV0dXJuIHQuY2xvbmUoKX1lbHNlIHJldHVybiB0LmNsb25lKCk7aWYobj1DRShpLGwsbyxlLG4sdCksbj09PW51bGwpcmV0dXJuIG51bGw7bGV0W3MsYV09bjtyZXR1cm4gbmV3IGFsKHMsYSx2ZSh0KT90LmZvcm1hdDowLHZlKHQpP3Quc3R5bGU6IiIpfWZ1bmN0aW9uIHJ0KCl7cmV0dXJuIFFyKCkuX3NlbGVjdGlvbn1mdW5jdGlvbiBUcygpe3JldHVybiBwdCgpLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9ufWZ1bmN0aW9uIE1kKHQsZSxuLHI9MSl7dmFyIGk9dC5hbmNob3Isbz10LmZvY3VzLGw9aS5nZXROb2RlKCkscz1vLmdldE5vZGUoKTtpZihlLmlzKGwpfHxlLmlzKHMpKXtpZihsPWUuX19rZXksdC5pc0NvbGxhcHNlZCgpKWU9aS5vZmZzZXQsKG48PWUmJjA8cnx8bjxlJiYwPnIpJiYobj1NYXRoLm1heCgwLGUrciksaS5zZXQobCxuLCJlbGVtZW50Iiksby5zZXQobCxuLCJlbGVtZW50IikscTAodCkpO2Vsc2V7bGV0IHU9dC5pc0JhY2t3YXJkKCk7cz11P286aTt2YXIgYT1zLmdldE5vZGUoKTtpPXU/aTpvLG89aS5nZXROb2RlKCksZS5pcyhhKSYmKGE9cy5vZmZzZXQsKG48PWEmJjA8cnx8bjxhJiYwPnIpJiZzLnNldChsLE1hdGgubWF4KDAsYStyKSwiZWxlbWVudCIpKSxlLmlzKG8pJiYoZT1pLm9mZnNldCwobjw9ZSYmMDxyfHxuPGUmJjA+cikmJmkuc2V0KGwsTWF0aC5tYXgoMCxlK3IpLCJlbGVtZW50IikpfXEwKHQpfX1mdW5jdGlvbiBxMCh0KXt2YXIgZT10LmFuY2hvcixuPWUub2Zmc2V0O2xldCByPXQuZm9jdXM7dmFyIGk9ci5vZmZzZXQsbz1lLmdldE5vZGUoKSxsPXIuZ2V0Tm9kZSgpO2lmKHQuaXNDb2xsYXBzZWQoKSlVKG8pJiYobD1vLmdldENoaWxkcmVuU2l6ZSgpLGw9KGk9bj49bCk/by5nZXRDaGlsZEF0SW5kZXgobC0xKTpvLmdldENoaWxkQXRJbmRleChuKSxlZShsKSYmKG49MCxpJiYobj1sLmdldFRleHRDb250ZW50U2l6ZSgpKSxlLnNldChsLl9fa2V5LG4sInRleHQiKSxyLnNldChsLl9fa2V5LG4sInRleHQiKSkpO2Vsc2V7aWYoVShvKSl7bGV0IHM9by5nZXRDaGlsZHJlblNpemUoKTtuPSh0PW4+PXMpP28uZ2V0Q2hpbGRBdEluZGV4KHMtMSk6by5nZXRDaGlsZEF0SW5kZXgobiksZWUobikmJihvPTAsdCYmKG89bi5nZXRUZXh0Q29udGVudFNpemUoKSksZS5zZXQobi5fX2tleSxvLCJ0ZXh0IikpfVUobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksaT0oZT1pPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KGkpLGVlKGkpJiYobD0wLGUmJihsPWkuZ2V0VGV4dENvbnRlbnRTaXplKCkpLHIuc2V0KGkuX19rZXksbCwidGV4dCIpKSl9fWZ1bmN0aW9uIENPKHQsZSl7aWYoZT1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbix0PXQuX3NlbGVjdGlvbix2ZSh0KSl7dmFyIG49dC5hbmNob3I7bGV0IHI9dC5mb2N1cyxpO24udHlwZT09PSJ0ZXh0IiYmKGk9bi5nZXROb2RlKCksaS5zZWxlY3Rpb25UcmFuc2Zvcm0oZSx0KSksci50eXBlPT09InRleHQiJiYobj1yLmdldE5vZGUoKSxpIT09biYmbi5zZWxlY3Rpb25UcmFuc2Zvcm0oZSx0KSl9fWZ1bmN0aW9uIExkKHQsZSxuLHIsaSl7bGV0IG89bnVsbCxsPTAscz1udWxsO3IhPT1udWxsPyhvPXIuX19rZXksZWUocik/KGw9ci5nZXRUZXh0Q29udGVudFNpemUoKSxzPSJ0ZXh0Iik6VShyKSYmKGw9ci5nZXRDaGlsZHJlblNpemUoKSxzPSJlbGVtZW50IikpOmkhPT1udWxsJiYobz1pLl9fa2V5LGVlKGkpP3M9InRleHQiOlUoaSkmJihzPSJlbGVtZW50IikpLG8hPT1udWxsJiZzIT09bnVsbD90LnNldChvLGwscyk6KGw9ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksdC5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIGV4KHQsZSxuLHIsaSl7dC50eXBlPT09InRleHQiPyh0LmtleT1uLGV8fCh0Lm9mZnNldCs9aSkpOnQub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS10Lm9mZnNldH1mdW5jdGlvbiBiRSh0LGUsbil7bGV0IHI9W10saT1udWxsLG89bnVsbDt0PXQuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPHQubGVuZ3RoO2MrKyl7dmFyIGw9dFtjXTt1dShsKXx8RygxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihRbihkKXx8RygxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sbT11Ll9fY29sU3Bhbjtmb3IobGV0IGc9MDtnPGg7ZysrKXtyW3MrZ109PT12b2lkIDAmJihyW3MrZ109W10pO2ZvcihsZXQgdz0wO3c8bTt3KyspcltzK2ddW2Erd109Zn1lLmlzKHUpJiYoaT1mKSxuLmlzKHUpJiYobz1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIGk9PT1udWxsJiZHKDExMCksbz09PW51bGwmJkcoMTExKSxbcixpLG9dfWZ1bmN0aW9uICRFKHQpe3QgaW5zdGFuY2VvZiBDdnx8KHQgaW5zdGFuY2VvZiB6dT8odD1QZCh0LFFuKSxRbih0KXx8RygxMTQpKToodD1QZCh0LmdldE5vZGUoKSxRbiksUW4odCl8fEcoMTE0KSkpO2xldCBlPXQuZ2V0UGFyZW50KCk7dXUoZSl8fEcoMTE1KTtsZXQgbj1lLmdldFBhcmVudCgpO3JldHVybiBrdihuKXx8RygxMTYpLFt0LGUsbl19bGV0IGp0PW51bGwsenQ9bnVsbCxPbj0hMSxEaD0hMSxhdT0wLHR4PXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBOcygpe3JldHVybiBPbnx8anQhPT1udWxsJiZqdC5fcmVhZE9ubHl9ZnVuY3Rpb24gaG4oKXtPbiYmRygxMyl9ZnVuY3Rpb24gUXIoKXtyZXR1cm4ganQ9PT1udWxsJiZHKDE1KSxqdH1mdW5jdGlvbiBwdCgpe3JldHVybiB6dD09PW51bGwmJkcoMTYpLHp0fWZ1bmN0aW9uIG54KHQsZSxuKXt2YXIgcj1lLl9fdHlwZTtsZXQgaT10Ll9ub2Rlcy5nZXQocik7Zm9yKGk9PT12b2lkIDAmJkcoMzAsciksdD1uLmdldChyKSx0PT09dm9pZCAwJiYodD1BcnJheS5mcm9tKGkudHJhbnNmb3Jtcyksbi5zZXQocix0KSksbj10Lmxlbmd0aCxyPTA7cjxuJiYodFtyXShlKSxlLmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24ga08odCxlKXtlPWUuX2RpcnR5TGVhdmVzLHQ9dC5fbm9kZU1hcDtmb3IobGV0IG4gb2YgZSllPXQuZ2V0KG4pLGVlKGUpJiZlLmlzQXR0YWNoZWQoKSYmZS5pc1NpbXBsZVRleHQoKSYmIWUuaXNVbm1lcmdlYWJsZSgpJiZRUyhlKX1mdW5jdGlvbiBiTyh0LGUpe2xldCBuPWUuX2RpcnR5TGVhdmVzLHI9ZS5fZGlydHlFbGVtZW50czt0PXQuX25vZGVNYXA7bGV0IGk9V2koKSxvPW5ldyBNYXA7dmFyIGw9bjtsZXQgcz1sLnNpemU7Zm9yKHZhciBhPXIsdT1hLnNpemU7MDxzfHwwPHU7KXtpZigwPHMpe2UuX2RpcnR5TGVhdmVzPW5ldyBTZXQ7Zm9yKGxldCBjIG9mIGwpbD10LmdldChjKSxlZShsKSYmbC5pc0F0dGFjaGVkKCkmJmwuaXNTaW1wbGVUZXh0KCkmJiFsLmlzVW5tZXJnZWFibGUoKSYmUVMobCksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PWkmJmwuaXNBdHRhY2hlZCgpJiZueChlLGwsbyksbi5hZGQoYyk7aWYobD1lLl9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSwwPHMpe2F1Kys7Y29udGludWV9fWUuX2RpcnR5TGVhdmVzPW5ldyBTZXQsZS5fZGlydHlFbGVtZW50cz1uZXcgTWFwO2ZvcihsZXQgYyBvZiBhKWE9Y1swXSx1PWNbMV0sKGE9PT0icm9vdCJ8fHUpJiYobD10LmdldChhKSxsIT09dm9pZCAwJiZsIT09dm9pZCAwJiZsLl9fa2V5IT09aSYmbC5pc0F0dGFjaGVkKCkmJm54KGUsbCxvKSxyLnNldChhLHUpKTtsPWUuX2RpcnR5TGVhdmVzLHM9bC5zaXplLGE9ZS5fZGlydHlFbGVtZW50cyx1PWEuc2l6ZSxhdSsrfWUuX2RpcnR5TGVhdmVzPW4sZS5fZGlydHlFbGVtZW50cz1yfWZ1bmN0aW9uIFN2KHQsZSl7dmFyIG49dC50eXBlLHI9ZS5nZXQobik7aWYocj09PXZvaWQgMCYmRygxNyxuKSxuPXIua2xhc3MsdC50eXBlIT09bi5nZXRUeXBlKCkmJkcoMTgsbi5uYW1lKSxuPW4uaW1wb3J0SlNPTih0KSx0PXQuY2hpbGRyZW4sVShuKSYmQXJyYXkuaXNBcnJheSh0KSlmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgaT1Tdih0W3JdLGUpO24uYXBwZW5kKGkpfXJldHVybiBufWZ1bmN0aW9uIHJ4KHQsZSl7bGV0IG49anQscj1PbixpPXp0O2p0PXQsT249ITAsenQ9bnVsbDt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2p0PW4sT249cix6dD1pfX1mdW5jdGlvbiBqbyh0LGUpe2xldCBuPXQuX3BlbmRpbmdFZGl0b3JTdGF0ZSxyPXQuX3Jvb3RFbGVtZW50LGk9dC5faGVhZGxlc3N8fHI9PT1udWxsO2lmKG4hPT1udWxsKXt2YXIgbz10Ll9lZGl0b3JTdGF0ZSxsPW8uX3NlbGVjdGlvbixzPW4uX3NlbGVjdGlvbixhPXQuX2RpcnR5VHlwZSE9PTAsdT1qdCxjPU9uLGQ9enQsZj10Ll91cGRhdGluZyxoPXQuX29ic2VydmVyLG09bnVsbDtpZih0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCx0Ll9lZGl0b3JTdGF0ZT1uLCFpJiZhJiZoIT09bnVsbCl7enQ9dCxqdD1uLE9uPSExLHQuX3VwZGF0aW5nPSEwO3RyeXtsZXQgemU9dC5fZGlydHlUeXBlLFR0PXQuX2RpcnR5RWxlbWVudHMsYXQ9dC5fZGlydHlMZWF2ZXM7aC5kaXNjb25uZWN0KCk7dmFyIGc9emUsdz1UdCx2PWF0O2ZuPW9pPU50PSIiLGNFPWc9PT0yLEJjPW51bGwsdG49dCxpbz10Ll9jb25maWcsaXU9dC5fbm9kZXMsTmY9dG4uX2xpc3RlbmVycy5tdXRhdGlvbixmZz13LGhnPXYsS289by5fbm9kZU1hcCxvbz1uLl9ub2RlTWFwLHh2PW4uX3JlYWRPbmx5LHBnPW5ldyBNYXAodC5fa2V5VG9ET01NYXApO2xldCBsbj1uZXcgTWFwO291PWxuLHVhKCJyb290IixudWxsKSxvdT1wZz1pbz1vbz1Lbz1oZz1mZz1pdT10bj12b2lkIDAsbT1sbn1jYXRjaCh6ZSl7aWYoemUgaW5zdGFuY2VvZiBFcnJvciYmdC5fb25FcnJvcih6ZSksRGgpdGhyb3cgemU7T0UodCxudWxsLHIsbiksWFModCksdC5fZGlydHlUeXBlPTIsRGg9ITAsam8odCxvKSxEaD0hMTtyZXR1cm59ZmluYWxseXtoLm9ic2VydmUocix0eCksdC5fdXBkYXRpbmc9ZixqdD11LE9uPWMsenQ9ZH19bi5fcmVhZE9ubHl8fChuLl9yZWFkT25seT0hMCk7dmFyIHk9dC5fZGlydHlMZWF2ZXMseD10Ll9kaXJ0eUVsZW1lbnRzLFM9dC5fbm9ybWFsaXplZE5vZGVzLGI9dC5fdXBkYXRlVGFncyxUPXQuX2RlZmVycmVkO2EmJih0Ll9kaXJ0eVR5cGU9MCx0Ll9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLHQuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdC5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHQuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHQuX3VwZGF0ZVRhZ3M9bmV3IFNldCk7dmFyICQ9dC5fZGVjb3JhdG9ycyxPPXQuX3BlbmRpbmdEZWNvcmF0b3JzfHwkLEw9bi5fbm9kZU1hcCxQO2ZvcihQIGluIE8pTC5oYXMoUCl8fChPPT09JCYmKE89bkUodCkpLGRlbGV0ZSBPW1BdKTt2YXIgRD1pP251bGw6WHIodC5fd2luZG93KTtpZih0Ll9lZGl0YWJsZSYmRCE9PW51bGwmJihhfHxzPT09bnVsbHx8cy5kaXJ0eSkpe3p0PXQsanQ9bjt0cnl7aWYoaCE9PW51bGwmJmguZGlzY29ubmVjdCgpLGF8fHM9PT1udWxsfHxzLmRpcnR5KXtsZXQgemU9dC5fYmxvY2tDdXJzb3JFbGVtZW50O3plIT09bnVsbCYmZGcoemUsdCxyKTtlOntsZXQgVHQ9RC5hbmNob3JOb2RlLGF0PUQuZm9jdXNOb2RlLGxuPUQuYW5jaG9yT2Zmc2V0LEVuPUQuZm9jdXNPZmZzZXQsX3Q9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighKGIuaGFzKCJjb2xsYWJvcmF0aW9uIikmJl90IT09cnx8X3QhPT1udWxsJiZodihfdCkpKWlmKHZlKHMpKXt2YXIgQj1zLmFuY2hvcixvZT1zLmZvY3VzLEg9Qi5rZXksWj1vZS5rZXksQz1SZCh0LEgpLGs9UmQodCxaKSxFPUIub2Zmc2V0LEE9b2Uub2Zmc2V0LE49cy5mb3JtYXQsRj1zLnN0eWxlLEs9cy5pc0NvbGxhcHNlZCgpLGRlPUMsc2U9ayxBZT0hMTtpZihCLnR5cGU9PT0idGV4dCIpe2RlPSRkKEMpO2xldCBBdD1CLmdldE5vZGUoKTtBZT1BdC5nZXRGb3JtYXQoKSE9PU58fEF0LmdldFN0eWxlKCkhPT1GfWVsc2UgdmUobCkmJmwuYW5jaG9yLnR5cGU9PT0idGV4dCImJihBZT0hMCk7aWYob2UudHlwZT09PSJ0ZXh0IiYmKHNlPSRkKGspKSxkZSE9PW51bGwmJnNlIT09bnVsbCl7aWYoSyYmKGw9PT1udWxsfHxBZXx8dmUobCkmJihsLmZvcm1hdCE9PU58fGwuc3R5bGUhPT1GKSkpe3ZhciBOZT1wZXJmb3JtYW5jZS5ub3coKTt5RT1bTixGLEUsSCxOZV19aWYobG49PT1FJiZFbj09PUEmJlR0PT09ZGUmJmF0PT09c2UmJihELnR5cGUhPT0iUmFuZ2UifHwhSykmJihfdCE9PW51bGwmJnIuY29udGFpbnMoX3QpfHxyLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksQi50eXBlIT09ImVsZW1lbnQiKSlicmVhayBlO3RyeXtELnNldEJhc2VBbmRFeHRlbnQoZGUsRSxzZSxBKX1jYXRjaHt9aWYoIWIuaGFzKCJza2lwLXNjcm9sbC1pbnRvLXZpZXciKSYmcy5pc0NvbGxhcHNlZCgpJiZyIT09bnVsbCYmcj09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe2xldCBBdD1zIGluc3RhbmNlb2YgYWwmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCI/ZGUuY2hpbGROb2Rlc1tFXXx8bnVsbDowPEQucmFuZ2VDb3VudD9ELmdldFJhbmdlQXQoMCk6bnVsbDtpZihBdCE9PW51bGwpe2xldCBzbjtpZihBdCBpbnN0YW5jZW9mIFRleHQpe2xldCBtdD1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO210LnNlbGVjdE5vZGUoQXQpLHNuPW10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWVsc2Ugc249QXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IFBuPXIub3duZXJEb2N1bWVudCxxcj1Qbi5kZWZhdWx0VmlldztpZihxciE9PW51bGwpZm9yKHZhcnt0b3A6USxib3R0b206amV9PXNuLGJlLFJlLHdlPXI7d2UhPT1udWxsOyl7bGV0IG10PXdlPT09UG4uYm9keTtpZihtdCliZT0wLFJlPSRmKHQpLmlubmVySGVpZ2h0O2Vsc2V7bGV0IF9vPXdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2JlPV9vLnRvcCxSZT1fby5ib3R0b219bGV0IE5yPTA7aWYoUTxiZT9Ocj0tKGJlLVEpOmplPlJlJiYoTnI9amUtUmUpLE5yIT09MClpZihtdClxci5zY3JvbGxCeSgwLE5yKTtlbHNle2xldCBfbz13ZS5zY3JvbGxUb3A7d2Uuc2Nyb2xsVG9wKz1OcjtsZXQganM9d2Uuc2Nyb2xsVG9wLV9vO1EtPWpzLGplLT1qc31pZihtdClicmVhazt3ZT1iZih3ZSl9fX14Zz0hMH19ZWxzZSBsIT09bnVsbCYmSXUodCxUdCxhdCkmJkQucmVtb3ZlQWxsUmFuZ2VzKCl9fWU6e2xldCB6ZT10Ll9ibG9ja0N1cnNvckVsZW1lbnQ7aWYodmUocykmJnMuaXNDb2xsYXBzZWQoKSYmcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmci5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSl7bGV0IFR0PXMuYW5jaG9yLGF0PVR0LmdldE5vZGUoKSxsbj1UdC5vZmZzZXQsRW49YXQuZ2V0Q2hpbGRyZW5TaXplKCksX3Q9ITEsQXQ9bnVsbDtpZihsbj09PUVuKXtsZXQgc249YXQuZ2V0Q2hpbGRBdEluZGV4KGxuLTEpO1JoKHNuKSYmKF90PSEwKX1lbHNle2xldCBzbj1hdC5nZXRDaGlsZEF0SW5kZXgobG4pO2lmKFJoKHNuKSl7bGV0IFBuPXNuLmdldFByZXZpb3VzU2libGluZygpOyhQbj09PW51bGx8fFJoKFBuKSkmJihfdD0hMCxBdD10LmdldEVsZW1lbnRCeUtleShzbi5fX2tleSkpfX1pZihfdCl7bGV0IHNuPXQuZ2V0RWxlbWVudEJ5S2V5KGF0Ll9fa2V5KTtpZih6ZT09PW51bGwpe2xldCBQbj10Ll9jb25maWcudGhlbWUscXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cXIuY29udGVudEVkaXRhYmxlPSJmYWxzZSIscXIuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtY3Vyc29yIiwidHJ1ZSIpO2xldCBtdD1Qbi5ibG9ja0N1cnNvcjtpZihtdCE9PXZvaWQgMCl7aWYodHlwZW9mIG10PT0ic3RyaW5nIil7bGV0IE5yPW10LnNwbGl0KCIgIik7bXQ9UG4uYmxvY2tDdXJzb3I9TnJ9bXQhPT12b2lkIDAmJnFyLmNsYXNzTGlzdC5hZGQoLi4ubXQpfXQuX2Jsb2NrQ3Vyc29yRWxlbWVudD16ZT1xcn1yLnN0eWxlLmNhcmV0Q29sb3I9InRyYW5zcGFyZW50IixBdD09PW51bGw/c24uYXBwZW5kQ2hpbGQoemUpOnNuLmluc2VydEJlZm9yZSh6ZSxBdCk7YnJlYWsgZX19emUhPT1udWxsJiZkZyh6ZSx0LHIpfWghPT1udWxsJiZoLm9ic2VydmUocix0eCl9ZmluYWxseXt6dD1kLGp0PXV9fWlmKG0hPT1udWxsKXt2YXIgSWU9bTtsZXQgemU9QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnMubXV0YXRpb24pLFR0PXplLmxlbmd0aDtmb3IobGV0IGF0PTA7YXQ8VHQ7YXQrKyl7bGV0W2xuLEVuXT16ZVthdF0sX3Q9SWUuZ2V0KEVuKTtfdCE9PXZvaWQgMCYmbG4oX3Qse2RpcnR5TGVhdmVzOnkscHJldkVkaXRvclN0YXRlOm8sdXBkYXRlVGFnczpifSl9fXZlKHMpfHxzPT09bnVsbHx8bCE9PW51bGwmJmwuaXMocyl8fHQuZGlzcGF0Y2hDb21tYW5kKEVmLHZvaWQgMCk7dmFyIFFlPXQuX3BlbmRpbmdEZWNvcmF0b3JzO1FlIT09bnVsbCYmKHQuX2RlY29yYXRvcnM9UWUsdC5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCxOYSgiZGVjb3JhdG9yIix0LCEwLFFlKSk7dmFyIFd0PUYwKGV8fG8pLFNuPUYwKG4pO2lmKFd0IT09U24mJk5hKCJ0ZXh0Y29udGVudCIsdCwhMCxTbiksTmEoInVwZGF0ZSIsdCwhMCx7ZGlydHlFbGVtZW50czp4LGRpcnR5TGVhdmVzOnksZWRpdG9yU3RhdGU6bixub3JtYWxpemVkTm9kZXM6UyxwcmV2RWRpdG9yU3RhdGU6ZXx8byx0YWdzOmJ9KSx0Ll9kZWZlcnJlZD1bXSxULmxlbmd0aCE9PTApe2xldCB6ZT10Ll91cGRhdGluZzt0Ll91cGRhdGluZz0hMDt0cnl7Zm9yKGxldCBUdD0wO1R0PFQubGVuZ3RoO1R0KyspVFtUdF0oKX1maW5hbGx5e3QuX3VwZGF0aW5nPXplfX12YXIgbHI9dC5fdXBkYXRlcztpZihsci5sZW5ndGghPT0wKXtsZXQgemU9bHIuc2hpZnQoKTtpZih6ZSl7bGV0W1R0LGF0XT16ZTtURSh0LFR0LGF0KX19fX1mdW5jdGlvbiBOYSh0LGUsbiwuLi5yKXtsZXQgaT1lLl91cGRhdGluZztlLl91cGRhdGluZz1uO3RyeXtsZXQgbz1BcnJheS5mcm9tKGUuX2xpc3RlbmVyc1t0XSk7Zm9yKHQ9MDt0PG8ubGVuZ3RoO3QrKylvW3RdLmFwcGx5KG51bGwscil9ZmluYWxseXtlLl91cGRhdGluZz1pfX1mdW5jdGlvbiBKKHQsZSxuKXtpZih0Ll91cGRhdGluZz09PSExfHx6dCE9PXQpe2xldCBvPSExO3JldHVybiB0LnVwZGF0ZSgoKT0+e289Sih0LGUsbil9KSxvfWxldCByPWd2KHQpO2ZvcihsZXQgbz00OzA8PW87by0tKWZvcihsZXQgbD0wO2w8ci5sZW5ndGg7bCsrKXt2YXIgaT1yW2xdLl9jb21tYW5kcy5nZXQoZSk7aWYoaSE9PXZvaWQgMCYmKGk9aVtvXSxpIT09dm9pZCAwKSl7aT1BcnJheS5mcm9tKGkpO2xldCBzPWkubGVuZ3RoO2ZvcihsZXQgYT0wO2E8czthKyspaWYoaVthXShuLHQpPT09ITApcmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIGl4KHQsZSl7bGV0IG49dC5fdXBkYXRlcztmb3IoZT1lfHwhMTtuLmxlbmd0aCE9PTA7KXt2YXIgcj1uLnNoaWZ0KCk7aWYocil7bGV0W2ksb109cixsO28hPT12b2lkIDAmJihyPW8ub25VcGRhdGUsbD1vLnRhZyxvLnNraXBUcmFuc2Zvcm1zJiYoZT0hMCksciYmdC5fZGVmZXJyZWQucHVzaChyKSxsJiZ0Ll91cGRhdGVUYWdzLmFkZChsKSksaSgpfX1yZXR1cm4gZX1mdW5jdGlvbiBURSh0LGUsbil7bGV0IHI9dC5fdXBkYXRlVGFnczt2YXIgaSxvPWk9ITE7aWYobiE9PXZvaWQgMCl7dmFyIGw9bi5vblVwZGF0ZTtpPW4udGFnLGkhPW51bGwmJnIuYWRkKGkpLGk9bi5za2lwVHJhbnNmb3Jtc3x8ITEsbz1uLmRpc2NyZXRlfHwhMX1sJiZ0Ll9kZWZlcnJlZC5wdXNoKGwpLG49dC5fZWRpdG9yU3RhdGUsbD10Ll9wZW5kaW5nRWRpdG9yU3RhdGU7bGV0IHM9ITE7KGw9PT1udWxsfHxsLl9yZWFkT25seSkmJihsPXQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1uZXcgQWYobmV3IE1hcCgobHx8bikuX25vZGVNYXApKSxzPSEwKSxsLl9mbHVzaFN5bmM9byxvPWp0O2xldCBhPU9uLHU9enQsYz10Ll91cGRhdGluZztqdD1sLE9uPSExLHQuX3VwZGF0aW5nPSEwLHp0PXQ7dHJ5e3MmJih0Ll9oZWFkbGVzcz9uLl9zZWxlY3Rpb24hPW51bGwmJihsLl9zZWxlY3Rpb249bi5fc2VsZWN0aW9uLmNsb25lKCkpOmwuX3NlbGVjdGlvbj1FTyh0KSk7bGV0IGQ9dC5fY29tcG9zaXRpb25LZXk7ZSgpLGk9aXgodCxpKSxDTyhsLHQpLHQuX2RpcnR5VHlwZSE9PTAmJihpP2tPKGwsdCk6Yk8obCx0KSxpeCh0KSxzTyhuLGwsdC5fZGlydHlMZWF2ZXMsdC5fZGlydHlFbGVtZW50cykpLGQhPT10Ll9jb21wb3NpdGlvbktleSYmKGwuX2ZsdXNoU3luYz0hMCk7bGV0IGY9bC5fc2VsZWN0aW9uO2lmKHZlKGYpKXtsZXQgaD1sLl9ub2RlTWFwLG09Zi5mb2N1cy5rZXk7aC5nZXQoZi5hbmNob3Iua2V5KSE9PXZvaWQgMCYmaC5nZXQobSkhPT12b2lkIDB8fEcoMTkpfWVsc2UgJHMoZikmJmYuX25vZGVzLnNpemU9PT0wJiYobC5fc2VsZWN0aW9uPW51bGwpfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdC5fb25FcnJvcihkKSx0Ll9wZW5kaW5nRWRpdG9yU3RhdGU9bix0Ll9kaXJ0eVR5cGU9Mix0Ll9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLHQuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdC5fZGlydHlFbGVtZW50cy5jbGVhcigpLGpvKHQpO3JldHVybn1maW5hbGx5e2p0PW8sT249YSx6dD11LHQuX3VwZGF0aW5nPWMsYXU9MH10Ll9kaXJ0eVR5cGUhPT0wfHwkTyhsLHQpP2wuX2ZsdXNoU3luYz8obC5fZmx1c2hTeW5jPSExLGpvKHQpKTpzJiZyTygoKT0+e2pvKHQpfSk6KGwuX2ZsdXNoU3luYz0hMSxzJiYoci5jbGVhcigpLHQuX2RlZmVycmVkPVtdLHQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSl9ZnVuY3Rpb24gV24odCxlLG4pe3QuX3VwZGF0aW5nP3QuX3VwZGF0ZXMucHVzaChbZSxuXSk6VEUodCxlLG4pfWNsYXNzIE5FIGV4dGVuZHMgenV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9ZGVjb3JhdGUoKXtHKDQ3KX1pc0lzb2xhdGVkKCl7cmV0dXJuITF9aXNJbmxpbmUoKXtyZXR1cm4hMH1pc0tleWJvYXJkU2VsZWN0YWJsZSgpe3JldHVybiEwfX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE5FfWNsYXNzIHVsIGV4dGVuZHMgenV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fX2xhc3Q9dGhpcy5fX2ZpcnN0PW51bGwsdGhpcy5fX2luZGVudD10aGlzLl9fZm9ybWF0PXRoaXMuX19zaXplPTAsdGhpcy5fX2Rpcj1udWxsfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldEZvcm1hdFR5cGUoKXtsZXQgZT10aGlzLmdldEZvcm1hdCgpO3JldHVybiBRUltlXXx8IiJ9Z2V0SW5kZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19pbmRlbnR9Z2V0Q2hpbGRyZW4oKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuKSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gZX1nZXRDaGlsZHJlbktleXMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KWUucHVzaChuLl9fa2V5KSxuPW4uZ2V0TmV4dFNpYmxpbmcoKTtyZXR1cm4gZX1nZXRDaGlsZHJlblNpemUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3NpemV9aXNFbXB0eSgpe3JldHVybiB0aGlzLmdldENoaWxkcmVuU2l6ZSgpPT09MH1pc0RpcnR5KCl7bGV0IGU9cHQoKS5fZGlydHlFbGVtZW50cztyZXR1cm4gZSE9PW51bGwmJmUuaGFzKHRoaXMuX19rZXkpfWlzTGFzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKSxuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldExhc3RDaGlsZCgpO3JldHVybiBuIT09bnVsbCYmbi5pcyhlKX1nZXRBbGxUZXh0Tm9kZXMoKXtsZXQgZT1bXSxuPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7biE9PW51bGw7KXtpZihlZShuKSYmZS5wdXNoKG4pLFUobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7ZS5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiBlfWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCBlPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7ZSE9PW51bGw7KXtpZihVKGUpKXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7ZT1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gZX1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCBlPXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDtlIT09bnVsbDspe2lmKFUoZSkpe2xldCBuPWUuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe2U9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIGV9Z2V0RGVzY2VuZGFudEJ5SW5kZXgoZSl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIGU+PXI/KGU9bltyLTFdLFUoZSkmJmUuZ2V0TGFzdERlc2NlbmRhbnQoKXx8ZXx8bnVsbCk6KGU9bltlXSxVKGUpJiZlLmdldEZpcnN0RGVzY2VuZGFudCgpfHxlfHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiBlPT09bnVsbD9udWxsOkR0KGUpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IGU9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIGU9PT1udWxsJiZHKDQ1LHRoaXMuX19rZXkpLGV9Z2V0TGFzdENoaWxkKCl7bGV0IGU9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIGU9PT1udWxsP251bGw6RHQoZSl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCBlPXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIGU9PT1udWxsJiZHKDk2LHRoaXMuX19rZXkpLGV9Z2V0Q2hpbGRBdEluZGV4KGUpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYoZTxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9ZTspe2lmKG49PT1lKXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49ZTspe2lmKG49PT1lKXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgZT0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPW5baV07ZSs9by5nZXRUZXh0Q29udGVudCgpLFUobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJihlKz1gCgpgKX1yZXR1cm4gZX1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgZT0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IG89bltpXTtlKz1vLmdldFRleHRDb250ZW50U2l6ZSgpLFUobykmJmkhPT1yLTEmJiFvLmlzSW5saW5lKCkmJihlKz0yKX1yZXR1cm4gZX1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQoZSl7cmV0dXJuIGUhPT0iIj8oZT1JMFtlXSwodGhpcy5nZXRGb3JtYXQoKSZlKSE9PTApOiExfXNlbGVjdChlLG4pe2huKCk7bGV0IHI9cnQoKSxpPWUsbz1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZihlPT09MCYmbj09PTApe2lmKGU9dGhpcy5nZXRGaXJzdENoaWxkKCksZWUoZSl8fFUoZSkpcmV0dXJuIGUuc2VsZWN0KDAsMCl9ZWxzZSBpZighKGUhPT12b2lkIDAmJmUhPT1sfHxuIT09dm9pZCAwJiZuIT09bCkmJihlPXRoaXMuZ2V0TGFzdENoaWxkKCksZWUoZSl8fFUoZSkpKXJldHVybiBlLnNlbGVjdCgpfWlmKGk9PT12b2lkIDAmJihpPWwpLG89PT12b2lkIDAmJihvPWwpLGw9dGhpcy5fX2tleSx2ZShyKSlyLmFuY2hvci5zZXQobCxpLCJlbGVtZW50Iiksci5mb2N1cy5zZXQobCxvLCJlbGVtZW50Iiksci5kaXJ0eT0hMDtlbHNlIHJldHVybiBrRShsLGksbCxvLCJlbGVtZW50IiwiZWxlbWVudCIpO3JldHVybiByfXNlbGVjdFN0YXJ0KCl7bGV0IGU9dGhpcy5nZXRGaXJzdERlc2NlbmRhbnQoKTtyZXR1cm4gVShlKXx8ZWUoZSk/ZS5zZWxlY3QoMCwwKTplIT09bnVsbD9lLnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgZT10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIFUoZSl8fGVlKGUpP2Uuc2VsZWN0KCk6ZSE9PW51bGw/ZS5zZWxlY3ROZXh0KCk6dGhpcy5zZWxlY3QoKX1jbGVhcigpe2xldCBlPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobj0+bi5yZW1vdmUoKSksZX1hcHBlbmQoLi4uZSl7cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCksMCxlKX1zZXREaXJlY3Rpb24oZSl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZGlyPWUsbn1zZXRGb3JtYXQoZSl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2Zvcm1hdD1lIT09IiI/STBbZV06MCx0aGlzfXNldEluZGVudChlKXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9faW5kZW50PWUsdGhpc31zcGxpY2UoZSxuLHIpe2xldCBpPXIubGVuZ3RoLG89dGhpcy5nZXRDaGlsZHJlblNpemUoKSxsPXRoaXMuZ2V0V3JpdGFibGUoKSxzPWwuX19rZXk7dmFyIGE9W10sdT1bXTtsZXQgYz10aGlzLmdldENoaWxkQXRJbmRleChlK24pLGQ9bnVsbCxmPW8tbitpO2lmKGUhPT0wKWlmKGU9PT1vKWQ9dGhpcy5nZXRMYXN0Q2hpbGQoKTtlbHNle3ZhciBoPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KGUpO2ghPT1udWxsJiYoZD1oLmdldFByZXZpb3VzU2libGluZygpKX1pZigwPG4pe3ZhciBtPWQ9PT1udWxsP3RoaXMuZ2V0Rmlyc3RDaGlsZCgpOmQuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoaD0wO2g8bjtoKyspe209PT1udWxsJiZHKDEwMCk7dmFyIGc9bS5nZXROZXh0U2libGluZygpLHc9bS5fX2tleTttPW0uZ2V0V3JpdGFibGUoKSxEbyhtKSx1LnB1c2godyksbT1nfX1mb3IoaD1kLGc9MDtnPGk7ZysrKXt3PXJbZ10saCE9PW51bGwmJncuaXMoaCkmJihkPWg9aC5nZXRQcmV2aW91c1NpYmxpbmcoKSksbT13LmdldFdyaXRhYmxlKCksbS5fX3BhcmVudD09PXMmJmYtLSxEbyhtKTtsZXQgdj13Ll9fa2V5O2g9PT1udWxsPyhsLl9fZmlyc3Q9dixtLl9fcHJldj1udWxsKTooaD1oLmdldFdyaXRhYmxlKCksaC5fX25leHQ9dixtLl9fcHJldj1oLl9fa2V5KSx3Ll9fa2V5PT09cyYmRyg3NiksbS5fX3BhcmVudD1zLGEucHVzaCh2KSxoPXd9aWYoZStuPT09bz9oIT09bnVsbCYmKGguZ2V0V3JpdGFibGUoKS5fX25leHQ9bnVsbCxsLl9fbGFzdD1oLl9fa2V5KTpjIT09bnVsbCYmKGU9Yy5nZXRXcml0YWJsZSgpLGghPT1udWxsPyhuPWguZ2V0V3JpdGFibGUoKSxlLl9fcHJldj1oLl9fa2V5LG4uX19uZXh0PWMuX19rZXkpOmUuX19wcmV2PW51bGwpLGwuX19zaXplPWYsdS5sZW5ndGgmJihlPXJ0KCksdmUoZSkpKXt1PW5ldyBTZXQodSksYT1uZXcgU2V0KGEpO2xldHthbmNob3I6dixmb2N1czp5fT1lO294KHYsdSxhKSYmTGQodix2LmdldE5vZGUoKSx0aGlzLGQsYyksb3goeSx1LGEpJiZMZCh5LHkuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxmIT09MHx8dGhpcy5jYW5CZUVtcHR5KCl8fHZyKHRoaXMpfHx0aGlzLnJlbW92ZSgpfXJldHVybiBsfWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6ImVsZW1lbnQiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoKXtyZXR1cm4gbnVsbH1jYW5JbmRlbnQoKXtyZXR1cm4hMH1jb2xsYXBzZUF0U3RhcnQoKXtyZXR1cm4hMX1leGNsdWRlRnJvbUNvcHkoKXtyZXR1cm4hMX1jYW5FeHRyYWN0Q29udGVudHMoKXtyZXR1cm4hMH1jYW5SZXBsYWNlV2l0aCgpe3JldHVybiEwfWNhbkluc2VydEFmdGVyKCl7cmV0dXJuITB9Y2FuQmVFbXB0eSgpe3JldHVybiEwfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1pc0lubGluZSgpe3JldHVybiExfWlzU2hhZG93Um9vdCgpe3JldHVybiExfWNhbk1lcmdlV2l0aCgpe3JldHVybiExfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gVSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHVsfWZ1bmN0aW9uIG94KHQsZSxuKXtmb3IodD10LmdldE5vZGUoKTt0Oyl7bGV0IHI9dC5fX2tleTtpZihlLmhhcyhyKSYmIW4uaGFzKHIpKXJldHVybiEwO3Q9dC5nZXRQYXJlbnQoKX1yZXR1cm4hMX1jbGFzcyBScyBleHRlbmRzIHVse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInJvb3QifXN0YXRpYyBjbG9uZSgpe3JldHVybiBuZXcgUnN9Y29uc3RydWN0b3IoKXtzdXBlcigicm9vdCIpLHRoaXMuX19jYWNoZWRUZXh0PW51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe0coNTEpfWdldFRleHRDb250ZW50KCl7bGV0IGU9dGhpcy5fX2NhY2hlZFRleHQ7cmV0dXJuIU5zKCkmJnB0KCkuX2RpcnR5VHlwZSE9PTB8fGU9PT1udWxsP3N1cGVyLmdldFRleHRDb250ZW50KCk6ZX1yZW1vdmUoKXtHKDUyKX1yZXBsYWNlKCl7Ryg1Myl9aW5zZXJ0QmVmb3JlKCl7Ryg1NCl9aW5zZXJ0QWZ0ZXIoKXtHKDU1KX11cGRhdGVET00oKXtyZXR1cm4hMX1hcHBlbmQoLi4uZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl07VShyKXx8dHQocil8fEcoNTYpfXJldHVybiBzdXBlci5hcHBlbmQoLi4uZSl9c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49WXIoKTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJue2NoaWxkcmVuOltdLGRpcmVjdGlvbjp0aGlzLmdldERpcmVjdGlvbigpLGZvcm1hdDp0aGlzLmdldEZvcm1hdFR5cGUoKSxpbmRlbnQ6dGhpcy5nZXRJbmRlbnQoKSx0eXBlOiJyb290Iix2ZXJzaW9uOjF9fWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiEwfX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFJzfWZ1bmN0aW9uICRPKHQsZSl7aWYoZT1lLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbix0PXQuX3NlbGVjdGlvbix0IT09bnVsbCl7aWYodC5kaXJ0eXx8IXQuaXMoZSkpcmV0dXJuITB9ZWxzZSBpZihlIT09bnVsbClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBFdigpe3JldHVybiBuZXcgQWYobmV3IE1hcChbWyJyb290IixuZXcgUnNdXSkpfWZ1bmN0aW9uIFJFKHQpe2xldCBlPXQuZXhwb3J0SlNPTigpO3ZhciBuPXQuY29uc3RydWN0b3I7ZS50eXBlIT09bi5nZXRUeXBlKCkmJkcoMTMwLG4ubmFtZSk7bGV0IHI9ZS5jaGlsZHJlbjtpZihVKHQpKWZvcihBcnJheS5pc0FycmF5KHIpfHxHKDU5LG4ubmFtZSksdD10LmdldENoaWxkcmVuKCksbj0wO248dC5sZW5ndGg7bisrKXtsZXQgaT1SRSh0W25dKTtyLnB1c2goaSl9cmV0dXJuIGV9Y2xhc3MgQWZ7Y29uc3RydWN0b3IoZSxuKXt0aGlzLl9ub2RlTWFwPWUsdGhpcy5fc2VsZWN0aW9uPW58fG51bGwsdGhpcy5fcmVhZE9ubHk9dGhpcy5fZmx1c2hTeW5jPSExfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC5zaXplPT09MSYmdGhpcy5fc2VsZWN0aW9uPT09bnVsbH1yZWFkKGUpe3JldHVybiByeCh0aGlzLGUpfWNsb25lKGUpe3JldHVybiBlPW5ldyBBZih0aGlzLl9ub2RlTWFwLGU9PT12b2lkIDA/dGhpcy5fc2VsZWN0aW9uOmUpLGUuX3JlYWRPbmx5PSEwLGV9dG9KU09OKCl7cmV0dXJuIHJ4KHRoaXMsKCk9Pih7cm9vdDpSRShZcigpKX0pKX19Y2xhc3MgT3MgZXh0ZW5kcyB1bHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJwYXJhZ3JhcGgifXN0YXRpYyBjbG9uZShlKXtyZXR1cm4gbmV3IE9zKGUuX19rZXkpfWNyZWF0ZURPTShlKXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7cmV0dXJuIGU9YmEoZS50aGVtZSwicGFyYWdyYXBoIiksZSE9PXZvaWQgMCYmbi5jbGFzc0xpc3QuYWRkKC4uLmUpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntwOigpPT4oe2NvbnZlcnNpb246VE8scHJpb3JpdHk6MH0pfX1leHBvcnRET00oZSl7aWYoe2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUmJlRmKGUpKXt0aGlzLmlzRW1wdHkoKSYmZS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7dmFyIG49dGhpcy5nZXRGb3JtYXRUeXBlKCk7ZS5zdHlsZS50ZXh0QWxpZ249biwobj10aGlzLmdldERpcmVjdGlvbigpKSYmKGUuZGlyPW4pLG49dGhpcy5nZXRJbmRlbnQoKSwwPG4mJihlLnN0eWxlLnRleHRJbmRlbnQ9YCR7MjAqbn1weGApfXJldHVybntlbGVtZW50OmV9fXN0YXRpYyBpbXBvcnRKU09OKGUpe2xldCBuPVpvKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KGUuZm9ybWF0KSxuLnNldEluZGVudChlLmluZGVudCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToicGFyYWdyYXBoIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKGUsbil7ZT1abygpO2xldCByPXRoaXMuZ2V0RGlyZWN0aW9uKCk7cmV0dXJuIGUuc2V0RGlyZWN0aW9uKHIpLHRoaXMuaW5zZXJ0QWZ0ZXIoZSxuKSxlfWNvbGxhcHNlQXRTdGFydCgpe2xldCBlPXRoaXMuZ2V0Q2hpbGRyZW4oKTtpZihlLmxlbmd0aD09PTB8fGVlKGVbMF0pJiZlWzBdLmdldFRleHRDb250ZW50KCkudHJpbSgpPT09IiIpe2lmKHRoaXMuZ2V0TmV4dFNpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0TmV4dCgpLHRoaXMucmVtb3ZlKCksITA7aWYodGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSE9PW51bGwpcmV0dXJuIHRoaXMuc2VsZWN0UHJldmlvdXMoKSx0aGlzLnJlbW92ZSgpLCEwfXJldHVybiExfX1mdW5jdGlvbiBUTyh0KXtsZXQgZT1abygpO3JldHVybiB0LnN0eWxlJiYoZS5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pLHQ9cGFyc2VJbnQodC5zdHlsZS50ZXh0SW5kZW50LDEwKS8yMCwwPHQmJmUuc2V0SW5kZW50KHQpKSx7bm9kZTplfX1mdW5jdGlvbiBabygpe3JldHVybiBqdShuZXcgT3MpfWZ1bmN0aW9uIE9FKHQsZSxuLHIpe2xldCBpPXQuX2tleVRvRE9NTWFwO2kuY2xlYXIoKSx0Ll9lZGl0b3JTdGF0ZT1FdigpLHQuX3BlbmRpbmdFZGl0b3JTdGF0ZT1yLHQuX2NvbXBvc2l0aW9uS2V5PW51bGwsdC5fZGlydHlUeXBlPTAsdC5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSx0Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSx0Ll9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCx0Ll91cGRhdGVUYWdzPW5ldyBTZXQsdC5fdXBkYXRlcz1bXSx0Ll9ibG9ja0N1cnNvckVsZW1lbnQ9bnVsbCxyPXQuX29ic2VydmVyLHIhPT1udWxsJiYoci5kaXNjb25uZWN0KCksdC5fb2JzZXJ2ZXI9bnVsbCksZSE9PW51bGwmJihlLnRleHRDb250ZW50PSIiKSxuIT09bnVsbCYmKG4udGV4dENvbnRlbnQ9IiIsaS5zZXQoInJvb3QiLG4pKX1mdW5jdGlvbiBOTyh0KXtsZXQgZT1uZXcgTWFwLG49bmV3IFNldDtyZXR1cm4gdC5mb3JFYWNoKHI9PntpZihyPXIua2xhc3MuaW1wb3J0RE9NIT1udWxsP3Iua2xhc3MuaW1wb3J0RE9NLmJpbmQoci5rbGFzcyk6bnVsbCxyIT1udWxsJiYhbi5oYXMocikpe24uYWRkKHIpO3ZhciBpPXIoKTtpIT09bnVsbCYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChvPT57bGV0IGw9ZS5nZXQobyk7bD09PXZvaWQgMCYmKGw9W10sZS5zZXQobyxsKSksbC5wdXNoKGlbb10pfSl9fSksZX1jbGFzcyBST3tjb25zdHJ1Y3RvcihlLG4scixpLG8sbCxzKXt0aGlzLl9wYXJlbnRFZGl0b3I9bix0aGlzLl9yb290RWxlbWVudD1udWxsLHRoaXMuX2VkaXRvclN0YXRlPWUsdGhpcy5fY29tcG9zaXRpb25LZXk9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsdGhpcy5fZGVmZXJyZWQ9W10sdGhpcy5fa2V5VG9ET01NYXA9bmV3IE1hcCx0aGlzLl91cGRhdGVzPVtdLHRoaXMuX3VwZGF0aW5nPSExLHRoaXMuX2xpc3RlbmVycz17ZGVjb3JhdG9yOm5ldyBTZXQsZWRpdGFibGU6bmV3IFNldCxtdXRhdGlvbjpuZXcgTWFwLHJvb3Q6bmV3IFNldCx0ZXh0Y29udGVudDpuZXcgU2V0LHVwZGF0ZTpuZXcgU2V0fSx0aGlzLl9jb21tYW5kcz1uZXcgTWFwLHRoaXMuX2NvbmZpZz1pLHRoaXMuX25vZGVzPXIsdGhpcy5fZGVjb3JhdG9ycz17fSx0aGlzLl9wZW5kaW5nRGVjb3JhdG9ycz1udWxsLHRoaXMuX2RpcnR5VHlwZT0wLHRoaXMuX2Nsb25lTm90TmVlZGVkPW5ldyBTZXQsdGhpcy5fZGlydHlMZWF2ZXM9bmV3IFNldCx0aGlzLl9kaXJ0eUVsZW1lbnRzPW5ldyBNYXAsdGhpcy5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsdGhpcy5fdXBkYXRlVGFncz1uZXcgU2V0LHRoaXMuX29ic2VydmVyPW51bGwsdGhpcy5fa2V5PWlFKCksdGhpcy5fb25FcnJvcj1vLHRoaXMuX2h0bWxDb252ZXJzaW9ucz1sLHRoaXMuX2VkaXRhYmxlPXMsdGhpcy5faGVhZGxlc3M9biE9PW51bGwmJm4uX2hlYWRsZXNzLHRoaXMuX2Jsb2NrQ3Vyc29yRWxlbWVudD10aGlzLl93aW5kb3c9bnVsbH1pc0NvbXBvc2luZygpe3JldHVybiB0aGlzLl9jb21wb3NpdGlvbktleSE9bnVsbH1yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKGUpe2xldCBuPXRoaXMuX2xpc3RlbmVycy51cGRhdGU7cmV0dXJuIG4uYWRkKGUpLCgpPT57bi5kZWxldGUoZSl9fXJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcihlKXtsZXQgbj10aGlzLl9saXN0ZW5lcnMuZWRpdGFibGU7cmV0dXJuIG4uYWRkKGUpLCgpPT57bi5kZWxldGUoZSl9fXJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoZSl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmRlY29yYXRvcjtyZXR1cm4gbi5hZGQoZSksKCk9PntuLmRlbGV0ZShlKX19cmVnaXN0ZXJUZXh0Q29udGVudExpc3RlbmVyKGUpe2xldCBuPXRoaXMuX2xpc3RlbmVycy50ZXh0Y29udGVudDtyZXR1cm4gbi5hZGQoZSksKCk9PntuLmRlbGV0ZShlKX19cmVnaXN0ZXJSb290TGlzdGVuZXIoZSl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnJvb3Q7cmV0dXJuIGUodGhpcy5fcm9vdEVsZW1lbnQsbnVsbCksbi5hZGQoZSksKCk9PntlKG51bGwsdGhpcy5fcm9vdEVsZW1lbnQpLG4uZGVsZXRlKGUpfX1yZWdpc3RlckNvbW1hbmQoZSxuLHIpe3I9PT12b2lkIDAmJkcoMzUpO2xldCBpPXRoaXMuX2NvbW1hbmRzO2kuaGFzKGUpfHxpLnNldChlLFtuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0LG5ldyBTZXRdKTtsZXQgbz1pLmdldChlKTtvPT09dm9pZCAwJiZHKDM2LFN0cmluZyhlKSk7bGV0IGw9b1tyXTtyZXR1cm4gbC5hZGQobiksKCk9PntsLmRlbGV0ZShuKSxvLmV2ZXJ5KHM9PnMuc2l6ZT09PTApJiZpLmRlbGV0ZShlKX19cmVnaXN0ZXJNdXRhdGlvbkxpc3RlbmVyKGUsbil7dGhpcy5fbm9kZXMuZ2V0KGUuZ2V0VHlwZSgpKT09PXZvaWQgMCYmRygzNyxlLm5hbWUpO2xldCByPXRoaXMuX2xpc3RlbmVycy5tdXRhdGlvbjtyZXR1cm4gci5zZXQobixlKSwoKT0+e3IuZGVsZXRlKG4pfX1yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKGUsbil7dmFyIHI9ZS5nZXRUeXBlKCk7cmV0dXJuIHI9dGhpcy5fbm9kZXMuZ2V0KHIpLHI9PT12b2lkIDAmJkcoMzcsZS5uYW1lKSxyLnRyYW5zZm9ybXMuYWRkKG4pLHJ9cmVnaXN0ZXJOb2RlVHJhbnNmb3JtKGUsbil7dmFyIHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKGUsbik7bGV0IGk9W3JdO3JldHVybiByPXIucmVwbGFjZVdpdGhLbGFzcyxyIT1udWxsJiYocj10aGlzLnJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3MocixuKSxpLnB1c2gocikpLGlPKHRoaXMsZS5nZXRUeXBlKCkpLCgpPT57aS5mb3JFYWNoKG89Pm8udHJhbnNmb3Jtcy5kZWxldGUobikpfX1oYXNOb2RlKGUpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXMoZS5nZXRUeXBlKCkpfWhhc05vZGVzKGUpe3JldHVybiBlLmV2ZXJ5KHRoaXMuaGFzTm9kZS5iaW5kKHRoaXMpKX1kaXNwYXRjaENvbW1hbmQoZSxuKXtyZXR1cm4gSih0aGlzLGUsbil9Z2V0RGVjb3JhdG9ycygpe3JldHVybiB0aGlzLl9kZWNvcmF0b3JzfWdldFJvb3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50fWdldEtleSgpe3JldHVybiB0aGlzLl9rZXl9c2V0Um9vdEVsZW1lbnQoZSl7bGV0IG49dGhpcy5fcm9vdEVsZW1lbnQ7aWYoZSE9PW4pe2xldCBsPWJhKHRoaXMuX2NvbmZpZy50aGVtZSwicm9vdCIpO3ZhciByPXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZXx8dGhpcy5fZWRpdG9yU3RhdGU7aWYodGhpcy5fcm9vdEVsZW1lbnQ9ZSxPRSh0aGlzLG4sZSxyKSxuIT09bnVsbCl7aWYoIXRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzKXskYSE9PTAmJigkYS0tLCRhPT09MCYmbi5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsU0UpKTt2YXIgaT1uLl9fbGV4aWNhbEVkaXRvcjtpZihpIT1udWxsKXtpZihpLl9wYXJlbnRFZGl0b3IhPT1udWxsKXt2YXIgbz1ndihpKTtvPW9bby5sZW5ndGgtMV0uX2tleSxZbC5nZXQobyk9PT1pJiZZbC5kZWxldGUobyl9ZWxzZSBZbC5kZWxldGUoaS5fa2V5KTtuLl9fbGV4aWNhbEVkaXRvcj1udWxsfWZvcihpPXdFKG4pLG89MDtvPGkubGVuZ3RoO28rKylpW29dKCk7bi5fX2xleGljYWxFdmVudEhhbmRsZXM9W119bCE9bnVsbCYmbi5jbGFzc0xpc3QucmVtb3ZlKC4uLmwpfWUhPT1udWxsPyhyPShyPWUub3duZXJEb2N1bWVudCkmJnIuZGVmYXVsdFZpZXd8fG51bGwsaT1lLnN0eWxlLGkudXNlclNlbGVjdD0idGV4dCIsaS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsaS53b3JkQnJlYWs9ImJyZWFrLXdvcmQiLGUuc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZWRpdG9yIiwidHJ1ZSIpLHRoaXMuX3dpbmRvdz1yLHRoaXMuX2RpcnR5VHlwZT0yLFhTKHRoaXMpLHRoaXMuX3VwZGF0ZVRhZ3MuYWRkKCJoaXN0b3J5LW1lcmdlIiksam8odGhpcyksdGhpcy5fY29uZmlnLmRpc2FibGVFdmVudHN8fG1PKGUsdGhpcyksbCE9bnVsbCYmZS5jbGFzc0xpc3QuYWRkKC4uLmwpKToodGhpcy5fZWRpdG9yU3RhdGU9cix0aGlzLl93aW5kb3c9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwpLE5hKCJyb290Iix0aGlzLCExLGUsbil9fWdldEVsZW1lbnRCeUtleShlKXtyZXR1cm4gdGhpcy5fa2V5VG9ET01NYXAuZ2V0KGUpfHxudWxsfWdldEVkaXRvclN0YXRlKCl7cmV0dXJuIHRoaXMuX2VkaXRvclN0YXRlfXNldEVkaXRvclN0YXRlKGUsbil7ZS5pc0VtcHR5KCkmJkcoMzgpLFlTKHRoaXMpO2xldCByPXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZSxpPXRoaXMuX3VwZGF0ZVRhZ3M7bj1uIT09dm9pZCAwP24udGFnOm51bGwscj09PW51bGx8fHIuaXNFbXB0eSgpfHwobiE9bnVsbCYmaS5hZGQobiksam8odGhpcykpLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1lLHRoaXMuX2RpcnR5VHlwZT0yLHRoaXMuX2RpcnR5RWxlbWVudHMuc2V0KCJyb290IiwhMSksdGhpcy5fY29tcG9zaXRpb25LZXk9bnVsbCxuIT1udWxsJiZpLmFkZChuKSxqbyh0aGlzKX1wYXJzZUVkaXRvclN0YXRlKGUsbil7ZT10eXBlb2YgZT09InN0cmluZyI/SlNPTi5wYXJzZShlKTplO2xldCByPUV2KCksaT1qdCxvPU9uLGw9enQscz10aGlzLl9kaXJ0eUVsZW1lbnRzLGE9dGhpcy5fZGlydHlMZWF2ZXMsdT10aGlzLl9jbG9uZU5vdE5lZWRlZCxjPXRoaXMuX2RpcnR5VHlwZTt0aGlzLl9kaXJ0eUVsZW1lbnRzPW5ldyBNYXAsdGhpcy5fZGlydHlMZWF2ZXM9bmV3IFNldCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5VHlwZT0wLGp0PXIsT249ITEsenQ9dGhpczt0cnl7U3YoZS5yb290LHRoaXMuX25vZGVzKSxuJiZuKCksci5fcmVhZE9ubHk9ITB9Y2F0Y2goZCl7ZCBpbnN0YW5jZW9mIEVycm9yJiZ0aGlzLl9vbkVycm9yKGQpfWZpbmFsbHl7dGhpcy5fZGlydHlFbGVtZW50cz1zLHRoaXMuX2RpcnR5TGVhdmVzPWEsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9dSx0aGlzLl9kaXJ0eVR5cGU9YyxqdD1pLE9uPW8senQ9bH1yZXR1cm4gcn11cGRhdGUoZSxuKXtXbih0aGlzLGUsbil9Zm9jdXMoZSxuPXt9KXtsZXQgcj10aGlzLl9yb290RWxlbWVudDtyIT09bnVsbCYmKHIuc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsIm9mZiIpLFduKHRoaXMsKCk9PntsZXQgaT1ydCgpLG89WXIoKTtpIT09bnVsbD9pLmRpcnR5PSEwOm8uZ2V0Q2hpbGRyZW5TaXplKCkhPT0wJiYobi5kZWZhdWx0U2VsZWN0aW9uPT09InJvb3RTdGFydCI/by5zZWxlY3RTdGFydCgpOm8uc2VsZWN0RW5kKCkpfSx7b25VcGRhdGU6KCk9PntyLnJlbW92ZUF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiKSxlJiZlKCl9LHRhZzoiZm9jdXMifSksdGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPT09bnVsbCYmci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIikpfWJsdXIoKXt2YXIgZT10aGlzLl9yb290RWxlbWVudDtlIT09bnVsbCYmZS5ibHVyKCksZT1Ycih0aGlzLl93aW5kb3cpLGUhPT1udWxsJiZlLnJlbW92ZUFsbFJhbmdlcygpfWlzRWRpdGFibGUoKXtyZXR1cm4gdGhpcy5fZWRpdGFibGV9c2V0RWRpdGFibGUoZSl7dGhpcy5fZWRpdGFibGUhPT1lJiYodGhpcy5fZWRpdGFibGU9ZSxOYSgiZWRpdGFibGUiLHRoaXMsITAsZSkpfXRvSlNPTigpe3JldHVybntlZGl0b3JTdGF0ZTp0aGlzLl9lZGl0b3JTdGF0ZS50b0pTT04oKX19fWNsYXNzIEN2IGV4dGVuZHMgdWx7Y29uc3RydWN0b3IoZSxuKXtzdXBlcihuKSx0aGlzLl9fY29sU3Bhbj1lLHRoaXMuX19yb3dTcGFuPTF9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY29sU3Bhbjp0aGlzLl9fY29sU3Bhbixyb3dTcGFuOnRoaXMuX19yb3dTcGFufX1nZXRDb2xTcGFuKCl7cmV0dXJuIHRoaXMuX19jb2xTcGFufXNldENvbFNwYW4oZSl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2NvbFNwYW49ZSx0aGlzfWdldFJvd1NwYW4oKXtyZXR1cm4gdGhpcy5fX3Jvd1NwYW59c2V0Um93U3BhbihlKXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fcm93U3Bhbj1lLHRoaXN9fWZ1bmN0aW9uIFFuKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQ3Z9Y2xhc3MgUEUgZXh0ZW5kcyB1bHt9ZnVuY3Rpb24ga3YodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQRX1jbGFzcyBBRSBleHRlbmRzIHVse31mdW5jdGlvbiB1dSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFFfWouJGFkZFVwZGF0ZVRhZz1mdW5jdGlvbih0KXtobigpLHB0KCkuX3VwZGF0ZVRhZ3MuYWRkKHQpfTtqLiRhcHBseU5vZGVSZXBsYWNlbWVudD1qdTtqLiRjb3B5Tm9kZT1zRTtqLiRjcmVhdGVMaW5lQnJlYWtOb2RlPWNzO2ouJGNyZWF0ZU5vZGVTZWxlY3Rpb249a2c7ai4kY3JlYXRlUGFyYWdyYXBoTm9kZT1abztqLiRjcmVhdGVSYW5nZVNlbGVjdGlvbj1mdW5jdGlvbigpe2xldCB0PW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpLGU9bmV3IFZyKCJyb290IiwwLCJlbGVtZW50Iik7cmV0dXJuIG5ldyBhbCh0LGUsMCwiIil9O2ouJGNyZWF0ZVRhYk5vZGU9UmY7ai4kY3JlYXRlVGV4dE5vZGU9THQ7ai4kZ2V0QWRqYWNlbnROb2RlPWNnO2ouJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGU9RHU7ai4kZ2V0TmVhcmVzdFJvb3RPclNoYWRvd1Jvb3Q9bEU7ai4kZ2V0Tm9kZUJ5S2V5PUR0O2ouJGdldFByZXZpb3VzU2VsZWN0aW9uPVRzO2ouJGdldFJvb3Q9WXI7ai4kZ2V0U2VsZWN0aW9uPXJ0O2ouJGdldFRleHRDb250ZW50PWZ1bmN0aW9uKCl7bGV0IHQ9cnQoKTtyZXR1cm4gdD09PW51bGw/IiI6dC5nZXRUZXh0Q29udGVudCgpfTtqLiRoYXNBbmNlc3Rvcj1PZDtqLiRoYXNVcGRhdGVUYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHB0KCkuX3VwZGF0ZVRhZ3MuaGFzKHQpfTtqLiRpbnNlcnROb2Rlcz1mdW5jdGlvbih0LGUpe2xldCBuPXJ0KCl8fFRzKCk7cmV0dXJuIG49PT1udWxsJiYobj1ZcigpLnNlbGVjdEVuZCgpKSxuLmluc2VydE5vZGVzKHQsZSl9O2ouJGlzQmxvY2tFbGVtZW50Tm9kZT1DZztqLiRpc0RlY29yYXRvck5vZGU9dHQ7ai4kaXNFbGVtZW50Tm9kZT1VO2ouJGlzSW5saW5lRWxlbWVudE9yRGVjb3JhdG9yTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gVSh0KSYmdC5pc0lubGluZSgpfHx0dCh0KSYmdC5pc0lubGluZSgpfTtqLiRpc0xlYWZOb2RlPXFTO2ouJGlzTGluZUJyZWFrTm9kZT1zdTtqLiRpc05vZGVTZWxlY3Rpb249JHM7ai4kaXNQYXJhZ3JhcGhOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgT3N9O2ouJGlzUmFuZ2VTZWxlY3Rpb249dmU7ai4kaXNSb290Tm9kZT1nbjtqLiRpc1Jvb3RPclNoYWRvd1Jvb3Q9dnI7ai4kaXNUYWJOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgYnN9O2ouJGlzVGV4dE5vZGU9ZWU7ai4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24odCl7dmFyIGU9UXIoKTtsZXQgbj1lLl9yZWFkT25seSxyPXQuZ2V0VHlwZSgpO2U9ZS5fbm9kZU1hcDtsZXQgaT1bXTtmb3IobGV0WyxvXW9mIGUpbyBpbnN0YW5jZW9mIHQmJm8uX190eXBlPT09ciYmKG58fG8uaXNBdHRhY2hlZCgpKSYmaS5wdXNoKG8pO3JldHVybiBpfTtqLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1mdjtqLiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBTdih0LHB0KCkuX25vZGVzKX07ai4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIHQ9WXIoKTt0PXQuc2VsZWN0KDAsdC5nZXRDaGlsZHJlblNpemUoKSksV3IoZnYodCkpfTtqLiRzZXRDb21wb3NpdGlvbktleT1LdDtqLiRzZXRTZWxlY3Rpb249V3I7ai4kc3BsaXROb2RlPWFFO2ouQkxVUl9DT01NQU5EPUtTO2ouQ0FOX1JFRE9fQ09NTUFORD17fTtqLkNBTl9VTkRPX0NPTU1BTkQ9e307ai5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtqLkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtqLkNMSUNLX0NPTU1BTkQ9VFM7ai5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7ai5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO2ouQ09NTUFORF9QUklPUklUWV9ISUdIPTM7ai5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO2ouQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtqLkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1HbDtqLkNPUFlfQ09NTUFORD1zdjtqLkNVVF9DT01NQU5EPWF2O2ouREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPXR1O2ouREVMRVRFX0xJTkVfQ09NTUFORD1ydTtqLkRFTEVURV9XT1JEX0NPTU1BTkQ9bnU7ai5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1iRTtqLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgdD1uZXcgVnIoInJvb3QiLDAsImVsZW1lbnQiKSxlPW5ldyBWcigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgUGYoInJvb3QiLHQsZSl9O2ouREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1FZztqLkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PSRFO2ouREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9UW47ai5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPWt2O2ouREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT11dTtqLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj1fdjtqLkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPUN2O2ouREVQUkVDQVRFRF9HcmlkTm9kZT1QRTtqLkRFUFJFQ0FURURfR3JpZFJvd05vZGU9QUU7ai5EUkFHRU5EX0NPTU1BTkQ9VlM7ai5EUkFHT1ZFUl9DT01NQU5EPVdTO2ouRFJBR1NUQVJUX0NPTU1BTkQ9VVM7ai5EUk9QX0NPTU1BTkQ9QlM7ai5EZWNvcmF0b3JOb2RlPU5FO2ouRWxlbWVudE5vZGU9dWw7ai5GT0NVU19DT01NQU5EPUhTO2ouRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtqLkZPUk1BVF9URVhUX0NPTU1BTkQ9VWk7ai5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O2ouSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1rYTtqLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1vZztqLklOU0VSVF9UQUJfQ09NTUFORD17fTtqLktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9TFM7ai5LRVlfQVJST1dfTEVGVF9DT01NQU5EPVBTO2ouS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9UlM7ai5LRVlfQVJST1dfVVBfQ09NTUFORD1NUztqLktFWV9CQUNLU1BBQ0VfQ09NTUFORD1EUztqLktFWV9ERUxFVEVfQ09NTUFORD16UztqLktFWV9ET1dOX0NPTU1BTkQ9TlM7ai5LRVlfRU5URVJfQ09NTUFORD1rZDtqLktFWV9FU0NBUEVfQ09NTUFORD1qUztqLktFWV9NT0RJRklFUl9DT01NQU5EPVpTO2ouS0VZX1NQQUNFX0NPTU1BTkQ9SVM7ai5LRVlfVEFCX0NPTU1BTkQ9RlM7ai5MaW5lQnJlYWtOb2RlPWtzO2ouTU9WRV9UT19FTkQ9T1M7ai5NT1ZFX1RPX1NUQVJUPUFTO2ouT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307ai5QQVNURV9DT01NQU5EPWl2O2ouUGFyYWdyYXBoTm9kZT1PcztqLlJFRE9fQ09NTUFORD1sdjtqLlJFTU9WRV9URVhUX0NPTU1BTkQ9bGc7ai5Sb290Tm9kZT1ScztqLlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1FZjtqLlNFTEVDVF9BTExfQ09NTUFORD1zZztqLlRhYk5vZGU9YnM7ai5UZXh0Tm9kZT1zbDtqLlVORE9fQ09NTUFORD1vdjtqLmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07ai5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24odCl7dmFyIGU9dHx8e30sbj16dCxyPWUudGhlbWV8fHt9O2xldCBpPXQ9PT12b2lkIDA/bjplLnBhcmVudEVkaXRvcnx8bnVsbCxvPWUuZGlzYWJsZUV2ZW50c3x8ITEsbD1FdigpLHM9ZS5uYW1lc3BhY2V8fChpIT09bnVsbD9pLl9jb25maWcubmFtZXNwYWNlOmlFKCkpLGE9ZS5lZGl0b3JTdGF0ZSx1PVtScyxzbCxrcyxicyxPcywuLi5lLm5vZGVzfHxbXV0sYz1lLm9uRXJyb3I7aWYoZT1lLmVkaXRhYmxlIT09dm9pZCAwP2UuZWRpdGFibGU6ITAsdD09PXZvaWQgMCYmbiE9PW51bGwpdD1uLl9ub2RlcztlbHNlIGZvcih0PW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IG09Zi5nZXRUeXBlKCksZz1mLnRyYW5zZm9ybSgpLHc9bmV3IFNldDtnIT09bnVsbCYmdy5hZGQoZyksdC5zZXQobSx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6d30pfXJldHVybiByPW5ldyBSTyhsLGksdCx7ZGlzYWJsZUV2ZW50czpvLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsTk8odCksZSksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtqLmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1wdjtqLmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFRmKHQpJiZ0LnRhZ05hbWU9PT0iQSJ9O2ouaXNIVE1MRWxlbWVudD1UZjtqLmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PWh2O2ouaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9SXU7Y29uc3QgT089ajt2YXIgX2U9T08sJHQ9e30sVXQ9e30sYWU9X2U7bGV0IElkPW5ldyBNYXA7ZnVuY3Rpb24gbHgodCl7Zm9yKDt0IT1udWxsOyl7aWYodC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiB0O3Q9dC5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIHN4KHQpe2xldCBlPXQucGFyZW50Tm9kZTtpZihlPT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW2UsQXJyYXkuZnJvbShlLmNoaWxkTm9kZXMpLmluZGV4T2YodCldfWZ1bmN0aW9uIE1FKHQpe2xldCBlPXt9O3Q9dC5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiB0KWlmKG4hPT0iIil7bGV0W3IsaV09bi5zcGxpdCgvOihbXl0rKS8pO2Vbci50cmltKCldPWkudHJpbSgpfXJldHVybiBlfWZ1bmN0aW9uIERkKHQpe2xldCBlPUlkLmdldCh0KTtyZXR1cm4gZT09PXZvaWQgMCYmKGU9TUUodCksSWQuc2V0KHQsZSkpLGV9ZnVuY3Rpb24gUE8odCl7bGV0IGU9IiI7Zm9yKGxldCBuIGluIHQpbiYmKGUrPWAke259OiAke3Rbbl19O2ApO3JldHVybiBlfWZ1bmN0aW9uIG1sKHQsZSl7dmFyIG49RGQoImdldFN0eWxlImluIHQ/dC5nZXRTdHlsZSgpOnQuc3R5bGUpO2U9T2JqZWN0LmVudHJpZXMoZSkucmVkdWNlKChyLFtpLG9dKT0+KG89PT1udWxsP2RlbGV0ZSByW2ldOnJbaV09byxyKSx7Li4ubn0pLG49UE8oZSksdC5zZXRTdHlsZShuKSxJZC5zZXQobixlKX1mdW5jdGlvbiBMRSh0LGUpe3ZhciBuPXQuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKGFlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KSl7Zm9yKHZhciBpPWFlLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLG89aS5hbmNob3IsbD1pLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO2FlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoby5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksTEUoYWUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKGkpLGUpKX1hZS4kc2V0U2VsZWN0aW9uKHQpfWVsc2UgaWYoLS1yLGk9blswXSxvPW5bcl0sdC5pc0NvbGxhcHNlZCgpKW1sKHQsZSk7ZWxzZXt2YXIgdT10LmFuY2hvcixjPXQuZm9jdXM7cz1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsdD1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsbT1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LGFlLiRpc1RleHROb2RlKGkpJiZsPT09cyYmKGM9aS5nZXROZXh0U2libGluZygpLGFlLiRpc1RleHROb2RlKGMpJiYobD1kPTAsaT1jKSksbi5sZW5ndGg9PT0xKWFlLiRpc1RleHROb2RlKGkpJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCx0PW09PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT10JiYobD09PTAmJnQ9PT1zPyhtbChpLGUpLGkuc2VsZWN0KGwsdCkpOihuPWkuc3BsaXRUZXh0KGwsdCksbj1sPT09MD9uWzBdOm5bMV0sbWwobixlKSxuLnNlbGVjdCgwLHQtbCkpKSk7ZWxzZSBmb3IoYWUuJGlzVGV4dE5vZGUoaSkmJmw8aS5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYoaT1pLnNwbGl0VGV4dChsKVsxXSksbWwoaSxlKSksYWUuJGlzVGV4dE5vZGUobykmJihsPW8uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsby5fX2tleSE9PXUmJnQhPT0wJiYodD1sKSx0IT09bCYmKFtvXT1vLnNwbGl0VGV4dCh0KSksdCE9PTAmJm1sKG8sZSkpLHQ9MTt0PHI7dCsrKWw9blt0XSxzPWwuZ2V0S2V5KCksYWUuJGlzVGV4dE5vZGUobCkmJnMhPT1pLmdldEtleSgpJiZzIT09by5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZtbChsLGUpfX1mdW5jdGlvbiBBTyh0KXtmb3IoO3QhPT1udWxsJiYhYWUuJGlzUm9vdE9yU2hhZG93Um9vdCh0KTspe2xldCBlPXQuZ2V0TGF0ZXN0KCksbj10LmdldFBhcmVudCgpO2UuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ0LnJlbW92ZSghMCksdD1ufX1mdW5jdGlvbiBqaCh0LGUsbixyLGk9bnVsbCl7aWYoZS5sZW5ndGghPT0wKXt2YXIgbz1lWzBdLGw9bmV3IE1hcCxzPVtdO289YWUuJGlzRWxlbWVudE5vZGUobyk/bzpvLmdldFBhcmVudE9yVGhyb3coKSxvLmlzSW5saW5lKCkmJihvPW8uZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7byE9PW51bGw7KXt2YXIgdT1vLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtvPXUsYT0hMDticmVha31pZihvPW8uZ2V0UGFyZW50T3JUaHJvdygpLGFlLiRpc1Jvb3RPclNoYWRvd1Jvb3QobykpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPWVbY107YWUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD1lW2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJmFlLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IG09cigpO20uc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxtLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2gobSksbC5zZXQoZCxtKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChnPT57bS5hcHBlbmQoZyksZi5hZGQoZy5nZXRLZXkoKSksYWUuJGlzRWxlbWVudE5vZGUoZykmJmcuZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaCh3PT5mLmFkZCh3KSl9KSxBTyhoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihpIT09bnVsbClmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKWkuYXBwZW5kKHNbZV0pO2lmKGU9bnVsbCxhZS4kaXNSb290T3JTaGFkb3dSb290KG8pKWlmKGEpaWYoaSE9PW51bGwpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pby5pbnNlcnRBZnRlcihzW2ldKTtlbHNlIGlmKGE9by5nZXRGaXJzdENoaWxkKCksYWUuJGlzRWxlbWVudE5vZGUoYSkmJihvPWEpLGE9PT1udWxsKWlmKGkpby5hcHBlbmQoaSk7ZWxzZSBmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKWE9c1tpXSxvLmFwcGVuZChhKSxlPWE7ZWxzZSBpZihpIT09bnVsbClhLmluc2VydEJlZm9yZShpKTtlbHNlIGZvcihvPTA7bzxzLmxlbmd0aDtvKyspaT1zW29dLGEuaW5zZXJ0QmVmb3JlKGkpLGU9aTtlbHNlIGlmKGkpby5pbnNlcnRBZnRlcihpKTtlbHNlIGZvcihpPXMubGVuZ3RoLTE7MDw9aTtpLS0pYT1zW2ldLG8uaW5zZXJ0QWZ0ZXIoYSksZT1hO3M9YWUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksYWUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9hZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6ZSE9PW51bGw/ZS5zZWxlY3RFbmQoKTp0LmRpcnR5PSEwfX1mdW5jdGlvbiBJRSh0LGUsbixyKXt0Lm1vZGlmeShlPyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIERFKHQpe3JldHVybiB0PXQuYW5jaG9yLmdldE5vZGUoKSwoYWUuJGlzUm9vdE5vZGUodCk/dDp0LmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1VdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKHQpe3Q9dC5nZXRTdHlsZSgpO2xldCBlPU1FKHQpO0lkLnNldCh0LGUpfTtVdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbih0KXtsZXQgZT10LmNvbnN0cnVjdG9yLmNsb25lKHQpO3JldHVybiBlLl9fcGFyZW50PXQuX19wYXJlbnQsZS5fX25leHQ9dC5fX25leHQsZS5fX3ByZXY9dC5fX3ByZXYsYWUuJGlzRWxlbWVudE5vZGUodCkmJmFlLiRpc0VsZW1lbnROb2RlKGUpPyhlLl9fZmlyc3Q9dC5fX2ZpcnN0LGUuX19sYXN0PXQuX19sYXN0LGUuX19zaXplPXQuX19zaXplLGUuX19mb3JtYXQ9dC5fX2Zvcm1hdCxlLl9faW5kZW50PXQuX19pbmRlbnQsZS5fX2Rpcj10Ll9fZGlyLGUpOihhZS4kaXNUZXh0Tm9kZSh0KSYmYWUuJGlzVGV4dE5vZGUoZSkmJihlLl9fZm9ybWF0PXQuX19mb3JtYXQsZS5fX3N0eWxlPXQuX19zdHlsZSxlLl9fbW9kZT10Ll9fbW9kZSxlLl9fZGV0YWlsPXQuX19kZXRhaWwpLGUpfTtVdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuPSIiKXtsZXQgcj1udWxsLGk9dC5nZXROb2RlcygpO3ZhciBvPXQuYW5jaG9yLGw9dC5mb2N1cyxzPXQuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6by5vZmZzZXQ7aWYobz1zP2wuZ2V0Tm9kZSgpOm8uZ2V0Tm9kZSgpLHQuc3R5bGUhPT0iIiYmKHQ9RGQodC5zdHlsZSksdCE9PW51bGwmJmUgaW4gdCkpcmV0dXJuIHRbZV07Zm9yKHQ9MDt0PGkubGVuZ3RoO3QrKyl7dmFyIHU9aVt0XTtpZigodD09PTB8fGEhPT0wfHwhdS5pcyhvKSkmJmFlLiRpc1RleHROb2RlKHUpKXtpZihsPWUscz1uLHU9dS5nZXRTdHlsZSgpLHU9RGQodSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1V0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT09InRleHQiP3Qub2Zmc2V0PT09dC5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6dC5vZmZzZXQ9PT10LmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07VXQuJGlzUGFyZW50RWxlbWVudFJUTD1ERTtVdC4kbW92ZUNhcmV0U2VsZWN0aW9uPUlFO1V0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1ERSh0KTtJRSh0LGUsbj8hcjpyLCJjaGFyYWN0ZXIiKX07VXQuJHBhdGNoU3R5bGVUZXh0PUxFO1V0LiRzZWxlY3RBbGw9ZnVuY3Rpb24odCl7bGV0IGU9dC5hbmNob3I7dD10LmZvY3VzO3ZhciBuPWUuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgaT0iZWxlbWVudCIsbz0iZWxlbWVudCIsbD0wO2FlLiRpc1RleHROb2RlKHIpP2k9InRleHQiOmFlLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLGFlLiRpc1RleHROb2RlKG4pPyhvPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOmFlLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJihlLnNldChyLmdldEtleSgpLDAsaSksdC5zZXQobi5nZXRLZXkoKSxsLG8pKX07VXQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24odCxlKXtpZih0LmFuY2hvci5rZXk9PT0icm9vdCIpe2U9ZSgpO3ZhciBuPWFlLiRnZXRSb290KCk7KHQ9bi5nZXRGaXJzdENoaWxkKCkpP3QucmVwbGFjZShlLCEwKTpuLmFwcGVuZChlKX1lbHNlIGZvcihuPXQuZ2V0Tm9kZXMoKSx0PXQuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKHQpPT09LTEmJm4ucHVzaCh0KSx0LmlzSW5saW5lKCkmJih0PXQuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZih0KT09PS0xJiZuLnB1c2godCkpLHQ9MDt0PG4ubGVuZ3RoO3QrKyl7bGV0IG89blt0XTt2YXIgcj1vO2lmKCFhZS4kaXNFbGVtZW50Tm9kZShyKXx8YWUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIGk9ci5nZXRGaXJzdENoaWxkKCk7aT1pPT09bnVsbHx8YWUuJGlzTGluZUJyZWFrTm9kZShpKXx8YWUuJGlzVGV4dE5vZGUoaSl8fGkuaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJml9ciYmKHI9ZSgpLHIuc2V0Rm9ybWF0KG8uZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChvLmdldEluZGVudCgpKSxvLnJlcGxhY2UociwhMCkpfX07VXQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0PWFlLiRnZXRBZGphY2VudE5vZGUodC5mb2N1cyxlKSxhZS4kaXNEZWNvcmF0b3JOb2RlKHQpJiYhdC5pc0lzb2xhdGVkKCl8fGFlLiRpc0VsZW1lbnROb2RlKHQpJiYhdC5pc0lubGluZSgpJiYhdC5jYW5CZUVtcHR5KCl9O1V0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKHQsZSl7aWYoZS5pc1NlbGVjdGVkKCkmJiFlLmlzU2VnbWVudGVkKCkmJiFlLmlzVG9rZW4oKSYmKGFlLiRpc1JhbmdlU2VsZWN0aW9uKHQpfHxhZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24odCkpKXt2YXIgbj10LmFuY2hvci5nZXROb2RlKCkscj10LmZvY3VzLmdldE5vZGUoKSxpPWUuaXMobiksbz1lLmlzKHIpO2lmKGl8fG8pe2k9dC5pc0JhY2t3YXJkKCk7bGV0W2wsc109dC5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7dD1uLmlzKHIpLG89ZS5pcyhpP3I6bikscj1lLmlzKGk/bjpyKSxuPTA7bGV0IGE7dD8obj1sPnM/czpsLGE9bD5zP2w6cyk6bz8obj1pP3M6bCxhPXZvaWQgMCk6ciYmKGk9aT9sOnMsbj0wLGE9aSksZS5fX3RleHQ9ZS5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIGV9O1V0LiR3cmFwTm9kZXM9ZnVuY3Rpb24odCxlLG49bnVsbCl7dmFyIHI9dC5nZXROb2RlcygpO2xldCBpPXIubGVuZ3RoO3ZhciBvPXQuYW5jaG9yO2lmKGk9PT0wfHxpPT09MSYmby50eXBlPT09ImVsZW1lbnQiJiZvLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe3Q9by50eXBlPT09InRleHQiP28uZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTpvLmdldE5vZGUoKSxyPXQuZ2V0Q2hpbGRyZW4oKTtsZXQgcz1lKCk7cy5zZXRGb3JtYXQodC5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KHQuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLHQucmVwbGFjZShzKX1lbHNle289bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPGk7cysrKXtsZXQgYT1yW3NdO2FlLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KGpoKHQsbCxsLmxlbmd0aCxlLG4pLGw9W10sbz1hKTpvPT09bnVsbHx8byE9PW51bGwmJmFlLiRoYXNBbmNlc3RvcihhLG8pP2wucHVzaChhKTooamgodCxsLGwubGVuZ3RoLGUsbiksbD1bYV0pfWpoKHQsbCxsLmxlbmd0aCxlLG4pfX07VXQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24odCxlLG4scixpKXtsZXQgbz1lLmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT10LmdldEVsZW1lbnRCeUtleShvKTtpZih0PXQuZ2V0RWxlbWVudEJ5S2V5KGwpLGFlLiRpc1RleHROb2RlKGUpJiYoYT1seChhKSksYWUuJGlzVGV4dE5vZGUocikmJih0PWx4KHQpKSxlPT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8dD09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1zeChhKSksdC5ub2RlTmFtZT09PSJCUiImJihbdCxpXT1zeCh0KSksZT1hLmZpcnN0Q2hpbGQsYT09PXQmJmUhPW51bGwmJmUubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmaT09PTAmJihpPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQodCxpKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1pJiZvPT09bHx8KHMuc2V0U3RhcnQodCxpKSxzLnNldEVuZChhLG4pKSxzfTtVdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTt0PW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSxlPUFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj1lLmxlbmd0aDtlLnNvcnQoKG8sbCk9PntsZXQgcz1vLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/by5sZWZ0LWwubGVmdDpzfSk7bGV0IGk7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGw9ZVtvXSxzPWwud2lkdGgrbj09PXQud2lkdGg7aSYmaS50b3A8PWwudG9wJiZpLnRvcCtpLmhlaWdodD5sLnRvcCYmaS5sZWZ0K2kud2lkdGg+bC5sZWZ0fHxzPyhlLnNwbGljZShvLS0sMSksci0tKTppPWx9cmV0dXJuIGV9O1V0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1EZDtVdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1lLmdldE5vZGUoKTtpZihhZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIGk9ci5nZXREZXNjZW5kYW50QnlJbmRleChlLm9mZnNldCk7aSE9PW51bGwmJihyPWkpfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBvPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKG89PT1udWxsKXtpPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1pLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYoaT1pLmdldFBhcmVudCgpLGk9PT1udWxsKXtvPW51bGw7YnJlYWt9cz1pLmdldFByZXZpb3VzU2libGluZygpfWkhPT1udWxsJiYobD1pLmlzSW5saW5lKCk/MDoyLG89YWUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmYWUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLGk9cy5sZW5ndGgsIWFlLiRpc1RleHROb2RlKHIpfHxuPj1pKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1pK2wscj1vO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPXQuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1hZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBhZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLG89aS1uO2xldCB1PXMuc2xpY2UoMCxvKTtsIT09bnVsbCYmbCE9PXM/KG49YWUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksaT1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKTooaT1hZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKGkpKSxhZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsaS5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9ZS5rZXk9PT1hLHM9ZS5vZmZzZXQsczxuJiYocz1pKSxuPWw/cy1uOjAsaT1sP3M6byxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4saSksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixpKSxuLnJlbW92ZSgpKSk6KG49YWUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IE1PPVV0O3ZhciBsbz1NTyxMTz1sbyxFdD1fZTtmdW5jdGlvbiBJTyh0KXtsZXQgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2UuYXBwZW5kKCJjb2RlIix0KTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWUuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke3R9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHtlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gakUodCxlKXtmb3IobGV0IG4gb2YgZSlpZih0LnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiB6RSh0LGUpe2Zvcig7dCE9PUV0LiRnZXRSb290KCkmJnQhPW51bGw7KXtpZihlKHQpKXJldHVybiB0O3Q9dC5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH0kdC4kc3BsaXROb2RlPUV0LiRzcGxpdE5vZGU7JHQuaXNIVE1MQW5jaG9yRWxlbWVudD1FdC5pc0hUTUxBbmNob3JFbGVtZW50OyR0LmlzSFRNTEVsZW1lbnQ9RXQuaXNIVE1MRWxlbWVudDskdC4kZGZzPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107dD0odHx8RXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksZT1lfHwoRXQuJGlzRWxlbWVudE5vZGUodCk/dC5nZXRMYXN0RGVzY2VuZGFudCgpOnQpO2Zvcih2YXIgcj10LGk9MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KWkrKztmb3Iocj1pO3QhPT1udWxsJiYhdC5pcyhlKTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6dH0pLEV0LiRpc0VsZW1lbnROb2RlKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCkpdD10LmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3IoaT1udWxsO2k9PT1udWxsJiZ0IT09bnVsbDspaT10LmdldE5leHRTaWJsaW5nKCksaT09PW51bGw/KHQ9dC5nZXRQYXJlbnQoKSxyLS0pOnQ9aTtyZXR1cm4gdCE9PW51bGwmJnQuaXMoZSkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOnR9KSxufTskdC4kZmlsdGVyPWZ1bmN0aW9uKHQsZSl7bGV0IG49W107Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2xldCBpPWUodFtyXSk7aSE9PW51bGwmJm4ucHVzaChpKX1yZXR1cm4gbn07JHQuJGZpbmRNYXRjaGluZ1BhcmVudD16RTskdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbih0KXtsZXQgZT16RSh0LG49PkV0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gRXQuJGlzRWxlbWVudE5vZGUoZSl8fElPKDQsdC5fX2tleSksZX07JHQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKHQsZSl7Zm9yKDt0IT1udWxsOyl7aWYodCBpbnN0YW5jZW9mIGUpcmV0dXJuIHQ7dD10LmdldFBhcmVudCgpfXJldHVybiBudWxsfTskdC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24odCxlKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZShlKTp0LmFwcGVuZChlKX07JHQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKHQpe3ZhciBlPUV0LiRnZXRTZWxlY3Rpb24oKXx8RXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoRXQuJGlzUmFuZ2VTZWxlY3Rpb24oZSkpe3Zhcntmb2N1czpufT1lO2lmKGU9bi5nZXROb2RlKCksbj1uLm9mZnNldCxFdC4kaXNSb290T3JTaGFkb3dSb290KGUpKW49ZS5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD9lLmFwcGVuZCh0KTpuLmluc2VydEJlZm9yZSh0KSx0LnNlbGVjdE5leHQoKTtlbHNle2xldCByLGk7RXQuJGlzVGV4dE5vZGUoZSk/KHI9ZS5nZXRQYXJlbnRPclRocm93KCksaT1lLmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYoaSs9MSxlLnNwbGl0VGV4dChuKSkpOihyPWUsaT1uKSxbLGVdPUV0LiRzcGxpdE5vZGUocixpKSxlLmluc2VydEJlZm9yZSh0KSxlLnNlbGVjdFN0YXJ0KCl9fWVsc2UgRXQuJGlzTm9kZVNlbGVjdGlvbihlKXx8RXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpPyhlPWUuZ2V0Tm9kZXMoKSxlW2UubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcih0KSk6RXQuJGdldFJvb3QoKS5hcHBlbmQodCksZT1FdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIoZSksZS5zZWxlY3QoKTtyZXR1cm4gdC5nZXRMYXRlc3QoKX07JHQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbih0LGUpe2xldCBuPW5ldyBNYXAscj10Ll9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtpLG9db2YgZS5fbm9kZU1hcCl7bGV0IGw9TE8uJGNsb25lV2l0aFByb3BlcnRpZXMobyk7RXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1vLl9fdGV4dCksbi5zZXQoaSxsKX1yJiYoci5fbm9kZU1hcD1uKSx0Ll9kaXJ0eVR5cGU9Mix0PWUuX3NlbGVjdGlvbixFdC4kc2V0U2VsZWN0aW9uKHQ9PT1udWxsP251bGw6dC5jbG9uZSgpKX07JHQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZSgpLHQucmVwbGFjZShlKSxlLmFwcGVuZCh0KSxlfTskdC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKHQsLi4uZSl7ZS5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSx0LmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9OyR0LmlzTWltZVR5cGU9akU7JHQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKHQsZSl7bGV0IG49dFtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLGkpPT57bGV0IG89W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKG8pO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZvLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLGpFKGEsZSk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9OyR0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4udCl7cmV0dXJuKCk9Pnt0LmZvckVhY2goZT0+ZSgpKX19OyR0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3Rvci5uYW1lPT09ZS5uYW1lOiExfTskdC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oZSxpPT57ZTp7Zm9yKHZhciBvPWkuZ2V0Q2hpbGRyZW4oKSxsPTA7bDxvLmxlbmd0aDtsKyspaWYob1tsXWluc3RhbmNlb2YgZSl7bz1udWxsO2JyZWFrIGV9Zm9yKG89aTtvIT09bnVsbDspaWYobD1vLG89by5nZXRQYXJlbnQoKSxvIGluc3RhbmNlb2YgZSl7bz17Y2hpbGQ6bCxwYXJlbnQ6b307YnJlYWsgZX1vPW51bGx9aWYobyE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PW87aWYocy5pcyhpKSl7aWYocihhLGkpLGk9cy5nZXROZXh0U2libGluZ3MoKSxvPWkubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksbyE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8bzt1KyspbC5hcHBlbmQoaVt1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07JHQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKHQsLi4uZSl7ZS5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJnQuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IERPPSR0O3ZhciBGdD1ETyxGZT1fZSxzbz1GdDtmdW5jdGlvbiBkcyh0KXtsZXQgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2UuYXBwZW5kKCJjb2RlIix0KTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWUuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke3R9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHtlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gRkUodCl7bGV0IGU9MTtmb3IodD10LmdldFBhcmVudCgpO3QhPW51bGw7KXtpZihmdCh0KSl7aWYodD10LmdldFBhcmVudCgpLFRlKHQpKXtlKyssdD10LmdldFBhcmVudCgpO2NvbnRpbnVlfWRzKDQwKX1icmVha31yZXR1cm4gZX1mdW5jdGlvbiBiZyh0KXt0PXQuZ2V0UGFyZW50KCksVGUodCl8fGRzKDQwKTtsZXQgZT10O2Zvcig7ZSE9PW51bGw7KWU9ZS5nZXRQYXJlbnQoKSxUZShlKSYmKHQ9ZSk7cmV0dXJuIHR9ZnVuY3Rpb24gQkUodCl7bGV0IGU9W107dD10LmdldENoaWxkcmVuKCkuZmlsdGVyKGZ0KTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXSxpPXIuZ2V0Rmlyc3RDaGlsZCgpO1RlKGkpP2U9ZS5jb25jYXQoQkUoaSkpOmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBBcih0KXtyZXR1cm4gZnQodCkmJlRlKHQuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBqTyh0KXtmb3IoO3QuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmdC5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCBlPXQuZ2V0UGFyZW50KCk7aWYoZT09bnVsbHx8IWZ0KHQpJiYhVGUodCkpYnJlYWs7dD1lfXQucmVtb3ZlKCl9ZnVuY3Rpb24gYXgodCl7cmV0dXJuIHpuKCkuYXBwZW5kKHQpfWZ1bmN0aW9uIFVFKHQsZSl7cmV0dXJuIGZ0KHQpJiYoZS5sZW5ndGg9PT0wfHxlLmxlbmd0aD09PTEmJnQuaXMoZVswXSkmJnQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBHbyh0LGUpe3Quc3BsaWNlKHQuZ2V0Q2hpbGRyZW5TaXplKCksMCxlKX1mdW5jdGlvbiB1eCh0LGUpe2lmKFRlKHQpKXJldHVybiB0O2xldCBuPXQuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10LmdldE5leHRTaWJsaW5nKCksaT16bigpO3JldHVybiBpLnNldEZvcm1hdCh0LmdldEZvcm1hdFR5cGUoKSksaS5zZXRJbmRlbnQodC5nZXRJbmRlbnQoKSksR28oaSx0LmdldENoaWxkcmVuKCkpLFRlKG4pJiZlPT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChpKSx0LnJlbW92ZSgpLFRlKHIpJiZlPT09ci5nZXRMaXN0VHlwZSgpJiYoR28obixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOlRlKHIpJiZlPT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKGkpLHQucmVtb3ZlKCkscik6KGU9bW4oZSksZS5hcHBlbmQoaSksdC5yZXBsYWNlKGUpLGNuKGUpLGUpfWZ1bmN0aW9uIFdFKHQsZSl7dmFyIG49dC5nZXRMYXN0Q2hpbGQoKTtsZXQgcj1lLmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZBcihuKSYmQXIocikmJihXRShuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj1lLmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKHQuYXBwZW5kKC4uLm4pLGNuKHQpKSxlLnJlbW92ZSgpfWZ1bmN0aW9uIGNuKHQsZSl7aWYodD1lfHx0LmdldENoaWxkcmVuKCksdCE9PXZvaWQgMClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbz10W2VdO2lmKGZ0KG8pKXtsZXQgbD1vLmdldFZhbHVlKCk7dmFyIG49byxyPW4uZ2V0UGFyZW50KCksaT0xO2ZvcihyIT1udWxsJiYoVGUocik/aT1yLmdldFN0YXJ0KCk6ZHMoNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtmdChzKSYmIVRlKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmaSsrfWwhPT1pJiZvLnNldFZhbHVlKGkpfX19ZnVuY3Rpb24gek8odCl7aWYoIUFyKHQpKXt2YXIgZT10LmdldFBhcmVudCgpLG49ZT9lLmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoVGUocikmJmZ0KG4pJiZUZShlKSl7dmFyIGk9ZT9lLmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsbz1lP2UuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKHQuaXMoaSkpbi5pbnNlcnRCZWZvcmUodCksZS5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZih0LmlzKG8pKW4uaW5zZXJ0QWZ0ZXIodCksZS5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD1lLmdldExpc3RUeXBlKCk7aT16bigpO2xldCBzPW1uKGwpO2kuYXBwZW5kKHMpLHQuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLG89em4oKSxsPW1uKGwpLG8uYXBwZW5kKGwpLEdvKGwsdC5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUoaSksbi5pbnNlcnRBZnRlcihvKSxuLnJlcGxhY2UodCl9Y24oZSksY24ocil9fX1sZXQgTWY9Y2xhc3MgVkUgZXh0ZW5kcyBGZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgVkUoZS5fX3ZhbHVlLGUuX19jaGVja2VkLGUuX19rZXkpfWNvbnN0cnVjdG9yKGUsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9ZT09PXZvaWQgMD8xOmUsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIFRlKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZkeChuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsY3gobixlLnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKGUsbixyKXtsZXQgaT10aGlzLmdldFBhcmVudCgpO3JldHVybiBUZShpKSYmaS5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmZHgobix0aGlzLGUpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLGN4KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIGU9PntsZXQgbj1lLmdldFBhcmVudCgpO1RlKG4pJiYoY24obiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmZS5nZXRDaGVja2VkKCkhPW51bGwmJmUuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOkZPLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49em4oKTtyZXR1cm4gbi5zZXRDaGVja2VkKGUuY2hlY2tlZCksbi5zZXRWYWx1ZShlLnZhbHVlKSxuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLmUpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2lmKEZlLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IGk9ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLmkpLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZShlLG4pe2lmKGZ0KGUpKXJldHVybiBzdXBlci5yZXBsYWNlKGUpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCFUZShyKSlyZXR1cm4gZTtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKGUpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIoZSk7ZWxzZXtsZXQgaT1tbihyLmdldExpc3RUeXBlKCkpLG89dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7bzspe2xldCBsPW87bz1vLmdldE5leHRTaWJsaW5nKCksaS5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcihlKSxlLmluc2VydEFmdGVyKGkpfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChpPT57ZS5hcHBlbmQoaSl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLGV9aW5zZXJ0QWZ0ZXIoZSxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtUZShyKXx8ZHMoMzkpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoZnQoZSkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIoZSxuKSxlPWUuZ2V0UGFyZW50T3JUaHJvdygpLFRlKGUpJiZjbihlKSxuO2lmKFRlKGUpKXtmb3Iocj1lLGU9ZS5nZXRDaGlsZHJlbigpLGk9ZS5sZW5ndGgtMTswPD1pO2ktLSlyPWVbaV0sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIoZSxuKSxpLmxlbmd0aCE9PTApe2xldCBvPW1uKHIuZ2V0TGlzdFR5cGUoKSk7aS5mb3JFYWNoKGw9Pm8uYXBwZW5kKGwpKSxlLmluc2VydEFmdGVyKG8sbil9cmV0dXJuIGV9cmVtb3ZlKGUpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKGUpLG4mJnImJkFyKG4pJiZBcihyKT8oV0Uobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJihlPXIuZ2V0UGFyZW50KCksVGUoZSkmJmNuKGUpKX1pbnNlcnROZXdBZnRlcihlLG49ITApe3JldHVybiBlPXpuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcihlLG4pLGV9Y29sbGFwc2VBdFN0YXJ0KGUpe2xldCBuPUZlLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLGk9ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IG89ZnQoaSk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP28/KHIucmVtb3ZlKCksaS5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj1lLmFuY2hvcixlPWUuZm9jdXMsaT1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KGksci5vZmZzZXQsImVsZW1lbnQiKSxlLnR5cGU9PT0iZWxlbWVudCImJmUuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZlLnNldChpLGUub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9ZX1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD1lfXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgZT10aGlzLmdldFBhcmVudCgpO2lmKGU9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O2U9ZS5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO2Z0KGUpOyllPWUuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmLTE8ZXx8ZHMoMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PWU7KWlmKG48ZSl7ZTp7dmFyIHI9bmV3IFNldDtpZihBcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoQXIoaSkmJkFyKG8pKXtpZihvPW8uZ2V0Rmlyc3RDaGlsZCgpLFRlKG8pKXtvLmFwcGVuZCh0aGlzKTt2YXIgbD1pLmdldEZpcnN0Q2hpbGQoKTtUZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLEdvKG8sbCksaS5yZW1vdmUoKSxyLmFkZChpLmdldEtleSgpKSksY24obyl9fWVsc2UgQXIoaSk/KGk9aS5nZXRGaXJzdENoaWxkKCksVGUoaSkmJihyPWkuZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxjbihpKSkpOkFyKG8pPyhpPW8uZ2V0Rmlyc3RDaGlsZCgpLFRlKGkpJiYoaS5hcHBlbmQodGhpcyksY24oaSkpKTpUZShzKSYmKHI9em4oKSxsPW1uKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksbz9vLmluc2VydEFmdGVyKHIpOmk/aS5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksY24obCkpO1RlKHMpJiZjbihzKX1uKyt9ZWxzZSB6Tyh0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKGUpe2lmKGZ0KGUpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZihUZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtjbihuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKGUpfWNhbkluc2VydEFmdGVyKGUpe3JldHVybiBmdChlKX1jYW5SZXBsYWNlV2l0aChlKXtyZXR1cm4gZnQoZSl9Y2FuTWVyZ2VXaXRoKGUpe3JldHVybiBGZS4kaXNQYXJhZ3JhcGhOb2RlKGUpfHxmdChlKX1leHRyYWN0V2l0aENoaWxkKGUsbil7aWYoIUZlLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO2U9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YoZSkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIG1uKCJidWxsZXQiKX19O2Z1bmN0aW9uIGN4KHQsZSxuKXtsZXQgcj1bXSxpPVtdO3ZhciBvPShlPWUubGlzdCk/ZS5saXN0aXRlbTp2b2lkIDA7aWYoZSYmZS5uZXN0ZWQpdmFyIGw9ZS5uZXN0ZWQubGlzdGl0ZW07aWYobyE9PXZvaWQgMCYmKG89by5zcGxpdCgiICIpLHIucHVzaCguLi5vKSksZSl7bz1uLmdldFBhcmVudCgpLG89VGUobykmJm8uZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7byYmIXN8fGkucHVzaChlLmxpc3RpdGVtVW5jaGVja2VkKSxvJiZzfHxpLnB1c2goZS5saXN0aXRlbUNoZWNrZWQpLG8mJnIucHVzaChzP2UubGlzdGl0ZW1DaGVja2VkOmUubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT5UZShzKSk/ci5wdXNoKC4uLmwpOmkucHVzaCguLi5sKSksMDxpLmxlbmd0aCYmc28ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KHQsLi4uaSksMDxyLmxlbmd0aCYmc28uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudCh0LC4uLnIpfWZ1bmN0aW9uIGR4KHQsZSxuKXtUZShlLmdldEZpcnN0Q2hpbGQoKSk/KHQucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksdC5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKToodC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLHQuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmZS5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8dC5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsZS5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBGTyh0KXtyZXR1cm4gdD1zby5pc0hUTUxFbGVtZW50KHQpJiZ0LmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6em4odCl9fWZ1bmN0aW9uIHpuKHQpe3JldHVybiBGZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IE1mKHZvaWQgMCx0KSl9ZnVuY3Rpb24gZnQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNZn1sZXQgYnY9Y2xhc3MgSEUgZXh0ZW5kcyBGZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBIRShlLl9fbGlzdFR5cGV8fHB4W2UuX190YWddLGUuX19zdGFydCxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPWU9cHhbZV18fGUsdGhpcy5fX3RhZz1lPT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKGUpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9ZSxuLl9fdGFnPWU9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsZngobixlLnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKGUsbixyKXtyZXR1cm4gZS5fX3RhZyE9PXRoaXMuX190YWc/ITA6KGZ4KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOmh4LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOmh4LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49bW4oZS5saXN0VHlwZSxlLnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1leHBvcnRET00oZSl7cmV0dXJue2VsZW1lbnQ6ZX09c3VwZXIuZXhwb3J0RE9NKGUpLGUmJnNvLmlzSFRNTEVsZW1lbnQoZSkmJih0aGlzLl9fc3RhcnQhPT0xJiZlLnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZlLnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDplfX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi5lKXtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtpZihmdChuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgaT16bigpO1RlKG4pfHxGZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49RmUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLGkuYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChpKX19cmV0dXJuIGNuKHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZChlKXtyZXR1cm4gZnQoZSl9fTtmdW5jdGlvbiBmeCh0LGUsbil7bGV0IHI9W10saT1bXTt2YXIgbz1lLmxpc3Q7aWYobyE9PXZvaWQgMCl7bGV0IHM9b1tgJHtuLl9fdGFnfURlcHRoYF18fFtdO2U9RkUobiktMTtsZXQgYT1lJXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9b1tuLl9fdGFnXSxjO2lmKG89by5uZXN0ZWQsbyE9PXZvaWQgMCYmby5saXN0JiYoYz1vLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZpLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTxlP3IucHVzaCguLi5uKTppLnB1c2goLi4ubikpfTA8aS5sZW5ndGgmJnNvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudCh0LC4uLmkpLDA8ci5sZW5ndGgmJnNvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQodCwuLi5yKX1mdW5jdGlvbiBCTyh0KXtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtmdChuKT8oZS5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChpPT57VGUoaSkmJmUucHVzaChheChpKSl9KSk6ZS5wdXNoKGF4KG4pKX1yZXR1cm4gZX1mdW5jdGlvbiBoeCh0KXtsZXQgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiBlPT09Im9sIj9uPW1uKCJudW1iZXIiLHQuc3RhcnQpOmU9PT0idWwiJiYobj1zby5pc0hUTUxFbGVtZW50KHQpJiZ0LmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/bW4oImNoZWNrIik6bW4oImJ1bGxldCIpKSx7YWZ0ZXI6Qk8sbm9kZTpufX1sZXQgcHg9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiBtbih0LGU9MSl7cmV0dXJuIEZlLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgYnYodCxlKSl9ZnVuY3Rpb24gVGUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBidn1sZXQgVU89RmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxXTz1GZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxWTz1GZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIiksSE89RmUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO3duLiRjcmVhdGVMaXN0SXRlbU5vZGU9em47d24uJGNyZWF0ZUxpc3ROb2RlPW1uO3duLiRnZXRMaXN0RGVwdGg9RkU7d24uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgdD1GZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIUZlLiRpc1JhbmdlU2VsZWN0aW9uKHQpfHwhdC5pc0NvbGxhcHNlZCgpfHwodD10LmFuY2hvci5nZXROb2RlKCksIWZ0KHQpfHx0LmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIGU9YmcodCksbj10LmdldFBhcmVudCgpO1RlKG4pfHxkcyg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxpO2lmKEZlLiRpc1Jvb3RPclNoYWRvd1Jvb3QocikpaT1GZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIoaSk7ZWxzZSBpZihmdChyKSlpPXpuKCksci5pbnNlcnRBZnRlcihpKTtlbHNlIHJldHVybiExO2lmKGkuc2VsZWN0KCksZT10LmdldE5leHRTaWJsaW5ncygpLDA8ZS5sZW5ndGgpe2xldCBvPW1uKG4uZ2V0TGlzdFR5cGUoKSk7RmUuJGlzUGFyYWdyYXBoTm9kZShpKT9pLmluc2VydEFmdGVyKG8pOihuPXpuKCksbi5hcHBlbmQobyksaS5pbnNlcnRBZnRlcihuKSksZS5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLG8uYXBwZW5kKGwpfSl9cmV0dXJuIGpPKHQpLCEwfTt3bi4kaXNMaXN0SXRlbU5vZGU9ZnQ7d24uJGlzTGlzdE5vZGU9VGU7d24uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD1WTzt3bi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9V087d24uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9VU87d24uTGlzdEl0ZW1Ob2RlPU1mO3duLkxpc3ROb2RlPWJ2O3duLlJFTU9WRV9MSVNUX0NPTU1BTkQ9SE87d24uaW5zZXJ0TGlzdD1mdW5jdGlvbih0LGUpe3QudXBkYXRlKCgpPT57dmFyIG49RmUuJGdldFNlbGVjdGlvbigpO2lmKEZlLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxGZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgaT1uLmdldFBhcmVudCgpO2lmKFVFKG4scikpcj1tbihlKSxGZS4kaXNSb290T3JTaGFkb3dSb290KGkpPyhuLnJlcGxhY2UociksaT16bigpLEZlLiRpc0VsZW1lbnROb2RlKG4pJiYoaS5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLGkuc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChpKSk6ZnQobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLEdvKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoRmUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNFbXB0eSgpJiYhbi5oYXMoby5nZXRLZXkoKSkpdXgobyxlKTtlbHNlIGlmKEZlLiRpc0xlYWZOb2RlKG8pKWZvcihvPW8uZ2V0UGFyZW50KCk7byE9bnVsbDspe2xldCBzPW8uZ2V0S2V5KCk7aWYoVGUobykpe2lmKCFuLmhhcyhzKSl7dmFyIGw9bW4oZSk7R28obCxvLmdldENoaWxkcmVuKCkpLG8ucmVwbGFjZShsKSxjbihsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9by5nZXRQYXJlbnQoKSxGZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLHV4KG8sZSk7YnJlYWt9bz1sfX19fX0pfTt3bi5yZW1vdmVMaXN0PWZ1bmN0aW9uKHQpe3QudXBkYXRlKCgpPT57bGV0IGU9RmUuJGdldFNlbGVjdGlvbigpO2lmKEZlLiRpc1JhbmdlU2VsZWN0aW9uKGUpKXt2YXIgbj1uZXcgU2V0LHI9ZS5nZXROb2RlcygpLGk9ZS5hbmNob3IuZ2V0Tm9kZSgpO2lmKFVFKGkscikpbi5hZGQoYmcoaSkpO2Vsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtGZS4kaXNMZWFmTm9kZShvKSYmKG89c28uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKG8sTWYpLG8hPW51bGwmJm4uYWRkKGJnKG8pKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPUJFKGwpO2ZvcihsZXQgcyBvZiByKXI9RmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxHbyhyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PWUuYW5jaG9yLmtleSYmZS5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT1lLmZvY3VzLmtleSYmZS5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgS089d247dmFyIGppPUtPLEtFPXt9LExmPXt9LFpFPXA7ZnVuY3Rpb24gWk8odCl7bGV0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcztlLmFwcGVuZCgiY29kZSIsdCk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllLmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHt0fTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7ZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBHRT1aRS5jcmVhdGVDb250ZXh0KG51bGwpO0xmLkxleGljYWxDb21wb3NlckNvbnRleHQ9R0U7TGYuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbih0LGUpe2xldCBuPW51bGw7cmV0dXJuIHQhPW51bGwmJihuPXRbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiBlPz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07TGYudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCB0PVpFLnVzZUNvbnRleHQoR0UpO3JldHVybiB0PT1udWxsJiZaTyg4KSx0fTtjb25zdCBHTz1MZjt2YXIgVHI9R08sZ3g9VHIsZGE9X2UsamQ9cDtsZXQgWUU9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBZTz1ZRT9qZC51c2VMYXlvdXRFZmZlY3Q6amQudXNlRWZmZWN0O2xldCB2Yz17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gWE8odCxlKXtpZihlIT09bnVsbCl7aWYoZT09PXZvaWQgMCl0LnVwZGF0ZSgoKT0+e3ZhciBuPWRhLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPWRhLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1ZRT9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKGRhLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09dC5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LHZjKTtlbHNlIGlmKGUhPT1udWxsKXN3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOmxldCBuPXQucGFyc2VFZGl0b3JTdGF0ZShlKTt0LnNldEVkaXRvclN0YXRlKG4sdmMpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnNldEVkaXRvclN0YXRlKGUsdmMpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOnQudXBkYXRlKCgpPT57ZGEuJGdldFJvb3QoKS5pc0VtcHR5KCkmJmUodCl9LHZjKX19fUtFLkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzp0LGNoaWxkcmVuOmV9KXtsZXQgbj1qZC51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6aSxlZGl0b3JfX0RFUFJFQ0FURUQ6byxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT10LHU9Z3guY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPW98fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9ZGEuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTp0LmVkaXRhYmxlLG5hbWVzcGFjZTppLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO1hPKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIFlPKCgpPT57bGV0IHI9dC5lZGl0YWJsZSxbaV09bjtpLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxqZC5jcmVhdGVFbGVtZW50KGd4LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LGUpfTtjb25zdCBRTz1LRTt2YXIgSk89UU8sUmE9cDtmdW5jdGlvbiAkZyh0LGUpe3JldHVybiAkZz1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LCRnKHQsZSl9ZnVuY3Rpb24gcU8odCxlKXt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LCRnKHQsZSl9ZnVuY3Rpb24gZVAodCxlKXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9W10pLGU9PT12b2lkIDAmJihlPVtdKSx0Lmxlbmd0aCE9PWUubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sZVtyXSl9KX12YXIgbXg9e2Vycm9yOm51bGx9LHRQPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIHIsaT1hcmd1bWVudHMubGVuZ3RoLG89QXJyYXkoaSksbD0wO2w8aTtsKyspb1tsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsW3RoaXNdLmNvbmNhdChvKSl8fHRoaXMsci5zdGF0ZT1teCxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9cU8oZSx0KSxlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPWUucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShteCl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixpKXt2YXIgbyxsOyhvPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxvLmNhbGwobCxyLGkpfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLGkpe3ZhciBvPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZpLmVycm9yIT09bnVsbCYmZVAoci5yZXNldEtleXMsbykpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxvKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3IsaT10aGlzLnByb3BzLG89aS5mYWxsYmFja1JlbmRlcixsPWkuRmFsbGJhY2tDb21wb25lbnQ7aWYoaT1pLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0sUmEuaXNWYWxpZEVsZW1lbnQoaSkpcmV0dXJuIGk7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIG8ocik7aWYobClyZXR1cm4gUmEuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sZX0oUmEuQ29tcG9uZW50KSxuUD1mdW5jdGlvbih7Y2hpbGRyZW46dCxvbkVycm9yOmV9KXtyZXR1cm4gUmEuY3JlYXRlRWxlbWVudCh0UCx7ZmFsbGJhY2s6UmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjplfSx0KX07Y29uc3QgclA9blA7dmFyIGlQPXJQO2NvbnN0IG9QPVR1KGlQKTt2YXIgJHY9e30sVHY9e30sbFA9RnQsWWU9X2U7ZnVuY3Rpb24gc1AodCxlLG4scixpKXtpZih0PT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIWkpcmV0dXJuIDA7dmFyIG89ZS5fc2VsZWN0aW9uLGw9dC5fc2VsZWN0aW9uO2lmKGkpcmV0dXJuIDE7aWYoIShZZS4kaXNSYW5nZVNlbGVjdGlvbihvKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmby5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtpPWUuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1pLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1pLmdldChhKSxyPT09dm9pZCAwfHxZZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj1lLl9ub2RlTWFwLGU9ci5nZXQoby5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksZSYmbCYmIXQuX25vZGVNYXAuaGFzKGUuX19rZXkpJiZZZS4kaXNUZXh0Tm9kZShlKSYmZS5fX3RleHQubGVuZ3RoPT09MSYmby5hbmNob3Iub2Zmc2V0PT09MT8yOjApOihlPXNbMF0sdD10Ll9ub2RlTWFwLmdldChlLl9fa2V5KSwhWWUuJGlzVGV4dE5vZGUodCl8fCFZZS4kaXNUZXh0Tm9kZShlKXx8dC5fX21vZGUhPT1lLl9fbW9kZXx8KHQ9dC5fX3RleHQsZT1lLl9fdGV4dCx0PT09ZSl8fChvPW8uYW5jaG9yLGw9bC5hbmNob3Isby5rZXkhPT1sLmtleXx8by50eXBlIT09InRleHQiKT8wOihvPW8ub2Zmc2V0LGw9bC5vZmZzZXQsdD1lLmxlbmd0aC10Lmxlbmd0aCx0PT09MSYmbD09PW8tMT8yOnQ9PT0tMSYmbD09PW8rMT8zOnQ9PT0tMSYmbD09PW8/NDowKSl9ZnVuY3Rpb24gYVAodCxlKXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4oaSxvLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPXNQKGksbyxzLGEsdC5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PXQsbT11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIW0mJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYoaT09PW51bGwpcmV0dXJuIDE7dmFyIGc9by5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gZyE9PW51bGw/MDoyO2lmKG09PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rZSYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7bT1BcnJheS5mcm9tKHMpWzBdLGg9aS5fbm9kZU1hcC5nZXQobSksbT1vLl9ub2RlTWFwLmdldChtKSxnPWkuX3NlbGVjdGlvbjtsZXQgdz1vLl9zZWxlY3Rpb24sdj0hMTtZZS4kaXNSYW5nZVNlbGVjdGlvbihnKSYmWWUuJGlzUmFuZ2VTZWxlY3Rpb24odykmJih2PWcuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJmcuZm9jdXMudHlwZT09PSJlbGVtZW50IiYmdy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZZZS4kaXNUZXh0Tm9kZShoKSYmWWUuJGlzVGV4dE5vZGUobSk/aC5fX3R5cGU9PT1tLl9fdHlwZSYmaC5fX3RleHQ9PT1tLl9fdGV4dCYmaC5fX21vZGU9PT1tLl9fbW9kZSYmaC5fX2RldGFpbD09PW0uX19kZXRhaWwmJmguX19zdHlsZT09PW0uX19zdHlsZSYmaC5fX2Zvcm1hdD09PW0uX19mb3JtYXQmJmguX19wYXJlbnQ9PT1tLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fVR2LmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07VHYucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1hUCh0LG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD1lLmN1cnJlbnQsZj1lLnJlZG9TdGFjayxoPWUudW5kb1N0YWNrLG09ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09bSl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJihlLnJlZG9TdGFjaz1bXSx0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSx0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47ZS5jdXJyZW50PXtlZGl0b3I6dCxlZGl0b3JTdGF0ZTpsfX19O2xldCBpPWxQLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoWWUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9ZS5yZWRvU3RhY2sscz1lLnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPWUuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksdC5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmdC5kaXNwYXRjaENvbW1hbmQoWWUuQ0FOX1VORE9fQ09NTUFORCwhMSksZS5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0sWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKFllLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPWUucmVkb1N0YWNrO3ZhciBzPWUudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9ZS5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZ0LmRpc3BhdGNoQ29tbWFuZChZZS5DQU5fUkVET19DT01NQU5ELCExKSxlLmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoWWUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9PihlLnVuZG9TdGFjaz1bXSxlLnJlZG9TdGFjaz1bXSxlLmN1cnJlbnQ9bnVsbCwhMSksWWUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKFllLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KGUudW5kb1N0YWNrPVtdLGUucmVkb1N0YWNrPVtdLGUuY3VycmVudD1udWxsLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9SRURPX0NPTU1BTkQsITEpLHQuZGlzcGF0Y2hDb21tYW5kKFllLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSxZZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxvPXQucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e2koKSxvKCl9fTtjb25zdCB1UD1Udjt2YXIgY1A9dVAsZFA9VHIsVGc9Y1Asdng9cDtmdW5jdGlvbiBmUCh0LGUsbj0xZTMpe2xldCByPXZ4LnVzZU1lbW8oKCk9PmV8fFRnLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW2VdKTt2eC51c2VFZmZlY3QoKCk9PlRnLnJlZ2lzdGVySGlzdG9yeSh0LHIsbiksW24sdCxyXSl9JHYuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9VGcuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7JHYuSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6dH0pe2xldFtlXT1kUC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIGZQKGUsdCksbnVsbH07Y29uc3QgaFA9JHY7dmFyIHBQPWhQLFhFPXt9LGdQPVRyLE9hPXAsbVA9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP09hLnVzZUxheW91dEVmZmVjdDpPYS51c2VFZmZlY3Q7ZnVuY3Rpb24gdlAodCl7bGV0W2VdPWdQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPU9hLnVzZU1lbW8oKCk9PnQoZSksW2UsdF0pLHI9T2EudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW2ksb109T2EudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gbVAoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLG8oYSkpLHModT0+e3IuY3VycmVudD11LG8odSl9KX0sW24sdF0pLGl9ZnVuY3Rpb24geVAodCl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT50LmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6ZT0+dC5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoZSl9fXZhciB4UD1mdW5jdGlvbigpe3JldHVybiB2UCh5UCl9O2NvbnN0IF9QPXhQO3ZhciB3UD1fUCx5bz17fSxkbj1fZTtmdW5jdGlvbiBOdih0LGU9ITApe3JldHVybiB0PyExOih0PVFFKCksZSYmKHQ9dC50cmltKCkpLHQ9PT0iIil9ZnVuY3Rpb24gUUUoKXtyZXR1cm4gZG4uJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIEpFKHQpe2lmKCFOdih0LCExKSlyZXR1cm4hMTt0PWRuLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgZT10Lmxlbmd0aDtpZigxPGUpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlO3IrKyl7dmFyIG49dFtyXTtpZihkbi4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKGRuLiRpc0VsZW1lbnROb2RlKG4pKXtpZighZG4uJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IGk9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxpO28rKylpZighZG4uJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfXlvLiRjYW5TaG93UGxhY2Vob2xkZXI9SkU7eW8uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKHQpe3JldHVybigpPT5KRSh0KX07eW8uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEZpcnN0Q2hpbGQoKTt0PTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoZG4uJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoZG4uJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSx0K3I+ZSlyZXR1cm57bm9kZTpuLG9mZnNldDplLXR9O3QrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTt5by4kaXNSb290VGV4dENvbnRlbnRFbXB0eT1Odjt5by4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCk9Pk52KHQsZSl9O3lvLiRyb290VGV4dENvbnRlbnQ9UUU7eW8ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbih0LGUsbixyKXtsZXQgaT1sPT57Y29uc3Qgcz1kbi4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LG89dC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oZG4uVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKGRuLiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD1lKGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe2kocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD1lKGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLGRuLiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD1lKGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9pKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPWUoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIHQ9dC5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9ZShzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/aShsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxkbi4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKGkocyksaShsKSkscz1sLmdldE5leHRTaWJsaW5nKCksZG4uJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihpKHMpLGwgaW5zdGFuY2VvZiBuJiZpKGwpKSl9KSxbbyx0XX07Y29uc3QgU1A9eW87dmFyIEVQPVNQLHFFPXt9LHljPV9lO3FFLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbih0KXtsZXQgZT13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09ZSl7dmFyIGk9dC5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1pJiYoaT1yLmRhdGEsdHlwZW9mIGk9PSJzdHJpbmciKSl7dHJ5e3ZhciBvPUpTT04ucGFyc2UoaSl9Y2F0Y2h7cmV0dXJufWlmKG8mJm8ucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZvLnR5cGU9PT0icmVxdWVzdCImJihvPW8ucGF5bG9hZCkmJm8uZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihvPW8uYXJncykpe2NvbnN0W2wscyxhLHUsY109bzt0LnVwZGF0ZSgoKT0+e2NvbnN0IGQ9eWMuJGdldFNlbGVjdGlvbigpO2lmKHljLiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxtPTAsZz0wO3ljLiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYobT1sLGc9bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksKG0hPT1nfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLHljLiRpc1RleHROb2RlKGgpJiYobT11LGc9dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxtPW0+Zj9mOm0sZz1nPmY/ZjpnLGQuc2V0VGV4dE5vZGVSYW5nZShoLG0saCxnKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IENQPXFFO3ZhciBrUD1DUCxKcj17fSxTaT17fSxSdj17fSx5eD1sbyxiUD1GdCx6bD1fZTtmdW5jdGlvbiBlQyh0LGUsbixyPW51bGwpe2xldCBpPXIhPW51bGw/ZS5pc1NlbGVjdGVkKHIpOiEwLG89emwuJGlzRWxlbWVudE5vZGUoZSkmJmUuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9ZTtyIT09bnVsbCYmKGw9eXguJGNsb25lV2l0aFByb3BlcnRpZXMoZSksbD16bC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD95eC4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPXpsLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKHQpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPWVDKHQsZixjLHIpOyFpJiZ6bC4kaXNFbGVtZW50Tm9kZShlKSYmaCYmZS5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYoaT0hMCl9cmV0dXJuIGkmJiFvPyhiUC5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYodD11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgodCkpOm4uYXBwZW5kKGMpLGl9bGV0IHRDPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiBuQyh0LGUsbj1uZXcgTWFwLHIpe2xldCBpPVtdO2lmKHRDLmhhcyh0Lm5vZGVOYW1lKSlyZXR1cm4gaTtsZXQgbz1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT10LGE9ZS5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKHQpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2wodCk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxvPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLG8hPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYobz11KG8sciksIW8pYnJlYWs7byYmaS5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbb10pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KHQubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKHQ9dC5jaGlsZE5vZGVzLHI9W10sdT0wO3U8dC5sZW5ndGg7dSsrKXIucHVzaCguLi5uQyh0W3VdLGUsbmV3IE1hcChuKSxvKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLG89PW51bGw/aT1pLmNvbmNhdChyKTp6bC4kaXNFbGVtZW50Tm9kZShvKSYmby5hcHBlbmQoLi4uciksaX1Sdi4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPXpsLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGk9MDtpPHIubGVuZ3RoO2krKyllQyh0LHJbaV0sbixlKTtyZXR1cm4gbi5pbm5lckhUTUx9O1J2LiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbih0LGUpe2U9ZS5ib2R5P2UuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcj1lW2ldO3RDLmhhcyhyLm5vZGVOYW1lKXx8KHI9bkMocix0KSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3QgJFA9UnY7dmFyIFRQPSRQLHJDPVRQLE5nPWxvLFhsPUZ0LG1lPV9lO2Z1bmN0aW9uIGxpKHQpe2xldCBlPW5ldyBVUkxTZWFyY2hQYXJhbXM7ZS5hcHBlbmQoImNvZGUiLHQpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7dH07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke2V9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgaUM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIG9DKHQpe2xldCBlPW1lLiRnZXRTZWxlY3Rpb24oKTtpZihlPT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIG1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpJiZlLmlzQ29sbGFwc2VkKCl8fGUuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOnJDLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXModCxlKX1mdW5jdGlvbiBsQyh0KXtsZXQgZT1tZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiBtZS4kaXNSYW5nZVNlbGVjdGlvbihlKSYmZS5pc0NvbGxhcHNlZCgpfHxlLmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KGFDKHQsZSkpfWZ1bmN0aW9uIFJnKHQsZSxuKXsobWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT5tZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZYbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZlLmxlbmd0aD09PTEmJm1lLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoZVswXSk/UlAoZSxuLCExLHQpOk5QKGUsbil9ZnVuY3Rpb24gTlAodCxlKXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2xldCBvPXRbaV0sbD1tZS4kaXNMaW5lQnJlYWtOb2RlKG8pO2lmKGx8fG1lLiRpc0RlY29yYXRvck5vZGUobykmJm8uaXNJbmxpbmUoKXx8bWUuJGlzRWxlbWVudE5vZGUobykmJm8uaXNJbmxpbmUoKXx8bWUuJGlzVGV4dE5vZGUobyl8fG8uaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9by5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQobyl9ZWxzZSBuLnB1c2gobykscj1udWxsfW1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpP2UuaW5zZXJ0Tm9kZXMobik6bWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpJiYodD1lLmFuY2hvci5nZXROb2RlKCksbWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUodCl8fGxpKDQxKSx0LmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gUlAodCxlLG4scil7dC5sZW5ndGg9PT0xJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHRbMF0pfHxsaSg0Mik7dmFyIGk9dFswXTt0PWkuZ2V0Q2hpbGRyZW4oKSxuPWkuZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgbz1pLmdldENoaWxkcmVuU2l6ZSgpLGw9WGwuJGZpbmRNYXRjaGluZ1BhcmVudChlLmFuY2hvci5nZXROb2RlKCksaD0+bWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO2U9KGk9bCYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmWGwuJGZpbmRNYXRjaGluZ1BhcmVudChpLGg9Pm1lLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLG1lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGkpJiZtZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGUpfHxsaSg0Myk7dmFyIHM9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4oZS5nZXRDaGlsZHJlblNpemUoKS0xLHMrby0xKTtvPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKGkuZ2V0Q2hpbGRyZW5TaXplKCktMSxvK24tMSksbj1NYXRoLm1pbihvLGwpLGk9TWF0aC5taW4ocyxhKSxvPU1hdGgubWF4KG8sbCkscz1NYXRoLm1heChzLGEpLGE9ZS5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1pO2g8PXM7aCsrKXt2YXIgZD1hW2hdO21lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fGxpKDI0KTt2YXIgZj10W2xdO21lLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fGxpKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgbT0wO2ZvcihsZXQgZz1uO2c8PW87ZysrKXtsZXQgdz1kW2ddO21lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHcpfHxsaSgyNSk7bGV0IHY9ZlttXTttZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8bGkoMjUpLGg9PT1pJiZnPT09bj91PXcuZ2V0S2V5KCk6aD09PXMmJmc9PT1vJiYoYz13LmdldEtleSgpKTtsZXQgeT13LmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goeD0+e21lLiRpc1RleHROb2RlKHgpJiZtZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZCh4KSx3LmFwcGVuZCh4KX0pLHkuZm9yRWFjaCh4PT54LnJlbW92ZSgpKSxtKyt9bCsrfXUmJmMmJih0PW1lLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSx0LnNldChlLmdldEtleSgpLHUsYyksbWUuJHNldFNlbGVjdGlvbih0KSxyLmRpc3BhdGNoQ29tbWFuZChtZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gc0ModCxlLG4scj1bXSl7bGV0IGk9ZSE9bnVsbD9uLmlzU2VsZWN0ZWQoZSk6ITAsbz1tZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKGUhPT1udWxsKXt2YXIgcz1OZy4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9bWUuJGlzVGV4dE5vZGUocykmJmUhPW51bGw/TmcuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQoZSxzKTpzfWxldCBhPW1lLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmbGkoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2ZvcihtZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fGxpKDU5LGMubmFtZSkpLG1lLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOmk9ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1zQyh0LGUsdSxzLmNoaWxkcmVuKSwhaSYmbWUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LGUsImNsb25lIikmJihpPSEwKTtpZihpJiYhbylyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcih0PTA7dDxzLmNoaWxkcmVuLmxlbmd0aDt0Kyspci5wdXNoKHMuY2hpbGRyZW5bdF0pO3JldHVybiBpfWZ1bmN0aW9uIGFDKHQsZSl7bGV0IG49W10scj1tZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspc0ModCxlLHJbaV0sbik7cmV0dXJue25hbWVzcGFjZTp0Ll9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIHVDKHQpe2xldCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj1tZS4kcGFyc2VTZXJpYWxpemVkTm9kZSh0W25dKTttZS4kaXNUZXh0Tm9kZShyKSYmTmcuJGFkZE5vZGVTdHlsZShyKSxlLnB1c2gocil9cmV0dXJuIGV9bGV0IHZsPW51bGw7ZnVuY3Rpb24geHgodCxlKXt2YXIgbj1pQz8odC5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhbWUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IodCxyLG4pfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGU9ZS5jbGlwYm9hcmREYXRhLHI9bWUuJGdldFNlbGVjdGlvbigpLGU9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1vQyh0KSx0PWxDKHQpO2xldCBpPSIiO3JldHVybiByIT09bnVsbCYmKGk9ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmZS5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLHQhPT1udWxsJiZlLnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLHQpLGUuc2V0RGF0YSgidGV4dC9wbGFpbiIsaSksITB9U2kuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPWFDO1NpLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz11QztTaS4kZ2V0SHRtbENvbnRlbnQ9b0M7U2kuJGdldExleGljYWxDb250ZW50PWxDO1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24odCxlKXt0PXQuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHx0LmdldERhdGEoInRleHQvdXJpLWxpc3QiKSx0IT1udWxsJiZlLmluc2VydFJhd1RleHQodCl9O1NpLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPXVDKGwubm9kZXMpO3JldHVybiBSZyhuLHMsZSl9fWNhdGNoe31pZihyPXQuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBpPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksbz1yQy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixpKTtyZXR1cm4gUmcobixvLGUpfWNhdGNoe31pZih0PXQuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHx0LmdldERhdGEoInRleHQvdXJpLWxpc3QiKSx0IT1udWxsKWlmKG1lLiRpc1JhbmdlU2VsZWN0aW9uKGUpKWZvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxuPXQubGVuZ3RoLGk9MDtpPG47aSsrKW89dFtpXSxvPT09YApgfHxvPT09YFxyCmA/ZS5pbnNlcnRQYXJhZ3JhcGgoKTpvPT09IgkiP2UuaW5zZXJ0Tm9kZXMoW21lLiRjcmVhdGVUYWJOb2RlKCldKTplLmluc2VydFRleHQobyk7ZWxzZSBlLmluc2VydFJhd1RleHQodCl9O1NpLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1SZztTaS5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24odCxlKXtpZih2bCE9PW51bGwpcmV0dXJuITE7aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9Pnt0LnVwZGF0ZSgoKT0+e2woeHgodCxlKSl9KX0pO3ZhciBuPXQuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj10Ll93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OnQuX3dpbmRvdy5kb2N1bWVudCxpPWlDPyh0Ll93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8aT09PW51bGwpcmV0dXJuITE7bGV0IG89ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIG8uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixvLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKG8pLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQobywwKSxuLnNldEVuZChvLDEpLGkucmVtb3ZlQWxsUmFuZ2VzKCksaS5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9dC5yZWdpc3RlckNvbW1hbmQobWUuQ09QWV9DT01NQU5ELGE9PihYbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSx2bCE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHZsKSx2bD1udWxsKSxsKHh4KHQsYSkpKSwhMCksbWUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7dmw9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksdmw9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxvLnJlbW92ZSgpfSl9O2NvbnN0IE9QPVNpO3ZhciBQUD1PUCx6ZD1QUCx4Yz1sbyxqcj1GdCxNPV9lO2Z1bmN0aW9uIF94KHQsZSl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8odD1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KHQsZSksdD09PW51bGw/bnVsbDp7bm9kZTp0LnN0YXJ0Q29udGFpbmVyLG9mZnNldDp0LnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyh0PWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQodCxlKSx0PT09bnVsbD9udWxsOntub2RlOnQub2Zmc2V0Tm9kZSxvZmZzZXQ6dC5vZmZzZXR9KTpudWxsfWxldCBQcz10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsQVA9UHMmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsTVA9UHMmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIUFQPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLExQPVBzJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksSVA9UHMmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLERQPVBzJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxqUD1QcyYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFEUCxPZz1NLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIiksT3Y9Y2xhc3MgY0MgZXh0ZW5kcyBNLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBjQyhlLl9fa2V5KX1jb25zdHJ1Y3RvcihlKXtzdXBlcihlKX1jcmVhdGVET00oZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBqci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sZS50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjp6UCxwcmlvcml0eTowfSl9fWV4cG9ydERPTShlKXtpZih7ZWxlbWVudDplfT1zdXBlci5leHBvcnRET00oZSksZSYmanIuaXNIVE1MRWxlbWVudChlKSl7dGhpcy5pc0VtcHR5KCkmJmUuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO2Uuc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJihlLmRpcj1uKX1yZXR1cm57ZWxlbWVudDplfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1QdigpO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXRJbmRlbnQoZS5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKGUuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIoZSxuKXtlPU0uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiBlLnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKGUsbiksZX1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgZT1NLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PmUuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UoZSksITB9fTtmdW5jdGlvbiBQdigpe3JldHVybiBNLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgT3YpfWxldCBBdj1jbGFzcyBkQyBleHRlbmRzIE0uRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgZEMoZS5fX3RhZyxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG4pe3N1cGVyKG4pLHRoaXMuX190YWc9ZX1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00oZSl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIGU9ZS50aGVtZS5oZWFkaW5nLGUhPT12b2lkIDAmJmpyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocixlW25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjp5bCxwcmlvcml0eTowfSkscDplPT4oZT1lLmZpcnN0Q2hpbGQsZSE9PW51bGwmJnd4KGUpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46ZT0+d3goZSk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpGbCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTShlKXtpZih7ZWxlbWVudDplfT1zdXBlci5leHBvcnRET00oZSksZSYmanIuaXNIVE1MRWxlbWVudChlKSl7dGhpcy5pc0VtcHR5KCkmJmUuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO2Uuc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJihlLmRpcj1uKX1yZXR1cm57ZWxlbWVudDplfX1zdGF0aWMgaW1wb3J0SlNPTihlKXtsZXQgbj1GbChlLnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KGUuZm9ybWF0KSxuLnNldEluZGVudChlLmluZGVudCksbi5zZXREaXJlY3Rpb24oZS5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcihlLG49ITApe2U9ZT9lLmFuY2hvci5vZmZzZXQ6MCxlPTA8ZSYmZTx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP0ZsKHRoaXMuZ2V0VGFnKCkpOk0uJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiBlLnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKGUsbiksZX1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgZT10aGlzLmlzRW1wdHkoKT9NLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6RmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PmUuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UoZSksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gd3godCl7cmV0dXJuIHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj90LnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIHlsKHQpe2xldCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKGU9PT0iaDEifHxlPT09ImgyInx8ZT09PSJoMyJ8fGU9PT0iaDQifHxlPT09Img1Inx8ZT09PSJoNiIpJiYobj1GbChlKSx0LnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiB6UCh0KXtsZXQgZT1QdigpO3JldHVybiB0LnN0eWxlIT09bnVsbCYmZS5zZXRGb3JtYXQodC5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOmV9fWZ1bmN0aW9uIEZsKHQpe3JldHVybiBNLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQXYodCkpfWZ1bmN0aW9uIEZQKHQsZSl7dC5wcmV2ZW50RGVmYXVsdCgpLGUudXBkYXRlKCgpPT57bGV0IG49TS4kZ2V0U2VsZWN0aW9uKCkscj10IGluc3RhbmNlb2YgSW5wdXRFdmVudHx8dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDp0LmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKE0uJGlzUmFuZ2VTZWxlY3Rpb24obil8fE0uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmemQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gQlAodCxlKXthd2FpdCB6ZC5jb3B5VG9DbGlwYm9hcmQoZSxqci5vYmplY3RLbGFzc0VxdWFscyh0LENsaXBib2FyZEV2ZW50KT90Om51bGwpLGUudXBkYXRlKCgpPT57bGV0IG49TS4kZ2V0U2VsZWN0aW9uKCk7TS4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpNLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gZmEodCl7bGV0IGU9bnVsbDtpZih0IGluc3RhbmNlb2YgRHJhZ0V2ZW50P2U9dC5kYXRhVHJhbnNmZXI6dCBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYoZT10LmNsaXBib2FyZERhdGEpLGU9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49ZS50eXBlcztyZXR1cm4gdD1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbdCxBcnJheS5mcm9tKGUuZmlsZXMpLG5dfWZ1bmN0aW9uIFN4KHQpe3ZhciBlPU0uJGdldFNlbGVjdGlvbigpO2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKGUpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7ZT1lLmdldE5vZGVzKCk7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciByPWVbb10saT1yLmdldEtleSgpO24uaGFzKGkpfHwocj1qci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxpPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKGkpJiYobi5hZGQoaSksdChyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gdD1NLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKHQpLE0uJGlzRGVjb3JhdG9yTm9kZSh0KX1Kci4kY3JlYXRlSGVhZGluZ05vZGU9Rmw7SnIuJGNyZWF0ZVF1b3RlTm9kZT1QdjtKci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEF2fTtKci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBPdn07SnIuRFJBR19EUk9QX1BBU1RFPU9nO0pyLkhlYWRpbmdOb2RlPUF2O0pyLlF1b3RlTm9kZT1PdjtKci5ldmVudEZpbGVzPWZhO0pyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGpyLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoTS5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgZT1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNOb2RlU2VsZWN0aW9uKGUpPyhlLmNsZWFyKCksITApOiExfSwwKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIoZSksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRFTEVURV9XT1JEX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZChlKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uREVMRVRFX0xJTkVfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKGUpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIGU9PSJzdHJpbmciKU0uJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KGUpOk0uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIU0uJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFNLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPWUuZGF0YVRyYW5zZmVyO3IhPW51bGw/emQuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KTpNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYoZT1lLmRhdGEpJiZuLmluc2VydFRleHQoZSl9cmV0dXJuITB9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IGU9TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24oZSk/KGUucmVtb3ZlVGV4dCgpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5GT1JNQVRfVEVYVF9DT01NQU5ELGU9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQoZSksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsZT0+e3ZhciBuPU0uJGdldFNlbGVjdGlvbigpO2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhTS4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1qci4kZmluZE1hdGNoaW5nUGFyZW50KHIsaT0+TS4kaXNFbGVtZW50Tm9kZShpKSYmIWkuaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KGUpO3JldHVybiEwfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKGUpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCBlPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKGUpPyhlLmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihNLiRpbnNlcnROb2RlcyhbTS4kY3JlYXRlVGFiTm9kZSgpXSksITApLE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+U3goZT0+e2NvbnN0IG49ZS5nZXRJbmRlbnQoKTtlLnNldEluZGVudChuKzEpfSksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+U3goZT0+e2NvbnN0IG49ZS5nZXRJbmRlbnQoKTswPG4mJmUuc2V0SW5kZW50KG4tMSl9KSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19VUF9DT01NQU5ELGU9Pnt2YXIgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZihNLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyhlLnRhcmdldCkpe2lmKGU9bi5nZXROb2RlcygpLDA8ZS5sZW5ndGgpcmV0dXJuIGVbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKE0uJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPU0uJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhZS5zaGlmdEtleSYmTS4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsZT0+e3ZhciBuPU0uJGdldFNlbGVjdGlvbigpO2lmKE0uJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYoZT1uLmdldE5vZGVzKCksMDxlLmxlbmd0aClyZXR1cm4gZVswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihNLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PU0uJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49TS4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCFlLnNoaWZ0S2V5JiZNLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksZS5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsZT0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoTS4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmeGMuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj1lLnNoaWZ0S2V5LGUucHJldmVudERlZmF1bHQoKSx4Yy4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQVJST1dfUklHSFRfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZihNLiRpc05vZGVTZWxlY3Rpb24obikmJiFfYyhlLnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9ZS5zaGlmdEtleSx4Yy4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyhlLnByZXZlbnREZWZhdWx0KCkseGMuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLktFWV9CQUNLU1BBQ0VfQ09NTUFORCxlPT57aWYoX2MoZS50YXJnZXQpKXJldHVybiExO2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU0uJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7ZS5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6ZX09bjtjb25zdCByPWUuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJmUub2Zmc2V0PT09MCYmIU0uJGlzUm9vdE5vZGUocikmJjA8anIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/dC5kaXNwYXRjaENvbW1hbmQoTS5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOnQuZGlzcGF0Y2hDb21tYW5kKE0uREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfREVMRVRFX0NPTU1BTkQsZT0+e2lmKF9jKGUudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhlLnByZXZlbnREZWZhdWx0KCksdC5kaXNwYXRjaENvbW1hbmQoTS5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfRU5URVJfQ09NTUFORCxlPT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZighTS4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZihlIT09bnVsbCl7aWYoKElQfHxMUHx8alApJiZNUClyZXR1cm4hMTtpZihlLnByZXZlbnREZWZhdWx0KCksZS5zaGlmdEtleSlyZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoTS5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoTS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCBlPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKGUpPyh0LmJsdXIoKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLHQucmVnaXN0ZXJDb21tYW5kKE0uRFJPUF9DT01NQU5ELGU9Pntjb25zdFssbl09ZmEoZSk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9X3goZS5jbGllbnRYLGUuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDpvLG5vZGU6bH09cjt2YXIgaT1NLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKGkhPT1udWxsKXtpZihyPU0uJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksTS4kaXNUZXh0Tm9kZShpKSlyLmFuY2hvci5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iiksci5mb2N1cy5zZXQoaS5nZXRLZXkoKSxvLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPWkuZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO2k9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsaSwiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsaSwiZWxlbWVudCIpfXI9TS4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksTS4kc2V0U2VsZWN0aW9uKHIpfXQuZGlzcGF0Y2hDb21tYW5kKE9nLG4pfXJldHVybiBlLnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIGU9TS4kZ2V0U2VsZWN0aW9uKCksISFNLiRpc1JhbmdlU2VsZWN0aW9uKGUpfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkRSQUdTVEFSVF9DT01NQU5ELGU9PntbZV09ZmEoZSk7Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKGUmJiFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5EUkFHT1ZFUl9DT01NQU5ELGU9Pnt2YXJbbl09ZmEoZSk7Y29uc3Qgcj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIU0uJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49X3goZS5jbGllbnRYLGUuY2xpZW50WSksbiE9PW51bGwmJihuPU0uJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxNLiRpc0RlY29yYXRvck5vZGUobikmJmUucHJldmVudERlZmF1bHQoKSksITApfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KE0uJHNlbGVjdEFsbCgpLCEwKSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSx0LnJlZ2lzdGVyQ29tbWFuZChNLkNPUFlfQ09NTUFORCxlPT4oemQuY29weVRvQ2xpcGJvYXJkKHQsanIub2JqZWN0S2xhc3NFcXVhbHMoZSxDbGlwYm9hcmRFdmVudCk/ZTpudWxsKSwhMCksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5DVVRfQ09NTUFORCxlPT4oQlAoZSx0KSwhMCksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksdC5yZWdpc3RlckNvbW1hbmQoTS5QQVNURV9DT01NQU5ELGU9Pntjb25zdFssbixyXT1mYShlKTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gdC5kaXNwYXRjaENvbW1hbmQoT2csbiksITA7aWYoTS5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dChlLnRhcmdldCkpcmV0dXJuITE7Y29uc3QgaT1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihpKXx8TS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oaSk/KEZQKGUsdCksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IFVQPUpyO3ZhciBQYT1VUCxmQz1UcixXUD13UCxKbj1wLFZQPUVQLGhDPUZ0LEV4PUdyLEhQPWtQLEtQPVBhLE12PXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Kbi51c2VMYXlvdXRFZmZlY3Q6Sm4udXNlRWZmZWN0O2Z1bmN0aW9uIEN4KHQpe3JldHVybiB0LmdldEVkaXRvclN0YXRlKCkucmVhZChWUC4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkodC5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gWlAodCl7bGV0W2Usbl09Sm4udXNlU3RhdGUoKCk9PkN4KHQpKTtyZXR1cm4gTXYoKCk9PntmdW5jdGlvbiByKCl7bGV0IGk9Q3godCk7bihpKX1yZXR1cm4gcigpLGhDLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksdC5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFt0XSksZX1mdW5jdGlvbiBHUCh0LGUpe2xldFtuLHJdPUpuLnVzZVN0YXRlKCgpPT50LmdldERlY29yYXRvcnMoKSk7cmV0dXJuIE12KCgpPT50LnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoaT0+e0V4LmZsdXNoU3luYygoKT0+e3IoaSl9KX0pLFt0XSksSm4udXNlRWZmZWN0KCgpPT57cih0LmdldERlY29yYXRvcnMoKSl9LFt0XSksSm4udXNlTWVtbygoKT0+e2xldCBpPVtdLG89T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxvLmxlbmd0aDtsKyspe2xldCBzPW9bbF0sYT1Kbi5jcmVhdGVFbGVtZW50KGUse29uRXJyb3I6Yz0+dC5fb25FcnJvcihjKX0sSm4uY3JlYXRlRWxlbWVudChKbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9dC5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJmkucHVzaChFeC5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gaX0sW2Usbix0XSl9ZnVuY3Rpb24gWVAodCl7TXYoKCk9PmhDLm1lcmdlUmVnaXN0ZXIoS1AucmVnaXN0ZXJSaWNoVGV4dCh0KSxIUC5yZWdpc3RlckRyYWdvblN1cHBvcnQodCkpLFt0XSl9ZnVuY3Rpb24gWFAoe2NvbnRlbnQ6dH0pe3ZhcltlXT1mQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7ZT1aUChlKTtsZXQgbj1XUCgpO3JldHVybiBlP3R5cGVvZiB0PT0iZnVuY3Rpb24iP3Qobik6dDpudWxsfVhFLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6dCxwbGFjZWhvbGRlcjplLEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT1mQy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49R1AocixuKSxZUChyKSxKbi5jcmVhdGVFbGVtZW50KEpuLkZyYWdtZW50LG51bGwsdCxKbi5jcmVhdGVFbGVtZW50KFhQLHtjb250ZW50OmV9KSxuKX07Y29uc3QgUVA9WEU7dmFyIEpQPVFQLHBDPXt9LG5pPWppLHFQPVRyLGdDPXAsZUE9RnQscXM9X2U7ZnVuY3Rpb24gdEEodCl7Z0MudXNlRWZmZWN0KCgpPT5lQS5tZXJnZVJlZ2lzdGVyKHQucmVnaXN0ZXJDb21tYW5kKG5pLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QodCwibnVtYmVyIiksITApLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0LnJlZ2lzdGVyQ29tbWFuZChuaS5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KG5pLmluc2VydExpc3QodCwiYnVsbGV0IiksITApLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0LnJlZ2lzdGVyQ29tbWFuZChuaS5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4obmkucmVtb3ZlTGlzdCh0KSwhMCkscXMuQ09NTUFORF9QUklPUklUWV9MT1cpLHQucmVnaXN0ZXJDb21tYW5kKHFzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFuaS4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLHFzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW3RdKX1wQy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W3RdPXFQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gZ0MudXNlRWZmZWN0KCgpPT57aWYoIXQuaGFzTm9kZXMoW25pLkxpc3ROb2RlLG5pLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbdF0pLHRBKHQpLG51bGx9O2NvbnN0IG5BPXBDO3ZhciByQT1uQSxtQz17fSxFaT17fSx2Qz1GdCxVcj1fZTtsZXQgaUE9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEFzIGV4dGVuZHMgVXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKGUpe3JldHVybiBuZXcgQXMoZS5fX3VybCx7cmVsOmUuX19yZWwsdGFyZ2V0OmUuX190YXJnZXQsdGl0bGU6ZS5fX3RpdGxlfSxlLl9fa2V5KX1jb25zdHJ1Y3RvcihlLG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDppPW51bGwscmVsOm89bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD1lLHRoaXMuX190YXJnZXQ9aSx0aGlzLl9fcmVsPW8sdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKGUpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksdkMuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLGUudGhlbWUubGluayksbn11cGRhdGVET00oZSxuKXtsZXQgcj10aGlzLl9fdXJsLGk9dGhpcy5fX3RhcmdldCxvPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT1lLl9fdXJsJiYobi5ocmVmPXIpLGkhPT1lLl9fdGFyZ2V0JiYoaT9uLnRhcmdldD1pOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksbyE9PWUuX19yZWwmJihvP24ucmVsPW86bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09ZS5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOm9BLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04oZSl7bGV0IG49Y3UoZS51cmwse3JlbDplLnJlbCx0YXJnZXQ6ZS50YXJnZXQsdGl0bGU6ZS50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdChlLmZvcm1hdCksbi5zZXRJbmRlbnQoZS5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKGUuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKGUpe3RyeXtsZXQgbj1uZXcgVVJMKGUpO2lmKCFpQS5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIGV9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKGUpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD1lfWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldChlKXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9ZX1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwoZSl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPWV9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKGUpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPWV9aW5zZXJ0TmV3QWZ0ZXIoZSxuPSEwKXtyZXR1cm4gZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcihlLG4pLFVyLiRpc0VsZW1lbnROb2RlKGUpPyhuPWN1KHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLGUuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQoZSxuKXtpZighVXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7ZT1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZihlKSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIG9BKHQpe2xldCBlPW51bGw7aWYodkMuaXNIVE1MQW5jaG9yRWxlbWVudCh0KSl7bGV0IG49dC50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYoZT1jdSh0LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOnQuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6dC5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOmV9fWZ1bmN0aW9uIGN1KHQsZSl7cmV0dXJuIFVyLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgQXModCxlKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBc31jbGFzcyBGdSBleHRlbmRzIEFze3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBGdShlLl9fdXJsLHtyZWw6ZS5fX3JlbCx0YXJnZXQ6ZS5fX3RhcmdldCx0aXRsZTplLl9fdGl0bGV9LGUuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKGUpe2xldCBuPVBnKGUudXJsLHtyZWw6ZS5yZWwsdGFyZ2V0OmUudGFyZ2V0LHRpdGxlOmUudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQoZS5mb3JtYXQpLG4uc2V0SW5kZW50KGUuaW5kZW50KSxuLnNldERpcmVjdGlvbihlLmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoZSxuPSEwKXtyZXR1cm4gZT10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcihlLG4pLFVyLiRpc0VsZW1lbnROb2RlKGUpPyhuPVBnKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksZS5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gUGcodCxlKXtyZXR1cm4gVXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBGdSh0LGUpKX1sZXQgbEE9VXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIHNBKHQsZSl7Zm9yKDt0IT09bnVsbCYmKHQ9dC5nZXRQYXJlbnQoKSkhPT1udWxsJiYhZSh0KTspO3JldHVybiB0fUVpLiRjcmVhdGVBdXRvTGlua05vZGU9UGc7RWkuJGNyZWF0ZUxpbmtOb2RlPWN1O0VpLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEZ1fTtFaS4kaXNMaW5rTm9kZT1ibztFaS5BdXRvTGlua05vZGU9RnU7RWkuTGlua05vZGU9QXM7RWkuVE9HR0xFX0xJTktfQ09NTUFORD1sQTtFaS50b2dnbGVMaW5rPWZ1bmN0aW9uKHQsZT17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PWUsaT1lLnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6ZS5yZWw7aWYoZT1Vci4kZ2V0U2VsZWN0aW9uKCksVXIuJGlzUmFuZ2VTZWxlY3Rpb24oZSkpaWYoZT1lLmV4dHJhY3QoKSx0PT09bnVsbCllLmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxibyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZihlLmxlbmd0aD09PTEpe3ZhciBvPWVbMF07aWYobz1ibyhvKT9vOnNBKG8sYm8pLG8hPT1udWxsKXtvLnNldFVSTCh0KSxuIT09dm9pZCAwJiZvLnNldFRhcmdldChuKSxpIT09bnVsbCYmby5zZXRSZWwoaSksciE9PXZvaWQgMCYmby5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO2UuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighVXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoYm8odSkpcz11LHUuc2V0VVJMKHQpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLGkhPT1udWxsJiZzLnNldFJlbChpKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPWN1KHQse3JlbDppLHRhcmdldDpufSksYm8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksYm8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IGFBPUVpO3ZhciBmcz1hQSx4bD1mcyx1QT1UcixjQT1GdCxfbD1fZSxkQT1wO21DLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOnR9KXtsZXRbZV09dUEudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBkQS51c2VFZmZlY3QoKCk9PntpZighZS5oYXNOb2RlcyhbeGwuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIGNBLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoeGwuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIHhsLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiB0PT09dm9pZCAwfHx0KG4pPyh4bC50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0OmkscmVsOm8sdGl0bGU6bH09bjtyZXR1cm4geGwudG9nZ2xlTGluayhyLHtyZWw6byx0YXJnZXQ6aSx0aXRsZTpsfSksITB9LF9sLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSx0IT09dm9pZCAwP2UucmVnaXN0ZXJDb21tYW5kKF9sLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPV9sLiRnZXRTZWxlY3Rpb24oKTtpZighX2wuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IGk9bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gdChpKT9yLmdldE5vZGVzKCkuc29tZShvPT5fbC4kaXNFbGVtZW50Tm9kZShvKSk/ITE6KGUuZGlzcGF0Y2hDb21tYW5kKHhsLlRPR0dMRV9MSU5LX0NPTU1BTkQsaSksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sX2wuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFtlLHRdKSxudWxsfTtjb25zdCBmQT1tQzt2YXIgaEE9ZkE7ZnVuY3Rpb24gcEEoe2FyaWFBY3RpdmVEZXNjZW5kYW50OnQsYXJpYUF1dG9Db21wbGV0ZTplLGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDppLGFyaWFMYWJlbDpvLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazptPSEwLHN0eWxlOmcsdGFiSW5kZXg6dywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W3hdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbUyxiXT1wLnVzZVN0YXRlKCExKSxUPXAudXNlQ2FsbGJhY2soJD0+e3ZhciBMO3guc2V0Um9vdEVsZW1lbnQoJCk7Y29uc3QgTz0oTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpMLnNoYWRvd1Jvb3Q7aWYoTyYmImdldFNlbGVjdGlvbiJpbiBPKXt4Ll93aW5kb3c9TztyZXR1cm59fSxbeF0pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KGIoeC5pc0VkaXRhYmxlKCkpLHgucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKCQ9PntiKCQpfSkpLFt4XSksXy5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6Uz90OnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOlM/ZToibm9uZSIsImFyaWEtY29udHJvbHMiOlM/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOlMmJmg9PT0iY29tYm9ib3giPyEhaTp2b2lkIDAsImFyaWEtbGFiZWwiOm8sImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6Uz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6Uz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6UywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6VCxyb2xlOmgsc3BlbGxDaGVjazptLHN0eWxlOmcsdGFiSW5kZXg6d30pfWZ1bmN0aW9uIGdBKHtjbGFzc05hbWU6dH0pe3JldHVybiBfLmpzeChwQSx7Y2xhc3NOYW1lOnR9KX1jbGFzcyBCdSBleHRlbmRzIF9lLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IoZSxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPWUuc3JjLHRoaXMuX19hbHRUZXh0PWUuYWx0VGV4dCx0aGlzLl9fd2lkdGg9ZS53aWR0aCx0aGlzLl9faGVpZ2h0PWUuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUoZSl7cmV0dXJuIG5ldyBCdSh7c3JjOmUuX19zcmMsYWx0VGV4dDplLl9fYWx0VGV4dCx3aWR0aDplLl9fd2lkdGgsaGVpZ2h0OmUuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04oZSl7cmV0dXJuIHlDKGUpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiBfLmpzeChtQSx7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIG1BKHQpe3JldHVybiBfLmpzeCgiaW1nIix7c3JjOnQuc3JjfSl9ZnVuY3Rpb24geUModCl7cmV0dXJuIG5ldyBCdSh0KX1mdW5jdGlvbiB2QSgpe2NvbnN0W3RdPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmZvY3VzKCl9LFt0XSksbnVsbH1jb25zdCB4Qz1fZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIHlBKCl7Y29uc3RbdF09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCF0Lmhhc05vZGVzKFtCdV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIEZ0Lm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoeEMsZT0+e2NvbnN0IG49eUMoZSk7cmV0dXJuIF9lLiRpbnNlcnROb2Rlcyhbbl0pLF9lLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZGdC4kd3JhcE5vZGVJbkVsZW1lbnQobixfZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LF9lLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFt0XSksbnVsbH1jb25zdCB4QT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTp0LGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSksXy5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSxfQT14QSx3QT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOnQsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOltfLmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSksXy5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSxfLmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksU0E9d0EsRUE9KHtjbGFzc05hbWU6dH0pPT5fLmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOnQsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOl8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxDQT1FQSxrQT0oe3ZhcmlhbnQ6dD0icHJpbWFyeSIsb25DbGljazplLGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOmk9ITF9KT0+Xy5qc3goImJ1dHRvbiIse2Rpc2FibGVkOmksY2xhc3NOYW1lOl9mKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6dD09PSJwcmltYXJ5IiwiYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6dD09PSJwcmltYXJ5IiwiYmctdHJhbnNwYXJlbnQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjp0IT09InByaW1hcnkifSksb25DbGljazplLGNoaWxkcmVuOl8uanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSwkbz1rQSxiQT0oe2NsYXNzTmFtZTp0fSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOnQsY2hpbGRyZW46W18uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLCRBPWJBLF9DPXJlLmNyZWF0ZUNvbnRleHQoe2dldCBhcGkoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXNzaW9uKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgdGhlbWUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRUaGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGVkaXRNb2RlKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0RWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBoaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRIaWdobGlnaHQoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRXaW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgd2luZG93U2l6ZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX19KTtmdW5jdGlvbiBMdigpe3JldHVybiByZS51c2VDb250ZXh0KF9DKX1jb25zdCBUQT0oe29wdGlvbnM6dCxvbkNoYW5nZTplLGxhYmVsOm4saWNvbjpyfSk9Pntjb25zdFtpLG9dPXAudXNlU3RhdGUoITEpLGw9cC51c2VSZWYobnVsbCksW3MsYV09cC51c2VTdGF0ZSgwKSx7d2luZG93U2l6ZTp1fT1MdigpLGM9KCk9PntvKCFpKX0sZD0oZixoKT0+e2EoaCksZShmKSxvKCExKX07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgZj1oPT57aSYmbC5jdXJyZW50JiYhbC5jdXJyZW50LmNvbnRhaW5zKGgudGFyZ2V0KSYmbyghMSl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZiksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsZil9fSxbXSksXy5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC1bMTJweF0iLHJlZjpsLGNoaWxkcmVuOl8uanN4KCRvLHtvbkNsaWNrOmY9PntmLnByZXZlbnREZWZhdWx0KCksYygpfSxpY29uOl8uanN4KCRBLHtjbGFzc05hbWU6YHJvdGF0ZS1bLTkwZGVnXSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0xNTAgZWFzZS1pbi1vdXQgJHtpPyIiOiJyb3RhdGUtWzkwZGVnXSJ9YH0pLGNoaWxkcmVuOl8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWxhdGl2ZSIsY2hpbGRyZW46W18uanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEiLGNoaWxkcmVuOltuLHImJnJdfSksaSYmXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXRvcC1bNHB4XSBvdmVyZmxvdy1zY3JvbGwgc2hhZG93LWxnIC1sZWZ0LTIgdGV4dC1wcmltYXJ5IGJnLWJvcmRlciB3LWZpdCB6LW92ZXJsYXkiLHN0eWxlOnttYXhIZWlnaHQ6dT09bnVsbD92b2lkIDA6dS5pbm5lckhlaWdodH0sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCAiLGNoaWxkcmVuOnQ9PW51bGw/dm9pZCAwOnQubWFwKChmLGgpPT5fLmpzeCgiYnV0dG9uIix7b25DbGljazptPT57bS5wcmV2ZW50RGVmYXVsdCgpLGQoZixoKX0sY2xhc3NOYW1lOmB0ZXh0LWxlZnQgcHgtMiBweS0xIGhvdmVyOmJnLWJhY2tncm91bmQgaG92ZXI6dGV4dC1oaWdobGlnaHQgICR7aD09PXMmJiJmb250LWJvbGQgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRydW5jYXRlIn1gLGNoaWxkcmVuOmZ9LGYpKX0pfSldfSl9KX0pfSxOQT1UQSxSQT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gd0ModCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dmFyIG87Y29uc3Qgcj0obz10LmN1cnJlbnRUYXJnZXQuZmlsZXMpPT1udWxsP3ZvaWQgMDpvWzBdLGk9bmV3IEZpbGVSZWFkZXI7aS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGw9aS5yZXN1bHQ7aWYodHlwZW9mIGw9PSJzdHJpbmciKXtjb25zdCBzPW5ldyBJbWFnZTtzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGFzeW5jKCk9Pntjb25zdCBhPWF3YWl0IGpuLmdldFNIQTI1Nkhhc2goUkEuZW5jb2RlKGwpKTtpZihzLm5hdHVyYWxXaWR0aCYmcy5uYXR1cmFsSGVpZ2h0KXtjb25zdCB1PW52KGwpO2Uoe3NyYzpsLHdpZHRoOnMubmF0dXJhbFdpZHRoLGhlaWdodDpzLm5hdHVyYWxIZWlnaHQsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphLG1pbWVUeXBlOnUsZmlsZUV4dDp1JiZydih1KX0pfWVsc2UgZSh7c3JjOmwsZmlsZW5hbWU6cj09bnVsbD92b2lkIDA6ci5uYW1lLHNoYTI1NjphfSl9KSxzLnNyYz1sfWVsc2UgbihsP3ttZXNzYWdlOiJVbmV4cGVjdGVkIGltYWdlIHJlc3VsdCB0eXBlIixyZXN1bHQ6bH06e21lc3NhZ2U6IkVtcHR5IHJlc3VsdCJ9KX0pLHImJmkucmVhZEFzRGF0YVVSTChyKX0pfWZ1bmN0aW9uIFNDKHQpe2NvbnN0IGU9dC5hbmNob3Isbj10LmZvY3VzLHI9dC5hbmNob3IuZ2V0Tm9kZSgpLGk9dC5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHI9PT1pP3I6dC5pc0JhY2t3YXJkKCk/bG8uJGlzQXROb2RlRW5kKG4pP3I6aTpsby4kaXNBdE5vZGVFbmQoZSk/cjppfWZ1bmN0aW9uIE9BKCl7Y29uc3RbdF09VHIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3Rlcih0LnJlZ2lzdGVyQ29tbWFuZChfZS5DTElDS19DT01NQU5ELGU9Pntjb25zdCBuPV9lLiRnZXRTZWxlY3Rpb24oKTtpZihfZS4kaXNSYW5nZVNlbGVjdGlvbihuKSl7Y29uc3Qgcj1TQyhuKSxpPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQocixmcy4kaXNMaW5rTm9kZSk7aWYoZnMuJGlzTGlua05vZGUoaSkmJihlLm1ldGFLZXl8fGUuY3RybEtleSkpcmV0dXJuIHdpbmRvdy5vcGVuKGkuZ2V0VVJMKCksIl9ibGFuayIpLCEwfXJldHVybiExfSxfZS5DT01NQU5EX1BSSU9SSVRZX0xPVykpLFtdKSxudWxsfXZhciBFQz17ZXhwb3J0czp7fX0sUEE9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIixBQT1QQSxNQT1BQTtmdW5jdGlvbiBDQygpe31mdW5jdGlvbiBrQygpe31rQy5yZXNldFdhcm5pbmdDYWNoZT1DQzt2YXIgTEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHIsaSxvLGwscyxhKXtpZihhIT09TUEpe3ZhciB1PW5ldyBFcnJvcigiQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcyIpO3Rocm93IHUubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsdX19dC5pc1JlcXVpcmVkPXQ7ZnVuY3Rpb24gZSgpe3JldHVybiB0fXZhciBuPXthcnJheTp0LGJpZ2ludDp0LGJvb2w6dCxmdW5jOnQsbnVtYmVyOnQsb2JqZWN0OnQsc3RyaW5nOnQsc3ltYm9sOnQsYW55OnQsYXJyYXlPZjplLGVsZW1lbnQ6dCxlbGVtZW50VHlwZTp0LGluc3RhbmNlT2Y6ZSxub2RlOnQsb2JqZWN0T2Y6ZSxvbmVPZjplLG9uZU9mVHlwZTplLHNoYXBlOmUsZXhhY3Q6ZSxjaGVja1Byb3BUeXBlczprQyxyZXNldFdhcm5pbmdDYWNoZTpDQ307cmV0dXJuIG4uUHJvcFR5cGVzPW4sbn07RUMuZXhwb3J0cz1MQSgpO3ZhciBJQT1FQy5leHBvcnRzO2NvbnN0IGVyPVR1KElBKTtmdW5jdGlvbiBBZygpe3JldHVybiBBZz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxBZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gREEodCxlKXtpZih0PT1udWxsKXJldHVybnt9O3ZhciBuPWpBKHQsZSkscixpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKylyPW9baV0sIShlLmluZGV4T2Yocik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxyKSYmKG5bcl09dFtyXSl9cmV0dXJuIG59ZnVuY3Rpb24gakEodCxlKXtpZih0PT1udWxsKXJldHVybnt9O3ZhciBuPXt9LHI9T2JqZWN0LmtleXModCksaSxvO2ZvcihvPTA7bzxyLmxlbmd0aDtvKyspaT1yW29dLCEoZS5pbmRleE9mKGkpPj0wKSYmKG5baV09dFtpXSk7cmV0dXJuIG59dmFyIEl2PXAuZm9yd2FyZFJlZihmdW5jdGlvbih0LGUpe3ZhciBuPXQuY29sb3Iscj1uPT09dm9pZCAwPyJjdXJyZW50Q29sb3IiOm4saT10LnNpemUsbz1pPT09dm9pZCAwPzI0OmksbD1EQSh0LFsiY29sb3IiLCJzaXplIl0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KCJzdmciLEFnKHtyZWY6ZSx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOm8saGVpZ2h0Om8sdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHJlLmNyZWF0ZUVsZW1lbnQoInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiJ9KSl9KTtJdi5wcm9wVHlwZXM9e2NvbG9yOmVyLnN0cmluZyxzaXplOmVyLm9uZU9mVHlwZShbZXIuc3RyaW5nLGVyLm51bWJlcl0pfTtJdi5kaXNwbGF5TmFtZT0iQ2hlY2siO2NvbnN0IHpBPUl2O2Z1bmN0aW9uIE1nKCl7cmV0dXJuIE1nPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LE1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBGQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49QkEodCxlKSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKGUuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHIpJiYobltyXT10W3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBCQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyh0KSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sIShlLmluZGV4T2YoaSk+PTApJiYobltpXT10W2ldKTtyZXR1cm4gbn12YXIgRHY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPXQuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPUZBKHQsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTWcoe3JlZjplLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMCAxM2E1IDUgMCAwIDAgNy41NC41NGwzLTNhNSA1IDAgMCAwLTcuMDctNy4wN2wtMS43MiAxLjcxIn0pLHJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEifSkpfSk7RHYucHJvcFR5cGVzPXtjb2xvcjplci5zdHJpbmcsc2l6ZTplci5vbmVPZlR5cGUoW2VyLnN0cmluZyxlci5udW1iZXJdKX07RHYuZGlzcGxheU5hbWU9IkxpbmsiO2NvbnN0IFVBPUR2O2Z1bmN0aW9uIExnKCl7cmV0dXJuIExnPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LExnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBXQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49VkEodCxlKSxyLGk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXI9b1tpXSwhKGUuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHIpJiYobltyXT10W3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBWQSh0LGUpe2lmKHQ9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyh0KSxpLG87Zm9yKG89MDtvPHIubGVuZ3RoO28rKylpPXJbb10sIShlLmluZGV4T2YoaSk+PTApJiYobltpXT10W2ldKTtyZXR1cm4gbn12YXIganY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixpPXQuc2l6ZSxvPWk9PT12b2lkIDA/MjQ6aSxsPVdBKHQsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTGcoe3JlZjplLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6byxoZWlnaHQ6byx2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZTpyLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn0sbCkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIxOCIseTE6IjYiLHgyOiI2Iix5MjoiMTgifSkscmUuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiI2Iix5MToiNiIseDI6IjE4Iix5MjoiMTgifSkpfSk7anYucHJvcFR5cGVzPXtjb2xvcjplci5zdHJpbmcsc2l6ZTplci5vbmVPZlR5cGUoW2VyLnN0cmluZyxlci5udW1iZXJdKX07anYuZGlzcGxheU5hbWU9IlgiO2NvbnN0IEhBPWp2LEtBPSh7Zm9udFNpemVzOnQsZm9udHNGYW1pbGllczplLG9uRWRpdG9yOm4sY29sb3JzOnJ9KT0+e2NvbnN0W2ldPVRyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtwLnVzZUVmZmVjdCgoKT0+e24mJm4oaSl9LFtpXSk7Y29uc3RbbyxsXT1wLnVzZVN0YXRlKGkpLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZSghMSksW2QsZl09cC51c2VTdGF0ZSghMSksW2gsbV09cC51c2VTdGF0ZSghMSksW2csd109cC51c2VTdGF0ZSghMSk7cC51c2VTdGF0ZSgiMTVweCIpLHAudXNlU3RhdGUoIiMwMDAiKSxwLnVzZVN0YXRlKCJTYW5zIik7Y29uc3Rbdix5XT1wLnVzZVN0YXRlKCJwYXJhZ3JhcGgiKTtwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCJ1cmwiKSxwLnVzZVN0YXRlKG51bGwpO2NvbnN0W3gsU109cC51c2VTdGF0ZShudWxsKSxiPVA9PntpLmRpc3BhdGNoQ29tbWFuZChmcy5UT0dHTEVfTElOS19DT01NQU5ELFApfSxUPXtwYXJhZ3JhcGg6Ik5vcm1hbCIsaDE6IkhlYWRpbmcgMSIsaDI6IkhlYWRpbmcgMiIsaDM6IkhlYWRpbmcgMyIsaDQ6IkhlYWRpbmcgNCIsaDU6IkhlYWRpbmcgNSIsaDY6IkhlYWRpbmcgNiIsbnVtYmVyOiJOdW1iZXJlZCBMaXN0IixidWxsZXQ6IkJ1bGxldGVkIExpc3QifSwkPXt9O2Zvcihjb25zdCBQIGluIFQpJFtUW1BdXT1QO2NvbnN0IE89cC51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9X2UuJGdldFNlbGVjdGlvbigpO2lmKF9lLiRpc1JhbmdlU2VsZWN0aW9uKFApKXtjb25zdCBEPVAuYW5jaG9yLmdldE5vZGUoKTtsZXQgQj1ELmdldEtleSgpPT09InJvb3QiP0Q6RnQuJGZpbmRNYXRjaGluZ1BhcmVudChELGs9Pntjb25zdCBFPWsuZ2V0UGFyZW50KCk7cmV0dXJuIEUhPT1udWxsJiZfZS4kaXNSb290T3JTaGFkb3dSb290KEUpfSk7Qj09PW51bGwmJihCPUQuZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpKTtjb25zdCBvZT1TQyhQKSxIPUZ0LiRmaW5kTWF0Y2hpbmdQYXJlbnQob2UsZnMuJGlzTGlua05vZGUpO2lmKEghPT1udWxsKXtjb25zdCBrPUguZ2V0VVJMKCk7UyhrKX1lbHNlIFMobnVsbCk7Y29uc3QgWj1CLmdldEtleSgpLEM9by5nZXRFbGVtZW50QnlLZXkoWik7aWYoYyhQLmhhc0Zvcm1hdCgiYm9sZCIpKSxmKFAuaGFzRm9ybWF0KCJpdGFsaWMiKSksbShQLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpKSx3KFAuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSksQyE9PW51bGwpaWYoYShaKSxqaS4kaXNMaXN0Tm9kZShCKSl7Y29uc3Qgaz1GdC4kZ2V0TmVhcmVzdE5vZGVPZlR5cGUoRCxqaS5MaXN0Tm9kZSksRT1rP2suZ2V0TGlzdFR5cGUoKTpCLmdldExpc3RUeXBlKCk7eShFKX1lbHNle2NvbnN0IGs9UGEuJGlzSGVhZGluZ05vZGUoQik/Qi5nZXRUYWcoKTpCLmdldFR5cGUoKTtrIGluIFQmJnkoayl9fX0sW29dKTtwLnVzZUVmZmVjdCgoKT0+RnQubWVyZ2VSZWdpc3RlcihpLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIoKHtlZGl0b3JTdGF0ZTpQfSk9PntQLnJlYWQoKCk9PntPKCl9KX0pKSxbTyxvLGldKSxwLnVzZUVmZmVjdCgoKT0+aS5yZWdpc3RlckNvbW1hbmQoX2UuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELChQLEQpPT4oTygpLGwoRCksITEpLF9lLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpLFtpLE9dKTtjb25zdCBMPVA9PntbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdLmluY2x1ZGVzKFApP3YhPT1QJiZpLnVwZGF0ZSgoKT0+e2NvbnN0IEQ9X2UuJGdldFNlbGVjdGlvbigpO19lLiRpc1JhbmdlU2VsZWN0aW9uKEQpJiZsby4kc2V0QmxvY2tzVHlwZShELCgpPT5QYS4kY3JlYXRlSGVhZGluZ05vZGUoUCkpfSk6UD09PSJwYXJhZ3JhcGgiJiZ2IT09InBhcmFncmFwaCI/aS51cGRhdGUoKCk9Pntjb25zdCBEPV9lLiRnZXRTZWxlY3Rpb24oKTsoX2UuJGlzUmFuZ2VTZWxlY3Rpb24oRCl8fF9lLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihEKSkmJmxvLiRzZXRCbG9ja3NUeXBlKEQsKCk9Pl9lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkpfSk6UD09PSJudW1iZXIiJiZ2IT09Im51bWJlciI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5ELHZvaWQgMCk6UD09PSJidWxsZXQiJiZ2IT09ImJ1bGxldCI/aS5kaXNwYXRjaENvbW1hbmQoamkuSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTppLmRpc3BhdGNoQ29tbWFuZChqaS5SRU1PVkVfTElTVF9DT01NQU5ELHZvaWQgMCl9O3JldHVybiBwLnVzZUNhbGxiYWNrKCgpPT57aS51cGRhdGUoKCk9Pntjb25zdCBQPV9lLiRnZXRTZWxlY3Rpb24oKTtpZihfZS4kaXNSYW5nZVNlbGVjdGlvbihQKSl7Y29uc3QgRD1QLmFuY2hvcixCPVAuZm9jdXMsb2U9UC5nZXROb2RlcygpO2lmKEQua2V5PT09Qi5rZXkmJkQub2Zmc2V0PT09Qi5vZmZzZXQpcmV0dXJuO29lLmZvckVhY2goKEgsWik9PntfZS4kaXNUZXh0Tm9kZShIKT8oWj09PTAmJkQub2Zmc2V0IT09MCYmKEg9SC5zcGxpdFRleHQoRC5vZmZzZXQpWzFdfHxIKSxaPT09b2UubGVuZ3RoLTEmJihIPUguc3BsaXRUZXh0KEIub2Zmc2V0KVswXXx8SCksSC5fX3N0eWxlIT09IiImJkguc2V0U3R5bGUoIiIpLEguX19mb3JtYXQhPT0wJiYoSC5zZXRGb3JtYXQoMCksRnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3coSCkuc2V0Rm9ybWF0KCIiKSkpOlBhLiRpc0hlYWRpbmdOb2RlKEgpJiZILnJlcGxhY2UoX2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSwhMCl9KX19KX0sW29dKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RpY2t5IHRvcC0wIGJvcmRlci1iIGJnLWJhY2tncm91bmQgYm9yZGVyLWhpZ2hsaWdodCBmbGV4IGZsZXgtY29sIixjaGlsZHJlbjpbXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgZ2FwLTEiLGNoaWxkcmVuOltfLmpzeChOQSx7b3B0aW9uczpPYmplY3QudmFsdWVzKFQpLGxhYmVsOlRbdl0/P3YrIiAobm90IHN1cHBvcnRlZCkiLG9uQ2hhbmdlOlA9PntMKCRbUF0pfX0pLF8uanN4KCRvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlA9PntQLnByZXZlbnREZWZhdWx0KCksaS5kaXNwYXRjaENvbW1hbmQoX2UuRk9STUFUX1RFWFRfQ09NTUFORCwiYm9sZCIpfSxhY3RpdmU6dSxpY29uOl8uanN4KF9BLHtjbGFzc05hbWU6YCR7dSYmInN0cm9rZS1bM3B4XSJ9YH0pfSksXy5qc3goJG8se2FjdGl2ZTpoLG9uQ2xpY2s6UD0+e1AucHJldmVudERlZmF1bHQoKSxpLmRpc3BhdGNoQ29tbWFuZChfZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJzdHJpa2V0aHJvdWdoIil9LGljb246Xy5qc3goQ0Ese2NsYXNzTmFtZTpgJHtoJiYic3Ryb2tlLVsycHhdIn1gfSl9KSxfLmpzeCgkbyx7YWN0aXZlOmQsb25DbGljazpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLGkuZGlzcGF0Y2hDb21tYW5kKF9lLkZPUk1BVF9URVhUX0NPTU1BTkQsIml0YWxpYyIpfSxpY29uOl8uanN4KFNBLHtjbGFzc05hbWU6YCR7ZCYmInN0cm9rZS1bM3B4XSJ9YH0pfSksXy5qc3goJG8se2FjdGl2ZTp4IT09bnVsbCxvbkNsaWNrOlA9PntQLnByZXZlbnREZWZhdWx0KCksUygiIiksYigiIil9LGljb246Xy5qc3goVUEse3dpZHRoOjEyLGhlaWdodDoxMixjbGFzc05hbWU6YCR7eCE9PW51bGwmJiJzdHJva2UtWzNweF0ifWB9KX0pLF8uanN4cygibGFiZWwiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGN1cnNvci1wb2ludGVyIixjaGlsZHJlbjpbXy5qc3gobVMse30pLF8uanN4KCJpbnB1dCIse3R5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLHdDKFApLnRoZW4oRD0+e2kuZGlzcGF0Y2hDb21tYW5kKHhDLHsuLi5EfSl9KS5jYXRjaChEPT57Y29uc29sZS5lcnJvcigiRXJyb3IgcmVhZGluZyBpbWFnZSIsRCl9KX19KV19KV19KSx4IT09bnVsbCYmXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgcC0yIixjaGlsZHJlbjpbXy5qc3goImlucHV0Iix7dHlwZToidGV4dCIscGxhY2Vob2xkZXI6IkVudGVyIFVSTCIsY2xhc3NOYW1lOiJ3LTEvMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBweC0yIix2YWx1ZTp4LG9uQ2hhbmdlOlA9PntQLnByZXZlbnREZWZhdWx0KCksUyhQLnRhcmdldC52YWx1ZSl9fSksXy5qc3goJG8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6UD0+e1AucHJldmVudERlZmF1bHQoKSxiKHh8fG51bGwpfSxpY29uOl8uanN4KHpBLHtzaXplOjE0fSl9KSxfLmpzeCgkbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpQPT57UC5wcmV2ZW50RGVmYXVsdCgpLGIobnVsbCl9LGljb246Xy5qc3goSEEse3NpemU6MTR9KX0pXX0pXX0pfSxaQT1LQTtmdW5jdGlvbiBHQSh0KXtjb25zb2xlLmVycm9yKHQpfWNvbnN0IFlBPTI4LFhBPSh7cmljaHRleHQ6dCxvbkVkaXRvcjplfSk9Pntjb25zdHt3aW5kb3dTaXplOm59PUx2KCksaT17bmFtZXNwYWNlOiJ2YWwiLGVkaXRvclN0YXRlOm89PntvLnNldEVkaXRvclN0YXRlKG8ucGFyc2VFZGl0b3JTdGF0ZSh7cm9vdDp6UigkUyh0KSl9KSl9LG5vZGVzOltQYS5IZWFkaW5nTm9kZSxCdSxqaS5MaXN0Tm9kZSxqaS5MaXN0SXRlbU5vZGUsZnMuTGlua05vZGVdLHRoZW1lOnt0ZXh0Ontib2xkOiJmb250LXNlbWlib2xkIix1bmRlcmxpbmU6InVuZGVybGluZSIsaXRhbGljOiJpdGFsaWMiLHN0cmlrZXRocm91Z2g6ImxpbmUtdGhyb3VnaCIsdW5kZXJsaW5lU3RyaWtldGhyb3VnaDoidW5kZXJsaW5lIGxpbmUtdGhyb3VnaCJ9LGxpc3Q6e2xpc3RpdGVtOiJtbC1bMjBweF0iLG9sOiJsaXN0LWRlY2ltYWwiLHVsOiJsaXN0LWRpc2MifSxoZWFkaW5nOntoMToidGV4dC00eGwgZm9udC1ib2xkIixoMjoidGV4dC0zeGwgZm9udC1ib2xkIixoMzoidGV4dC0yeGwgZm9udC1ib2xkIixoNDoidGV4dC14bCBmb250LWJvbGQiLGg1OiJ0ZXh0LWxnIGZvbnQtYm9sZCIsaDY6InRleHQtbWQgZm9udC1ib2xkIn0sbGluazoidGV4dC1oaWdobGlnaHQgdW5kZXJsaW5lIn0sb25FcnJvcjpHQX07cmV0dXJuIF8uanN4cyhKTy5MZXhpY2FsQ29tcG9zZXIse2luaXRpYWxDb25maWc6aSxjaGlsZHJlbjpbXy5qc3godkEse30pLF8uanN4KFpBLHtvbkVkaXRvcjplfSksXy5qc3goSlAuUmljaFRleHRQbHVnaW4se2NvbnRlbnRFZGl0YWJsZTpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmb250LXNhbnMgYm9yZGVyLWIgdGV4dC1wcmltYXJ5IGJvcmRlci1oaWdobGlnaHQiLHN0eWxlOnttaW5IZWlnaHQ6biE9bnVsbCYmbi5pbm5lckhlaWdodD8obj09bnVsbD92b2lkIDA6bi5pbm5lckhlaWdodCktWUE6dm9pZCAwfSxjaGlsZHJlbjpfLmpzeChnQSx7Y2xhc3NOYW1lOiJwLTQgb3V0bGluZS1ub25lIGJnLWZpbGwifSl9KSxwbGFjZWhvbGRlcjpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiIiLGNoaWxkcmVuOiJFbnRlciBzb21lIHRleHQuLi4ifSksRXJyb3JCb3VuZGFyeTpvUH0pLF8uanN4KGhBLkxpbmtQbHVnaW4se30pLF8uanN4KE9BLHt9KSxfLmpzeChyQS5MaXN0UGx1Z2luLHt9KSxfLmpzeCh5QSx7fSksXy5qc3gocFAuSGlzdG9yeVBsdWdpbix7fSldfSl9O3ZhciBRQT17eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoyNCxoZWlnaHQ6MjQsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6MixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn07Y29uc3QgSkE9dD0+dC5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksS249KHQsZSk9Pntjb25zdCBuPXAuZm9yd2FyZFJlZigoe2NvbG9yOnI9ImN1cnJlbnRDb2xvciIsc2l6ZTppPTI0LHN0cm9rZVdpZHRoOm89MixhYnNvbHV0ZVN0cm9rZVdpZHRoOmwsY2hpbGRyZW46cywuLi5hfSx1KT0+cC5jcmVhdGVFbGVtZW50KCJzdmciLHtyZWY6dSwuLi5RQSx3aWR0aDppLGhlaWdodDppLHN0cm9rZTpyLHN0cm9rZVdpZHRoOmw/TnVtYmVyKG8pKjI0L051bWJlcihpKTpvLGNsYXNzTmFtZTpgbHVjaWRlIGx1Y2lkZS0ke0pBKHQpfWAsLi4uYX0sWy4uLmUubWFwKChbYyxkXSk9PnAuY3JlYXRlRWxlbWVudChjLGQpKSwuLi4oQXJyYXkuaXNBcnJheShzKT9zOltzXSl8fFtdXSkpO3JldHVybiBuLmRpc3BsYXlOYW1lPWAke3R9YCxufSxxQT1LbigiQ2hlY2siLFtbInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiIsa2V5OiIxMGpqZmoifV1dKSxiQz1LbigiQ2hldnJvbkRvd24iLFtbInBhdGgiLHtkOiJtNiA5IDYgNiA2LTYiLGtleToicXJ1bnNsIn1dXSksZTU9S24oIkNoZXZyb25MZWZ0IixbWyJwYXRoIix7ZDoibTE1IDE4LTYtNiA2LTYiLGtleToiMXduZmczIn1dXSksa3g9S24oIkxvZ0luIixbWyJwYXRoIix7ZDoiTTE1IDNoNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTQiLGtleToidTUzczZyIn1dLFsicG9seWxpbmUiLHtwb2ludHM6IjEwIDE3IDE1IDEyIDEwIDciLGtleToiMWFpbDBoIn1dLFsibGluZSIse3gxOiIxNSIseDI6IjMiLHkxOiIxMiIseTI6IjEyIixrZXk6InY2Z3J4OCJ9XV0pLHQ1PUtuKCJNYXhpbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDNINWEyIDIgMCAwIDAtMiAydjMiLGtleToiMWRjbWl0In1dLFsicGF0aCIse2Q6Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIsa2V5OiIxZTRndDMifV0sWyJwYXRoIix7ZDoiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLGtleToid3NsNXNjIn1dLFsicGF0aCIse2Q6Ik0xNiAyMWgzYTIgMiAwIDAgMCAyLTJ2LTMiLGtleToiMTh0cmVrIn1dXSksbjU9S24oIk1pbmltaXplIixbWyJwYXRoIix7ZDoiTTggM3YzYTIgMiAwIDAgMS0yIDJIMyIsa2V5OiJob2hidHIifV0sWyJwYXRoIix7ZDoiTTIxIDhoLTNhMiAyIDAgMCAxLTItMlYzIixrZXk6IjVqdzFmMyJ9XSxbInBhdGgiLHtkOiJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIsa2V5OiIxOTh0dnIifV0sWyJwYXRoIix7ZDoiTTE2IDIxdi0zYTIgMiAwIDAgMSAyLTJoMyIsa2V5OiJwaDhteHAifV1dKSxyNT1LbigiTW9vbiIsW1sicGF0aCIse2Q6Ik0xMiAzYTYgNiAwIDAgMCA5IDkgOSA5IDAgMSAxLTktOVoiLGtleToiYTd0bjE4In1dXSksaTU9S24oIlBhdXNlIixbWyJyZWN0Iix7d2lkdGg6IjQiLGhlaWdodDoiMTYiLHg6IjYiLHk6IjQiLGtleToiaWZmaGU0In1dLFsicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiIxNCIseToiNCIsa2V5OiJzamluN2oifV1dKSxvNT1LbigiUGxheSIsW1sicG9seWdvbiIse3BvaW50czoiNSAzIDE5IDEyIDUgMjEgNSAzIixrZXk6IjE5MTYzNyJ9XV0pLGw1PUtuKCJQb3dlciIsW1sicGF0aCIse2Q6Ik0xMiAydjEwIixrZXk6Im1uZmJsIn1dLFsicGF0aCIse2Q6Ik0xOC40IDYuNmE5IDkgMCAxIDEtMTIuNzcuMDQiLGtleToib2JvZnU5In1dXSksczU9S24oIlNlbmQiLFtbInBhdGgiLHtkOiJtMjIgMi03IDIwLTQtOS05LTRaIixrZXk6IjFxM3ZnZyJ9XSxbInBhdGgiLHtkOiJNMjIgMiAxMSAxMyIsa2V5OiJuemJxZWYifV1dKSxhNT1LbigiU3VuIixbWyJjaXJjbGUiLHtjeDoiMTIiLGN5OiIxMiIscjoiNCIsa2V5OiI0ZXhpcDIifV0sWyJwYXRoIix7ZDoiTTEyIDJ2MiIsa2V5OiJ0dXMwM20ifV0sWyJwYXRoIix7ZDoiTTEyIDIwdjIiLGtleToiMWxoMWtnIn1dLFsicGF0aCIse2Q6Im00LjkzIDQuOTMgMS40MSAxLjQxIixrZXk6IjE0OXQ2aiJ9XSxbInBhdGgiLHtkOiJtMTcuNjYgMTcuNjYgMS40MSAxLjQxIixrZXk6InB0Ymd1diJ9XSxbInBhdGgiLHtkOiJNMiAxMmgyIixrZXk6IjF0OGY4biJ9XSxbInBhdGgiLHtkOiJNMjAgMTJoMiIsa2V5OiIxcThtancifV0sWyJwYXRoIix7ZDoibTYuMzQgMTcuNjYtMS40MSAxLjQxIixrZXk6IjFtOHp6NSJ9XSxbInBhdGgiLHtkOiJtMTkuMDcgNC45My0xLjQxIDEuNDEiLGtleToiMXNobGNzIn1dXSksdTU9S24oIlgiLFtbInBhdGgiLHtkOiJNMTggNiA2IDE4IixrZXk6IjFibDVmOCJ9XSxbInBhdGgiLHtkOiJtNiA2IDEyIDEyIixrZXk6ImQ4Yms2diJ9XV0pLHp2PSJwLTEgYm9yZGVyIHJvdW5kZWQtZnVsbCBzaGFkb3cgYm9yZGVyLWFjY2VudCIsYng9InZhbGJ1aWxkOnVybEJlZm9yZU5hdmlnYXRpb24iO2Z1bmN0aW9uIGM1KHthcGk6dCxwYXRjaGVzOmUsb25Db21taXQ6bn0pe2NvbnN0e3RoZW1lOnIsc2V0VGhlbWU6aSxlZGl0TW9kZTpvLHNldEVkaXRNb2RlOmwsc2Vzc2lvbjpzfT1MdigpO2lmKHMuc3RhdHVzPT09InN1Y2Nlc3MiJiZzLmRhdGEubW9kZT09PSJ1bmF1dGhvcml6ZWQiKXJldHVybiBfLmpzeHMoJHgse2hyZWY6dC5nZXRMb2dpblVybCh3aW5kb3cubG9jYXRpb24uaHJlZiksY2hpbGRyZW46W18uanN4KCJzcGFuIix7Y2hpbGRyZW46IkxvZ2luIn0pLF8uanN4KGt4LHtzaXplOjE4fSldfSk7aWYocy5zdGF0dXM9PT0ic3VjY2VzcyImJiFzLmRhdGEuZW5hYmxlZClyZXR1cm4gXy5qc3hzKCR4LHtocmVmOnQuZ2V0RW5hYmxlVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxjaGlsZHJlbjpbXy5qc3goInNwYW4iLHtjaGlsZHJlbjoiRW5hYmxlIn0pLF8uanN4KGt4LHtzaXplOjE4fSldfSk7Y29uc3RbYSx1XT1wLnVzZVN0YXRlKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bGV0IGM9MDtmb3IoY29uc3QgZCBpbiBlKWMrPWVbZF0ubGVuZ3RoO3UoYyl9LFtlXSksXy5qc3hzKGQ1LHtjaGlsZHJlbjpbXy5qc3god2Mse2FjdGl2ZTpvPT09ImhvdmVyIixvbkNsaWNrOigpPT57bChjPT5jPT09ImhvdmVyIj8ib2ZmIjoiaG92ZXIiKX0sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOm89PT0iaG92ZXIiP18uanN4KGk1LHtzaXplOjE4fSk6Xy5qc3gobzUse3NpemU6MTh9KX0pfSksXy5qc3god2Mse29uQ2xpY2s6KCk9PntpKHI9PT0iZGFyayI/ImxpZ2h0IjoiZGFyayIpfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOltyPT09ImRhcmsiJiZfLmpzeChhNSx7c2l6ZToxNX0pLHI9PT0ibGlnaHQiJiZfLmpzeChyNSx7c2l6ZToxNX0pXX0pfSksXy5qc3god2Mse2FjdGl2ZTpvPT09ImZ1bGwiLG9uQ2xpY2s6KCk9PntpZihvIT09ImZ1bGwiKWxvY2FsU3RvcmFnZS5zZXRJdGVtKGJ4LHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx3aW5kb3cubG9jYXRpb24uaHJlZj10LmdldEVkaXRVcmwoKTtlbHNlIGlmKG89PT0iZnVsbCIpe2NvbnN0IGM9bG9jYWxTdG9yYWdlLmdldEl0ZW0oYngpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPWN8fCIvIn19LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpvPT09ImZ1bGwiP18uanN4KG41LHtzaXplOjE1fSk6Xy5qc3godDUse3NpemU6MTV9KX0pfSksYSE9PXZvaWQgMCYmcy5zdGF0dXM9PT0ic3VjY2VzcyImJnMuZGF0YS5tb2RlPT09InByb3h5IiYmXy5qc3god2Mse29uQ2xpY2s6KCk9PnthPjA/dC5wb3N0Q29tbWl0KHtwYXRjaGVzOmV9KS50aGVuKGM9PntMby5pc0VycihjKT8oY29uc29sZS5lcnJvcihjLmVycm9yKSxhbGVydCgiQ291bGQgbm90IGNvbW1pdCBwYXRjaGVzOiAiK2MuZXJyb3IubWVzc2FnZSkpOihjb25zb2xlLmxvZygiQ29tbWl0dGVkIHBhdGNoZXM6ICIsYy52YWx1ZSksbigpKX0pOmFsZXJ0KCJObyBwYXRjaGVzIHRvIGNvbW1pdCIpfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUgaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSAtcmlnaHQtWzEwcHhdIC10b3AtWzEwcHhdIGJvcmRlciBib3JkZXItYm9yZGVyIHJvdW5kZWQtZnVsbCBweC0xIGZvbnQtc2FucyB0ZXh0LXhzIGJnLWNhcmQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmF9KSxfLmpzeChzNSx7c2l6ZToxOH0pXX0pfSksXy5qc3goImEiLHtjbGFzc05hbWU6enYsaHJlZjp0LmdldERpc2FibGVVcmwod2luZG93LmxvY2F0aW9uLmhyZWYpLGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpfLmpzeChsNSx7c2l6ZToxOH0pfSl9KV19KX1mdW5jdGlvbiAkeCh7aHJlZjp0LGNoaWxkcmVuOmV9KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBmb250LXNhbnMgYm9yZGVyLTIgcm91bmRlZC1mdWxsIGdhcC14LTMgdGV4dC1wcmltYXJ5IGJnLWJhY2tncm91bmQgYm9yZGVyLWZpbGwiLGNoaWxkcmVuOl8uanN4KCJhIix7Y2xhc3NOYW1lOnp2LGhyZWY6dCxjaGlsZHJlbjpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIGdhcC14LTIiLGNoaWxkcmVuOmV9KX0pfSl9ZnVuY3Rpb24gZDUoe2NoaWxkcmVuOnR9KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBweC0yIHB5LTIgZm9udC1zYW5zIGJvcmRlci0yIHJvdW5kZWQtZnVsbCBnYXAteC0zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIGJvcmRlci1maWxsIixjaGlsZHJlbjp0fSl9ZnVuY3Rpb24gd2Moe2FjdGl2ZTp0LG9uQ2xpY2s6ZSxjaGlsZHJlbjpufSl7cmV0dXJuIF8uanN4KCJidXR0b24iLHtjbGFzc05hbWU6X2YoenYseyJiZy1hY2NlbnQgZHJvcC1zaGFkb3ctWzBweF8wcHhfMTJweF9yZ2JhKDU2LDIwNSwxNTIsMC42MCldIjp0fSksb25DbGljazplLGNoaWxkcmVuOm59KX1mdW5jdGlvbiBmNSh0LGUpe2NvbnN0W24scl09cC51c2VTdGF0ZSh7fSksW2ksb109cC51c2VTdGF0ZSgwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LnN0YXR1cz09PSJzdWNjZXNzIiYmdC5kYXRhLm1vZGU9PT0icHJveHkiJiZlLmdldFBhdGNoZXMoe30pLnRoZW4obD0+e2lmKExvLmlzT2sobCkpe2NvbnN0IHM9e307Zm9yKGNvbnN0IGEgaW4gbC52YWx1ZSlzW2FdPWwudmFsdWVbYV0ubWFwKHU9PnUucGF0Y2hfaWQpO3Iocyl9ZWxzZSBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBwYXRjaGVzIixsLmVycm9yKX0pfSxbdCxpXSkse3BhdGNoZXM6bixzZXRQYXRjaFJlc2V0SWQ6b319ZnVuY3Rpb24gaDUodD0iZGFyayIpe2NvbnN0W2Usbl09cC51c2VTdGF0ZSh0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIik9PT0ibGlnaHQiP24oImxpZ2h0Iik6bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImRhcmsifHx3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzP24oImRhcmsiKTp3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIikubWF0Y2hlcyYmbigibGlnaHQiKTtjb25zdCByPWk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIil8fG4oaS5tYXRjaGVzPyJkYXJrIjoibGlnaHQiKX07cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKSwoKT0+e3dpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKX19LFtdKSxbZSxyPT57bG9jYWxTdG9yYWdlLnNldEl0ZW0oInZhbC10aGVtZSIsciksbihyKX1dfXZhciBEZTsoZnVuY3Rpb24odCl7dC5hc3NlcnRFcXVhbD1pPT5pO2Z1bmN0aW9uIGUoaSl7fXQuYXNzZXJ0SXM9ZTtmdW5jdGlvbiBuKGkpe3Rocm93IG5ldyBFcnJvcn10LmFzc2VydE5ldmVyPW4sdC5hcnJheVRvRW51bT1pPT57Y29uc3Qgbz17fTtmb3IoY29uc3QgbCBvZiBpKW9bbF09bDtyZXR1cm4gb30sdC5nZXRWYWxpZEVudW1WYWx1ZXM9aT0+e2NvbnN0IG89dC5vYmplY3RLZXlzKGkpLmZpbHRlcihzPT50eXBlb2YgaVtpW3NdXSE9Im51bWJlciIpLGw9e307Zm9yKGNvbnN0IHMgb2YgbylsW3NdPWlbc107cmV0dXJuIHQub2JqZWN0VmFsdWVzKGwpfSx0Lm9iamVjdFZhbHVlcz1pPT50Lm9iamVjdEtleXMoaSkubWFwKGZ1bmN0aW9uKG8pe3JldHVybiBpW29dfSksdC5vYmplY3RLZXlzPXR5cGVvZiBPYmplY3Qua2V5cz09ImZ1bmN0aW9uIj9pPT5PYmplY3Qua2V5cyhpKTppPT57Y29uc3Qgbz1bXTtmb3IoY29uc3QgbCBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLGwpJiZvLnB1c2gobCk7cmV0dXJuIG99LHQuZmluZD0oaSxvKT0+e2Zvcihjb25zdCBsIG9mIGkpaWYobyhsKSlyZXR1cm4gbH0sdC5pc0ludGVnZXI9dHlwZW9mIE51bWJlci5pc0ludGVnZXI9PSJmdW5jdGlvbiI/aT0+TnVtYmVyLmlzSW50ZWdlcihpKTppPT50eXBlb2YgaT09Im51bWJlciImJmlzRmluaXRlKGkpJiZNYXRoLmZsb29yKGkpPT09aTtmdW5jdGlvbiByKGksbz0iIHwgIil7cmV0dXJuIGkubWFwKGw9PnR5cGVvZiBsPT0ic3RyaW5nIj9gJyR7bH0nYDpsKS5qb2luKG8pfXQuam9pblZhbHVlcz1yLHQuanNvblN0cmluZ2lmeVJlcGxhY2VyPShpLG8pPT50eXBlb2Ygbz09ImJpZ2ludCI/by50b1N0cmluZygpOm99KShEZXx8KERlPXt9KSk7dmFyIElnOyhmdW5jdGlvbih0KXt0Lm1lcmdlU2hhcGVzPShlLG4pPT4oey4uLmUsLi4ubn0pfSkoSWd8fChJZz17fSkpO2NvbnN0IHE9RGUuYXJyYXlUb0VudW0oWyJzdHJpbmciLCJuYW4iLCJudW1iZXIiLCJpbnRlZ2VyIiwiZmxvYXQiLCJib29sZWFuIiwiZGF0ZSIsImJpZ2ludCIsInN5bWJvbCIsImZ1bmN0aW9uIiwidW5kZWZpbmVkIiwibnVsbCIsImFycmF5Iiwib2JqZWN0IiwidW5rbm93biIsInByb21pc2UiLCJ2b2lkIiwibmV2ZXIiLCJtYXAiLCJzZXQiXSksemk9dD0+e3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBxLnVuZGVmaW5lZDtjYXNlInN0cmluZyI6cmV0dXJuIHEuc3RyaW5nO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNOYU4odCk/cS5uYW46cS5udW1iZXI7Y2FzZSJib29sZWFuIjpyZXR1cm4gcS5ib29sZWFuO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBxLmZ1bmN0aW9uO2Nhc2UiYmlnaW50IjpyZXR1cm4gcS5iaWdpbnQ7Y2FzZSJzeW1ib2wiOnJldHVybiBxLnN5bWJvbDtjYXNlIm9iamVjdCI6cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cS5hcnJheTp0PT09bnVsbD9xLm51bGw6dC50aGVuJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiZ0LmNhdGNoJiZ0eXBlb2YgdC5jYXRjaD09ImZ1bmN0aW9uIj9xLnByb21pc2U6dHlwZW9mIE1hcDwidSImJnQgaW5zdGFuY2VvZiBNYXA/cS5tYXA6dHlwZW9mIFNldDwidSImJnQgaW5zdGFuY2VvZiBTZXQ/cS5zZXQ6dHlwZW9mIERhdGU8InUiJiZ0IGluc3RhbmNlb2YgRGF0ZT9xLmRhdGU6cS5vYmplY3Q7ZGVmYXVsdDpyZXR1cm4gcS51bmtub3dufX0sVj1EZS5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxwNT10PT5KU09OLnN0cmluZ2lmeSh0LG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyB3ciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5pc3N1ZXM9W10sdGhpcy5hZGRJc3N1ZT1yPT57dGhpcy5pc3N1ZXM9Wy4uLnRoaXMuaXNzdWVzLHJdfSx0aGlzLmFkZElzc3Vlcz0ocj1bXSk9Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsLi4ucl19O2NvbnN0IG49bmV3LnRhcmdldC5wcm90b3R5cGU7T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG4pOnRoaXMuX19wcm90b19fPW4sdGhpcy5uYW1lPSJab2RFcnJvciIsdGhpcy5pc3N1ZXM9ZX1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuaXNzdWVzfWZvcm1hdChlKXtjb25zdCBuPWV8fGZ1bmN0aW9uKG8pe3JldHVybiBvLm1lc3NhZ2V9LHI9e19lcnJvcnM6W119LGk9bz0+e2Zvcihjb25zdCBsIG9mIG8uaXNzdWVzKWlmKGwuY29kZT09PSJpbnZhbGlkX3VuaW9uIilsLnVuaW9uRXJyb3JzLm1hcChpKTtlbHNlIGlmKGwuY29kZT09PSJpbnZhbGlkX3JldHVybl90eXBlIilpKGwucmV0dXJuVHlwZUVycm9yKTtlbHNlIGlmKGwuY29kZT09PSJpbnZhbGlkX2FyZ3VtZW50cyIpaShsLmFyZ3VtZW50c0Vycm9yKTtlbHNlIGlmKGwucGF0aC5sZW5ndGg9PT0wKXIuX2Vycm9ycy5wdXNoKG4obCkpO2Vsc2V7bGV0IHM9cixhPTA7Zm9yKDthPGwucGF0aC5sZW5ndGg7KXtjb25zdCB1PWwucGF0aFthXTthPT09bC5wYXRoLmxlbmd0aC0xPyhzW3VdPXNbdV18fHtfZXJyb3JzOltdfSxzW3VdLl9lcnJvcnMucHVzaChuKGwpKSk6c1t1XT1zW3VdfHx7X2Vycm9yczpbXX0scz1zW3VdLGErK319fTtyZXR1cm4gaSh0aGlzKSxyfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMubWVzc2FnZX1nZXQgbWVzc2FnZSgpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcyxEZS5qc29uU3RyaW5naWZ5UmVwbGFjZXIsMil9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoPT09MH1mbGF0dGVuKGU9bj0+bi5tZXNzYWdlKXtjb25zdCBuPXt9LHI9W107Zm9yKGNvbnN0IGkgb2YgdGhpcy5pc3N1ZXMpaS5wYXRoLmxlbmd0aD4wPyhuW2kucGF0aFswXV09bltpLnBhdGhbMF1dfHxbXSxuW2kucGF0aFswXV0ucHVzaChlKGkpKSk6ci5wdXNoKGUoaSkpO3JldHVybntmb3JtRXJyb3JzOnIsZmllbGRFcnJvcnM6bn19Z2V0IGZvcm1FcnJvcnMoKXtyZXR1cm4gdGhpcy5mbGF0dGVuKCl9fXdyLmNyZWF0ZT10PT5uZXcgd3IodCk7Y29uc3QgZHU9KHQsZSk9PntsZXQgbjtzd2l0Y2godC5jb2RlKXtjYXNlIFYuaW52YWxpZF90eXBlOnQucmVjZWl2ZWQ9PT1xLnVuZGVmaW5lZD9uPSJSZXF1aXJlZCI6bj1gRXhwZWN0ZWQgJHt0LmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHt0LnJlY2VpdmVkfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfbGl0ZXJhbDpuPWBJbnZhbGlkIGxpdGVyYWwgdmFsdWUsIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkodC5leHBlY3RlZCxEZS5qc29uU3RyaW5naWZ5UmVwbGFjZXIpfWA7YnJlYWs7Y2FzZSBWLnVucmVjb2duaXplZF9rZXlzOm49YFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke0RlLmpvaW5WYWx1ZXModC5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfdW5pb246bj0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBWLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpuPWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7RGUuam9pblZhbHVlcyh0Lm9wdGlvbnMpfWA7YnJlYWs7Y2FzZSBWLmludmFsaWRfZW51bV92YWx1ZTpuPWBJbnZhbGlkIGVudW0gdmFsdWUuIEV4cGVjdGVkICR7RGUuam9pblZhbHVlcyh0Lm9wdGlvbnMpfSwgcmVjZWl2ZWQgJyR7dC5yZWNlaXZlZH0nYDticmVhaztjYXNlIFYuaW52YWxpZF9hcmd1bWVudHM6bj0iSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHMiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX3JldHVybl90eXBlOm49IkludmFsaWQgZnVuY3Rpb24gcmV0dXJuIHR5cGUiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX2RhdGU6bj0iSW52YWxpZCBkYXRlIjticmVhaztjYXNlIFYuaW52YWxpZF9zdHJpbmc6dHlwZW9mIHQudmFsaWRhdGlvbj09Im9iamVjdCI/ImluY2x1ZGVzImluIHQudmFsaWRhdGlvbj8obj1gSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlICIke3QudmFsaWRhdGlvbi5pbmNsdWRlc30iYCx0eXBlb2YgdC52YWxpZGF0aW9uLnBvc2l0aW9uPT0ibnVtYmVyIiYmKG49YCR7bn0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke3QudmFsaWRhdGlvbi5wb3NpdGlvbn1gKSk6InN0YXJ0c1dpdGgiaW4gdC52YWxpZGF0aW9uP249YEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCAiJHt0LnZhbGlkYXRpb24uc3RhcnRzV2l0aH0iYDoiZW5kc1dpdGgiaW4gdC52YWxpZGF0aW9uP249YEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggIiR7dC52YWxpZGF0aW9uLmVuZHNXaXRofSJgOkRlLmFzc2VydE5ldmVyKHQudmFsaWRhdGlvbik6dC52YWxpZGF0aW9uIT09InJlZ2V4Ij9uPWBJbnZhbGlkICR7dC52YWxpZGF0aW9ufWA6bj0iSW52YWxpZCI7YnJlYWs7Y2FzZSBWLnRvb19zbWFsbDp0LnR5cGU9PT0iYXJyYXkiP249YEFycmF5IG11c3QgY29udGFpbiAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7dC5taW5pbXVtfSBlbGVtZW50KHMpYDp0LnR5cGU9PT0ic3RyaW5nIj9uPWBTdHJpbmcgbXVzdCBjb250YWluICR7dC5leGFjdD8iZXhhY3RseSI6dC5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7dC5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnQudHlwZT09PSJudW1iZXIiP249YE51bWJlciBtdXN0IGJlICR7dC5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnQuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHt0Lm1pbmltdW19YDp0LnR5cGU9PT0iZGF0ZSI/bj1gRGF0ZSBtdXN0IGJlICR7dC5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnQuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIodC5taW5pbXVtKSl9YDpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFYudG9vX2JpZzp0LnR5cGU9PT0iYXJyYXkiP249YEFycmF5IG11c3QgY29udGFpbiAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHt0Lm1heGltdW19IGVsZW1lbnQocylgOnQudHlwZT09PSJzdHJpbmciP249YFN0cmluZyBtdXN0IGNvbnRhaW4gJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHt0Lm1heGltdW19IGNoYXJhY3RlcihzKWA6dC50eXBlPT09Im51bWJlciI/bj1gTnVtYmVyIG11c3QgYmUgJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHt0Lm1heGltdW19YDp0LnR5cGU9PT0iYmlnaW50Ij9uPWBCaWdJbnQgbXVzdCBiZSAke3QuZXhhY3Q/ImV4YWN0bHkiOnQuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3QubWF4aW11bX1gOnQudHlwZT09PSJkYXRlIj9uPWBEYXRlIG11c3QgYmUgJHt0LmV4YWN0PyJleGFjdGx5Ijp0LmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIodC5tYXhpbXVtKSl9YDpuPSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIFYuY3VzdG9tOm49IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgVi5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpuPSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIFYubm90X211bHRpcGxlX29mOm49YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHt0Lm11bHRpcGxlT2Z9YDticmVhaztjYXNlIFYubm90X2Zpbml0ZTpuPSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6bj1lLmRlZmF1bHRFcnJvcixEZS5hc3NlcnROZXZlcih0KX1yZXR1cm57bWVzc2FnZTpufX07bGV0ICRDPWR1O2Z1bmN0aW9uIGc1KHQpeyRDPXR9ZnVuY3Rpb24gRmQoKXtyZXR1cm4gJEN9Y29uc3QgQmQ9dD0+e2NvbnN0e2RhdGE6ZSxwYXRoOm4sZXJyb3JNYXBzOnIsaXNzdWVEYXRhOml9PXQsbz1bLi4ubiwuLi5pLnBhdGh8fFtdXSxsPXsuLi5pLHBhdGg6b307bGV0IHM9IiI7Y29uc3QgYT1yLmZpbHRlcih1PT4hIXUpLnNsaWNlKCkucmV2ZXJzZSgpO2Zvcihjb25zdCB1IG9mIGEpcz11KGwse2RhdGE6ZSxkZWZhdWx0RXJyb3I6c30pLm1lc3NhZ2U7cmV0dXJuey4uLmkscGF0aDpvLG1lc3NhZ2U6aS5tZXNzYWdlfHxzfX0sbTU9W107ZnVuY3Rpb24gdGUodCxlKXtjb25zdCBuPUJkKHtpc3N1ZURhdGE6ZSxkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLEZkKCksZHVdLmZpbHRlcihyPT4hIXIpfSk7dC5jb21tb24uaXNzdWVzLnB1c2gobil9Y2xhc3Mgb257Y29uc3RydWN0b3IoKXt0aGlzLnZhbHVlPSJ2YWxpZCJ9ZGlydHkoKXt0aGlzLnZhbHVlPT09InZhbGlkIiYmKHRoaXMudmFsdWU9ImRpcnR5Iil9YWJvcnQoKXt0aGlzLnZhbHVlIT09ImFib3J0ZWQiJiYodGhpcy52YWx1ZT0iYWJvcnRlZCIpfXN0YXRpYyBtZXJnZUFycmF5KGUsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtpZihpLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7aS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksci5wdXNoKGkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpyfX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLG4pe2NvbnN0IHI9W107Zm9yKGNvbnN0IGkgb2YgbilyLnB1c2goe2tleTphd2FpdCBpLmtleSx2YWx1ZTphd2FpdCBpLnZhbHVlfSk7cmV0dXJuIG9uLm1lcmdlT2JqZWN0U3luYyhlLHIpfXN0YXRpYyBtZXJnZU9iamVjdFN5bmMoZSxuKXtjb25zdCByPXt9O2Zvcihjb25zdCBpIG9mIG4pe2NvbnN0e2tleTpvLHZhbHVlOmx9PWk7aWYoby5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiB5ZTtvLnN0YXR1cz09PSJkaXJ0eSImJmUuZGlydHkoKSxsLnN0YXR1cz09PSJkaXJ0eSImJmUuZGlydHkoKSxvLnZhbHVlIT09Il9fcHJvdG9fXyImJih0eXBlb2YgbC52YWx1ZTwidSJ8fGkuYWx3YXlzU2V0KSYmKHJbby52YWx1ZV09bC52YWx1ZSl9cmV0dXJue3N0YXR1czplLnZhbHVlLHZhbHVlOnJ9fX1jb25zdCB5ZT1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksVEM9dD0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTp0fSkseW49dD0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTp0fSksRGc9dD0+dC5zdGF0dXM9PT0iYWJvcnRlZCIsamc9dD0+dC5zdGF0dXM9PT0iZGlydHkiLGZ1PXQ9PnQuc3RhdHVzPT09InZhbGlkIixVZD10PT50eXBlb2YgUHJvbWlzZTwidSImJnQgaW5zdGFuY2VvZiBQcm9taXNlO3ZhciBmZTsoZnVuY3Rpb24odCl7dC5lcnJUb09iaj1lPT50eXBlb2YgZT09InN0cmluZyI/e21lc3NhZ2U6ZX06ZXx8e30sdC50b1N0cmluZz1lPT50eXBlb2YgZT09InN0cmluZyI/ZTplPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2V9KShmZXx8KGZlPXt9KSk7Y2xhc3MgSHJ7Y29uc3RydWN0b3IoZSxuLHIsaSl7dGhpcy5fY2FjaGVkUGF0aD1bXSx0aGlzLnBhcmVudD1lLHRoaXMuZGF0YT1uLHRoaXMuX3BhdGg9cix0aGlzLl9rZXk9aX1nZXQgcGF0aCgpe3JldHVybiB0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aHx8KHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLC4uLnRoaXMuX2tleSk6dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsdGhpcy5fa2V5KSksdGhpcy5fY2FjaGVkUGF0aH19Y29uc3QgVHg9KHQsZSk9PntpZihmdShlKSlyZXR1cm57c3VjY2VzczohMCxkYXRhOmUudmFsdWV9O2lmKCF0LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC4iKTtyZXR1cm57c3VjY2VzczohMSxnZXQgZXJyb3IoKXtpZih0aGlzLl9lcnJvcilyZXR1cm4gdGhpcy5fZXJyb3I7Y29uc3Qgbj1uZXcgd3IodC5jb21tb24uaXNzdWVzKTtyZXR1cm4gdGhpcy5fZXJyb3I9bix0aGlzLl9lcnJvcn19fTtmdW5jdGlvbiB4ZSh0KXtpZighdClyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjpuLHJlcXVpcmVkX2Vycm9yOnIsZGVzY3JpcHRpb246aX09dDtpZihlJiYobnx8cikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246aX06e2Vycm9yTWFwOihsLHMpPT5sLmNvZGUhPT0iaW52YWxpZF90eXBlIj97bWVzc2FnZTpzLmRlZmF1bHRFcnJvcn06dHlwZW9mIHMuZGF0YT4idSI/e21lc3NhZ2U6cj8/cy5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOm4/P3MuZGVmYXVsdEVycm9yfSxkZXNjcmlwdGlvbjppfX1jbGFzcyBDZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIHppKGUuZGF0YSl9X2dldE9yUmV0dXJuQ3R4KGUsbil7cmV0dXJuIG58fHtjb21tb246ZS5wYXJlbnQuY29tbW9uLGRhdGE6ZS5kYXRhLHBhcnNlZFR5cGU6emkoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX1fcHJvY2Vzc0lucHV0UGFyYW1zKGUpe3JldHVybntzdGF0dXM6bmV3IG9uLGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOnppKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19fV9wYXJzZVN5bmMoZSl7Y29uc3Qgbj10aGlzLl9wYXJzZShlKTtpZihVZChuKSl0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7cmV0dXJuIG59X3BhcnNlQXN5bmMoZSl7Y29uc3Qgbj10aGlzLl9wYXJzZShlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfXBhcnNlKGUsbil7Y29uc3Qgcj10aGlzLnNhZmVQYXJzZShlLG4pO2lmKHIuc3VjY2VzcylyZXR1cm4gci5kYXRhO3Rocm93IHIuZXJyb3J9c2FmZVBhcnNlKGUsbil7dmFyIHI7Y29uc3QgaT17Y29tbW9uOntpc3N1ZXM6W10sYXN5bmM6KHI9bj09bnVsbD92b2lkIDA6bi5hc3luYykhPT1udWxsJiZyIT09dm9pZCAwP3I6ITEsY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOmUscGFyc2VkVHlwZTp6aShlKX0sbz10aGlzLl9wYXJzZVN5bmMoe2RhdGE6ZSxwYXRoOmkucGF0aCxwYXJlbnQ6aX0pO3JldHVybiBUeChpLG8pfWFzeW5jIHBhcnNlQXN5bmMoZSxuKXtjb25zdCByPWF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZSxuKTtpZihyLnN1Y2Nlc3MpcmV0dXJuIHIuZGF0YTt0aHJvdyByLmVycm9yfWFzeW5jIHNhZmVQYXJzZUFzeW5jKGUsbil7Y29uc3Qgcj17Y29tbW9uOntpc3N1ZXM6W10sY29udGV4dHVhbEVycm9yTWFwOm49PW51bGw/dm9pZCAwOm4uZXJyb3JNYXAsYXN5bmM6ITB9LHBhdGg6KG49PW51bGw/dm9pZCAwOm4ucGF0aCl8fFtdLHNjaGVtYUVycm9yTWFwOnRoaXMuX2RlZi5lcnJvck1hcCxwYXJlbnQ6bnVsbCxkYXRhOmUscGFyc2VkVHlwZTp6aShlKX0saT10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6ci5wYXRoLHBhcmVudDpyfSksbz1hd2FpdChVZChpKT9pOlByb21pc2UucmVzb2x2ZShpKSk7cmV0dXJuIFR4KHIsbyl9cmVmaW5lKGUsbil7Y29uc3Qgcj1pPT50eXBlb2Ygbj09InN0cmluZyJ8fHR5cGVvZiBuPiJ1Ij97bWVzc2FnZTpufTp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGkpOm47cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKGksbyk9Pntjb25zdCBsPWUoaSkscz0oKT0+by5hZGRJc3N1ZSh7Y29kZTpWLmN1c3RvbSwuLi5yKGkpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmbCBpbnN0YW5jZW9mIFByb21pc2U/bC50aGVuKGE9PmE/ITA6KHMoKSwhMSkpOmw/ITA6KHMoKSwhMSl9KX1yZWZpbmVtZW50KGUsbil7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsaSk9PmUocik/ITA6KGkuYWRkSXNzdWUodHlwZW9mIG49PSJmdW5jdGlvbiI/bihyLGkpOm4pLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBrcih7c2NoZW1hOnRoaXMsdHlwZU5hbWU6aGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InJlZmluZW1lbnQiLHJlZmluZW1lbnQ6ZX19KX1zdXBlclJlZmluZShlKXtyZXR1cm4gdGhpcy5fcmVmaW5lbWVudChlKX1vcHRpb25hbCgpe3JldHVybiBjaS5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIFFvLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9bnVsbGlzaCgpe3JldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKX1hcnJheSgpe3JldHVybiBTci5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfXByb21pc2UoKXtyZXR1cm4gcHMuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1vcihlKXtyZXR1cm4gbXUuY3JlYXRlKFt0aGlzLGVdLHRoaXMuX2RlZil9YW5kKGUpe3JldHVybiB2dS5jcmVhdGUodGhpcyxlLHRoaXMuX2RlZil9dHJhbnNmb3JtKGUpe3JldHVybiBuZXcga3Ioey4uLnhlKHRoaXMuX2RlZiksc2NoZW1hOnRoaXMsdHlwZU5hbWU6aGUuWm9kRWZmZWN0cyxlZmZlY3Q6e3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOmV9fSl9ZGVmYXVsdChlKXtjb25zdCBuPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6KCk9PmU7cmV0dXJuIG5ldyBTdSh7Li4ueGUodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6bix0eXBlTmFtZTpoZS5ab2REZWZhdWx0fSl9YnJhbmQoKXtyZXR1cm4gbmV3IFJDKHt0eXBlTmFtZTpoZS5ab2RCcmFuZGVkLHR5cGU6dGhpcywuLi54ZSh0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3Qgbj10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgS2Qoey4uLnhlKHRoaXMuX2RlZiksaW5uZXJUeXBlOnRoaXMsY2F0Y2hWYWx1ZTpuLHR5cGVOYW1lOmhlLlpvZENhdGNofSl9ZGVzY3JpYmUoZSl7Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBuZXcgbih7Li4udGhpcy5fZGVmLGRlc2NyaXB0aW9uOmV9KX1waXBlKGUpe3JldHVybiBVdS5jcmVhdGUodGhpcyxlKX1yZWFkb25seSgpe3JldHVybiBHZC5jcmVhdGUodGhpcyl9aXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9aXNOdWxsYWJsZSgpe3JldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzfX1jb25zdCB2NT0vXmNbXlxzLV17OCx9JC9pLHk1PS9eW2Etel1bYS16MC05XSokLyx4NT0vXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLyxfNT0vXlswLTlhLWZBLUZdezh9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17MTJ9JC9pLHc1PS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XystXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2ksUzU9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2xldCB6aDtjb25zdCBFNT0vXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC8sQzU9L14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLyxrNT10PT50LnByZWNpc2lvbj90Lm9mZnNldD9uZXcgUmVnRXhwKGBeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7JHt0LnByZWNpc2lvbn19KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJGApOm5ldyBSZWdFeHAoYF5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHske3QucHJlY2lzaW9ufX1aJGApOnQucHJlY2lzaW9uPT09MD90Lm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oKFsrLV1cXGR7Mn0oOj9cXGR7Mn0pPyl8WikkIik6bmV3IFJlZ0V4cCgiXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9WiQiKTp0Lm9mZnNldD9uZXcgUmVnRXhwKCJeXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkKyk/KChbKy1dXFxkezJ9KDo/XFxkezJ9KT8pfFopJCIpOm5ldyBSZWdFeHAoIl5cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGQrKT9aJCIpO2Z1bmN0aW9uIGI1KHQsZSl7cmV0dXJuISEoKGU9PT0idjQifHwhZSkmJkU1LnRlc3QodCl8fChlPT09InY2Inx8IWUpJiZDNS50ZXN0KHQpKX1jbGFzcyB5ciBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09cS5zdHJpbmcpe2NvbnN0IG89dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKG8se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5zdHJpbmcscmVjZWl2ZWQ6by5wYXJzZWRUeXBlfSkseWV9Y29uc3Qgcj1uZXcgb247bGV0IGk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fZGVmLmNoZWNrcylpZihvLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPG8udmFsdWUmJihpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpO2Vsc2UgaWYoby5raW5kPT09Im1heCIpZS5kYXRhLmxlbmd0aD5vLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fYmlnLG1heGltdW06by52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0ibGVuZ3RoIil7Y29uc3QgbD1lLmRhdGEubGVuZ3RoPm8udmFsdWUscz1lLmRhdGEubGVuZ3RoPG8udmFsdWU7KGx8fHMpJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLGw/dGUoaSx7Y29kZTpWLnRvb19iaWcsbWF4aW11bTpvLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6by5tZXNzYWdlfSk6cyYmdGUoaSx7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOm8udmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITAsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpfWVsc2UgaWYoby5raW5kPT09ImVtYWlsIil3NS50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoiZW1haWwiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iZW1vamkiKXpofHwoemg9bmV3IFJlZ0V4cChTNSwidSIpKSx6aC50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0idXVpZCIpXzUudGVzdChlLmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246InV1aWQiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZCIpdjUudGVzdChlLmRhdGEpfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246ImN1aWQiLGNvZGU6Vi5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk7ZWxzZSBpZihvLmtpbmQ9PT0iY3VpZDIiKXk1LnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1bGlkIil4NS50ZXN0KGUuZGF0YSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7dmFsaWRhdGlvbjoidWxpZCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTtlbHNlIGlmKG8ua2luZD09PSJ1cmwiKXRyeXtuZXcgVVJMKGUuZGF0YSl9Y2F0Y2h7aT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246InVybCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpfWVsc2Ugby5raW5kPT09InJlZ2V4Ij8oby5yZWdleC5sYXN0SW5kZXg9MCxvLnJlZ2V4LnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpWLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKSk6by5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOm8ua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKG8udmFsdWUsby5wb3NpdGlvbil8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2luY2x1ZGVzOm8udmFsdWUscG9zaXRpb246by5wb3NpdGlvbn0sbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOm8ua2luZD09PSJ0b0xvd2VyQ2FzZSI/ZS5kYXRhPWUuZGF0YS50b0xvd2VyQ2FzZSgpOm8ua2luZD09PSJ0b1VwcGVyQ2FzZSI/ZS5kYXRhPWUuZGF0YS50b1VwcGVyQ2FzZSgpOm8ua2luZD09PSJzdGFydHNXaXRoIj9lLmRhdGEuc3RhcnRzV2l0aChvLnZhbHVlKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHtjb2RlOlYuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7c3RhcnRzV2l0aDpvLnZhbHVlfSxtZXNzYWdlOm8ubWVzc2FnZX0pLHIuZGlydHkoKSk6by5raW5kPT09ImVuZHNXaXRoIj9lLmRhdGEuZW5kc1dpdGgoby52YWx1ZSl8fChpPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsaSksdGUoaSx7Y29kZTpWLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOm8udmFsdWV9LG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0iZGF0ZXRpbWUiP2s1KG8pLnRlc3QoZS5kYXRhKXx8KGk9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxpKSx0ZShpLHtjb2RlOlYuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZXRpbWUiLG1lc3NhZ2U6by5tZXNzYWdlfSksci5kaXJ0eSgpKTpvLmtpbmQ9PT0iaXAiP2I1KGUuZGF0YSxvLnZlcnNpb24pfHwoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse3ZhbGlkYXRpb246ImlwIixjb2RlOlYuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTpvLm1lc3NhZ2V9KSxyLmRpcnR5KCkpOkRlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLG4scil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChpPT5lLnRlc3QoaSkse3ZhbGlkYXRpb246bixjb2RlOlYuaW52YWxpZF9zdHJpbmcsLi4uZmUuZXJyVG9PYmoocil9KX1fYWRkQ2hlY2soZSl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfWVtYWlsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1haWwiLC4uLmZlLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5mZS5lcnJUb09iaihlKX0pfWVtb2ppKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZW1vamkiLC4uLmZlLmVyclRvT2JqKGUpfSl9dXVpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InV1aWQiLC4uLmZlLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLmZlLmVyclRvT2JqKGUpfSl9Y3VpZDIoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJjdWlkMiIsLi4uZmUuZXJyVG9PYmooZSl9KX11bGlkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidWxpZCIsLi4uZmUuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5mZS5lcnJUb09iaihlKX0pfWRhdGV0aW1lKGUpe3ZhciBuO3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246bnVsbCxvZmZzZXQ6ITEsbWVzc2FnZTplfSk6dGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImRhdGV0aW1lIixwcmVjaXNpb246dHlwZW9mKGU9PW51bGw/dm9pZCAwOmUucHJlY2lzaW9uKT4idSI/bnVsbDplPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbixvZmZzZXQ6KG49ZT09bnVsbD92b2lkIDA6ZS5vZmZzZXQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOiExLC4uLmZlLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1yZWdleChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoicmVnZXgiLHJlZ2V4OmUsLi4uZmUuZXJyVG9PYmoobil9KX1pbmNsdWRlcyhlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW5jbHVkZXMiLHZhbHVlOmUscG9zaXRpb246bj09bnVsbD92b2lkIDA6bi5wb3NpdGlvbiwuLi5mZS5lcnJUb09iaihuPT1udWxsP3ZvaWQgMDpuLm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfWVuZHNXaXRoKGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbmRzV2l0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfW1pbihlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTplLC4uLmZlLmVyclRvT2JqKG4pfSl9bWF4KGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4uZmUuZXJyVG9PYmoobil9KX1sZW5ndGgoZSxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Imxlbmd0aCIsdmFsdWU6ZSwuLi5mZS5lcnJUb09iaihuKX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGZlLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidHJpbSJ9XX0pfXRvTG93ZXJDYXNlKCl7cmV0dXJuIG5ldyB5cih7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDoidG9Mb3dlckNhc2UifV19KX10b1VwcGVyQ2FzZSgpe3JldHVybiBuZXcgeXIoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNFbWFpbCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJlbWFpbCIpfWdldCBpc1VSTCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1cmwiKX1nZXQgaXNFbW9qaSgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJlbW9qaSIpfWdldCBpc1VVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0idXVpZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgbWluTGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYoZT09PW51bGx8fG4udmFsdWU+ZSkmJihlPW4udmFsdWUpO3JldHVybiBlfWdldCBtYXhMZW5ndGgoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJihlPT09bnVsbHx8bi52YWx1ZTxlKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGV9fXlyLmNyZWF0ZT10PT57dmFyIGU7cmV0dXJuIG5ldyB5cih7Y2hlY2tzOltdLHR5cGVOYW1lOmhlLlpvZFN0cmluZyxjb2VyY2U6KGU9dD09bnVsbD92b2lkIDA6dC5jb2VyY2UpIT09bnVsbCYmZSE9PXZvaWQgMD9lOiExLC4uLnhlKHQpfSl9O2Z1bmN0aW9uICQ1KHQsZSl7Y29uc3Qgbj0odC50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsaT1uPnI/bjpyLG89cGFyc2VJbnQodC50b0ZpeGVkKGkpLnJlcGxhY2UoIi4iLCIiKSksbD1wYXJzZUludChlLnRvRml4ZWQoaSkucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gbyVsL01hdGgucG93KDEwLGkpfWNsYXNzIGFvIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubWluPXRoaXMuZ3RlLHRoaXMubWF4PXRoaXMubHRlLHRoaXMuc3RlcD10aGlzLm11bHRpcGxlT2Z9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9TnVtYmVyKGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1xLm51bWJlcil7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUobyx7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm51bWJlcixyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSx5ZX1sZXQgcjtjb25zdCBpPW5ldyBvbjtmb3IoY29uc3QgbyBvZiB0aGlzLl9kZWYuY2hlY2tzKW8ua2luZD09PSJpbnQiP0RlLmlzSW50ZWdlcihlLmRhdGEpfHwocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6ImludGVnZXIiLHJlY2VpdmVkOiJmbG9hdCIsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtaW4iPyhvLmluY2x1c2l2ZT9lLmRhdGE8by52YWx1ZTplLmRhdGE8PW8udmFsdWUpJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi50b29fc21hbGwsbWluaW11bTpvLnZhbHVlLHR5cGU6Im51bWJlciIsaW5jbHVzaXZlOm8uaW5jbHVzaXZlLGV4YWN0OiExLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0ibWF4Ij8oby5pbmNsdXNpdmU/ZS5kYXRhPm8udmFsdWU6ZS5kYXRhPj1vLnZhbHVlKSYmKHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxyKSx0ZShyLHtjb2RlOlYudG9vX2JpZyxtYXhpbXVtOm8udmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6by5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtdWx0aXBsZU9mIj8kNShlLmRhdGEsby52YWx1ZSkhPT0wJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5ub3RfbXVsdGlwbGVfb2YsbXVsdGlwbGVPZjpvLnZhbHVlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpvLmtpbmQ9PT0iZmluaXRlIj9OdW1iZXIuaXNGaW5pdGUoZS5kYXRhKXx8KHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxyKSx0ZShyLHtjb2RlOlYubm90X2Zpbml0ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6RGUuYXNzZXJ0TmV2ZXIobyk7cmV0dXJue3N0YXR1czppLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxmZS50b1N0cmluZyhuKSl9Z3QoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCExLGZlLnRvU3RyaW5nKG4pKX1sdGUoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLGZlLnRvU3RyaW5nKG4pKX1sdChlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEsZmUudG9TdHJpbmcobikpfXNldExpbWl0KGUsbixyLGkpe3JldHVybiBuZXcgYW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTpuLGluY2x1c2l2ZTpyLG1lc3NhZ2U6ZmUudG9TdHJpbmcoaSl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IGFvKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLGVdfSl9aW50KGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiaW50IixtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9cG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiExLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bm9ubmVnYXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtaW4iLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsbil7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6ZmUudG9TdHJpbmcobil9KX1maW5pdGUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJmaW5pdGUiLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1zYWZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfWdldCBtaW5WYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHxuLnZhbHVlPmUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4VmFsdWUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1heCImJihlPT09bnVsbHx8bi52YWx1ZTxlKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGV9Z2V0IGlzSW50KCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImludCJ8fGUua2luZD09PSJtdWx0aXBsZU9mIiYmRGUuaXNJbnRlZ2VyKGUudmFsdWUpKX1nZXQgaXNGaW5pdGUoKXtsZXQgZT1udWxsLG49bnVsbDtmb3IoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKXtpZihyLmtpbmQ9PT0iZmluaXRlInx8ci5raW5kPT09ImludCJ8fHIua2luZD09PSJtdWx0aXBsZU9mIilyZXR1cm4hMDtyLmtpbmQ9PT0ibWluIj8obj09PW51bGx8fHIudmFsdWU+bikmJihuPXIudmFsdWUpOnIua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHIudmFsdWU8ZSkmJihlPXIudmFsdWUpfXJldHVybiBOdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZShlKX19YW8uY3JlYXRlPXQ9Pm5ldyBhbyh7Y2hlY2tzOltdLHR5cGVOYW1lOmhlLlpvZE51bWJlcixjb2VyY2U6KHQ9PW51bGw/dm9pZCAwOnQuY29lcmNlKXx8ITEsLi4ueGUodCl9KTtjbGFzcyB1byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZX1fcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1CaWdJbnQoZS5kYXRhKSksdGhpcy5fZ2V0VHlwZShlKSE9PXEuYmlnaW50KXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShvLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuYmlnaW50LHJlY2VpdmVkOm8ucGFyc2VkVHlwZX0pLHllfWxldCByO2NvbnN0IGk9bmV3IG9uO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09Im1pbiI/KG8uaW5jbHVzaXZlP2UuZGF0YTxvLnZhbHVlOmUuZGF0YTw9by52YWx1ZSkmJihyPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsciksdGUocix7Y29kZTpWLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06by52YWx1ZSxpbmNsdXNpdmU6by5pbmNsdXNpdmUsbWVzc2FnZTpvLm1lc3NhZ2V9KSxpLmRpcnR5KCkpOm8ua2luZD09PSJtYXgiPyhvLmluY2x1c2l2ZT9lLmRhdGE+by52YWx1ZTplLmRhdGE+PW8udmFsdWUpJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi50b29fYmlnLHR5cGU6ImJpZ2ludCIsbWF4aW11bTpvLnZhbHVlLGluY2x1c2l2ZTpvLmluY2x1c2l2ZSxtZXNzYWdlOm8ubWVzc2FnZX0pLGkuZGlydHkoKSk6by5raW5kPT09Im11bHRpcGxlT2YiP2UuZGF0YSVvLnZhbHVlIT09QmlnSW50KDApJiYocj10aGlzLl9nZXRPclJldHVybkN0eChlLHIpLHRlKHIse2NvZGU6Vi5ub3RfbXVsdGlwbGVfb2YsbXVsdGlwbGVPZjpvLnZhbHVlLG1lc3NhZ2U6by5tZXNzYWdlfSksaS5kaXJ0eSgpKTpEZS5hc3NlcnROZXZlcihvKTtyZXR1cm57c3RhdHVzOmkudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSxuKXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLGZlLnRvU3RyaW5nKG4pKX1ndChlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEsZmUudG9TdHJpbmcobikpfWx0ZShlLG4pe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITAsZmUudG9TdHJpbmcobikpfWx0KGUsbil7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxmZS50b1N0cmluZyhuKSl9c2V0TGltaXQoZSxuLHIsaSl7cmV0dXJuIG5ldyB1byh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyx7a2luZDplLHZhbHVlOm4saW5jbHVzaXZlOnIsbWVzc2FnZTpmZS50b1N0cmluZyhpKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgdW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1wb3NpdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMSxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bmVnYXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOkJpZ0ludCgwKSxpbmNsdXNpdmU6ITEsbWVzc2FnZTpmZS50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6ZmUudG9TdHJpbmcoZSl9KX1ub25uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6QmlnSW50KDApLGluY2x1c2l2ZTohMCxtZXNzYWdlOmZlLnRvU3RyaW5nKGUpfSl9bXVsdGlwbGVPZihlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibXVsdGlwbGVPZiIsdmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYuY2hlY2tzKW4ua2luZD09PSJtaW4iJiYoZT09PW51bGx8fG4udmFsdWU+ZSkmJihlPW4udmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZX19dW8uY3JlYXRlPXQ9Pnt2YXIgZTtyZXR1cm4gbmV3IHVvKHtjaGVja3M6W10sdHlwZU5hbWU6aGUuWm9kQmlnSW50LGNvZXJjZTooZT10PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4ueGUodCl9KX07Y2xhc3MgaHUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT0hIWUuZGF0YSksdGhpcy5fZ2V0VHlwZShlKSE9PXEuYm9vbGVhbil7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLmJvb2xlYW4scmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fWh1LmNyZWF0ZT10PT5uZXcgaHUoe3R5cGVOYW1lOmhlLlpvZEJvb2xlYW4sY29lcmNlOih0PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSl8fCExLC4uLnhlKHQpfSk7Y2xhc3MgWW8gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09cS5kYXRlKXtjb25zdCBvPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShvLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuZGF0ZSxyZWNlaXZlZDpvLnBhcnNlZFR5cGV9KSx5ZX1pZihpc05hTihlLmRhdGEuZ2V0VGltZSgpKSl7Y29uc3Qgbz10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUobyx7Y29kZTpWLmludmFsaWRfZGF0ZX0pLHllfWNvbnN0IHI9bmV3IG9uO2xldCBpO2Zvcihjb25zdCBvIG9mIHRoaXMuX2RlZi5jaGVja3Mpby5raW5kPT09Im1pbiI/ZS5kYXRhLmdldFRpbWUoKTxvLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fc21hbGwsbWVzc2FnZTpvLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06by52YWx1ZSx0eXBlOiJkYXRlIn0pLHIuZGlydHkoKSk6by5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5vLnZhbHVlJiYoaT10aGlzLl9nZXRPclJldHVybkN0eChlLGkpLHRlKGkse2NvZGU6Vi50b29fYmlnLG1lc3NhZ2U6by5tZXNzYWdlLGluY2x1c2l2ZTohMCxleGFjdDohMSxtYXhpbXVtOm8udmFsdWUsdHlwZToiZGF0ZSJ9KSxyLmRpcnR5KCkpOkRlLmFzc2VydE5ldmVyKG8pO3JldHVybntzdGF0dXM6ci52YWx1ZSx2YWx1ZTpuZXcgRGF0ZShlLmRhdGEuZ2V0VGltZSgpKX19X2FkZENoZWNrKGUpe3JldHVybiBuZXcgWW8oey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSxuKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpmZS50b1N0cmluZyhuKX0pfW1heChlLG4pe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTplLmdldFRpbWUoKSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfSl9Z2V0IG1pbkRhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi5jaGVja3Mpbi5raW5kPT09Im1pbiImJihlPT09bnVsbHx8bi52YWx1ZT5lKSYmKGU9bi52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH1nZXQgbWF4RGF0ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyluLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKTtyZXR1cm4gZSE9bnVsbD9uZXcgRGF0ZShlKTpudWxsfX1Zby5jcmVhdGU9dD0+bmV3IFlvKHtjaGVja3M6W10sY29lcmNlOih0PT1udWxsP3ZvaWQgMDp0LmNvZXJjZSl8fCExLHR5cGVOYW1lOmhlLlpvZERhdGUsLi4ueGUodCl9KTtjbGFzcyBXZCBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09cS5zeW1ib2wpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5zeW1ib2wscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fVdkLmNyZWF0ZT10PT5uZXcgV2Qoe3R5cGVOYW1lOmhlLlpvZFN5bWJvbCwuLi54ZSh0KX0pO2NsYXNzIHB1IGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLnVuZGVmaW5lZCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnVuZGVmaW5lZCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZX1yZXR1cm4geW4oZS5kYXRhKX19cHUuY3JlYXRlPXQ9Pm5ldyBwdSh7dHlwZU5hbWU6aGUuWm9kVW5kZWZpbmVkLC4uLnhlKHQpfSk7Y2xhc3MgZ3UgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PXEubnVsbCl7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm51bGwscmVjZWl2ZWQ6ci5wYXJzZWRUeXBlfSkseWV9cmV0dXJuIHluKGUuZGF0YSl9fWd1LmNyZWF0ZT10PT5uZXcgZ3Uoe3R5cGVOYW1lOmhlLlpvZE51bGwsLi4ueGUodCl9KTtjbGFzcyBocyBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9hbnk9ITB9X3BhcnNlKGUpe3JldHVybiB5bihlLmRhdGEpfX1ocy5jcmVhdGU9dD0+bmV3IGhzKHt0eXBlTmFtZTpoZS5ab2RBbnksLi4ueGUodCl9KTtjbGFzcyB6byBleHRlbmRzIENle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4geW4oZS5kYXRhKX19em8uY3JlYXRlPXQ9Pm5ldyB6byh7dHlwZU5hbWU6aGUuWm9kVW5rbm93biwuLi54ZSh0KX0pO2NsYXNzIGdpIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKG4se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5uZXZlcixyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSx5ZX19Z2kuY3JlYXRlPXQ9Pm5ldyBnaSh7dHlwZU5hbWU6aGUuWm9kTmV2ZXIsLi4ueGUodCl9KTtjbGFzcyBWZCBleHRlbmRzIENle19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09cS51bmRlZmluZWQpe2NvbnN0IHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIHRlKHIse2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS52b2lkLHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLHllfXJldHVybiB5bihlLmRhdGEpfX1WZC5jcmVhdGU9dD0+bmV3IFZkKHt0eXBlTmFtZTpoZS5ab2RWb2lkLC4uLnhlKHQpfSk7Y2xhc3MgU3IgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7Y3R4Om4sc3RhdHVzOnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxpPXRoaXMuX2RlZjtpZihuLnBhcnNlZFR5cGUhPT1xLmFycmF5KXJldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuYXJyYXkscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7aWYoaS5leGFjdExlbmd0aCE9PW51bGwpe2NvbnN0IGw9bi5kYXRhLmxlbmd0aD5pLmV4YWN0TGVuZ3RoLnZhbHVlLHM9bi5kYXRhLmxlbmd0aDxpLmV4YWN0TGVuZ3RoLnZhbHVlOyhsfHxzKSYmKHRlKG4se2NvZGU6bD9WLnRvb19iaWc6Vi50b29fc21hbGwsbWluaW11bTpzP2kuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06bD9pLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6aS5leGFjdExlbmd0aC5tZXNzYWdlfSksci5kaXJ0eSgpKX1pZihpLm1pbkxlbmd0aCE9PW51bGwmJm4uZGF0YS5sZW5ndGg8aS5taW5MZW5ndGgudmFsdWUmJih0ZShuLHtjb2RlOlYudG9vX3NtYWxsLG1pbmltdW06aS5taW5MZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWluTGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLGkubWF4TGVuZ3RoIT09bnVsbCYmbi5kYXRhLmxlbmd0aD5pLm1heExlbmd0aC52YWx1ZSYmKHRlKG4se2NvZGU6Vi50b29fYmlnLG1heGltdW06aS5tYXhMZW5ndGgudmFsdWUsdHlwZToiYXJyYXkiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmkubWF4TGVuZ3RoLm1lc3NhZ2V9KSxyLmRpcnR5KCkpLG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLmFsbChbLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VBc3luYyhuZXcgSHIobixsLG4ucGF0aCxzKSkpKS50aGVuKGw9Pm9uLm1lcmdlQXJyYXkocixsKSk7Y29uc3Qgbz1bLi4ubi5kYXRhXS5tYXAoKGwscyk9PmkudHlwZS5fcGFyc2VTeW5jKG5ldyBIcihuLGwsbi5wYXRoLHMpKSk7cmV0dXJuIG9uLm1lcmdlQXJyYXkocixvKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSxuKXtyZXR1cm4gbmV3IFNyKHsuLi50aGlzLl9kZWYsbWluTGVuZ3RoOnt2YWx1ZTplLG1lc3NhZ2U6ZmUudG9TdHJpbmcobil9fSl9bWF4KGUsbil7cmV0dXJuIG5ldyBTcih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfWxlbmd0aChlLG4pe3JldHVybiBuZXcgU3Ioey4uLnRoaXMuX2RlZixleGFjdExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1Tci5jcmVhdGU9KHQsZSk9Pm5ldyBTcih7dHlwZTp0LG1pbkxlbmd0aDpudWxsLG1heExlbmd0aDpudWxsLGV4YWN0TGVuZ3RoOm51bGwsdHlwZU5hbWU6aGUuWm9kQXJyYXksLi4ueGUoZSl9KTtmdW5jdGlvbiBrbCh0KXtpZih0IGluc3RhbmNlb2YgY3Qpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdC5zaGFwZSl7Y29uc3Qgcj10LnNoYXBlW25dO2Vbbl09Y2kuY3JlYXRlKGtsKHIpKX1yZXR1cm4gbmV3IGN0KHsuLi50Ll9kZWYsc2hhcGU6KCk9PmV9KX1lbHNlIHJldHVybiB0IGluc3RhbmNlb2YgU3I/bmV3IFNyKHsuLi50Ll9kZWYsdHlwZTprbCh0LmVsZW1lbnQpfSk6dCBpbnN0YW5jZW9mIGNpP2NpLmNyZWF0ZShrbCh0LnVud3JhcCgpKSk6dCBpbnN0YW5jZW9mIFFvP1FvLmNyZWF0ZShrbCh0LnVud3JhcCgpKSk6dCBpbnN0YW5jZW9mIEtyP0tyLmNyZWF0ZSh0Lml0ZW1zLm1hcChlPT5rbChlKSkpOnR9Y2xhc3MgY3QgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fY2FjaGVkPW51bGwsdGhpcy5ub25zdHJpY3Q9dGhpcy5wYXNzdGhyb3VnaCx0aGlzLmF1Z21lbnQ9dGhpcy5leHRlbmR9X2dldENhY2hlZCgpe2lmKHRoaXMuX2NhY2hlZCE9PW51bGwpcmV0dXJuIHRoaXMuX2NhY2hlZDtjb25zdCBlPXRoaXMuX2RlZi5zaGFwZSgpLG49RGUub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6bn19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUodSx7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm9iamVjdCxyZWNlaXZlZDp1LnBhcnNlZFR5cGV9KSx5ZX1jb25zdHtzdGF0dXM6cixjdHg6aX09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHtzaGFwZTpvLGtleXM6bH09dGhpcy5fZ2V0Q2FjaGVkKCkscz1bXTtpZighKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIGdpJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBpLmRhdGEpbC5pbmNsdWRlcyh1KXx8cy5wdXNoKHUpO2NvbnN0IGE9W107Zm9yKGNvbnN0IHUgb2YgbCl7Y29uc3QgYz1vW3VdLGQ9aS5kYXRhW3VdO2EucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpjLl9wYXJzZShuZXcgSHIoaSxkLGkucGF0aCx1KSksYWx3YXlzU2V0OnUgaW4gaS5kYXRhfSl9aWYodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgZ2kpe2NvbnN0IHU9dGhpcy5fZGVmLnVua25vd25LZXlzO2lmKHU9PT0icGFzc3Rocm91Z2giKWZvcihjb25zdCBjIG9mIHMpYS5wdXNoKHtrZXk6e3N0YXR1czoidmFsaWQiLHZhbHVlOmN9LHZhbHVlOntzdGF0dXM6InZhbGlkIix2YWx1ZTppLmRhdGFbY119fSk7ZWxzZSBpZih1PT09InN0cmljdCIpcy5sZW5ndGg+MCYmKHRlKGkse2NvZGU6Vi51bnJlY29nbml6ZWRfa2V5cyxrZXlzOnN9KSxyLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgYyBvZiBzKXtjb25zdCBkPWkuZGF0YVtjXTthLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6Y30sdmFsdWU6dS5fcGFyc2UobmV3IEhyKGksZCxpLnBhdGgsYykpLGFsd2F5c1NldDpjIGluIGkuZGF0YX0pfX1yZXR1cm4gaS5jb21tb24uYXN5bmM/UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYygpPT57Y29uc3QgdT1bXTtmb3IoY29uc3QgYyBvZiBhKXtjb25zdCBkPWF3YWl0IGMua2V5O3UucHVzaCh7a2V5OmQsdmFsdWU6YXdhaXQgYy52YWx1ZSxhbHdheXNTZXQ6Yy5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+b24ubWVyZ2VPYmplY3RTeW5jKHIsdSkpOm9uLm1lcmdlT2JqZWN0U3luYyhyLGEpfWdldCBzaGFwZSgpe3JldHVybiB0aGlzLl9kZWYuc2hhcGUoKX1zdHJpY3QoZSl7cmV0dXJuIGZlLmVyclRvT2JqLG5ldyBjdCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpY3QiLC4uLmUhPT12b2lkIDA/e2Vycm9yTWFwOihuLHIpPT57dmFyIGksbyxsLHM7Y29uc3QgYT0obD0obz0oaT10aGlzLl9kZWYpLmVycm9yTWFwKT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8uY2FsbChpLG4scikubWVzc2FnZSkhPT1udWxsJiZsIT09dm9pZCAwP2w6ci5kZWZhdWx0RXJyb3I7cmV0dXJuIG4uY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyI/e21lc3NhZ2U6KHM9ZmUuZXJyVG9PYmooZSkubWVzc2FnZSkhPT1udWxsJiZzIT09dm9pZCAwP3M6YX06e21lc3NhZ2U6YX19fTp7fX0pfXN0cmlwKCl7cmV0dXJuIG5ldyBjdCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZix1bmtub3duS2V5czoicGFzc3Rocm91Z2gifSl9ZXh0ZW5kKGUpe3JldHVybiBuZXcgY3Qoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+KHsuLi50aGlzLl9kZWYuc2hhcGUoKSwuLi5lfSl9KX1tZXJnZShlKXtyZXR1cm4gbmV3IGN0KHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6aGUuWm9kT2JqZWN0fSl9c2V0S2V5KGUsbil7cmV0dXJuIHRoaXMuYXVnbWVudCh7W2VdOm59KX1jYXRjaGFsbChlKXtyZXR1cm4gbmV3IGN0KHsuLi50aGlzLl9kZWYsY2F0Y2hhbGw6ZX0pfXBpY2soZSl7Y29uc3Qgbj17fTtyZXR1cm4gRGUub2JqZWN0S2V5cyhlKS5mb3JFYWNoKHI9PntlW3JdJiZ0aGlzLnNoYXBlW3JdJiYobltyXT10aGlzLnNoYXBlW3JdKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9b21pdChlKXtjb25zdCBuPXt9O3JldHVybiBEZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2gocj0+e2Vbcl18fChuW3JdPXRoaXMuc2hhcGVbcl0pfSksbmV3IGN0KHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pm59KX1kZWVwUGFydGlhbCgpe3JldHVybiBrbCh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IG49e307cmV0dXJuIERlLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaChyPT57Y29uc3QgaT10aGlzLnNoYXBlW3JdO2UmJiFlW3JdP25bcl09aTpuW3JdPWkub3B0aW9uYWwoKX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9cmVxdWlyZWQoZSl7Y29uc3Qgbj17fTtyZXR1cm4gRGUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKHI9PntpZihlJiYhZVtyXSluW3JdPXRoaXMuc2hhcGVbcl07ZWxzZXtsZXQgbz10aGlzLnNoYXBlW3JdO2Zvcig7byBpbnN0YW5jZW9mIGNpOylvPW8uX2RlZi5pbm5lclR5cGU7bltyXT1vfX0pLG5ldyBjdCh7Li4udGhpcy5fZGVmLHNoYXBlOigpPT5ufSl9a2V5b2YoKXtyZXR1cm4gTkMoRGUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fWN0LmNyZWF0ZT0odCxlKT0+bmV3IGN0KHtzaGFwZTooKT0+dCx1bmtub3duS2V5czoic3RyaXAiLGNhdGNoYWxsOmdpLmNyZWF0ZSgpLHR5cGVOYW1lOmhlLlpvZE9iamVjdCwuLi54ZShlKX0pO2N0LnN0cmljdENyZWF0ZT0odCxlKT0+bmV3IGN0KHtzaGFwZTooKT0+dCx1bmtub3duS2V5czoic3RyaWN0IixjYXRjaGFsbDpnaS5jcmVhdGUoKSx0eXBlTmFtZTpoZS5ab2RPYmplY3QsLi4ueGUoZSl9KTtjdC5sYXp5Y3JlYXRlPSh0LGUpPT5uZXcgY3Qoe3NoYXBlOnQsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpnaS5jcmVhdGUoKSx0eXBlTmFtZTpoZS5ab2RPYmplY3QsLi4ueGUoZSl9KTtjbGFzcyBtdSBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9dGhpcy5fZGVmLm9wdGlvbnM7ZnVuY3Rpb24gaShvKXtmb3IoY29uc3QgcyBvZiBvKWlmKHMucmVzdWx0LnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIHMucmVzdWx0O2Zvcihjb25zdCBzIG9mIG8paWYocy5yZXN1bHQuc3RhdHVzPT09ImRpcnR5IilyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4ucy5jdHguY29tbW9uLmlzc3Vlcykscy5yZXN1bHQ7Y29uc3QgbD1vLm1hcChzPT5uZXcgd3Iocy5jdHguY29tbW9uLmlzc3VlcykpO3JldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpsfSkseWV9aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIG89Pntjb25zdCBsPXsuLi5uLGNvbW1vbjp7Li4ubi5jb21tb24saXNzdWVzOltdfSxwYXJlbnQ6bnVsbH07cmV0dXJue3Jlc3VsdDphd2FpdCBvLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bH0pLGN0eDpsfX0pKS50aGVuKGkpO3tsZXQgbztjb25zdCBsPVtdO2Zvcihjb25zdCBhIG9mIHIpe2NvbnN0IHU9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfSxjPWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnV9KTtpZihjLnN0YXR1cz09PSJ2YWxpZCIpcmV0dXJuIGM7Yy5zdGF0dXM9PT0iZGlydHkiJiYhbyYmKG89e3Jlc3VsdDpjLGN0eDp1fSksdS5jb21tb24uaXNzdWVzLmxlbmd0aCYmbC5wdXNoKHUuY29tbW9uLmlzc3Vlcyl9aWYobylyZXR1cm4gbi5jb21tb24uaXNzdWVzLnB1c2goLi4uby5jdHguY29tbW9uLmlzc3Vlcyksby5yZXN1bHQ7Y29uc3Qgcz1sLm1hcChhPT5uZXcgd3IoYSkpO3JldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpzfSkseWV9fWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zfX1tdS5jcmVhdGU9KHQsZSk9Pm5ldyBtdSh7b3B0aW9uczp0LHR5cGVOYW1lOmhlLlpvZFVuaW9uLC4uLnhlKGUpfSk7Y29uc3QgSGM9dD0+dCBpbnN0YW5jZW9mIHh1P0hjKHQuc2NoZW1hKTp0IGluc3RhbmNlb2Yga3I/SGModC5pbm5lclR5cGUoKSk6dCBpbnN0YW5jZW9mIF91P1t0LnZhbHVlXTp0IGluc3RhbmNlb2YgY28/dC5vcHRpb25zOnQgaW5zdGFuY2VvZiB3dT9PYmplY3Qua2V5cyh0LmVudW0pOnQgaW5zdGFuY2VvZiBTdT9IYyh0Ll9kZWYuaW5uZXJUeXBlKTp0IGluc3RhbmNlb2YgcHU/W3ZvaWQgMF06dCBpbnN0YW5jZW9mIGd1P1tudWxsXTpudWxsO2NsYXNzIElmIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0e2N0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09cS5vYmplY3QpcmV0dXJuIHRlKG4se2NvZGU6Vi5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6cS5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7Y29uc3Qgcj10aGlzLmRpc2NyaW1pbmF0b3IsaT1uLmRhdGFbcl0sbz10aGlzLm9wdGlvbnNNYXAuZ2V0KGkpO3JldHVybiBvP24uY29tbW9uLmFzeW5jP28uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk6by5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pOih0ZShuLHtjb2RlOlYuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLG9wdGlvbnM6QXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSxwYXRoOltyXX0pLHllKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsbixyKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1IYyhvLnNoYXBlW2VdKTtpZighbCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgcyBvZiBsKXtpZihpLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcocyl9YCk7aS5zZXQocyxvKX19cmV0dXJuIG5ldyBJZih7dHlwZU5hbWU6aGUuWm9kRGlzY3JpbWluYXRlZFVuaW9uLGRpc2NyaW1pbmF0b3I6ZSxvcHRpb25zOm4sb3B0aW9uc01hcDppLC4uLnhlKHIpfSl9fWZ1bmN0aW9uIHpnKHQsZSl7Y29uc3Qgbj16aSh0KSxyPXppKGUpO2lmKHQ9PT1lKXJldHVybnt2YWxpZDohMCxkYXRhOnR9O2lmKG49PT1xLm9iamVjdCYmcj09PXEub2JqZWN0KXtjb25zdCBpPURlLm9iamVjdEtleXMoZSksbz1EZS5vYmplY3RLZXlzKHQpLmZpbHRlcihzPT5pLmluZGV4T2YocykhPT0tMSksbD17Li4udCwuLi5lfTtmb3IoY29uc3QgcyBvZiBvKXtjb25zdCBhPXpnKHRbc10sZVtzXSk7aWYoIWEudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtsW3NdPWEuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTpsfX1lbHNlIGlmKG49PT1xLmFycmF5JiZyPT09cS5hcnJheSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGw9dFtvXSxzPWVbb10sYT16ZyhsLHMpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMX07aS5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6aX19ZWxzZSByZXR1cm4gbj09PXEuZGF0ZSYmcj09PXEuZGF0ZSYmK3Q9PStlP3t2YWxpZDohMCxkYXRhOnR9Ont2YWxpZDohMX19Y2xhc3MgdnUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxpPShvLGwpPT57aWYoRGcobyl8fERnKGwpKXJldHVybiB5ZTtjb25zdCBzPXpnKG8udmFsdWUsbC52YWx1ZSk7cmV0dXJuIHMudmFsaWQ/KChqZyhvKXx8amcobCkpJiZuLmRpcnR5KCkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMuZGF0YX0pOih0ZShyLHtjb2RlOlYuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSx5ZSl9O3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChbdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSksdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pXSkudGhlbigoW28sbF0pPT5pKG8sbCkpOmkodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KSl9fXZ1LmNyZWF0ZT0odCxlLG4pPT5uZXcgdnUoe2xlZnQ6dCxyaWdodDplLHR5cGVOYW1lOmhlLlpvZEludGVyc2VjdGlvbiwuLi54ZShuKX0pO2NsYXNzIEtyIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0e3N0YXR1czpuLGN0eDpyfT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYoci5wYXJzZWRUeXBlIT09cS5hcnJheSlyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLmFycmF5LHJlY2VpdmVkOnIucGFyc2VkVHlwZX0pLHllO2lmKHIuZGF0YS5sZW5ndGg8dGhpcy5fZGVmLml0ZW1zLmxlbmd0aClyZXR1cm4gdGUocix7Y29kZTpWLnRvb19zbWFsbCxtaW5pbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHllOyF0aGlzLl9kZWYucmVzdCYmci5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYodGUocix7Y29kZTpWLnRvb19iaWcsbWF4aW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxuLmRpcnR5KCkpO2NvbnN0IG89Wy4uLnIuZGF0YV0ubWFwKChsLHMpPT57Y29uc3QgYT10aGlzLl9kZWYuaXRlbXNbc118fHRoaXMuX2RlZi5yZXN0O3JldHVybiBhP2EuX3BhcnNlKG5ldyBIcihyLGwsci5wYXRoLHMpKTpudWxsfSkuZmlsdGVyKGw9PiEhbCk7cmV0dXJuIHIuY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKG8pLnRoZW4obD0+b24ubWVyZ2VBcnJheShuLGwpKTpvbi5tZXJnZUFycmF5KG4sbyl9Z2V0IGl0ZW1zKCl7cmV0dXJuIHRoaXMuX2RlZi5pdGVtc31yZXN0KGUpe3JldHVybiBuZXcgS3Ioey4uLnRoaXMuX2RlZixyZXN0OmV9KX19S3IuY3JlYXRlPSh0LGUpPT57aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgS3Ioe2l0ZW1zOnQsdHlwZU5hbWU6aGUuWm9kVHVwbGUscmVzdDpudWxsLC4uLnhlKGUpfSl9O2NsYXNzIHl1IGV4dGVuZHMgQ2V7Z2V0IGtleVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYua2V5VHlwZX1nZXQgdmFsdWVTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLm9iamVjdClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm9iamVjdCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPVtdLG89dGhpcy5fZGVmLmtleVR5cGUsbD10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBzIGluIHIuZGF0YSlpLnB1c2goe2tleTpvLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxzKSksdmFsdWU6bC5fcGFyc2UobmV3IEhyKHIsci5kYXRhW3NdLHIucGF0aCxzKSl9KTtyZXR1cm4gci5jb21tb24uYXN5bmM/b24ubWVyZ2VPYmplY3RBc3luYyhuLGkpOm9uLm1lcmdlT2JqZWN0U3luYyhuLGkpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLG4scil7cmV0dXJuIG4gaW5zdGFuY2VvZiBDZT9uZXcgeXUoe2tleVR5cGU6ZSx2YWx1ZVR5cGU6bix0eXBlTmFtZTpoZS5ab2RSZWNvcmQsLi4ueGUocil9KTpuZXcgeXUoe2tleVR5cGU6eXIuY3JlYXRlKCksdmFsdWVUeXBlOmUsdHlwZU5hbWU6aGUuWm9kUmVjb3JkLC4uLnhlKG4pfSl9fWNsYXNzIEhkIGV4dGVuZHMgQ2V7Z2V0IGtleVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYua2V5VHlwZX1nZXQgdmFsdWVTY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLm1hcClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm1hcCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPXRoaXMuX2RlZi5rZXlUeXBlLG89dGhpcy5fZGVmLnZhbHVlVHlwZSxsPVsuLi5yLmRhdGEuZW50cmllcygpXS5tYXAoKFtzLGFdLHUpPT4oe2tleTppLl9wYXJzZShuZXcgSHIocixzLHIucGF0aCxbdSwia2V5Il0pKSx2YWx1ZTpvLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCxbdSwidmFsdWUiXSkpfSkpO2lmKHIuY29tbW9uLmFzeW5jKXtjb25zdCBzPW5ldyBNYXA7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMoKT0+e2Zvcihjb25zdCBhIG9mIGwpe2NvbnN0IHU9YXdhaXQgYS5rZXksYz1hd2FpdCBhLnZhbHVlO2lmKHUuc3RhdHVzPT09ImFib3J0ZWQifHxjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7KHUuc3RhdHVzPT09ImRpcnR5Inx8Yy5zdGF0dXM9PT0iZGlydHkiKSYmbi5kaXJ0eSgpLHMuc2V0KHUudmFsdWUsYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fSl9ZWxzZXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgbCl7Y29uc3QgdT1hLmtleSxjPWEudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGMuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiB5ZTsodS5zdGF0dXM9PT0iZGlydHkifHxjLnN0YXR1cz09PSJkaXJ0eSIpJiZuLmRpcnR5KCkscy5zZXQodS52YWx1ZSxjLnZhbHVlKX1yZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6c319fX1IZC5jcmVhdGU9KHQsZSxuKT0+bmV3IEhkKHt2YWx1ZVR5cGU6ZSxrZXlUeXBlOnQsdHlwZU5hbWU6aGUuWm9kTWFwLC4uLnhlKG4pfSk7Y2xhc3MgWG8gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLnBhcnNlZFR5cGUhPT1xLnNldClyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnNldCxyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZTtjb25zdCBpPXRoaXMuX2RlZjtpLm1pblNpemUhPT1udWxsJiZyLmRhdGEuc2l6ZTxpLm1pblNpemUudmFsdWUmJih0ZShyLHtjb2RlOlYudG9vX3NtYWxsLG1pbmltdW06aS5taW5TaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5taW5TaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpLGkubWF4U2l6ZSE9PW51bGwmJnIuZGF0YS5zaXplPmkubWF4U2l6ZS52YWx1ZSYmKHRlKHIse2NvZGU6Vi50b29fYmlnLG1heGltdW06aS5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6aS5tYXhTaXplLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2NvbnN0IG89dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgYyBvZiBhKXtpZihjLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4geWU7Yy5zdGF0dXM9PT0iZGlydHkiJiZuLmRpcnR5KCksdS5hZGQoYy52YWx1ZSl9cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnV9fWNvbnN0IHM9Wy4uLnIuZGF0YS52YWx1ZXMoKV0ubWFwKChhLHUpPT5vLl9wYXJzZShuZXcgSHIocixhLHIucGF0aCx1KSkpO3JldHVybiByLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChzKS50aGVuKGE9PmwoYSkpOmwocyl9bWluKGUsbil7cmV0dXJuIG5ldyBYbyh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpmZS50b1N0cmluZyhuKX19KX1tYXgoZSxuKXtyZXR1cm4gbmV3IFhvKHsuLi50aGlzLl9kZWYsbWF4U2l6ZTp7dmFsdWU6ZSxtZXNzYWdlOmZlLnRvU3RyaW5nKG4pfX0pfXNpemUoZSxuKXtyZXR1cm4gdGhpcy5taW4oZSxuKS5tYXgoZSxuKX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WG8uY3JlYXRlPSh0LGUpPT5uZXcgWG8oe3ZhbHVlVHlwZTp0LG1pblNpemU6bnVsbCxtYXhTaXplOm51bGwsdHlwZU5hbWU6aGUuWm9kU2V0LC4uLnhlKGUpfSk7Y2xhc3MgUWwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy52YWxpZGF0ZT10aGlzLmltcGxlbWVudH1fcGFyc2UoZSl7Y29uc3R7Y3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihuLnBhcnNlZFR5cGUhPT1xLmZ1bmN0aW9uKXJldHVybiB0ZShuLHtjb2RlOlYuaW52YWxpZF90eXBlLGV4cGVjdGVkOnEuZnVuY3Rpb24scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7ZnVuY3Rpb24gcihzLGEpe3JldHVybiBCZCh7ZGF0YTpzLHBhdGg6bi5wYXRoLGVycm9yTWFwczpbbi5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLG4uc2NoZW1hRXJyb3JNYXAsRmQoKSxkdV0uZmlsdGVyKHU9PiEhdSksaXNzdWVEYXRhOntjb2RlOlYuaW52YWxpZF9hcmd1bWVudHMsYXJndW1lbnRzRXJyb3I6YX19KX1mdW5jdGlvbiBpKHMsYSl7cmV0dXJuIEJkKHtkYXRhOnMscGF0aDpuLnBhdGgsZXJyb3JNYXBzOltuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsbi5zY2hlbWFFcnJvck1hcCxGZCgpLGR1XS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6Vi5pbnZhbGlkX3JldHVybl90eXBlLHJldHVyblR5cGVFcnJvcjphfX0pfWNvbnN0IG89e2Vycm9yTWFwOm4uY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcH0sbD1uLmRhdGE7aWYodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBwcyl7Y29uc3Qgcz10aGlzO3JldHVybiB5bihhc3luYyBmdW5jdGlvbiguLi5hKXtjb25zdCB1PW5ldyB3cihbXSksYz1hd2FpdCBzLl9kZWYuYXJncy5wYXJzZUFzeW5jKGEsbykuY2F0Y2goaD0+e3Rocm93IHUuYWRkSXNzdWUocihhLGgpKSx1fSksZD1hd2FpdCBSZWZsZWN0LmFwcGx5KGwsdGhpcyxjKTtyZXR1cm4gYXdhaXQgcy5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZCxvKS5jYXRjaChoPT57dGhyb3cgdS5hZGRJc3N1ZShpKGQsaCkpLHV9KX0pfWVsc2V7Y29uc3Qgcz10aGlzO3JldHVybiB5bihmdW5jdGlvbiguLi5hKXtjb25zdCB1PXMuX2RlZi5hcmdzLnNhZmVQYXJzZShhLG8pO2lmKCF1LnN1Y2Nlc3MpdGhyb3cgbmV3IHdyKFtyKGEsdS5lcnJvcildKTtjb25zdCBjPVJlZmxlY3QuYXBwbHkobCx0aGlzLHUuZGF0YSksZD1zLl9kZWYucmV0dXJucy5zYWZlUGFyc2UoYyxvKTtpZighZC5zdWNjZXNzKXRocm93IG5ldyB3cihbaShjLGQuZXJyb3IpXSk7cmV0dXJuIGQuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IFFsKHsuLi50aGlzLl9kZWYsYXJnczpLci5jcmVhdGUoZSkucmVzdCh6by5jcmVhdGUoKSl9KX1yZXR1cm5zKGUpe3JldHVybiBuZXcgUWwoey4uLnRoaXMuX2RlZixyZXR1cm5zOmV9KX1pbXBsZW1lbnQoZSl7cmV0dXJuIHRoaXMucGFyc2UoZSl9c3RyaWN0SW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0YXRpYyBjcmVhdGUoZSxuLHIpe3JldHVybiBuZXcgUWwoe2FyZ3M6ZXx8S3IuY3JlYXRlKFtdKS5yZXN0KHpvLmNyZWF0ZSgpKSxyZXR1cm5zOm58fHpvLmNyZWF0ZSgpLHR5cGVOYW1lOmhlLlpvZEZ1bmN0aW9uLC4uLnhlKHIpfSl9fWNsYXNzIHh1IGV4dGVuZHMgQ2V7Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCl9X3BhcnNlKGUpe2NvbnN0e2N0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7cmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKS5fcGFyc2Uoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXh1LmNyZWF0ZT0odCxlKT0+bmV3IHh1KHtnZXR0ZXI6dCx0eXBlTmFtZTpoZS5ab2RMYXp5LC4uLnhlKGUpfSk7Y2xhc3MgX3UgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYoZS5kYXRhIT09dGhpcy5fZGVmLnZhbHVlKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiB0ZShuLHtyZWNlaXZlZDpuLmRhdGEsY29kZTpWLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSx5ZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fZGVmLnZhbHVlfX1fdS5jcmVhdGU9KHQsZSk9Pm5ldyBfdSh7dmFsdWU6dCx0eXBlTmFtZTpoZS5ab2RMaXRlcmFsLC4uLnhlKGUpfSk7ZnVuY3Rpb24gTkModCxlKXtyZXR1cm4gbmV3IGNvKHt2YWx1ZXM6dCx0eXBlTmFtZTpoZS5ab2RFbnVtLC4uLnhlKGUpfSl9Y2xhc3MgY28gZXh0ZW5kcyBDZXtfcGFyc2UoZSl7aWYodHlwZW9mIGUuZGF0YSE9InN0cmluZyIpe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSkscj10aGlzLl9kZWYudmFsdWVzO3JldHVybiB0ZShuLHtleHBlY3RlZDpEZS5qb2luVmFsdWVzKHIpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOlYuaW52YWxpZF90eXBlfSkseWV9aWYodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKGUuZGF0YSk9PT0tMSl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKSxyPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIHRlKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOlYuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6cn0pLHllfXJldHVybiB5bihlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpZVtuXT1uO3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlZi52YWx1ZXMpZVtuXT1uO3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0aGlzLl9kZWYudmFsdWVzKWVbbl09bjtyZXR1cm4gZX1leHRyYWN0KGUpe3JldHVybiBjby5jcmVhdGUoZSl9ZXhjbHVkZShlKXtyZXR1cm4gY28uY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpKX19Y28uY3JlYXRlPU5DO2NsYXNzIHd1IGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49RGUuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpLHI9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7aWYoci5wYXJzZWRUeXBlIT09cS5zdHJpbmcmJnIucGFyc2VkVHlwZSE9PXEubnVtYmVyKXtjb25zdCBpPURlLm9iamVjdFZhbHVlcyhuKTtyZXR1cm4gdGUocix7ZXhwZWN0ZWQ6RGUuam9pblZhbHVlcyhpKSxyZWNlaXZlZDpyLnBhcnNlZFR5cGUsY29kZTpWLmludmFsaWRfdHlwZX0pLHllfWlmKG4uaW5kZXhPZihlLmRhdGEpPT09LTEpe2NvbnN0IGk9RGUub2JqZWN0VmFsdWVzKG4pO3JldHVybiB0ZShyLHtyZWNlaXZlZDpyLmRhdGEsY29kZTpWLmludmFsaWRfZW51bV92YWx1ZSxvcHRpb25zOml9KSx5ZX1yZXR1cm4geW4oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13dS5jcmVhdGU9KHQsZSk9Pm5ldyB3dSh7dmFsdWVzOnQsdHlwZU5hbWU6aGUuWm9kTmF0aXZlRW51bSwuLi54ZShlKX0pO2NsYXNzIHBzIGV4dGVuZHMgQ2V7dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PXEucHJvbWlzZSYmbi5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gdGUobix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLnByb21pc2UscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSkseWU7Y29uc3Qgcj1uLnBhcnNlZFR5cGU9PT1xLnByb21pc2U/bi5kYXRhOlByb21pc2UucmVzb2x2ZShuLmRhdGEpO3JldHVybiB5bihyLnRoZW4oaT0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhpLHtwYXRoOm4ucGF0aCxlcnJvck1hcDpuLmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1wcy5jcmVhdGU9KHQsZSk9Pm5ldyBwcyh7dHlwZTp0LHR5cGVOYW1lOmhlLlpvZFByb21pc2UsLi4ueGUoZSl9KTtjbGFzcyBrciBleHRlbmRzIENle2lubmVyVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hfXNvdXJjZVR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lPT09aGUuWm9kRWZmZWN0cz90aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKTp0aGlzLl9kZWYuc2NoZW1hfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6bixjdHg6cn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLGk9dGhpcy5fZGVmLmVmZmVjdHx8bnVsbCxvPXthZGRJc3N1ZTpsPT57dGUocixsKSxsLmZhdGFsP24uYWJvcnQoKTpuLmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIHIucGF0aH19O2lmKG8uYWRkSXNzdWU9by5hZGRJc3N1ZS5iaW5kKG8pLGkudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgbD1pLnRyYW5zZm9ybShyLmRhdGEsbyk7cmV0dXJuIHIuY29tbW9uLmlzc3Vlcy5sZW5ndGg/e3N0YXR1czoiZGlydHkiLHZhbHVlOnIuZGF0YX06ci5jb21tb24uYXN5bmM/UHJvbWlzZS5yZXNvbHZlKGwpLnRoZW4ocz0+dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpzLHBhdGg6ci5wYXRoLHBhcmVudDpyfSkpOnRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpsLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9aWYoaS50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBsPXM9Pntjb25zdCBhPWkucmVmaW5lbWVudChzLG8pO2lmKHIuY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBzfTtpZihyLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBzPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpyLmRhdGEscGF0aDpyLnBhdGgscGFyZW50OnJ9KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/eWU6KHMuc3RhdHVzPT09ImRpcnR5IiYmbi5kaXJ0eSgpLGwocy52YWx1ZSkse3N0YXR1czpuLnZhbHVlLHZhbHVlOnMudmFsdWV9KX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pLnRoZW4ocz0+cy5zdGF0dXM9PT0iYWJvcnRlZCI/eWU6KHMuc3RhdHVzPT09ImRpcnR5IiYmbi5kaXJ0eSgpLGwocy52YWx1ZSkudGhlbigoKT0+KHtzdGF0dXM6bi52YWx1ZSx2YWx1ZTpzLnZhbHVlfSkpKSl9aWYoaS50eXBlPT09InRyYW5zZm9ybSIpaWYoci5jb21tb24uYXN5bmM9PT0hMSl7Y29uc3QgbD10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSk7aWYoIWZ1KGwpKXJldHVybiBsO2NvbnN0IHM9aS50cmFuc2Zvcm0obC52YWx1ZSxvKTtpZihzIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuIik7cmV0dXJue3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9fWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6ci5kYXRhLHBhdGg6ci5wYXRoLHBhcmVudDpyfSkudGhlbihsPT5mdShsKT9Qcm9taXNlLnJlc29sdmUoaS50cmFuc2Zvcm0obC52YWx1ZSxvKSkudGhlbihzPT4oe3N0YXR1czpuLnZhbHVlLHZhbHVlOnN9KSk6bCk7RGUuYXNzZXJ0TmV2ZXIoaSl9fWtyLmNyZWF0ZT0odCxlLG4pPT5uZXcga3Ioe3NjaGVtYTp0LHR5cGVOYW1lOmhlLlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4ueGUobil9KTtrci5jcmVhdGVXaXRoUHJlcHJvY2Vzcz0odCxlLG4pPT5uZXcga3Ioe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnR9LHR5cGVOYW1lOmhlLlpvZEVmZmVjdHMsLi4ueGUobil9KTtjbGFzcyBjaSBleHRlbmRzIENle19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PXEudW5kZWZpbmVkP3luKHZvaWQgMCk6dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fWNpLmNyZWF0ZT0odCxlKT0+bmV3IGNpKHtpbm5lclR5cGU6dCx0eXBlTmFtZTpoZS5ab2RPcHRpb25hbCwuLi54ZShlKX0pO2NsYXNzIFFvIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09cS5udWxsP3luKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1Rby5jcmVhdGU9KHQsZSk9Pm5ldyBRbyh7aW5uZXJUeXBlOnQsdHlwZU5hbWU6aGUuWm9kTnVsbGFibGUsLi4ueGUoZSl9KTtjbGFzcyBTdSBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2xldCByPW4uZGF0YTtyZXR1cm4gbi5wYXJzZWRUeXBlPT09cS51bmRlZmluZWQmJihyPXRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKSksdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXJlbW92ZURlZmF1bHQoKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19U3UuY3JlYXRlPSh0LGUpPT5uZXcgU3Uoe2lubmVyVHlwZTp0LHR5cGVOYW1lOmhlLlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4ueGUoZSl9KTtjbGFzcyBLZCBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9ey4uLm4sY29tbW9uOnsuLi5uLmNvbW1vbixpc3N1ZXM6W119fSxpPXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6ey4uLnJ9fSk7cmV0dXJuIFVkKGkpP2kudGhlbihvPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOm8uc3RhdHVzPT09InZhbGlkIj9vLnZhbHVlOnRoaXMuX2RlZi5jYXRjaFZhbHVlKHtnZXQgZXJyb3IoKXtyZXR1cm4gbmV3IHdyKHIuY29tbW9uLmlzc3Vlcyl9LGlucHV0OnIuZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTppLnN0YXR1cz09PSJ2YWxpZCI/aS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyB3cihyLmNvbW1vbi5pc3N1ZXMpfSxpbnB1dDpyLmRhdGF9KX19cmVtb3ZlQ2F0Y2goKXtyZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZX19S2QuY3JlYXRlPSh0LGUpPT5uZXcgS2Qoe2lubmVyVHlwZTp0LHR5cGVOYW1lOmhlLlpvZENhdGNoLGNhdGNoVmFsdWU6dHlwZW9mIGUuY2F0Y2g9PSJmdW5jdGlvbiI/ZS5jYXRjaDooKT0+ZS5jYXRjaCwuLi54ZShlKX0pO2NsYXNzIFpkIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1xLm5hbil7Y29uc3Qgcj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gdGUocix7Y29kZTpWLmludmFsaWRfdHlwZSxleHBlY3RlZDpxLm5hbixyZWNlaXZlZDpyLnBhcnNlZFR5cGV9KSx5ZX1yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19WmQuY3JlYXRlPXQ9Pm5ldyBaZCh7dHlwZU5hbWU6aGUuWm9kTmFOLC4uLnhlKHQpfSk7Y29uc3QgVDU9U3ltYm9sKCJ6b2RfYnJhbmQiKTtjbGFzcyBSQyBleHRlbmRzIENle19wYXJzZShlKXtjb25zdHtjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHI9bi5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6cixwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgVXUgZXh0ZW5kcyBDZXtfcGFyc2UoZSl7Y29uc3R7c3RhdHVzOm4sY3R4OnJ9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtpZihyLmNvbW1vbi5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2NvbnN0IG89YXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj95ZTpvLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSxUQyhvLnZhbHVlKSk6dGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7ZGF0YTpvLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9KSgpO3tjb25zdCBpPXRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxwYXJlbnQ6cn0pO3JldHVybiBpLnN0YXR1cz09PSJhYm9ydGVkIj95ZTppLnN0YXR1cz09PSJkaXJ0eSI/KG4uZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6aS52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTppLnZhbHVlLHBhdGg6ci5wYXRoLHBhcmVudDpyfSl9fXN0YXRpYyBjcmVhdGUoZSxuKXtyZXR1cm4gbmV3IFV1KHtpbjplLG91dDpuLHR5cGVOYW1lOmhlLlpvZFBpcGVsaW5lfSl9fWNsYXNzIEdkIGV4dGVuZHMgQ2V7X3BhcnNlKGUpe2NvbnN0IG49dGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSk7cmV0dXJuIGZ1KG4pJiYobi52YWx1ZT1PYmplY3QuZnJlZXplKG4udmFsdWUpKSxufX1HZC5jcmVhdGU9KHQsZSk9Pm5ldyBHZCh7aW5uZXJUeXBlOnQsdHlwZU5hbWU6aGUuWm9kUmVhZG9ubHksLi4ueGUoZSl9KTtjb25zdCBPQz0odCxlPXt9LG4pPT50P2hzLmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChyLGkpPT57dmFyIG8sbDtpZighdChyKSl7Y29uc3Qgcz10eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHIpOnR5cGVvZiBlPT0ic3RyaW5nIj97bWVzc2FnZTplfTplLGE9KGw9KG89cy5mYXRhbCkhPT1udWxsJiZvIT09dm9pZCAwP286bikhPT1udWxsJiZsIT09dm9pZCAwP2w6ITAsdT10eXBlb2Ygcz09InN0cmluZyI/e21lc3NhZ2U6c306cztpLmFkZElzc3VlKHtjb2RlOiJjdXN0b20iLC4uLnUsZmF0YWw6YX0pfX0pOmhzLmNyZWF0ZSgpLE41PXtvYmplY3Q6Y3QubGF6eWNyZWF0ZX07dmFyIGhlOyhmdW5jdGlvbih0KXt0LlpvZFN0cmluZz0iWm9kU3RyaW5nIix0LlpvZE51bWJlcj0iWm9kTnVtYmVyIix0LlpvZE5hTj0iWm9kTmFOIix0LlpvZEJpZ0ludD0iWm9kQmlnSW50Iix0LlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHQuWm9kRGF0ZT0iWm9kRGF0ZSIsdC5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsdC5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsdC5ab2ROdWxsPSJab2ROdWxsIix0LlpvZEFueT0iWm9kQW55Iix0LlpvZFVua25vd249IlpvZFVua25vd24iLHQuWm9kTmV2ZXI9IlpvZE5ldmVyIix0LlpvZFZvaWQ9IlpvZFZvaWQiLHQuWm9kQXJyYXk9IlpvZEFycmF5Iix0LlpvZE9iamVjdD0iWm9kT2JqZWN0Iix0LlpvZFVuaW9uPSJab2RVbmlvbiIsdC5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsdC5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsdC5ab2RUdXBsZT0iWm9kVHVwbGUiLHQuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHQuWm9kTWFwPSJab2RNYXAiLHQuWm9kU2V0PSJab2RTZXQiLHQuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIix0LlpvZExhenk9IlpvZExhenkiLHQuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsdC5ab2RFbnVtPSJab2RFbnVtIix0LlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHQuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsdC5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHQuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIix0LlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHQuWm9kQ2F0Y2g9IlpvZENhdGNoIix0LlpvZFByb21pc2U9IlpvZFByb21pc2UiLHQuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsdC5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHQuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKGhlfHwoaGU9e30pKTtjb25zdCBSNT0odCxlPXttZXNzYWdlOmBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHt0Lm5hbWV9YH0pPT5PQyhuPT5uIGluc3RhbmNlb2YgdCxlKSxQQz15ci5jcmVhdGUsQUM9YW8uY3JlYXRlLE81PVpkLmNyZWF0ZSxQNT11by5jcmVhdGUsTUM9aHUuY3JlYXRlLEE1PVlvLmNyZWF0ZSxNNT1XZC5jcmVhdGUsTDU9cHUuY3JlYXRlLEk1PWd1LmNyZWF0ZSxENT1ocy5jcmVhdGUsajU9em8uY3JlYXRlLHo1PWdpLmNyZWF0ZSxGNT1WZC5jcmVhdGUsQjU9U3IuY3JlYXRlLFU1PWN0LmNyZWF0ZSxXNT1jdC5zdHJpY3RDcmVhdGUsVjU9bXUuY3JlYXRlLEg1PUlmLmNyZWF0ZSxLNT12dS5jcmVhdGUsWjU9S3IuY3JlYXRlLEc1PXl1LmNyZWF0ZSxZNT1IZC5jcmVhdGUsWDU9WG8uY3JlYXRlLFE1PVFsLmNyZWF0ZSxKNT14dS5jcmVhdGUscTU9X3UuY3JlYXRlLGUzPWNvLmNyZWF0ZSx0Mz13dS5jcmVhdGUsbjM9cHMuY3JlYXRlLE54PWtyLmNyZWF0ZSxyMz1jaS5jcmVhdGUsaTM9UW8uY3JlYXRlLG8zPWtyLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLGwzPVV1LmNyZWF0ZSxzMz0oKT0+UEMoKS5vcHRpb25hbCgpLGEzPSgpPT5BQygpLm9wdGlvbmFsKCksdTM9KCk9Pk1DKCkub3B0aW9uYWwoKSxjMz17c3RyaW5nOnQ9PnlyLmNyZWF0ZSh7Li4udCxjb2VyY2U6ITB9KSxudW1iZXI6dD0+YW8uY3JlYXRlKHsuLi50LGNvZXJjZTohMH0pLGJvb2xlYW46dD0+aHUuY3JlYXRlKHsuLi50LGNvZXJjZTohMH0pLGJpZ2ludDp0PT51by5jcmVhdGUoey4uLnQsY29lcmNlOiEwfSksZGF0ZTp0PT5Zby5jcmVhdGUoey4uLnQsY29lcmNlOiEwfSl9LGQzPXllO3ZhciBDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6ZHUsc2V0RXJyb3JNYXA6ZzUsZ2V0RXJyb3JNYXA6RmQsbWFrZUlzc3VlOkJkLEVNUFRZX1BBVEg6bTUsYWRkSXNzdWVUb0NvbnRleHQ6dGUsUGFyc2VTdGF0dXM6b24sSU5WQUxJRDp5ZSxESVJUWTpUQyxPSzp5bixpc0Fib3J0ZWQ6RGcsaXNEaXJ0eTpqZyxpc1ZhbGlkOmZ1LGlzQXN5bmM6VWQsZ2V0IHV0aWwoKXtyZXR1cm4gRGV9LGdldCBvYmplY3RVdGlsKCl7cmV0dXJuIElnfSxab2RQYXJzZWRUeXBlOnEsZ2V0UGFyc2VkVHlwZTp6aSxab2RUeXBlOkNlLFpvZFN0cmluZzp5cixab2ROdW1iZXI6YW8sWm9kQmlnSW50OnVvLFpvZEJvb2xlYW46aHUsWm9kRGF0ZTpZbyxab2RTeW1ib2w6V2QsWm9kVW5kZWZpbmVkOnB1LFpvZE51bGw6Z3UsWm9kQW55OmhzLFpvZFVua25vd246em8sWm9kTmV2ZXI6Z2ksWm9kVm9pZDpWZCxab2RBcnJheTpTcixab2RPYmplY3Q6Y3QsWm9kVW5pb246bXUsWm9kRGlzY3JpbWluYXRlZFVuaW9uOklmLFpvZEludGVyc2VjdGlvbjp2dSxab2RUdXBsZTpLcixab2RSZWNvcmQ6eXUsWm9kTWFwOkhkLFpvZFNldDpYbyxab2RGdW5jdGlvbjpRbCxab2RMYXp5Onh1LFpvZExpdGVyYWw6X3UsWm9kRW51bTpjbyxab2ROYXRpdmVFbnVtOnd1LFpvZFByb21pc2U6cHMsWm9kRWZmZWN0czprcixab2RUcmFuc2Zvcm1lcjprcixab2RPcHRpb25hbDpjaSxab2ROdWxsYWJsZTpRbyxab2REZWZhdWx0OlN1LFpvZENhdGNoOktkLFpvZE5hTjpaZCxCUkFORDpUNSxab2RCcmFuZGVkOlJDLFpvZFBpcGVsaW5lOlV1LFpvZFJlYWRvbmx5OkdkLGN1c3RvbTpPQyxTY2hlbWE6Q2UsWm9kU2NoZW1hOkNlLGxhdGU6TjUsZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCgpe3JldHVybiBoZX0sY29lcmNlOmMzLGFueTpENSxhcnJheTpCNSxiaWdpbnQ6UDUsYm9vbGVhbjpNQyxkYXRlOkE1LGRpc2NyaW1pbmF0ZWRVbmlvbjpINSxlZmZlY3Q6TngsZW51bTplMyxmdW5jdGlvbjpRNSxpbnN0YW5jZW9mOlI1LGludGVyc2VjdGlvbjpLNSxsYXp5Oko1LGxpdGVyYWw6cTUsbWFwOlk1LG5hbjpPNSxuYXRpdmVFbnVtOnQzLG5ldmVyOno1LG51bGw6STUsbnVsbGFibGU6aTMsbnVtYmVyOkFDLG9iamVjdDpVNSxvYm9vbGVhbjp1MyxvbnVtYmVyOmEzLG9wdGlvbmFsOnIzLG9zdHJpbmc6czMscGlwZWxpbmU6bDMscHJlcHJvY2VzczpvMyxwcm9taXNlOm4zLHJlY29yZDpHNSxzZXQ6WDUsc3RyaWN0T2JqZWN0Olc1LHN0cmluZzpQQyxzeW1ib2w6TTUsdHJhbnNmb3JtZXI6TngsdHVwbGU6WjUsdW5kZWZpbmVkOkw1LHVuaW9uOlY1LHVua25vd246ajUsdm9pZDpGNSxORVZFUjpkMyxab2RJc3N1ZUNvZGU6VixxdW90ZWxlc3NKc29uOnA1LFpvZEVycm9yOndyfSk7Y29uc3QgZjM9Q24udW5pb24oW0NuLm9iamVjdCh7aWQ6Q24uc3RyaW5nKCksbW9kZTpDbi5saXRlcmFsKCJwcm94eSIpLGZ1bGxfbmFtZTpDbi5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksdXNlcm5hbWU6Q24uc3RyaW5nKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLGF2YXRhcl91cmw6Q24uc3RyaW5nKCkudXJsKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLGVuYWJsZWQ6Q24uYm9vbGVhbigpfSksQ24ub2JqZWN0KHttb2RlOkNuLmxpdGVyYWwoImxvY2FsIiksZW5hYmxlZDpDbi5ib29sZWFuKCkub3B0aW9uYWwoKX0pLENuLm9iamVjdCh7bW9kZTpDbi5saXRlcmFsKCJ1bmF1dGhvcml6ZWQiKSxlbmFibGVkOkNuLmJvb2xlYW4oKS5vcHRpb25hbCgpfSldKTtmdW5jdGlvbiBoMyh0KXtjb25zdFtlLG5dPXAudXNlU3RhdGUoe3N0YXR1czoibm90LWFza2VkIn0pLFtyLGldPXAudXNlU3RhdGUoMCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bih7c3RhdHVzOiJsb2FkaW5nIn0pLHQuZ2V0U2Vzc2lvbigpLnRoZW4oYXN5bmMgbz0+e3RyeXtpZihMby5pc09rKG8pKXtjb25zdCBsPW8udmFsdWU7bih7c3RhdHVzOiJzdWNjZXNzIixkYXRhOmYzLnBhcnNlKGwpfSl9ZWxzZSBvLmVycm9yLnN0YXR1c0NvZGU9PT00MDE/bih7c3RhdHVzOiJzdWNjZXNzIixkYXRhOnttb2RlOiJ1bmF1dGhvcml6ZWQifX0pOnI8Mz9zZXRUaW1lb3V0KCgpPT57aShyKzEpfSwyMDAqcik6bih7c3RhdHVzOiJlcnJvciIsZXJyb3I6IkNvdWxkIG5vdCBmZXRjaCBzZXNzaW9uIn0pfWNhdGNoKGwpe2NvbnNvbGUuZXJyb3IoIkNvdWxkIG5vdCBhdXRob3JpemU6IixsKSxuKHtzdGF0dXM6ImVycm9yIixlcnJvcjoiR290IGFuIGVycm9yIHdoaWxlIHRyeWluZyB0byBnZXQgc2Vzc2lvbiJ9KX19KX0sW3JdKSxlfWNvbnN0IFJ4PXQ9PnR5cGVvZiB0PT0iYm9vbGVhbiI/IiIuY29uY2F0KHQpOnQ9PT0wPyIwIjp0LE94PXVTLHAzPSh0LGUpPT5uPT57dmFyIHI7aWYoKGU9PW51bGw/dm9pZCAwOmUudmFyaWFudHMpPT1udWxsKXJldHVybiBPeCh0LG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpO2NvbnN0e3ZhcmlhbnRzOmksZGVmYXVsdFZhcmlhbnRzOm99PWUsbD1PYmplY3Qua2V5cyhpKS5tYXAodT0+e2NvbnN0IGM9bj09bnVsbD92b2lkIDA6blt1XSxkPW89PW51bGw/dm9pZCAwOm9bdV07aWYoYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgZj1SeChjKXx8UngoZCk7cmV0dXJuIGlbdV1bZl19KSxzPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodSxjKT0+e2xldFtkLGZdPWM7cmV0dXJuIGY9PT12b2lkIDB8fCh1W2RdPWYpLHV9LHt9KSxhPWU9PW51bGx8fChyPWUuY29tcG91bmRWYXJpYW50cyk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnJlZHVjZSgodSxjKT0+e2xldHtjbGFzczpkLGNsYXNzTmFtZTpmLC4uLmh9PWM7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGgpLmV2ZXJ5KG09PntsZXRbZyx3XT1tO3JldHVybiBBcnJheS5pc0FycmF5KHcpP3cuaW5jbHVkZXMoey4uLm8sLi4uc31bZ10pOnsuLi5vLC4uLnN9W2ddPT09d30pP1suLi51LGQsZl06dX0sW10pO3JldHVybiBPeCh0LGwsYSxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzLG49PW51bGw/dm9pZCAwOm4uY2xhc3NOYW1lKX0sZzM9cDMoImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLW1kIHRleHQtc20gZm9udC1tZWRpdW0gcmluZy1vZmZzZXQtYmFja2dyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIix7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6ImJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeS85MCIsZGVzdHJ1Y3RpdmU6ImJnLWRlc3RydWN0aXZlIHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCIsb3V0bGluZToiYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixzZWNvbmRhcnk6ImJnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXNlY29uZGFyeS84MCIsZ2hvc3Q6ImhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixsaW5rOiJ0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZSJ9LHNpemU6e2RlZmF1bHQ6ImgtMTAgcHgtNCBweS0yIixzbToiaC05IHJvdW5kZWQtbWQgcHgtMyIsbGc6ImgtMTEgcm91bmRlZC1tZCBweC04IixpY29uOiJoLTEwIHctMTAifX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OiJkZWZhdWx0IixzaXplOiJkZWZhdWx0In19KSxNcz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCx2YXJpYW50OmUsc2l6ZTpuLGFzQ2hpbGQ6cj0hMSwuLi5pfSxvKT0+e2NvbnN0IGw9cj9hczoiYnV0dG9uIjtyZXR1cm4gXy5qc3gobCx7Y2xhc3NOYW1lOnh0KGczKHt2YXJpYW50OmUsc2l6ZTpuLGNsYXNzTmFtZTp0fSkpLHJlZjpvLC4uLml9KX0pO01zLmRpc3BsYXlOYW1lPSJCdXR0b24iO2NvbnN0IEZ2PXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LHR5cGU6ZSwuLi5ufSxyKT0+Xy5qc3goImlucHV0Iix7dHlwZTplLGNsYXNzTmFtZTp4dCgiZmxleCBoLTEwIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZpbGU6Ym9yZGVyLTAgZmlsZTpiZy10cmFuc3BhcmVudCBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIix0KSxyZWY6ciwuLi5ufSkpO0Z2LmRpc3BsYXlOYW1lPSJJbnB1dCI7ZnVuY3Rpb24gTEModCl7Y29uc3QgZT10KyJDb2xsZWN0aW9uUHJvdmlkZXIiLFtuLHJdPW9sKGUpLFtpLG9dPW4oZSx7Y29sbGVjdGlvblJlZjp7Y3VycmVudDpudWxsfSxpdGVtTWFwOm5ldyBNYXB9KSxsPWg9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOmd9PWgsdz1yZS51c2VSZWYobnVsbCksdj1yZS51c2VSZWYobmV3IE1hcCkuY3VycmVudDtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChpLHtzY29wZTptLGl0ZW1NYXA6dixjb2xsZWN0aW9uUmVmOnd9LGcpfSxzPXQrIkNvbGxlY3Rpb25TbG90IixhPXJlLmZvcndhcmRSZWYoKGgsbSk9Pntjb25zdHtzY29wZTpnLGNoaWxkcmVuOnd9PWgsdj1vKHMsZykseT1zdChtLHYuY29sbGVjdGlvblJlZik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoYXMse3JlZjp5fSx3KX0pLHU9dCsiQ29sbGVjdGlvbkl0ZW1TbG90IixjPSJkYXRhLXJhZGl4LWNvbGxlY3Rpb24taXRlbSIsZD1yZS5mb3J3YXJkUmVmKChoLG0pPT57Y29uc3R7c2NvcGU6ZyxjaGlsZHJlbjp3LC4uLnZ9PWgseT1yZS51c2VSZWYobnVsbCkseD1zdChtLHkpLFM9byh1LGcpO3JldHVybiByZS51c2VFZmZlY3QoKCk9PihTLml0ZW1NYXAuc2V0KHkse3JlZjp5LC4uLnZ9KSwoKT0+dm9pZCBTLml0ZW1NYXAuZGVsZXRlKHkpKSkscmUuY3JlYXRlRWxlbWVudChhcyx7W2NdOiIiLHJlZjp4fSx3KX0pO2Z1bmN0aW9uIGYoaCl7Y29uc3QgbT1vKHQrIkNvbGxlY3Rpb25Db25zdW1lciIsaCk7cmV0dXJuIHJlLnVzZUNhbGxiYWNrKCgpPT57Y29uc3Qgdz1tLmNvbGxlY3Rpb25SZWYuY3VycmVudDtpZighdylyZXR1cm5bXTtjb25zdCB2PUFycmF5LmZyb20ody5xdWVyeVNlbGVjdG9yQWxsKGBbJHtjfV1gKSk7cmV0dXJuIEFycmF5LmZyb20obS5pdGVtTWFwLnZhbHVlcygpKS5zb3J0KChTLGIpPT52LmluZGV4T2YoUy5yZWYuY3VycmVudCktdi5pbmRleE9mKGIucmVmLmN1cnJlbnQpKX0sW20uY29sbGVjdGlvblJlZixtLml0ZW1NYXBdKX1yZXR1cm5be1Byb3ZpZGVyOmwsU2xvdDphLEl0ZW1TbG90OmR9LGYscl19ZnVuY3Rpb24gbTModCxlPWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49ZW4odCk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCByPWk9PntpLmtleT09PSJFc2NhcGUiJiZuKGkpfTtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKSwoKT0+ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKX0sW24sZV0pfWNvbnN0IEZnPSJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZSIsdjM9ImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlIix5Mz0iZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGUiO2xldCBQeDtjb25zdCB4Mz1wLmNyZWF0ZUNvbnRleHQoe2xheWVyczpuZXcgU2V0LGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOm5ldyBTZXQsYnJhbmNoZXM6bmV3IFNldH0pLF8zPXAuZm9yd2FyZFJlZigodCxlKT0+e3ZhciBuO2NvbnN0e2Rpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czpyPSExLG9uRXNjYXBlS2V5RG93bjppLG9uUG9pbnRlckRvd25PdXRzaWRlOm8sb25Gb2N1c091dHNpZGU6bCxvbkludGVyYWN0T3V0c2lkZTpzLG9uRGlzbWlzczphLC4uLnV9PXQsYz1wLnVzZUNvbnRleHQoeDMpLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD0obj1kPT1udWxsP3ZvaWQgMDpkLm93bmVyRG9jdW1lbnQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOmdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQsWyxtXT1wLnVzZVN0YXRlKHt9KSxnPXN0KGUsTz0+ZihPKSksdz1BcnJheS5mcm9tKGMubGF5ZXJzKSxbdl09Wy4uLmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSx5PXcuaW5kZXhPZih2KSx4PWQ/dy5pbmRleE9mKGQpOi0xLFM9Yy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPjAsYj14Pj15LFQ9dzMoTz0+e2NvbnN0IEw9Ty50YXJnZXQsUD1bLi4uYy5icmFuY2hlc10uc29tZShEPT5ELmNvbnRhaW5zKEwpKTshYnx8UHx8KG89PW51bGx8fG8oTykscz09bnVsbHx8cyhPKSxPLmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpLCQ9UzMoTz0+e2NvbnN0IEw9Ty50YXJnZXQ7Wy4uLmMuYnJhbmNoZXNdLnNvbWUoRD0+RC5jb250YWlucyhMKSl8fChsPT1udWxsfHxsKE8pLHM9PW51bGx8fHMoTyksTy5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKTtyZXR1cm4gbTMoTz0+e3g9PT1jLmxheWVycy5zaXplLTEmJihpPT1udWxsfHxpKE8pLCFPLmRlZmF1bHRQcmV2ZW50ZWQmJmEmJihPLnByZXZlbnREZWZhdWx0KCksYSgpKSl9LGgpLHAudXNlRWZmZWN0KCgpPT57aWYoZClyZXR1cm4gciYmKGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTAmJihQeD1oLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKGQpKSxjLmxheWVycy5hZGQoZCksQXgoKSwoKT0+e3ImJmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTEmJihoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1QeCl9fSxbZCxoLHIsY10pLHAudXNlRWZmZWN0KCgpPT4oKT0+e2QmJihjLmxheWVycy5kZWxldGUoZCksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoZCksQXgoKSl9LFtkLGNdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IE89KCk9Pm0oe30pO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEZnLE8pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEZnLE8pfSxbXSkscC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSx1LHtyZWY6ZyxzdHlsZTp7cG9pbnRlckV2ZW50czpTP2I/ImF1dG8iOiJub25lIjp2b2lkIDAsLi4udC5zdHlsZX0sb25Gb2N1c0NhcHR1cmU6bnQodC5vbkZvY3VzQ2FwdHVyZSwkLm9uRm9jdXNDYXB0dXJlKSxvbkJsdXJDYXB0dXJlOm50KHQub25CbHVyQ2FwdHVyZSwkLm9uQmx1ckNhcHR1cmUpLG9uUG9pbnRlckRvd25DYXB0dXJlOm50KHQub25Qb2ludGVyRG93bkNhcHR1cmUsVC5vblBvaW50ZXJEb3duQ2FwdHVyZSl9KSl9KTtmdW5jdGlvbiB3Myh0LGU9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKCExKSxpPXAudXNlUmVmKCgpPT57fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgbz1zPT57aWYocy50YXJnZXQmJiFyLmN1cnJlbnQpe2xldCBjPWZ1bmN0aW9uKCl7SUModjMsbix1LHtkaXNjcmV0ZTohMH0pfTt2YXIgYT1jO2NvbnN0IHU9e29yaWdpbmFsRXZlbnQ6c307cy5wb2ludGVyVHlwZT09PSJ0b3VjaCI/KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCksaS5jdXJyZW50PWMsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsaS5jdXJyZW50LHtvbmNlOiEwfSkpOmMoKX1lbHNlIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkuY3VycmVudCk7ci5jdXJyZW50PSExfSxsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57ZS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsbyl9LDApO3JldHVybigpPT57d2luZG93LmNsZWFyVGltZW91dChsKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixvKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixpLmN1cnJlbnQpfX0sW2Usbl0pLHtvblBvaW50ZXJEb3duQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwfX1mdW5jdGlvbiBTMyh0LGU9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1lbih0KSxyPXAudXNlUmVmKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBpPW89PntvLnRhcmdldCYmIXIuY3VycmVudCYmSUMoeTMsbix7b3JpZ2luYWxFdmVudDpvfSx7ZGlzY3JldGU6ITF9KX07cmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsaSksKCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsaSl9LFtlLG5dKSx7b25Gb2N1c0NhcHR1cmU6KCk9PnIuY3VycmVudD0hMCxvbkJsdXJDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITF9fWZ1bmN0aW9uIEF4KCl7Y29uc3QgdD1uZXcgQ3VzdG9tRXZlbnQoRmcpO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodCl9ZnVuY3Rpb24gSUModCxlLG4se2Rpc2NyZXRlOnJ9KXtjb25zdCBpPW4ub3JpZ2luYWxFdmVudC50YXJnZXQsbz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczohMSxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7ZSYmaS5hZGRFdmVudExpc3RlbmVyKHQsZSx7b25jZTohMH0pLHI/dDIoaSxvKTppLmRpc3BhdGNoRXZlbnQobyl9bGV0IEZoPTA7ZnVuY3Rpb24gRTMoKXtwLnVzZUVmZmVjdCgoKT0+e3ZhciB0LGU7Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLCh0PW5bMF0pIT09bnVsbCYmdCE9PXZvaWQgMD90Ok14KCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLChlPW5bMV0pIT09bnVsbCYmZSE9PXZvaWQgMD9lOk14KCkpLEZoKyssKCk9PntGaD09PTEmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpLmZvckVhY2gocj0+ci5yZW1vdmUoKSksRmgtLX19LFtdKX1mdW5jdGlvbiBNeCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZCIsIiIpLHQudGFiSW5kZXg9MCx0LnN0eWxlLmNzc1RleHQ9Im91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmUiLHR9Y29uc3QgQmg9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudCIsVWg9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50IixMeD17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxDMz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtsb29wOm49ITEsdHJhcHBlZDpyPSExLG9uTW91bnRBdXRvRm9jdXM6aSxvblVubW91bnRBdXRvRm9jdXM6bywuLi5sfT10LFtzLGFdPXAudXNlU3RhdGUobnVsbCksdT1lbihpKSxjPWVuKG8pLGQ9cC51c2VSZWYobnVsbCksZj1zdChlLGc9PmEoZykpLGg9cC51c2VSZWYoe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KS5jdXJyZW50O3AudXNlRWZmZWN0KCgpPT57aWYocil7bGV0IHk9ZnVuY3Rpb24oVCl7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCAkPVQudGFyZ2V0O3MuY29udGFpbnMoJCk/ZC5jdXJyZW50PSQ6T2koZC5jdXJyZW50LHtzZWxlY3Q6ITB9KX0seD1mdW5jdGlvbihUKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0ICQ9VC5yZWxhdGVkVGFyZ2V0OyQhPT1udWxsJiYocy5jb250YWlucygkKXx8T2koZC5jdXJyZW50LHtzZWxlY3Q6ITB9KSl9LFM9ZnVuY3Rpb24oVCl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpZm9yKGNvbnN0IE8gb2YgVClPLnJlbW92ZWROb2Rlcy5sZW5ndGg+MCYmT2kocyl9O3ZhciBnPXksdz14LHY9Uztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCk7Y29uc3QgYj1uZXcgTXV0YXRpb25PYnNlcnZlcihTKTtyZXR1cm4gcyYmYi5vYnNlcnZlKHMse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCksYi5kaXNjb25uZWN0KCl9fX0sW3IscyxoLnBhdXNlZF0pLHAudXNlRWZmZWN0KCgpPT57aWYocyl7RHguYWRkKGgpO2NvbnN0IGc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighcy5jb250YWlucyhnKSl7Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoQmgsTHgpO3MuYWRkRXZlbnRMaXN0ZW5lcihCaCx1KSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHwoazMoUjMoREMocykpLHtzZWxlY3Q6ITB9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZyYmT2kocykpfXJldHVybigpPT57cy5yZW1vdmVFdmVudExpc3RlbmVyKEJoLHUpLHNldFRpbWVvdXQoKCk9Pntjb25zdCB2PW5ldyBDdXN0b21FdmVudChVaCxMeCk7cy5hZGRFdmVudExpc3RlbmVyKFVoLGMpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fE9pKGc/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihVaCxjKSxEeC5yZW1vdmUoaCl9LDApfX19LFtzLHUsYyxoXSk7Y29uc3QgbT1wLnVzZUNhbGxiYWNrKGc9PntpZighbiYmIXJ8fGgucGF1c2VkKXJldHVybjtjb25zdCB3PWcua2V5PT09IlRhYiImJiFnLmFsdEtleSYmIWcuY3RybEtleSYmIWcubWV0YUtleSx2PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodyYmdil7Y29uc3QgeT1nLmN1cnJlbnRUYXJnZXQsW3gsU109YjMoeSk7eCYmUz8hZy5zaGlmdEtleSYmdj09PVM/KGcucHJldmVudERlZmF1bHQoKSxuJiZPaSh4LHtzZWxlY3Q6ITB9KSk6Zy5zaGlmdEtleSYmdj09PXgmJihnLnByZXZlbnREZWZhdWx0KCksbiYmT2koUyx7c2VsZWN0OiEwfSkpOnY9PT15JiZnLnByZXZlbnREZWZhdWx0KCl9fSxbbixyLGgucGF1c2VkXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe3RhYkluZGV4Oi0xfSxsLHtyZWY6ZixvbktleURvd246bX0pKX0pO2Z1bmN0aW9uIGszKHQse3NlbGVjdDplPSExfT17fSl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCByIG9mIHQpaWYoT2kocix7c2VsZWN0OmV9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm59ZnVuY3Rpb24gYjModCl7Y29uc3QgZT1EQyh0KSxuPUl4KGUsdCkscj1JeChlLnJldmVyc2UoKSx0KTtyZXR1cm5bbixyXX1mdW5jdGlvbiBEQyh0KXtjb25zdCBlPVtdLG49ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULHthY2NlcHROb2RlOnI9Pntjb25zdCBpPXIudGFnTmFtZT09PSJJTlBVVCImJnIudHlwZT09PSJoaWRkZW4iO3JldHVybiByLmRpc2FibGVkfHxyLmhpZGRlbnx8aT9Ob2RlRmlsdGVyLkZJTFRFUl9TS0lQOnIudGFiSW5kZXg+PTA/Tm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOk5vZGVGaWx0ZXIuRklMVEVSX1NLSVB9fSk7Zm9yKDtuLm5leHROb2RlKCk7KWUucHVzaChuLmN1cnJlbnROb2RlKTtyZXR1cm4gZX1mdW5jdGlvbiBJeCh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoISQzKG4se3VwVG86ZX0pKXJldHVybiBufWZ1bmN0aW9uICQzKHQse3VwVG86ZX0pe2lmKGdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eT09PSJoaWRkZW4iKXJldHVybiEwO2Zvcig7dDspe2lmKGUhPT12b2lkIDAmJnQ9PT1lKXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUodCkuZGlzcGxheT09PSJub25lIilyZXR1cm4hMDt0PXQucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBUMyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJiJzZWxlY3QiaW4gdH1mdW5jdGlvbiBPaSh0LHtzZWxlY3Q6ZT0hMX09e30pe2lmKHQmJnQuZm9jdXMpe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksdCE9PW4mJlQzKHQpJiZlJiZ0LnNlbGVjdCgpfX1jb25zdCBEeD1OMygpO2Z1bmN0aW9uIE4zKCl7bGV0IHQ9W107cmV0dXJue2FkZChlKXtjb25zdCBuPXRbMF07ZSE9PW4mJihuPT1udWxsfHxuLnBhdXNlKCkpLHQ9angodCxlKSx0LnVuc2hpZnQoZSl9LHJlbW92ZShlKXt2YXIgbjt0PWp4KHQsZSksKG49dFswXSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLnJlc3VtZSgpfX19ZnVuY3Rpb24gangodCxlKXtjb25zdCBuPVsuLi50XSxyPW4uaW5kZXhPZihlKTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59ZnVuY3Rpb24gUjModCl7cmV0dXJuIHQuZmlsdGVyKGU9PmUudGFnTmFtZSE9PSJBIil9Y29uc3QgTzM9TV8udXNlSWR8fCgoKT0+e30pO2xldCBQMz0wO2Z1bmN0aW9uIERmKHQpe2NvbnN0W2Usbl09cC51c2VTdGF0ZShPMygpKTtyZXR1cm4gVW4oKCk9Pnt0fHxuKHI9PnI/P1N0cmluZyhQMysrKSl9LFt0XSksdHx8KGU/YHJhZGl4LSR7ZX1gOiIiKX1jb25zdCBBMz1bInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLGZvPU1hdGgubWluLExuPU1hdGgubWF4LFlkPU1hdGgucm91bmQsU2M9TWF0aC5mbG9vcixobz10PT4oe3g6dCx5OnR9KSxNMz17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifSxMMz17c3RhcnQ6ImVuZCIsZW5kOiJzdGFydCJ9O2Z1bmN0aW9uIEJnKHQsZSxuKXtyZXR1cm4gTG4odCxmbyhlLG4pKX1mdW5jdGlvbiBtaSh0LGUpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnR9ZnVuY3Rpb24gdmkodCl7cmV0dXJuIHQuc3BsaXQoIi0iKVswXX1mdW5jdGlvbiBMcyh0KXtyZXR1cm4gdC5zcGxpdCgiLSIpWzFdfWZ1bmN0aW9uIEJ2KHQpe3JldHVybiB0PT09IngiPyJ5IjoieCJ9ZnVuY3Rpb24gVXYodCl7cmV0dXJuIHQ9PT0ieSI/ImhlaWdodCI6IndpZHRoIn1mdW5jdGlvbiBJcyh0KXtyZXR1cm5bInRvcCIsImJvdHRvbSJdLmluY2x1ZGVzKHZpKHQpKT8ieSI6IngifWZ1bmN0aW9uIFd2KHQpe3JldHVybiBCdihJcyh0KSl9ZnVuY3Rpb24gSTModCxlLG4pe249PT12b2lkIDAmJihuPSExKTtjb25zdCByPUxzKHQpLGk9V3YodCksbz1VdihpKTtsZXQgbD1pPT09IngiP3I9PT0obj8iZW5kIjoic3RhcnQiKT8icmlnaHQiOiJsZWZ0IjpyPT09InN0YXJ0Ij8iYm90dG9tIjoidG9wIjtyZXR1cm4gZS5yZWZlcmVuY2Vbb10+ZS5mbG9hdGluZ1tvXSYmKGw9WGQobCkpLFtsLFhkKGwpXX1mdW5jdGlvbiBEMyh0KXtjb25zdCBlPVhkKHQpO3JldHVybltVZyh0KSxlLFVnKGUpXX1mdW5jdGlvbiBVZyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9zdGFydHxlbmQvZyxlPT5MM1tlXSl9ZnVuY3Rpb24gajModCxlLG4pe2NvbnN0IHI9WyJsZWZ0IiwicmlnaHQiXSxpPVsicmlnaHQiLCJsZWZ0Il0sbz1bInRvcCIsImJvdHRvbSJdLGw9WyJib3R0b20iLCJ0b3AiXTtzd2l0Y2godCl7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjpyZXR1cm4gbj9lP2k6cjplP3I6aTtjYXNlImxlZnQiOmNhc2UicmlnaHQiOnJldHVybiBlP286bDtkZWZhdWx0OnJldHVybltdfX1mdW5jdGlvbiB6Myh0LGUsbixyKXtjb25zdCBpPUxzKHQpO2xldCBvPWozKHZpKHQpLG49PT0ic3RhcnQiLHIpO3JldHVybiBpJiYobz1vLm1hcChsPT5sKyItIitpKSxlJiYobz1vLmNvbmNhdChvLm1hcChVZykpKSksb31mdW5jdGlvbiBYZCh0KXtyZXR1cm4gdC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxlPT5NM1tlXSl9ZnVuY3Rpb24gRjModCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLnR9fWZ1bmN0aW9uIGpDKHQpe3JldHVybiB0eXBlb2YgdCE9Im51bWJlciI/RjModCk6e3RvcDp0LHJpZ2h0OnQsYm90dG9tOnQsbGVmdDp0fX1mdW5jdGlvbiBRZCh0KXtyZXR1cm57Li4udCx0b3A6dC55LGxlZnQ6dC54LHJpZ2h0OnQueCt0LndpZHRoLGJvdHRvbTp0LnkrdC5oZWlnaHR9fWZ1bmN0aW9uIHp4KHQsZSxuKXtsZXR7cmVmZXJlbmNlOnIsZmxvYXRpbmc6aX09dDtjb25zdCBvPUlzKGUpLGw9V3YoZSkscz1VdihsKSxhPXZpKGUpLHU9bz09PSJ5IixjPXIueCtyLndpZHRoLzItaS53aWR0aC8yLGQ9ci55K3IuaGVpZ2h0LzItaS5oZWlnaHQvMixmPXJbc10vMi1pW3NdLzI7bGV0IGg7c3dpdGNoKGEpe2Nhc2UidG9wIjpoPXt4OmMseTpyLnktaS5oZWlnaHR9O2JyZWFrO2Nhc2UiYm90dG9tIjpoPXt4OmMseTpyLnkrci5oZWlnaHR9O2JyZWFrO2Nhc2UicmlnaHQiOmg9e3g6ci54K3Iud2lkdGgseTpkfTticmVhaztjYXNlImxlZnQiOmg9e3g6ci54LWkud2lkdGgseTpkfTticmVhaztkZWZhdWx0Omg9e3g6ci54LHk6ci55fX1zd2l0Y2goTHMoZSkpe2Nhc2Uic3RhcnQiOmhbbF0tPWYqKG4mJnU/LTE6MSk7YnJlYWs7Y2FzZSJlbmQiOmhbbF0rPWYqKG4mJnU/LTE6MSk7YnJlYWt9cmV0dXJuIGh9Y29uc3QgQjM9YXN5bmModCxlLG4pPT57Y29uc3R7cGxhY2VtZW50OnI9ImJvdHRvbSIsc3RyYXRlZ3k6aT0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6bz1bXSxwbGF0Zm9ybTpsfT1uLHM9by5maWx0ZXIoQm9vbGVhbiksYT1hd2FpdChsLmlzUlRMPT1udWxsP3ZvaWQgMDpsLmlzUlRMKGUpKTtsZXQgdT1hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOnQsZmxvYXRpbmc6ZSxzdHJhdGVneTppfSkse3g6Yyx5OmR9PXp4KHUscixhKSxmPXIsaD17fSxtPTA7Zm9yKGxldCBnPTA7ZzxzLmxlbmd0aDtnKyspe2NvbnN0e25hbWU6dyxmbjp2fT1zW2ddLHt4OnkseTp4LGRhdGE6UyxyZXNldDpifT1hd2FpdCB2KHt4OmMseTpkLGluaXRpYWxQbGFjZW1lbnQ6cixwbGFjZW1lbnQ6ZixzdHJhdGVneTppLG1pZGRsZXdhcmVEYXRhOmgscmVjdHM6dSxwbGF0Zm9ybTpsLGVsZW1lbnRzOntyZWZlcmVuY2U6dCxmbG9hdGluZzplfX0pO2lmKGM9eT8/YyxkPXg/P2QsaD17Li4uaCxbd106ey4uLmhbd10sLi4uU319LGImJm08PTUwKXttKyssdHlwZW9mIGI9PSJvYmplY3QiJiYoYi5wbGFjZW1lbnQmJihmPWIucGxhY2VtZW50KSxiLnJlY3RzJiYodT1iLnJlY3RzPT09ITA/YXdhaXQgbC5nZXRFbGVtZW50UmVjdHMoe3JlZmVyZW5jZTp0LGZsb2F0aW5nOmUsc3RyYXRlZ3k6aX0pOmIucmVjdHMpLHt4OmMseTpkfT16eCh1LGYsYSkpLGc9LTE7Y29udGludWV9fXJldHVybnt4OmMseTpkLHBsYWNlbWVudDpmLHN0cmF0ZWd5OmksbWlkZGxld2FyZURhdGE6aH19O2FzeW5jIGZ1bmN0aW9uIEV1KHQsZSl7dmFyIG47ZT09PXZvaWQgMCYmKGU9e30pO2NvbnN0e3g6cix5OmkscGxhdGZvcm06byxyZWN0czpsLGVsZW1lbnRzOnMsc3RyYXRlZ3k6YX09dCx7Ym91bmRhcnk6dT0iY2xpcHBpbmdBbmNlc3RvcnMiLHJvb3RCb3VuZGFyeTpjPSJ2aWV3cG9ydCIsZWxlbWVudENvbnRleHQ6ZD0iZmxvYXRpbmciLGFsdEJvdW5kYXJ5OmY9ITEscGFkZGluZzpoPTB9PW1pKGUsdCksbT1qQyhoKSx3PXNbZj9kPT09ImZsb2F0aW5nIj8icmVmZXJlbmNlIjoiZmxvYXRpbmciOmRdLHY9UWQoYXdhaXQgby5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6KG49YXdhaXQoby5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOm8uaXNFbGVtZW50KHcpKSk9PW51bGx8fG4/dzp3LmNvbnRleHRFbGVtZW50fHxhd2FpdChvLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6by5nZXREb2N1bWVudEVsZW1lbnQocy5mbG9hdGluZykpLGJvdW5kYXJ5OnUscm9vdEJvdW5kYXJ5OmMsc3RyYXRlZ3k6YX0pKSx5PWQ9PT0iZmxvYXRpbmciP3suLi5sLmZsb2F0aW5nLHg6cix5Oml9OmwucmVmZXJlbmNlLHg9YXdhaXQoby5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOm8uZ2V0T2Zmc2V0UGFyZW50KHMuZmxvYXRpbmcpKSxTPWF3YWl0KG8uaXNFbGVtZW50PT1udWxsP3ZvaWQgMDpvLmlzRWxlbWVudCh4KSk/YXdhaXQoby5nZXRTY2FsZT09bnVsbD92b2lkIDA6by5nZXRTY2FsZSh4KSl8fHt4OjEseToxfTp7eDoxLHk6MX0sYj1RZChvLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0P2F3YWl0IG8uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe3JlY3Q6eSxvZmZzZXRQYXJlbnQ6eCxzdHJhdGVneTphfSk6eSk7cmV0dXJue3RvcDoodi50b3AtYi50b3ArbS50b3ApL1MueSxib3R0b206KGIuYm90dG9tLXYuYm90dG9tK20uYm90dG9tKS9TLnksbGVmdDoodi5sZWZ0LWIubGVmdCttLmxlZnQpL1MueCxyaWdodDooYi5yaWdodC12LnJpZ2h0K20ucmlnaHQpL1MueH19Y29uc3QgRng9dD0+KHtuYW1lOiJhcnJvdyIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50OmkscmVjdHM6byxwbGF0Zm9ybTpsLGVsZW1lbnRzOnMsbWlkZGxld2FyZURhdGE6YX09ZSx7ZWxlbWVudDp1LHBhZGRpbmc6Yz0wfT1taSh0LGUpfHx7fTtpZih1PT1udWxsKXJldHVybnt9O2NvbnN0IGQ9akMoYyksZj17eDpuLHk6cn0saD1XdihpKSxtPVV2KGgpLGc9YXdhaXQgbC5nZXREaW1lbnNpb25zKHUpLHc9aD09PSJ5Iix2PXc/InRvcCI6ImxlZnQiLHk9dz8iYm90dG9tIjoicmlnaHQiLHg9dz8iY2xpZW50SGVpZ2h0IjoiY2xpZW50V2lkdGgiLFM9by5yZWZlcmVuY2VbbV0rby5yZWZlcmVuY2VbaF0tZltoXS1vLmZsb2F0aW5nW21dLGI9ZltoXS1vLnJlZmVyZW5jZVtoXSxUPWF3YWl0KGwuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDpsLmdldE9mZnNldFBhcmVudCh1KSk7bGV0ICQ9VD9UW3hdOjA7KCEkfHwhYXdhaXQobC5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmwuaXNFbGVtZW50KFQpKSkmJigkPXMuZmxvYXRpbmdbeF18fG8uZmxvYXRpbmdbbV0pO2NvbnN0IE89Uy8yLWIvMixMPSQvMi1nW21dLzItMSxQPWZvKGRbdl0sTCksRD1mbyhkW3ldLEwpLEI9UCxvZT0kLWdbbV0tRCxIPSQvMi1nW21dLzIrTyxaPUJnKEIsSCxvZSksQz0hYS5hcnJvdyYmTHMoaSkhPW51bGwmJkghPVomJm8ucmVmZXJlbmNlW21dLzItKEg8Qj9QOkQpLWdbbV0vMjwwLGs9Qz9IPEI/SC1COkgtb2U6MDtyZXR1cm57W2hdOmZbaF0rayxkYXRhOntbaF06WixjZW50ZXJPZmZzZXQ6SC1aLWssLi4uQyYme2FsaWdubWVudE9mZnNldDprfX0scmVzZXQ6Q319fSksVTM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToiZmxpcCIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe3ZhciBuLHI7Y29uc3R7cGxhY2VtZW50OmksbWlkZGxld2FyZURhdGE6byxyZWN0czpsLGluaXRpYWxQbGFjZW1lbnQ6cyxwbGF0Zm9ybTphLGVsZW1lbnRzOnV9PWUse21haW5BeGlzOmM9ITAsY3Jvc3NBeGlzOmQ9ITAsZmFsbGJhY2tQbGFjZW1lbnRzOmYsZmFsbGJhY2tTdHJhdGVneTpoPSJiZXN0Rml0IixmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOm09Im5vbmUiLGZsaXBBbGlnbm1lbnQ6Zz0hMCwuLi53fT1taSh0LGUpO2lmKChuPW8uYXJyb3cpIT1udWxsJiZuLmFsaWdubWVudE9mZnNldClyZXR1cm57fTtjb25zdCB2PXZpKGkpLHk9dmkocyk9PT1zLHg9YXdhaXQoYS5pc1JUTD09bnVsbD92b2lkIDA6YS5pc1JUTCh1LmZsb2F0aW5nKSksUz1mfHwoeXx8IWc/W1hkKHMpXTpEMyhzKSk7IWYmJm0hPT0ibm9uZSImJlMucHVzaCguLi56MyhzLGcsbSx4KSk7Y29uc3QgYj1bcywuLi5TXSxUPWF3YWl0IEV1KGUsdyksJD1bXTtsZXQgTz0oKHI9by5mbGlwKT09bnVsbD92b2lkIDA6ci5vdmVyZmxvd3MpfHxbXTtpZihjJiYkLnB1c2goVFt2XSksZCl7Y29uc3QgQj1JMyhpLGwseCk7JC5wdXNoKFRbQlswXV0sVFtCWzFdXSl9aWYoTz1bLi4uTyx7cGxhY2VtZW50Omksb3ZlcmZsb3dzOiR9XSwhJC5ldmVyeShCPT5CPD0wKSl7dmFyIEwsUDtjb25zdCBCPSgoKEw9by5mbGlwKT09bnVsbD92b2lkIDA6TC5pbmRleCl8fDApKzEsb2U9YltCXTtpZihvZSlyZXR1cm57ZGF0YTp7aW5kZXg6QixvdmVyZmxvd3M6T30scmVzZXQ6e3BsYWNlbWVudDpvZX19O2xldCBIPShQPU8uZmlsdGVyKFo9Ploub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChaLEMpPT5aLm92ZXJmbG93c1sxXS1DLm92ZXJmbG93c1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpQLnBsYWNlbWVudDtpZighSClzd2l0Y2goaCl7Y2FzZSJiZXN0Rml0Ijp7dmFyIEQ7Y29uc3QgWj0oRD1PLm1hcChDPT5bQy5wbGFjZW1lbnQsQy5vdmVyZmxvd3MuZmlsdGVyKGs9Pms+MCkucmVkdWNlKChrLEUpPT5rK0UsMCldKS5zb3J0KChDLGspPT5DWzFdLWtbMV0pWzBdKT09bnVsbD92b2lkIDA6RFswXTtaJiYoSD1aKTticmVha31jYXNlImluaXRpYWxQbGFjZW1lbnQiOkg9czticmVha31pZihpIT09SClyZXR1cm57cmVzZXQ6e3BsYWNlbWVudDpIfX19cmV0dXJue319fX07ZnVuY3Rpb24gQngodCxlKXtyZXR1cm57dG9wOnQudG9wLWUuaGVpZ2h0LHJpZ2h0OnQucmlnaHQtZS53aWR0aCxib3R0b206dC5ib3R0b20tZS5oZWlnaHQsbGVmdDp0LmxlZnQtZS53aWR0aH19ZnVuY3Rpb24gVXgodCl7cmV0dXJuIEEzLnNvbWUoZT0+dFtlXT49MCl9Y29uc3QgVzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToiaGlkZSIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3JlY3RzOm59PWUse3N0cmF0ZWd5OnI9InJlZmVyZW5jZUhpZGRlbiIsLi4uaX09bWkodCxlKTtzd2l0Y2gocil7Y2FzZSJyZWZlcmVuY2VIaWRkZW4iOntjb25zdCBvPWF3YWl0IEV1KGUsey4uLmksZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxsPUJ4KG8sbi5yZWZlcmVuY2UpO3JldHVybntkYXRhOntyZWZlcmVuY2VIaWRkZW5PZmZzZXRzOmwscmVmZXJlbmNlSGlkZGVuOlV4KGwpfX19Y2FzZSJlc2NhcGVkIjp7Y29uc3Qgbz1hd2FpdCBFdShlLHsuLi5pLGFsdEJvdW5kYXJ5OiEwfSksbD1CeChvLG4uZmxvYXRpbmcpO3JldHVybntkYXRhOntlc2NhcGVkT2Zmc2V0czpsLGVzY2FwZWQ6VXgobCl9fX1kZWZhdWx0OnJldHVybnt9fX19fTthc3luYyBmdW5jdGlvbiBWMyh0LGUpe2NvbnN0e3BsYWNlbWVudDpuLHBsYXRmb3JtOnIsZWxlbWVudHM6aX09dCxvPWF3YWl0KHIuaXNSVEw9PW51bGw/dm9pZCAwOnIuaXNSVEwoaS5mbG9hdGluZykpLGw9dmkobikscz1McyhuKSxhPUlzKG4pPT09InkiLHU9WyJsZWZ0IiwidG9wIl0uaW5jbHVkZXMobCk/LTE6MSxjPW8mJmE/LTE6MSxkPW1pKGUsdCk7bGV0e21haW5BeGlzOmYsY3Jvc3NBeGlzOmgsYWxpZ25tZW50QXhpczptfT10eXBlb2YgZD09Im51bWJlciI/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGwsLi4uZH07cmV0dXJuIHMmJnR5cGVvZiBtPT0ibnVtYmVyIiYmKGg9cz09PSJlbmQiP20qLTE6bSksYT97eDpoKmMseTpmKnV9Ont4OmYqdSx5OmgqY319Y29uc3QgSDM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PTApLHtuYW1lOiJvZmZzZXQiLG9wdGlvbnM6dCxhc3luYyBmbihlKXtjb25zdHt4Om4seTpyfT1lLGk9YXdhaXQgVjMoZSx0KTtyZXR1cm57eDpuK2kueCx5OnIraS55LGRhdGE6aX19fX0sSzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToic2hpZnQiLG9wdGlvbnM6dCxhc3luYyBmbihlKXtjb25zdHt4Om4seTpyLHBsYWNlbWVudDppfT1lLHttYWluQXhpczpvPSEwLGNyb3NzQXhpczpsPSExLGxpbWl0ZXI6cz17Zm46dz0+e2xldHt4OnYseX09dztyZXR1cm57eDp2LHl9fX0sLi4uYX09bWkodCxlKSx1PXt4Om4seTpyfSxjPWF3YWl0IEV1KGUsYSksZD1Jcyh2aShpKSksZj1CdihkKTtsZXQgaD11W2ZdLG09dVtkXTtpZihvKXtjb25zdCB3PWY9PT0ieSI/InRvcCI6ImxlZnQiLHY9Zj09PSJ5Ij8iYm90dG9tIjoicmlnaHQiLHk9aCtjW3ddLHg9aC1jW3ZdO2g9QmcoeSxoLHgpfWlmKGwpe2NvbnN0IHc9ZD09PSJ5Ij8idG9wIjoibGVmdCIsdj1kPT09InkiPyJib3R0b20iOiJyaWdodCIseT1tK2Nbd10seD1tLWNbdl07bT1CZyh5LG0seCl9Y29uc3QgZz1zLmZuKHsuLi5lLFtmXTpoLFtkXTptfSk7cmV0dXJuey4uLmcsZGF0YTp7eDpnLngtbix5OmcueS1yfX19fX0sWjM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7b3B0aW9uczp0LGZuKGUpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50OmkscmVjdHM6byxtaWRkbGV3YXJlRGF0YTpsfT1lLHtvZmZzZXQ6cz0wLG1haW5BeGlzOmE9ITAsY3Jvc3NBeGlzOnU9ITB9PW1pKHQsZSksYz17eDpuLHk6cn0sZD1JcyhpKSxmPUJ2KGQpO2xldCBoPWNbZl0sbT1jW2RdO2NvbnN0IGc9bWkocyxlKSx3PXR5cGVvZiBnPT0ibnVtYmVyIj97bWFpbkF4aXM6Zyxjcm9zc0F4aXM6MH06e21haW5BeGlzOjAsY3Jvc3NBeGlzOjAsLi4uZ307aWYoYSl7Y29uc3QgeD1mPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsUz1vLnJlZmVyZW5jZVtmXS1vLmZsb2F0aW5nW3hdK3cubWFpbkF4aXMsYj1vLnJlZmVyZW5jZVtmXStvLnJlZmVyZW5jZVt4XS13Lm1haW5BeGlzO2g8Uz9oPVM6aD5iJiYoaD1iKX1pZih1KXt2YXIgdix5O2NvbnN0IHg9Zj09PSJ5Ij8id2lkdGgiOiJoZWlnaHQiLFM9WyJ0b3AiLCJsZWZ0Il0uaW5jbHVkZXModmkoaSkpLGI9by5yZWZlcmVuY2VbZF0tby5mbG9hdGluZ1t4XSsoUyYmKCh2PWwub2Zmc2V0KT09bnVsbD92b2lkIDA6dltkXSl8fDApKyhTPzA6dy5jcm9zc0F4aXMpLFQ9by5yZWZlcmVuY2VbZF0rby5yZWZlcmVuY2VbeF0rKFM/MDooKHk9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp5W2RdKXx8MCktKFM/dy5jcm9zc0F4aXM6MCk7bTxiP209YjptPlQmJihtPVQpfXJldHVybntbZl06aCxbZF06bX19fX0sRzM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXt9KSx7bmFtZToic2l6ZSIsb3B0aW9uczp0LGFzeW5jIGZuKGUpe2NvbnN0e3BsYWNlbWVudDpuLHJlY3RzOnIscGxhdGZvcm06aSxlbGVtZW50czpvfT1lLHthcHBseTpsPSgpPT57fSwuLi5zfT1taSh0LGUpLGE9YXdhaXQgRXUoZSxzKSx1PXZpKG4pLGM9THMobiksZD1JcyhuKT09PSJ5Iix7d2lkdGg6ZixoZWlnaHQ6aH09ci5mbG9hdGluZztsZXQgbSxnO3U9PT0idG9wInx8dT09PSJib3R0b20iPyhtPXUsZz1jPT09KGF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwoby5mbG9hdGluZykpPyJzdGFydCI6ImVuZCIpPyJsZWZ0IjoicmlnaHQiKTooZz11LG09Yz09PSJlbmQiPyJ0b3AiOiJib3R0b20iKTtjb25zdCB3PWgtYVttXSx2PWYtYVtnXSx5PSFlLm1pZGRsZXdhcmVEYXRhLnNoaWZ0O2xldCB4PXcsUz12O2lmKGQpe2NvbnN0IFQ9Zi1hLmxlZnQtYS5yaWdodDtTPWN8fHk/Zm8odixUKTpUfWVsc2V7Y29uc3QgVD1oLWEudG9wLWEuYm90dG9tO3g9Y3x8eT9mbyh3LFQpOlR9aWYoeSYmIWMpe2NvbnN0IFQ9TG4oYS5sZWZ0LDApLCQ9TG4oYS5yaWdodCwwKSxPPUxuKGEudG9wLDApLEw9TG4oYS5ib3R0b20sMCk7ZD9TPWYtMiooVCE9PTB8fCQhPT0wP1QrJDpMbihhLmxlZnQsYS5yaWdodCkpOng9aC0yKihPIT09MHx8TCE9PTA/TytMOkxuKGEudG9wLGEuYm90dG9tKSl9YXdhaXQgbCh7Li4uZSxhdmFpbGFibGVXaWR0aDpTLGF2YWlsYWJsZUhlaWdodDp4fSk7Y29uc3QgYj1hd2FpdCBpLmdldERpbWVuc2lvbnMoby5mbG9hdGluZyk7cmV0dXJuIGYhPT1iLndpZHRofHxoIT09Yi5oZWlnaHQ/e3Jlc2V0OntyZWN0czohMH19Ont9fX19O2Z1bmN0aW9uIHBvKHQpe3JldHVybiB6Qyh0KT8odC5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6IiNkb2N1bWVudCJ9ZnVuY3Rpb24gRm4odCl7dmFyIGU7cmV0dXJuKHQ9PW51bGx8fChlPXQub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuZGVmYXVsdFZpZXcpfHx3aW5kb3d9ZnVuY3Rpb24gQ2kodCl7dmFyIGU7cmV0dXJuKGU9KHpDKHQpP3Qub3duZXJEb2N1bWVudDp0LmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KT09bnVsbD92b2lkIDA6ZS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gekModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOb2RlfHx0IGluc3RhbmNlb2YgRm4odCkuTm9kZX1mdW5jdGlvbiB5aSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEVsZW1lbnR8fHQgaW5zdGFuY2VvZiBGbih0KS5FbGVtZW50fWZ1bmN0aW9uIFpyKHQpe3JldHVybiB0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR8fHQgaW5zdGFuY2VvZiBGbih0KS5IVE1MRWxlbWVudH1mdW5jdGlvbiBXeCh0KXtyZXR1cm4gdHlwZW9mIFNoYWRvd1Jvb3Q+InUiPyExOnQgaW5zdGFuY2VvZiBTaGFkb3dSb290fHx0IGluc3RhbmNlb2YgRm4odCkuU2hhZG93Um9vdH1mdW5jdGlvbiBXdSh0KXtjb25zdHtvdmVyZmxvdzplLG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6aX09aXIodCk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QoZStyK24pJiYhWyJpbmxpbmUiLCJjb250ZW50cyJdLmluY2x1ZGVzKGkpfWZ1bmN0aW9uIFkzKHQpe3JldHVyblsidGFibGUiLCJ0ZCIsInRoIl0uaW5jbHVkZXMocG8odCkpfWZ1bmN0aW9uIFZ2KHQpe2NvbnN0IGU9SHYoKSxuPWlyKHQpO3JldHVybiBuLnRyYW5zZm9ybSE9PSJub25lInx8bi5wZXJzcGVjdGl2ZSE9PSJub25lInx8KG4uY29udGFpbmVyVHlwZT9uLmNvbnRhaW5lclR5cGUhPT0ibm9ybWFsIjohMSl8fCFlJiYobi5iYWNrZHJvcEZpbHRlcj9uLmJhY2tkcm9wRmlsdGVyIT09Im5vbmUiOiExKXx8IWUmJihuLmZpbHRlcj9uLmZpbHRlciE9PSJub25lIjohMSl8fFsidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiLCJmaWx0ZXIiXS5zb21lKHI9PihuLndpbGxDaGFuZ2V8fCIiKS5pbmNsdWRlcyhyKSl8fFsicGFpbnQiLCJsYXlvdXQiLCJzdHJpY3QiLCJjb250ZW50Il0uc29tZShyPT4obi5jb250YWlufHwiIikuaW5jbHVkZXMocikpfWZ1bmN0aW9uIFgzKHQpe2xldCBlPWdzKHQpO2Zvcig7WnIoZSkmJiFqZihlKTspe2lmKFZ2KGUpKXJldHVybiBlO2U9Z3MoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSHYoKXtyZXR1cm4gdHlwZW9mIENTUz4idSJ8fCFDU1Muc3VwcG9ydHM/ITE6Q1NTLnN1cHBvcnRzKCItd2Via2l0LWJhY2tkcm9wLWZpbHRlciIsIm5vbmUiKX1mdW5jdGlvbiBqZih0KXtyZXR1cm5bImh0bWwiLCJib2R5IiwiI2RvY3VtZW50Il0uaW5jbHVkZXMocG8odCkpfWZ1bmN0aW9uIGlyKHQpe3JldHVybiBGbih0KS5nZXRDb21wdXRlZFN0eWxlKHQpfWZ1bmN0aW9uIHpmKHQpe3JldHVybiB5aSh0KT97c2Nyb2xsTGVmdDp0LnNjcm9sbExlZnQsc2Nyb2xsVG9wOnQuc2Nyb2xsVG9wfTp7c2Nyb2xsTGVmdDp0LnBhZ2VYT2Zmc2V0LHNjcm9sbFRvcDp0LnBhZ2VZT2Zmc2V0fX1mdW5jdGlvbiBncyh0KXtpZihwbyh0KT09PSJodG1sIilyZXR1cm4gdDtjb25zdCBlPXQuYXNzaWduZWRTbG90fHx0LnBhcmVudE5vZGV8fFd4KHQpJiZ0Lmhvc3R8fENpKHQpO3JldHVybiBXeChlKT9lLmhvc3Q6ZX1mdW5jdGlvbiBGQyh0KXtjb25zdCBlPWdzKHQpO3JldHVybiBqZihlKT90Lm93bmVyRG9jdW1lbnQ/dC5vd25lckRvY3VtZW50LmJvZHk6dC5ib2R5OlpyKGUpJiZXdShlKT9lOkZDKGUpfWZ1bmN0aW9uIEN1KHQsZSxuKXt2YXIgcjtlPT09dm9pZCAwJiYoZT1bXSksbj09PXZvaWQgMCYmKG49ITApO2NvbnN0IGk9RkModCksbz1pPT09KChyPXQub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnIuYm9keSksbD1GbihpKTtyZXR1cm4gbz9lLmNvbmNhdChsLGwudmlzdWFsVmlld3BvcnR8fFtdLFd1KGkpP2k6W10sbC5mcmFtZUVsZW1lbnQmJm4/Q3UobC5mcmFtZUVsZW1lbnQpOltdKTplLmNvbmNhdChpLEN1KGksW10sbikpfWZ1bmN0aW9uIEJDKHQpe2NvbnN0IGU9aXIodCk7bGV0IG49cGFyc2VGbG9hdChlLndpZHRoKXx8MCxyPXBhcnNlRmxvYXQoZS5oZWlnaHQpfHwwO2NvbnN0IGk9WnIodCksbz1pP3Qub2Zmc2V0V2lkdGg6bixsPWk/dC5vZmZzZXRIZWlnaHQ6cixzPVlkKG4pIT09b3x8WWQocikhPT1sO3JldHVybiBzJiYobj1vLHI9bCkse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiBLdih0KXtyZXR1cm4geWkodCk/dDp0LmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIEpsKHQpe2NvbnN0IGU9S3YodCk7aWYoIVpyKGUpKXJldHVybiBobygxKTtjb25zdCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3dpZHRoOnIsaGVpZ2h0OmksJDpvfT1CQyhlKTtsZXQgbD0obz9ZZChuLndpZHRoKTpuLndpZHRoKS9yLHM9KG8/WWQobi5oZWlnaHQpOm4uaGVpZ2h0KS9pO3JldHVybighbHx8IU51bWJlci5pc0Zpbml0ZShsKSkmJihsPTEpLCghc3x8IU51bWJlci5pc0Zpbml0ZShzKSkmJihzPTEpLHt4OmwseTpzfX1jb25zdCBRMz1obygwKTtmdW5jdGlvbiBVQyh0KXtjb25zdCBlPUZuKHQpO3JldHVybiFIdigpfHwhZS52aXN1YWxWaWV3cG9ydD9RMzp7eDplLnZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQseTplLnZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcH19ZnVuY3Rpb24gSjModCxlLG4pe3JldHVybiBlPT09dm9pZCAwJiYoZT0hMSksIW58fGUmJm4hPT1Gbih0KT8hMTplfWZ1bmN0aW9uIEpvKHQsZSxuLHIpe2U9PT12b2lkIDAmJihlPSExKSxuPT09dm9pZCAwJiYobj0hMSk7Y29uc3QgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89S3YodCk7bGV0IGw9aG8oMSk7ZSYmKHI/eWkocikmJihsPUpsKHIpKTpsPUpsKHQpKTtjb25zdCBzPUozKG8sbixyKT9VQyhvKTpobygwKTtsZXQgYT0oaS5sZWZ0K3MueCkvbC54LHU9KGkudG9wK3MueSkvbC55LGM9aS53aWR0aC9sLngsZD1pLmhlaWdodC9sLnk7aWYobyl7Y29uc3QgZj1GbihvKSxoPXImJnlpKHIpP0ZuKHIpOnI7bGV0IG09Zi5mcmFtZUVsZW1lbnQ7Zm9yKDttJiZyJiZoIT09Zjspe2NvbnN0IGc9SmwobSksdz1tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9aXIobSkseT13LmxlZnQrKG0uY2xpZW50TGVmdCtwYXJzZUZsb2F0KHYucGFkZGluZ0xlZnQpKSpnLngseD13LnRvcCsobS5jbGllbnRUb3ArcGFyc2VGbG9hdCh2LnBhZGRpbmdUb3ApKSpnLnk7YSo9Zy54LHUqPWcueSxjKj1nLngsZCo9Zy55LGErPXksdSs9eCxtPUZuKG0pLmZyYW1lRWxlbWVudH19cmV0dXJuIFFkKHt3aWR0aDpjLGhlaWdodDpkLHg6YSx5OnV9KX1mdW5jdGlvbiBxMyh0KXtsZXR7cmVjdDplLG9mZnNldFBhcmVudDpuLHN0cmF0ZWd5OnJ9PXQ7Y29uc3QgaT1acihuKSxvPUNpKG4pO2lmKG49PT1vKXJldHVybiBlO2xldCBsPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LHM9aG8oMSk7Y29uc3QgYT1obygwKTtpZigoaXx8IWkmJnIhPT0iZml4ZWQiKSYmKChwbyhuKSE9PSJib2R5Inx8V3UobykpJiYobD16ZihuKSksWnIobikpKXtjb25zdCB1PUpvKG4pO3M9SmwobiksYS54PXUueCtuLmNsaWVudExlZnQsYS55PXUueStuLmNsaWVudFRvcH1yZXR1cm57d2lkdGg6ZS53aWR0aCpzLngsaGVpZ2h0OmUuaGVpZ2h0KnMueSx4OmUueCpzLngtbC5zY3JvbGxMZWZ0KnMueCthLngseTplLnkqcy55LWwuc2Nyb2xsVG9wKnMueSthLnl9fWZ1bmN0aW9uIGVNKHQpe3JldHVybiBBcnJheS5mcm9tKHQuZ2V0Q2xpZW50UmVjdHMoKSl9ZnVuY3Rpb24gV0ModCl7cmV0dXJuIEpvKENpKHQpKS5sZWZ0K3pmKHQpLnNjcm9sbExlZnR9ZnVuY3Rpb24gdE0odCl7Y29uc3QgZT1DaSh0KSxuPXpmKHQpLHI9dC5vd25lckRvY3VtZW50LmJvZHksaT1MbihlLnNjcm9sbFdpZHRoLGUuY2xpZW50V2lkdGgsci5zY3JvbGxXaWR0aCxyLmNsaWVudFdpZHRoKSxvPUxuKGUuc2Nyb2xsSGVpZ2h0LGUuY2xpZW50SGVpZ2h0LHIuc2Nyb2xsSGVpZ2h0LHIuY2xpZW50SGVpZ2h0KTtsZXQgbD0tbi5zY3JvbGxMZWZ0K1dDKHQpO2NvbnN0IHM9LW4uc2Nyb2xsVG9wO3JldHVybiBpcihyKS5kaXJlY3Rpb249PT0icnRsIiYmKGwrPUxuKGUuY2xpZW50V2lkdGgsci5jbGllbnRXaWR0aCktaSkse3dpZHRoOmksaGVpZ2h0Om8seDpsLHk6c319ZnVuY3Rpb24gbk0odCxlKXtjb25zdCBuPUZuKHQpLHI9Q2kodCksaT1uLnZpc3VhbFZpZXdwb3J0O2xldCBvPXIuY2xpZW50V2lkdGgsbD1yLmNsaWVudEhlaWdodCxzPTAsYT0wO2lmKGkpe289aS53aWR0aCxsPWkuaGVpZ2h0O2NvbnN0IHU9SHYoKTsoIXV8fHUmJmU9PT0iZml4ZWQiKSYmKHM9aS5vZmZzZXRMZWZ0LGE9aS5vZmZzZXRUb3ApfXJldHVybnt3aWR0aDpvLGhlaWdodDpsLHg6cyx5OmF9fWZ1bmN0aW9uIHJNKHQsZSl7Y29uc3Qgbj1Kbyh0LCEwLGU9PT0iZml4ZWQiKSxyPW4udG9wK3QuY2xpZW50VG9wLGk9bi5sZWZ0K3QuY2xpZW50TGVmdCxvPVpyKHQpP0psKHQpOmhvKDEpLGw9dC5jbGllbnRXaWR0aCpvLngscz10LmNsaWVudEhlaWdodCpvLnksYT1pKm8ueCx1PXIqby55O3JldHVybnt3aWR0aDpsLGhlaWdodDpzLHg6YSx5OnV9fWZ1bmN0aW9uIFZ4KHQsZSxuKXtsZXQgcjtpZihlPT09InZpZXdwb3J0IilyPW5NKHQsbik7ZWxzZSBpZihlPT09ImRvY3VtZW50IilyPXRNKENpKHQpKTtlbHNlIGlmKHlpKGUpKXI9ck0oZSxuKTtlbHNle2NvbnN0IGk9VUModCk7cj17Li4uZSx4OmUueC1pLngseTplLnktaS55fX1yZXR1cm4gUWQocil9ZnVuY3Rpb24gVkModCxlKXtjb25zdCBuPWdzKHQpO3JldHVybiBuPT09ZXx8IXlpKG4pfHxqZihuKT8hMTppcihuKS5wb3NpdGlvbj09PSJmaXhlZCJ8fFZDKG4sZSl9ZnVuY3Rpb24gaU0odCxlKXtjb25zdCBuPWUuZ2V0KHQpO2lmKG4pcmV0dXJuIG47bGV0IHI9Q3UodCxbXSwhMSkuZmlsdGVyKHM9PnlpKHMpJiZwbyhzKSE9PSJib2R5IiksaT1udWxsO2NvbnN0IG89aXIodCkucG9zaXRpb249PT0iZml4ZWQiO2xldCBsPW8/Z3ModCk6dDtmb3IoO3lpKGwpJiYhamYobCk7KXtjb25zdCBzPWlyKGwpLGE9VnYobCk7IWEmJnMucG9zaXRpb249PT0iZml4ZWQiJiYoaT1udWxsKSwobz8hYSYmIWk6IWEmJnMucG9zaXRpb249PT0ic3RhdGljIiYmISFpJiZbImFic29sdXRlIiwiZml4ZWQiXS5pbmNsdWRlcyhpLnBvc2l0aW9uKXx8V3UobCkmJiFhJiZWQyh0LGwpKT9yPXIuZmlsdGVyKGM9PmMhPT1sKTppPXMsbD1ncyhsKX1yZXR1cm4gZS5zZXQodCxyKSxyfWZ1bmN0aW9uIG9NKHQpe2xldHtlbGVtZW50OmUsYm91bmRhcnk6bixyb290Qm91bmRhcnk6cixzdHJhdGVneTppfT10O2NvbnN0IGw9Wy4uLm49PT0iY2xpcHBpbmdBbmNlc3RvcnMiP2lNKGUsdGhpcy5fYyk6W10uY29uY2F0KG4pLHJdLHM9bFswXSxhPWwucmVkdWNlKCh1LGMpPT57Y29uc3QgZD1WeChlLGMsaSk7cmV0dXJuIHUudG9wPUxuKGQudG9wLHUudG9wKSx1LnJpZ2h0PWZvKGQucmlnaHQsdS5yaWdodCksdS5ib3R0b209Zm8oZC5ib3R0b20sdS5ib3R0b20pLHUubGVmdD1MbihkLmxlZnQsdS5sZWZ0KSx1fSxWeChlLHMsaSkpO3JldHVybnt3aWR0aDphLnJpZ2h0LWEubGVmdCxoZWlnaHQ6YS5ib3R0b20tYS50b3AseDphLmxlZnQseTphLnRvcH19ZnVuY3Rpb24gbE0odCl7cmV0dXJuIEJDKHQpfWZ1bmN0aW9uIHNNKHQsZSxuKXtjb25zdCByPVpyKGUpLGk9Q2koZSksbz1uPT09ImZpeGVkIixsPUpvKHQsITAsbyxlKTtsZXQgcz17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfTtjb25zdCBhPWhvKDApO2lmKHJ8fCFyJiYhbylpZigocG8oZSkhPT0iYm9keSJ8fFd1KGkpKSYmKHM9emYoZSkpLHIpe2NvbnN0IHU9Sm8oZSwhMCxvLGUpO2EueD11LngrZS5jbGllbnRMZWZ0LGEueT11LnkrZS5jbGllbnRUb3B9ZWxzZSBpJiYoYS54PVdDKGkpKTtyZXR1cm57eDpsLmxlZnQrcy5zY3JvbGxMZWZ0LWEueCx5OmwudG9wK3Muc2Nyb2xsVG9wLWEueSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH19ZnVuY3Rpb24gSHgodCxlKXtyZXR1cm4hWnIodCl8fGlyKHQpLnBvc2l0aW9uPT09ImZpeGVkIj9udWxsOmU/ZSh0KTp0Lm9mZnNldFBhcmVudH1mdW5jdGlvbiBIQyh0LGUpe2NvbnN0IG49Rm4odCk7aWYoIVpyKHQpKXJldHVybiBuO2xldCByPUh4KHQsZSk7Zm9yKDtyJiZZMyhyKSYmaXIocikucG9zaXRpb249PT0ic3RhdGljIjspcj1IeChyLGUpO3JldHVybiByJiYocG8ocik9PT0iaHRtbCJ8fHBvKHIpPT09ImJvZHkiJiZpcihyKS5wb3NpdGlvbj09PSJzdGF0aWMiJiYhVnYocikpP246cnx8WDModCl8fG59Y29uc3QgYU09YXN5bmMgZnVuY3Rpb24odCl7bGV0e3JlZmVyZW5jZTplLGZsb2F0aW5nOm4sc3RyYXRlZ3k6cn09dDtjb25zdCBpPXRoaXMuZ2V0T2Zmc2V0UGFyZW50fHxIQyxvPXRoaXMuZ2V0RGltZW5zaW9ucztyZXR1cm57cmVmZXJlbmNlOnNNKGUsYXdhaXQgaShuKSxyKSxmbG9hdGluZzp7eDowLHk6MCwuLi5hd2FpdCBvKG4pfX19O2Z1bmN0aW9uIHVNKHQpe3JldHVybiBpcih0KS5kaXJlY3Rpb249PT0icnRsIn1jb25zdCBjTT17Y29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q6cTMsZ2V0RG9jdW1lbnRFbGVtZW50OkNpLGdldENsaXBwaW5nUmVjdDpvTSxnZXRPZmZzZXRQYXJlbnQ6SEMsZ2V0RWxlbWVudFJlY3RzOmFNLGdldENsaWVudFJlY3RzOmVNLGdldERpbWVuc2lvbnM6bE0sZ2V0U2NhbGU6SmwsaXNFbGVtZW50OnlpLGlzUlRMOnVNfTtmdW5jdGlvbiBkTSh0LGUpe2xldCBuPW51bGwscjtjb25zdCBpPUNpKHQpO2Z1bmN0aW9uIG8oKXtjbGVhclRpbWVvdXQociksbiYmbi5kaXNjb25uZWN0KCksbj1udWxsfWZ1bmN0aW9uIGwocyxhKXtzPT09dm9pZCAwJiYocz0hMSksYT09PXZvaWQgMCYmKGE9MSksbygpO2NvbnN0e2xlZnQ6dSx0b3A6Yyx3aWR0aDpkLGhlaWdodDpmfT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHN8fGUoKSwhZHx8IWYpcmV0dXJuO2NvbnN0IGg9U2MoYyksbT1TYyhpLmNsaWVudFdpZHRoLSh1K2QpKSxnPVNjKGkuY2xpZW50SGVpZ2h0LShjK2YpKSx3PVNjKHUpLHk9e3Jvb3RNYXJnaW46LWgrInB4ICIrLW0rInB4ICIrLWcrInB4ICIrLXcrInB4Iix0aHJlc2hvbGQ6TG4oMCxmbygxLGEpKXx8MX07bGV0IHg9ITA7ZnVuY3Rpb24gUyhiKXtjb25zdCBUPWJbMF0uaW50ZXJzZWN0aW9uUmF0aW87aWYoVCE9PWEpe2lmKCF4KXJldHVybiBsKCk7VD9sKCExLFQpOnI9c2V0VGltZW91dCgoKT0+e2woITEsMWUtNyl9LDEwMCl9eD0hMX10cnl7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoUyx7Li4ueSxyb290Omkub3duZXJEb2N1bWVudH0pfWNhdGNoe249bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFMseSl9bi5vYnNlcnZlKHQpfXJldHVybiBsKCEwKSxvfWZ1bmN0aW9uIGZNKHQsZSxuLHIpe3I9PT12b2lkIDAmJihyPXt9KTtjb25zdHthbmNlc3RvclNjcm9sbDppPSEwLGFuY2VzdG9yUmVzaXplOm89ITAsZWxlbWVudFJlc2l6ZTpsPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09ImZ1bmN0aW9uIixhbmltYXRpb25GcmFtZTphPSExfT1yLHU9S3YodCksYz1pfHxvP1suLi51P0N1KHUpOltdLC4uLkN1KGUpXTpbXTtjLmZvckVhY2godj0+e2kmJnYuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuLHtwYXNzaXZlOiEwfSksbyYmdi5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG4pfSk7Y29uc3QgZD11JiZzP2RNKHUsbik6bnVsbDtsZXQgZj0tMSxoPW51bGw7bCYmKGg9bmV3IFJlc2l6ZU9ic2VydmVyKHY9PntsZXRbeV09djt5JiZ5LnRhcmdldD09PXUmJmgmJihoLnVub2JzZXJ2ZShlKSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2gmJmgub2JzZXJ2ZShlKX0pKSxuKCl9KSx1JiYhYSYmaC5vYnNlcnZlKHUpLGgub2JzZXJ2ZShlKSk7bGV0IG0sZz1hP0pvKHQpOm51bGw7YSYmdygpO2Z1bmN0aW9uIHcoKXtjb25zdCB2PUpvKHQpO2cmJih2LnghPT1nLnh8fHYueSE9PWcueXx8di53aWR0aCE9PWcud2lkdGh8fHYuaGVpZ2h0IT09Zy5oZWlnaHQpJiZuKCksZz12LG09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpfXJldHVybiBuKCksKCk9PntjLmZvckVhY2godj0+e2kmJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuKSxvJiZ2LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KSxkJiZkKCksaCYmaC5kaXNjb25uZWN0KCksaD1udWxsLGEmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKG0pfX1jb25zdCBoTT0odCxlLG4pPT57Y29uc3Qgcj1uZXcgTWFwLGk9e3BsYXRmb3JtOmNNLC4uLm59LG89ey4uLmkucGxhdGZvcm0sX2M6cn07cmV0dXJuIEIzKHQsZSx7Li4uaSxwbGF0Zm9ybTpvfSl9LHBNPXQ9PntmdW5jdGlvbiBlKG4pe3JldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwobiwiY3VycmVudCIpfXJldHVybntuYW1lOiJhcnJvdyIsb3B0aW9uczp0LGZuKG4pe2NvbnN0e2VsZW1lbnQ6cixwYWRkaW5nOml9PXR5cGVvZiB0PT0iZnVuY3Rpb24iP3Qobik6dDtyZXR1cm4gciYmZShyKT9yLmN1cnJlbnQhPW51bGw/Rngoe2VsZW1lbnQ6ci5jdXJyZW50LHBhZGRpbmc6aX0pLmZuKG4pOnt9OnI/Rngoe2VsZW1lbnQ6cixwYWRkaW5nOml9KS5mbihuKTp7fX19fTt2YXIgS2M9dHlwZW9mIGRvY3VtZW50PCJ1Ij9wLnVzZUxheW91dEVmZmVjdDpwLnVzZUVmZmVjdDtmdW5jdGlvbiBKZCh0LGUpe2lmKHQ9PT1lKXJldHVybiEwO2lmKHR5cGVvZiB0IT10eXBlb2YgZSlyZXR1cm4hMTtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIiYmdC50b1N0cmluZygpPT09ZS50b1N0cmluZygpKXJldHVybiEwO2xldCBuLHIsaTtpZih0JiZlJiZ0eXBlb2YgdD09Im9iamVjdCIpe2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5sZW5ndGgsbiE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOylpZighSmQodFtyXSxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZihpPU9iamVjdC5rZXlzKHQpLG49aS5sZW5ndGgsbiE9PU9iamVjdC5rZXlzKGUpLmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaVtyXSkpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOyl7Y29uc3Qgbz1pW3JdO2lmKCEobz09PSJfb3duZXIiJiZ0LiQkdHlwZW9mKSYmIUpkKHRbb10sZVtvXSkpcmV0dXJuITF9cmV0dXJuITB9cmV0dXJuIHQhPT10JiZlIT09ZX1mdW5jdGlvbiBLQyh0KXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSI/MToodC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmRldmljZVBpeGVsUmF0aW98fDF9ZnVuY3Rpb24gS3godCxlKXtjb25zdCBuPUtDKHQpO3JldHVybiBNYXRoLnJvdW5kKGUqbikvbn1mdW5jdGlvbiBaeCh0KXtjb25zdCBlPXAudXNlUmVmKHQpO3JldHVybiBLYygoKT0+e2UuY3VycmVudD10fSksZX1mdW5jdGlvbiBnTSh0KXt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7cGxhY2VtZW50OmU9ImJvdHRvbSIsc3RyYXRlZ3k6bj0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6cj1bXSxwbGF0Zm9ybTppLGVsZW1lbnRzOntyZWZlcmVuY2U6byxmbG9hdGluZzpsfT17fSx0cmFuc2Zvcm06cz0hMCx3aGlsZUVsZW1lbnRzTW91bnRlZDphLG9wZW46dX09dCxbYyxkXT1wLnVzZVN0YXRlKHt4OjAseTowLHN0cmF0ZWd5Om4scGxhY2VtZW50OmUsbWlkZGxld2FyZURhdGE6e30saXNQb3NpdGlvbmVkOiExfSksW2YsaF09cC51c2VTdGF0ZShyKTtKZChmLHIpfHxoKHIpO2NvbnN0W20sZ109cC51c2VTdGF0ZShudWxsKSxbdyx2XT1wLnVzZVN0YXRlKG51bGwpLHk9cC51c2VDYWxsYmFjayhDPT57QyE9VC5jdXJyZW50JiYoVC5jdXJyZW50PUMsZyhDKSl9LFtnXSkseD1wLnVzZUNhbGxiYWNrKEM9PntDIT09JC5jdXJyZW50JiYoJC5jdXJyZW50PUMsdihDKSl9LFt2XSksUz1vfHxtLGI9bHx8dyxUPXAudXNlUmVmKG51bGwpLCQ9cC51c2VSZWYobnVsbCksTz1wLnVzZVJlZihjKSxMPVp4KGEpLFA9WngoaSksRD1wLnVzZUNhbGxiYWNrKCgpPT57aWYoIVQuY3VycmVudHx8ISQuY3VycmVudClyZXR1cm47Y29uc3QgQz17cGxhY2VtZW50OmUsc3RyYXRlZ3k6bixtaWRkbGV3YXJlOmZ9O1AuY3VycmVudCYmKEMucGxhdGZvcm09UC5jdXJyZW50KSxoTShULmN1cnJlbnQsJC5jdXJyZW50LEMpLnRoZW4oaz0+e2NvbnN0IEU9ey4uLmssaXNQb3NpdGlvbmVkOiEwfTtCLmN1cnJlbnQmJiFKZChPLmN1cnJlbnQsRSkmJihPLmN1cnJlbnQ9RSxHci5mbHVzaFN5bmMoKCk9PntkKEUpfSkpfSl9LFtmLGUsbixQXSk7S2MoKCk9Pnt1PT09ITEmJk8uY3VycmVudC5pc1Bvc2l0aW9uZWQmJihPLmN1cnJlbnQuaXNQb3NpdGlvbmVkPSExLGQoQz0+KHsuLi5DLGlzUG9zaXRpb25lZDohMX0pKSl9LFt1XSk7Y29uc3QgQj1wLnVzZVJlZighMSk7S2MoKCk9PihCLmN1cnJlbnQ9ITAsKCk9PntCLmN1cnJlbnQ9ITF9KSxbXSksS2MoKCk9PntpZihTJiYoVC5jdXJyZW50PVMpLGImJigkLmN1cnJlbnQ9YiksUyYmYil7aWYoTC5jdXJyZW50KXJldHVybiBMLmN1cnJlbnQoUyxiLEQpO0QoKX19LFtTLGIsRCxMXSk7Y29uc3Qgb2U9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTpULGZsb2F0aW5nOiQsc2V0UmVmZXJlbmNlOnksc2V0RmxvYXRpbmc6eH0pLFt5LHhdKSxIPXAudXNlTWVtbygoKT0+KHtyZWZlcmVuY2U6UyxmbG9hdGluZzpifSksW1MsYl0pLFo9cC51c2VNZW1vKCgpPT57Y29uc3QgQz17cG9zaXRpb246bixsZWZ0OjAsdG9wOjB9O2lmKCFILmZsb2F0aW5nKXJldHVybiBDO2NvbnN0IGs9S3goSC5mbG9hdGluZyxjLngpLEU9S3goSC5mbG9hdGluZyxjLnkpO3JldHVybiBzP3suLi5DLHRyYW5zZm9ybToidHJhbnNsYXRlKCIraysicHgsICIrRSsicHgpIiwuLi5LQyhILmZsb2F0aW5nKT49MS41JiZ7d2lsbENoYW5nZToidHJhbnNmb3JtIn19Ontwb3NpdGlvbjpuLGxlZnQ6ayx0b3A6RX19LFtuLHMsSC5mbG9hdGluZyxjLngsYy55XSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHsuLi5jLHVwZGF0ZTpELHJlZnM6b2UsZWxlbWVudHM6SCxmbG9hdGluZ1N0eWxlczpafSksW2MsRCxvZSxILFpdKX1mdW5jdGlvbiBaQyh0KXtjb25zdFtlLG5dPXAudXNlU3RhdGUodm9pZCAwKTtyZXR1cm4gVW4oKCk9PntpZih0KXtuKHt3aWR0aDp0Lm9mZnNldFdpZHRoLGhlaWdodDp0Lm9mZnNldEhlaWdodH0pO2NvbnN0IHI9bmV3IFJlc2l6ZU9ic2VydmVyKGk9PntpZighQXJyYXkuaXNBcnJheShpKXx8IWkubGVuZ3RoKXJldHVybjtjb25zdCBvPWlbMF07bGV0IGwscztpZigiYm9yZGVyQm94U2l6ZSJpbiBvKXtjb25zdCBhPW8uYm9yZGVyQm94U2l6ZSx1PUFycmF5LmlzQXJyYXkoYSk/YVswXTphO2w9dS5pbmxpbmVTaXplLHM9dS5ibG9ja1NpemV9ZWxzZSBsPXQub2Zmc2V0V2lkdGgscz10Lm9mZnNldEhlaWdodDtuKHt3aWR0aDpsLGhlaWdodDpzfSl9KTtyZXR1cm4gci5vYnNlcnZlKHQse2JveDoiYm9yZGVyLWJveCJ9KSwoKT0+ci51bm9ic2VydmUodCl9ZWxzZSBuKHZvaWQgMCl9LFt0XSksZX1jb25zdCBHQz0iUG9wcGVyIixbWUMsWENdPW9sKEdDKSxbbU0sUUNdPVlDKEdDKSx2TT10PT57Y29uc3R7X19zY29wZVBvcHBlcjplLGNoaWxkcmVuOm59PXQsW3IsaV09cC51c2VTdGF0ZShudWxsKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KG1NLHtzY29wZTplLGFuY2hvcjpyLG9uQW5jaG9yQ2hhbmdlOml9LG4pfSx5TT0iUG9wcGVyQW5jaG9yIix4TT1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlUG9wcGVyOm4sdmlydHVhbFJlZjpyLC4uLml9PXQsbz1RQyh5TSxuKSxsPXAudXNlUmVmKG51bGwpLHM9c3QoZSxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLm9uQW5jaG9yQ2hhbmdlKChyPT1udWxsP3ZvaWQgMDpyLmN1cnJlbnQpfHxsLmN1cnJlbnQpfSkscj9udWxsOnAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30saSx7cmVmOnN9KSl9KSxKQz0iUG9wcGVyQ29udGVudCIsW19NLFJEXT1ZQyhKQyksd009cC5mb3J3YXJkUmVmKCh0LGUpPT57dmFyIG4scixpLG8sbCxzLGEsdTtjb25zdHtfX3Njb3BlUG9wcGVyOmMsc2lkZTpkPSJib3R0b20iLHNpZGVPZmZzZXQ6Zj0wLGFsaWduOmg9ImNlbnRlciIsYWxpZ25PZmZzZXQ6bT0wLGFycm93UGFkZGluZzpnPTAsYXZvaWRDb2xsaXNpb25zOnc9ITAsY29sbGlzaW9uQm91bmRhcnk6dj1bXSxjb2xsaXNpb25QYWRkaW5nOnk9MCxzdGlja3k6eD0icGFydGlhbCIsaGlkZVdoZW5EZXRhY2hlZDpTPSExLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6Yj0ib3B0aW1pemVkIixvblBsYWNlZDpULC4uLiR9PXQsTz1RQyhKQyxjKSxbTCxQXT1wLnVzZVN0YXRlKG51bGwpLEQ9c3QoZSxTbj0+UChTbikpLFtCLG9lXT1wLnVzZVN0YXRlKG51bGwpLEg9WkMoQiksWj0obj1IPT1udWxsP3ZvaWQgMDpILndpZHRoKSE9PW51bGwmJm4hPT12b2lkIDA/bjowLEM9KHI9SD09bnVsbD92b2lkIDA6SC5oZWlnaHQpIT09bnVsbCYmciE9PXZvaWQgMD9yOjAsaz1kKyhoIT09ImNlbnRlciI/Ii0iK2g6IiIpLEU9dHlwZW9mIHk9PSJudW1iZXIiP3k6e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLnl9LEE9QXJyYXkuaXNBcnJheSh2KT92Olt2XSxOPUEubGVuZ3RoPjAsRj17cGFkZGluZzpFLGJvdW5kYXJ5OkEuZmlsdGVyKFNNKSxhbHRCb3VuZGFyeTpOfSx7cmVmczpLLGZsb2F0aW5nU3R5bGVzOmRlLHBsYWNlbWVudDpzZSxpc1Bvc2l0aW9uZWQ6QWUsbWlkZGxld2FyZURhdGE6TmV9PWdNKHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDprLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5Tbik9PmZNKC4uLlNuLHthbmltYXRpb25GcmFtZTpiPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOk8uYW5jaG9yfSxtaWRkbGV3YXJlOltIMyh7bWFpbkF4aXM6ZitDLGFsaWdubWVudEF4aXM6bX0pLHcmJkszKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjp4PT09InBhcnRpYWwiP1ozKCk6dm9pZCAwLC4uLkZ9KSx3JiZVMyh7Li4uRn0pLEczKHsuLi5GLGFwcGx5Oih7ZWxlbWVudHM6U24scmVjdHM6bHIsYXZhaWxhYmxlV2lkdGg6emUsYXZhaWxhYmxlSGVpZ2h0OlR0fSk9Pntjb25zdHt3aWR0aDphdCxoZWlnaHQ6bG59PWxyLnJlZmVyZW5jZSxFbj1Tbi5mbG9hdGluZy5zdHlsZTtFbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHt6ZX1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtUdH1weGApLEVuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2F0fXB4YCksRW4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke2xufXB4YCl9fSksQiYmcE0oe2VsZW1lbnQ6QixwYWRkaW5nOmd9KSxFTSh7YXJyb3dXaWR0aDpaLGFycm93SGVpZ2h0OkN9KSxTJiZXMyh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uRn0pXX0pLFtRLGplXT1xQyhzZSksYmU9ZW4oVCk7VW4oKCk9PntBZSYmKGJlPT1udWxsfHxiZSgpKX0sW0FlLGJlXSk7Y29uc3QgUmU9KGk9TmUuYXJyb3cpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS54LHdlPShvPU5lLmFycm93KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8ueSxJZT0oKGw9TmUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC5jZW50ZXJPZmZzZXQpIT09MCxbUWUsV3RdPXAudXNlU3RhdGUoKTtyZXR1cm4gVW4oKCk9PntMJiZXdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShMKS56SW5kZXgpfSxbTF0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOksuc2V0RmxvYXRpbmcsImRhdGEtcmFkaXgtcG9wcGVyLWNvbnRlbnQtd3JhcHBlciI6IiIsc3R5bGU6ey4uLmRlLHRyYW5zZm9ybTpBZT9kZS50cmFuc2Zvcm06InRyYW5zbGF0ZSgwLCAtMjAwJSkiLG1pbldpZHRoOiJtYXgtY29udGVudCIsekluZGV4OlFlLCItLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luIjpbKHM9TmUudHJhbnNmb3JtT3JpZ2luKT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMueCwoYT1OZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS55XS5qb2luKCIgIil9LGRpcjp0LmRpcn0scC5jcmVhdGVFbGVtZW50KF9NLHtzY29wZTpjLHBsYWNlZFNpZGU6USxvbkFycm93Q2hhbmdlOm9lLGFycm93WDpSZSxhcnJvd1k6d2Usc2hvdWxkSGlkZUFycm93OkllfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zaWRlIjpRLCJkYXRhLWFsaWduIjpqZX0sJCx7cmVmOkQsc3R5bGU6ey4uLiQuc3R5bGUsYW5pbWF0aW9uOkFlP3ZvaWQgMDoibm9uZSIsb3BhY2l0eToodT1OZS5oaWRlKSE9PW51bGwmJnUhPT12b2lkIDAmJnUucmVmZXJlbmNlSGlkZGVuPzA6dm9pZCAwfX0pKSkpfSk7ZnVuY3Rpb24gU00odCl7cmV0dXJuIHQhPT1udWxsfWNvbnN0IEVNPXQ9Pih7bmFtZToidHJhbnNmb3JtT3JpZ2luIixvcHRpb25zOnQsZm4oZSl7dmFyIG4scixpLG8sbDtjb25zdHtwbGFjZW1lbnQ6cyxyZWN0czphLG1pZGRsZXdhcmVEYXRhOnV9PWUsZD0oKG49dS5hcnJvdyk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmNlbnRlck9mZnNldCkhPT0wLGY9ZD8wOnQuYXJyb3dXaWR0aCxoPWQ/MDp0LmFycm93SGVpZ2h0LFttLGddPXFDKHMpLHc9e3N0YXJ0OiIwJSIsY2VudGVyOiI1MCUiLGVuZDoiMTAwJSJ9W2ddLHY9KChyPShpPXUuYXJyb3cpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS54KSE9PW51bGwmJnIhPT12b2lkIDA/cjowKStmLzIseT0oKG89KGw9dS5hcnJvdyk9PT1udWxsfHxsPT09dm9pZCAwP3ZvaWQgMDpsLnkpIT09bnVsbCYmbyE9PXZvaWQgMD9vOjApK2gvMjtsZXQgeD0iIixTPSIiO3JldHVybiBtPT09ImJvdHRvbSI/KHg9ZD93OmAke3Z9cHhgLFM9YCR7LWh9cHhgKTptPT09InRvcCI/KHg9ZD93OmAke3Z9cHhgLFM9YCR7YS5mbG9hdGluZy5oZWlnaHQraH1weGApOm09PT0icmlnaHQiPyh4PWAkey1ofXB4YCxTPWQ/dzpgJHt5fXB4YCk6bT09PSJsZWZ0IiYmKHg9YCR7YS5mbG9hdGluZy53aWR0aCtofXB4YCxTPWQ/dzpgJHt5fXB4YCkse2RhdGE6e3gseTpTfX19fSk7ZnVuY3Rpb24gcUModCl7Y29uc3RbZSxuPSJjZW50ZXIiXT10LnNwbGl0KCItIik7cmV0dXJuW2Usbl19Y29uc3QgQ009dk0sa009eE0sYk09d00sJE09cC5mb3J3YXJkUmVmKCh0LGUpPT57dmFyIG47Y29uc3R7Y29udGFpbmVyOnI9Z2xvYmFsVGhpcz09bnVsbHx8KG49Z2xvYmFsVGhpcy5kb2N1bWVudCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmJvZHksLi4uaX09dDtyZXR1cm4gcj9qdy5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7fSxpLHtyZWY6ZX0pKSxyKTpudWxsfSk7ZnVuY3Rpb24gbXMoe3Byb3A6dCxkZWZhdWx0UHJvcDplLG9uQ2hhbmdlOm49KCk9Pnt9fSl7Y29uc3RbcixpXT1UTSh7ZGVmYXVsdFByb3A6ZSxvbkNoYW5nZTpufSksbz10IT09dm9pZCAwLGw9bz90OnIscz1lbihuKSxhPXAudXNlQ2FsbGJhY2sodT0+e2lmKG8pe2NvbnN0IGQ9dHlwZW9mIHU9PSJmdW5jdGlvbiI/dSh0KTp1O2QhPT10JiZzKGQpfWVsc2UgaSh1KX0sW28sdCxpLHNdKTtyZXR1cm5bbCxhXX1mdW5jdGlvbiBUTSh7ZGVmYXVsdFByb3A6dCxvbkNoYW5nZTplfSl7Y29uc3Qgbj1wLnVzZVN0YXRlKHQpLFtyXT1uLGk9cC51c2VSZWYociksbz1lbihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQhPT1yJiYobyhyKSxpLmN1cnJlbnQ9cil9LFtyLGksb10pLG59ZnVuY3Rpb24gZWsodCl7Y29uc3QgZT1wLnVzZVJlZih7dmFsdWU6dCxwcmV2aW91czp0fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KGUuY3VycmVudC52YWx1ZSE9PXQmJihlLmN1cnJlbnQucHJldmlvdXM9ZS5jdXJyZW50LnZhbHVlLGUuY3VycmVudC52YWx1ZT10KSxlLmN1cnJlbnQucHJldmlvdXMpLFt0XSl9Y29uc3QgTk09cC5mb3J3YXJkUmVmKCh0LGUpPT5wLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7fSx0LHtyZWY6ZSxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixib3JkZXI6MCx3aWR0aDoxLGhlaWdodDoxLHBhZGRpbmc6MCxtYXJnaW46LTEsb3ZlcmZsb3c6ImhpZGRlbiIsY2xpcDoicmVjdCgwLCAwLCAwLCAwKSIsd2hpdGVTcGFjZToibm93cmFwIix3b3JkV3JhcDoibm9ybWFsIiwuLi50LnN0eWxlfX0pKSk7dmFyIFJNPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7dmFyIGU9QXJyYXkuaXNBcnJheSh0KT90WzBdOnQ7cmV0dXJuIGUub3duZXJEb2N1bWVudC5ib2R5fSx3bD1uZXcgV2Vha01hcCxFYz1uZXcgV2Vha01hcCxDYz17fSxXaD0wLHRrPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYodC5ob3N0fHx0ayh0LnBhcmVudE5vZGUpKX0sT009ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24obil7aWYodC5jb250YWlucyhuKSlyZXR1cm4gbjt2YXIgcj10ayhuKTtyZXR1cm4gciYmdC5jb250YWlucyhyKT9yOihjb25zb2xlLmVycm9yKCJhcmlhLWhpZGRlbiIsbiwiaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUiLHQsIi4gRG9pbmcgbm90aGluZyIpLG51bGwpfSkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhbn0pfSxQTT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1PTShlLEFycmF5LmlzQXJyYXkodCk/dDpbdF0pO0NjW25dfHwoQ2Nbbl09bmV3IFdlYWtNYXApO3ZhciBvPUNjW25dLGw9W10scz1uZXcgU2V0LGE9bmV3IFNldChpKSx1PWZ1bmN0aW9uKGQpeyFkfHxzLmhhcyhkKXx8KHMuYWRkKGQpLHUoZC5wYXJlbnROb2RlKSl9O2kuZm9yRWFjaCh1KTt2YXIgYz1mdW5jdGlvbihkKXshZHx8YS5oYXMoZCl8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5jaGlsZHJlbixmdW5jdGlvbihmKXtpZihzLmhhcyhmKSljKGYpO2Vsc2V7dmFyIGg9Zi5nZXRBdHRyaWJ1dGUociksbT1oIT09bnVsbCYmaCE9PSJmYWxzZSIsZz0od2wuZ2V0KGYpfHwwKSsxLHc9KG8uZ2V0KGYpfHwwKSsxO3dsLnNldChmLGcpLG8uc2V0KGYsdyksbC5wdXNoKGYpLGc9PT0xJiZtJiZFYy5zZXQoZiwhMCksdz09PTEmJmYuc2V0QXR0cmlidXRlKG4sInRydWUiKSxtfHxmLnNldEF0dHJpYnV0ZShyLCJ0cnVlIil9fSl9O3JldHVybiBjKGUpLHMuY2xlYXIoKSxXaCsrLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBmPXdsLmdldChkKS0xLGg9by5nZXQoZCktMTt3bC5zZXQoZCxmKSxvLnNldChkLGgpLGZ8fChFYy5oYXMoZCl8fGQucmVtb3ZlQXR0cmlidXRlKHIpLEVjLmRlbGV0ZShkKSksaHx8ZC5yZW1vdmVBdHRyaWJ1dGUobil9KSxXaC0tLFdofHwod2w9bmV3IFdlYWtNYXAsd2w9bmV3IFdlYWtNYXAsRWM9bmV3IFdlYWtNYXAsQ2M9e30pfX0sQU09ZnVuY3Rpb24odCxlLG4pe249PT12b2lkIDAmJihuPSJkYXRhLWFyaWEtaGlkZGVuIik7dmFyIHI9QXJyYXkuZnJvbShBcnJheS5pc0FycmF5KHQpP3Q6W3RdKSxpPWV8fFJNKHQpO3JldHVybiBpPyhyLnB1c2guYXBwbHkocixBcnJheS5mcm9tKGkucXVlcnlTZWxlY3RvckFsbCgiW2FyaWEtbGl2ZV0iKSkpLFBNKHIsaSxuLCJhcmlhLWhpZGRlbiIpKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sTHI9ZnVuY3Rpb24oKXtyZXR1cm4gTHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9MSxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKyl7bj1hcmd1bWVudHNbcl07Zm9yKHZhciBvIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJihlW29dPW5bb10pfXJldHVybiBlfSxMci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG5rKHQsZSl7dmFyIG49e307Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZih0IT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIilmb3IodmFyIGk9MCxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aTxyLmxlbmd0aDtpKyspZS5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHJbaV0pJiYobltyW2ldXT10W3JbaV1dKTtyZXR1cm4gbn1mdW5jdGlvbiBNTSh0LGUsbil7aWYobnx8YXJndW1lbnRzLmxlbmd0aD09PTIpZm9yKHZhciByPTAsaT1lLmxlbmd0aCxvO3I8aTtyKyspKG98fCEociBpbiBlKSkmJihvfHwobz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDAscikpLG9bcl09ZVtyXSk7cmV0dXJuIHQuY29uY2F0KG98fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKX12YXIgWmM9InJpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24iLEdjPSJ3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhciIsTE09IndpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuIixJTT0iLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplIjtmdW5jdGlvbiBETSh0LGUpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQmJih0LmN1cnJlbnQ9ZSksdH1mdW5jdGlvbiBqTSh0LGUpe3ZhciBuPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6dCxjYWxsYmFjazplLGZhY2FkZTp7Z2V0IGN1cnJlbnQoKXtyZXR1cm4gbi52YWx1ZX0sc2V0IGN1cnJlbnQocil7dmFyIGk9bi52YWx1ZTtpIT09ciYmKG4udmFsdWU9cixuLmNhbGxiYWNrKHIsaSkpfX19fSlbMF07cmV0dXJuIG4uY2FsbGJhY2s9ZSxuLmZhY2FkZX1mdW5jdGlvbiB6TSh0LGUpe3JldHVybiBqTShlfHxudWxsLGZ1bmN0aW9uKG4pe3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIERNKHIsbil9KX0pfWZ1bmN0aW9uIEZNKHQpe3JldHVybiB0fWZ1bmN0aW9uIEJNKHQsZSl7ZT09PXZvaWQgMCYmKGU9Rk0pO3ZhciBuPVtdLHI9ITEsaT17cmVhZDpmdW5jdGlvbigpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4iKTtyZXR1cm4gbi5sZW5ndGg/bltuLmxlbmd0aC0xXTp0fSx1c2VNZWRpdW06ZnVuY3Rpb24obyl7dmFyIGw9ZShvLHIpO3JldHVybiBuLnB1c2gobCksZnVuY3Rpb24oKXtuPW4uZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzIT09bH0pfX0sYXNzaWduU3luY01lZGl1bTpmdW5jdGlvbihvKXtmb3Iocj0hMDtuLmxlbmd0aDspe3ZhciBsPW47bj1bXSxsLmZvckVhY2gobyl9bj17cHVzaDpmdW5jdGlvbihzKXtyZXR1cm4gbyhzKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG59fX0sYXNzaWduTWVkaXVtOmZ1bmN0aW9uKG8pe3I9ITA7dmFyIGw9W107aWYobi5sZW5ndGgpe3ZhciBzPW47bj1bXSxzLmZvckVhY2gobyksbD1ufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGM9bDtsPVtdLGMuZm9yRWFjaChvKX0sdT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfTt1KCksbj17cHVzaDpmdW5jdGlvbihjKXtsLnB1c2goYyksdSgpfSxmaWx0ZXI6ZnVuY3Rpb24oYyl7cmV0dXJuIGw9bC5maWx0ZXIoYyksbn19fX07cmV0dXJuIGl9ZnVuY3Rpb24gVU0odCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBlPUJNKG51bGwpO3JldHVybiBlLm9wdGlvbnM9THIoe2FzeW5jOiEwLHNzcjohMX0sdCksZX12YXIgcms9ZnVuY3Rpb24odCl7dmFyIGU9dC5zaWRlQ2FyLG49bmsodCxbInNpZGVDYXIiXSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXIiKTt2YXIgcj1lLnJlYWQoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocixMcih7fSxuKSl9O3JrLmlzU2lkZUNhckV4cG9ydD0hMDtmdW5jdGlvbiBXTSh0LGUpe3JldHVybiB0LnVzZU1lZGl1bShlKSxya312YXIgaWs9VU0oKSxWaD1mdW5jdGlvbigpe30sRmY9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7dmFyIG49cC51c2VSZWYobnVsbCkscj1wLnVzZVN0YXRlKHtvblNjcm9sbENhcHR1cmU6Vmgsb25XaGVlbENhcHR1cmU6Vmgsb25Ub3VjaE1vdmVDYXB0dXJlOlZofSksaT1yWzBdLG89clsxXSxsPXQuZm9yd2FyZFByb3BzLHM9dC5jaGlsZHJlbixhPXQuY2xhc3NOYW1lLHU9dC5yZW1vdmVTY3JvbGxCYXIsYz10LmVuYWJsZWQsZD10LnNoYXJkcyxmPXQuc2lkZUNhcixoPXQubm9Jc29sYXRpb24sbT10LmluZXJ0LGc9dC5hbGxvd1BpbmNoWm9vbSx3PXQuYXMsdj13PT09dm9pZCAwPyJkaXYiOncseT1uayh0LFsiZm9yd2FyZFByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJyZW1vdmVTY3JvbGxCYXIiLCJlbmFibGVkIiwic2hhcmRzIiwic2lkZUNhciIsIm5vSXNvbGF0aW9uIiwiaW5lcnQiLCJhbGxvd1BpbmNoWm9vbSIsImFzIl0pLHg9ZixTPXpNKFtuLGVdKSxiPUxyKExyKHt9LHkpLGkpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGMmJnAuY3JlYXRlRWxlbWVudCh4LHtzaWRlQ2FyOmlrLHJlbW92ZVNjcm9sbEJhcjp1LHNoYXJkczpkLG5vSXNvbGF0aW9uOmgsaW5lcnQ6bSxzZXRDYWxsYmFja3M6byxhbGxvd1BpbmNoWm9vbTohIWcsbG9ja1JlZjpufSksbD9wLmNsb25lRWxlbWVudChwLkNoaWxkcmVuLm9ubHkocyksTHIoTHIoe30sYikse3JlZjpTfSkpOnAuY3JlYXRlRWxlbWVudCh2LExyKHt9LGIse2NsYXNzTmFtZTphLHJlZjpTfSkscykpfSk7RmYuZGVmYXVsdFByb3BzPXtlbmFibGVkOiEwLHJlbW92ZVNjcm9sbEJhcjohMCxpbmVydDohMX07RmYuY2xhc3NOYW1lcz17ZnVsbFdpZHRoOkdjLHplcm9SaWdodDpaY307dmFyIEd4LFZNPWZ1bmN0aW9uKCl7aWYoR3gpcmV0dXJuIEd4O2lmKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXzwidSIpcmV0dXJuIF9fd2VicGFja19ub25jZV9ffTtmdW5jdGlvbiBITSgpe2lmKCFkb2N1bWVudClyZXR1cm4gbnVsbDt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QudHlwZT0idGV4dC9jc3MiO3ZhciBlPVZNKCk7cmV0dXJuIGUmJnQuc2V0QXR0cmlidXRlKCJub25jZSIsZSksdH1mdW5jdGlvbiBLTSh0LGUpe3Quc3R5bGVTaGVldD90LnN0eWxlU2hlZXQuY3NzVGV4dD1lOnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSkpfWZ1bmN0aW9uIFpNKHQpe3ZhciBlPWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07ZS5hcHBlbmRDaGlsZCh0KX12YXIgR009ZnVuY3Rpb24oKXt2YXIgdD0wLGU9bnVsbDtyZXR1cm57YWRkOmZ1bmN0aW9uKG4pe3Q9PTAmJihlPUhNKCkpJiYoS00oZSxuKSxaTShlKSksdCsrfSxyZW1vdmU6ZnVuY3Rpb24oKXt0LS0sIXQmJmUmJihlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlPW51bGwpfX19LFlNPWZ1bmN0aW9uKCl7dmFyIHQ9R00oKTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiB0LmFkZChlKSxmdW5jdGlvbigpe3QucmVtb3ZlKCl9fSxbZSYmbl0pfX0sb2s9ZnVuY3Rpb24oKXt2YXIgdD1ZTSgpLGU9ZnVuY3Rpb24obil7dmFyIHI9bi5zdHlsZXMsaT1uLmR5bmFtaWM7cmV0dXJuIHQocixpKSxudWxsfTtyZXR1cm4gZX0sWE09e2xlZnQ6MCx0b3A6MCxyaWdodDowLGdhcDowfSxIaD1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodHx8IiIsMTApfHwwfSxRTT1mdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KSxuPWVbdD09PSJwYWRkaW5nIj8icGFkZGluZ0xlZnQiOiJtYXJnaW5MZWZ0Il0scj1lW3Q9PT0icGFkZGluZyI/InBhZGRpbmdUb3AiOiJtYXJnaW5Ub3AiXSxpPWVbdD09PSJwYWRkaW5nIj8icGFkZGluZ1JpZ2h0IjoibWFyZ2luUmlnaHQiXTtyZXR1cm5bSGgobiksSGgociksSGgoaSldfSxKTT1mdW5jdGlvbih0KXtpZih0PT09dm9pZCAwJiYodD0ibWFyZ2luIiksdHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIFhNO3ZhciBlPVFNKHQpLG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVyV2lkdGg7cmV0dXJue2xlZnQ6ZVswXSx0b3A6ZVsxXSxyaWdodDplWzJdLGdhcDpNYXRoLm1heCgwLHItbitlWzJdLWVbMF0pfX0scU09b2soKSxlND1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LmxlZnQsbz10LnRvcCxsPXQucmlnaHQscz10LmdhcDtyZXR1cm4gbj09PXZvaWQgMCYmKG49Im1hcmdpbiIpLGAKICAuYC5jb25jYXQoTE0sYCB7CiAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIGJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIGApLmNvbmNhdChbZSYmInBvc2l0aW9uOiByZWxhdGl2ZSAiLmNvbmNhdChyLCI7Iiksbj09PSJtYXJnaW4iJiZgCiAgICBwYWRkaW5nLWxlZnQ6IGAuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy10b3A6IGApLmNvbmNhdChvLGBweDsKICAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLGBweDsKICAgIG1hcmdpbi1sZWZ0OjA7CiAgICBtYXJnaW4tdG9wOjA7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogICAgYCksbj09PSJwYWRkaW5nIiYmInBhZGRpbmctcmlnaHQ6ICIuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLCI7IildLmZpbHRlcihCb29sZWFuKS5qb2luKCIiKSxgCiAgfQogIAogIC5gKS5jb25jYXQoWmMsYCB7CiAgICByaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KFpjLCIgLiIpLmNvbmNhdChaYyxgIHsKICAgIHJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoR2MsIiAuIikuY29uY2F0KEdjLGAgewogICAgbWFyZ2luLXJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIGJvZHkgewogICAgYCkuY29uY2F0KElNLCI6ICIpLmNvbmNhdChzLGBweDsKICB9CmApfSx0ND1mdW5jdGlvbih0KXt2YXIgZT10Lm5vUmVsYXRpdmUsbj10Lm5vSW1wb3J0YW50LHI9dC5nYXBNb2RlLGk9cj09PXZvaWQgMD8ibWFyZ2luIjpyLG89cC51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJuIEpNKGkpfSxbaV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocU0se3N0eWxlczplNChvLCFlLGksbj8iIjoiIWltcG9ydGFudCIpfSl9LFdnPSExO2lmKHR5cGVvZiB3aW5kb3c8InUiKXRyeXt2YXIga2M9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFdnPSEwLCEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixrYyxrYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGtjLGtjKX1jYXRjaHtXZz0hMX12YXIgU2w9V2c/e3Bhc3NpdmU6ITF9OiExLG40PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRhZ05hbWU9PT0iVEVYVEFSRUEifSxsaz1mdW5jdGlvbih0LGUpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpO3JldHVybiBuW2VdIT09ImhpZGRlbiImJiEobi5vdmVyZmxvd1k9PT1uLm92ZXJmbG93WCYmIW40KHQpJiZuW2VdPT09InZpc2libGUiKX0scjQ9ZnVuY3Rpb24odCl7cmV0dXJuIGxrKHQsIm92ZXJmbG93WSIpfSxpND1mdW5jdGlvbih0KXtyZXR1cm4gbGsodCwib3ZlcmZsb3dYIil9LFl4PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZTtkb3t0eXBlb2YgU2hhZG93Um9vdDwidSImJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290JiYobj1uLmhvc3QpO3ZhciByPXNrKHQsbik7aWYocil7dmFyIGk9YWsodCxuKSxvPWlbMV0sbD1pWzJdO2lmKG8+bClyZXR1cm4hMH1uPW4ucGFyZW50Tm9kZX13aGlsZShuJiZuIT09ZG9jdW1lbnQuYm9keSk7cmV0dXJuITF9LG80PWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2Nyb2xsVG9wLG49dC5zY3JvbGxIZWlnaHQscj10LmNsaWVudEhlaWdodDtyZXR1cm5bZSxuLHJdfSxsND1mdW5jdGlvbih0KXt2YXIgZT10LnNjcm9sbExlZnQsbj10LnNjcm9sbFdpZHRoLHI9dC5jbGllbnRXaWR0aDtyZXR1cm5bZSxuLHJdfSxzaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09InYiP3I0KGUpOmk0KGUpfSxhaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09InYiP280KGUpOmw0KGUpfSxzND1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ImgiJiZlPT09InJ0bCI/LTE6MX0sYTQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1zNCh0LHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmRpcmVjdGlvbiksbD1vKnIscz1uLnRhcmdldCxhPWUuY29udGFpbnMocyksdT0hMSxjPWw+MCxkPTAsZj0wO2Rve3ZhciBoPWFrKHQscyksbT1oWzBdLGc9aFsxXSx3PWhbMl0sdj1nLXctbyptOyhtfHx2KSYmc2sodCxzKSYmKGQrPXYsZis9bSkscz1zLnBhcmVudE5vZGV9d2hpbGUoIWEmJnMhPT1kb2N1bWVudC5ib2R5fHxhJiYoZS5jb250YWlucyhzKXx8ZT09PXMpKTtyZXR1cm4oYyYmKGkmJmQ9PT0wfHwhaSYmbD5kKXx8IWMmJihpJiZmPT09MHx8IWkmJi1sPmYpKSYmKHU9ITApLHV9LGJjPWZ1bmN0aW9uKHQpe3JldHVybiJjaGFuZ2VkVG91Y2hlcyJpbiB0P1t0LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsdC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXTpbMCwwXX0sWHg9ZnVuY3Rpb24odCl7cmV0dXJuW3QuZGVsdGFYLHQuZGVsdGFZXX0sUXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJjdXJyZW50ImluIHQ/dC5jdXJyZW50OnR9LHU0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX0sYzQ9ZnVuY3Rpb24odCl7cmV0dXJuYAogIC5ibG9jay1pbnRlcmFjdGl2aXR5LWAuY29uY2F0KHQsYCB7cG9pbnRlci1ldmVudHM6IG5vbmU7fQogIC5hbGxvdy1pbnRlcmFjdGl2aXR5LWApLmNvbmNhdCh0LGAge3BvaW50ZXItZXZlbnRzOiBhbGw7fQpgKX0sZDQ9MCxFbD1bXTtmdW5jdGlvbiBmNCh0KXt2YXIgZT1wLnVzZVJlZihbXSksbj1wLnVzZVJlZihbMCwwXSkscj1wLnVzZVJlZigpLGk9cC51c2VTdGF0ZShkNCsrKVswXSxvPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gb2soKX0pWzBdLGw9cC51c2VSZWYodCk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtsLmN1cnJlbnQ9dH0sW3RdKSxwLnVzZUVmZmVjdChmdW5jdGlvbigpe2lmKHQuaW5lcnQpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSk7dmFyIGc9TU0oW3QubG9ja1JlZi5jdXJyZW50XSwodC5zaGFyZHN8fFtdKS5tYXAoUXgpLCEwKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGcuZm9yRWFjaChmdW5jdGlvbih3KXtyZXR1cm4gdy5jbGFzc0xpc3QuYWRkKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKX0pLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KGkpKSxnLmZvckVhY2goZnVuY3Rpb24odyl7cmV0dXJuIHcuY2xhc3NMaXN0LnJlbW92ZSgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChpKSl9KX19fSxbdC5pbmVydCx0LmxvY2tSZWYuY3VycmVudCx0LnNoYXJkc10pO3ZhciBzPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24oZyx3KXtpZigidG91Y2hlcyJpbiBnJiZnLnRvdWNoZXMubGVuZ3RoPT09MilyZXR1cm4hbC5jdXJyZW50LmFsbG93UGluY2hab29tO3ZhciB2PWJjKGcpLHk9bi5jdXJyZW50LHg9ImRlbHRhWCJpbiBnP2cuZGVsdGFYOnlbMF0tdlswXSxTPSJkZWx0YVkiaW4gZz9nLmRlbHRhWTp5WzFdLXZbMV0sYixUPWcudGFyZ2V0LCQ9TWF0aC5hYnMoeCk+TWF0aC5hYnMoUyk/ImgiOiJ2IjtpZigidG91Y2hlcyJpbiBnJiYkPT09ImgiJiZULnR5cGU9PT0icmFuZ2UiKXJldHVybiExO3ZhciBPPVl4KCQsVCk7aWYoIU8pcmV0dXJuITA7aWYoTz9iPSQ6KGI9JD09PSJ2Ij8iaCI6InYiLE89WXgoJCxUKSksIU8pcmV0dXJuITE7aWYoIXIuY3VycmVudCYmImNoYW5nZWRUb3VjaGVzImluIGcmJih4fHxTKSYmKHIuY3VycmVudD1iKSwhYilyZXR1cm4hMDt2YXIgTD1yLmN1cnJlbnR8fGI7cmV0dXJuIGE0KEwsdyxnLEw9PT0iaCI/eDpTLCEwKX0sW10pLGE9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt2YXIgdz1nO2lmKCEoIUVsLmxlbmd0aHx8RWxbRWwubGVuZ3RoLTFdIT09bykpe3ZhciB2PSJkZWx0YVkiaW4gdz9YeCh3KTpiYyh3KSx5PWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIubmFtZT09PXcudHlwZSYmYi50YXJnZXQ9PT13LnRhcmdldCYmdTQoYi5kZWx0YSx2KX0pWzBdO2lmKHkmJnkuc2hvdWxkKXt3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIXkpe3ZhciB4PShsLmN1cnJlbnQuc2hhcmRzfHxbXSkubWFwKFF4KS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiLmNvbnRhaW5zKHcudGFyZ2V0KX0pLFM9eC5sZW5ndGg+MD9zKHcseFswXSk6IWwuY3VycmVudC5ub0lzb2xhdGlvbjtTJiZ3LmNhbmNlbGFibGUmJncucHJldmVudERlZmF1bHQoKX19fSxbXSksdT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcsdyx2LHkpe3ZhciB4PXtuYW1lOmcsZGVsdGE6dyx0YXJnZXQ6dixzaG91bGQ6eX07ZS5jdXJyZW50LnB1c2goeCksc2V0VGltZW91dChmdW5jdGlvbigpe2UuY3VycmVudD1lLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKFMpe3JldHVybiBTIT09eH0pfSwxKX0sW10pLGM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXtuLmN1cnJlbnQ9YmMoZyksci5jdXJyZW50PXZvaWQgMH0sW10pLGQ9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxYeChnKSxnLnRhcmdldCxzKGcsdC5sb2NrUmVmLmN1cnJlbnQpKX0sW10pLGY9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnKXt1KGcudHlwZSxiYyhnKSxnLnRhcmdldCxzKGcsdC5sb2NrUmVmLmN1cnJlbnQpKX0sW10pO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIEVsLnB1c2gobyksdC5zZXRDYWxsYmFja3Moe29uU2Nyb2xsQ2FwdHVyZTpkLG9uV2hlZWxDYXB0dXJlOmQsb25Ub3VjaE1vdmVDYXB0dXJlOmZ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKSxmdW5jdGlvbigpe0VsPUVsLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4gZyE9PW99KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxTbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLFNsKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLFNsKX19LFtdKTt2YXIgaD10LnJlbW92ZVNjcm9sbEJhcixtPXQuaW5lcnQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbT9wLmNyZWF0ZUVsZW1lbnQobyx7c3R5bGVzOmM0KGkpfSk6bnVsbCxoP3AuY3JlYXRlRWxlbWVudCh0NCx7Z2FwTW9kZToibWFyZ2luIn0pOm51bGwpfWNvbnN0IGg0PVdNKGlrLGY0KTt2YXIgdWs9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChGZixMcih7fSx0LHtyZWY6ZSxzaWRlQ2FyOmg0fSkpfSk7dWsuY2xhc3NOYW1lcz1GZi5jbGFzc05hbWVzO2NvbnN0IHA0PXVrLGc0PVsiICIsIkVudGVyIiwiQXJyb3dVcCIsIkFycm93RG93biJdLG00PVsiICIsIkVudGVyIl0sQmY9IlNlbGVjdCIsW1VmLFp2LHY0XT1MQyhCZiksW0RzLE9EXT1vbChCZixbdjQsWENdKSxHdj1YQygpLFt5NCxjbF09RHMoQmYpLFt4NCxfNF09RHMoQmYpLHc0PXQ9Pntjb25zdHtfX3Njb3BlU2VsZWN0OmUsY2hpbGRyZW46bixvcGVuOnIsZGVmYXVsdE9wZW46aSxvbk9wZW5DaGFuZ2U6byx2YWx1ZTpsLGRlZmF1bHRWYWx1ZTpzLG9uVmFsdWVDaGFuZ2U6YSxkaXI6dSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsZGlzYWJsZWQ6ZixyZXF1aXJlZDpofT10LG09R3YoZSksW2csd109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKG51bGwpLFt4LFNdPXAudXNlU3RhdGUoITEpLGI9WG0odSksW1Q9ITEsJF09bXMoe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOm99KSxbTyxMXT1tcyh7cHJvcDpsLGRlZmF1bHRQcm9wOnMsb25DaGFuZ2U6YX0pLFA9cC51c2VSZWYobnVsbCksRD1nPyEhZy5jbG9zZXN0KCJmb3JtIik6ITAsW0Isb2VdPXAudXNlU3RhdGUobmV3IFNldCksSD1BcnJheS5mcm9tKEIpLm1hcChaPT5aLnByb3BzLnZhbHVlKS5qb2luKCI7Iik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChDTSxtLHAuY3JlYXRlRWxlbWVudCh5NCx7cmVxdWlyZWQ6aCxzY29wZTplLHRyaWdnZXI6ZyxvblRyaWdnZXJDaGFuZ2U6dyx2YWx1ZU5vZGU6dixvblZhbHVlTm9kZUNoYW5nZTp5LHZhbHVlTm9kZUhhc0NoaWxkcmVuOngsb25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTpTLGNvbnRlbnRJZDpEZigpLHZhbHVlOk8sb25WYWx1ZUNoYW5nZTpMLG9wZW46VCxvbk9wZW5DaGFuZ2U6JCxkaXI6Yix0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6UCxkaXNhYmxlZDpmfSxwLmNyZWF0ZUVsZW1lbnQoVWYuUHJvdmlkZXIse3Njb3BlOmV9LHAuY3JlYXRlRWxlbWVudCh4NCx7c2NvcGU6dC5fX3Njb3BlU2VsZWN0LG9uTmF0aXZlT3B0aW9uQWRkOnAudXNlQ2FsbGJhY2soWj0+e29lKEM9Pm5ldyBTZXQoQykuYWRkKFopKX0sW10pLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnAudXNlQ2FsbGJhY2soWj0+e29lKEM9Pntjb25zdCBrPW5ldyBTZXQoQyk7cmV0dXJuIGsuZGVsZXRlKFopLGt9KX0sW10pfSxuKSksRD9wLmNyZWF0ZUVsZW1lbnQoaGsse2tleTpILCJhcmlhLWhpZGRlbiI6ITAscmVxdWlyZWQ6aCx0YWJJbmRleDotMSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsdmFsdWU6TyxvbkNoYW5nZTpaPT5MKFoudGFyZ2V0LnZhbHVlKSxkaXNhYmxlZDpmfSxPPT09dm9pZCAwP3AuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9KTpudWxsLEFycmF5LmZyb20oQikpOm51bGwpKX0sUzQ9IlNlbGVjdFRyaWdnZXIiLEU0PXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixkaXNhYmxlZDpyPSExLC4uLml9PXQsbz1HdihuKSxsPWNsKFM0LG4pLHM9bC5kaXNhYmxlZHx8cixhPXN0KGUsbC5vblRyaWdnZXJDaGFuZ2UpLHU9WnYobiksW2MsZCxmXT1wayhtPT57Y29uc3QgZz11KCkuZmlsdGVyKHk9PiF5LmRpc2FibGVkKSx3PWcuZmluZCh5PT55LnZhbHVlPT09bC52YWx1ZSksdj1nayhnLG0sdyk7diE9PXZvaWQgMCYmbC5vblZhbHVlQ2hhbmdlKHYudmFsdWUpfSksaD0oKT0+e3N8fChsLm9uT3BlbkNoYW5nZSghMCksZigpKX07cmV0dXJuIHAuY3JlYXRlRWxlbWVudChrTSxpZSh7YXNDaGlsZDohMH0sbykscC5jcmVhdGVFbGVtZW50KEtlLmJ1dHRvbixpZSh7dHlwZToiYnV0dG9uIixyb2xlOiJjb21ib2JveCIsImFyaWEtY29udHJvbHMiOmwuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpsLm9wZW4sImFyaWEtcmVxdWlyZWQiOmwucmVxdWlyZWQsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsZGlyOmwuZGlyLCJkYXRhLXN0YXRlIjpsLm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpc2FibGVkOnMsImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLCJkYXRhLXBsYWNlaG9sZGVyIjpmayhsLnZhbHVlKT8iIjp2b2lkIDB9LGkse3JlZjphLG9uQ2xpY2s6bnQoaS5vbkNsaWNrLG09PnttLmN1cnJlbnRUYXJnZXQuZm9jdXMoKX0pLG9uUG9pbnRlckRvd246bnQoaS5vblBvaW50ZXJEb3duLG09Pntjb25zdCBnPW0udGFyZ2V0O2cuaGFzUG9pbnRlckNhcHR1cmUobS5wb2ludGVySWQpJiZnLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShtLnBvaW50ZXJJZCksbS5idXR0b249PT0wJiZtLmN0cmxLZXk9PT0hMSYmKGgoKSxsLnRyaWdnZXJQb2ludGVyRG93blBvc1JlZi5jdXJyZW50PXt4Ok1hdGgucm91bmQobS5wYWdlWCkseTpNYXRoLnJvdW5kKG0ucGFnZVkpfSxtLnByZXZlbnREZWZhdWx0KCkpfSksb25LZXlEb3duOm50KGkub25LZXlEb3duLG09Pntjb25zdCBnPWMuY3VycmVudCE9PSIiOyEobS5jdHJsS2V5fHxtLmFsdEtleXx8bS5tZXRhS2V5KSYmbS5rZXkubGVuZ3RoPT09MSYmZChtLmtleSksIShnJiZtLmtleT09PSIgIikmJmc0LmluY2x1ZGVzKG0ua2V5KSYmKGgoKSxtLnByZXZlbnREZWZhdWx0KCkpfSl9KSkpfSksQzQ9IlNlbGVjdFZhbHVlIixrND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6aSxjaGlsZHJlbjpvLHBsYWNlaG9sZGVyOmw9IiIsLi4uc309dCxhPWNsKEM0LG4pLHtvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOnV9PWEsYz1vIT09dm9pZCAwLGQ9c3QoZSxhLm9uVmFsdWVOb2RlQ2hhbmdlKTtyZXR1cm4gVW4oKCk9Pnt1KGMpfSxbdSxjXSkscC5jcmVhdGVFbGVtZW50KEtlLnNwYW4saWUoe30scyx7cmVmOmQsc3R5bGU6e3BvaW50ZXJFdmVudHM6Im5vbmUifX0pLGZrKGEudmFsdWUpP3AuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbCk6byl9KSxiND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2hpbGRyZW46ciwuLi5pfT10O3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoS2Uuc3BhbixpZSh7ImFyaWEtaGlkZGVuIjohMH0saSx7cmVmOmV9KSxyfHwi4pa8Iil9KSwkND10PT5wLmNyZWF0ZUVsZW1lbnQoJE0saWUoe2FzQ2hpbGQ6ITB9LHQpKSx2cz0iU2VsZWN0Q29udGVudCIsVDQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3Qgbj1jbCh2cyx0Ll9fc2NvcGVTZWxlY3QpLFtyLGldPXAudXNlU3RhdGUoKTtpZihVbigoKT0+e2kobmV3IERvY3VtZW50RnJhZ21lbnQpfSxbXSksIW4ub3Blbil7Y29uc3Qgbz1yO3JldHVybiBvP0dyLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoY2sse3Njb3BlOnQuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KFVmLlNsb3Qse3Njb3BlOnQuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsdC5jaGlsZHJlbikpKSxvKTpudWxsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoTjQsaWUoe30sdCx7cmVmOmV9KSl9KSxyaT0xMCxbY2ssV2ZdPURzKHZzKSxOND1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4scG9zaXRpb246cj0iaXRlbS1hbGlnbmVkIixvbkNsb3NlQXV0b0ZvY3VzOmksb25Fc2NhcGVLZXlEb3duOm8sb25Qb2ludGVyRG93bk91dHNpZGU6bCxzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6bSxoaWRlV2hlbkRldGFjaGVkOmcsYXZvaWRDb2xsaXNpb25zOncsLi4udn09dCx5PWNsKHZzLG4pLFt4LFNdPXAudXNlU3RhdGUobnVsbCksW2IsVF09cC51c2VTdGF0ZShudWxsKSwkPXN0KGUsUT0+UyhRKSksW08sTF09cC51c2VTdGF0ZShudWxsKSxbUCxEXT1wLnVzZVN0YXRlKG51bGwpLEI9WnYobiksW29lLEhdPXAudXNlU3RhdGUoITEpLFo9cC51c2VSZWYoITEpO3AudXNlRWZmZWN0KCgpPT57aWYoeClyZXR1cm4gQU0oeCl9LFt4XSksRTMoKTtjb25zdCBDPXAudXNlQ2FsbGJhY2soUT0+e2NvbnN0W2plLC4uLmJlXT1CKCkubWFwKEllPT5JZS5yZWYuY3VycmVudCksW1JlXT1iZS5zbGljZSgtMSksd2U9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgSWUgb2YgUSlpZihJZT09PXdlfHwoSWU9PW51bGx8fEllLnNjcm9sbEludG9WaWV3KHtibG9jazoibmVhcmVzdCJ9KSxJZT09PWplJiZiJiYoYi5zY3JvbGxUb3A9MCksSWU9PT1SZSYmYiYmKGIuc2Nyb2xsVG9wPWIuc2Nyb2xsSGVpZ2h0KSxJZT09bnVsbHx8SWUuZm9jdXMoKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09d2UpKXJldHVybn0sW0IsYl0pLGs9cC51c2VDYWxsYmFjaygoKT0+QyhbTyx4XSksW0MsTyx4XSk7cC51c2VFZmZlY3QoKCk9PntvZSYmaygpfSxbb2Usa10pO2NvbnN0e29uT3BlbkNoYW5nZTpFLHRyaWdnZXJQb2ludGVyRG93blBvc1JlZjpBfT15O3AudXNlRWZmZWN0KCgpPT57aWYoeCl7bGV0IFE9e3g6MCx5OjB9O2NvbnN0IGplPVJlPT57dmFyIHdlLEllLFFlLFd0O1E9e3g6TWF0aC5hYnMoTWF0aC5yb3VuZChSZS5wYWdlWCktKCh3ZT0oSWU9QS5jdXJyZW50KT09PW51bGx8fEllPT09dm9pZCAwP3ZvaWQgMDpJZS54KSE9PW51bGwmJndlIT09dm9pZCAwP3dlOjApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoUmUucGFnZVkpLSgoUWU9KFd0PUEuY3VycmVudCk9PT1udWxsfHxXdD09PXZvaWQgMD92b2lkIDA6V3QueSkhPT1udWxsJiZRZSE9PXZvaWQgMD9RZTowKSl9fSxiZT1SZT0+e1EueDw9MTAmJlEueTw9MTA/UmUucHJldmVudERlZmF1bHQoKTp4LmNvbnRhaW5zKFJlLnRhcmdldCl8fEUoITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixqZSksQS5jdXJyZW50PW51bGx9O3JldHVybiBBLmN1cnJlbnQhPT1udWxsJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGplKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLGJlLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsamUpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsYmUse2NhcHR1cmU6ITB9KX19fSxbeCxFLEFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IFE9KCk9PkUoITEpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsUSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsUSksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsUSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsUSl9fSxbRV0pO2NvbnN0W04sRl09cGsoUT0+e2NvbnN0IGplPUIoKS5maWx0ZXIod2U9PiF3ZS5kaXNhYmxlZCksYmU9amUuZmluZCh3ZT0+d2UucmVmLmN1cnJlbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSxSZT1nayhqZSxRLGJlKTtSZSYmc2V0VGltZW91dCgoKT0+UmUucmVmLmN1cnJlbnQuZm9jdXMoKSl9KSxLPXAudXNlQ2FsbGJhY2soKFEsamUsYmUpPT57Y29uc3QgUmU9IVouY3VycmVudCYmIWJlOyh5LnZhbHVlIT09dm9pZCAwJiZ5LnZhbHVlPT09amV8fFJlKSYmKEwoUSksUmUmJihaLmN1cnJlbnQ9ITApKX0sW3kudmFsdWVdKSxkZT1wLnVzZUNhbGxiYWNrKCgpPT54PT1udWxsP3ZvaWQgMDp4LmZvY3VzKCksW3hdKSxzZT1wLnVzZUNhbGxiYWNrKChRLGplLGJlKT0+e2NvbnN0IFJlPSFaLmN1cnJlbnQmJiFiZTsoeS52YWx1ZSE9PXZvaWQgMCYmeS52YWx1ZT09PWplfHxSZSkmJkQoUSl9LFt5LnZhbHVlXSksQWU9cj09PSJwb3BwZXIiP0p4OlI0LE5lPUFlPT09Sng/e3NpZGU6cyxzaWRlT2Zmc2V0OmEsYWxpZ246dSxhbGlnbk9mZnNldDpjLGFycm93UGFkZGluZzpkLGNvbGxpc2lvbkJvdW5kYXJ5OmYsY29sbGlzaW9uUGFkZGluZzpoLHN0aWNreTptLGhpZGVXaGVuRGV0YWNoZWQ6Zyxhdm9pZENvbGxpc2lvbnM6d306e307cmV0dXJuIHAuY3JlYXRlRWxlbWVudChjayx7c2NvcGU6bixjb250ZW50Ongsdmlld3BvcnQ6YixvblZpZXdwb3J0Q2hhbmdlOlQsaXRlbVJlZkNhbGxiYWNrOkssc2VsZWN0ZWRJdGVtOk8sb25JdGVtTGVhdmU6ZGUsaXRlbVRleHRSZWZDYWxsYmFjazpzZSxmb2N1c1NlbGVjdGVkSXRlbTprLHNlbGVjdGVkSXRlbVRleHQ6UCxwb3NpdGlvbjpyLGlzUG9zaXRpb25lZDpvZSxzZWFyY2hSZWY6Tn0scC5jcmVhdGVFbGVtZW50KHA0LHthcyxhbGxvd1BpbmNoWm9vbTohMH0scC5jcmVhdGVFbGVtZW50KEMzLHthc0NoaWxkOiEwLHRyYXBwZWQ6eS5vcGVuLG9uTW91bnRBdXRvRm9jdXM6UT0+e1EucHJldmVudERlZmF1bHQoKX0sb25Vbm1vdW50QXV0b0ZvY3VzOm50KGksUT0+e3ZhciBqZTsoamU9eS50cmlnZ2VyKT09PW51bGx8fGplPT09dm9pZCAwfHxqZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLFEucHJldmVudERlZmF1bHQoKX0pfSxwLmNyZWF0ZUVsZW1lbnQoXzMse2FzQ2hpbGQ6ITAsZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiEwLG9uRXNjYXBlS2V5RG93bjpvLG9uUG9pbnRlckRvd25PdXRzaWRlOmwsb25Gb2N1c091dHNpZGU6UT0+US5wcmV2ZW50RGVmYXVsdCgpLG9uRGlzbWlzczooKT0+eS5vbk9wZW5DaGFuZ2UoITEpfSxwLmNyZWF0ZUVsZW1lbnQoQWUsaWUoe3JvbGU6Imxpc3Rib3giLGlkOnkuY29udGVudElkLCJkYXRhLXN0YXRlIjp5Lm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpcjp5LmRpcixvbkNvbnRleHRNZW51OlE9PlEucHJldmVudERlZmF1bHQoKX0sdixOZSx7b25QbGFjZWQ6KCk9PkgoITApLHJlZjokLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLG91dGxpbmU6Im5vbmUiLC4uLnYuc3R5bGV9LG9uS2V5RG93bjpudCh2Lm9uS2V5RG93bixRPT57Y29uc3QgamU9US5jdHJsS2V5fHxRLmFsdEtleXx8US5tZXRhS2V5O2lmKFEua2V5PT09IlRhYiImJlEucHJldmVudERlZmF1bHQoKSwhamUmJlEua2V5Lmxlbmd0aD09PTEmJkYoUS5rZXkpLFsiQXJyb3dVcCIsIkFycm93RG93biIsIkhvbWUiLCJFbmQiXS5pbmNsdWRlcyhRLmtleSkpe2xldCBSZT1CKCkuZmlsdGVyKHdlPT4hd2UuZGlzYWJsZWQpLm1hcCh3ZT0+d2UucmVmLmN1cnJlbnQpO2lmKFsiQXJyb3dVcCIsIkVuZCJdLmluY2x1ZGVzKFEua2V5KSYmKFJlPVJlLnNsaWNlKCkucmV2ZXJzZSgpKSxbIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyhRLmtleSkpe2NvbnN0IHdlPVEudGFyZ2V0LEllPVJlLmluZGV4T2Yod2UpO1JlPVJlLnNsaWNlKEllKzEpfXNldFRpbWVvdXQoKCk9PkMoUmUpKSxRLnByZXZlbnREZWZhdWx0KCl9fSl9KSkpKSkpfSksUjQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLG9uUGxhY2VkOnIsLi4uaX09dCxvPWNsKHZzLG4pLGw9V2YodnMsbiksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLGQ9c3QoZSwkPT5jKCQpKSxmPVp2KG4pLGg9cC51c2VSZWYoITEpLG09cC51c2VSZWYoITApLHt2aWV3cG9ydDpnLHNlbGVjdGVkSXRlbTp3LHNlbGVjdGVkSXRlbVRleHQ6dixmb2N1c1NlbGVjdGVkSXRlbTp5fT1sLHg9cC51c2VDYWxsYmFjaygoKT0+e2lmKG8udHJpZ2dlciYmby52YWx1ZU5vZGUmJnMmJnUmJmcmJncmJnYpe2NvbnN0ICQ9by50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLE89dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxMPW8udmFsdWVOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihvLmRpciE9PSJydGwiKXtjb25zdCB3ZT1QLmxlZnQtTy5sZWZ0LEllPUwubGVmdC13ZSxRZT0kLmxlZnQtSWUsV3Q9JC53aWR0aCtRZSxTbj1NYXRoLm1heChXdCxPLndpZHRoKSxscj13aW5kb3cuaW5uZXJXaWR0aC1yaSx6ZT1HcChJZSxbcmksbHItU25dKTtzLnN0eWxlLm1pbldpZHRoPVd0KyJweCIscy5zdHlsZS5sZWZ0PXplKyJweCJ9ZWxzZXtjb25zdCB3ZT1PLnJpZ2h0LVAucmlnaHQsSWU9d2luZG93LmlubmVyV2lkdGgtTC5yaWdodC13ZSxRZT13aW5kb3cuaW5uZXJXaWR0aC0kLnJpZ2h0LUllLFd0PSQud2lkdGgrUWUsU249TWF0aC5tYXgoV3QsTy53aWR0aCksbHI9d2luZG93LmlubmVyV2lkdGgtcmksemU9R3AoSWUsW3JpLGxyLVNuXSk7cy5zdHlsZS5taW5XaWR0aD1XdCsicHgiLHMuc3R5bGUucmlnaHQ9emUrInB4In1jb25zdCBEPWYoKSxCPXdpbmRvdy5pbm5lckhlaWdodC1yaSoyLG9lPWcuc2Nyb2xsSGVpZ2h0LEg9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksWj1wYXJzZUludChILmJvcmRlclRvcFdpZHRoLDEwKSxDPXBhcnNlSW50KEgucGFkZGluZ1RvcCwxMCksaz1wYXJzZUludChILmJvcmRlckJvdHRvbVdpZHRoLDEwKSxFPXBhcnNlSW50KEgucGFkZGluZ0JvdHRvbSwxMCksQT1aK0Mrb2UrRStrLE49TWF0aC5taW4ody5vZmZzZXRIZWlnaHQqNSxBKSxGPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLEs9cGFyc2VJbnQoRi5wYWRkaW5nVG9wLDEwKSxkZT1wYXJzZUludChGLnBhZGRpbmdCb3R0b20sMTApLHNlPSQudG9wKyQuaGVpZ2h0LzItcmksQWU9Qi1zZSxOZT13Lm9mZnNldEhlaWdodC8yLFE9dy5vZmZzZXRUb3ArTmUsamU9WitDK1EsYmU9QS1qZTtpZihqZTw9c2Upe2NvbnN0IHdlPXc9PT1EW0QubGVuZ3RoLTFdLnJlZi5jdXJyZW50O3Muc3R5bGUuYm90dG9tPSIwcHgiO2NvbnN0IEllPXUuY2xpZW50SGVpZ2h0LWcub2Zmc2V0VG9wLWcub2Zmc2V0SGVpZ2h0LFFlPU1hdGgubWF4KEFlLE5lKyh3ZT9kZTowKStJZStrKSxXdD1qZStRZTtzLnN0eWxlLmhlaWdodD1XdCsicHgifWVsc2V7Y29uc3Qgd2U9dz09PURbMF0ucmVmLmN1cnJlbnQ7cy5zdHlsZS50b3A9IjBweCI7Y29uc3QgUWU9TWF0aC5tYXgoc2UsWitnLm9mZnNldFRvcCsod2U/SzowKStOZSkrYmU7cy5zdHlsZS5oZWlnaHQ9UWUrInB4IixnLnNjcm9sbFRvcD1qZS1zZStnLm9mZnNldFRvcH1zLnN0eWxlLm1hcmdpbj1gJHtyaX1weCAwYCxzLnN0eWxlLm1pbkhlaWdodD1OKyJweCIscy5zdHlsZS5tYXhIZWlnaHQ9QisicHgiLHI9PW51bGx8fHIoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PmguY3VycmVudD0hMCl9fSxbZixvLnRyaWdnZXIsby52YWx1ZU5vZGUscyx1LGcsdyx2LG8uZGlyLHJdKTtVbigoKT0+eCgpLFt4XSk7Y29uc3RbUyxiXT1wLnVzZVN0YXRlKCk7VW4oKCk9Pnt1JiZiKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLnpJbmRleCl9LFt1XSk7Y29uc3QgVD1wLnVzZUNhbGxiYWNrKCQ9PnskJiZtLmN1cnJlbnQ9PT0hMCYmKHgoKSx5PT1udWxsfHx5KCksbS5jdXJyZW50PSExKX0sW3gseV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoTzQse3Njb3BlOm4sY29udGVudFdyYXBwZXI6cyxzaG91bGRFeHBhbmRPblNjcm9sbFJlZjpoLG9uU2Nyb2xsQnV0dG9uQ2hhbmdlOlR9LHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIscG9zaXRpb246ImZpeGVkIix6SW5kZXg6U319LHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoe30saSx7cmVmOmQsc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsbWF4SGVpZ2h0OiIxMDAlIiwuLi5pLnN0eWxlfX0pKSkpfSksSng9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGFsaWduOnI9InN0YXJ0Iixjb2xsaXNpb25QYWRkaW5nOmk9cmksLi4ub309dCxsPUd2KG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoYk0saWUoe30sbCxvLHtyZWY6ZSxhbGlnbjpyLGNvbGxpc2lvblBhZGRpbmc6aSxzdHlsZTp7Ym94U2l6aW5nOiJib3JkZXItYm94IiwuLi5vLnN0eWxlLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4iOiJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbikiLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodCkifX0pKX0pLFtPNCxQNF09RHModnMse30pLHF4PSJTZWxlY3RWaWV3cG9ydCIsQTQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQsaT1XZihxeCxuKSxvPVA0KHF4LG4pLGw9c3QoZSxpLm9uVmlld3BvcnRDaGFuZ2UpLHM9cC51c2VSZWYoMCk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF06Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX0ifX0pLHAuY3JlYXRlRWxlbWVudChVZi5TbG90LHtzY29wZTpufSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnQiOiIiLHJvbGU6InByZXNlbnRhdGlvbiJ9LHIse3JlZjpsLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxvdmVyZmxvdzoiYXV0byIsLi4uci5zdHlsZX0sb25TY3JvbGw6bnQoci5vblNjcm9sbCxhPT57Y29uc3QgdT1hLmN1cnJlbnRUYXJnZXQse2NvbnRlbnRXcmFwcGVyOmMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6ZH09bztpZihkIT1udWxsJiZkLmN1cnJlbnQmJmMpe2NvbnN0IGY9TWF0aC5hYnMocy5jdXJyZW50LXUuc2Nyb2xsVG9wKTtpZihmPjApe2NvbnN0IGg9d2luZG93LmlubmVySGVpZ2h0LXJpKjIsbT1wYXJzZUZsb2F0KGMuc3R5bGUubWluSGVpZ2h0KSxnPXBhcnNlRmxvYXQoYy5zdHlsZS5oZWlnaHQpLHc9TWF0aC5tYXgobSxnKTtpZih3PGgpe2NvbnN0IHY9dytmLHk9TWF0aC5taW4oaCx2KSx4PXYteTtjLnN0eWxlLmhlaWdodD15KyJweCIsYy5zdHlsZS5ib3R0b209PT0iMHB4IiYmKHUuc2Nyb2xsVG9wPXg+MD94OjAsYy5zdHlsZS5qdXN0aWZ5Q29udGVudD0iZmxleC1lbmQiKX19fXMuY3VycmVudD11LnNjcm9sbFRvcH0pfSkpKSl9KSxNND0iU2VsZWN0R3JvdXAiLFtQRCxMNF09RHMoTTQpLEk0PSJTZWxlY3RMYWJlbCIsRDQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQsaT1MNChJNCxuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEtlLmRpdixpZSh7aWQ6aS5pZH0scix7cmVmOmV9KSl9KSxWZz0iU2VsZWN0SXRlbSIsW2o0LGRrXT1EcyhWZyksejQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLHZhbHVlOnIsZGlzYWJsZWQ6aT0hMSx0ZXh0VmFsdWU6bywuLi5sfT10LHM9Y2woVmcsbiksYT1XZihWZyxuKSx1PXMudmFsdWU9PT1yLFtjLGRdPXAudXNlU3RhdGUobz8/IiIpLFtmLGhdPXAudXNlU3RhdGUoITEpLG09c3QoZSx2PT57dmFyIHk7cmV0dXJuKHk9YS5pdGVtUmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKGEsdixyLGkpfSksZz1EZigpLHc9KCk9PntpfHwocy5vblZhbHVlQ2hhbmdlKHIpLHMub25PcGVuQ2hhbmdlKCExKSl9O2lmKHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIkEgPFNlbGVjdC5JdGVtIC8+IG11c3QgaGF2ZSBhIHZhbHVlIHByb3AgdGhhdCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGlzIGJlY2F1c2UgdGhlIFNlbGVjdCB2YWx1ZSBjYW4gYmUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCBzaG93IHRoZSBwbGFjZWhvbGRlci4iKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGo0LHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6aSx0ZXh0SWQ6Zyxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTpwLnVzZUNhbGxiYWNrKHY9PntkKHk9Pnt2YXIgeDtyZXR1cm4geXx8KCh4PXY9PW51bGw/dm9pZCAwOnYudGV4dENvbnRlbnQpIT09bnVsbCYmeCE9PXZvaWQgMD94OiIiKS50cmltKCl9KX0sW10pfSxwLmNyZWF0ZUVsZW1lbnQoVWYuSXRlbVNsb3Qse3Njb3BlOm4sdmFsdWU6cixkaXNhYmxlZDppLHRleHRWYWx1ZTpjfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHtyb2xlOiJvcHRpb24iLCJhcmlhLWxhYmVsbGVkYnkiOmcsImRhdGEtaGlnaGxpZ2h0ZWQiOmY/IiI6dm9pZCAwLCJhcmlhLXNlbGVjdGVkIjp1JiZmLCJkYXRhLXN0YXRlIjp1PyJjaGVja2VkIjoidW5jaGVja2VkIiwiYXJpYS1kaXNhYmxlZCI6aXx8dm9pZCAwLCJkYXRhLWRpc2FibGVkIjppPyIiOnZvaWQgMCx0YWJJbmRleDppP3ZvaWQgMDotMX0sbCx7cmVmOm0sb25Gb2N1czpudChsLm9uRm9jdXMsKCk9PmgoITApKSxvbkJsdXI6bnQobC5vbkJsdXIsKCk9PmgoITEpKSxvblBvaW50ZXJVcDpudChsLm9uUG9pbnRlclVwLHcpLG9uUG9pbnRlck1vdmU6bnQobC5vblBvaW50ZXJNb3ZlLHY9PntpZihpKXt2YXIgeTsoeT1hLm9uSXRlbUxlYXZlKT09PW51bGx8fHk9PT12b2lkIDB8fHkuY2FsbChhKX1lbHNlIHYuY3VycmVudFRhcmdldC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSksb25Qb2ludGVyTGVhdmU6bnQobC5vblBvaW50ZXJMZWF2ZSx2PT57aWYodi5jdXJyZW50VGFyZ2V0PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9fSksb25LZXlEb3duOm50KGwub25LZXlEb3duLHY9Pnt2YXIgeTsoKHk9YS5zZWFyY2hSZWYpPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jdXJyZW50KSE9PSIiJiZ2LmtleT09PSIgInx8KG00LmluY2x1ZGVzKHYua2V5KSYmdygpLHYua2V5PT09IiAiJiZ2LnByZXZlbnREZWZhdWx0KCkpfSl9KSkpKX0pLCRjPSJTZWxlY3RJdGVtVGV4dCIsRjQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGNsYXNzTmFtZTpyLHN0eWxlOmksLi4ub309dCxsPWNsKCRjLG4pLHM9V2YoJGMsbiksYT1kaygkYyxuKSx1PV80KCRjLG4pLFtjLGRdPXAudXNlU3RhdGUobnVsbCksZj1zdChlLHY9PmQodiksYS5vbkl0ZW1UZXh0Q2hhbmdlLHY9Pnt2YXIgeTtyZXR1cm4oeT1zLml0ZW1UZXh0UmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKHMsdixhLnZhbHVlLGEuZGlzYWJsZWQpfSksaD1jPT1udWxsP3ZvaWQgMDpjLnRleHRDb250ZW50LG09cC51c2VNZW1vKCgpPT5wLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTphLnZhbHVlLHZhbHVlOmEudmFsdWUsZGlzYWJsZWQ6YS5kaXNhYmxlZH0saCksW2EuZGlzYWJsZWQsYS52YWx1ZSxoXSkse29uTmF0aXZlT3B0aW9uQWRkOmcsb25OYXRpdmVPcHRpb25SZW1vdmU6d309dTtyZXR1cm4gVW4oKCk9PihnKG0pLCgpPT53KG0pKSxbZyx3LG1dKSxwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHtpZDphLnRleHRJZH0sbyx7cmVmOmZ9KSksYS5pc1NlbGVjdGVkJiZsLnZhbHVlTm9kZSYmIWwudmFsdWVOb2RlSGFzQ2hpbGRyZW4/R3IuY3JlYXRlUG9ydGFsKG8uY2hpbGRyZW4sbC52YWx1ZU5vZGUpOm51bGwpfSksQjQ9IlNlbGVjdEl0ZW1JbmRpY2F0b3IiLFU0PXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT10O3JldHVybiBkayhCNCxuKS5pc1NlbGVjdGVkP3AuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6ZX0pKTpudWxsfSksVzQ9cC5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PXQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJhcmlhLWhpZGRlbiI6ITB9LHIse3JlZjplfSkpfSk7ZnVuY3Rpb24gZmsodCl7cmV0dXJuIHQ9PT0iInx8dD09PXZvaWQgMH1jb25zdCBoaz1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHt2YWx1ZTpuLC4uLnJ9PXQsaT1wLnVzZVJlZihudWxsKSxvPXN0KGUsaSksbD1layhuKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPWkuY3VycmVudCxhPXdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudC5wcm90b3R5cGUsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInZhbHVlIikuc2V0O2lmKGwhPT1uJiZjKXtjb25zdCBkPW5ldyBFdmVudCgiY2hhbmdlIix7YnViYmxlczohMH0pO2MuY2FsbChzLG4pLHMuZGlzcGF0Y2hFdmVudChkKX19LFtsLG5dKSxwLmNyZWF0ZUVsZW1lbnQoTk0se2FzQ2hpbGQ6ITB9LHAuY3JlYXRlRWxlbWVudCgic2VsZWN0IixpZSh7fSxyLHtyZWY6byxkZWZhdWx0VmFsdWU6bn0pKSl9KTtoay5kaXNwbGF5TmFtZT0iQnViYmxlU2VsZWN0IjtmdW5jdGlvbiBwayh0KXtjb25zdCBlPWVuKHQpLG49cC51c2VSZWYoIiIpLHI9cC51c2VSZWYoMCksaT1wLnVzZUNhbGxiYWNrKGw9Pntjb25zdCBzPW4uY3VycmVudCtsO2UocyksZnVuY3Rpb24gYSh1KXtuLmN1cnJlbnQ9dSx3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksdSE9PSIiJiYoci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCIiKSwxZTMpKX0ocyl9LFtlXSksbz1wLnVzZUNhbGxiYWNrKCgpPT57bi5jdXJyZW50PSIiLHdpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KX0sW10pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSksW24saSxvXX1mdW5jdGlvbiBnayh0LGUsbil7Y29uc3QgaT1lLmxlbmd0aD4xJiZBcnJheS5mcm9tKGUpLmV2ZXJ5KHU9PnU9PT1lWzBdKT9lWzBdOmUsbz1uP3QuaW5kZXhPZihuKTotMTtsZXQgbD1WNCh0LE1hdGgubWF4KG8sMCkpO2kubGVuZ3RoPT09MSYmKGw9bC5maWx0ZXIodT0+dSE9PW4pKTtjb25zdCBhPWwuZmluZCh1PT51LnRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoaS50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGEhPT1uP2E6dm9pZCAwfWZ1bmN0aW9uIFY0KHQsZSl7cmV0dXJuIHQubWFwKChuLHIpPT50WyhlK3IpJXQubGVuZ3RoXSl9Y29uc3QgSDQ9dzQsbWs9RTQsSzQ9azQsWjQ9YjQsRzQ9JDQsdms9VDQsWTQ9QTQseWs9RDQseGs9ejQsWDQ9RjQsUTQ9VTQsX2s9VzQsSjQ9SDQscTQ9SzQsd2s9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsY2hpbGRyZW46ZSwuLi5ufSxyKT0+Xy5qc3hzKG1rLHtyZWY6cixjbGFzc05hbWU6eHQoImZsZXggaC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctcmluZyBmb2N1czpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIix0KSwuLi5uLGNoaWxkcmVuOltlLF8uanN4KFo0LHthc0NoaWxkOiEwLGNoaWxkcmVuOl8uanN4KGJDLHtjbGFzc05hbWU6InctNCBoLTQgb3BhY2l0eS01MCJ9KX0pXX0pKTt3ay5kaXNwbGF5TmFtZT1tay5kaXNwbGF5TmFtZTtjb25zdCBTaz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLHBvc2l0aW9uOm49InBvcHBlciIsLi4ucn0saSk9Pl8uanN4KEc0LHtjaGlsZHJlbjpfLmpzeCh2ayx7cmVmOmksY2xhc3NOYW1lOnh0KCJyZWxhdGl2ZSB6LTUwIG1pbi13LVs4cmVtXSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIixuPT09InBvcHBlciImJiJkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xIix0KSxwb3NpdGlvbjpuLC4uLnIsY2hpbGRyZW46Xy5qc3goWTQse2NsYXNzTmFtZTp4dCgicC0xIixuPT09InBvcHBlciImJiJoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0iKSxjaGlsZHJlbjplfSl9KX0pKTtTay5kaXNwbGF5TmFtZT12ay5kaXNwbGF5TmFtZTtjb25zdCBlTD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goeWsse3JlZjpuLGNsYXNzTmFtZTp4dCgicHktMS41IHBsLTggcHItMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQiLHQpLC4uLmV9KSk7ZUwuZGlzcGxheU5hbWU9eWsuZGlzcGxheU5hbWU7Y29uc3QgRWs9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsY2hpbGRyZW46ZSwuLi5ufSxyKT0+Xy5qc3hzKHhrLHtyZWY6cixjbGFzc05hbWU6eHQoInJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciByb3VuZGVkLXNtIHB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBvdXRsaW5lLW5vbmUgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAiLHQpLC4uLm4sY2hpbGRyZW46W18uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBsZWZ0LTIgZmxleCBoLTMuNSB3LTMuNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIiLGNoaWxkcmVuOl8uanN4KFE0LHtjaGlsZHJlbjpfLmpzeChxQSx7Y2xhc3NOYW1lOiJ3LTQgaC00In0pfSl9KSxfLmpzeChYNCx7Y2hpbGRyZW46ZX0pXX0pKTtFay5kaXNwbGF5TmFtZT14ay5kaXNwbGF5TmFtZTtjb25zdCB0TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goX2sse3JlZjpuLGNsYXNzTmFtZTp4dCgiLW14LTEgbXktMSBoLXB4IGJnLW11dGVkIix0KSwuLi5lfSkpO3RMLmRpc3BsYXlOYW1lPV9rLmRpc3BsYXlOYW1lO2Z1bmN0aW9uIENrKHtwYXRoOnQsZGlzYWJsZWQ6ZSxzb3VyY2U6bixzY2hlbWE6cixyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvfSl7cmV0dXJuKHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJzdHJpbmciP18uanN4KGlMLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09Im51bWJlciI/Xy5qc3gocl8se2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6b30pOih0eXBlb2Ygbj09Im51bWJlciJ8fHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJrZXlPZiI/Xy5qc3gobl8se2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOmksb25TdWJtaXQ6byxzZWxlY3RvcjpyLnNlbGVjdG9yfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJudW1iZXIiP18uanN4KHJfLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om99KToodHlwZW9mIG49PSJudW1iZXIifHx0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ia2V5T2YiP18uanN4KG5fLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazppLG9uU3VibWl0Om8sc2VsZWN0b3I6ci5zZWxlY3Rvcn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0icmljaHRleHQiP18uanN4KHJMLHtyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLGRlZmF1bHRWYWx1ZTpufSk6KHR5cGVvZiBuPT0ib2JqZWN0Inx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJpbWFnZSI/Xy5qc3gobkwse3BhdGg6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6aSxvblN1Ym1pdDpvLGRlZmF1bHRWYWx1ZTpufSk6Xy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIlVuc3VwcG9ydGVkIHNjaGVtYTogIixyLnR5cGVdfSl9ZnVuY3Rpb24gZV8odCxlLG4scil7aWYoIWV8fCFyKXJldHVybltdO2NvbnN0IGk9ci5zaGEyNTYuc2xpY2UoMCw1KSxvPWZ1bmN0aW9uKCl7Y29uc3QgbD1udihlKT8/InVua25vd24iLHM9cnYobCk7cmV0dXJuIG4/YC9wdWJsaWMvJHtuLnNwbGl0KCIuIikuc2xpY2UoMCwtMSkuam9pbigiLiIpfHxufV8ke2l9LiR7c31gOmAvcHVibGljLyR7ci5zaGEyNTZ9LiR7c31gfSgpO3JldHVyblt7dmFsdWU6e1tSbl06byxbbm5dOiJmaWxlIixtZXRhZGF0YTpyfSxvcDoicmVwbGFjZSIscGF0aDp0fSx7dmFsdWU6ZSxvcDoiZmlsZSIscGF0aDp0LGZpbGVQYXRoOm99XX1mdW5jdGlvbiBuTCh7cGF0aDp0LGRlZmF1bHRWYWx1ZTplLG9uU3VibWl0Om4scmVnaXN0ZXJQYXRjaENhbGxiYWNrOnJ9KXtjb25zdFtpLG9dPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSghMSksW2EsdV09cC51c2VTdGF0ZSgpLFtjLGRdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntkKGUmJmpuLmNvbnZlcnRGaWxlU291cmNlKGUpLnVybCl9LFtlXSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIGY9PmVfKGYsKGk9PW51bGw/dm9pZCAwOmkuc3JjKT8/bnVsbCwoaT09bnVsbD92b2lkIDA6aS5maWxlbmFtZSk/P251bGwsYSkpfSxbaSxlXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6Im1heC13LTR4bCBwLTQiLGNoaWxkcmVuOltfLmpzeHMoImxhYmVsIix7aHRtbEZvcjpgaW1nX2lucHV0OiR7dH1gLGNsYXNzTmFtZToiIixjaGlsZHJlbjpbaXx8Yz9fLmpzeCgiaW1nIix7c3JjOihpPT1udWxsP3ZvaWQgMDppLnNyYyl8fGN9KTpfLmpzeCgiZGl2Iix7Y2hpbGRyZW46IkVtcHR5In0pLF8uanN4KCJpbnB1dCIse2lkOmBpbWdfaW5wdXQ6JHt0fWAsdHlwZToiZmlsZSIsaGlkZGVuOiEwLG9uQ2hhbmdlOmY9Pnt3QyhmKS50aGVuKGg9PntvKHtzcmM6aC5zcmMsZmlsZW5hbWU6aC5maWxlbmFtZX0pLGgud2lkdGgmJmguaGVpZ2h0P3Uoe3NoYTI1NjpoLnNoYTI1Nix3aWR0aDpoLndpZHRoLGhlaWdodDpoLmhlaWdodH0pOnUodm9pZCAwKX0pLmNhdGNoKGg9Pntjb25zb2xlLmVycm9yKGgubWVzc2FnZSksbyhudWxsKSx1KHZvaWQgMCl9KX19KV19KSxuJiZfLmpzeCgiZGl2Iix7Y2hpbGRyZW46aSYmXy5qc3goTXMse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLG4oZj0+UHJvbWlzZS5yZXNvbHZlKGVfKGYsaS5zcmMsaS5maWxlbmFtZT8/bnVsbCxhKSkpLmZpbmFsbHkoKCk9PntzKCExKSxvKG51bGwpLHUodm9pZCAwKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSx0KX1hc3luYyBmdW5jdGlvbiB0Xyh0LGUpe2NvbnN0e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsZmlsZXM6aX09ZT9hd2FpdCBUUihlLmdldEVkaXRvclN0YXRlKCkudG9KU09OKCkucm9vdCk6e1tubl06InJpY2h0ZXh0Iix0ZW1wbGF0ZVN0cmluZ3M6WyIiXSxleHByczpbXSxmaWxlczp7fX07cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp0LHZhbHVlOnt0ZW1wbGF0ZVN0cmluZ3M6bixleHByczpyLFtubl06InJpY2h0ZXh0In19LC4uLk9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW28sbF0pPT4oe29wOiJmaWxlIixwYXRoOnQsZmlsZVBhdGg6byx2YWx1ZTpsfSkpXX1mdW5jdGlvbiByTCh7ZGVmYXVsdFZhbHVlOnQsb25TdWJtaXQ6ZSxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKSxbcyxhXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntyJiYobCghMSksci5yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIoKCk9PntsKCEwKX0pLHIucmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcigoKT0+e2woITApfSkpfSxbcl0pLHAudXNlRWZmZWN0KCgpPT57ciYmbiYmbih1PT50Xyh1LHIpKX0sW3JdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IGJvcmRlciByb3VuZGVkIGJvcmRlci1jYXJkIixjaGlsZHJlbjpbXy5qc3goWEEse29uRWRpdG9yOnU9PntpKHUpfSxyaWNodGV4dDp0fHx7Y2hpbGRyZW46W10sW25uXToicm9vdCJ9fSksZSYmXy5qc3goImRpdiIse2NoaWxkcmVuOm8mJl8uanN4KE1zLHtkaXNhYmxlZDpzfHwhcixvbkNsaWNrOigpPT57ciYmKGEoITApLGUodT0+dF8odSxyKSkuZmluYWxseSgoKT0+e2EoITEpLGwoITEpfSkpfSxjaGlsZHJlbjpzPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gbl8oe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjppfSl7Y29uc3Qgbz1rSShpKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChtPT5wYXJzZUludChtKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShvKSxbYSx1XT1wLnVzZVN0YXRlKGV8fHMudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QodCl9LFt0XSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOltfLmpzeHMoSjQse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbXy5qc3god2sse2NoaWxkcmVuOl8uanN4KHE0LHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSxfLmpzeChTayx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9Pl8uanN4KEVrLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZfLmpzeCgiZGl2Iix7Y2hpbGRyZW46ZSE9PWEmJl8uanN4KE1zLHtkaXNhYmxlZDpjLG9uQ2xpY2s6KCk9PntkKCEwKSxyKGFzeW5jIGg9Plt7b3A6InJlcGxhY2UiLHBhdGg6aCx2YWx1ZTphfV0pLmZpbmFsbHkoKCk9PntkKCExKX0pfSxjaGlsZHJlbjpjPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gcl8oe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W2ksb109cC51c2VTdGF0ZShlfHwwKSxbbCxzXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e3ModCl9LFt0XSk7Y29uc3QgYT1wLnVzZVJlZihudWxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuJiZuKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6TnVtYmVyKChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwwfV19KX0sW10pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4KEZ2LHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTppPz8wLG9uQ2hhbmdlOnU9Pm8oTnVtYmVyKHUudGFyZ2V0LnZhbHVlKSksdHlwZToibnVtYmVyIn0pLHImJl8uanN4KCJkaXYiLHtjaGlsZHJlbjplIT09aSYmXy5qc3goTXMse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9ZnVuY3Rpb24gaUwoe2Rpc2FibGVkOnQsZGVmYXVsdFZhbHVlOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W2ksb109cC51c2VTdGF0ZShlfHwiIiksW2wsc109cC51c2VTdGF0ZSghMSk7cC51c2VFZmZlY3QoKCk9PntzKHQpfSxbdF0pO2NvbnN0IGE9cC51c2VSZWYobnVsbCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pfSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbXy5qc3goRnYse3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOmk/PyIiLG9uQ2hhbmdlOnU9Pm8odS50YXJnZXQudmFsdWUpfSksciYmXy5qc3goImRpdiIse2NoaWxkcmVuOmUhPT1pJiZfLmpzeChNcyx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCkscihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTYXZlIn0pfSldfSl9Y29uc3Qgb0w9KHtjbGFzc05hbWU6dH0pPT5fLmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTp0LGNoaWxkcmVuOltfLmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOl8uanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSxfLmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOl8uanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4cygiZGVmcyIse2NoaWxkcmVuOltfLmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOltfLmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksXy5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSksXy5qc3goImZlT2Zmc2V0Iix7fSksXy5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLF8uanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSxfLmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSksXy5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W18uanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSxfLmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLF8uanN4KCJmZU9mZnNldCIse30pLF8uanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSksXy5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLF8uanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxraz1vTCxiaz0iU3dpdGNoIixbbEwsQURdPW9sKGJrKSxbc0wsYUxdPWxMKGJrKSx1TD1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6aSxkZWZhdWx0Q2hlY2tlZDpvLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309dCxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9c3QoZSx5PT5mKHkpKSxtPXAudXNlUmVmKCExKSxnPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbdz0hMSx2XT1tcyh7cHJvcDppLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoc0wse3Njb3BlOm4sY2hlY2tlZDp3LGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjp3LCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjokayh3KSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOm50KHQub25DbGljayx5PT57dih4PT4heCksZyYmKG0uY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksbS5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLGcmJnAuY3JlYXRlRWxlbWVudChmTCx7Y29udHJvbDpkLGJ1YmJsZXM6IW0uY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOncscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSxjTD0iU3dpdGNoVGh1bWIiLGRMPXAuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT10LGk9YUwoY0wsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5zcGFuLGllKHsiZGF0YS1zdGF0ZSI6JGsoaS5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjplfSkpfSksZkw9dD0+e2NvbnN0e2NvbnRyb2w6ZSxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLml9PXQsbz1wLnVzZVJlZihudWxsKSxsPWVrKG4pLHM9WkMoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1vLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGllKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxpLHt0YWJJbmRleDotMSxyZWY6byxzdHlsZTp7Li4udC5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gJGsodCl7cmV0dXJuIHQ/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IFRrPXVMLGhMPWRMLEhnPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LC4uLmV9LG4pPT5fLmpzeChUayx7Y2xhc3NOYW1lOnh0KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsdCksLi4uZSxyZWY6bixjaGlsZHJlbjpfLmpzeChoTCx7Y2xhc3NOYW1lOnh0KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtIZy5kaXNwbGF5TmFtZT1Uay5kaXNwbGF5TmFtZTtjb25zdCBZdj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLHQpLC4uLmV9KSk7WXYuZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IHBMPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTp0LC4uLmV9LG4pPT5fLmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOnh0KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsdCksLi4uZX0pKTtwTC5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgZ0w9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTp4dCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLHQpLC4uLmV9KSk7Z0wuZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3QgbUw9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOnh0KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsdCksLi4uZX0pKTttTC5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCB2TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgicC02IHB0LTAiLHQpLC4uLmV9KSk7dkwuZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCB5TD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCwuLi5lfSxuKT0+Xy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTp4dCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLHQpLC4uLmV9KSk7eUwuZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMy4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24geXQoKXtyZXR1cm4geXQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSx5dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHd0OyhmdW5jdGlvbih0KXt0LlBvcD0iUE9QIix0LlB1c2g9IlBVU0giLHQuUmVwbGFjZT0iUkVQTEFDRSJ9KSh3dHx8KHd0PXt9KSk7Y29uc3QgaV89InBvcHN0YXRlIjtmdW5jdGlvbiB4TCh0KXt0PT09dm9pZCAwJiYodD17fSk7ZnVuY3Rpb24gZShyLGkpe2xldHtwYXRobmFtZTpvLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4ga3UoIiIse3BhdGhuYW1lOm8sc2VhcmNoOmwsaGFzaDpzfSxpLnN0YXRlJiZpLnN0YXRlLnVzcnx8bnVsbCxpLnN0YXRlJiZpLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsaSl7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOlZ1KGkpfXJldHVybiB3TChlLG4sbnVsbCx0KX1mdW5jdGlvbiBPZSh0LGUpe2lmKHQ9PT0hMXx8dD09PW51bGx8fHR5cGVvZiB0PiJ1Iil0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gcW8odCxlKXtpZighdCl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4oZSk7dHJ5e3Rocm93IG5ldyBFcnJvcihlKX1jYXRjaHt9fX1mdW5jdGlvbiBfTCgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiBvXyh0LGUpe3JldHVybnt1c3I6dC5zdGF0ZSxrZXk6dC5rZXksaWR4OmV9fWZ1bmN0aW9uIGt1KHQsZSxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSx5dCh7cGF0aG5hbWU6dHlwZW9mIHQ9PSJzdHJpbmciP3Q6dC5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpOmUse3N0YXRlOm4sa2V5OmUmJmUua2V5fHxyfHxfTCgpfSl9ZnVuY3Rpb24gVnUodCl7bGV0e3BhdGhuYW1lOmU9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09dDtyZXR1cm4gbiYmbiE9PSI/IiYmKGUrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJihlKz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSxlfWZ1bmN0aW9uIGtpKHQpe2xldCBlPXt9O2lmKHQpe2xldCBuPXQuaW5kZXhPZigiIyIpO24+PTAmJihlLmhhc2g9dC5zdWJzdHIobiksdD10LnN1YnN0cigwLG4pKTtsZXQgcj10LmluZGV4T2YoIj8iKTtyPj0wJiYoZS5zZWFyY2g9dC5zdWJzdHIociksdD10LnN1YnN0cigwLHIpKSx0JiYoZS5wYXRobmFtZT10KX1yZXR1cm4gZX1mdW5jdGlvbiB3TCh0LGUsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzppPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Om89ITF9PXIsbD1pLmhpc3Rvcnkscz13dC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUoeXQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPXd0LlBvcDtsZXQgdz1jKCksdj13PT1udWxsP251bGw6dy11O3U9dyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKHcsdil7cz13dC5QdXNoO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCkrMTtsZXQgeD1vXyh5LHUpLFM9Zy5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZSh4LCIiLFMpfWNhdGNoKGIpe2lmKGIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJmIubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgYjtpLmxvY2F0aW9uLmFzc2lnbihTKX1vJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjpnLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKHcsdil7cz13dC5SZXBsYWNlO2xldCB5PWt1KGcubG9jYXRpb24sdyx2KTtuJiZuKHksdyksdT1jKCk7bGV0IHg9b18oeSx1KSxTPWcuY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZSh4LCIiLFMpLG8mJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIG0odyl7bGV0IHY9aS5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/aS5sb2NhdGlvbi5vcmlnaW46aS5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIHc9PSJzdHJpbmciP3c6VnUodyk7cmV0dXJuIE9lKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgZz17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gdChpLGwpfSxsaXN0ZW4odyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIoaV8sZCksYT13LCgpPT57aS5yZW1vdmVFdmVudExpc3RlbmVyKGlfLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYodyl7cmV0dXJuIGUoaSx3KX0sY3JlYXRlVVJMOm0sZW5jb2RlTG9jYXRpb24odyl7bGV0IHY9bSh3KTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKHcpe3JldHVybiBsLmdvKHcpfX07cmV0dXJuIGd9dmFyIFN0OyhmdW5jdGlvbih0KXt0LmRhdGE9ImRhdGEiLHQuZGVmZXJyZWQ9ImRlZmVycmVkIix0LnJlZGlyZWN0PSJyZWRpcmVjdCIsdC5lcnJvcj0iZXJyb3IifSkoU3R8fChTdD17fSkpO2NvbnN0IFNMPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gRUwodCl7cmV0dXJuIHQuaW5kZXg9PT0hMH1mdW5jdGlvbiBLZyh0LGUsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSx0Lm1hcCgoaSxvKT0+e2xldCBsPVsuLi5uLG9dLHM9dHlwZW9mIGkuaWQ9PSJzdHJpbmciP2kuaWQ6bC5qb2luKCItIik7aWYoT2UoaS5pbmRleCE9PSEwfHwhaS5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSxPZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLEVMKGkpKXtsZXQgYT15dCh7fSxpLGUoaSkse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT15dCh7fSxpLGUoaSkse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxpLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1LZyhpLmNoaWxkcmVuLGUsbCxyKSksYX19KX1mdW5jdGlvbiBCbCh0LGUsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgZT09InN0cmluZyI/a2koZSk6ZSxpPUh1KHIucGF0aG5hbWV8fCIvIixuKTtpZihpPT1udWxsKXJldHVybiBudWxsO2xldCBvPU5rKHQpO2tMKG8pO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxvLmxlbmd0aDsrK3MpbD1NTChvW3NdLERMKGkpKTtyZXR1cm4gbH1mdW5jdGlvbiBDTCh0LGUpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOml9PXQ7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6aSxkYXRhOmVbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiBOayh0LGUsbixyKXtlPT09dm9pZCAwJiYoZT1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgaT0obyxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP28ucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOm8uY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTpvfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJihPZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWVvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtvLmNoaWxkcmVuJiZvLmNoaWxkcmVuLmxlbmd0aD4wJiYoT2Uoby5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLE5rKG8uY2hpbGRyZW4sZSxjLHUpKSwhKG8ucGF0aD09bnVsbCYmIW8uaW5kZXgpJiZlLnB1c2goe3BhdGg6dSxzY29yZTpQTCh1LG8uaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gdC5mb3JFYWNoKChvLGwpPT57dmFyIHM7aWYoby5wYXRoPT09IiJ8fCEoKHM9by5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlpKG8sbCk7ZWxzZSBmb3IobGV0IGEgb2YgUmsoby5wYXRoKSlpKG8sbCxhKX0pLGV9ZnVuY3Rpb24gUmsodCl7bGV0IGU9dC5zcGxpdCgiLyIpO2lmKGUubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT1lLGk9bi5lbmRzV2l0aCgiPyIpLG89bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIGk/W28sIiJdOltvXTtsZXQgbD1SayhyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9vOltvLGFdLmpvaW4oIi8iKSkpLGkmJnMucHVzaCguLi5sKSxzLm1hcChhPT50LnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBrTCh0KXt0LnNvcnQoKGUsbik9PmUuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtZS5zY29yZTpBTChlLnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3QgYkw9L146XHcrJC8sJEw9MyxUTD0yLE5MPTEsUkw9MTAsT0w9LTIsbF89dD0+dD09PSIqIjtmdW5jdGlvbiBQTCh0LGUpe2xldCBuPXQuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUobF8pJiYocis9T0wpLGUmJihyKz1UTCksbi5maWx0ZXIoaT0+IWxfKGkpKS5yZWR1Y2UoKGksbyk9PmkrKGJMLnRlc3Qobyk/JEw6bz09PSIiP05MOlJMKSxyKX1mdW5jdGlvbiBBTCh0LGUpe3JldHVybiB0Lmxlbmd0aD09PWUubGVuZ3RoJiZ0LnNsaWNlKDAsLTEpLmV2ZXJ5KChyLGkpPT5yPT09ZVtpXSk/dFt0Lmxlbmd0aC0xXS1lW2UubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gTUwodCxlKXtsZXR7cm91dGVzTWV0YTpufT10LHI9e30saT0iLyIsbz1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9aT09PSIvIj9lOmUuc2xpY2UoaS5sZW5ndGgpfHwiLyIsYz1MTCh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO28ucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6ZW8oW2ksYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTpCTChlbyhbaSxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihpPWVvKFtpLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBvfWZ1bmN0aW9uIExMKHQsZSl7dHlwZW9mIHQ9PSJzdHJpbmciJiYodD17cGF0aDp0LGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09SUwodC5wYXRoLHQuY2FzZVNlbnNpdGl2ZSx0LmVuZCksaT1lLm1hdGNoKG4pO2lmKCFpKXJldHVybiBudWxsO2xldCBvPWlbMF0sbD1vLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9aS5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBnPXNbZF18fCIiO2w9by5zbGljZSgwLG8ubGVuZ3RoLWcubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBtPXNbZF07cmV0dXJuIGgmJiFtP3VbZl09dm9pZCAwOnVbZl09akwobXx8IiIsZiksdX0se30pLHBhdGhuYW1lOm8scGF0aG5hbWVCYXNlOmwscGF0dGVybjp0fX1mdW5jdGlvbiBJTCh0LGUsbil7ZT09PXZvaWQgMCYmKGU9ITEpLG49PT12b2lkIDAmJihuPSEwKSxxbyh0PT09IioifHwhdC5lbmRzV2l0aCgiKiIpfHx0LmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK3QrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK3QucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJyt0LnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLGk9Il4iK3QucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiB0LmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLGkrPXQ9PT0iKiJ8fHQ9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9pKz0iXFwvKiQiOnQhPT0iIiYmdCE9PSIvIiYmKGkrPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAoaSxlP3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIERMKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKHQpfWNhdGNoKGUpe3JldHVybiBxbyghMSwnVGhlIFVSTCBwYXRoICInK3QrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrZSsiKS4iKSksdH19ZnVuY3Rpb24gakwodCxlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChuKXtyZXR1cm4gcW8oITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJytlKyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJyt0KyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksdH19ZnVuY3Rpb24gSHUodCxlKXtpZihlPT09Ii8iKXJldHVybiB0O2lmKCF0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChlLnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPWUuZW5kc1dpdGgoIi8iKT9lLmxlbmd0aC0xOmUubGVuZ3RoLHI9dC5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDp0LnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gekwodCxlKXtlPT09dm9pZCAwJiYoZT0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6aT0iIn09dHlwZW9mIHQ9PSJzdHJpbmciP2tpKHQpOnQ7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjpGTChuLGUpOmUsc2VhcmNoOlVMKHIpLGhhc2g6V0woaSl9fWZ1bmN0aW9uIEZMKHQsZSl7bGV0IG49ZS5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gdC5zcGxpdCgiLyIpLmZvckVhY2goaT0+e2k9PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6aSE9PSIuIiYmbi5wdXNoKGkpfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gS2godCxlLG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrdCsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK2UrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiBPayh0KXtyZXR1cm4gdC5maWx0ZXIoKGUsbik9Pm49PT0wfHxlLnJvdXRlLnBhdGgmJmUucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gUGsodCl7cmV0dXJuIE9rKHQpLm1hcCgoZSxuKT0+bj09PXQubGVuZ3RoLTE/ZS5wYXRobmFtZTplLnBhdGhuYW1lQmFzZSl9ZnVuY3Rpb24gQWsodCxlLG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBpO3R5cGVvZiB0PT0ic3RyaW5nIj9pPWtpKHQpOihpPXl0KHt9LHQpLE9lKCFpLnBhdGhuYW1lfHwhaS5wYXRobmFtZS5pbmNsdWRlcygiPyIpLEtoKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLGkpKSxPZSghaS5wYXRobmFtZXx8IWkucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxLaCgiIyIsInBhdGhuYW1lIiwiaGFzaCIsaSkpLE9lKCFpLnNlYXJjaHx8IWkuc2VhcmNoLmluY2x1ZGVzKCIjIiksS2goIiMiLCJzZWFyY2giLCJoYXNoIixpKSkpO2xldCBvPXQ9PT0iInx8aS5wYXRobmFtZT09PSIiLGw9bz8iLyI6aS5wYXRobmFtZSxzO2lmKGw9PW51bGwpcz1uO2Vsc2UgaWYocil7bGV0IGQ9ZVtlLmxlbmd0aC0xXS5yZXBsYWNlKC9eXC8vLCIiKS5zcGxpdCgiLyIpO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLnBvcCgpO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz0iLyIrZC5qb2luKCIvIil9ZWxzZXtsZXQgZD1lLmxlbmd0aC0xO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLT0xO2kucGF0aG5hbWU9Zi5qb2luKCIvIil9cz1kPj0wP2VbZF06Ii8ifWxldCBhPXpMKGkscyksdT1sJiZsIT09Ii8iJiZsLmVuZHNXaXRoKCIvIiksYz0ob3x8bD09PSIuIikmJm4uZW5kc1dpdGgoIi8iKTtyZXR1cm4hYS5wYXRobmFtZS5lbmRzV2l0aCgiLyIpJiYodXx8YykmJihhLnBhdGhuYW1lKz0iLyIpLGF9Y29uc3QgZW89dD0+dC5qb2luKCIvIikucmVwbGFjZSgvXC9cLysvZywiLyIpLEJMPXQ9PnQucmVwbGFjZSgvXC8rJC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIiksVUw9dD0+IXR8fHQ9PT0iPyI/IiI6dC5zdGFydHNXaXRoKCI/Iik/dDoiPyIrdCxXTD10PT4hdHx8dD09PSIjIj8iIjp0LnN0YXJ0c1dpdGgoIiMiKT90OiIjIit0O2NsYXNzIFh2e2NvbnN0cnVjdG9yKGUsbixyLGkpe2k9PT12b2lkIDAmJihpPSExKSx0aGlzLnN0YXR1cz1lLHRoaXMuc3RhdHVzVGV4dD1ufHwiIix0aGlzLmludGVybmFsPWksciBpbnN0YW5jZW9mIEVycm9yPyh0aGlzLmRhdGE9ci50b1N0cmluZygpLHRoaXMuZXJyb3I9cik6dGhpcy5kYXRhPXJ9fWZ1bmN0aW9uIE1rKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdC5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIHQuaW50ZXJuYWw9PSJib29sZWFuIiYmImRhdGEiaW4gdH1jb25zdCBMaz1bInBvc3QiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSJdLFZMPW5ldyBTZXQoTGspLEhMPVsiZ2V0IiwuLi5Ma10sS0w9bmV3IFNldChITCksWkw9bmV3IFNldChbMzAxLDMwMiwzMDMsMzA3LDMwOF0pLEdMPW5ldyBTZXQoWzMwNywzMDhdKSxaaD17c3RhdGU6ImlkbGUiLGxvY2F0aW9uOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxZTD17c3RhdGU6ImlkbGUiLGRhdGE6dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LGVhPXtzdGF0ZToidW5ibG9ja2VkIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246dm9pZCAwfSxJaz0vXig/OlthLXpdW2EtejAtOSsuLV0qOnxcL1wvKS9pLFhMPXQ9Pih7aGFzRXJyb3JCb3VuZGFyeTohIXQuaGFzRXJyb3JCb3VuZGFyeX0pLERrPSJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnMiO2Z1bmN0aW9uIFFMKHQpe2NvbnN0IGU9dC53aW5kb3c/dC53aW5kb3c6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnZvaWQgMCxuPXR5cGVvZiBlPCJ1IiYmdHlwZW9mIGUuZG9jdW1lbnQ8InUiJiZ0eXBlb2YgZS5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixyPSFuO09lKHQucm91dGVzLmxlbmd0aD4wLCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXIiKTtsZXQgaTtpZih0Lm1hcFJvdXRlUHJvcGVydGllcylpPXQubWFwUm91dGVQcm9wZXJ0aWVzO2Vsc2UgaWYodC5kZXRlY3RFcnJvckJvdW5kYXJ5KXtsZXQgUj10LmRldGVjdEVycm9yQm91bmRhcnk7aT1JPT4oe2hhc0Vycm9yQm91bmRhcnk6UihJKX0pfWVsc2UgaT1YTDtsZXQgbz17fSxsPUtnKHQucm91dGVzLGksdm9pZCAwLG8pLHMsYT10LmJhc2VuYW1lfHwiLyIsdT15dCh7djdfZmV0Y2hlclBlcnNpc3Q6ITEsdjdfbm9ybWFsaXplRm9ybU1ldGhvZDohMSx2N19wcmVwZW5kQmFzZW5hbWU6ITF9LHQuZnV0dXJlKSxjPW51bGwsZD1uZXcgU2V0LGY9bnVsbCxoPW51bGwsbT1udWxsLGc9dC5oeWRyYXRpb25EYXRhIT1udWxsLHc9QmwobCx0Lmhpc3RvcnkubG9jYXRpb24sYSksdj1udWxsO2lmKHc9PW51bGwpe2xldCBSPUduKDQwNCx7cGF0aG5hbWU6dC5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lfSkse21hdGNoZXM6SSxyb3V0ZTp6fT1wXyhsKTt3PUksdj17W3ouaWRdOlJ9fWxldCB5PSF3LnNvbWUoUj0+Ui5yb3V0ZS5sYXp5KSYmKCF3LnNvbWUoUj0+Ui5yb3V0ZS5sb2FkZXIpfHx0Lmh5ZHJhdGlvbkRhdGEhPW51bGwpLHgsUz17aGlzdG9yeUFjdGlvbjp0Lmhpc3RvcnkuYWN0aW9uLGxvY2F0aW9uOnQuaGlzdG9yeS5sb2NhdGlvbixtYXRjaGVzOncsaW5pdGlhbGl6ZWQ6eSxuYXZpZ2F0aW9uOlpoLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjp0Lmh5ZHJhdGlvbkRhdGEhPW51bGw/ITE6bnVsbCxwcmV2ZW50U2Nyb2xsUmVzZXQ6ITEscmV2YWxpZGF0aW9uOiJpZGxlIixsb2FkZXJEYXRhOnQuaHlkcmF0aW9uRGF0YSYmdC5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGF8fHt9LGFjdGlvbkRhdGE6dC5oeWRyYXRpb25EYXRhJiZ0Lmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YXx8bnVsbCxlcnJvcnM6dC5oeWRyYXRpb25EYXRhJiZ0Lmh5ZHJhdGlvbkRhdGEuZXJyb3JzfHx2LGZldGNoZXJzOm5ldyBNYXAsYmxvY2tlcnM6bmV3IE1hcH0sYj13dC5Qb3AsVD0hMSwkLE89ITEsTD1uZXcgTWFwLFA9bnVsbCxEPSExLEI9ITEsb2U9W10sSD1bXSxaPW5ldyBNYXAsQz0wLGs9LTEsRT1uZXcgTWFwLEE9bmV3IFNldCxOPW5ldyBNYXAsRj1uZXcgTWFwLEs9bmV3IFNldCxkZT1uZXcgTWFwLHNlPW5ldyBNYXAsQWU9ITE7ZnVuY3Rpb24gTmUoKXtpZihjPXQuaGlzdG9yeS5saXN0ZW4oUj0+e2xldHthY3Rpb246SSxsb2NhdGlvbjp6LGRlbHRhOll9PVI7aWYoQWUpe0FlPSExO3JldHVybn1xbyhzZS5zaXplPT09MHx8WSE9bnVsbCwiWW91IGFyZSB0cnlpbmcgdG8gdXNlIGEgYmxvY2tlciBvbiBhIFBPUCBuYXZpZ2F0aW9uIHRvIGEgbG9jYXRpb24gdGhhdCB3YXMgbm90IGNyZWF0ZWQgYnkgQHJlbWl4LXJ1bi9yb3V0ZXIuIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGluIHByb2R1Y3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgYXJlIG5hdmlnYXRpbmcgb3V0c2lkZSB0aGUgcm91dGVyIHZpYSBgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlYC9gd2luZG93LmxvY2F0aW9uLmhhc2hgIGluc3RlYWQgb2YgdXNpbmcgcm91dGVyIG5hdmlnYXRpb24gQVBJcy4gIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgY3JlYXRlSGFzaFJvdXRlciBhbmQgdGhlIHVzZXIgbWFudWFsbHkgY2hhbmdlcyB0aGUgVVJMLiIpO2xldCBsZT1seSh7Y3VycmVudExvY2F0aW9uOlMubG9jYXRpb24sbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpJfSk7aWYobGUmJlkhPW51bGwpe0FlPSEwLHQuaGlzdG9yeS5nbyhZKi0xKSxLdShsZSx7c3RhdGU6ImJsb2NrZWQiLGxvY2F0aW9uOnoscHJvY2VlZCgpe0t1KGxlLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnp9KSx0Lmhpc3RvcnkuZ28oWSl9LHJlc2V0KCl7bGV0IGtlPW5ldyBNYXAoUy5ibG9ja2Vycyk7a2Uuc2V0KGxlLGVhKSxiZSh7YmxvY2tlcnM6a2V9KX19KTtyZXR1cm59cmV0dXJuIFFlKEkseil9KSxuKXthSShlLEwpO2xldCBSPSgpPT51SShlLEwpO2UuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFIpLFA9KCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFIpfXJldHVybiBTLmluaXRpYWxpemVkfHxRZSh3dC5Qb3AsUy5sb2NhdGlvbikseH1mdW5jdGlvbiBRKCl7YyYmYygpLFAmJlAoKSxkLmNsZWFyKCksJCYmJC5hYm9ydCgpLFMuZmV0Y2hlcnMuZm9yRWFjaCgoUixJKT0+UG4oSSkpLFMuYmxvY2tlcnMuZm9yRWFjaCgoUixJKT0+b3koSSkpfWZ1bmN0aW9uIGplKFIpe3JldHVybiBkLmFkZChSKSwoKT0+ZC5kZWxldGUoUil9ZnVuY3Rpb24gYmUoUixJKXtJPT09dm9pZCAwJiYoST17fSksUz15dCh7fSxTLFIpO2xldCB6PVtdLFk9W107dS52N19mZXRjaGVyUGVyc2lzdCYmUy5mZXRjaGVycy5mb3JFYWNoKChsZSxrZSk9PntsZS5zdGF0ZT09PSJpZGxlIiYmKEsuaGFzKGtlKT9ZLnB1c2goa2UpOnoucHVzaChrZSkpfSksWy4uLmRdLmZvckVhY2gobGU9PmxlKFMse2RlbGV0ZWRGZXRjaGVyczpZLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpJLnZpZXdUcmFuc2l0aW9uT3B0cyx1bnN0YWJsZV9mbHVzaFN5bmM6SS5mbHVzaFN5bmM9PT0hMH0pKSx1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5mb3JFYWNoKGxlPT5TLmZldGNoZXJzLmRlbGV0ZShsZSkpLFkuZm9yRWFjaChsZT0+UG4obGUpKSl9ZnVuY3Rpb24gUmUoUixJLHope3ZhciBZLGxlO2xldHtmbHVzaFN5bmM6a2V9PXo9PT12b2lkIDA/e306eixnZT1TLmFjdGlvbkRhdGEhPW51bGwmJlMubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZwcihTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJlMubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmKChZPVIuc3RhdGUpPT1udWxsP3ZvaWQgMDpZLl9pc1JlZGlyZWN0KSE9PSEwLHBlO0kuYWN0aW9uRGF0YT9PYmplY3Qua2V5cyhJLmFjdGlvbkRhdGEpLmxlbmd0aD4wP3BlPUkuYWN0aW9uRGF0YTpwZT1udWxsOmdlP3BlPVMuYWN0aW9uRGF0YTpwZT1udWxsO2xldCB1ZT1JLmxvYWRlckRhdGE/aF8oUy5sb2FkZXJEYXRhLEkubG9hZGVyRGF0YSxJLm1hdGNoZXN8fFtdLEkuZXJyb3JzKTpTLmxvYWRlckRhdGEsTWU9Uy5ibG9ja2VycztNZS5zaXplPjAmJihNZT1uZXcgTWFwKE1lKSxNZS5mb3JFYWNoKChaZSx1dCk9Pk1lLnNldCh1dCxlYSkpKTtsZXQgVnQ9VD09PSEwfHxTLm5hdmlnYXRpb24uZm9ybU1ldGhvZCE9bnVsbCYmcHIoUy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpJiYoKGxlPVIuc3RhdGUpPT1udWxsP3ZvaWQgMDpsZS5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxEfHxiPT09d3QuUG9wfHwoYj09PXd0LlB1c2g/dC5oaXN0b3J5LnB1c2goUixSLnN0YXRlKTpiPT09d3QuUmVwbGFjZSYmdC5oaXN0b3J5LnJlcGxhY2UoUixSLnN0YXRlKSk7bGV0ICRlO2lmKGI9PT13dC5Qb3Ape2xldCBaZT1MLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZSYmWmUuaGFzKFIucGF0aG5hbWUpPyRlPXtjdXJyZW50TG9jYXRpb246Uy5sb2NhdGlvbixuZXh0TG9jYXRpb246Un06TC5oYXMoUi5wYXRobmFtZSkmJigkZT17Y3VycmVudExvY2F0aW9uOlIsbmV4dExvY2F0aW9uOlMubG9jYXRpb259KX1lbHNlIGlmKE8pe2xldCBaZT1MLmdldChTLmxvY2F0aW9uLnBhdGhuYW1lKTtaZT9aZS5hZGQoUi5wYXRobmFtZSk6KFplPW5ldyBTZXQoW1IucGF0aG5hbWVdKSxMLnNldChTLmxvY2F0aW9uLnBhdGhuYW1lLFplKSksJGU9e2N1cnJlbnRMb2NhdGlvbjpTLmxvY2F0aW9uLG5leHRMb2NhdGlvbjpSfX1iZSh5dCh7fSxJLHthY3Rpb25EYXRhOnBlLGxvYWRlckRhdGE6dWUsaGlzdG9yeUFjdGlvbjpiLGxvY2F0aW9uOlIsaW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpaaCxyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpheShSLEkubWF0Y2hlc3x8Uy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VnQsYmxvY2tlcnM6TWV9KSx7dmlld1RyYW5zaXRpb25PcHRzOiRlLGZsdXNoU3luYzprZT09PSEwfSksYj13dC5Qb3AsVD0hMSxPPSExLEQ9ITEsQj0hMSxvZT1bXSxIPVtdfWFzeW5jIGZ1bmN0aW9uIHdlKFIsSSl7aWYodHlwZW9mIFI9PSJudW1iZXIiKXt0Lmhpc3RvcnkuZ28oUik7cmV0dXJufWxldCB6PVpnKFMubG9jYXRpb24sUy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsUixJPT1udWxsP3ZvaWQgMDpJLmZyb21Sb3V0ZUlkLEk9PW51bGw/dm9pZCAwOkkucmVsYXRpdmUpLHtwYXRoOlksc3VibWlzc2lvbjpsZSxlcnJvcjprZX09c18odS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosSSksZ2U9Uy5sb2NhdGlvbixwZT1rdShTLmxvY2F0aW9uLFksSSYmSS5zdGF0ZSk7cGU9eXQoe30scGUsdC5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKHBlKSk7bGV0IHVlPUkmJkkucmVwbGFjZSE9bnVsbD9JLnJlcGxhY2U6dm9pZCAwLE1lPXd0LlB1c2g7dWU9PT0hMD9NZT13dC5SZXBsYWNlOnVlPT09ITF8fGxlIT1udWxsJiZwcihsZS5mb3JtTWV0aG9kKSYmbGUuZm9ybUFjdGlvbj09PVMubG9jYXRpb24ucGF0aG5hbWUrUy5sb2NhdGlvbi5zZWFyY2gmJihNZT13dC5SZXBsYWNlKTtsZXQgVnQ9SSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBJP0kucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLCRlPShJJiZJLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxaZT1seSh7Y3VycmVudExvY2F0aW9uOmdlLG5leHRMb2NhdGlvbjpwZSxoaXN0b3J5QWN0aW9uOk1lfSk7aWYoWmUpe0t1KFplLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246cGUscHJvY2VlZCgpe0t1KFplLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnBlfSksd2UoUixJKX0scmVzZXQoKXtsZXQgdXQ9bmV3IE1hcChTLmJsb2NrZXJzKTt1dC5zZXQoWmUsZWEpLGJlKHtibG9ja2Vyczp1dH0pfX0pO3JldHVybn1yZXR1cm4gYXdhaXQgUWUoTWUscGUse3N1Ym1pc3Npb246bGUscGVuZGluZ0Vycm9yOmtlLHByZXZlbnRTY3JvbGxSZXNldDpWdCxyZXBsYWNlOkkmJkkucmVwbGFjZSxlbmFibGVWaWV3VHJhbnNpdGlvbjpJJiZJLnVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uLGZsdXNoU3luYzokZX0pfWZ1bmN0aW9uIEllKCl7aWYoRW4oKSxiZSh7cmV2YWxpZGF0aW9uOiJsb2FkaW5nIn0pLFMubmF2aWdhdGlvbi5zdGF0ZSE9PSJzdWJtaXR0aW5nIil7aWYoUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImlkbGUiKXtRZShTLmhpc3RvcnlBY3Rpb24sUy5sb2NhdGlvbix7c3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uOiEwfSk7cmV0dXJufVFlKGJ8fFMuaGlzdG9yeUFjdGlvbixTLm5hdmlnYXRpb24ubG9jYXRpb24se292ZXJyaWRlTmF2aWdhdGlvbjpTLm5hdmlnYXRpb259KX19YXN5bmMgZnVuY3Rpb24gUWUoUixJLHopeyQmJiQuYWJvcnQoKSwkPW51bGwsYj1SLEQ9KHomJnouc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKT09PSEwLHBiKFMubG9jYXRpb24sUy5tYXRjaGVzKSxUPSh6JiZ6LnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxPPSh6JiZ6LmVuYWJsZVZpZXdUcmFuc2l0aW9uKT09PSEwO2xldCBZPXN8fGwsbGU9eiYmei5vdmVycmlkZU5hdmlnYXRpb24sa2U9QmwoWSxJLGEpLGdlPSh6JiZ6LmZsdXNoU3luYyk9PT0hMDtpZigha2Upe2xldCB1dD1Hbig0MDQse3BhdGhuYW1lOkkucGF0aG5hbWV9KSx7bWF0Y2hlczphbixyb3V0ZTpScn09cF8oWSk7WGYoKSxSZShJLHttYXRjaGVzOmFuLGxvYWRlckRhdGE6e30sZXJyb3JzOntbUnIuaWRdOnV0fX0se2ZsdXNoU3luYzpnZX0pO3JldHVybn1pZihTLmluaXRpYWxpemVkJiYhQiYmbkkoUy5sb2NhdGlvbixJKSYmISh6JiZ6LnN1Ym1pc3Npb24mJnByKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe1JlKEkse21hdGNoZXM6a2V9LHtmbHVzaFN5bmM6Z2V9KTtyZXR1cm59JD1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBwZT1uYSh0Lmhpc3RvcnksSSwkLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLHVlLE1lO2lmKHomJnoucGVuZGluZ0Vycm9yKU1lPXtbQWEoa2UpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJnByKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IHV0PWF3YWl0IFd0KHBlLEksei5zdWJtaXNzaW9uLGtlLHtyZXBsYWNlOnoucmVwbGFjZSxmbHVzaFN5bmM6Z2V9KTtpZih1dC5zaG9ydENpcmN1aXRlZClyZXR1cm47dWU9dXQucGVuZGluZ0FjdGlvbkRhdGEsTWU9dXQucGVuZGluZ0FjdGlvbkVycm9yLGxlPUdoKEksei5zdWJtaXNzaW9uKSxnZT0hMSxwZT1uZXcgUmVxdWVzdChwZS51cmwse3NpZ25hbDpwZS5zaWduYWx9KX1sZXR7c2hvcnRDaXJjdWl0ZWQ6VnQsbG9hZGVyRGF0YTokZSxlcnJvcnM6WmV9PWF3YWl0IFNuKHBlLEksa2UsbGUseiYmei5zdWJtaXNzaW9uLHomJnouZmV0Y2hlclN1Ym1pc3Npb24seiYmei5yZXBsYWNlLGdlLHVlLE1lKTtWdHx8KCQ9bnVsbCxSZShJLHl0KHttYXRjaGVzOmtlfSx1ZT97YWN0aW9uRGF0YTp1ZX06e30se2xvYWRlckRhdGE6JGUsZXJyb3JzOlplfSkpKX1hc3luYyBmdW5jdGlvbiBXdChSLEkseixZLGxlKXtsZT09PXZvaWQgMCYmKGxlPXt9KSxFbigpO2xldCBrZT1sSShJLHopO2JlKHtuYXZpZ2F0aW9uOmtlfSx7Zmx1c2hTeW5jOmxlLmZsdXNoU3luYz09PSEwfSk7bGV0IGdlLHBlPVlnKFksSSk7aWYoIXBlLnJvdXRlLmFjdGlvbiYmIXBlLnJvdXRlLmxhenkpZ2U9e3R5cGU6U3QuZXJyb3IsZXJyb3I6R24oNDA1LHttZXRob2Q6Ui5tZXRob2QscGF0aG5hbWU6SS5wYXRobmFtZSxyb3V0ZUlkOnBlLnJvdXRlLmlkfSl9O2Vsc2UgaWYoZ2U9YXdhaXQgdGEoImFjdGlvbiIsUixwZSxZLG8saSxhKSxSLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07aWYocWwoZ2UpKXtsZXQgdWU7cmV0dXJuIGxlJiZsZS5yZXBsYWNlIT1udWxsP3VlPWxlLnJlcGxhY2U6dWU9Z2UubG9jYXRpb249PT1TLmxvY2F0aW9uLnBhdGhuYW1lK1MubG9jYXRpb24uc2VhcmNoLGF3YWl0IGF0KFMsZ2Use3N1Ym1pc3Npb246eixyZXBsYWNlOnVlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1pZihNYShnZSkpe2xldCB1ZT1BYShZLHBlLnJvdXRlLmlkKTtyZXR1cm4obGUmJmxlLnJlcGxhY2UpIT09ITAmJihiPXd0LlB1c2gpLHtwZW5kaW5nQWN0aW9uRGF0YTp7fSxwZW5kaW5nQWN0aW9uRXJyb3I6e1t1ZS5yb3V0ZS5pZF06Z2UuZXJyb3J9fX1pZihQbyhnZSkpdGhyb3cgR24oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7cmV0dXJue3BlbmRpbmdBY3Rpb25EYXRhOntbcGUucm91dGUuaWRdOmdlLmRhdGF9fX1hc3luYyBmdW5jdGlvbiBTbihSLEkseixZLGxlLGtlLGdlLHBlLHVlLE1lKXtsZXQgVnQ9WXx8R2goSSxsZSksJGU9bGV8fGtlfHx2XyhWdCksWmU9c3x8bCxbdXQsYW5dPWFfKHQuaGlzdG9yeSxTLHosJGUsSSxCLG9lLEgsSyxOLEEsWmUsYSx1ZSxNZSk7aWYoWGYoR2U9PiEoeiYmei5zb21lKFpuPT5abi5yb3V0ZS5pZD09PUdlKSl8fHV0JiZ1dC5zb21lKFpuPT5abi5yb3V0ZS5pZD09PUdlKSksaz0rK0MsdXQubGVuZ3RoPT09MCYmYW4ubGVuZ3RoPT09MCl7bGV0IEdlPV9vKCk7cmV0dXJuIFJlKEkseXQoe21hdGNoZXM6eixsb2FkZXJEYXRhOnt9LGVycm9yczpNZXx8bnVsbH0sdWU/e2FjdGlvbkRhdGE6dWV9Ont9LEdlP3tmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfTp7fSkse2ZsdXNoU3luYzpwZX0pLHtzaG9ydENpcmN1aXRlZDohMH19aWYoIUQpe2FuLmZvckVhY2goWm49PntsZXQga3Q9Uy5mZXRjaGVycy5nZXQoWm4ua2V5KSx3bz1yYSh2b2lkIDAsa3Q/a3QuZGF0YTp2b2lkIDApO1MuZmV0Y2hlcnMuc2V0KFpuLmtleSx3byl9KTtsZXQgR2U9dWV8fFMuYWN0aW9uRGF0YTtiZSh5dCh7bmF2aWdhdGlvbjpWdH0sR2U/T2JqZWN0LmtleXMoR2UpLmxlbmd0aD09PTA/e2FjdGlvbkRhdGE6bnVsbH06e2FjdGlvbkRhdGE6R2V9Ont9LGFuLmxlbmd0aD4wP3tmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfTp7fSkse2ZsdXNoU3luYzpwZX0pfWFuLmZvckVhY2goR2U9PntaLmhhcyhHZS5rZXkpJiZtdChHZS5rZXkpLEdlLmNvbnRyb2xsZXImJlouc2V0KEdlLmtleSxHZS5jb250cm9sbGVyKX0pO2xldCBScj0oKT0+YW4uZm9yRWFjaChHZT0+bXQoR2Uua2V5KSk7JCYmJC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFJyKTtsZXR7cmVzdWx0czp6cyxsb2FkZXJSZXN1bHRzOlFmLGZldGNoZXJSZXN1bHRzOmZsfT1hd2FpdCBsbihTLm1hdGNoZXMseix1dCxhbixSKTtpZihSLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07JCYmJC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFJyKSxhbi5mb3JFYWNoKEdlPT5aLmRlbGV0ZShHZS5rZXkpKTtsZXQgc3I9Z18oenMpO2lmKHNyKXtpZihzci5pZHg+PXV0Lmxlbmd0aCl7bGV0IEdlPWFuW3NyLmlkeC11dC5sZW5ndGhdLmtleTtBLmFkZChHZSl9cmV0dXJuIGF3YWl0IGF0KFMsc3IucmVzdWx0LHtyZXBsYWNlOmdlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1sZXR7bG9hZGVyRGF0YTpadSxlcnJvcnM6SmZ9PWZfKFMseix1dCxRZixNZSxhbixmbCxkZSk7ZGUuZm9yRWFjaCgoR2UsWm4pPT57R2Uuc3Vic2NyaWJlKGt0PT57KGt0fHxHZS5kb25lKSYmZGUuZGVsZXRlKFpuKX0pfSk7bGV0IHFmPV9vKCksZWg9anMoayksaGw9cWZ8fGVofHxhbi5sZW5ndGg+MDtyZXR1cm4geXQoe2xvYWRlckRhdGE6WnUsZXJyb3JzOkpmfSxobD97ZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX06e30pfWZ1bmN0aW9uIGxyKFIsSSx6LFkpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJyb3V0ZXIuZmV0Y2goKSB3YXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmVyIHJlbmRlciwgYnV0IGl0IHNob3VsZG4ndCBiZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBhIHVzZUZldGNoZXIoKSBtZXRob2QgaW4gdGhlIGJvZHkgb2YgeW91ciBjb21wb25lbnQuIFRyeSBtb3ZpbmcgaXQgdG8gYSB1c2VFZmZlY3Qgb3IgYSBjYWxsYmFjay4iKTtaLmhhcyhSKSYmbXQoUik7bGV0IGxlPShZJiZZLnVuc3RhYmxlX2ZsdXNoU3luYyk9PT0hMCxrZT1zfHxsLGdlPVpnKFMubG9jYXRpb24sUy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUseixJLFk9PW51bGw/dm9pZCAwOlkucmVsYXRpdmUpLHBlPUJsKGtlLGdlLGEpO2lmKCFwZSl7QXQoUixJLEduKDQwNCx7cGF0aG5hbWU6Z2V9KSx7Zmx1c2hTeW5jOmxlfSk7cmV0dXJufWxldHtwYXRoOnVlLHN1Ym1pc3Npb246TWUsZXJyb3I6VnR9PXNfKHUudjdfbm9ybWFsaXplRm9ybU1ldGhvZCwhMCxnZSxZKTtpZihWdCl7QXQoUixJLFZ0LHtmbHVzaFN5bmM6bGV9KTtyZXR1cm59bGV0ICRlPVlnKHBlLHVlKTtpZihUPShZJiZZLnByZXZlbnRTY3JvbGxSZXNldCk9PT0hMCxNZSYmcHIoTWUuZm9ybU1ldGhvZCkpe3plKFIsSSx1ZSwkZSxwZSxsZSxNZSk7cmV0dXJufU4uc2V0KFIse3JvdXRlSWQ6SSxwYXRoOnVlfSksVHQoUixJLHVlLCRlLHBlLGxlLE1lKX1hc3luYyBmdW5jdGlvbiB6ZShSLEkseixZLGxlLGtlLGdlKXtpZihFbigpLE4uZGVsZXRlKFIpLCFZLnJvdXRlLmFjdGlvbiYmIVkucm91dGUubGF6eSl7bGV0IGt0PUduKDQwNSx7bWV0aG9kOmdlLmZvcm1NZXRob2QscGF0aG5hbWU6eixyb3V0ZUlkOkl9KTtBdChSLEksa3Qse2ZsdXNoU3luYzprZX0pO3JldHVybn1sZXQgcGU9Uy5mZXRjaGVycy5nZXQoUik7X3QoUixzSShnZSxwZSkse2ZsdXNoU3luYzprZX0pO2xldCB1ZT1uZXcgQWJvcnRDb250cm9sbGVyLE1lPW5hKHQuaGlzdG9yeSx6LHVlLnNpZ25hbCxnZSk7Wi5zZXQoUix1ZSk7bGV0IFZ0PUMsJGU9YXdhaXQgdGEoImFjdGlvbiIsTWUsWSxsZSxvLGksYSk7aWYoTWUuc2lnbmFsLmFib3J0ZWQpe1ouZ2V0KFIpPT09dWUmJlouZGVsZXRlKFIpO3JldHVybn1pZihLLmhhcyhSKSl7X3QoUixQaSh2b2lkIDApKTtyZXR1cm59aWYocWwoJGUpKWlmKFouZGVsZXRlKFIpLGs+VnQpe190KFIsUGkodm9pZCAwKSk7cmV0dXJufWVsc2UgcmV0dXJuIEEuYWRkKFIpLF90KFIscmEoZ2UpKSxhdChTLCRlLHtmZXRjaGVyU3VibWlzc2lvbjpnZX0pO2lmKE1hKCRlKSl7QXQoUixJLCRlLmVycm9yKTtyZXR1cm59aWYoUG8oJGUpKXRocm93IEduKDQwMCx7dHlwZToiZGVmZXItYWN0aW9uIn0pO2xldCBaZT1TLm5hdmlnYXRpb24ubG9jYXRpb258fFMubG9jYXRpb24sdXQ9bmEodC5oaXN0b3J5LFplLHVlLnNpZ25hbCksYW49c3x8bCxScj1TLm5hdmlnYXRpb24uc3RhdGUhPT0iaWRsZSI/QmwoYW4sUy5uYXZpZ2F0aW9uLmxvY2F0aW9uLGEpOlMubWF0Y2hlcztPZShSciwiRGlkbid0IGZpbmQgYW55IG1hdGNoZXMgYWZ0ZXIgZmV0Y2hlciBhY3Rpb24iKTtsZXQgenM9KytDO0Uuc2V0KFIsenMpO2xldCBRZj1yYShnZSwkZS5kYXRhKTtTLmZldGNoZXJzLnNldChSLFFmKTtsZXRbZmwsc3JdPWFfKHQuaGlzdG9yeSxTLFJyLGdlLFplLEIsb2UsSCxLLE4sQSxhbixhLHtbWS5yb3V0ZS5pZF06JGUuZGF0YX0sdm9pZCAwKTtzci5maWx0ZXIoa3Q9Pmt0LmtleSE9PVIpLmZvckVhY2goa3Q9PntsZXQgd289a3Qua2V5LHV5PVMuZmV0Y2hlcnMuZ2V0KHdvKSxtYj1yYSh2b2lkIDAsdXk/dXkuZGF0YTp2b2lkIDApO1MuZmV0Y2hlcnMuc2V0KHdvLG1iKSxaLmhhcyh3bykmJm10KHdvKSxrdC5jb250cm9sbGVyJiZaLnNldCh3byxrdC5jb250cm9sbGVyKX0pLGJlKHtmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSk7bGV0IFp1PSgpPT5zci5mb3JFYWNoKGt0PT5tdChrdC5rZXkpKTt1ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KTtsZXR7cmVzdWx0czpKZixsb2FkZXJSZXN1bHRzOnFmLGZldGNoZXJSZXN1bHRzOmVofT1hd2FpdCBsbihTLm1hdGNoZXMsUnIsZmwsc3IsdXQpO2lmKHVlLnNpZ25hbC5hYm9ydGVkKXJldHVybjt1ZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFp1KSxFLmRlbGV0ZShSKSxaLmRlbGV0ZShSKSxzci5mb3JFYWNoKGt0PT5aLmRlbGV0ZShrdC5rZXkpKTtsZXQgaGw9Z18oSmYpO2lmKGhsKXtpZihobC5pZHg+PWZsLmxlbmd0aCl7bGV0IGt0PXNyW2hsLmlkeC1mbC5sZW5ndGhdLmtleTtBLmFkZChrdCl9cmV0dXJuIGF0KFMsaGwucmVzdWx0KX1sZXR7bG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm59PWZfKFMsUy5tYXRjaGVzLGZsLHFmLHZvaWQgMCxzcixlaCxkZSk7aWYoUy5mZXRjaGVycy5oYXMoUikpe2xldCBrdD1QaSgkZS5kYXRhKTtTLmZldGNoZXJzLnNldChSLGt0KX1qcyh6cyksUy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiZ6cz5rPyhPZShiLCJFeHBlY3RlZCBwZW5kaW5nIGFjdGlvbiIpLCQmJiQuYWJvcnQoKSxSZShTLm5hdmlnYXRpb24ubG9jYXRpb24se21hdGNoZXM6UnIsbG9hZGVyRGF0YTpHZSxlcnJvcnM6Wm4sZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pKTooYmUoe2Vycm9yczpabixsb2FkZXJEYXRhOmhfKFMubG9hZGVyRGF0YSxHZSxScixabiksZmV0Y2hlcnM6bmV3IE1hcChTLmZldGNoZXJzKX0pLEI9ITEpfWFzeW5jIGZ1bmN0aW9uIFR0KFIsSSx6LFksbGUsa2UsZ2Upe2xldCBwZT1TLmZldGNoZXJzLmdldChSKTtfdChSLHJhKGdlLHBlP3BlLmRhdGE6dm9pZCAwKSx7Zmx1c2hTeW5jOmtlfSk7bGV0IHVlPW5ldyBBYm9ydENvbnRyb2xsZXIsTWU9bmEodC5oaXN0b3J5LHosdWUuc2lnbmFsKTtaLnNldChSLHVlKTtsZXQgVnQ9QywkZT1hd2FpdCB0YSgibG9hZGVyIixNZSxZLGxlLG8saSxhKTtpZihQbygkZSkmJigkZT1hd2FpdCBGaygkZSxNZS5zaWduYWwsITApfHwkZSksWi5nZXQoUik9PT11ZSYmWi5kZWxldGUoUiksIU1lLnNpZ25hbC5hYm9ydGVkKXtpZihLLmhhcyhSKSl7X3QoUixQaSh2b2lkIDApKTtyZXR1cm59aWYocWwoJGUpKWlmKGs+VnQpe190KFIsUGkodm9pZCAwKSk7cmV0dXJufWVsc2V7QS5hZGQoUiksYXdhaXQgYXQoUywkZSk7cmV0dXJufWlmKE1hKCRlKSl7QXQoUixJLCRlLmVycm9yKTtyZXR1cm59T2UoIVBvKCRlKSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpLF90KFIsUGkoJGUuZGF0YSkpfX1hc3luYyBmdW5jdGlvbiBhdChSLEkseil7bGV0e3N1Ym1pc3Npb246WSxmZXRjaGVyU3VibWlzc2lvbjpsZSxyZXBsYWNlOmtlfT16PT09dm9pZCAwP3t9Ono7SS5yZXZhbGlkYXRlJiYoQj0hMCk7bGV0IGdlPWt1KFIubG9jYXRpb24sSS5sb2NhdGlvbix7X2lzUmVkaXJlY3Q6ITB9KTtpZihPZShnZSwiRXhwZWN0ZWQgYSBsb2NhdGlvbiBvbiB0aGUgcmVkaXJlY3QgbmF2aWdhdGlvbiIpLG4pe2xldCBaZT0hMTtpZihJLnJlbG9hZERvY3VtZW50KVplPSEwO2Vsc2UgaWYoSWsudGVzdChJLmxvY2F0aW9uKSl7Y29uc3QgdXQ9dC5oaXN0b3J5LmNyZWF0ZVVSTChJLmxvY2F0aW9uKTtaZT11dC5vcmlnaW4hPT1lLmxvY2F0aW9uLm9yaWdpbnx8SHUodXQucGF0aG5hbWUsYSk9PW51bGx9aWYoWmUpe2tlP2UubG9jYXRpb24ucmVwbGFjZShJLmxvY2F0aW9uKTplLmxvY2F0aW9uLmFzc2lnbihJLmxvY2F0aW9uKTtyZXR1cm59fSQ9bnVsbDtsZXQgcGU9a2U9PT0hMD93dC5SZXBsYWNlOnd0LlB1c2gse2Zvcm1NZXRob2Q6dWUsZm9ybUFjdGlvbjpNZSxmb3JtRW5jVHlwZTpWdH09Ui5uYXZpZ2F0aW9uOyFZJiYhbGUmJnVlJiZNZSYmVnQmJihZPXZfKFIubmF2aWdhdGlvbikpO2xldCAkZT1ZfHxsZTtpZihHTC5oYXMoSS5zdGF0dXMpJiYkZSYmcHIoJGUuZm9ybU1ldGhvZCkpYXdhaXQgUWUocGUsZ2Use3N1Ym1pc3Npb246eXQoe30sJGUse2Zvcm1BY3Rpb246SS5sb2NhdGlvbn0pLHByZXZlbnRTY3JvbGxSZXNldDpUfSk7ZWxzZXtsZXQgWmU9R2goZ2UsWSk7YXdhaXQgUWUocGUsZ2Use292ZXJyaWRlTmF2aWdhdGlvbjpaZSxmZXRjaGVyU3VibWlzc2lvbjpsZSxwcmV2ZW50U2Nyb2xsUmVzZXQ6VH0pfX1hc3luYyBmdW5jdGlvbiBsbihSLEkseixZLGxlKXtsZXQga2U9YXdhaXQgUHJvbWlzZS5hbGwoWy4uLnoubWFwKHVlPT50YSgibG9hZGVyIixsZSx1ZSxJLG8saSxhKSksLi4uWS5tYXAodWU9PnVlLm1hdGNoZXMmJnVlLm1hdGNoJiZ1ZS5jb250cm9sbGVyP3RhKCJsb2FkZXIiLG5hKHQuaGlzdG9yeSx1ZS5wYXRoLHVlLmNvbnRyb2xsZXIuc2lnbmFsKSx1ZS5tYXRjaCx1ZS5tYXRjaGVzLG8saSxhKTp7dHlwZTpTdC5lcnJvcixlcnJvcjpHbig0MDQse3BhdGhuYW1lOnVlLnBhdGh9KX0pXSksZ2U9a2Uuc2xpY2UoMCx6Lmxlbmd0aCkscGU9a2Uuc2xpY2Uoei5sZW5ndGgpO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbChbbV8oUix6LGdlLGdlLm1hcCgoKT0+bGUuc2lnbmFsKSwhMSxTLmxvYWRlckRhdGEpLG1fKFIsWS5tYXAodWU9PnVlLm1hdGNoKSxwZSxZLm1hcCh1ZT0+dWUuY29udHJvbGxlcj91ZS5jb250cm9sbGVyLnNpZ25hbDpudWxsKSwhMCldKSx7cmVzdWx0czprZSxsb2FkZXJSZXN1bHRzOmdlLGZldGNoZXJSZXN1bHRzOnBlfX1mdW5jdGlvbiBFbigpe0I9ITAsb2UucHVzaCguLi5YZigpKSxOLmZvckVhY2goKFIsSSk9PntaLmhhcyhJKSYmKEgucHVzaChJKSxtdChJKSl9KX1mdW5jdGlvbiBfdChSLEkseil7ej09PXZvaWQgMCYmKHo9e30pLFMuZmV0Y2hlcnMuc2V0KFIsSSksYmUoe2ZldGNoZXJzOm5ldyBNYXAoUy5mZXRjaGVycyl9LHtmbHVzaFN5bmM6KHomJnouZmx1c2hTeW5jKT09PSEwfSl9ZnVuY3Rpb24gQXQoUixJLHosWSl7WT09PXZvaWQgMCYmKFk9e30pO2xldCBsZT1BYShTLm1hdGNoZXMsSSk7UG4oUiksYmUoe2Vycm9yczp7W2xlLnJvdXRlLmlkXTp6fSxmZXRjaGVyczpuZXcgTWFwKFMuZmV0Y2hlcnMpfSx7Zmx1c2hTeW5jOihZJiZZLmZsdXNoU3luYyk9PT0hMH0pfWZ1bmN0aW9uIHNuKFIpe3JldHVybiB1LnY3X2ZldGNoZXJQZXJzaXN0JiYoRi5zZXQoUiwoRi5nZXQoUil8fDApKzEpLEsuaGFzKFIpJiZLLmRlbGV0ZShSKSksUy5mZXRjaGVycy5nZXQoUil8fFlMfWZ1bmN0aW9uIFBuKFIpe2xldCBJPVMuZmV0Y2hlcnMuZ2V0KFIpO1ouaGFzKFIpJiYhKEkmJkkuc3RhdGU9PT0ibG9hZGluZyImJkUuaGFzKFIpKSYmbXQoUiksTi5kZWxldGUoUiksRS5kZWxldGUoUiksQS5kZWxldGUoUiksSy5kZWxldGUoUiksUy5mZXRjaGVycy5kZWxldGUoUil9ZnVuY3Rpb24gcXIoUil7aWYodS52N19mZXRjaGVyUGVyc2lzdCl7bGV0IEk9KEYuZ2V0KFIpfHwwKS0xO0k8PTA/KEYuZGVsZXRlKFIpLEsuYWRkKFIpKTpGLnNldChSLEkpfWVsc2UgUG4oUik7YmUoe2ZldGNoZXJzOm5ldyBNYXAoUy5mZXRjaGVycyl9KX1mdW5jdGlvbiBtdChSKXtsZXQgST1aLmdldChSKTtPZShJLCJFeHBlY3RlZCBmZXRjaCBjb250cm9sbGVyOiAiK1IpLEkuYWJvcnQoKSxaLmRlbGV0ZShSKX1mdW5jdGlvbiBOcihSKXtmb3IobGV0IEkgb2YgUil7bGV0IHo9c24oSSksWT1QaSh6LmRhdGEpO1MuZmV0Y2hlcnMuc2V0KEksWSl9fWZ1bmN0aW9uIF9vKCl7bGV0IFI9W10sST0hMTtmb3IobGV0IHogb2YgQSl7bGV0IFk9Uy5mZXRjaGVycy5nZXQoeik7T2UoWSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxZLnN0YXRlPT09ImxvYWRpbmciJiYoQS5kZWxldGUoeiksUi5wdXNoKHopLEk9ITApfXJldHVybiBOcihSKSxJfWZ1bmN0aW9uIGpzKFIpe2xldCBJPVtdO2ZvcihsZXRbeixZXW9mIEUpaWYoWTxSKXtsZXQgbGU9Uy5mZXRjaGVycy5nZXQoeik7T2UobGUsIkV4cGVjdGVkIGZldGNoZXI6ICIreiksbGUuc3RhdGU9PT0ibG9hZGluZyImJihtdCh6KSxFLmRlbGV0ZSh6KSxJLnB1c2goeikpfXJldHVybiBOcihJKSxJLmxlbmd0aD4wfWZ1bmN0aW9uIGZiKFIsSSl7bGV0IHo9Uy5ibG9ja2Vycy5nZXQoUil8fGVhO3JldHVybiBzZS5nZXQoUikhPT1JJiZzZS5zZXQoUixJKSx6fWZ1bmN0aW9uIG95KFIpe1MuYmxvY2tlcnMuZGVsZXRlKFIpLHNlLmRlbGV0ZShSKX1mdW5jdGlvbiBLdShSLEkpe2xldCB6PVMuYmxvY2tlcnMuZ2V0KFIpfHxlYTtPZSh6LnN0YXRlPT09InVuYmxvY2tlZCImJkkuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0icHJvY2VlZGluZyJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkkuc3RhdGU9PT0idW5ibG9ja2VkInx8ei5zdGF0ZT09PSJwcm9jZWVkaW5nIiYmSS5zdGF0ZT09PSJ1bmJsb2NrZWQiLCJJbnZhbGlkIGJsb2NrZXIgc3RhdGUgdHJhbnNpdGlvbjogIit6LnN0YXRlKyIgLT4gIitJLnN0YXRlKTtsZXQgWT1uZXcgTWFwKFMuYmxvY2tlcnMpO1kuc2V0KFIsSSksYmUoe2Jsb2NrZXJzOll9KX1mdW5jdGlvbiBseShSKXtsZXR7Y3VycmVudExvY2F0aW9uOkksbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpZfT1SO2lmKHNlLnNpemU9PT0wKXJldHVybjtzZS5zaXplPjEmJnFvKCExLCJBIHJvdXRlciBvbmx5IHN1cHBvcnRzIG9uZSBibG9ja2VyIGF0IGEgdGltZSIpO2xldCBsZT1BcnJheS5mcm9tKHNlLmVudHJpZXMoKSksW2tlLGdlXT1sZVtsZS5sZW5ndGgtMV0scGU9Uy5ibG9ja2Vycy5nZXQoa2UpO2lmKCEocGUmJnBlLnN0YXRlPT09InByb2NlZWRpbmciKSYmZ2Uoe2N1cnJlbnRMb2NhdGlvbjpJLG5leHRMb2NhdGlvbjp6LGhpc3RvcnlBY3Rpb246WX0pKXJldHVybiBrZX1mdW5jdGlvbiBYZihSKXtsZXQgST1bXTtyZXR1cm4gZGUuZm9yRWFjaCgoeixZKT0+eyghUnx8UihZKSkmJih6LmNhbmNlbCgpLEkucHVzaChZKSxkZS5kZWxldGUoWSkpfSksSX1mdW5jdGlvbiBoYihSLEkseil7aWYoZj1SLG09SSxoPXp8fG51bGwsIWcmJlMubmF2aWdhdGlvbj09PVpoKXtnPSEwO2xldCBZPWF5KFMubG9jYXRpb24sUy5tYXRjaGVzKTtZIT1udWxsJiZiZSh7cmVzdG9yZVNjcm9sbFBvc2l0aW9uOll9KX1yZXR1cm4oKT0+e2Y9bnVsbCxtPW51bGwsaD1udWxsfX1mdW5jdGlvbiBzeShSLEkpe3JldHVybiBoJiZoKFIsSS5tYXAoWT0+Q0woWSxTLmxvYWRlckRhdGEpKSl8fFIua2V5fWZ1bmN0aW9uIHBiKFIsSSl7aWYoZiYmbSl7bGV0IHo9c3koUixJKTtmW3pdPW0oKX19ZnVuY3Rpb24gYXkoUixJKXtpZihmKXtsZXQgej1zeShSLEkpLFk9Zlt6XTtpZih0eXBlb2YgWT09Im51bWJlciIpcmV0dXJuIFl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZ2IoUil7bz17fSxzPUtnKFIsaSx2b2lkIDAsbyl9cmV0dXJuIHg9e2dldCBiYXNlbmFtZSgpe3JldHVybiBhfSxnZXQgc3RhdGUoKXtyZXR1cm4gU30sZ2V0IHJvdXRlcygpe3JldHVybiBsfSxnZXQgd2luZG93KCl7cmV0dXJuIGV9LGluaXRpYWxpemU6TmUsc3Vic2NyaWJlOmplLGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uOmhiLG5hdmlnYXRlOndlLGZldGNoOmxyLHJldmFsaWRhdGU6SWUsY3JlYXRlSHJlZjpSPT50Lmhpc3RvcnkuY3JlYXRlSHJlZihSKSxlbmNvZGVMb2NhdGlvbjpSPT50Lmhpc3RvcnkuZW5jb2RlTG9jYXRpb24oUiksZ2V0RmV0Y2hlcjpzbixkZWxldGVGZXRjaGVyOnFyLGRpc3Bvc2U6USxnZXRCbG9ja2VyOmZiLGRlbGV0ZUJsb2NrZXI6b3ksX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczpaLF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczpkZSxfaW50ZXJuYWxTZXRSb3V0ZXM6Z2J9LHh9ZnVuY3Rpb24gSkwodCl7cmV0dXJuIHQhPW51bGwmJigiZm9ybURhdGEiaW4gdCYmdC5mb3JtRGF0YSE9bnVsbHx8ImJvZHkiaW4gdCYmdC5ib2R5IT09dm9pZCAwKX1mdW5jdGlvbiBaZyh0LGUsbixyLGksbyxsKXtsZXQgcyxhO2lmKG8pe3M9W107Zm9yKGxldCBjIG9mIGUpaWYocy5wdXNoKGMpLGMucm91dGUuaWQ9PT1vKXthPWM7YnJlYWt9fWVsc2Ugcz1lLGE9ZVtlLmxlbmd0aC0xXTtsZXQgdT1BayhpfHwiLiIsUGsocyksSHUodC5wYXRobmFtZSxuKXx8dC5wYXRobmFtZSxsPT09InBhdGgiKTtyZXR1cm4gaT09bnVsbCYmKHUuc2VhcmNoPXQuc2VhcmNoLHUuaGFzaD10Lmhhc2gpLChpPT1udWxsfHxpPT09IiJ8fGk9PT0iLiIpJiZhJiZhLnJvdXRlLmluZGV4JiYhUXYodS5zZWFyY2gpJiYodS5zZWFyY2g9dS5zZWFyY2g/dS5zZWFyY2gucmVwbGFjZSgvXlw/LywiP2luZGV4JiIpOiI/aW5kZXgiKSxyJiZuIT09Ii8iJiYodS5wYXRobmFtZT11LnBhdGhuYW1lPT09Ii8iP246ZW8oW24sdS5wYXRobmFtZV0pKSxWdSh1KX1mdW5jdGlvbiBzXyh0LGUsbixyKXtpZighcnx8IUpMKHIpKXJldHVybntwYXRoOm59O2lmKHIuZm9ybU1ldGhvZCYmIW9JKHIuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixlcnJvcjpHbig0MDUse21ldGhvZDpyLmZvcm1NZXRob2R9KX07bGV0IGk9KCk9Pih7cGF0aDpuLGVycm9yOkduKDQwMCx7dHlwZToiaW52YWxpZC1ib2R5In0pfSksbz1yLmZvcm1NZXRob2R8fCJnZXQiLGw9dD9vLnRvVXBwZXJDYXNlKCk6by50b0xvd2VyQ2FzZSgpLHM9emsobik7aWYoci5ib2R5IT09dm9pZCAwKXtpZihyLmZvcm1FbmNUeXBlPT09InRleHQvcGxhaW4iKXtpZighcHIobCkpcmV0dXJuIGkoKTtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9yLmJvZHk6ci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGF8fHIuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9BcnJheS5mcm9tKHIuYm9keS5lbnRyaWVzKCkpLnJlZHVjZSgoaCxtKT0+e2xldFtnLHddPW07cmV0dXJuIiIraCtnKyI9Iit3K2AKYH0sIiIpOlN0cmluZyhyLmJvZHkpO3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OmZ9fX1lbHNlIGlmKHIuZm9ybUVuY1R5cGU9PT0iYXBwbGljYXRpb24vanNvbiIpe2lmKCFwcihsKSlyZXR1cm4gaSgpO3RyeXtsZXQgZj10eXBlb2Ygci5ib2R5PT0ic3RyaW5nIj9KU09OLnBhcnNlKHIuYm9keSk6ci5ib2R5O3JldHVybntwYXRoOm4sc3VibWlzc2lvbjp7Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyLmZvcm1FbmNUeXBlLGZvcm1EYXRhOnZvaWQgMCxqc29uOmYsdGV4dDp2b2lkIDB9fX1jYXRjaHtyZXR1cm4gaSgpfX19T2UodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iLCJGb3JtRGF0YSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKTtsZXQgYSx1O2lmKHIuZm9ybURhdGEpYT1HZyhyLmZvcm1EYXRhKSx1PXIuZm9ybURhdGE7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSlhPUdnKHIuYm9keSksdT1yLmJvZHk7ZWxzZSBpZihyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpYT1yLmJvZHksdT1kXyhhKTtlbHNlIGlmKHIuYm9keT09bnVsbClhPW5ldyBVUkxTZWFyY2hQYXJhbXMsdT1uZXcgRm9ybURhdGE7ZWxzZSB0cnl7YT1uZXcgVVJMU2VhcmNoUGFyYW1zKHIuYm9keSksdT1kXyhhKX1jYXRjaHtyZXR1cm4gaSgpfWxldCBjPXtmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnImJnIuZm9ybUVuY1R5cGV8fCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGZvcm1EYXRhOnUsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9O2lmKHByKGMuZm9ybU1ldGhvZCkpcmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOmN9O2xldCBkPWtpKG4pO3JldHVybiBlJiZkLnNlYXJjaCYmUXYoZC5zZWFyY2gpJiZhLmFwcGVuZCgiaW5kZXgiLCIiKSxkLnNlYXJjaD0iPyIrYSx7cGF0aDpWdShkKSxzdWJtaXNzaW9uOmN9fWZ1bmN0aW9uIHFMKHQsZSl7bGV0IG49dDtpZihlKXtsZXQgcj10LmZpbmRJbmRleChpPT5pLnJvdXRlLmlkPT09ZSk7cj49MCYmKG49dC5zbGljZSgwLHIpKX1yZXR1cm4gbn1mdW5jdGlvbiBhXyh0LGUsbixyLGksbyxsLHMsYSx1LGMsZCxmLGgsbSl7bGV0IGc9bT9PYmplY3QudmFsdWVzKG0pWzBdOmg/T2JqZWN0LnZhbHVlcyhoKVswXTp2b2lkIDAsdz10LmNyZWF0ZVVSTChlLmxvY2F0aW9uKSx2PXQuY3JlYXRlVVJMKGkpLHk9bT9PYmplY3Qua2V5cyhtKVswXTp2b2lkIDAsUz1xTChuLHkpLmZpbHRlcigoVCwkKT0+e2lmKFQucm91dGUubGF6eSlyZXR1cm4hMDtpZihULnJvdXRlLmxvYWRlcj09bnVsbClyZXR1cm4hMTtpZihlSShlLmxvYWRlckRhdGEsZS5tYXRjaGVzWyRdLFQpfHxsLnNvbWUoUD0+UD09PVQucm91dGUuaWQpKXJldHVybiEwO2xldCBPPWUubWF0Y2hlc1skXSxMPVQ7cmV0dXJuIHVfKFQseXQoe2N1cnJlbnRVcmw6dyxjdXJyZW50UGFyYW1zOk8ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOkwucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfHx3LnBhdGhuYW1lK3cuc2VhcmNoPT09di5wYXRobmFtZSt2LnNlYXJjaHx8dy5zZWFyY2ghPT12LnNlYXJjaHx8amsoTyxMKX0pKX0pLGI9W107cmV0dXJuIHUuZm9yRWFjaCgoVCwkKT0+e2lmKCFuLnNvbWUoQj0+Qi5yb3V0ZS5pZD09PVQucm91dGVJZCl8fGEuaGFzKCQpKXJldHVybjtsZXQgTz1CbChkLFQucGF0aCxmKTtpZighTyl7Yi5wdXNoKHtrZXk6JCxyb3V0ZUlkOlQucm91dGVJZCxwYXRoOlQucGF0aCxtYXRjaGVzOm51bGwsbWF0Y2g6bnVsbCxjb250cm9sbGVyOm51bGx9KTtyZXR1cm59bGV0IEw9ZS5mZXRjaGVycy5nZXQoJCksUD1ZZyhPLFQucGF0aCksRD0hMTtjLmhhcygkKT9EPSExOnMuaW5jbHVkZXMoJCk/RD0hMDpMJiZMLnN0YXRlIT09ImlkbGUiJiZMLmRhdGE9PT12b2lkIDA/RD1vOkQ9dV8oUCx5dCh7Y3VycmVudFVybDp3LGN1cnJlbnRQYXJhbXM6ZS5tYXRjaGVzW2UubWF0Y2hlcy5sZW5ndGgtMV0ucGFyYW1zLG5leHRVcmw6dixuZXh0UGFyYW1zOm5bbi5sZW5ndGgtMV0ucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTpvfSkpLEQmJmIucHVzaCh7a2V5OiQscm91dGVJZDpULnJvdXRlSWQscGF0aDpULnBhdGgsbWF0Y2hlczpPLG1hdGNoOlAsY29udHJvbGxlcjpuZXcgQWJvcnRDb250cm9sbGVyfSl9KSxbUyxiXX1mdW5jdGlvbiBlSSh0LGUsbil7bGV0IHI9IWV8fG4ucm91dGUuaWQhPT1lLnJvdXRlLmlkLGk9dFtuLnJvdXRlLmlkXT09PXZvaWQgMDtyZXR1cm4gcnx8aX1mdW5jdGlvbiBqayh0LGUpe2xldCBuPXQucm91dGUucGF0aDtyZXR1cm4gdC5wYXRobmFtZSE9PWUucGF0aG5hbWV8fG4hPW51bGwmJm4uZW5kc1dpdGgoIioiKSYmdC5wYXJhbXNbIioiXSE9PWUucGFyYW1zWyIqIl19ZnVuY3Rpb24gdV8odCxlKXtpZih0LnJvdXRlLnNob3VsZFJldmFsaWRhdGUpe2xldCBuPXQucm91dGUuc2hvdWxkUmV2YWxpZGF0ZShlKTtpZih0eXBlb2Ygbj09ImJvb2xlYW4iKXJldHVybiBufXJldHVybiBlLmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlfWFzeW5jIGZ1bmN0aW9uIGNfKHQsZSxuKXtpZighdC5sYXp5KXJldHVybjtsZXQgcj1hd2FpdCB0LmxhenkoKTtpZighdC5sYXp5KXJldHVybjtsZXQgaT1uW3QuaWRdO09lKGksIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0Iik7bGV0IG89e307Zm9yKGxldCBsIGluIHIpe2xldCBhPWlbbF0hPT12b2lkIDAmJmwhPT0iaGFzRXJyb3JCb3VuZGFyeSI7cW8oIWEsJ1JvdXRlICInK2kuaWQrJyIgaGFzIGEgc3RhdGljIHByb3BlcnR5ICInK2wrJyIgZGVmaW5lZCBidXQgaXRzIGxhenkgZnVuY3Rpb24gaXMgYWxzbyByZXR1cm5pbmcgYSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eS4gJysoJ1RoZSBsYXp5IHJvdXRlIHByb3BlcnR5ICInK2wrJyIgd2lsbCBiZSBpZ25vcmVkLicpKSwhYSYmIVNMLmhhcyhsKSYmKG9bbF09cltsXSl9T2JqZWN0LmFzc2lnbihpLG8pLE9iamVjdC5hc3NpZ24oaSx5dCh7fSxlKGkpLHtsYXp5OnZvaWQgMH0pKX1hc3luYyBmdW5jdGlvbiB0YSh0LGUsbixyLGksbyxsLHMpe3M9PT12b2lkIDAmJihzPXt9KTtsZXQgYSx1LGMsZD1tPT57bGV0IGcsdz1uZXcgUHJvbWlzZSgodix5KT0+Zz15KTtyZXR1cm4gYz0oKT0+ZygpLGUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixjKSxQcm9taXNlLnJhY2UoW20oe3JlcXVlc3Q6ZSxwYXJhbXM6bi5wYXJhbXMsY29udGV4dDpzLnJlcXVlc3RDb250ZXh0fSksd10pfTt0cnl7bGV0IG09bi5yb3V0ZVt0XTtpZihuLnJvdXRlLmxhenkpaWYobSl7bGV0IGcsdz1hd2FpdCBQcm9taXNlLmFsbChbZChtKS5jYXRjaCh2PT57Zz12fSksY18obi5yb3V0ZSxvLGkpXSk7aWYoZyl0aHJvdyBnO3U9d1swXX1lbHNlIGlmKGF3YWl0IGNfKG4ucm91dGUsbyxpKSxtPW4ucm91dGVbdF0sbSl1PWF3YWl0IGQobSk7ZWxzZSBpZih0PT09ImFjdGlvbiIpe2xldCBnPW5ldyBVUkwoZS51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDUse21ldGhvZDplLm1ldGhvZCxwYXRobmFtZTp3LHJvdXRlSWQ6bi5yb3V0ZS5pZH0pfWVsc2UgcmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnZvaWQgMH07ZWxzZSBpZihtKXU9YXdhaXQgZChtKTtlbHNle2xldCBnPW5ldyBVUkwoZS51cmwpLHc9Zy5wYXRobmFtZStnLnNlYXJjaDt0aHJvdyBHbig0MDQse3BhdGhuYW1lOnd9KX1PZSh1IT09dm9pZCAwLCJZb3UgZGVmaW5lZCAiKyh0PT09ImFjdGlvbiI/ImFuIGFjdGlvbiI6ImEgbG9hZGVyIikrIiBmb3Igcm91dGUgIisoJyInK24ucm91dGUuaWQrIlwiIGJ1dCBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nIGZyb20geW91ciBgIit0KyJgICIpKyJmdW5jdGlvbi4gUGxlYXNlIHJldHVybiBhIHZhbHVlIG9yIGBudWxsYC4iKX1jYXRjaChtKXthPVN0LmVycm9yLHU9bX1maW5hbGx5e2MmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixjKX1pZihpSSh1KSl7bGV0IG09dS5zdGF0dXM7aWYoWkwuaGFzKG0pKXtsZXQgdj11LmhlYWRlcnMuZ2V0KCJMb2NhdGlvbiIpO2lmKE9lKHYsIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyIiksIUlrLnRlc3Qodikpdj1aZyhuZXcgVVJMKGUudXJsKSxyLnNsaWNlKDAsci5pbmRleE9mKG4pKzEpLGwsITAsdik7ZWxzZSBpZighcy5pc1N0YXRpY1JlcXVlc3Qpe2xldCB5PW5ldyBVUkwoZS51cmwpLHg9di5zdGFydHNXaXRoKCIvLyIpP25ldyBVUkwoeS5wcm90b2NvbCt2KTpuZXcgVVJMKHYpLFM9SHUoeC5wYXRobmFtZSxsKSE9bnVsbDt4Lm9yaWdpbj09PXkub3JpZ2luJiZTJiYodj14LnBhdGhuYW1lK3guc2VhcmNoK3guaGFzaCl9aWYocy5pc1N0YXRpY1JlcXVlc3QpdGhyb3cgdS5oZWFkZXJzLnNldCgiTG9jYXRpb24iLHYpLHU7cmV0dXJue3R5cGU6U3QucmVkaXJlY3Qsc3RhdHVzOm0sbG9jYXRpb246dixyZXZhbGlkYXRlOnUuaGVhZGVycy5nZXQoIlgtUmVtaXgtUmV2YWxpZGF0ZSIpIT09bnVsbCxyZWxvYWREb2N1bWVudDp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudCIpIT09bnVsbH19aWYocy5pc1JvdXRlUmVxdWVzdCl0aHJvd3t0eXBlOmE9PT1TdC5lcnJvcj9TdC5lcnJvcjpTdC5kYXRhLHJlc3BvbnNlOnV9O2xldCBnLHc9dS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIik7cmV0dXJuIHcmJi9cYmFwcGxpY2F0aW9uXC9qc29uXGIvLnRlc3Qodyk/Zz1hd2FpdCB1Lmpzb24oKTpnPWF3YWl0IHUudGV4dCgpLGE9PT1TdC5lcnJvcj97dHlwZTphLGVycm9yOm5ldyBYdihtLHUuc3RhdHVzVGV4dCxnKSxoZWFkZXJzOnUuaGVhZGVyc306e3R5cGU6U3QuZGF0YSxkYXRhOmcsc3RhdHVzQ29kZTp1LnN0YXR1cyxoZWFkZXJzOnUuaGVhZGVyc319aWYoYT09PVN0LmVycm9yKXJldHVybnt0eXBlOmEsZXJyb3I6dX07aWYockkodSkpe3ZhciBmLGg7cmV0dXJue3R5cGU6U3QuZGVmZXJyZWQsZGVmZXJyZWREYXRhOnUsc3RhdHVzQ29kZTooZj11LmluaXQpPT1udWxsP3ZvaWQgMDpmLnN0YXR1cyxoZWFkZXJzOigoaD11LmluaXQpPT1udWxsP3ZvaWQgMDpoLmhlYWRlcnMpJiZuZXcgSGVhZGVycyh1LmluaXQuaGVhZGVycyl9fXJldHVybnt0eXBlOlN0LmRhdGEsZGF0YTp1fX1mdW5jdGlvbiBuYSh0LGUsbixyKXtsZXQgaT10LmNyZWF0ZVVSTCh6ayhlKSkudG9TdHJpbmcoKSxvPXtzaWduYWw6bn07aWYociYmcHIoci5mb3JtTWV0aG9kKSl7bGV0e2Zvcm1NZXRob2Q6bCxmb3JtRW5jVHlwZTpzfT1yO28ubWV0aG9kPWwudG9VcHBlckNhc2UoKSxzPT09ImFwcGxpY2F0aW9uL2pzb24iPyhvLmhlYWRlcnM9bmV3IEhlYWRlcnMoeyJDb250ZW50LVR5cGUiOnN9KSxvLmJvZHk9SlNPTi5zdHJpbmdpZnkoci5qc29uKSk6cz09PSJ0ZXh0L3BsYWluIj9vLmJvZHk9ci50ZXh0OnM9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmci5mb3JtRGF0YT9vLmJvZHk9R2coci5mb3JtRGF0YSk6by5ib2R5PXIuZm9ybURhdGF9cmV0dXJuIG5ldyBSZXF1ZXN0KGksbyl9ZnVuY3Rpb24gR2codCl7bGV0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcztmb3IobGV0W24scl1vZiB0LmVudHJpZXMoKSllLmFwcGVuZChuLHR5cGVvZiByPT0ic3RyaW5nIj9yOnIubmFtZSk7cmV0dXJuIGV9ZnVuY3Rpb24gZF8odCl7bGV0IGU9bmV3IEZvcm1EYXRhO2ZvcihsZXRbbixyXW9mIHQuZW50cmllcygpKWUuYXBwZW5kKG4scik7cmV0dXJuIGV9ZnVuY3Rpb24gdEkodCxlLG4scixpKXtsZXQgbz17fSxsPW51bGwscyxhPSExLHU9e307cmV0dXJuIG4uZm9yRWFjaCgoYyxkKT0+e2xldCBmPWVbZF0ucm91dGUuaWQ7aWYoT2UoIXFsKGMpLCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGEiKSxNYShjKSl7bGV0IGg9QWEodCxmKSxtPWMuZXJyb3I7ciYmKG09T2JqZWN0LnZhbHVlcyhyKVswXSxyPXZvaWQgMCksbD1sfHx7fSxsW2gucm91dGUuaWRdPT1udWxsJiYobFtoLnJvdXRlLmlkXT1tKSxvW2ZdPXZvaWQgMCxhfHwoYT0hMCxzPU1rKGMuZXJyb3IpP2MuZXJyb3Iuc3RhdHVzOjUwMCksYy5oZWFkZXJzJiYodVtmXT1jLmhlYWRlcnMpfWVsc2UgUG8oYyk/KGkuc2V0KGYsYy5kZWZlcnJlZERhdGEpLG9bZl09Yy5kZWZlcnJlZERhdGEuZGF0YSk6b1tmXT1jLmRhdGEsYy5zdGF0dXNDb2RlIT1udWxsJiZjLnN0YXR1c0NvZGUhPT0yMDAmJiFhJiYocz1jLnN0YXR1c0NvZGUpLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX0pLHImJihsPXIsb1tPYmplY3Qua2V5cyhyKVswXV09dm9pZCAwKSx7bG9hZGVyRGF0YTpvLGVycm9yczpsLHN0YXR1c0NvZGU6c3x8MjAwLGxvYWRlckhlYWRlcnM6dX19ZnVuY3Rpb24gZl8odCxlLG4scixpLG8sbCxzKXtsZXR7bG9hZGVyRGF0YTphLGVycm9yczp1fT10SShlLG4scixpLHMpO2ZvcihsZXQgYz0wO2M8by5sZW5ndGg7YysrKXtsZXR7a2V5OmQsbWF0Y2g6Zixjb250cm9sbGVyOmh9PW9bY107T2UobCE9PXZvaWQgMCYmbFtjXSE9PXZvaWQgMCwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHQiKTtsZXQgbT1sW2NdO2lmKCEoaCYmaC5zaWduYWwuYWJvcnRlZCkpaWYoTWEobSkpe2xldCBnPUFhKHQubWF0Y2hlcyxmPT1udWxsP3ZvaWQgMDpmLnJvdXRlLmlkKTt1JiZ1W2cucm91dGUuaWRdfHwodT15dCh7fSx1LHtbZy5yb3V0ZS5pZF06bS5lcnJvcn0pKSx0LmZldGNoZXJzLmRlbGV0ZShkKX1lbHNlIGlmKHFsKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciByZXZhbGlkYXRpb24gcmVkaXJlY3QiKTtlbHNlIGlmKFBvKG0pKU9lKCExLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7ZWxzZXtsZXQgZz1QaShtLmRhdGEpO3QuZmV0Y2hlcnMuc2V0KGQsZyl9fXJldHVybntsb2FkZXJEYXRhOmEsZXJyb3JzOnV9fWZ1bmN0aW9uIGhfKHQsZSxuLHIpe2xldCBpPXl0KHt9LGUpO2ZvcihsZXQgbyBvZiBuKXtsZXQgbD1vLnJvdXRlLmlkO2lmKGUuaGFzT3duUHJvcGVydHkobCk/ZVtsXSE9PXZvaWQgMCYmKGlbbF09ZVtsXSk6dFtsXSE9PXZvaWQgMCYmby5yb3V0ZS5sb2FkZXImJihpW2xdPXRbbF0pLHImJnIuaGFzT3duUHJvcGVydHkobCkpYnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gQWEodCxlKXtyZXR1cm4oZT90LnNsaWNlKDAsdC5maW5kSW5kZXgocj0+ci5yb3V0ZS5pZD09PWUpKzEpOlsuLi50XSkucmV2ZXJzZSgpLmZpbmQocj0+ci5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5PT09ITApfHx0WzBdfWZ1bmN0aW9uIHBfKHQpe2xldCBlPXQubGVuZ3RoPT09MT90WzBdOnQuZmluZChuPT5uLmluZGV4fHwhbi5wYXRofHxuLnBhdGg9PT0iLyIpfHx7aWQ6Il9fc2hpbS1lcnJvci1yb3V0ZV9fIn07cmV0dXJue21hdGNoZXM6W3twYXJhbXM6e30scGF0aG5hbWU6IiIscGF0aG5hbWVCYXNlOiIiLHJvdXRlOmV9XSxyb3V0ZTplfX1mdW5jdGlvbiBHbih0LGUpe2xldHtwYXRobmFtZTpuLHJvdXRlSWQ6cixtZXRob2Q6aSx0eXBlOm99PWU9PT12b2lkIDA/e306ZSxsPSJVbmtub3duIFNlcnZlciBFcnJvciIscz0iVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvciI7cmV0dXJuIHQ9PT00MDA/KGw9IkJhZCBSZXF1ZXN0IixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGEgYGxvYWRlcmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6bz09PSJkZWZlci1hY3Rpb24iP3M9ImRlZmVyKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBhY3Rpb25zIjpvPT09ImludmFsaWQtYm9keSImJihzPSJVbmFibGUgdG8gZW5jb2RlIHN1Ym1pc3Npb24gYm9keSIpKTp0PT09NDAzPyhsPSJGb3JiaWRkZW4iLHM9J1JvdXRlICInK3IrJyIgZG9lcyBub3QgbWF0Y2ggVVJMICInK24rJyInKTp0PT09NDA0PyhsPSJOb3QgRm91bmQiLHM9J05vIHJvdXRlIG1hdGNoZXMgVVJMICInK24rJyInKTp0PT09NDA1JiYobD0iTWV0aG9kIE5vdCBBbGxvd2VkIixpJiZuJiZyP3M9IllvdSBtYWRlIGEgIitpLnRvVXBwZXJDYXNlKCkrJyByZXF1ZXN0IHRvICInK24rJyIgYnV0ICcrKCdkaWQgbm90IHByb3ZpZGUgYW4gYGFjdGlvbmAgZm9yIHJvdXRlICInK3IrJyIsICcpKyJzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiI6aSYmKHM9J0ludmFsaWQgcmVxdWVzdCBtZXRob2QgIicraS50b1VwcGVyQ2FzZSgpKyciJykpLG5ldyBYdih0fHw1MDAsbCxuZXcgRXJyb3IocyksITApfWZ1bmN0aW9uIGdfKHQpe2ZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKXtsZXQgbj10W2VdO2lmKHFsKG4pKXJldHVybntyZXN1bHQ6bixpZHg6ZX19fWZ1bmN0aW9uIHprKHQpe2xldCBlPXR5cGVvZiB0PT0ic3RyaW5nIj9raSh0KTp0O3JldHVybiBWdSh5dCh7fSxlLHtoYXNoOiIifSkpfWZ1bmN0aW9uIG5JKHQsZSl7cmV0dXJuIHQucGF0aG5hbWUhPT1lLnBhdGhuYW1lfHx0LnNlYXJjaCE9PWUuc2VhcmNoPyExOnQuaGFzaD09PSIiP2UuaGFzaCE9PSIiOnQuaGFzaD09PWUuaGFzaD8hMDplLmhhc2ghPT0iIn1mdW5jdGlvbiBQbyh0KXtyZXR1cm4gdC50eXBlPT09U3QuZGVmZXJyZWR9ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHQudHlwZT09PVN0LmVycm9yfWZ1bmN0aW9uIHFsKHQpe3JldHVybih0JiZ0LnR5cGUpPT09U3QucmVkaXJlY3R9ZnVuY3Rpb24gckkodCl7bGV0IGU9dDtyZXR1cm4gZSYmdHlwZW9mIGU9PSJvYmplY3QiJiZ0eXBlb2YgZS5kYXRhPT0ib2JqZWN0IiYmdHlwZW9mIGUuc3Vic2NyaWJlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZS5jYW5jZWw9PSJmdW5jdGlvbiImJnR5cGVvZiBlLnJlc29sdmVEYXRhPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIGlJKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdC5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIHQuaGVhZGVycz09Im9iamVjdCImJnR5cGVvZiB0LmJvZHk8InUifWZ1bmN0aW9uIG9JKHQpe3JldHVybiBLTC5oYXModC50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBwcih0KXtyZXR1cm4gVkwuaGFzKHQudG9Mb3dlckNhc2UoKSl9YXN5bmMgZnVuY3Rpb24gbV8odCxlLG4scixpLG8pe2ZvcihsZXQgbD0wO2w8bi5sZW5ndGg7bCsrKXtsZXQgcz1uW2xdLGE9ZVtsXTtpZighYSljb250aW51ZTtsZXQgdT10LmZpbmQoZD0+ZC5yb3V0ZS5pZD09PWEucm91dGUuaWQpLGM9dSE9bnVsbCYmIWprKHUsYSkmJihvJiZvW2Eucm91dGUuaWRdKSE9PXZvaWQgMDtpZihQbyhzKSYmKGl8fGMpKXtsZXQgZD1yW2xdO09lKGQsIkV4cGVjdGVkIGFuIEFib3J0U2lnbmFsIGZvciByZXZhbGlkYXRpbmcgZmV0Y2hlciBkZWZlcnJlZCByZXN1bHQiKSxhd2FpdCBGayhzLGQsaSkudGhlbihmPT57ZiYmKG5bbF09Znx8bltsXSl9KX19fWFzeW5jIGZ1bmN0aW9uIEZrKHQsZSxuKXtpZihuPT09dm9pZCAwJiYobj0hMSksIWF3YWl0IHQuZGVmZXJyZWREYXRhLnJlc29sdmVEYXRhKGUpKXtpZihuKXRyeXtyZXR1cm57dHlwZTpTdC5kYXRhLGRhdGE6dC5kZWZlcnJlZERhdGEudW53cmFwcGVkRGF0YX19Y2F0Y2goaSl7cmV0dXJue3R5cGU6U3QuZXJyb3IsZXJyb3I6aX19cmV0dXJue3R5cGU6U3QuZGF0YSxkYXRhOnQuZGVmZXJyZWREYXRhLmRhdGF9fX1mdW5jdGlvbiBRdih0KXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh0KS5nZXRBbGwoImluZGV4Iikuc29tZShlPT5lPT09IiIpfWZ1bmN0aW9uIFlnKHQsZSl7bGV0IG49dHlwZW9mIGU9PSJzdHJpbmciP2tpKGUpLnNlYXJjaDplLnNlYXJjaDtpZih0W3QubGVuZ3RoLTFdLnJvdXRlLmluZGV4JiZRdihufHwiIikpcmV0dXJuIHRbdC5sZW5ndGgtMV07bGV0IHI9T2sodCk7cmV0dXJuIHJbci5sZW5ndGgtMV19ZnVuY3Rpb24gdl8odCl7bGV0e2Zvcm1NZXRob2Q6ZSxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cix0ZXh0OmksZm9ybURhdGE6byxqc29uOmx9PXQ7aWYoISghZXx8IW58fCFyKSl7aWYoaSE9bnVsbClyZXR1cm57Zm9ybU1ldGhvZDplLGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0Oml9O2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6ZSxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTpvLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihsIT09dm9pZCAwKXJldHVybntmb3JtTWV0aG9kOmUsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6dm9pZCAwLGpzb246bCx0ZXh0OnZvaWQgMH19fWZ1bmN0aW9uIEdoKHQsZSl7cmV0dXJuIGU/e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dH06e3N0YXRlOiJsb2FkaW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9fWZ1bmN0aW9uIGxJKHQsZSl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixsb2NhdGlvbjp0LGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dH19ZnVuY3Rpb24gcmEodCxlKXtyZXR1cm4gdD97c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6dC5mb3JtTWV0aG9kLGZvcm1BY3Rpb246dC5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOnQuZm9ybUVuY1R5cGUsZm9ybURhdGE6dC5mb3JtRGF0YSxqc29uOnQuanNvbix0ZXh0OnQudGV4dCxkYXRhOmV9OntzdGF0ZToibG9hZGluZyIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOmV9fWZ1bmN0aW9uIHNJKHQsZSl7cmV0dXJue3N0YXRlOiJzdWJtaXR0aW5nIixmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHQsZGF0YTplP2UuZGF0YTp2b2lkIDB9fWZ1bmN0aW9uIFBpKHQpe3JldHVybntzdGF0ZToiaWRsZSIsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMCxkYXRhOnR9fWZ1bmN0aW9uIGFJKHQsZSl7dHJ5e2xldCBuPXQuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShEayk7aWYobil7bGV0IHI9SlNPTi5wYXJzZShuKTtmb3IobGV0W2ksb11vZiBPYmplY3QuZW50cmllcyhyfHx7fSkpbyYmQXJyYXkuaXNBcnJheShvKSYmZS5zZXQoaSxuZXcgU2V0KG98fFtdKSl9fWNhdGNoe319ZnVuY3Rpb24gdUkodCxlKXtpZihlLnNpemU+MCl7bGV0IG49e307Zm9yKGxldFtyLGldb2YgZSluW3JdPVsuLi5pXTt0cnl7dC5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKERrLEpTT04uc3RyaW5naWZ5KG4pKX1jYXRjaChyKXtxbyghMSwiRmFpbGVkIHRvIHNhdmUgYXBwbGllZCB2aWV3IHRyYW5zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlICgiK3IrIikuIil9fX0vKioKICogUmVhY3QgUm91dGVyIHY2LjIwLjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBxZCgpe3JldHVybiBxZD1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LHFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jb25zdCBWZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksQms9cC5jcmVhdGVDb250ZXh0KG51bGwpLEhmPXAuY3JlYXRlQ29udGV4dChudWxsKSxLZj1wLmNyZWF0ZUNvbnRleHQobnVsbCksZGw9cC5jcmVhdGVDb250ZXh0KHtvdXRsZXQ6bnVsbCxtYXRjaGVzOltdLGlzRGF0YVJvdXRlOiExfSksVWs9cC5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIFpmKCl7cmV0dXJuIHAudXNlQ29udGV4dChLZikhPW51bGx9ZnVuY3Rpb24gV2soKXtyZXR1cm4gWmYoKXx8T2UoITEpLHAudXNlQ29udGV4dChLZikubG9jYXRpb259ZnVuY3Rpb24gVmsodCl7cC51c2VDb250ZXh0KEhmKS5zdGF0aWN8fHAudXNlTGF5b3V0RWZmZWN0KHQpfWZ1bmN0aW9uIEp2KCl7bGV0e2lzRGF0YVJvdXRlOnR9PXAudXNlQ29udGV4dChkbCk7cmV0dXJuIHQ/U0koKTpjSSgpfWZ1bmN0aW9uIGNJKCl7WmYoKXx8T2UoITEpO2xldCB0PXAudXNlQ29udGV4dChWZikse2Jhc2VuYW1lOmUsbmF2aWdhdG9yOm59PXAudXNlQ29udGV4dChIZikse21hdGNoZXM6cn09cC51c2VDb250ZXh0KGRsKSx7cGF0aG5hbWU6aX09V2soKSxvPUpTT04uc3RyaW5naWZ5KFBrKHIpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QWsoYSxKU09OLnBhcnNlKG8pLGksdS5yZWxhdGl2ZT09PSJwYXRoIik7dD09bnVsbCYmZSE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj9lOmVvKFtlLGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFtlLG4sbyxpLHRdKX1mdW5jdGlvbiBkSSgpe2xldHttYXRjaGVzOnR9PXAudXNlQ29udGV4dChkbCksZT10W3QubGVuZ3RoLTFdO3JldHVybiBlP2UucGFyYW1zOnt9fWZ1bmN0aW9uIGZJKHQsZSxuKXtaZigpfHxPZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoSGYpLHttYXRjaGVzOml9PXAudXNlQ29udGV4dChkbCksbz1pW2kubGVuZ3RoLTFdLGw9bz9vLnBhcmFtczp7fTtvJiZvLnBhdGhuYW1lO2xldCBzPW8/by5wYXRobmFtZUJhc2U6Ii8iO28mJm8ucm91dGU7bGV0IGE9V2soKSx1O2lmKGUpe3ZhciBjO2xldCBnPXR5cGVvZiBlPT0ic3RyaW5nIj9raShlKTplO3M9PT0iLyJ8fChjPWcucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fE9lKCExKSx1PWd9ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1CbCh0LHtwYXRobmFtZTpmfSksbT12SShoJiZoLm1hcChnPT5PYmplY3QuYXNzaWduKHt9LGcse3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsZy5wYXJhbXMpLHBhdGhuYW1lOmVvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihnLnBhdGhuYW1lKS5wYXRobmFtZTpnLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOmcucGF0aG5hbWVCYXNlPT09Ii8iP3M6ZW8oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKGcucGF0aG5hbWVCYXNlKS5wYXRobmFtZTpnLnBhdGhuYW1lQmFzZV0pfSkpLGksbik7cmV0dXJuIGUmJm0/cC5jcmVhdGVFbGVtZW50KEtmLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246cWQoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOnd0LlBvcH19LG0pOm19ZnVuY3Rpb24gaEkoKXtsZXQgdD13SSgpLGU9TWsodCk/dC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dDp0IGluc3RhbmNlb2YgRXJyb3I/dC5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KHQpLG49dCBpbnN0YW5jZW9mIEVycm9yP3Quc3RhY2s6bnVsbCxpPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LG89bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sZSksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOml9LG4pOm51bGwsbyl9Y29uc3QgcEk9cC5jcmVhdGVFbGVtZW50KGhJLG51bGwpO2NsYXNzIGdJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5zdGF0ZT17bG9jYXRpb246ZS5sb2NhdGlvbixyZXZhbGlkYXRpb246ZS5yZXZhbGlkYXRpb24sZXJyb3I6ZS5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlKXtyZXR1cm57ZXJyb3I6ZX19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhlLG4pe3JldHVybiBuLmxvY2F0aW9uIT09ZS5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJmUucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjplLmVycm9yLGxvY2F0aW9uOmUubG9jYXRpb24scmV2YWxpZGF0aW9uOmUucmV2YWxpZGF0aW9ufTp7ZXJyb3I6ZS5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjplLnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKGUsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLGUsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFVrLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIG1JKHQpe2xldHtyb3V0ZUNvbnRleHQ6ZSxtYXRjaDpuLGNoaWxkcmVuOnJ9PXQsaT1wLnVzZUNvbnRleHQoVmYpO3JldHVybiBpJiZpLnN0YXRpYyYmaS5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihpLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KGRsLlByb3ZpZGVyLHt2YWx1ZTplfSxyKX1mdW5jdGlvbiB2SSh0LGUsbil7dmFyIHI7aWYoZT09PXZvaWQgMCYmKGU9W10pLG49PT12b2lkIDAmJihuPW51bGwpLHQ9PW51bGwpe3ZhciBpO2lmKChpPW4pIT1udWxsJiZpLmVycm9ycyl0PW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBvPXQsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9by5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHxPZSghMSksbz1vLnNsaWNlKDAsTWF0aC5taW4oby5sZW5ndGgscysxKSl9cmV0dXJuIG8ucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8cEkpO2xldCBmPWUuY29uY2F0KG8uc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IG07cmV0dXJuIGM/bT1kOmEucm91dGUuQ29tcG9uZW50P209cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9tPWEucm91dGUuZWxlbWVudDptPXMscC5jcmVhdGVFbGVtZW50KG1JLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOm19KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KGdJLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBIaz1mdW5jdGlvbih0KXtyZXR1cm4gdC5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIix0LlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsdC5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLHR9KEhrfHx7fSksZWY9ZnVuY3Rpb24odCl7cmV0dXJuIHQuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsdC5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIix0LlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLHQuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsdC5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIix0LlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIix0LlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLHQuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIix0LlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsdC5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIix0fShlZnx8e30pO2Z1bmN0aW9uIHlJKHQpe2xldCBlPXAudXNlQ29udGV4dChWZik7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIHhJKHQpe2xldCBlPXAudXNlQ29udGV4dChCayk7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIF9JKHQpe2xldCBlPXAudXNlQ29udGV4dChkbCk7cmV0dXJuIGV8fE9lKCExKSxlfWZ1bmN0aW9uIEtrKHQpe2xldCBlPV9JKCksbj1lLm1hdGNoZXNbZS5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8T2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gd0koKXt2YXIgdDtsZXQgZT1wLnVzZUNvbnRleHQoVWspLG49eEkoZWYuVXNlUm91dGVFcnJvcikscj1LayhlZi5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gZXx8KCh0PW4uZXJyb3JzKT09bnVsbD92b2lkIDA6dFtyXSl9ZnVuY3Rpb24gU0koKXtsZXR7cm91dGVyOnR9PXlJKEhrLlVzZU5hdmlnYXRlU3RhYmxlKSxlPUtrKGVmLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gVmsoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGksbyl7bz09PXZvaWQgMCYmKG89e30pLG4uY3VycmVudCYmKHR5cGVvZiBpPT0ibnVtYmVyIj90Lm5hdmlnYXRlKGkpOnQubmF2aWdhdGUoaSxxZCh7ZnJvbVJvdXRlSWQ6ZX0sbykpKX0sW3QsZV0pfWZ1bmN0aW9uIEVJKHQpe2xldHtiYXNlbmFtZTplPSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTppPXd0LlBvcCxuYXZpZ2F0b3I6byxzdGF0aWM6bD0hMX09dDtaZigpJiZPZSghMSk7bGV0IHM9ZS5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOm8sc3RhdGljOmx9KSxbcyxvLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPWtpKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsbT1wLnVzZU1lbW8oKCk9PntsZXQgZz1IdSh1LHMpO3JldHVybiBnPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTpnLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTppfX0sW3MsdSxjLGQsZixoLGldKTtyZXR1cm4gbT09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChIZi5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KEtmLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOm19KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBDSSh0KXtsZXQgZT17aGFzRXJyb3JCb3VuZGFyeTp0LkVycm9yQm91bmRhcnkhPW51bGx8fHQuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gdC5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24oZSx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQodC5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSx0LkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24oZSx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudCh0LkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksZX1jb25zdCBaaz1yZS5jcmVhdGVDb250ZXh0KG51bGwpLGtJPXQ9Pnt2YXIgcyxhO2NvbnN0IGU9cmUudXNlQ29udGV4dChaayksW24scl09am4uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgodCksaT0ocz1lPT1udWxsP3ZvaWQgMDplW25dKT09bnVsbD92b2lkIDA6cy5zb3VyY2Usbz0oYT1lPT1udWxsP3ZvaWQgMDplW25dKT09bnVsbD92b2lkIDA6YS5zY2hlbWE7aWYoIWl8fCFvKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGU6ICIrbik7Y29uc3QgbD1qbi5yZXNvbHZlUGF0aChyLGksbyk7cmV0dXJue21vZHVsZUlkOm4sbW9kdWxlU291cmNlOmwuc291cmNlLG1vZHVsZVNjaGVtYTpsLnNjaGVtYX19LGJJPSh7YXBpOnR9KT0+e3ZhciAkLE87Y29uc3R7IioiOmV9PWRJKCksW24scl09cC51c2VTdGF0ZShudWxsKSxbaSxvXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoKSxbYV09bD9qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChsKTpbdm9pZCAwLHZvaWQgMF0sdT1hJiYoKCQ9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOiQuc291cmNlKSxjPWEmJigoTz1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6Ty5zY2hlbWEpLGQ9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFtMLFBdKT0+UC5lcnJvcnM/UC5lcnJvcnMuZmF0YWw/UC5lcnJvcnMuZmF0YWwubWFwKEQ9Pih7aWQ6TCwuLi5EfSkpOltdOltdKSxmPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLExdKT0+TC5lcnJvcnMmJkwuZXJyb3JzLnZhbGlkYXRpb24/W0wuZXJyb3JzLnZhbGlkYXRpb25dOltdKTtpZihkJiZkLmxlbmd0aD4wKXtjb25zdCBMPWQubGVuZ3RoPT09MT9kWzBdLm1lc3NhZ2U6YE11bHRpcGxlIGVycm9ycyBkZXRlY3RlZDoKJHtkLm1hcCgoRCxCKT0+YCR7QisxfS4gWyR7RC5pZH1dOiAke0QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAxLiAke2RbMF0ubWVzc2FnZX1gLFA9bmV3IEVycm9yKEwpO3Rocm93IFAuc3RhY2s9ZFswXS5zdGFjayxQfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKGU/YC8ke2V9YDpsKX0sW2VdKTtjb25zdFtoLG1dPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFA9PntsZXQgRDt0cnl7RD1KU09OLnBhcnNlKFAuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihEPT1udWxsP3ZvaWQgMDpELmhhc2gpPT0ic3RyaW5nIiYmKEQ9PW51bGw/dm9pZCAwOkQuYWN0aW9uKT09PSJidWlsdCImJm0oRC5oYXNoKX0pfWNhdGNoKEwpe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIixMKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSx0LmdldFRyZWUoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oTD0+e0xvLmlzT2soTCk/cihMLnZhbHVlLm1vZHVsZXMpOihvKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK0wuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihMLmVycm9yKSl9KX0sW2hdKTtjb25zdCBnPWgzKHQpLHc9SnYoKSxbdix5XT1oNSgpLHtwYXRjaGVzOngsc2V0UGF0Y2hSZXNldElkOlN9PWY1KGcsdCksYj1yZS51c2VSZWYobnVsbCksVD1wLnVzZUNhbGxiYWNrKEw9PmFzeW5jIFA9Pntjb25zdFtELEJdPWpuLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKEwpLG9lPWF3YWl0IFAoam4uY3JlYXRlUGF0Y2hKU09OUGF0aChCKSk7cmV0dXJuIHQucG9zdFBhdGNoZXMoRCxvZSkudGhlbihIPT57aWYoTG8uaXNFcnIoSCkpdGhyb3cgSC5lcnJvcjtpZighaClyZXR1cm4gUyhaPT5aKzEpLHQuZ2V0VHJlZSh7dHJlZVBhdGg6RCxwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKFo9PntMby5pc09rKFopP3IoQz0+KHsuLi5DLC4uLloudmFsdWUubW9kdWxlc30pKToobygiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIitaLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoWi5lcnJvcikpfSl9KS5jYXRjaChIPT57Y29uc29sZS5lcnJvcihIKX0pfSxbXSk7cmV0dXJuIF8uanN4KF9DLlByb3ZpZGVyLHt2YWx1ZTp7dGhlbWU6dixzZXRUaGVtZTp5LGFwaTp0LGVkaXRNb2RlOiJmdWxsIixzZXNzaW9uOmcsaGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6dixjaGlsZHJlbjpbXy5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOl8uanN4KGM1LHthcGk6dCxwYXRjaGVzOngsb25Db21taXQ6KCk9PlMoTD0+TCsxKX0pfSksXy5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOmJ9KSxfLmpzeChHay5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTpiPT1udWxsP3ZvaWQgMDpiLmN1cnJlbnR9LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjpfLmpzeHMoRWEse2NoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjpfLmpzeChrayx7fSl9KSxfLmpzeChTYSx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP18uanN4KExJLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOkw9Pnt3KEwpfX0pOiFpJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOltfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjpfLmpzeChlNSx7fSl9KSxfLmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltpJiZfLmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsaV19KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZfLmpzeChaay5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjpfLmpzeChUSSx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDpUfSl9KV19KV19KX0pfSldfSl9KX0sR2s9cmUuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSwkST0oKT0+cmUudXNlQ29udGV4dChHayk7ZnVuY3Rpb24gVEkoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6aX0pe2NvbnN0WyxvXT1qbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aCh0KSxsPWpuLnJlc29sdmVQYXRoKG8sZSxuKTtpZighbCl0aHJvdyBFcnJvcigiQ291bGQgbm90IHJlc29sdmUgbW9kdWxlOiAiK3QpO3JldHVybiBfLmpzeChZayx7cGF0aDp0LHNvdXJjZTpsLnNvdXJjZSxzY2hlbWE6bC5zY2hlbWEsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOiEwfSl9ZnVuY3Rpb24gWWsoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDppLGluaXRPblN1Ym1pdDpvLHRvcDpsfSl7cmV0dXJuIGU9PT1udWxsfHxuLm9wdD9fLmpzeChQSSx7cGF0aDp0LHNvdXJjZTplLHNjaGVtYTpuLGZpZWxkOmksaW5pdE9uU3VibWl0Om8sc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0ib2JqZWN0Ij90eXBlb2YgZSE9Im9iamVjdCJ8fExhKGUpP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0LCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpfLmpzeChYayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLGluaXRPblN1Ym1pdDpvLHNldFNlbGVjdGVkUGF0aDpyLHRvcDpsfSk6bi50eXBlPT09ImFycmF5Ij90eXBlb2YgZSE9Im9iamVjdCJ8fCFMYShlKT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIGFycmF5LCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpfLmpzeChRayx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09InJlY29yZCI/dHlwZW9mIGUhPSJvYmplY3QiP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0IGZvciAiLG4udHlwZSwiLCBidXQgZm91bmQgIix0eXBlb2YgZV19KTpMYShlKT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGRpZCBub3QgZXhwZWN0IGFycmF5IGZvciAiLG4udHlwZV19KTpfLmpzeChOSSx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InB5LTIgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGVmdCIsY2hpbGRyZW46aXx8dH0pLF8uanN4KENrLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6byh0KX0pXX0pfWZ1bmN0aW9uIFhrKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksdG9wOm99KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZTpfZigiZmxleCBmbGV4LWNvbCBnYXAteS04Iix7ImJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02Ijohb30pLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKG4uaXRlbXMpLm1hcCgoW2wsc10pPT57Y29uc3QgYT1idSh0LGwpO3JldHVybiBfLmpzeChZayx7cGF0aDphLHNvdXJjZTplW2xdLHNjaGVtYTpzLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOmwsaW5pdE9uU3VibWl0Oml9LGEpfSl9LHQpfWZ1bmN0aW9uIE5JKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBpPUp2KCk7cmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjpPYmplY3QuZW50cmllcyhlKS5tYXAoKFtvLGxdKT0+e2NvbnN0IHM9YnUodCxvKTtyZXR1cm4gXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLGkocyl9LGNoaWxkcmVuOl8uanN4KFJJLHtyZWNvcmRLZXk6byxwYXRoOnMsc291cmNlOmwsc2NoZW1hOm4uaXRlbX0pfSxzKX0pfSx0KX1jb25zdCBYZz0xNzA7ZnVuY3Rpb24gUkkoe3JlY29yZEtleTp0LHBhdGg6ZSxzb3VyY2U6bixzY2hlbWE6cn0pe2NvbnN0IGk9cmUudXNlUmVmKG51bGwpLFtvLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kuY3VycmVudCYmaS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49WGcmJmwoITApfSxbXSksXy5qc3hzKFl2LHtyZWY6aSxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpYZ30sY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOnR9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChxdix7cGF0aDplLHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sZSl9ZnVuY3Rpb24gUWsoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IGk9SnYoKTtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOmUubWFwKChvLGwpPT57Y29uc3Qgcz1idSh0LGwpO3JldHVybiBfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksaShzKX0sY2hpbGRyZW46Xy5qc3goT0kse2luZGV4OmwscGF0aDpzLHNvdXJjZTpvLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSx0KX1jb25zdCB5Xz1YZztmdW5jdGlvbiBPSSh7aW5kZXg6dCxwYXRoOmUsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBpPXJlLnVzZVJlZihudWxsKSxbbyxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLmN1cnJlbnQmJmkuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PXlfJiZsKCEwKX0sW10pLF8uanN4cyhZdix7cmVmOmksY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6eV99LGNoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46dCsxPDEwP2AwJHt0KzF9YDp0KzF9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChxdix7cGF0aDplLHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxvJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uIGJ1KHQsZSl7Y29uc3Qgbj1qbi5jcmVhdGVWYWxQYXRoT2ZJdGVtKHQsZSk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7dH0gb2YgJHtlPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gcXYoe3BhdGg6dCxzb3VyY2U6ZSxzY2hlbWE6bn0pe2NvbnN0W3IsaV09cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOm99PSRJKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT5fLmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W18uanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLF8uanN4KCJzcGFuIix7Y2hpbGRyZW46Xy5qc3gocXYse3NvdXJjZTooZT09bnVsbD92b2lkIDA6ZVtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDpidSh0LGwpfSl9KV19LGJ1KHQsbCkpKX0sdCk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpBcnJheS5pc0FycmF5KGUpP18uanN4cygic3BhbiIse2NoaWxkcmVuOltfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmUubGVuZ3RofSksXy5qc3goInNwYW4iLHtjaGlsZHJlbjplLmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sdCk6Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSx0KTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiBlPT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LHQpOnR5cGVvZiBlIT0ib2JqZWN0Ij9fLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgZSwiIG5vdCBhbiBvYmplY3QiXX0sdCk6IShubiBpbiBlKXx8ZVtubl0hPT0icmljaHRleHQiP18uanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LHQpOl8uanN4KElJLHtjaGlsZHJlbjokUyhlKX0sdCk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIGU9PT1udWxsP18uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sdCk6Xy5qc3goInNwYW4iLHtjaGlsZHJlbjplfSk7aWYobi50eXBlPT09ImltYWdlIil7aWYoZT09PW51bGwpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sdCk7aWYodHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSx0KTtpZighKFJuIGluIGUpfHx0eXBlb2YgZVtSbl0hPSJzdHJpbmciKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSx0KTtjb25zdCBsPWpuLmNvbnZlcnRGaWxlU291cmNlKGUpLnVybDtyZXR1cm4gXy5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e2koe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e2kobnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W18uanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOmVbUm5dfSksciYmbyYmR3IuY3JlYXRlUG9ydGFsKF8uanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksbyldfSx0KX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmU/InRydWUiOiJmYWxzZSJ9LHQpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiBlPT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LHQpOl8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZS50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gZT09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSx0KTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOmUudG9TdHJpbmcoKX0sdCl9cmV0dXJuIF8uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LHQpfWZ1bmN0aW9uIFBJKHtwYXRoOnQsc291cmNlOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0OmksZmllbGQ6b30pe2NvbnN0W2wsc109cC51c2VTdGF0ZShlIT09bnVsbCk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltvP18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOltfLmpzeChIZyx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxfLmpzeCgic3BhbiIse2NoaWxkcmVuOm99KV19KTpfLmpzeChIZyx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZfLmpzeChBSSx7c291cmNlOmUsc2NoZW1hOm4scGF0aDp0LHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSldfSx0KX1mdW5jdGlvbiBBSSh7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIHQ9PSJvYmplY3QiJiYodD09PW51bGx8fExhKHQpKSlyZXR1cm4gXy5qc3goUWsse3NvdXJjZTp0PT09bnVsbD9bXTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmKHQ9PT1udWxsfHwhTGEodCkpKXJldHVybiBfLmpzeChYayx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDppfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIF8uanN4KENrLHtwYXRoOmUsZGlzYWJsZWQ6ITEsc291cmNlOnQsc2NoZW1hOm4sb25TdWJtaXQ6aShlKX0sZSk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIHQsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gTUkodCl7Y29uc3QgZT17fTtyZXR1cm4gdC5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIobz0+byE9PSIiKTtsZXQgaT1lO3IuZm9yRWFjaChvPT57aVtvXXx8KGlbb109e30pLGk9aVtvXX0pfSksZX1mdW5jdGlvbiBMSSh7cGF0aHM6dCxzZXRTZWxlY3RlZE1vZHVsZUlkOmV9KXtjb25zdCBuPU1JKHQpO3JldHVybiBfLmpzeCh2Uyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixpXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46Xy5qc3goSmsse25hbWU6cix0cmVlOmksbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOmV9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24gSmsoe25hbWU6dCx0cmVlOmUsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjp0fSksT2JqZWN0LmVudHJpZXMoZSkubWFwKChbaSxvXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46Xy5qc3goSmsse25hbWU6aSx0cmVlOm8sbW9kdWxlSWQ6YCR7bn0vJHtpfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7aX1gKSldfSl9Y29uc3QgeF89e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gSUkoe2NoaWxkcmVuOnR9KXtjb25zdCBlPXQ7ZnVuY3Rpb24gbihvLGwpe2NvbnN0IHM9eF8udGFnc1tvXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKG8sbCl7Y29uc3Qgcz14Xy5jbGFzc2VzW29dO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIGkobyxsKXt2YXIgdSxjO2lmKHR5cGVvZiBvPT0ic3RyaW5nIilyZXR1cm4gbztpZihvLnRhZz09PSJwIilyZXR1cm4gXy5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJpbWciKXJldHVybiBfLmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzpvLnNyY30sbCk7aWYoby50YWc9PT0idWwiKXJldHVybiBfLmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ib2wiKXJldHVybiBfLmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ibGkiKXJldHVybiBfLmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjpvLmNoaWxkcmVuLm1hcCgoZCxmKT0+aShkLGYpKX0sbCk7aWYoby50YWc9PT0ic3BhbiIpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOm8uY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMSIpcmV0dXJuIF8uanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMiIpcmV0dXJuIF8uanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoMyIpcmV0dXJuIF8uanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNCIpcmV0dXJuIF8uanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNSIpcmV0dXJuIF8uanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJoNiIpcmV0dXJuIF8uanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOm8uY2hpbGRyZW4ubWFwKChkLGYpPT5pKGQsZikpfSxsKTtpZihvLnRhZz09PSJiciIpcmV0dXJuIF8uanN4KCJiciIse30sbCk7aWYoby50YWc9PT0iYSIpcmV0dXJuIF8uanN4KCJhIix7aHJlZjpvLmhyZWYsY2hpbGRyZW46by5jaGlsZHJlbi5tYXAoKGQsZik9PmkoZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixvLnRhZyk7Y29uc3QgYT1vLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/cmUuY3JlYXRlRWxlbWVudChhLnRhZyx7a2V5OmwsY2xhc3NOYW1lOih1PWEuY2xhc3MpPT1udWxsP3ZvaWQgMDp1LmpvaW4oIiAiKSxjaGlsZHJlbjooYz1hLmNoaWxkcmVuKT09bnVsbD92b2lkIDA6Yy5tYXAoaSl9KTpudWxsfXJldHVybiBfLmpzeCgic3BhbiIseyJkYXRhLXZhbC1wYXRoIjplLnZhbFBhdGgsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoKG8sbCk9PmkobyxsKSl9KX1jb25zdCBEST1wLmNyZWF0ZUNvbnRleHQobnVsbCksWWg9e2RpZENhdGNoOiExLGVycm9yOm51bGx9O2NsYXNzIGpJIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5yZXNldEVycm9yQm91bmRhcnk9dGhpcy5yZXNldEVycm9yQm91bmRhcnkuYmluZCh0aGlzKSx0aGlzLnN0YXRlPVlofXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZSl7cmV0dXJue2RpZENhdGNoOiEwLGVycm9yOmV9fXJlc2V0RXJyb3JCb3VuZGFyeSgpe2NvbnN0e2Vycm9yOmV9PXRoaXMuc3RhdGU7aWYoZSE9PW51bGwpe2Zvcih2YXIgbixyLGk9YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShpKSxsPTA7bDxpO2wrKylvW2xdPWFyZ3VtZW50c1tsXTsobj0ocj10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fG49PT12b2lkIDB8fG4uY2FsbChyLHthcmdzOm8scmVhc29uOiJpbXBlcmF0aXZlLWFwaSJ9KSx0aGlzLnNldFN0YXRlKFloKX19Y29tcG9uZW50RGlkQ2F0Y2goZSxuKXt2YXIgcixpOyhyPShpPXRoaXMucHJvcHMpLm9uRXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKGksZSxuKX1jb21wb25lbnREaWRVcGRhdGUoZSxuKXtjb25zdHtkaWRDYXRjaDpyfT10aGlzLnN0YXRlLHtyZXNldEtleXM6aX09dGhpcy5wcm9wcztpZihyJiZuLmVycm9yIT09bnVsbCYmekkoZS5yZXNldEtleXMsaSkpe3ZhciBvLGw7KG89KGw9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxvPT09dm9pZCAwfHxvLmNhbGwobCx7bmV4dDppLHByZXY6ZS5yZXNldEtleXMscmVhc29uOiJrZXlzIn0pLHRoaXMuc2V0U3RhdGUoWWgpfX1yZW5kZXIoKXtjb25zdHtjaGlsZHJlbjplLGZhbGxiYWNrUmVuZGVyOm4sRmFsbGJhY2tDb21wb25lbnQ6cixmYWxsYmFjazppfT10aGlzLnByb3BzLHtkaWRDYXRjaDpvLGVycm9yOmx9PXRoaXMuc3RhdGU7bGV0IHM9ZTtpZihvKXtjb25zdCBhPXtlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX07aWYocC5pc1ZhbGlkRWxlbWVudChpKSlzPWk7ZWxzZSBpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilzPW4oYSk7ZWxzZSBpZihyKXM9cC5jcmVhdGVFbGVtZW50KHIsYSk7ZWxzZSB0aHJvdyBsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoREkuUHJvdmlkZXIse3ZhbHVlOntkaWRDYXRjaDpvLGVycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fX0scyl9fWZ1bmN0aW9uIHpJKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOltdLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3JldHVybiB0Lmxlbmd0aCE9PWUubGVuZ3RofHx0LnNvbWUoKG4scik9PiFPYmplY3QuaXMobixlW3JdKSl9Y29uc3QgcWs9IkNvbGxhcHNpYmxlIixbRkksZWJdPW9sKHFrKSxbQkksZXldPUZJKHFrKSxVST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixvcGVuOnIsZGVmYXVsdE9wZW46aSxkaXNhYmxlZDpvLG9uT3BlbkNoYW5nZTpsLC4uLnN9PXQsW2E9ITEsdV09bXMoe3Byb3A6cixkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOmx9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEJJLHtzY29wZTpuLGRpc2FibGVkOm8sY29udGVudElkOkRmKCksb3BlbjphLG9uT3BlblRvZ2dsZTpwLnVzZUNhbGxiYWNrKCgpPT51KGM9PiFjKSxbdV0pfSxwLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHsiZGF0YS1zdGF0ZSI6dHkoYSksImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwfSxzLHtyZWY6ZX0pKSl9KSxXST0iQ29sbGFwc2libGVUcmlnZ2VyIixWST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6biwuLi5yfT10LGk9ZXkoV0ksbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChLZS5idXR0b24saWUoe3R5cGU6ImJ1dHRvbiIsImFyaWEtY29udHJvbHMiOmkuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjppLm9wZW58fCExLCJkYXRhLXN0YXRlIjp0eShpLm9wZW4pLCJkYXRhLWRpc2FibGVkIjppLmRpc2FibGVkPyIiOnZvaWQgMCxkaXNhYmxlZDppLmRpc2FibGVkfSxyLHtyZWY6ZSxvbkNsaWNrOm50KHQub25DbGljayxpLm9uT3BlblRvZ2dsZSl9KSl9KSx0Yj0iQ29sbGFwc2libGVDb250ZW50IixIST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09dCxpPWV5KHRiLHQuX19zY29wZUNvbGxhcHNpYmxlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNzLHtwcmVzZW50Om58fGkub3Blbn0sKHtwcmVzZW50Om99KT0+cC5jcmVhdGVFbGVtZW50KEtJLGllKHt9LHIse3JlZjplLHByZXNlbnQ6b30pKSl9KSxLST1wLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixwcmVzZW50OnIsY2hpbGRyZW46aSwuLi5vfT10LGw9ZXkodGIsbiksW3MsYV09cC51c2VTdGF0ZShyKSx1PXAudXNlUmVmKG51bGwpLGM9c3QoZSx1KSxkPXAudXNlUmVmKDApLGY9ZC5jdXJyZW50LGg9cC51c2VSZWYoMCksbT1oLmN1cnJlbnQsZz1sLm9wZW58fHMsdz1wLnVzZVJlZihnKSx2PXAudXNlUmVmKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgeT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PncuY3VycmVudD0hMSk7cmV0dXJuKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfSxbXSksVW4oKCk9Pntjb25zdCB5PXUuY3VycmVudDtpZih5KXt2LmN1cnJlbnQ9di5jdXJyZW50fHx7dHJhbnNpdGlvbkR1cmF0aW9uOnkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6eS5zdHlsZS5hbmltYXRpb25OYW1lfSx5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT0ibm9uZSI7Y29uc3QgeD15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2QuY3VycmVudD14LmhlaWdodCxoLmN1cnJlbnQ9eC53aWR0aCx3LmN1cnJlbnR8fCh5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj12LmN1cnJlbnQudHJhbnNpdGlvbkR1cmF0aW9uLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT12LmN1cnJlbnQuYW5pbWF0aW9uTmFtZSksYShyKX19LFtsLm9wZW4scl0pLHAuY3JlYXRlRWxlbWVudChLZS5kaXYsaWUoeyJkYXRhLXN0YXRlIjp0eShsLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpsLmRpc2FibGVkPyIiOnZvaWQgMCxpZDpsLmNvbnRlbnRJZCxoaWRkZW46IWd9LG8se3JlZjpjLHN0eWxlOnsiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCI6Zj9gJHtmfXB4YDp2b2lkIDAsIi0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6bT9gJHttfXB4YDp2b2lkIDAsLi4udC5zdHlsZX19KSxnJiZpKX0pO2Z1bmN0aW9uIHR5KHQpe3JldHVybiB0PyJvcGVuIjoiY2xvc2VkIn1jb25zdCBaST1VSSxHST1WSSxZST1ISSx4bz0iQWNjb3JkaW9uIixYST1bIkhvbWUiLCJFbmQiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCJdLFtueSxRSSxKSV09TEMoeG8pLFtHZixNRF09b2woeG8sW0pJLGViXSkscnk9ZWIoKSxuYj1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PXQsaT1yLG89cjtyZXR1cm4gcmUuY3JlYXRlRWxlbWVudChueS5Qcm92aWRlcix7c2NvcGU6dC5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9yZS5jcmVhdGVFbGVtZW50KG5ELGllKHt9LG8se3JlZjplfSkpOnJlLmNyZWF0ZUVsZW1lbnQodEQsaWUoe30saSx7cmVmOmV9KSkpfSk7bmIucHJvcFR5cGVzPXt0eXBlKHQpe2NvbnN0IGU9dC52YWx1ZXx8dC5kZWZhdWx0VmFsdWU7cmV0dXJuIHQudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyh0LnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6dC50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIGU9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6dC50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkoZSk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W3JiLHFJXT1HZih4byksW2liLGVEXT1HZih4byx7Y29sbGFwc2libGU6ITF9KSx0RD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LGNvbGxhcHNpYmxlOm89ITEsLi4ubH09dCxbcyxhXT1tcyh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6aX0pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KHJiLHtzY29wZTp0Ll9fc2NvcGVBY2NvcmRpb24sdmFsdWU6cz9bc106W10sb25JdGVtT3BlbjphLG9uSXRlbUNsb3NlOnJlLnVzZUNhbGxiYWNrKCgpPT5vJiZhKCIiKSxbbyxhXSl9LHJlLmNyZWF0ZUVsZW1lbnQoaWIse3Njb3BlOnQuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTpvfSxyZS5jcmVhdGVFbGVtZW50KG9iLGllKHt9LGwse3JlZjplfSkpKSl9KSxuRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOmk9KCk9Pnt9LC4uLm99PXQsW2w9W10sc109bXMoe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOml9KSxhPXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PXJlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5kLmZpbHRlcihmPT5mIT09YykpLFtzXSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQocmIse3Njb3BlOnQuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxyZS5jcmVhdGVFbGVtZW50KGliLHtzY29wZTp0Ll9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LHJlLmNyZWF0ZUVsZW1lbnQob2IsaWUoe30sbyx7cmVmOmV9KSkpKX0pLFtyRCxZZl09R2YoeG8pLG9iPXJlLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6aSxvcmllbnRhdGlvbjpvPSJ2ZXJ0aWNhbCIsLi4ubH09dCxzPXJlLnVzZVJlZihudWxsKSxhPXN0KHMsZSksdT1RSShuKSxkPVhtKGkpPT09Imx0ciIsZj1udCh0Lm9uS2V5RG93bixoPT57dmFyIG07aWYoIVhJLmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgZz1oLnRhcmdldCx3PXUoKS5maWx0ZXIoTD0+e3ZhciBQO3JldHVybiEoKFA9TC5yZWYuY3VycmVudCkhPT1udWxsJiZQIT09dm9pZCAwJiZQLmRpc2FibGVkKX0pLHY9dy5maW5kSW5kZXgoTD0+TC5yZWYuY3VycmVudD09PWcpLHk9dy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IHg9djtjb25zdCBTPTAsYj15LTEsVD0oKT0+e3g9disxLHg+YiYmKHg9Uyl9LCQ9KCk9Pnt4PXYtMSx4PFMmJih4PWIpfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6eD1TO2JyZWFrO2Nhc2UiRW5kIjp4PWI7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjpvPT09Imhvcml6b250YWwiJiYoZD9UKCk6JCgpKTticmVhaztjYXNlIkFycm93RG93biI6bz09PSJ2ZXJ0aWNhbCImJlQoKTticmVhaztjYXNlIkFycm93TGVmdCI6bz09PSJob3Jpem9udGFsIiYmKGQ/JCgpOlQoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjpvPT09InZlcnRpY2FsIiYmJCgpO2JyZWFrfWNvbnN0IE89eCV5OyhtPXdbT10ucmVmLmN1cnJlbnQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5mb2N1cygpfSk7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQockQse3Njb3BlOm4sZGlzYWJsZWQ6cixkaXJlY3Rpb246aSxvcmllbnRhdGlvbjpvfSxyZS5jcmVhdGVFbGVtZW50KG55LlNsb3Qse3Njb3BlOm59LHJlLmNyZWF0ZUVsZW1lbnQoS2UuZGl2LGllKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjpvLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxRZz0iQWNjb3JkaW9uSXRlbSIsW2lELGl5XT1HZihRZyksb0Q9cmUuZm9yd2FyZFJlZigodCxlKT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246bix2YWx1ZTpyLC4uLml9PXQsbz1ZZihRZyxuKSxsPXFJKFFnLG4pLHM9cnkobiksYT1EZigpLHU9ciYmbC52YWx1ZS5pbmNsdWRlcyhyKXx8ITEsYz1vLmRpc2FibGVkfHx0LmRpc2FibGVkO3JldHVybiByZS5jcmVhdGVFbGVtZW50KGlELHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxyZS5jcmVhdGVFbGVtZW50KFpJLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bGIodSl9LHMsaSx7cmVmOmUsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSxsRD0iQWNjb3JkaW9uSGVhZGVyIixzRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PXQsaT1ZZih4byxuKSxvPWl5KGxELG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KEtlLmgzLGllKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6bGIoby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjplfSkpfSksX189IkFjY29yZGlvblRyaWdnZXIiLGFEPXJlLmZvcndhcmRSZWYoKHQsZSk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09dCxpPVlmKHhvLG4pLG89aXkoX18sbiksbD1lRChfXyxuKSxzPXJ5KG4pO3JldHVybiByZS5jcmVhdGVFbGVtZW50KG55Lkl0ZW1TbG90LHtzY29wZTpufSxyZS5jcmVhdGVFbGVtZW50KEdJLGllKHsiYXJpYS1kaXNhYmxlZCI6by5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLGlkOm8udHJpZ2dlcklkfSxzLHIse3JlZjplfSkpKX0pLHVEPSJBY2NvcmRpb25Db250ZW50IixjRD1yZS5mb3J3YXJkUmVmKCh0LGUpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PXQsaT1ZZih4byxuKSxvPWl5KHVELG4pLGw9cnkobik7cmV0dXJuIHJlLmNyZWF0ZUVsZW1lbnQoWUksaWUoe3JvbGU6InJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSI6by50cmlnZ2VySWQsImRhdGEtb3JpZW50YXRpb24iOmkub3JpZW50YXRpb259LGwscix7cmVmOmUsc3R5bGU6eyItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KSIsIi0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKSIsLi4udC5zdHlsZX19KSl9KTtmdW5jdGlvbiBsYih0KXtyZXR1cm4gdD8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgZEQ9bmIsZkQ9b0QsaEQ9c0Qsc2I9YUQsYWI9Y0QscEQ9ZEQsdWI9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOnQsLi4uZX0sbik9Pl8uanN4KGZELHtyZWY6bixjbGFzc05hbWU6eHQoImJvcmRlci1iIix0KSwuLi5lfSkpO3ViLmRpc3BsYXlOYW1lPSJBY2NvcmRpb25JdGVtIjtjb25zdCBjYj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLC4uLm59LHIpPT5fLmpzeChoRCx7Y2xhc3NOYW1lOiJmbGV4IixjaGlsZHJlbjpfLmpzeHMoc2Ise3JlZjpyLGNsYXNzTmFtZTp4dCgiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00IGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhvdmVyOnVuZGVybGluZSBbJltkYXRhLXN0YXRlPW9wZW5dPnN2Z106cm90YXRlLTE4MCIsdCksLi4ubixjaGlsZHJlbjpbZSxfLmpzeChiQyx7Y2xhc3NOYW1lOiJ3LTQgaC00IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBzaHJpbmstMCJ9KV19KX0pKTtjYi5kaXNwbGF5TmFtZT1zYi5kaXNwbGF5TmFtZTtjb25zdCBkYj1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6dCxjaGlsZHJlbjplLC4uLm59LHIpPT5fLmpzeChhYix7cmVmOnIsY2xhc3NOYW1lOnh0KCJvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24iLHQpLC4uLm4sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToicHQtMCBwYi00IixjaGlsZHJlbjplfSl9KSk7ZGIuZGlzcGxheU5hbWU9YWIuZGlzcGxheU5hbWU7LyoqCiAqIFJlYWN0IFJvdXRlciBET00gdjYuMjAuMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHRmKCl7cmV0dXJuIHRmPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH0sdGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdEKHQsZSl7cmV0dXJuIFFMKHtiYXNlbmFtZTplPT1udWxsP3ZvaWQgMDplLmJhc2VuYW1lLGZ1dHVyZTp0Zih7fSxlPT1udWxsP3ZvaWQgMDplLmZ1dHVyZSx7djdfcHJlcGVuZEJhc2VuYW1lOiEwfSksaGlzdG9yeTp4TCh7d2luZG93OmU9PW51bGw/dm9pZCAwOmUud2luZG93fSksaHlkcmF0aW9uRGF0YTooZT09bnVsbD92b2lkIDA6ZS5oeWRyYXRpb25EYXRhKXx8bUQoKSxyb3V0ZXM6dCxtYXBSb3V0ZVByb3BlcnRpZXM6Q0ksd2luZG93OmU9PW51bGw/dm9pZCAwOmUud2luZG93fSkuaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIG1EKCl7dmFyIHQ7bGV0IGU9KHQ9d2luZG93KT09bnVsbD92b2lkIDA6dC5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7cmV0dXJuIGUmJmUuZXJyb3JzJiYoZT10Zih7fSxlLHtlcnJvcnM6dkQoZS5lcnJvcnMpfSkpLGV9ZnVuY3Rpb24gdkQodCl7aWYoIXQpcmV0dXJuIG51bGw7bGV0IGU9T2JqZWN0LmVudHJpZXModCksbj17fTtmb3IobGV0W3IsaV1vZiBlKWlmKGkmJmkuX190eXBlPT09IlJvdXRlRXJyb3JSZXNwb25zZSIpbltyXT1uZXcgWHYoaS5zdGF0dXMsaS5zdGF0dXNUZXh0LGkuZGF0YSxpLmludGVybmFsPT09ITApO2Vsc2UgaWYoaSYmaS5fX3R5cGU9PT0iRXJyb3IiKXtpZihpLl9fc3ViVHlwZSl7bGV0IG89d2luZG93W2kuX19zdWJUeXBlXTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil0cnl7bGV0IGw9bmV3IG8oaS5tZXNzYWdlKTtsLnN0YWNrPSIiLG5bcl09bH1jYXRjaHt9fWlmKG5bcl09PW51bGwpe2xldCBvPW5ldyBFcnJvcihpLm1lc3NhZ2UpO28uc3RhY2s9IiIsbltyXT1vfX1lbHNlIG5bcl09aTtyZXR1cm4gbn1jb25zdCB5RD1wLmNyZWF0ZUNvbnRleHQoe2lzVHJhbnNpdGlvbmluZzohMX0pLHhEPXAuY3JlYXRlQ29udGV4dChuZXcgTWFwKSxfRD0ic3RhcnRUcmFuc2l0aW9uIix3Xz1NX1tfRF0sd0Q9ImZsdXNoU3luYyIsU189alRbd0RdO2Z1bmN0aW9uIFNEKHQpe3dfP3dfKHQpOnQoKX1mdW5jdGlvbiBpYSh0KXtTXz9TXyh0KTp0KCl9Y2xhc3MgRUR7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXR1cz0icGVuZGluZyIsdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKChlLG4pPT57dGhpcy5yZXNvbHZlPXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZXNvbHZlZCIsZShyKSl9LHRoaXMucmVqZWN0PXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZWplY3RlZCIsbihyKSl9fSl9fWZ1bmN0aW9uIENEKHQpe2xldHtmYWxsYmFja0VsZW1lbnQ6ZSxyb3V0ZXI6bixmdXR1cmU6cn09dCxbaSxvXT1wLnVzZVN0YXRlKG4uc3RhdGUpLFtsLHNdPXAudXNlU3RhdGUoKSxbYSx1XT1wLnVzZVN0YXRlKHtpc1RyYW5zaXRpb25pbmc6ITF9KSxbYyxkXT1wLnVzZVN0YXRlKCksW2YsaF09cC51c2VTdGF0ZSgpLFttLGddPXAudXNlU3RhdGUoKSx3PXAudXNlUmVmKG5ldyBNYXApLHt2N19zdGFydFRyYW5zaXRpb246dn09cnx8e30seT1wLnVzZUNhbGxiYWNrKCQ9Pnt2P1NEKCQpOiQoKX0sW3ZdKSx4PXAudXNlQ2FsbGJhY2soKCQsTyk9PntsZXR7ZGVsZXRlZEZldGNoZXJzOkwsdW5zdGFibGVfZmx1c2hTeW5jOlAsdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOkR9PU87TC5mb3JFYWNoKG9lPT53LmN1cnJlbnQuZGVsZXRlKG9lKSksJC5mZXRjaGVycy5mb3JFYWNoKChvZSxIKT0+e29lLmRhdGEhPT12b2lkIDAmJncuY3VycmVudC5zZXQoSCxvZS5kYXRhKX0pO2xldCBCPW4ud2luZG93PT1udWxsfHx0eXBlb2Ygbi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiE9ImZ1bmN0aW9uIjtpZighRHx8Qil7UD9pYSgoKT0+bygkKSk6eSgoKT0+bygkKSk7cmV0dXJufWlmKFApe2lhKCgpPT57ZiYmKGMmJmMucmVzb2x2ZSgpLGYuc2tpcFRyYW5zaXRpb24oKSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSl9KTtsZXQgb2U9bi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKT0+e2lhKCgpPT5vKCQpKX0pO29lLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntpYSgoKT0+e2Qodm9pZCAwKSxoKHZvaWQgMCkscyh2b2lkIDApLHUoe2lzVHJhbnNpdGlvbmluZzohMX0pfSl9KSxpYSgoKT0+aChvZSkpO3JldHVybn1mPyhjJiZjLnJlc29sdmUoKSxmLnNraXBUcmFuc2l0aW9uKCksZyh7c3RhdGU6JCxjdXJyZW50TG9jYXRpb246RC5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOkQubmV4dExvY2F0aW9ufSkpOihzKCQpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxmbHVzaFN5bmM6ITEsY3VycmVudExvY2F0aW9uOkQuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpELm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyx3LHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoeCksW24seF0pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJiFhLmZsdXNoU3luYyYmZChuZXcgRUQpfSxbYV0pLHAudXNlRWZmZWN0KCgpPT57aWYoYyYmbCYmbi53aW5kb3cpe2xldCAkPWwsTz1jLnByb21pc2UsTD1uLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jKCk9Pnt5KCgpPT5vKCQpKSxhd2FpdCBPfSk7TC5maW5pc2hlZC5maW5hbGx5KCgpPT57ZCh2b2lkIDApLGgodm9pZCAwKSxzKHZvaWQgMCksdSh7aXNUcmFuc2l0aW9uaW5nOiExfSl9KSxoKEwpfX0sW3ksbCxjLG4ud2luZG93XSkscC51c2VFZmZlY3QoKCk9PntjJiZsJiZpLmxvY2F0aW9uLmtleT09PWwubG9jYXRpb24ua2V5JiZjLnJlc29sdmUoKX0sW2MsZixpLmxvY2F0aW9uLGxdKSxwLnVzZUVmZmVjdCgoKT0+eyFhLmlzVHJhbnNpdGlvbmluZyYmbSYmKHMobS5zdGF0ZSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGZsdXNoU3luYzohMSxjdXJyZW50TG9jYXRpb246bS5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOm0ubmV4dExvY2F0aW9ufSksZyh2b2lkIDApKX0sW2EuaXNUcmFuc2l0aW9uaW5nLG1dKTtsZXQgUz1wLnVzZU1lbW8oKCk9Pih7Y3JlYXRlSHJlZjpuLmNyZWF0ZUhyZWYsZW5jb2RlTG9jYXRpb246bi5lbmNvZGVMb2NhdGlvbixnbzokPT5uLm5hdmlnYXRlKCQpLHB1c2g6KCQsTyxMKT0+bi5uYXZpZ2F0ZSgkLHtzdGF0ZTpPLHByZXZlbnRTY3JvbGxSZXNldDpMPT1udWxsP3ZvaWQgMDpMLnByZXZlbnRTY3JvbGxSZXNldH0pLHJlcGxhY2U6KCQsTyxMKT0+bi5uYXZpZ2F0ZSgkLHtyZXBsYWNlOiEwLHN0YXRlOk8scHJldmVudFNjcm9sbFJlc2V0Okw9PW51bGw/dm9pZCAwOkwucHJldmVudFNjcm9sbFJlc2V0fSl9KSxbbl0pLGI9bi5iYXNlbmFtZXx8Ii8iLFQ9cC51c2VNZW1vKCgpPT4oe3JvdXRlcjpuLG5hdmlnYXRvcjpTLHN0YXRpYzohMSxiYXNlbmFtZTpifSksW24sUyxiXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KFZmLlByb3ZpZGVyLHt2YWx1ZTpUfSxwLmNyZWF0ZUVsZW1lbnQoQmsuUHJvdmlkZXIse3ZhbHVlOml9LHAuY3JlYXRlRWxlbWVudCh4RC5Qcm92aWRlcix7dmFsdWU6dy5jdXJyZW50fSxwLmNyZWF0ZUVsZW1lbnQoeUQuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudChFSSx7YmFzZW5hbWU6Yixsb2NhdGlvbjppLmxvY2F0aW9uLG5hdmlnYXRpb25UeXBlOmkuaGlzdG9yeUFjdGlvbixuYXZpZ2F0b3I6U30saS5pbml0aWFsaXplZD9wLmNyZWF0ZUVsZW1lbnQoa0Qse3JvdXRlczpuLnJvdXRlcyxzdGF0ZTppfSk6ZSkpKSkpLG51bGwpfWZ1bmN0aW9uIGtEKHQpe2xldHtyb3V0ZXM6ZSxzdGF0ZTpufT10O3JldHVybiBmSShlLHZvaWQgMCxuKX12YXIgRV87KGZ1bmN0aW9uKHQpe3QuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIix0LlVzZVN1Ym1pdD0idXNlU3VibWl0Iix0LlVzZVN1Ym1pdEZldGNoZXI9InVzZVN1Ym1pdEZldGNoZXIiLHQuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsdC51c2VWaWV3VHJhbnNpdGlvblN0YXRlPSJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlIn0pKEVffHwoRV89e30pKTt2YXIgQ187KGZ1bmN0aW9uKHQpe3QuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsdC5Vc2VGZXRjaGVycz0idXNlRmV0Y2hlcnMiLHQuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIn0pKENffHwoQ189e30pKTtmdW5jdGlvbiBiRCh7ZXJyb3I6dCxyZXNldEVycm9yQm91bmRhcnk6ZX0pe3JldHVybiBjb25zb2xlLmVycm9yKHQpLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIHRvcC0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LXNjcmVlbiBoLXNjcmVlbiBiZy1jYXJkLWZvcmVncm91bmQiLGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCIsY2hpbGRyZW46Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCBiZy1jYXJkIHRleHQtcHJpbWFyeSIsY2hpbGRyZW46W18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLVswLjVlbV0gdGV4dC1sZyBmb250LWJvbGQgdGV4dC1jZW50ZXIgcHktMiIsY2hpbGRyZW46W18uanN4KGtrLHt9KSwiIGVuY291bnRlcmVkIGFuIGVycm9yIl19KSxfLmpzeCgiYnV0dG9uIix7b25DbGljazplLGNoaWxkcmVuOl8uanN4KHU1LHt9KX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtNHhsIGZvbnQtbm9ybWFsICIsY2hpbGRyZW46Ik1lc3NhZ2U6In0pLF8uanN4KCJwcmUiLHtjaGlsZHJlbjp0Lm1lc3NhZ2V9KSx0LnN0YWNrJiZfLmpzeChwRCx7dHlwZToic2luZ2xlIixjbGFzc05hbWU6ImZvbnQtc2VyaWYiLGNvbGxhcHNpYmxlOiEwLGRlZmF1bHRWYWx1ZToiZXJyb3IiLGNoaWxkcmVuOl8uanN4cyh1Yix7dmFsdWU6ImVycm9yIixjaGlsZHJlbjpbXy5qc3goY2Ise2NoaWxkcmVuOiJTdGFjayB0cmFjZToifSksXy5qc3goZGIse2NsYXNzTmFtZToicC00IGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQiLGNoaWxkcmVuOnQuc3RhY2smJl8uanN4KCJwcmUiLHtjaGlsZHJlbjp0LnN0YWNrfSl9KV19KX0pXX0pfSl9KX1mdW5jdGlvbiAkRCgpe2NvbnN0IHQ9Z0QoW3twYXRoOiIvKiIsZWxlbWVudDpfLmpzeChqSSx7ZmFsbGJhY2tSZW5kZXI6YkQsY2hpbGRyZW46Xy5qc3goYkkse2FwaTpuZXcgWk4oIi9hcGkvdmFsIil9KX0pfV0se2Jhc2VuYW1lOiIvYXBpL3ZhbC9zdGF0aWMvZWRpdCJ9KTtyZXR1cm4gXy5qc3goQ0Qse3JvdXRlcjp0fSl9WGguY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIocmUuY3JlYXRlRWxlbWVudChyZS5TdHJpY3RNb2RlLG51bGwscmUuY3JlYXRlRWxlbWVudCgkRCxudWxsKSkpOwo=","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgteXRZamJZc2YuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSIvYXBpL3ZhbC9zdGF0aWMvYXNzZXRzL2luZGV4LWNva3FFajZ1LmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0icm9vdCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=="}`
|
|
21
21
|
);
|
|
22
22
|
function createUIRequestHandler() {
|
|
23
23
|
if (typeof files !== "object") {
|