diff --git a/Documentation.md b/Documentation.md index 5211370..a0f9ff0 100644 --- a/Documentation.md +++ b/Documentation.md @@ -1398,6 +1398,40 @@ Gets the channel context for the contact. For task contacts the channel context } ``` +### `contact.pause()` + +```js +contact.pause({ + success: function () { + /* ... */ + }, + failure: function (err) { + /* ... */ + }, +}); +``` + +Pause a connected contact. + +Optional success and failure callbacks can be provided to determine if the operation was successful. + + +### `contact.resume()` + +```js +contact.resume({ + success: function () { + /* ... */ + }, + failure: function (err) { + /* ... */ + }, +}); +``` + +Resume a paused contact. + +Optional success and failure callbacks can be provided to determine if the operation was successful. ## Connection API diff --git a/package-lock.json b/package-lock.json index 1aa3e41..781ce00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.10.0", + "version": "2.11.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.10.0", + "version": "2.11.0", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", diff --git a/package.json b/package.json index 5bd6e47..5bf9723 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.10.0", + "version": "2.11.0", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 18066f4..0844db5 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49ImNjcCI7dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfTt0LmFnZW50QXBwLmluaXRBcHA9ZnVuY3Rpb24oZSxvLGkscyl7cz1zfHx7fTt2YXIgYT1pLmVuZHNXaXRoKCIvIik/aTppKyIvIixjPXMub25Mb2FkP3Mub25Mb2FkOm51bGwsdT17ZW5kcG9pbnQ6YSxzdHlsZTpzLnN0eWxlLG9uTG9hZDpjfTt0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnJlZ2lzdGVyKGUsdSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvKSksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChlLChmdW5jdGlvbihvKXt2YXIgaT1vLmVuZHBvaW50LGE9by5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITEsYWxsb3dGcmFtZWRWaWRlb0NhbGw6ITB9fSxzPXQubWVyZ2UoaSxvLmNjcFBhcmFtcyk7dC5jb3JlLmluaXRDQ1AobixzKX0oaSxhLHMpKTp0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGUsaSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KG89cihpKSsiL2xvZ291dCIsdC5mZXRjaChvLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9bywhMX0pKSk6bnVsbDt2YXIgb319fSkpfSx0LmFnZW50QXBwLnN0b3BBcHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RvcChlKX19KCl9LDUwMDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuLHI9ImNjcCI7ZS5jb25uZWN0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5PShuPXt9LHtyZWdpc3RlcjpmdW5jdGlvbihlLHQscil7bltlXT17Y29udGFpbmVyRE9NOnIsZW5kcG9pbnQ6dC5lbmRwb2ludCxzdHlsZTp0LnN0eWxlLGluc3RhbmNlOnZvaWQgMCxvbkxvYWQ6dC5vbkxvYWR9fSxzdGFydDpmdW5jdGlvbihlLHQpe2lmKG5bZV0pe3ZhciBvPW5bZV0uY29udGFpbmVyRE9NLGk9bltlXS5lbmRwb2ludCxzPW5bZV0uc3R5bGUsYT1uW2VdLm9uTG9hZDtpZihlIT09cil7dmFyIGM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXQsby5zdHlsZT1ufHwid2lkdGg6IDEwMCU7IGhlaWdodDoxMDAlOyIsby5pZD1lLG9bImFyaWEtbGFiZWwiXT1lLG8ub25sb2FkPXIsby5zZXRBdHRyaWJ1dGUoInNhbmRib3giLCJhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMiKSxvfShlLGkscyxhKTtvLmFwcGVuZENoaWxkKGMpfXJldHVybiBuW2VdLmluc3RhbmNlPXQobltlXSksbltlXS5pbnN0YW5jZS5pbml0KCl9fSxzdG9wOmZ1bmN0aW9uKGUpe2lmKG5bZV0pe3ZhciB0LHI9bltlXSxvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO3JldHVybiByLmNvbnRhaW5lckRPTS5yZW1vdmVDaGlsZChvKSxyLmluc3RhbmNlJiYodD1yLmluc3RhbmNlLmRlc3Ryb3koKSxkZWxldGUgci5pbnN0YW5jZSksdH19fSl9KCl9LDk2NTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQWdlbnRTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsIm9mZmxpbmUiXSksdC5BZ2VudFN0YXR1c1R5cGU9dC5BZ2VudFN0YXRlVHlwZSx0LkFnZW50QXZhaWxTdGF0ZXM9dC5tYWtlRW51bShbIkluaXQiLCJCdXN5IiwiQWZ0ZXJDYWxsV29yayIsIkNhbGxpbmdDdXN0b21lciIsIkRpYWxpbmciLCJKb2luaW5nIiwiUGVuZGluZ0F2YWlsYWJsZSIsIlBlbmRpbmdCdXN5Il0pLHQuQWdlbnRFcnJvclN0YXRlcz10Lm1ha2VFbnVtKFsiRXJyb3IiLCJBZ2VudEh1bmdVcCIsIkJhZEFkZHJlc3NBZ2VudCIsIkJhZEFkZHJlc3NDdXN0b21lciIsIkRlZmF1bHQiLCJGYWlsZWRDb25uZWN0QWdlbnQiLCJGYWlsZWRDb25uZWN0Q3VzdG9tZXIiLCJJbnZhbGlkTG9jYWxlIiwiTGluZUVuZ2FnZWRBZ2VudCIsIkxpbmVFbmdhZ2VkQ3VzdG9tZXIiLCJNaXNzZWRDYWxsQWdlbnQiLCJNaXNzZWRDYWxsQ3VzdG9tZXIiLCJNdWx0aXBsZUNjcFdpbmRvd3MiLCJSZWFsdGltZUNvbW11bmljYXRpb25FcnJvciJdKSx0LkVuZHBvaW50VHlwZT10Lm1ha2VFbnVtKFsicGhvbmVfbnVtYmVyIiwiYWdlbnQiLCJxdWV1ZSJdKSx0LkFkZHJlc3NUeXBlPXQuRW5kcG9pbnRUeXBlLHQuQ29ubmVjdGlvblR5cGU9dC5tYWtlRW51bShbImFnZW50IiwiaW5ib3VuZCIsIm91dGJvdW5kIiwibW9uaXRvcmluZyJdKSx0LkNvbm5lY3Rpb25TdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwiaG9sZCIsImRpc2Nvbm5lY3RlZCIsInNpbGVudF9tb25pdG9yIiwiYmFyZ2UiXSksdC5Db25uZWN0aW9uU3RhdHVzVHlwZT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUsdC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVM9dC5zZXQoW3QuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNURUQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTEQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLlNJTEVOVF9NT05JVE9SLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5CQVJHRV0pLHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNvbnRhY3RTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiZXJyb3IiLCJlbmRlZCJdKSx0LkNvbnRhY3RTdGF0dXNUeXBlPXQuQ29udGFjdFN0YXRlVHlwZSx0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz10Lm1ha2VFbnVtKFsiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSx0LkNvbnRhY3RUeXBlPXQubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siXSksdC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZD10Lm1ha2VFbnVtKFsiaW5ib3VuZCIsIm91dGJvdW5kIiwidHJhbnNmZXIiLCJxdWV1ZV90cmFuc2ZlciIsImNhbGxiYWNrIiwiYXBpIiwiZGlzY29ubmVjdCIsIndlYnJ0Y19hcGkiXSksdC5Nb25pdG9yaW5nTW9kZT10Lm1ha2VFbnVtKFsiU0lMRU5UX01PTklUT1IiLCJCQVJHRSJdKSx0Lk1vbml0b3JpbmdFcnJvclR5cGVzPXQubWFrZUVudW0oWyJpbnZhbGlkX3RhcmdldF9zdGF0ZSJdKSx0LkNoYW5uZWxUeXBlPXQubWFrZUVudW0oWyJWT0lDRSIsIkNIQVQiLCJUQVNLIl0pLHQuTWVkaWFUeXBlPXQubWFrZUVudW0oWyJzb2Z0cGhvbmUiLCJjaGF0IiwidGFzayJdKSx0LlNvZnRwaG9uZUNhbGxUeXBlPXQubWFrZUVudW0oWyJhdWRpb192aWRlbyIsInZpZGVvX29ubHkiLCJhdWRpb19vbmx5Iiwibm9uZSJdKSx0LlNvZnRwaG9uZUVycm9yVHlwZXM9dC5tYWtlRW51bShbInVuc3VwcG9ydGVkX2Jyb3dzZXIiLCJtaWNyb3Bob25lX25vdF9zaGFyZWQiLCJzaWduYWxsaW5nX2hhbmRzaGFrZV9mYWlsdXJlIiwic2lnbmFsbGluZ19jb25uZWN0aW9uX2ZhaWx1cmUiLCJpY2VfY29sbGVjdGlvbl90aW1lb3V0IiwidXNlcl9idXN5X2Vycm9yIiwid2VicnRjX2Vycm9yIiwicmVhbHRpbWVfY29tbXVuaWNhdGlvbl9lcnJvciIsIm90aGVyIl0pLHQuQ2xpY2tUeXBlPXQubWFrZUVudW0oWyJBY2NlcHQiLCJSZWplY3QiLCJIYW5ndXAiXSksdC5Wb2ljZUlkRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsibm9fc3BlYWtlcl9pZF9mb3VuZCIsInNwZWFrZXJfaWRfbm90X2Vucm9sbGVkIiwiZ2V0X3NwZWFrZXJfaWRfZmFpbGVkIiwiZ2V0X3NwZWFrZXJfc3RhdHVzX2ZhaWxlZCIsIm9wdF9vdXRfc3BlYWtlcl9mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfaW5fbGNtc19mYWlsZWQiLCJkZWxldGVfc3BlYWtlcl9mYWlsZWQiLCJzdGFydF9zZXNzaW9uX2ZhaWxlZCIsImV2YWx1YXRlX3NwZWFrZXJfZmFpbGVkIiwic2Vzc2lvbl9ub3RfZXhpc3RzIiwiZGVzY3JpYmVfc2Vzc2lvbl9mYWlsZWQiLCJlbnJvbGxfc3BlYWtlcl9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9pbl9sY21zX2ZhaWxlZCIsIm5vdF9zdXBwb3J0ZWRfb25fY29uZmVyZW5jZV9jYWxscyIsImVucm9sbF9zcGVha2VyX3RpbWVvdXQiLCJldmFsdWF0ZV9zcGVha2VyX3RpbWVvdXQiLCJnZXRfZG9tYWluX2lkX2ZhaWxlZCIsIm5vX2RvbWFpbl9pZF9mb3VuZCJdKSx0LkNUSUV4Y2VwdGlvbnM9dC5tYWtlRW51bShbIkFjY2Vzc0RlbmllZEV4Y2VwdGlvbiIsIkludmFsaWRTdGF0ZUV4Y2VwdGlvbiIsIkJhZEVuZHBvaW50RXhjZXB0aW9uIiwiSW52YWxpZEFnZW50QVJORXhjZXB0aW9uIiwiSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24iLCJJbnZhbGlkQ29udGFjdFR5cGVFeGNlcHRpb24iLCJQYWdpbmF0aW9uRXhjZXB0aW9uIiwiUmVmcmVzaFRva2VuRXhwaXJlZEV4Y2VwdGlvbiIsIlNlbmREYXRhRmFpbGVkRXhjZXB0aW9uIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiUXVvdGFFeGNlZWRlZEV4Y2VwdGlvbiJdKSx0LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXM9dC5tYWtlRW51bShbIk9OR09JTkciLCJFTkRFRCIsIlBFTkRJTkdfQ09ORklHVVJBVElPTiJdKSx0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBQ0NFUFQiLCJSRUpFQ1QiLCJOT1RfRU5PVUdIX1NQRUVDSCIsIlNQRUFLRVJfTk9UX0VOUk9MTEVEIiwiU1BFQUtFUl9PUFRFRF9PVVQiLCJTUEVBS0VSX0lEX05PVF9QUk9WSURFRCIsIlNQRUFLRVJfRVhQSVJFRCJdKSx0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJOT1RfRU5PVUdIX1NQRUVDSCIsIkhJR0hfUklTSyIsIkxPV19SSVNLIl0pLHQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBdXRoZW50aWNhdGVkIiwiTm90QXV0aGVudGljYXRlZCIsIkluY29uY2x1c2l2ZSIsIk5vdEVucm9sbGVkIiwiT3B0ZWRPdXQiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkhpZ2hSaXNrIiwiTG93UmlzayIsIkluY29uY2x1c2l2ZSIsIk5vdEVuYWJsZWQiLCJFcnJvciJdKSx0LlZpZGVvQ2FwYWJpbGl0eT10Lm1ha2VFbnVtKFsiU0VORCJdKSx0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cz10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJJTl9QUk9HUkVTUyIsIkNPTVBMRVRFRCIsIkZBSUxFRCJdKSx0LlZvaWNlSWRTcGVha2VyU3RhdHVzPXQubWFrZUVudW0oWyJPUFRFRF9PVVQiLCJFTlJPTExFRCIsIlBFTkRJTkciXSksdC5Wb2ljZUlkQ29uc3RhbnRzPXtFVkFMVUFURV9TRVNTSU9OX0RFTEFZOjFlNCxFVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTOjI0LEVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTDo1ZTMsRU5ST0xMTUVOVF9NQVhfUE9MTF9USU1FUzoxMjAsRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMOjVlMyxTVEFSVF9TRVNTSU9OX0RFTEFZOjhlM30sdC5BZ2VudFBlcm1pc3Npb25zPXtPVVRCT1VORF9DQUxMOiJvdXRib3VuZENhbGwiLFZPSUNFX0lEOiJ2b2ljZUlkIn07dmFyIG49ZnVuY3Rpb24oKXtpZighdC5hZ2VudC5pbml0aWFsaXplZCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgYWdlbnQgaXMgbm90IHlldCBpbml0aWFsaXplZCEiKX07bi5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCl9LG4ucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0sbi5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlJFRlJFU0gsZSl9LG4ucHJvdG90eXBlLm9uUm91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUk9VVEFCTEUsZSl9LG4ucHJvdG90eXBlLm9uTm90Um91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFLGUpfSxuLnByb3RvdHlwZS5vbk9mZmxpbmU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuT0ZGTElORSxlKX0sbi5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FUlJPUixlKX0sbi5wcm90b3R5cGUub25Tb2Z0cGhvbmVFcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TT0ZUUEhPTkVfRVJST1IsZSl9LG4ucHJvdG90eXBlLm9uV2ViU29ja2V0Q29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKX0sbi5wcm90b3R5cGUub25XZWJTb2NrZXRDb25uZWN0aW9uR2FpbmVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCxlKX0sbi5wcm90b3R5cGUub25BZnRlckNhbGxXb3JrPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkFDVyxlKX0sbi5wcm90b3R5cGUub25TdGF0ZUNoYW5nZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0UsZSl9LG4ucHJvdG90eXBlLm9uTXV0ZVRvZ2dsZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZSl9LG4ucHJvdG90eXBlLm9uTG9jYWxNZWRpYVN0cmVhbUNyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkFnZW50RXZlbnRzLkxPQ0FMX01FRElBX1NUUkVBTV9DUkVBVEVELGUpfSxuLnByb3RvdHlwZS5vblNwZWFrZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uTWljcm9waG9uZURldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25SaW5nZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlJJTkdFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25DYW1lcmFEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkNBTUVSQV9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25CYWNrZ3JvdW5kQmx1ckNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQkFDS0dST1VORF9CTFVSX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm11dGU9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFLGRhdGE6e211dGU6ITB9fSl9LG4ucHJvdG90eXBlLnVubXV0ZT1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEUsZGF0YTp7bXV0ZTohMX19KX0sbi5wcm90b3R5cGUuc2V0U3BlYWtlckRldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldE1pY3JvcGhvbmVEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRSaW5nZXJEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9SSU5HRVJfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldENhbWVyYURldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ0FNRVJBX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldEJhY2tncm91bmRCbHVyPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5CQUNLR1JPVU5EX0JMVVJfQ0hBTkdFRCxkYXRhOntpc0JhY2tncm91bmRCbHVyRW5hYmxlZDplfX0pfSxuLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGV9LG4ucHJvdG90eXBlLmdldE5leHRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QubmV4dFN0YXRlfSxuLnByb3RvdHlwZS5nZXRBdmFpbGFiaWxpdHlTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0U3RhdHVzPW4ucHJvdG90eXBlLmdldFN0YXRlLG4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGUuc3RhcnRUaW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG4ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sbi5wcm90b3R5cGUuZ2V0UGVybWlzc2lvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucGVybWlzc2lvbnN9LG4ucHJvdG90eXBlLmdldENvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5jb250YWN0cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9jcmVhdGVDb250YWN0QVBJKGUpfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIWV8fHQuZ2V0VHlwZSgpPT09ZX0pKX0sbi5wcm90b3R5cGUuZ2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29uZmlndXJhdGlvbn0sbi5wcm90b3R5cGUuZ2V0QWdlbnRTdGF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuYWdlbnRTdGF0ZXN9LG4ucHJvdG90eXBlLmdldFJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlfSxuLnByb3RvdHlwZS5nZXRDaGFubmVsQ29uY3VycmVuY3k9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmNoYW5uZWxDb25jdXJyZW5jeU1hcDtyZXR1cm4gbnx8KG49T2JqZWN0LmtleXModC5DaGFubmVsVHlwZSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiJUQVNLIiE9PW4mJihlW3QuQ2hhbm5lbFR5cGVbbl1dPTEpLGV9KSx7fSkpLGU/bltlXXx8MDpufSxuLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLm5hbWV9LG4ucHJvdG90eXBlLmdldEV4dGVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5leHRlbnNpb259LG4ucHJvdG90eXBlLmdldERpYWxhYmxlQ291bnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmRpYWxhYmxlQ291bnRyaWVzfSxuLnByb3RvdHlwZS5pc1NvZnRwaG9uZUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lRW5hYmxlZH0sbi5wcm90b3R5cGUuc2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtlJiZlLmFnZW50UHJlZmVyZW5jZXMmJmUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSYmIWUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUmJihlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlPWUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSksZSYmZS5hZ2VudFByZWZlcmVuY2VzJiYhdC5pc1ZhbGlkTG9jYWxlKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUpP24mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuQWdlbnRFcnJvclN0YXRlcy5JTlZBTElEX0xPQ0FMRSk6ci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfQUdFTlRfQ09ORklHVVJBVElPTix7Y29uZmlndXJhdGlvbjp0LmFzc2VydE5vdE51bGwoZSwiY29uZmlndXJhdGlvbiIpfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04pLG4uc3VjY2VzcyYmbi5zdWNjZXNzKGUpfSxmYWlsdXJlOm4mJm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlBVVF9BR0VOVF9TVEFURSx7c3RhdGU6dC5hc3NlcnROb3ROdWxsKGUsInN0YXRlIiksZW5xdWV1ZU5leHRTdGF0ZTpyJiYhIXIuZW5xdWV1ZU5leHRTdGF0ZX0sbil9LG4ucHJvdG90eXBlLm9uRW5xdWV1ZWROZXh0U3RhdGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxlKX0sbi5wcm90b3R5cGUuc2V0U3RhdHVzPW4ucHJvdG90eXBlLnNldFN0YXRlLG4ucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX09VVEJPVU5EX0NPTlRBQ1Qse2VuZHBvaW50OnQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLHF1ZXVlQVJOOm4mJihuLnF1ZXVlQVJOfHxuLnF1ZXVlSWQpfHx0aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk59LG4mJntzdWNjZXNzOm4uc3VjY2VzcyxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBbGxRdWV1ZUFSTnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucm91dGluZ1Byb2ZpbGUucXVldWVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucXVldWVBUk59KSl9LG4ucHJvdG90eXBlLmdldEVuZHBvaW50cz1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuY29yZS5nZXRDbGllbnQoKTt0LmFzc2VydE5vdE51bGwobiwiY2FsbGJhY2tzIiksdC5hc3NlcnROb3ROdWxsKG4uc3VjY2VzcywiY2FsbGJhY2tzLnN1Y2Nlc3MiKTt2YXIgcz1yfHx7fTtzLmVuZHBvaW50cz1zLmVuZHBvaW50c3x8W10scy5tYXhSZXN1bHRzPXMubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdC5pc0FycmF5KGUpfHwoZT1bZV0pLGkuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0VORFBPSU5UUyx7cXVldWVBUk5zOmUsbmV4dFRva2VuOnMubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6cy5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbihyKXtpZihyLm5leHRUb2tlbilvLmdldEVuZHBvaW50cyhlLG4se25leHRUb2tlbjpyLm5leHRUb2tlbixtYXhSZXN1bHRzOnMubWF4UmVzdWx0cyxlbmRwb2ludHM6cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKX0pO2Vsc2V7cy5lbmRwb2ludHM9cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKTt2YXIgaT1zLmVuZHBvaW50cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5FbmRwb2ludChlKX0pKTtuLnN1Y2Nlc3Moe2VuZHBvaW50czppLGFkZHJlc3NlczppfSl9fSxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBZGRyZXNzZXM9bi5wcm90b3R5cGUuZ2V0RW5kcG9pbnRzLG4ucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRBbGxRdWV1ZUFSTnMoKTtmb3IobGV0IHQgb2YgZSl7Y29uc3QgZT10Lm1hdGNoKC9cL2FnZW50XC8oW14vXSspLyk7aWYoZSlyZXR1cm4gZVsxXX1yZXR1cm4gbmV3IEVycm9yKCJBZ2VudC5wcm90b3R5cGUuX2dldFJlc291cmNlSWQ6IHF1ZXVlQXJucyBkaWQgbm90IGNvbnRhaW4gYWdlbnRSZXNvdXJjZUlkOiAiLGUpfSxuLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkFnZW50U25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX07dmFyIHI9ZnVuY3Rpb24oZSl7dC5BZ2VudC5jYWxsKHRoaXMpLHRoaXMuYWdlbnREYXRhPWV9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50RGF0YX0sci5wcm90b3R5cGUuX2NyZWF0ZUNvbnRhY3RBUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKX07dmFyIG89ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07by5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCk6dGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCl9LG8ucHJvdG90eXBlLmdldEV2ZW50TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUoZSx0aGlzLmdldENvbnRhY3RJZCgpKX0sby5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCksZSl9LG8ucHJvdG90eXBlLm9uSW5jb21pbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5JTkNPTUlORyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGluZz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLGUpfSxvLnByb3RvdHlwZS5vblBlbmRpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKSxlKX0sby5wcm90b3R5cGUub25BY2NlcHRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSxlKX0sby5wcm90b3R5cGUub25NaXNzZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLGUpfSxvLnByb3RvdHlwZS5vbkVuZGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRU5ERUQpLGUpfSxvLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQpLGUpfSxvLnByb3RvdHlwZS5vbkFDVz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDVyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKSxlKX0sby5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkVSUk9SKSxlKX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxvLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbENvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbnRhY3RJZD1vLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZCxvLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxvLnByb3RvdHlwZS5nZXRDb250YWN0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbnRhY3REdXJhdGlvbn0sby5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxvLnByb3RvdHlwZS5nZXRTdGF0dXM9by5wcm90b3R5cGUuZ2V0U3RhdGUsby5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG8ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sby5wcm90b3R5cGUuZ2V0UXVldWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlfSxvLnByb3RvdHlwZS5nZXRRdWV1ZVRpbWVzdGFtcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVldWVUaW1lc3RhbXB9LG8ucHJvdG90eXBlLmdldENvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbm5lY3Rpb25zLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5DSEFUP25ldyB0LkNoYXRDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKTplLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuVEFTSz9uZXcgdC5UYXNrQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6bmV3IHQuVm9pY2VDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKX0pKX0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNJbml0aWFsQ29ubmVjdGlvbigpfSkpfHxudWxsfSxvLnByb3RvdHlwZS5nZXRBY3RpdmVJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gbnVsbCE9ZSYmZS5pc0FjdGl2ZSgpP2U6bnVsbH0sby5wcm90b3R5cGUuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzSW5pdGlhbENvbm5lY3Rpb24oKSYmZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfSkpfSxvLnByb3RvdHlwZS5nZXRTaW5nbGVBY3RpdmVUaGlyZFBhcnR5Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKVswXXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWdlbnRDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0VHlwZSgpO3JldHVybiBuPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8bj09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30pKX0sby5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubmFtZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdE1ldGFkYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0TWV0YWRhdGF9LG8ucHJvdG90eXBlLmdldERlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5kZXNjcmlwdGlvbn0sby5wcm90b3R5cGUuZ2V0UmVmZXJlbmNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucmVmZXJlbmNlc30sby5wcm90b3R5cGUuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuYXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdEZlYXR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RmVhdHVyZXN9LG8ucHJvdG90eXBlLmdldENoYW5uZWxDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jaGFubmVsQ29udGV4dH0sby5wcm90b3R5cGUuZ2V0U2VnbWVudEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNlZ21lbnRBdHRyaWJ1dGVzfSxvLnByb3RvdHlwZS5nZXRDb250YWN0U3VidHlwZT1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRTZWdtZW50QXR0cmlidXRlcygpO3JldHVybiBlJiZlWyJjb25uZWN0OlN1YnR5cGUiXT9lWyJjb25uZWN0OlN1YnR5cGUiXS5WYWx1ZVN0cmluZzpudWxsfSxvLnByb3RvdHlwZS5pc1NvZnRwaG9uZUNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuZ2V0U29mdHBob25lTWVkaWFJbmZvKCl9KSl9LG8ucHJvdG90eXBlLmhhc1ZpZGVvUlRDQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKX0pKX0sby5wcm90b3R5cGUuY2FuQWdlbnRTZW5kVmlkZW89ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0QWdlbnRDb25uZWN0aW9uKCk7cmV0dXJuIGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpfSxvLnByb3RvdHlwZS5jYW5BZ2VudFJlY2VpdmVWaWRlbz1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO2lmKGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpKXJldHVybiEwO2NvbnN0IHQ9dGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKTtyZXR1cm4gdCYmdC5sZW5ndGg+MCYmdGhpcy5jYW5BZ2VudFNlbmRWaWRlbygpfSxvLnByb3RvdHlwZS5faXNJbmJvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWF0aW9uTWV0aG9kIT09dC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZC5PVVRCT1VORH0sby5wcm90b3R5cGUuaXNJbmJvdW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO3JldHVybiBlLmdldE1lZGlhVHlwZSgpPT09dC5NZWRpYVR5cGUuVEFTSz90aGlzLl9pc0luYm91bmQoKTohIWUmJmUuZ2V0VHlwZSgpPT09dC5Db25uZWN0aW9uVHlwZS5JTkJPVU5EfSxvLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVEfSxvLnByb3RvdHlwZS5hY2NlcHQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9dGhpcyxvPXRoaXMuZ2V0Q29udGFjdElkKCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuQUNDRVBULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLkFDQ0VQVF9DT05UQUNULHtjb250YWN0SWQ6b30se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9dC5jb3JlLmdldFVwc3RyZWFtKCk7aS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZGF0YTpuZXcgdC5Db250YWN0KG8pfSksaS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsci5nZXRDb250YWN0SWQoKSksZGF0YTpuZXcgdC5Db250YWN0KG8pfSk7dmFyIHM9bmV3IHQuQ29udGFjdChvKTt0LmlzRmlyZWZveEJyb3dzZXIoKSYmcy5pc1NvZnRwaG9uZUNhbGwoKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKSxlJiZlLnN1Y2Nlc3MmJmUuc3VjY2VzcyhuKX0sZmFpbHVyZTpmdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuZXJyb3IoIkFjY2VwdCBDb250YWN0IGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aEV4Y2VwdGlvbihuKS53aXRoT2JqZWN0KHtkYXRhOnJ9KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbnRhY3RBY2NlcHRGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pLGUmJmUuZmFpbHVyZSYmZS5mYWlsdXJlKHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUil9fSl9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LmdldExvZygpLndhcm4oImNvbnRhY3QuZGVzdHJveSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9LG8ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuUkVKRUNULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLlJFSkVDVF9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT01QTEVURV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DTEVBUl9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLm5vdGlmeUlzc3VlPWZ1bmN0aW9uKGUsbixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTk9USUZZX0NPTlRBQ1RfSVNTVUUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGlzc3VlQ29kZTplLGRlc2NyaXB0aW9uOm59LHIpfSxvLnByb3RvdHlwZS5hZGRDb25uZWN0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89bmV3IHQuRW5kcG9pbnQoZSk7ZGVsZXRlIG8uZW5kcG9pbnRJZCxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9BRERJVElPTkFMX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGVuZHBvaW50Om99LG4pfSxvLnByb3RvdHlwZS50b2dnbGVBY3RpdmVDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCkscj1udWxsLG89dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xEfSkpO2lmKG51bGwhPW8pcj1vLmdldENvbm5lY3Rpb25JZCgpO2Vsc2V7dmFyIGk9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKTtpLmxlbmd0aD4wJiYocj1pWzBdLmdldENvbm5lY3Rpb25JZCgpKX1uLmNhbGwodC5DbGllbnRNZXRob2RzLlRPR0dMRV9BQ1RJVkVfQ09OTkVDVElPTlMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDpyfSxlKX0sby5wcm90b3R5cGUuc2VuZFNvZnRwaG9uZU1ldHJpY3M9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOm59LHIpLHQucHVibGlzaFNvZnRwaG9uZVN0YXRzKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzdGF0czpufSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHJlcG9ydDpufSxyKX0sby5wcm90b3R5cGUuY29uZmVyZW5jZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT05GRVJFTkNFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQ29udGFjdFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9LG8ucHJvdG90eXBlLmlzTXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250YWN0RmVhdHVyZXMoKTtyZXR1cm4hKCFlfHwhZS5tdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQpfSxvLnByb3RvdHlwZS51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZT1mdW5jdGlvbihlLG4pe2UmJk9iamVjdC52YWx1ZXModC5Nb25pdG9yaW5nTW9kZSkuaW5jbHVkZXMoZS50b1VwcGVyQ2FzZSgpKT90LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVVBEQVRFX01PTklUT1JfUEFSVElDSVBBTlRfU1RBVEUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLHRhcmdldE1vbml0b3JNb2RlOmUudG9VcHBlckNhc2UoKX0sbik6KHQuZ2V0TG9nKCkuZXJyb3IoYEludmFsaWQgdGFyZ2V0IHN0YXRlIHdhcyBwcm92aWRlZDogJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbiYmbi5mYWlsdXJlJiZuLmZhaWx1cmUodC5Nb25pdG9yaW5nRXJyb3JUeXBlcy5JTlZBTElEX1RBUkdFVF9TVEFURSkpfSxvLnByb3RvdHlwZS5pc1VuZGVyU3VwZXJ2aXNpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChlPT5lLmdldFR5cGUoKSE9PXQuQ29ubmVjdGlvblR5cGUuQUdFTlQpKTtyZXR1cm4gdm9pZCAwIT09KGUmJmUuZmluZCgoZT0+ZS5pc0JhcmdlKCkmJmUuaXNBY3RpdmUoKSkpKX07dmFyIGk9ZnVuY3Rpb24oZSl7dC5Db250YWN0LmNhbGwodGhpcyxlLmNvbnRhY3RJZCksdGhpcy5jb250YWN0RGF0YT1lfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0RGF0YX0saS5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdChlKX07dmFyIHM9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbnRhY3RJZD1lLHRoaXMuY29ubmVjdGlvbklkPXQsdGhpcy5faW5pdE1lZGlhQ29udHJvbGxlcigpfTtzLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb25uZWN0aW9uRGF0YSh0aGlzLmdldENvbnRhY3RJZCgpLHRoaXMuZ2V0Q29ubmVjdGlvbklkKCkpfSxzLnByb3RvdHlwZS5nZXRDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0SWR9LHMucHJvdG90eXBlLmdldENvbm5lY3Rpb25JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JZH0scy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQodGhpcy5fZ2V0RGF0YSgpLmVuZHBvaW50KX0scy5wcm90b3R5cGUuZ2V0QWRkcmVzcz1zLnByb3RvdHlwZS5nZXRFbmRwb2ludCxzLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc3RhdGV9LHMucHJvdG90eXBlLmdldFN0YXR1cz1zLnByb3RvdHlwZS5nZXRTdGF0ZSxzLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0scy5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249cy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixzLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxzLnByb3RvdHlwZS5pc0luaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWFsfSxzLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0NPTk5FQ1RFRF9TVEFURVMsdGhpcy5nZXRTdGF0dXMoKS50eXBlKX0scy5wcm90b3R5cGUuaXNDb25uZWN0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HfSxzLnByb3RvdHlwZS5pc09uSG9sZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0scy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LHMucHJvdG90eXBlLmdldE1vbml0b3JJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yaW5nSW5mb30scy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5IQU5HVVAsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLHQuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5ERVNUUk9ZX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUuc2VuZERpZ2l0cz1mdW5jdGlvbihlLG4pe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0RJR0lUUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCksZGlnaXRzOmV9LG4pfSxzLnByb3RvdHlwZS5ob2xkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5IT0xEX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRVNVTUVfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxzLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxzLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3RoaXMuZ2V0TWVkaWFJbmZvKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR307dmFyIGE9ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07YS5wcm90b3R5cGUuZ2V0U3BlYWtlcklkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2NvbnN0IGk9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxhd3NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCl9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlcklkIGNhbGxlZCIpLndpdGhPYmplY3QoaSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuR0VUX0NPTlRBQ1QsaSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZihlLmNvbnRhY3REYXRhLmN1c3RvbWVySWQpe3ZhciBuPXtzcGVha2VySWQ6ZS5jb250YWN0RGF0YS5jdXN0b21lcklkfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX1lbHNle3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fU1BFQUtFUl9JRF9GT1VORCwiTm8gc3BlYWtlcklkIGFzc290aWF0ZWQgd2l0aCB0aGlzIGNhbGwiKTtvKGkpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJHZXQgU3BlYWtlcklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9TUEVBS0VSX0lEX0ZBSUxFRCwiR2V0IFNwZWFrZXJJZCBmYWlsZWQiLGUpO28obil9fSl9KSl9LGEucHJvdG90eXBlLmdldFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VyU3RhdHVzIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVTQ1JJQkVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbj1KU09OLnBhcnNlKGUpO3N3aXRjaChuLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6dmFyIGk9bjtpLnR5cGU9aS50eXBlP2kudHlwZTp0LlZvaWNlSWRFcnJvclR5cGVzLlNQRUFLRVJfSURfTk9UX0VOUk9MTEVELHQuZ2V0TG9nKCkuaW5mbygiU3BlYWtlciBpcyBub3QgZW5yb2xsZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGkpO2JyZWFrO2RlZmF1bHQ6dC5nZXRMb2coKS5lcnJvcigiZ2V0U3BlYWtlclN0YXR1cyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9TVEFUVVNfRkFJTEVELCJHZXQgU3BlYWtlclN0YXR1cyBmYWlsZWQiLGUpO28ocyl9fX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5fb3B0T3V0U3BlYWtlckluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7U3BlYWtlck9wdGVkT3V0OiEwLGdlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfb3B0T3V0U3BlYWtlckluTGNtcyBjYWxsZWQiKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9WT0lDRV9JRF9EQVRBLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VySW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIm9wdE91dFNwZWFrZXJJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuT1BUX09VVF9TUEVBS0VSX0lOX0xDTVNfRkFJTEVELCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUub3B0T3V0U3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihzKXt2YXIgYT1pLnNwZWFrZXJJZDtjb25zdCBjPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGEsInNwZWFrZXJJZCIpLERvbWFpbklkOnN9O3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLk9QVF9PVVRfU1BFQUtFUixjLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2UuX29wdE91dFNwZWFrZXJJbkxjbXMoYSxuLmdlbmVyYXRlZFNwZWFrZXJJZCkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpLHQuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9GQUlMRUQsIm9wdE91dFNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZGVsZXRlU3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGkuc3BlYWtlcklkLCJzcGVha2VySWQiKSxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERUxFVEVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZGVsZXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZWxldGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkRFTEVURV9TUEVBS0VSX0ZBSUxFRCwiZGVsZXRlU3BlYWtlciBmYWlsZWQuIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5zdGFydFNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2NvbnN0IHM9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxjdXN0b21lckFjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKSxjbGllbnRUb2tlbjpBV1MudXRpbC51dWlkLnY0KCksZG9tYWluSWQ6aX07dC5nZXRMb2coKS5pbmZvKCJzdGFydFNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5TVEFSVF9WT0lDRV9JRF9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5zZXNzaW9uSWQpcihlKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkLCBubyBzZXNzaW9uIGlkIHJldHVybmVkIikud2l0aE9iamVjdCh7ZGF0YTplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJObyBzZXNzaW9uIGlkIHJldHVybmVkIGZyb20gc3RhcnQgc2Vzc2lvbiBhcGkiKTtvKG4pfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLGk9MDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHMsYSl7ZnVuY3Rpb24gYygpe24uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCB1PXtTZXNzaW9uTmFtZU9ySWQ6by5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KHUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVWQUxVQVRFX1NFU1NJT04sdSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZigrK2k8dC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fTUFYX1BPTExfVElNRVMpaWYoZS5TdHJlYW1pbmdTdGF0dXM9PT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuUEVORElOR19DT05GSUdVUkFUSU9OKXNldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKTtlbHNle2lmKGUuQXV0aGVudGljYXRpb25SZXN1bHR8fChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0PXt9LGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLGUuRnJhdWREZXRlY3Rpb25SZXN1bHR8fChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0PXt9LGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLCFuLmlzQXV0aEVuYWJsZWQoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJiFuLmlzRnJhdWRFbmFibGVkKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLkVOREVEJiYobi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRSksbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpKSxuLmlzQXV0aFJlc3VsdEluY29uY2x1c2l2ZShlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pKXN3aXRjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKXtjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uQUNDRVBUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uQVVUSEVOVElDQVRFRDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uUkVKRUNUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0FVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlNQRUFLRVJfT1BURURfT1VUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uT1BURURfT1VUO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX05PVF9FTlJPTExFRDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTlJPTExFRDticmVhaztkZWZhdWx0OmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzticmVhaztjYXNlIHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5MT1dfUklTSzticmVhaztkZWZhdWx0OmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKX1lbHNle3QuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfVElNRU9VVCwiZXZhbHVhdGVTcGVha2VyIHRpbWVvdXQiKTthKHIpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbjtzd2l0Y2goSlNPTi5wYXJzZShlKS5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TRVNTSU9OX05PVF9FWElTVFMsImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2JyZWFrO2RlZmF1bHQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfRkFJTEVELCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWEobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2EoZSl9KSl9ZT9uLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVEVfU0VTU0lPTl9ERUxBWSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0U2Vzc2lvbiBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PXRydWUiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYShlKX0pKTpuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe2MoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3luY1NwZWFrZXJJZCBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PWZhbHNlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlc2NyaWJlU2Vzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTZXNzaW9uTmFtZU9ySWQ6ci5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlc2NyaWJlU2Vzc2lvbiBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NFU1NJT04scyx7c3VjY2VzczpmdW5jdGlvbihlKXtvKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERVNDUklCRV9TRVNTSU9OX0ZBSUxFRCwiZGVzY3JpYmVTZXNzaW9uIGZhaWxlZCIsZSk7aShuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aShlKX0pKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tFbnJvbGxtZW50U3RhdHVzPWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiY2hlY2tFbnJvbGxtZW50U3RhdHVzIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcyxyPTAsbz0hMTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7IWZ1bmN0aW9uIGEoKXtpZigrK3I8dC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVMpbi5kZXNjcmliZVNlc3Npb24oKS50aGVuKChmdW5jdGlvbihyKXtzd2l0Y2goci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5TdGF0dXMpe2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEOmkocik7YnJlYWs7Y2FzZSB0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5JTl9QUk9HUkVTUzpvfHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KGUociksbz0hMCksc2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuTk9UX0VOT1VHSF9TUEVFQ0g6ci5TZXNzaW9uLlN0cmVhbWluZ1N0YXR1cyE9PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRD9zZXRUaW1lb3V0KGEsdC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTCk6c2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe2EoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSx0KXtzKGUpfSkpfSksdC5Wb2ljZUlkQ29uc3RhbnRzLlNUQVJUX1NFU1NJT05fREVMQVkpO2JyZWFrO2RlZmF1bHQ6dmFyIGM9ci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5NZXNzYWdlP3IuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZToiZW5yb2xsU3BlYWtlciBmYWlsZWQuIFVua25vd24gZW5yb2xsbWVudCBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQiO3QuZ2V0TG9nKCkuZXJyb3IoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgdT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCxjLHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKTtzKHUpfX0pKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9USU1FT1VULCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKTtzKGMpfX0oKX0pKX0sYS5wcm90b3R5cGUuZW5yb2xsU3BlYWtlcj1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10aGlzO3JldHVybiBuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe24uZ2V0U3BlYWtlclN0YXR1cygpLnRoZW4oKGZ1bmN0aW9uKGkpe2kuU3BlYWtlciYmaS5TcGVha2VyLlN0YXR1cz09dC5Wb2ljZUlkU3BlYWtlclN0YXR1cy5PUFRFRF9PVVQ/bi5kZWxldGVTcGVha2VyKCkudGhlbigoZnVuY3Rpb24oKXtuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpOm4uZW5yb2xsU3BlYWtlckhlbHBlcihyLG8sZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXJIZWxwZXI9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCkscz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7by5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpzLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLERvbWFpbklkOmF9O3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlckhlbHBlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVOUk9MTF9CWV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24oaSl7aS5TdGF0dXM9PT10LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5DT01QTEVURUQ/KHQuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShpKSk6by5jaGVja0Vucm9sbG1lbnRTdGF0dXMocikudGhlbigoZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qobikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKG4pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfRkFJTEVELCJlbnJvbGxTcGVha2VyIGZhaWxlZCIsZSk7bihyKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sYS5wcm90b3R5cGUuX3VwZGF0ZVNwZWFrZXJJZEluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7Z2VuZXJhdGVkU3BlYWtlcklkOm59fTt0LmdldExvZygpLmluZm8oIl91cGRhdGVTcGVha2VySWRJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9JTl9MQ01TX0ZBSUxFRCwidXBkYXRlU3BlYWtlcklkSW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oYSl7Y29uc3QgYz17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsU3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChlLCJzcGVha2VySWQiKSxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPXImJnIuU2Vzc2lvbiYmci5TZXNzaW9uLkdlbmVyYXRlZFNwZWFrZXJJZDtuLl91cGRhdGVTcGVha2VySWRJbkxjbXMoZSxvKS50aGVuKChmdW5jdGlvbigpe2kocil9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9cyhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cyhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3luY1NwZWFrZXJJZD1mdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygic3luY1NwZWFrZXJJZCBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24ocil7ZS51cGRhdGVTcGVha2VySWRJblZvaWNlSWQoci5zcGVha2VySWQpLnRoZW4oKGZ1bmN0aW9uKGUpe3QoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSl9LGEucHJvdG90eXBlLmdldERvbWFpbklkPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe2lmKChuZXcgdC5BZ2VudCkuZ2V0UGVybWlzc2lvbnMoKS5pbmNsdWRlcyh0LkFnZW50UGVybWlzc2lvbnMuVk9JQ0VfSUQpKWlmKHQuY29yZS52b2ljZUlkRG9tYWluSWQpZSh0LmNvcmUudm9pY2VJZERvbWFpbklkKTtlbHNle3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtjb25zdCBvPXtJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxJbnRlZ3JhdGlvblR5cGU6IlZPSUNFX0lEIn07dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBjYWxsZWQiKS53aXRoT2JqZWN0KG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkxJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TLG8se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dHJ5e3ZhciBvO2lmKHIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0Lmxlbmd0aD49MSYmKG89ci5JbnRlZ3JhdGlvbkFzc29jaWF0aW9uU3VtbWFyeUxpc3RbMF0uSW50ZWdyYXRpb25Bcm4ucmVwbGFjZSgvXi4qZG9tYWluXC8vaSwiIikpLCFvKXt0LmdldExvZygpLmluZm8oImdldERvbWFpbklkOiBubyBkb21haW5JZCBmb3VuZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGk9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5OT19ET01BSU5fSURfRk9VTkQpO3JldHVybiB2b2lkIG4oaSl9dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsZGF0YTp7ZG9tYWluSWQ6b319KSxlKG8pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSksbihpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZ2V0RG9tYWluSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSk7bihyKX19KX1lbHNlIG4obmV3IEVycm9yKCJBZ2VudCBkb2Vzbid0IGhhdmUgdGhlIHBlcm1pc3Npb24gZm9yIFZvaWNlIElEIikpfSkpfSxhLnByb3RvdHlwZS5jaGVja0NvbmZlcmVuY2VDYWxsPWZ1bmN0aW9uKCl7aWYodC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLmNvbm5lY3Rpb25zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVMsZS5zdGF0ZS50eXBlKX0pKS5sZW5ndGg+Mil0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCJWb2ljZUlkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbmZlcmVuY2UgY2FsbHMiKX0sYS5wcm90b3R5cGUuaXNBdXRoRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkV9LGEucHJvdG90eXBlLmlzRnJhdWRFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUR9LGEucHJvdG90eXBlLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfTt2YXIgYz1mdW5jdGlvbihlLHQpe3RoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yPW5ldyBhKGUpLHMuY2FsbCh0aGlzLGUsdCl9OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXRTb2Z0cGhvbmVNZWRpYUluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNvZnRwaG9uZU1lZGlhSW5mb30sYy5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5TT0ZUUEhPTkV9LGMucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5nZXRTcGVha2VySWQoKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlclN0YXR1cygpfSxjLnByb3RvdHlwZS5vcHRPdXRWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5vcHRPdXRTcGVha2VyKCl9LGMucHJvdG90eXBlLmRlbGV0ZVZvaWNlSWRTcGVha2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmRlbGV0ZVNwZWFrZXIoKX0sYy5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyV2l0aFZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmV2YWx1YXRlU3BlYWtlcihlKX0sYy5wcm90b3R5cGUuZW5yb2xsU3BlYWtlckluVm9pY2VJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZW5yb2xsU3BlYWtlcihlKX0sYy5wcm90b3R5cGUudXBkYXRlVm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKGUpfSxjLnByb3RvdHlwZS5nZXRRdWlja0Nvbm5lY3ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWlja0Nvbm5lY3ROYW1lfSxjLnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SfSxjLnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sYy5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yU3RhdHVzfSxjLnByb3RvdHlwZS5pc011dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm11dGV9LGMucHJvdG90eXBlLmlzRm9yY2VkTXV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZm9yY2VkTXV0ZX0sYy5wcm90b3R5cGUubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLnVubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VTk1VVEVfUEFSVElDSVBBTlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0sYy5wcm90b3R5cGUuY2FuU2VuZFZpZGVvPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmdldENhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLlZpZGVvPT09dC5WaWRlb0NhcGFiaWxpdHkuU0VORH0sYy5wcm90b3R5cGUuZ2V0Q2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jYXBhYmlsaXRpZXN9LGMucHJvdG90eXBlLmdldFZpZGVvQ29ubmVjdGlvbkluZm89ZnVuY3Rpb24oKXtjb25zdCBlPXQuY29yZS5nZXRDbGllbnQoKSxuPXt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLldFQl9SVEMsY29udGFjdElkOnRoaXMuY29udGFjdElkfTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULG4se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRWaWRlb0Nvbm5lY3Rpb25JbmZvIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlLndlYlJUQ1RyYW5zcG9ydCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRWaWRlb0Nvbm5lY3Rpb25JbmZvIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksbyhFcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKSl9fSl9KSl9O3ZhciB1PWZ1bmN0aW9uKGUsdCl7cy5jYWxsKHRoaXMsZSx0KX07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldERhdGEoKS5jaGF0TWVkaWFJbmZvO2lmKGUpe3ZhciBuPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSxyPXtjb250YWN0SWQ6dGhpcy5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDpuLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsZ2V0Q29ubmVjdGlvblRva2VuOnQuaGl0Y2godGhpcyx0aGlzLmdldENvbm5lY3Rpb25Ub2tlbil9O2lmKGUuY29ubmVjdGlvbkRhdGEpdHJ5e3IucGFydGljaXBhbnRUb2tlbj1KU09OLnBhcnNlKGUuY29ubmVjdGlvbkRhdGEpLkNvbm5lY3Rpb25BdXRoZW50aWNhdGlvblRva2VufWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IodC5Mb2dDb21wb25lbnQuQ0hBVCwiQ29ubmVjdGlvbiBkYXRhIGlzIGludmFsaWQiKS53aXRoT2JqZWN0KGUpLndpdGhFeGNlcHRpb24obikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnBhcnRpY2lwYW50VG9rZW49bnVsbH1yZXR1cm4gci5wYXJ0aWNpcGFudFRva2VuPXIucGFydGljaXBhbnRUb2tlbnx8bnVsbCxyLm9yaWdpbmFsSW5mbz10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbyxyfXJldHVybiBudWxsfSx1LnByb3RvdHlwZS5nZXRDb25uZWN0aW9uVG9rZW49ZnVuY3Rpb24oKXt2YXIgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj0odC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLkNIQVRfVE9LRU4scGFydGljaXBhbnRJZDp0aGlzLmNvbm5lY3Rpb25JZCxjb250YWN0SWQ6dGhpcy5jb250YWN0SWR9KTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULG4se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRDb25uZWN0aW9uVG9rZW4gc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0Q29ubmVjdGlvblRva2VuIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksbyhFcnJvcigiZ2V0Q29ubmVjdGlvblRva2VuIGZhaWxlZCIpKX19KX0pKX0sdS5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLkNIQVR9LHUucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX0sdS5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0FnZW50Q29ubmVjdGlvblR5cGUoKSYmdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcykuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfTt2YXIgbD1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9OyhsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bCxsLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuVEFTS30sbC5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybntjb250YWN0SWQ6dGhpcy5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDplLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkfX0sbC5wcm90b3R5cGUuZ2V0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpfTt2YXIgcD1mdW5jdGlvbihlKXt0LkNvbm5lY3Rpb24uY2FsbCh0aGlzLGUuY29udGFjdElkLGUuY29ubmVjdGlvbklkKSx0aGlzLmNvbm5lY3Rpb25EYXRhPWV9OyhwLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cCxwLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25EYXRhfSxwLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe307dmFyIGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5lbmRwb2ludEFSTj10LmVuZHBvaW50SWR8fHQuZW5kcG9pbnRBUk58fG51bGwsdGhpcy5lbmRwb2ludElkPXRoaXMuZW5kcG9pbnRBUk4sdGhpcy50eXBlPXQudHlwZXx8bnVsbCx0aGlzLm5hbWU9dC5uYW1lfHxudWxsLHRoaXMucGhvbmVOdW1iZXI9dC5waG9uZU51bWJlcnx8bnVsbCx0aGlzLmFnZW50TG9naW49dC5hZ2VudExvZ2lufHxudWxsLHRoaXMucXVldWU9dC5xdWV1ZXx8bnVsbH07ZC5wcm90b3R5cGUuc3RyaXBQaG9uZU51bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBob25lTnVtYmVyP3RoaXMucGhvbmVOdW1iZXIucmVwbGFjZSgvc2lwOihbXkBdKilALiovLCIkMSIpOiIifSxkLmJ5UGhvbmVOdW1iZXI9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IGQoe3R5cGU6dC5FbmRwb2ludFR5cGUuUEhPTkVfTlVNQkVSLHBob25lTnVtYmVyOmUsbmFtZTpufHxudWxsfSl9O3ZhciBoPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmVycm9yVHlwZT1lLHRoaXMuZXJyb3JNZXNzYWdlPXQsdGhpcy5lbmRQb2ludFVybD1ufTtoLnByb3RvdHlwZS5nZXRFcnJvclR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvclR5cGV9LGgucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yTWVzc2FnZX0saC5wcm90b3R5cGUuZ2V0RW5kUG9pbnRVcmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRQb2ludFVybH0sdC5hZ2VudD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5JTklULGUpO3JldHVybiB0LmFnZW50LmluaXRpYWxpemVkJiZlKG5ldyB0LkFnZW50KSxufSx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29udGFjdD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29udGFjdEV2ZW50cy5JTklULGUpfSx0Lm9uV2Vic29ja2V0SW5pdEZhaWx1cmU9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSxlKTtyZXR1cm4gdC53ZWJTb2NrZXRJbml0RmFpbGVkJiZlKCksbn0sdC5pZk1hc3Rlcj1mdW5jdGlvbihlLG4scixvKXtpZih0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuYXNzZXJ0Tm90TnVsbChuLCJBIHRydWUgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZC4iKSwhdC5jb3JlLm1hc3RlckNsaWVudClyZXR1cm4gdC5nZXRMb2coKS53YXJuKCJXZSBjYW4ndCBiZSB0aGUgbWFzdGVyIGZvciB0b3BpYyAnJXMnIGJlY2F1c2UgdGhlcmUgaXMgbm8gbWFzdGVyIGNsaWVudCEiLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZChyJiZyKCkpO3QuY29yZS5nZXRNYXN0ZXJDbGllbnQoKS5jYWxsKHQuTWFzdGVyTWV0aG9kcy5DSEVDS19NQVNURVIse3RvcGljOmUsc2hvdWxkTm90QmVjb21lTWFzdGVySWZOb25lOm99LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UuaXNNYXN0ZXI/bigpOnImJnIoKX19KX0sdC5iZWNvbWVNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIpe3QuYXNzZXJ0Tm90TnVsbChlLCJBIHRvcGljIG11c3QgYmUgcHJvdmlkZWQuIiksdC5jb3JlLm1hc3RlckNsaWVudD90LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQkVDT01FX01BU1RFUix7dG9waWM6ZX0se3N1Y2Nlc3M6ZnVuY3Rpb24oKXtuJiZuKCl9fSk6KHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKSxyJiZyKCkpfSx0LkFnZW50PW4sdC5BZ2VudFNuYXBzaG90PXIsdC5Db250YWN0PW8sdC5Db250YWN0U25hcHNob3Q9aSx0LkNvbm5lY3Rpb249Yyx0LkJhc2VDb25uZWN0aW9uPXMsdC5Wb2ljZUNvbm5lY3Rpb249Yyx0LkNoYXRDb25uZWN0aW9uPXUsdC5UYXNrQ29ubmVjdGlvbj1sLHQuQ29ubmVjdGlvblNuYXBzaG90PXAsdC5FbmRwb2ludD1kLHQuQWRkcmVzcz1kLHQuU29mdHBob25lRXJyb3I9aCx0LlZvaWNlSWQ9YSx0LlF1aWNrUmVzcG9uc2VzPWNsYXNze3N0YXRpYyBpc0VuYWJsZWQ9ZnVuY3Rpb24oKXtjb25zdCBlPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2UuY2FsbCh0LkFwaVByb3h5Q2xpZW50TWV0aG9kcy5RUl9JTlRFR1JBVElPTl9FWElTVFMsbnVsbCx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiUXVpY2sgUmVzcG9uc2VzIGlzRW5hYmxlZCBmYWlsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX19KX0pKX07c3RhdGljIHNlYXJjaFF1aWNrUmVzcG9uc2VzPWZ1bmN0aW9uKGUpe2NvbnN0IG49dC5pc0NSTSgpP3QuY29yZS5nZXRDbGllbnQoKTp0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKSxyPWU/LmNvbnRhY3RJZD9uZXcgbyhlLmNvbnRhY3RJZCkuZ2V0QXR0cmlidXRlcygpOnZvaWQgMDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7bi5jYWxsKHQuQXBpUHJveHlDbGllbnRNZXRob2RzLlFSX1NFQVJDSF9RVUlDS19SRVNQT05TRVMsey4uLmUsYXR0cmlidXRlczpyfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInNlYXJjaFF1aWNrUmVzcG9uc2VzIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInNlYXJjaFF1aWNrUmVzcG9uc2VzIGZhaWxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfX0pfSkpfX19KCl9LDgyNzooZSx0LG4pPT57dmFyIHI7IWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIG8ocyxhKXtpZighbltzXSl7aWYoIXRbc10pe2lmKGkpcmV0dXJuIGkocywhMCk7dmFyIGM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrcysiJyIpO3Rocm93IGMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsY312YXIgdT1uW3NdPXtleHBvcnRzOnt9fTt0W3NdWzBdLmNhbGwodS5leHBvcnRzLChmdW5jdGlvbihlKXtyZXR1cm4gbyh0W3NdWzFdW2VdfHxlKX0pLHUsdS5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW3NdLmV4cG9ydHN9Zm9yKHZhciBpPXZvaWQgMCxzPTA7czxyLmxlbmd0aDtzKyspbyhyW3NdKTtyZXR1cm4gb30oezE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTQtMDYtMzAiLGVuZHBvaW50UHJlZml4OiJjb2duaXRvLWlkZW50aXR5Iixqc29uVmVyc2lvbjoiMS4xIixwcm90b2NvbDoianNvbiIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b24gQ29nbml0byBJZGVudGl0eSIsc2VydmljZUlkOiJDb2duaXRvIElkZW50aXR5IixzaWduYXR1cmVWZXJzaW9uOiJ2NCIsdGFyZ2V0UHJlZml4OiJBV1NDb2duaXRvSWRlbnRpdHlTZXJ2aWNlIix1aWQ6ImNvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMCJ9LG9wZXJhdGlvbnM6e0NyZWF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sRGVsZXRlSWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkc1RvRGVsZXRlIl0sbWVtYmVyczp7SWRlbnRpdHlJZHNUb0RlbGV0ZTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVbnByb2Nlc3NlZElkZW50aXR5SWRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxFcnJvckNvZGU6e319fX19fX0sRGVsZXRlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fX0sRGVzY3JpYmVJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19LG91dHB1dDp7c2hhcGU6IlN2In19LERlc2NyaWJlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTayJ9fSxHZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiXSxtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9LEN1c3RvbVJvbGVBcm46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxDcmVkZW50aWFsczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRLZXk6e30sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX19fSxhdXRodHlwZToibm9uZSJ9LEdldElkOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7QWNjb3VudElkOnt9LElkZW50aXR5UG9vbElkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxhdXRodHlwZToibm9uZSJ9LEdldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxHZXRPcGVuSWRUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRPcGVuSWRUb2tlbkZvckRldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiTG9naW5zIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn0sVG9rZW5EdXJhdGlvbjp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sVG9rZW46e319fX0sR2V0UHJpbmNpcGFsVGFnQXR0cmlidXRlTWFwOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiSWRlbnRpdHlQcm92aWRlck5hbWUiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fSxVc2VEZWZhdWx0czp7dHlwZToiYm9vbGVhbiJ9LFByaW5jaXBhbFRhZ3M6e3NoYXBlOiJTMXMifX19fSxMaXN0SWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIk1heFJlc3VsdHMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9LEhpZGVEaXNhYmxlZDp7dHlwZToiYm9vbGVhbiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlN2In19LE5leHRUb2tlbjp7fX19fSxMaXN0SWRlbnRpdHlQb29sczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJNYXhSZXN1bHRzIl0sbWVtYmVyczp7TWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fX19fSxOZXh0VG9rZW46e319fX0sTGlzdFRhZ3NGb3JSZXNvdXJjZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSZXNvdXJjZUFybiJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1RhZ3M6e3NoYXBlOiJTaCJ9fX19LExvb2t1cERldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxEZXZlbG9wZXJVc2VySWRlbnRpZmllcjp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXJMaXN0Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LE5leHRUb2tlbjp7fX19fSxNZXJnZURldmVsb3BlcklkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiU291cmNlVXNlcklkZW50aWZpZXIiLCJEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyIiwiRGV2ZWxvcGVyUHJvdmlkZXJOYW1lIiwiSWRlbnRpdHlQb29sSWQiXSxtZW1iZXJzOntTb3VyY2VVc2VySWRlbnRpZmllcjp7fSxEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyOnt9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxJZGVudGl0eVBvb2xJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX19LFNldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiUm9sZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxSb2xlczp7c2hhcGU6IlMxYyJ9LFJvbGVNYXBwaW5nczp7c2hhcGU6IlMxZSJ9fX19LFNldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sVGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnczp7c2hhcGU6IlNoIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubGlua0RldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJJZGVudGl0eVBvb2xJZCIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIkRldmVsb3BlclVzZXJJZGVudGlmaWVyIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e319fX0sVW5saW5rSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCIsIkxvZ2lucyIsIkxvZ2luc1RvUmVtb3ZlIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxMb2dpbnNUb1JlbW92ZTp7c2hhcGU6IlN3In19fSxhdXRodHlwZToibm9uZSJ9LFVudGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdLZXlzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnS2V5czp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlSWRlbnRpdHlQb29sOntpbnB1dDp7c2hhcGU6IlNrIn0sb3V0cHV0OntzaGFwZToiU2sifX19LHNoYXBlczp7UzU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTOTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTYjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1Byb3ZpZGVyTmFtZTp7fSxDbGllbnRJZDp7fSxTZXJ2ZXJTaWRlVG9rZW5DaGVjazp7dHlwZToiYm9vbGVhbiJ9fX19LFNnOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LFNoOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UG9vbE5hbWUiLCJBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVBvb2xOYW1lOnt9LEFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllczp7dHlwZToiYm9vbGVhbiJ9LEFsbG93Q2xhc3NpY0Zsb3c6e3R5cGU6ImJvb2xlYW4ifSxTdXBwb3J0ZWRMb2dpblByb3ZpZGVyczp7c2hhcGU6IlM1In0sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LE9wZW5JZENvbm5lY3RQcm92aWRlckFSTnM6e3NoYXBlOiJTOSJ9LENvZ25pdG9JZGVudGl0eVByb3ZpZGVyczp7c2hhcGU6IlNiIn0sU2FtbFByb3ZpZGVyQVJOczp7c2hhcGU6IlNnIn0sSWRlbnRpdHlQb29sVGFnczp7c2hhcGU6IlNoIn19fSxTdjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlN3In0sQ3JlYXRpb25EYXRlOnt0eXBlOiJ0aW1lc3RhbXAifSxMYXN0TW9kaWZpZWREYXRlOnt0eXBlOiJ0aW1lc3RhbXAifX19LFN3Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LFMxMDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxYzp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxZTp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJUeXBlIl0sbWVtYmVyczp7VHlwZTp7fSxBbWJpZ3VvdXNSb2xlUmVzb2x1dGlvbjp7fSxSdWxlc0NvbmZpZ3VyYXRpb246e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSdWxlcyJdLG1lbWJlcnM6e1J1bGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJDbGFpbSIsIk1hdGNoVHlwZSIsIlZhbHVlIiwiUm9sZUFSTiJdLG1lbWJlcnM6e0NsYWltOnt9LE1hdGNoVHlwZTp7fSxWYWx1ZTp7fSxSb2xlQVJOOnt9fX19fX19fX0sUzFzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX19fX0se31dLDI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3BhZ2luYXRpb246e0xpc3RJZGVudGl0eVBvb2xzOntpbnB1dF90b2tlbjoiTmV4dFRva2VuIixsaW1pdF9rZXk6Ik1heFJlc3VsdHMiLG91dHB1dF90b2tlbjoiTmV4dFRva2VuIixyZXN1bHRfa2V5OiJJZGVudGl0eVBvb2xzIn19fX0se31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTctMDItMTUiLGVuZHBvaW50UHJlZml4OiJjb25uZWN0Iixqc29uVmVyc2lvbjoiMS4wIixwcm90b2NvbDoianNvbiIsc2VydmljZUFiYnJldmlhdGlvbjoiQ29ubmVjdCIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsc2lnbmF0dXJlVmVyc2lvbjoiIix0YXJnZXRQcmVmaXg6IkFtYXpvbkNvbm5lY3RDVElTZXJ2aWNlIix1aWQ6ImNvbm5lY3QtMjAxNy0wMi0xNSJ9LG9wZXJhdGlvbnM6e0FjY2VwdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDbGVhckNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb21wbGV0ZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb25mZXJlbmNlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVBZGRpdGlvbmFsQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LENyZWF0ZU91dGJvdW5kQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGVuZHBvaW50OntzaGFwZToiU2UifSxxdWV1ZUFSTjp7fSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVUYXNrQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJlbmRwb2ludCIsIm5hbWUiXSxtZW1iZXJzOntlbmRwb2ludDp7c2hhcGU6IlNlIn0scHJldmlvdXNDb250YWN0SWQ6e30sbmFtZTp7fSxkZXNjcmlwdGlvbjp7fSxyZWZlcmVuY2VzOntzaGFwZToiU3IifSxpZGVtcG90ZW5jeVRva2VuOnt9LHNjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19fSxDcmVhdGVUcmFuc3BvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHJhbnNwb3J0VHlwZSIsImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7dHJhbnNwb3J0VHlwZTp7fSxwYXJ0aWNpcGFudElkOnt9LGNvbnRhY3RJZDp7fSxzb2Z0cGhvbmVDbGllbnRJZDp7fSxhdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7d2ViU29ja2V0VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXJsIiwidHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMiXSxtZW1iZXJzOnt1cmw6e30sdHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM6e3R5cGU6ImxvbmcifSxleHBpcnk6e319fSxjaGF0VG9rZW5UcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwYXJ0aWNpcGFudFRva2VuIiwiZXhwaXJ5Il0sbWVtYmVyczp7cGFydGljaXBhbnRUb2tlbjp7fSxleHBpcnk6e319fSxzb2Z0cGhvbmVUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zIl0sbWVtYmVyczp7c29mdHBob25lTWVkaWFDb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXNlcm5hbWUiLCJjcmVkZW50aWFsIiwidXJscyJdLG1lbWJlcnM6e3VzZXJuYW1lOnt9LGNyZWRlbnRpYWw6e30sdXJsczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19fX19LGFnZW50RGlzY292ZXJ5VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicHJlc2lnbmVkVXJsIl0sbWVtYmVyczp7cHJlc2lnbmVkVXJsOnt9fX0sd2ViUlRDVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibWVldGluZyIsImF0dGVuZGVlIl0sbWVtYmVyczp7bWVldGluZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnttZWV0aW5nSWQ6e30sbWVkaWFSZWdpb246e30sbWVkaWFQbGFjZW1lbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXVkaW9Ib3N0VXJsOnt9LGF1ZGlvRmFsbGJhY2tVcmw6e30sc2lnbmFsaW5nVXJsOnt9LHR1cm5Db250cm9sVXJsOnt9LGV2ZW50SW5nZXN0aW9uVXJsOnt9fX0sbWVldGluZ0ZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VjaG9SZWR1Y3Rpb246e319fX19fX0sYXR0ZW5kZWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0ZW5kZWVJZDp7fSxqb2luVG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfX19fX19fX0sRGVzdHJveUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sR2V0QWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2NvbmZpZ3VyYXRpb246e3NoYXBlOiJTMXEifX19fSxHZXRBZ2VudFBlcm1pc3Npb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwZXJtaXNzaW9ucyJdLG1lbWJlcnM6e3Blcm1pc3Npb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFNuYXBzaG90OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSx0aW1lb3V0Ont0eXBlOiJsb25nIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzbmFwc2hvdCIsIm5leHRUb2tlbiJdLG1lbWJlcnM6e3NuYXBzaG90Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGUiLCJjb250YWN0cyIsInNuYXBzaG90VGltZXN0YW1wIl0sbWVtYmVyczp7c3RhdGU6e3NoYXBlOiJTMjkifSxuZXh0U3RhdGU6e3NoYXBlOiJTMjkifSxhZ2VudEF2YWlsYWJpbGl0eVN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3N0YXRlOnt9LHRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxjb250YWN0czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIiwidHlwZSIsInN0YXRlIiwiY29ubmVjdGlvbnMiLCJhdHRyaWJ1dGVzIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LGluaXRpYWxDb250YWN0SWQ6e30sdHlwZTp7fSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxxdWV1ZTp7c2hhcGU6IlNrIn0scXVldWVUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbm5lY3Rpb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb25uZWN0aW9uSWQiLCJzdGF0ZSIsInR5cGUiLCJpbml0aWFsIl0sbWVtYmVyczp7Y29ubmVjdGlvbklkOnt9LGVuZHBvaW50OntzaGFwZToiU2UifSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSx0eXBlOnt9LGluaXRpYWw6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVNZWRpYUluZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFR5cGU6e30sYXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LG1lZGlhTGVnQ29udGV4dFRva2VuOnt9LGNhbGxDb250ZXh0VG9rZW46e30sY2FsbENvbmZpZ0pzb246e319fSxjaGF0TWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NoYXRBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sY29ubmVjdGlvbkRhdGE6e30sY3VzdG9tZXJOYW1lOnt9fX0sbW9uaXRvcmluZ0luZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnROYW1lOnt9fX0sam9pblRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxtdXRlOnt0eXBlOiJib29sZWFuIn0sZm9yY2VkTXV0ZTp7dHlwZToiYm9vbGVhbiJ9LHF1aWNrQ29ubmVjdE5hbWU6e30sbW9uaXRvckNhcGFiaWxpdGllczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxtb25pdG9yU3RhdHVzOnt9LGNhcGFiaWxpdGllczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntWaWRlbzp7fX19fX19LGF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSJdLG1lbWJlcnM6e25hbWU6e30sdmFsdWU6e319fX0sY29udGFjdER1cmF0aW9uOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saW5pdGlhdGlvbk1ldGhvZDp7fSxjb250YWN0RmVhdHVyZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0YWNobWVudHNFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbWVzc2FnaW5nTWFya2Rvd25FbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9LHNjcmVlblJlY29yZGluZ0NvbmZpZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY3JlZW5SZWNvcmRpbmdFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nU3RhdGU6e319fX19LGNoYW5uZWxDb250ZXh0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3NjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSx0YXNrVGVtcGxhdGVJZDp7fSx0YXNrVGVtcGxhdGVWZXJzaW9uOnt0eXBlOiJpbnRlZ2VyIn19fSxzZWdtZW50QXR0cmlidXRlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmFsdWVTdHJpbmc6e319fX19fX0sc25hcHNob3RUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbmV4dFRva2VuOnt9fX19LEdldEFnZW50U3RhdGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzdGF0ZXMiXSxtZW1iZXJzOntzdGF0ZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlMyOSJ9fSxuZXh0VG9rZW46e319fX0sR2V0RGlhbGFibGVDb3VudHJ5Q29kZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvdW50cnlDb2RlcyJdLG1lbWJlcnM6e2NvdW50cnlDb2Rlczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0RW5kcG9pbnRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicXVldWVBUk5zIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHF1ZXVlQVJOczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VuZHBvaW50czp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2UifX0sbmV4dFRva2VuOnt9fX19LEdldE5ld0F1dGhUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInJlZnJlc2hUb2tlbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyZWZyZXNoVG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmV3QXV0aFRva2VuOnt9LGV4cGlyYXRpb25EYXRlVGltZTp7dHlwZToidGltZXN0YW1wIn19fX0sR2V0Um91dGluZ1Byb2ZpbGVRdWV1ZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyb3V0aW5nUHJvZmlsZUFSTiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicXVldWVzIl0sbWVtYmVyczp7cXVldWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTayJ9fSxuZXh0VG9rZW46e319fX0sSG9sZENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sTXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE5vdGlmeUNvbnRhY3RJc3N1ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30saXNzdWVDb2RlOnt9LGRlc2NyaXB0aW9uOnt9LGNsaWVudExvZ3M6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFBhdXNlQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFB1dEFnZW50U3RhdGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJzdGF0ZSJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxzdGF0ZTp7c2hhcGU6IlMyOSJ9LGVucXVldWVOZXh0U3RhdGU6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVqZWN0Q29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVzdW1lQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRDbGllbnRMb2dzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwibG9nRXZlbnRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGxvZ0V2ZW50czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sY29tcG9uZW50Ont9LG1lc3NhZ2U6e319fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmREaWdpdHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiLCJkaWdpdHMiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fSxkaWdpdHM6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRTb2Z0cGhvbmVDYWxsTWV0cmljczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczp7c2hhcGU6IlM0ZiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbFJlcG9ydDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInJlcG9ydCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY2NwVmVyc2lvbjp7fSxyZXBvcnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFN0YXJ0VGltZTp7dHlwZToidGltZXN0YW1wIn0sY2FsbEVuZFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifSxndW1UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxoYW5kc2hha2VUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0scHJlVGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSx0YWxrVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGNsZWFudXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzaWduYWxsaW5nQ29ubmVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxoYW5kc2hha2VGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtT3RoZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtVGltZW91dEZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxjcmVhdGVPZmZlckZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHVzZXJCdXN5RmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn19fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVW5tdXRlUGFydGljaXBhbnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlQWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInRhcmdldE1vbml0b3JNb2RlIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LHRhcmdldE1vbml0b3JNb2RlOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fX0sc2hhcGVzOntTMjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthZ2VudEFSTjp7fSxhdXRoVG9rZW46e319fSxTZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiXSxtZW1iZXJzOntlbmRwb2ludEFSTjp7fSx0eXBlOnt9LG5hbWU6e30scGhvbmVOdW1iZXI6e30sYWdlbnRMb2dpbjp7fSxxdWV1ZTp7c2hhcGU6IlNrIn19fSxTazp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntxdWV1ZUFSTjp7fSxuYW1lOnt9fX0sU3I6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidmFsdWUiLCJ0eXBlIl0sbWVtYmVyczp7dmFsdWU6e30sdHlwZTp7fX19fSxTMXE6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJuYW1lIiwic29mdHBob25lRW5hYmxlZCIsInNvZnRwaG9uZUF1dG9BY2NlcHQiLCJleHRlbnNpb24iLCJyb3V0aW5nUHJvZmlsZSJdLG1lbWJlcnM6e25hbWU6e30sdXNlcm5hbWU6e30sc29mdHBob25lRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNvZnRwaG9uZUF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxleHRlbnNpb246e30scm91dGluZ1Byb2ZpbGU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmFtZTp7fSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxkZWZhdWx0T3V0Ym91bmRRdWV1ZTp7c2hhcGU6IlNrIn0sY2hhbm5lbENvbmN1cnJlbmN5TWFwOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToibG9uZyJ9fX19LGFnZW50UHJlZmVyZW5jZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxhZ2VudEFSTjp7fX19LFMyOTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJuYW1lIl0sbWVtYmVyczp7YWdlbnRTdGF0ZUFSTjp7fSx0eXBlOnt9LG5hbWU6e30sc3RhcnRUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sUzRmOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7dGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1UeXBlOnt9LHBhY2tldENvdW50Ont0eXBlOiJsb25nIn0scGFja2V0c0xvc3Q6e3R5cGU6ImxvbmcifSxhdWRpb0xldmVsOnt0eXBlOiJkb3VibGUifSxqaXR0ZXJCdWZmZXJNaWxsaXM6e3R5cGU6ImxvbmcifSxyb3VuZFRyaXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn19fX19fX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2FjbTp7bmFtZToiQUNNIixjb3JzOiEwfSxhcGlnYXRld2F5OntuYW1lOiJBUElHYXRld2F5Iixjb3JzOiEwfSxhcHBsaWNhdGlvbmF1dG9zY2FsaW5nOntwcmVmaXg6ImFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nIixuYW1lOiJBcHBsaWNhdGlvbkF1dG9TY2FsaW5nIixjb3JzOiEwfSxhcHBzdHJlYW06e25hbWU6IkFwcFN0cmVhbSJ9LGF1dG9zY2FsaW5nOntuYW1lOiJBdXRvU2NhbGluZyIsY29yczohMH0sYmF0Y2g6e25hbWU6IkJhdGNoIn0sYnVkZ2V0czp7bmFtZToiQnVkZ2V0cyJ9LGNsb3VkZGlyZWN0b3J5OntuYW1lOiJDbG91ZERpcmVjdG9yeSIsdmVyc2lvbnM6WyIyMDE2LTA1LTEwKiJdfSxjbG91ZGZvcm1hdGlvbjp7bmFtZToiQ2xvdWRGb3JtYXRpb24iLGNvcnM6ITB9LGNsb3VkZnJvbnQ6e25hbWU6IkNsb3VkRnJvbnQiLHZlcnNpb25zOlsiMjAxMy0wNS0xMioiLCIyMDEzLTExLTExKiIsIjIwMTQtMDUtMzEqIiwiMjAxNC0xMC0yMSoiLCIyMDE0LTExLTA2KiIsIjIwMTUtMDQtMTcqIiwiMjAxNS0wNy0yNyoiLCIyMDE1LTA5LTE3KiIsIjIwMTYtMDEtMTMqIiwiMjAxNi0wMS0yOCoiLCIyMDE2LTA4LTAxKiIsIjIwMTYtMDgtMjAqIiwiMjAxNi0wOS0wNyoiLCIyMDE2LTA5LTI5KiIsIjIwMTYtMTEtMjUqIiwiMjAxNy0wMy0yNSoiLCIyMDE3LTEwLTMwKiIsIjIwMTgtMDYtMTgqIiwiMjAxOC0xMS0wNSoiLCIyMDE5LTAzLTI2KiJdLGNvcnM6ITB9LGNsb3VkaHNtOntuYW1lOiJDbG91ZEhTTSIsY29yczohMH0sY2xvdWRzZWFyY2g6e25hbWU6IkNsb3VkU2VhcmNoIn0sY2xvdWRzZWFyY2hkb21haW46e25hbWU6IkNsb3VkU2VhcmNoRG9tYWluIn0sY2xvdWR0cmFpbDp7bmFtZToiQ2xvdWRUcmFpbCIsY29yczohMH0sY2xvdWR3YXRjaDp7cHJlZml4OiJtb25pdG9yaW5nIixuYW1lOiJDbG91ZFdhdGNoIixjb3JzOiEwfSxjbG91ZHdhdGNoZXZlbnRzOntwcmVmaXg6ImV2ZW50cyIsbmFtZToiQ2xvdWRXYXRjaEV2ZW50cyIsdmVyc2lvbnM6WyIyMDE0LTAyLTAzKiJdLGNvcnM6ITB9LGNsb3Vkd2F0Y2hsb2dzOntwcmVmaXg6ImxvZ3MiLG5hbWU6IkNsb3VkV2F0Y2hMb2dzIixjb3JzOiEwfSxjb2RlYnVpbGQ6e25hbWU6IkNvZGVCdWlsZCIsY29yczohMH0sY29kZWNvbW1pdDp7bmFtZToiQ29kZUNvbW1pdCIsY29yczohMH0sY29kZWRlcGxveTp7bmFtZToiQ29kZURlcGxveSIsY29yczohMH0sY29kZXBpcGVsaW5lOntuYW1lOiJDb2RlUGlwZWxpbmUiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eTp7cHJlZml4OiJjb2duaXRvLWlkZW50aXR5IixuYW1lOiJDb2duaXRvSWRlbnRpdHkiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eXNlcnZpY2Vwcm92aWRlcjp7cHJlZml4OiJjb2duaXRvLWlkcCIsbmFtZToiQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyIixjb3JzOiEwfSxjb2duaXRvc3luYzp7cHJlZml4OiJjb2duaXRvLXN5bmMiLG5hbWU6IkNvZ25pdG9TeW5jIixjb3JzOiEwfSxjb25maWdzZXJ2aWNlOntwcmVmaXg6ImNvbmZpZyIsbmFtZToiQ29uZmlnU2VydmljZSIsY29yczohMH0sY3VyOntuYW1lOiJDVVIiLGNvcnM6ITB9LGRhdGFwaXBlbGluZTp7bmFtZToiRGF0YVBpcGVsaW5lIn0sZGV2aWNlZmFybTp7bmFtZToiRGV2aWNlRmFybSIsY29yczohMH0sZGlyZWN0Y29ubmVjdDp7bmFtZToiRGlyZWN0Q29ubmVjdCIsY29yczohMH0sZGlyZWN0b3J5c2VydmljZTp7cHJlZml4OiJkcyIsbmFtZToiRGlyZWN0b3J5U2VydmljZSJ9LGRpc2NvdmVyeTp7bmFtZToiRGlzY292ZXJ5In0sZG1zOntuYW1lOiJETVMifSxkeW5hbW9kYjp7bmFtZToiRHluYW1vREIiLGNvcnM6ITB9LGR5bmFtb2Ric3RyZWFtczp7cHJlZml4OiJzdHJlYW1zLmR5bmFtb2RiIixuYW1lOiJEeW5hbW9EQlN0cmVhbXMiLGNvcnM6ITB9LGVjMjp7bmFtZToiRUMyIix2ZXJzaW9uczpbIjIwMTMtMDYtMTUqIiwiMjAxMy0xMC0xNSoiLCIyMDE0LTAyLTAxKiIsIjIwMTQtMDUtMDEqIiwiMjAxNC0wNi0xNSoiLCIyMDE0LTA5LTAxKiIsIjIwMTQtMTAtMDEqIiwiMjAxNS0wMy0wMSoiLCIyMDE1LTA0LTE1KiIsIjIwMTUtMTAtMDEqIiwiMjAxNi0wNC0wMSoiLCIyMDE2LTA5LTE1KiJdLGNvcnM6ITB9LGVjcjp7bmFtZToiRUNSIixjb3JzOiEwfSxlY3M6e25hbWU6IkVDUyIsY29yczohMH0sZWZzOntwcmVmaXg6ImVsYXN0aWNmaWxlc3lzdGVtIixuYW1lOiJFRlMiLGNvcnM6ITB9LGVsYXN0aWNhY2hlOntuYW1lOiJFbGFzdGlDYWNoZSIsdmVyc2lvbnM6WyIyMDEyLTExLTE1KiIsIjIwMTQtMDMtMjQqIiwiMjAxNC0wNy0xNSoiLCIyMDE0LTA5LTMwKiJdLGNvcnM6ITB9LGVsYXN0aWNiZWFuc3RhbGs6e25hbWU6IkVsYXN0aWNCZWFuc3RhbGsiLGNvcnM6ITB9LGVsYjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZyIsbmFtZToiRUxCIixjb3JzOiEwfSxlbGJ2Mjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZ3YyIixuYW1lOiJFTEJ2MiIsY29yczohMH0sZW1yOntwcmVmaXg6ImVsYXN0aWNtYXByZWR1Y2UiLG5hbWU6IkVNUiIsY29yczohMH0sZXM6e25hbWU6IkVTIn0sZWxhc3RpY3RyYW5zY29kZXI6e25hbWU6IkVsYXN0aWNUcmFuc2NvZGVyIixjb3JzOiEwfSxmaXJlaG9zZTp7bmFtZToiRmlyZWhvc2UiLGNvcnM6ITB9LGdhbWVsaWZ0OntuYW1lOiJHYW1lTGlmdCIsY29yczohMH0sZ2xhY2llcjp7bmFtZToiR2xhY2llciJ9LGhlYWx0aDp7bmFtZToiSGVhbHRoIn0saWFtOntuYW1lOiJJQU0iLGNvcnM6ITB9LGltcG9ydGV4cG9ydDp7bmFtZToiSW1wb3J0RXhwb3J0In0saW5zcGVjdG9yOntuYW1lOiJJbnNwZWN0b3IiLHZlcnNpb25zOlsiMjAxNS0wOC0xOCoiXSxjb3JzOiEwfSxpb3Q6e25hbWU6IklvdCIsY29yczohMH0saW90ZGF0YTp7cHJlZml4OiJpb3QtZGF0YSIsbmFtZToiSW90RGF0YSIsY29yczohMH0sa2luZXNpczp7bmFtZToiS2luZXNpcyIsY29yczohMH0sa2luZXNpc2FuYWx5dGljczp7bmFtZToiS2luZXNpc0FuYWx5dGljcyJ9LGttczp7bmFtZToiS01TIixjb3JzOiEwfSxsYW1iZGE6e25hbWU6IkxhbWJkYSIsY29yczohMH0sbGV4cnVudGltZTp7cHJlZml4OiJydW50aW1lLmxleCIsbmFtZToiTGV4UnVudGltZSIsY29yczohMH0sbGlnaHRzYWlsOntuYW1lOiJMaWdodHNhaWwifSxtYWNoaW5lbGVhcm5pbmc6e25hbWU6Ik1hY2hpbmVMZWFybmluZyIsY29yczohMH0sbWFya2V0cGxhY2Vjb21tZXJjZWFuYWx5dGljczp7bmFtZToiTWFya2V0cGxhY2VDb21tZXJjZUFuYWx5dGljcyIsY29yczohMH0sbWFya2V0cGxhY2VtZXRlcmluZzp7cHJlZml4OiJtZXRlcmluZ21hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZU1ldGVyaW5nIn0sbXR1cms6e3ByZWZpeDoibXR1cmstcmVxdWVzdGVyIixuYW1lOiJNVHVyayIsY29yczohMH0sbW9iaWxlYW5hbHl0aWNzOntuYW1lOiJNb2JpbGVBbmFseXRpY3MiLGNvcnM6ITB9LG9wc3dvcmtzOntuYW1lOiJPcHNXb3JrcyIsY29yczohMH0sb3Bzd29ya3NjbTp7bmFtZToiT3BzV29ya3NDTSJ9LG9yZ2FuaXphdGlvbnM6e25hbWU6Ik9yZ2FuaXphdGlvbnMifSxwaW5wb2ludDp7bmFtZToiUGlucG9pbnQifSxwb2xseTp7bmFtZToiUG9sbHkiLGNvcnM6ITB9LHJkczp7bmFtZToiUkRTIix2ZXJzaW9uczpbIjIwMTQtMDktMDEqIl0sY29yczohMH0scmVkc2hpZnQ6e25hbWU6IlJlZHNoaWZ0Iixjb3JzOiEwfSxyZWtvZ25pdGlvbjp7bmFtZToiUmVrb2duaXRpb24iLGNvcnM6ITB9LHJlc291cmNlZ3JvdXBzdGFnZ2luZ2FwaTp7bmFtZToiUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJIn0scm91dGU1Mzp7bmFtZToiUm91dGU1MyIsY29yczohMH0scm91dGU1M2RvbWFpbnM6e25hbWU6IlJvdXRlNTNEb21haW5zIixjb3JzOiEwfSxzMzp7bmFtZToiUzMiLGR1YWxzdGFja0F2YWlsYWJsZTohMCxjb3JzOiEwfSxzM2NvbnRyb2w6e25hbWU6IlMzQ29udHJvbCIsZHVhbHN0YWNrQXZhaWxhYmxlOiEwLHhtbE5vRGVmYXVsdExpc3RzOiEwfSxzZXJ2aWNlY2F0YWxvZzp7bmFtZToiU2VydmljZUNhdGFsb2ciLGNvcnM6ITB9LHNlczp7cHJlZml4OiJlbWFpbCIsbmFtZToiU0VTIixjb3JzOiEwfSxzaGllbGQ6e25hbWU6IlNoaWVsZCJ9LHNpbXBsZWRiOntwcmVmaXg6InNkYiIsbmFtZToiU2ltcGxlREIifSxzbXM6e25hbWU6IlNNUyJ9LHNub3diYWxsOntuYW1lOiJTbm93YmFsbCJ9LHNuczp7bmFtZToiU05TIixjb3JzOiEwfSxzcXM6e25hbWU6IlNRUyIsY29yczohMH0sc3NtOntuYW1lOiJTU00iLGNvcnM6ITB9LHN0b3JhZ2VnYXRld2F5OntuYW1lOiJTdG9yYWdlR2F0ZXdheSIsY29yczohMH0sc3RlcGZ1bmN0aW9uczp7cHJlZml4OiJzdGF0ZXMiLG5hbWU6IlN0ZXBGdW5jdGlvbnMifSxzdHM6e25hbWU6IlNUUyIsY29yczohMH0sc3VwcG9ydDp7bmFtZToiU3VwcG9ydCJ9LHN3Zjp7bmFtZToiU1dGIn0seHJheTp7bmFtZToiWFJheSIsY29yczohMH0sd2FmOntuYW1lOiJXQUYiLGNvcnM6ITB9LHdhZnJlZ2lvbmFsOntwcmVmaXg6IndhZi1yZWdpb25hbCIsbmFtZToiV0FGUmVnaW9uYWwifSx3b3JrZG9jczp7bmFtZToiV29ya0RvY3MiLGNvcnM6ITB9LHdvcmtzcGFjZXM6e25hbWU6IldvcmtTcGFjZXMifSxjb2Rlc3Rhcjp7bmFtZToiQ29kZVN0YXIifSxsZXhtb2RlbGJ1aWxkaW5nc2VydmljZTp7cHJlZml4OiJsZXgtbW9kZWxzIixuYW1lOiJMZXhNb2RlbEJ1aWxkaW5nU2VydmljZSIsY29yczohMH0sbWFya2V0cGxhY2VlbnRpdGxlbWVudHNlcnZpY2U6e3ByZWZpeDoiZW50aXRsZW1lbnQubWFya2V0cGxhY2UiLG5hbWU6Ik1hcmtldHBsYWNlRW50aXRsZW1lbnRTZXJ2aWNlIn0sYXRoZW5hOntuYW1lOiJBdGhlbmEiLGNvcnM6ITB9LGdyZWVuZ3Jhc3M6e25hbWU6IkdyZWVuZ3Jhc3MifSxkYXg6e25hbWU6IkRBWCJ9LG1pZ3JhdGlvbmh1Yjp7cHJlZml4OiJBV1NNaWdyYXRpb25IdWIiLG5hbWU6Ik1pZ3JhdGlvbkh1YiJ9LGNsb3VkaHNtdjI6e25hbWU6IkNsb3VkSFNNVjIiLGNvcnM6ITB9LGdsdWU6e25hbWU6IkdsdWUifSxtb2JpbGU6e25hbWU6Ik1vYmlsZSJ9LHByaWNpbmc6e25hbWU6IlByaWNpbmciLGNvcnM6ITB9LGNvc3RleHBsb3Jlcjp7cHJlZml4OiJjZSIsbmFtZToiQ29zdEV4cGxvcmVyIixjb3JzOiEwfSxtZWRpYWNvbnZlcnQ6e25hbWU6Ik1lZGlhQ29udmVydCJ9LG1lZGlhbGl2ZTp7bmFtZToiTWVkaWFMaXZlIn0sbWVkaWFwYWNrYWdlOntuYW1lOiJNZWRpYVBhY2thZ2UifSxtZWRpYXN0b3JlOntuYW1lOiJNZWRpYVN0b3JlIn0sbWVkaWFzdG9yZWRhdGE6e3ByZWZpeDoibWVkaWFzdG9yZS1kYXRhIixuYW1lOiJNZWRpYVN0b3JlRGF0YSIsY29yczohMH0sYXBwc3luYzp7bmFtZToiQXBwU3luYyJ9LGd1YXJkZHV0eTp7bmFtZToiR3VhcmREdXR5In0sbXE6e25hbWU6Ik1RIn0sY29tcHJlaGVuZDp7bmFtZToiQ29tcHJlaGVuZCIsY29yczohMH0saW90am9ic2RhdGFwbGFuZTp7cHJlZml4OiJpb3Qtam9icy1kYXRhIixuYW1lOiJJb1RKb2JzRGF0YVBsYW5lIn0sa2luZXNpc3ZpZGVvYXJjaGl2ZWRtZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLWFyY2hpdmVkLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9BcmNoaXZlZE1lZGlhIixjb3JzOiEwfSxraW5lc2lzdmlkZW9tZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9NZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvOntuYW1lOiJLaW5lc2lzVmlkZW8iLGNvcnM6ITB9LHNhZ2VtYWtlcnJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5zYWdlbWFrZXIiLG5hbWU6IlNhZ2VNYWtlclJ1bnRpbWUifSxzYWdlbWFrZXI6e25hbWU6IlNhZ2VNYWtlciJ9LHRyYW5zbGF0ZTp7bmFtZToiVHJhbnNsYXRlIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwczp7cHJlZml4OiJyZXNvdXJjZS1ncm91cHMiLG5hbWU6IlJlc291cmNlR3JvdXBzIixjb3JzOiEwfSxhbGV4YWZvcmJ1c2luZXNzOntuYW1lOiJBbGV4YUZvckJ1c2luZXNzIn0sY2xvdWQ5OntuYW1lOiJDbG91ZDkifSxzZXJ2ZXJsZXNzYXBwbGljYXRpb25yZXBvc2l0b3J5OntwcmVmaXg6InNlcnZlcmxlc3NyZXBvIixuYW1lOiJTZXJ2ZXJsZXNzQXBwbGljYXRpb25SZXBvc2l0b3J5In0sc2VydmljZWRpc2NvdmVyeTp7bmFtZToiU2VydmljZURpc2NvdmVyeSJ9LHdvcmttYWlsOntuYW1lOiJXb3JrTWFpbCJ9LGF1dG9zY2FsaW5ncGxhbnM6e3ByZWZpeDoiYXV0b3NjYWxpbmctcGxhbnMiLG5hbWU6IkF1dG9TY2FsaW5nUGxhbnMifSx0cmFuc2NyaWJlc2VydmljZTp7cHJlZml4OiJ0cmFuc2NyaWJlIixuYW1lOiJUcmFuc2NyaWJlU2VydmljZSJ9LGNvbm5lY3Q6e25hbWU6IkNvbm5lY3QiLGNvcnM6ITB9LGFjbXBjYTp7cHJlZml4OiJhY20tcGNhIixuYW1lOiJBQ01QQ0EifSxmbXM6e25hbWU6IkZNUyJ9LHNlY3JldHNtYW5hZ2VyOntuYW1lOiJTZWNyZXRzTWFuYWdlciIsY29yczohMH0saW90YW5hbHl0aWNzOntuYW1lOiJJb1RBbmFseXRpY3MiLGNvcnM6ITB9LGlvdDFjbGlja2RldmljZXNzZXJ2aWNlOntwcmVmaXg6ImlvdDFjbGljay1kZXZpY2VzIixuYW1lOiJJb1QxQ2xpY2tEZXZpY2VzU2VydmljZSJ9LGlvdDFjbGlja3Byb2plY3RzOntwcmVmaXg6ImlvdDFjbGljay1wcm9qZWN0cyIsbmFtZToiSW9UMUNsaWNrUHJvamVjdHMifSxwaTp7bmFtZToiUEkifSxuZXB0dW5lOntuYW1lOiJOZXB0dW5lIn0sbWVkaWF0YWlsb3I6e25hbWU6Ik1lZGlhVGFpbG9yIn0sZWtzOntuYW1lOiJFS1MifSxtYWNpZTp7bmFtZToiTWFjaWUifSxkbG06e25hbWU6IkRMTSJ9LHNpZ25lcjp7bmFtZToiU2lnbmVyIn0sY2hpbWU6e25hbWU6IkNoaW1lIn0scGlucG9pbnRlbWFpbDp7cHJlZml4OiJwaW5wb2ludC1lbWFpbCIsbmFtZToiUGlucG9pbnRFbWFpbCJ9LHJhbTp7bmFtZToiUkFNIn0scm91dGU1M3Jlc29sdmVyOntuYW1lOiJSb3V0ZTUzUmVzb2x2ZXIifSxwaW5wb2ludHNtc3ZvaWNlOntwcmVmaXg6InNtcy12b2ljZSIsbmFtZToiUGlucG9pbnRTTVNWb2ljZSJ9LHF1aWNrc2lnaHQ6e25hbWU6IlF1aWNrU2lnaHQifSxyZHNkYXRhc2VydmljZTp7cHJlZml4OiJyZHMtZGF0YSIsbmFtZToiUkRTRGF0YVNlcnZpY2UifSxhbXBsaWZ5OntuYW1lOiJBbXBsaWZ5In0sZGF0YXN5bmM6e25hbWU6IkRhdGFTeW5jIn0scm9ib21ha2VyOntuYW1lOiJSb2JvTWFrZXIifSx0cmFuc2Zlcjp7bmFtZToiVHJhbnNmZXIifSxnbG9iYWxhY2NlbGVyYXRvcjp7bmFtZToiR2xvYmFsQWNjZWxlcmF0b3IifSxjb21wcmVoZW5kbWVkaWNhbDp7bmFtZToiQ29tcHJlaGVuZE1lZGljYWwiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3N2Mjp7bmFtZToiS2luZXNpc0FuYWx5dGljc1YyIn0sbWVkaWFjb25uZWN0OntuYW1lOiJNZWRpYUNvbm5lY3QifSxmc3g6e25hbWU6IkZTeCJ9LHNlY3VyaXR5aHViOntuYW1lOiJTZWN1cml0eUh1YiJ9LGFwcG1lc2g6e25hbWU6IkFwcE1lc2giLHZlcnNpb25zOlsiMjAxOC0xMC0wMSoiXX0sbGljZW5zZW1hbmFnZXI6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyIixuYW1lOiJMaWNlbnNlTWFuYWdlciJ9LGthZmthOntuYW1lOiJLYWZrYSJ9LGFwaWdhdGV3YXltYW5hZ2VtZW50YXBpOntuYW1lOiJBcGlHYXRld2F5TWFuYWdlbWVudEFwaSJ9LGFwaWdhdGV3YXl2Mjp7bmFtZToiQXBpR2F0ZXdheVYyIn0sZG9jZGI6e25hbWU6IkRvY0RCIn0sYmFja3VwOntuYW1lOiJCYWNrdXAifSx3b3JrbGluazp7bmFtZToiV29ya0xpbmsifSx0ZXh0cmFjdDp7bmFtZToiVGV4dHJhY3QifSxtYW5hZ2VkYmxvY2tjaGFpbjp7bmFtZToiTWFuYWdlZEJsb2NrY2hhaW4ifSxtZWRpYXBhY2thZ2V2b2Q6e3ByZWZpeDoibWVkaWFwYWNrYWdlLXZvZCIsbmFtZToiTWVkaWFQYWNrYWdlVm9kIn0sZ3JvdW5kc3RhdGlvbjp7bmFtZToiR3JvdW5kU3RhdGlvbiJ9LGlvdHRoaW5nc2dyYXBoOntuYW1lOiJJb1RUaGluZ3NHcmFwaCJ9LGlvdGV2ZW50czp7bmFtZToiSW9URXZlbnRzIn0saW90ZXZlbnRzZGF0YTp7cHJlZml4OiJpb3RldmVudHMtZGF0YSIsbmFtZToiSW9URXZlbnRzRGF0YSJ9LHBlcnNvbmFsaXplOntuYW1lOiJQZXJzb25hbGl6ZSIsY29yczohMH0scGVyc29uYWxpemVldmVudHM6e3ByZWZpeDoicGVyc29uYWxpemUtZXZlbnRzIixuYW1lOiJQZXJzb25hbGl6ZUV2ZW50cyIsY29yczohMH0scGVyc29uYWxpemVydW50aW1lOntwcmVmaXg6InBlcnNvbmFsaXplLXJ1bnRpbWUiLG5hbWU6IlBlcnNvbmFsaXplUnVudGltZSIsY29yczohMH0sYXBwbGljYXRpb25pbnNpZ2h0czp7cHJlZml4OiJhcHBsaWNhdGlvbi1pbnNpZ2h0cyIsbmFtZToiQXBwbGljYXRpb25JbnNpZ2h0cyJ9LHNlcnZpY2VxdW90YXM6e3ByZWZpeDoic2VydmljZS1xdW90YXMiLG5hbWU6IlNlcnZpY2VRdW90YXMifSxlYzJpbnN0YW5jZWNvbm5lY3Q6e3ByZWZpeDoiZWMyLWluc3RhbmNlLWNvbm5lY3QiLG5hbWU6IkVDMkluc3RhbmNlQ29ubmVjdCJ9LGV2ZW50YnJpZGdlOntuYW1lOiJFdmVudEJyaWRnZSJ9LGxha2Vmb3JtYXRpb246e25hbWU6Ikxha2VGb3JtYXRpb24ifSxmb3JlY2FzdHNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3QiLG5hbWU6IkZvcmVjYXN0U2VydmljZSIsY29yczohMH0sZm9yZWNhc3RxdWVyeXNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3RxdWVyeSIsbmFtZToiRm9yZWNhc3RRdWVyeVNlcnZpY2UiLGNvcnM6ITB9LHFsZGI6e25hbWU6IlFMREIifSxxbGRic2Vzc2lvbjp7cHJlZml4OiJxbGRiLXNlc3Npb24iLG5hbWU6IlFMREJTZXNzaW9uIn0sd29ya21haWxtZXNzYWdlZmxvdzp7bmFtZToiV29ya01haWxNZXNzYWdlRmxvdyJ9LGNvZGVzdGFybm90aWZpY2F0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1ub3RpZmljYXRpb25zIixuYW1lOiJDb2RlU3Rhck5vdGlmaWNhdGlvbnMifSxzYXZpbmdzcGxhbnM6e25hbWU6IlNhdmluZ3NQbGFucyJ9LHNzbzp7bmFtZToiU1NPIn0sc3Nvb2lkYzp7cHJlZml4OiJzc28tb2lkYyIsbmFtZToiU1NPT0lEQyJ9LG1hcmtldHBsYWNlY2F0YWxvZzp7cHJlZml4OiJtYXJrZXRwbGFjZS1jYXRhbG9nIixuYW1lOiJNYXJrZXRwbGFjZUNhdGFsb2ciLGNvcnM6ITB9LGRhdGFleGNoYW5nZTp7bmFtZToiRGF0YUV4Y2hhbmdlIn0sc2VzdjI6e25hbWU6IlNFU1YyIn0sbWlncmF0aW9uaHViY29uZmlnOntwcmVmaXg6Im1pZ3JhdGlvbmh1Yi1jb25maWciLG5hbWU6Ik1pZ3JhdGlvbkh1YkNvbmZpZyJ9LGNvbm5lY3RwYXJ0aWNpcGFudDp7bmFtZToiQ29ubmVjdFBhcnRpY2lwYW50In0sYXBwY29uZmlnOntuYW1lOiJBcHBDb25maWcifSxpb3RzZWN1cmV0dW5uZWxpbmc6e25hbWU6IklvVFNlY3VyZVR1bm5lbGluZyJ9LHdhZnYyOntuYW1lOiJXQUZWMiJ9LGVsYXN0aWNpbmZlcmVuY2U6e3ByZWZpeDoiZWxhc3RpYy1pbmZlcmVuY2UiLG5hbWU6IkVsYXN0aWNJbmZlcmVuY2UifSxpbWFnZWJ1aWxkZXI6e25hbWU6IkltYWdlYnVpbGRlciJ9LHNjaGVtYXM6e25hbWU6IlNjaGVtYXMifSxhY2Nlc3NhbmFseXplcjp7bmFtZToiQWNjZXNzQW5hbHl6ZXIifSxjb2RlZ3VydXJldmlld2VyOntwcmVmaXg6ImNvZGVndXJ1LXJldmlld2VyIixuYW1lOiJDb2RlR3VydVJldmlld2VyIn0sY29kZWd1cnVwcm9maWxlcjp7bmFtZToiQ29kZUd1cnVQcm9maWxlciJ9LGNvbXB1dGVvcHRpbWl6ZXI6e3ByZWZpeDoiY29tcHV0ZS1vcHRpbWl6ZXIiLG5hbWU6IkNvbXB1dGVPcHRpbWl6ZXIifSxmcmF1ZGRldGVjdG9yOntuYW1lOiJGcmF1ZERldGVjdG9yIn0sa2VuZHJhOntuYW1lOiJLZW5kcmEifSxuZXR3b3JrbWFuYWdlcjp7bmFtZToiTmV0d29ya01hbmFnZXIifSxvdXRwb3N0czp7bmFtZToiT3V0cG9zdHMifSxhdWdtZW50ZWRhaXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWEyaS1ydW50aW1lIixuYW1lOiJBdWdtZW50ZWRBSVJ1bnRpbWUifSxlYnM6e25hbWU6IkVCUyJ9LGtpbmVzaXN2aWRlb3NpZ25hbGluZ2NoYW5uZWxzOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8tc2lnbmFsaW5nIixuYW1lOiJLaW5lc2lzVmlkZW9TaWduYWxpbmdDaGFubmVscyIsY29yczohMH0sZGV0ZWN0aXZlOntuYW1lOiJEZXRlY3RpdmUifSxjb2Rlc3RhcmNvbm5lY3Rpb25zOntwcmVmaXg6ImNvZGVzdGFyLWNvbm5lY3Rpb25zIixuYW1lOiJDb2RlU3RhcmNvbm5lY3Rpb25zIn0sc3ludGhldGljczp7bmFtZToiU3ludGhldGljcyJ9LGlvdHNpdGV3aXNlOntuYW1lOiJJb1RTaXRlV2lzZSJ9LG1hY2llMjp7bmFtZToiTWFjaWUyIn0sY29kZWFydGlmYWN0OntuYW1lOiJDb2RlQXJ0aWZhY3QifSxob25leWNvZGU6e25hbWU6IkhvbmV5Y29kZSJ9LGl2czp7bmFtZToiSVZTIn0sYnJha2V0OntuYW1lOiJCcmFrZXQifSxpZGVudGl0eXN0b3JlOntuYW1lOiJJZGVudGl0eVN0b3JlIn0sYXBwZmxvdzp7bmFtZToiQXBwZmxvdyJ9LHJlZHNoaWZ0ZGF0YTp7cHJlZml4OiJyZWRzaGlmdC1kYXRhIixuYW1lOiJSZWRzaGlmdERhdGEifSxzc29hZG1pbjp7cHJlZml4OiJzc28tYWRtaW4iLG5hbWU6IlNTT0FkbWluIn0sdGltZXN0cmVhbXF1ZXJ5OntwcmVmaXg6InRpbWVzdHJlYW0tcXVlcnkiLG5hbWU6IlRpbWVzdHJlYW1RdWVyeSJ9LHRpbWVzdHJlYW13cml0ZTp7cHJlZml4OiJ0aW1lc3RyZWFtLXdyaXRlIixuYW1lOiJUaW1lc3RyZWFtV3JpdGUifSxzM291dHBvc3RzOntuYW1lOiJTM091dHBvc3RzIn0sZGF0YWJyZXc6e25hbWU6IkRhdGFCcmV3In0sc2VydmljZWNhdGFsb2dhcHByZWdpc3RyeTp7cHJlZml4OiJzZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSIsbmFtZToiU2VydmljZUNhdGFsb2dBcHBSZWdpc3RyeSJ9LG5ldHdvcmtmaXJld2FsbDp7cHJlZml4OiJuZXR3b3JrLWZpcmV3YWxsIixuYW1lOiJOZXR3b3JrRmlyZXdhbGwifSxtd2FhOntuYW1lOiJNV0FBIn0sYW1wbGlmeWJhY2tlbmQ6e25hbWU6IkFtcGxpZnlCYWNrZW5kIn0sYXBwaW50ZWdyYXRpb25zOntuYW1lOiJBcHBJbnRlZ3JhdGlvbnMifSxjb25uZWN0Y29udGFjdGxlbnM6e3ByZWZpeDoiY29ubmVjdC1jb250YWN0LWxlbnMiLG5hbWU6IkNvbm5lY3RDb250YWN0TGVucyJ9LGRldm9wc2d1cnU6e3ByZWZpeDoiZGV2b3BzLWd1cnUiLG5hbWU6IkRldk9wc0d1cnUifSxlY3JwdWJsaWM6e3ByZWZpeDoiZWNyLXB1YmxpYyIsbmFtZToiRUNSUFVCTElDIn0sbG9va291dHZpc2lvbjp7bmFtZToiTG9va291dFZpc2lvbiJ9LHNhZ2VtYWtlcmZlYXR1cmVzdG9yZXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWZlYXR1cmVzdG9yZS1ydW50aW1lIixuYW1lOiJTYWdlTWFrZXJGZWF0dXJlU3RvcmVSdW50aW1lIn0sY3VzdG9tZXJwcm9maWxlczp7cHJlZml4OiJjdXN0b21lci1wcm9maWxlcyIsbmFtZToiQ3VzdG9tZXJQcm9maWxlcyJ9LGF1ZGl0bWFuYWdlcjp7bmFtZToiQXVkaXRNYW5hZ2VyIn0sZW1yY29udGFpbmVyczp7cHJlZml4OiJlbXItY29udGFpbmVycyIsbmFtZToiRU1SY29udGFpbmVycyJ9LGhlYWx0aGxha2U6e25hbWU6IkhlYWx0aExha2UifSxzYWdlbWFrZXJlZGdlOntwcmVmaXg6InNhZ2VtYWtlci1lZGdlIixuYW1lOiJTYWdlbWFrZXJFZGdlIn0sYW1wOntuYW1lOiJBbXAiLGNvcnM6ITB9LGdyZWVuZ3Jhc3N2Mjp7bmFtZToiR3JlZW5ncmFzc1YyIn0saW90ZGV2aWNlYWR2aXNvcjp7bmFtZToiSW90RGV2aWNlQWR2aXNvciJ9LGlvdGZsZWV0aHViOntuYW1lOiJJb1RGbGVldEh1YiJ9LGlvdHdpcmVsZXNzOntuYW1lOiJJb1RXaXJlbGVzcyJ9LGxvY2F0aW9uOntuYW1lOiJMb2NhdGlvbiIsY29yczohMH0sd2VsbGFyY2hpdGVjdGVkOntuYW1lOiJXZWxsQXJjaGl0ZWN0ZWQifSxsZXhtb2RlbHN2Mjp7cHJlZml4OiJtb2RlbHMubGV4LnYyIixuYW1lOiJMZXhNb2RlbHNWMiJ9LGxleHJ1bnRpbWV2Mjp7cHJlZml4OiJydW50aW1lLmxleC52MiIsbmFtZToiTGV4UnVudGltZVYyIixjb3JzOiEwfSxmaXM6e25hbWU6IkZpcyJ9LGxvb2tvdXRtZXRyaWNzOntuYW1lOiJMb29rb3V0TWV0cmljcyJ9LG1nbjp7bmFtZToiTWduIn0sbG9va291dGVxdWlwbWVudDp7bmFtZToiTG9va291dEVxdWlwbWVudCJ9LG5pbWJsZTp7bmFtZToiTmltYmxlIn0sZmluc3BhY2U6e25hbWU6IkZpbnNwYWNlIn0sZmluc3BhY2VkYXRhOntwcmVmaXg6ImZpbnNwYWNlLWRhdGEiLG5hbWU6IkZpbnNwYWNlZGF0YSJ9LHNzbWNvbnRhY3RzOntwcmVmaXg6InNzbS1jb250YWN0cyIsbmFtZToiU1NNQ29udGFjdHMifSxzc21pbmNpZGVudHM6e3ByZWZpeDoic3NtLWluY2lkZW50cyIsbmFtZToiU1NNSW5jaWRlbnRzIn0sYXBwbGljYXRpb25jb3N0cHJvZmlsZXI6e25hbWU6IkFwcGxpY2F0aW9uQ29zdFByb2ZpbGVyIn0sYXBwcnVubmVyOntuYW1lOiJBcHBSdW5uZXIifSxwcm90b246e25hbWU6IlByb3RvbiJ9LHJvdXRlNTNyZWNvdmVyeWNsdXN0ZXI6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jbHVzdGVyIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDbHVzdGVyIn0scm91dGU1M3JlY292ZXJ5Y29udHJvbGNvbmZpZzp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LWNvbnRyb2wtY29uZmlnIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDb250cm9sQ29uZmlnIn0scm91dGU1M3JlY292ZXJ5cmVhZGluZXNzOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktcmVhZGluZXNzIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlSZWFkaW5lc3MifSxjaGltZXNka2lkZW50aXR5OntwcmVmaXg6ImNoaW1lLXNkay1pZGVudGl0eSIsbmFtZToiQ2hpbWVTREtJZGVudGl0eSJ9LGNoaW1lc2RrbWVzc2FnaW5nOntwcmVmaXg6ImNoaW1lLXNkay1tZXNzYWdpbmciLG5hbWU6IkNoaW1lU0RLTWVzc2FnaW5nIn0sc25vd2RldmljZW1hbmFnZW1lbnQ6e3ByZWZpeDoic25vdy1kZXZpY2UtbWFuYWdlbWVudCIsbmFtZToiU25vd0RldmljZU1hbmFnZW1lbnQifSxtZW1vcnlkYjp7bmFtZToiTWVtb3J5REIifSxvcGVuc2VhcmNoOntuYW1lOiJPcGVuU2VhcmNoIn0sa2Fma2Fjb25uZWN0OntuYW1lOiJLYWZrYUNvbm5lY3QifSx2b2ljZWlkOntwcmVmaXg6InZvaWNlLWlkIixuYW1lOiJWb2ljZUlEIn0sd2lzZG9tOntuYW1lOiJXaXNkb20ifSxhY2NvdW50OntuYW1lOiJBY2NvdW50In0sY2xvdWRjb250cm9sOntuYW1lOiJDbG91ZENvbnRyb2wifSxncmFmYW5hOntuYW1lOiJHcmFmYW5hIn0scGFub3JhbWE6e25hbWU6IlBhbm9yYW1hIn0sY2hpbWVzZGttZWV0aW5nczp7cHJlZml4OiJjaGltZS1zZGstbWVldGluZ3MiLG5hbWU6IkNoaW1lU0RLTWVldGluZ3MifSxyZXNpbGllbmNlaHViOntuYW1lOiJSZXNpbGllbmNlaHViIn0sbWlncmF0aW9uaHVic3RyYXRlZ3k6e25hbWU6Ik1pZ3JhdGlvbkh1YlN0cmF0ZWd5In0sYXBwY29uZmlnZGF0YTp7bmFtZToiQXBwQ29uZmlnRGF0YSJ9LGRyczp7bmFtZToiRHJzIn0sbWlncmF0aW9uaHVicmVmYWN0b3JzcGFjZXM6e3ByZWZpeDoibWlncmF0aW9uLWh1Yi1yZWZhY3Rvci1zcGFjZXMiLG5hbWU6Ik1pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzIn0sZXZpZGVudGx5OntuYW1lOiJFdmlkZW50bHkifSxpbnNwZWN0b3IyOntuYW1lOiJJbnNwZWN0b3IyIn0scmJpbjp7bmFtZToiUmJpbiJ9LHJ1bTp7bmFtZToiUlVNIn0sYmFja3VwZ2F0ZXdheTp7cHJlZml4OiJiYWNrdXAtZ2F0ZXdheSIsbmFtZToiQmFja3VwR2F0ZXdheSJ9LGlvdHR3aW5tYWtlcjp7bmFtZToiSW9UVHdpbk1ha2VyIn0sd29ya3NwYWNlc3dlYjp7cHJlZml4OiJ3b3Jrc3BhY2VzLXdlYiIsbmFtZToiV29ya1NwYWNlc1dlYiJ9LGFtcGxpZnl1aWJ1aWxkZXI6e25hbWU6IkFtcGxpZnlVSUJ1aWxkZXIifSxrZXlzcGFjZXM6e25hbWU6IktleXNwYWNlcyJ9LGJpbGxpbmdjb25kdWN0b3I6e25hbWU6IkJpbGxpbmdjb25kdWN0b3IifSxnYW1lc3BhcmtzOntuYW1lOiJHYW1lU3BhcmtzIn0scGlucG9pbnRzbXN2b2ljZXYyOntwcmVmaXg6InBpbnBvaW50LXNtcy12b2ljZS12MiIsbmFtZToiUGlucG9pbnRTTVNWb2ljZVYyIn0saXZzY2hhdDp7bmFtZToiSXZzY2hhdCJ9LGNoaW1lc2RrbWVkaWFwaXBlbGluZXM6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZGlhLXBpcGVsaW5lcyIsbmFtZToiQ2hpbWVTREtNZWRpYVBpcGVsaW5lcyJ9LGVtcnNlcnZlcmxlc3M6e3ByZWZpeDoiZW1yLXNlcnZlcmxlc3MiLG5hbWU6IkVNUlNlcnZlcmxlc3MifSxtMjp7bmFtZToiTTIifSxjb25uZWN0Y2FtcGFpZ25zOntuYW1lOiJDb25uZWN0Q2FtcGFpZ25zIn0scmVkc2hpZnRzZXJ2ZXJsZXNzOntwcmVmaXg6InJlZHNoaWZ0LXNlcnZlcmxlc3MiLG5hbWU6IlJlZHNoaWZ0U2VydmVybGVzcyJ9LHJvbGVzYW55d2hlcmU6e25hbWU6IlJvbGVzQW55d2hlcmUifSxsaWNlbnNlbWFuYWdlcnVzZXJzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci11c2VyLXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyVXNlclN1YnNjcmlwdGlvbnMifSxiYWNrdXBzdG9yYWdlOntuYW1lOiJCYWNrdXBTdG9yYWdlIn0scHJpdmF0ZW5ldHdvcmtzOntuYW1lOiJQcml2YXRlTmV0d29ya3MifSxzdXBwb3J0YXBwOntwcmVmaXg6InN1cHBvcnQtYXBwIixuYW1lOiJTdXBwb3J0QXBwIn0sY29udHJvbHRvd2VyOntuYW1lOiJDb250cm9sVG93ZXIifSxpb3RmbGVldHdpc2U6e25hbWU6IklvVEZsZWV0V2lzZSJ9LG1pZ3JhdGlvbmh1Ym9yY2hlc3RyYXRvcjp7bmFtZToiTWlncmF0aW9uSHViT3JjaGVzdHJhdG9yIn0sY29ubmVjdGNhc2VzOntuYW1lOiJDb25uZWN0Q2FzZXMifSxyZXNvdXJjZWV4cGxvcmVyMjp7cHJlZml4OiJyZXNvdXJjZS1leHBsb3Jlci0yIixuYW1lOiJSZXNvdXJjZUV4cGxvcmVyMiJ9LHNjaGVkdWxlcjp7bmFtZToiU2NoZWR1bGVyIn0sY2hpbWVzZGt2b2ljZTp7cHJlZml4OiJjaGltZS1zZGstdm9pY2UiLG5hbWU6IkNoaW1lU0RLVm9pY2UifSxpb3Ryb2JvcnVubmVyOntwcmVmaXg6ImlvdC1yb2JvcnVubmVyIixuYW1lOiJJb1RSb2JvUnVubmVyIn0sc3Ntc2FwOntwcmVmaXg6InNzbS1zYXAiLG5hbWU6IlNzbVNhcCJ9LG9hbTp7bmFtZToiT0FNIn0sYXJjem9uYWxzaGlmdDp7cHJlZml4OiJhcmMtem9uYWwtc2hpZnQiLG5hbWU6IkFSQ1pvbmFsU2hpZnQifSxvbWljczp7bmFtZToiT21pY3MifSxvcGVuc2VhcmNoc2VydmVybGVzczp7bmFtZToiT3BlblNlYXJjaFNlcnZlcmxlc3MifSxzZWN1cml0eWxha2U6e25hbWU6IlNlY3VyaXR5TGFrZSJ9LHNpbXNwYWNld2VhdmVyOntuYW1lOiJTaW1TcGFjZVdlYXZlciJ9LGRvY2RiZWxhc3RpYzp7cHJlZml4OiJkb2NkYi1lbGFzdGljIixuYW1lOiJEb2NEQkVsYXN0aWMifSxzYWdlbWFrZXJnZW9zcGF0aWFsOntwcmVmaXg6InNhZ2VtYWtlci1nZW9zcGF0aWFsIixuYW1lOiJTYWdlTWFrZXJHZW9zcGF0aWFsIn0sY29kZWNhdGFseXN0OntuYW1lOiJDb2RlQ2F0YWx5c3QifSxwaXBlczp7bmFtZToiUGlwZXMifSxzYWdlbWFrZXJtZXRyaWNzOntwcmVmaXg6InNhZ2VtYWtlci1tZXRyaWNzIixuYW1lOiJTYWdlTWFrZXJNZXRyaWNzIn0sa2luZXNpc3ZpZGVvd2VicnRjc3RvcmFnZTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXdlYnJ0Yy1zdG9yYWdlIixuYW1lOiJLaW5lc2lzVmlkZW9XZWJSVENTdG9yYWdlIn0sbGljZW5zZW1hbmFnZXJsaW51eHN1YnNjcmlwdGlvbnM6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyLWxpbnV4LXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyTGludXhTdWJzY3JpcHRpb25zIn0sa2VuZHJhcmFua2luZzp7cHJlZml4OiJrZW5kcmEtcmFua2luZyIsbmFtZToiS2VuZHJhUmFua2luZyJ9LGNsZWFucm9vbXM6e25hbWU6IkNsZWFuUm9vbXMifSxjbG91ZHRyYWlsZGF0YTp7cHJlZml4OiJjbG91ZHRyYWlsLWRhdGEiLG5hbWU6IkNsb3VkVHJhaWxEYXRhIn0sdG5iOntuYW1lOiJUbmIifSxpbnRlcm5ldG1vbml0b3I6e25hbWU6IkludGVybmV0TW9uaXRvciJ9LGl2c3JlYWx0aW1lOntwcmVmaXg6Iml2cy1yZWFsdGltZSIsbmFtZToiSVZTUmVhbFRpbWUifSx2cGNsYXR0aWNlOntwcmVmaXg6InZwYy1sYXR0aWNlIixuYW1lOiJWUENMYXR0aWNlIn0sb3Npczp7bmFtZToiT1NJUyJ9LG1lZGlhcGFja2FnZXYyOntuYW1lOiJNZWRpYVBhY2thZ2VWMiJ9LHBheW1lbnRjcnlwdG9ncmFwaHk6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHkiLG5hbWU6IlBheW1lbnRDcnlwdG9ncmFwaHkifSxwYXltZW50Y3J5cHRvZ3JhcGh5ZGF0YTp7cHJlZml4OiJwYXltZW50LWNyeXB0b2dyYXBoeS1kYXRhIixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5RGF0YSJ9LGNvZGVndXJ1c2VjdXJpdHk6e3ByZWZpeDoiY29kZWd1cnUtc2VjdXJpdHkiLG5hbWU6IkNvZGVHdXJ1U2VjdXJpdHkifSx2ZXJpZmllZHBlcm1pc3Npb25zOntuYW1lOiJWZXJpZmllZFBlcm1pc3Npb25zIn0sYXBwZmFicmljOntuYW1lOiJBcHBGYWJyaWMifSxtZWRpY2FsaW1hZ2luZzp7cHJlZml4OiJtZWRpY2FsLWltYWdpbmciLG5hbWU6Ik1lZGljYWxJbWFnaW5nIn0sZW50aXR5cmVzb2x1dGlvbjp7bmFtZToiRW50aXR5UmVzb2x1dGlvbiJ9LG1hbmFnZWRibG9ja2NoYWlucXVlcnk6e3ByZWZpeDoibWFuYWdlZGJsb2NrY2hhaW4tcXVlcnkiLG5hbWU6Ik1hbmFnZWRCbG9ja2NoYWluUXVlcnkifSxuZXB0dW5lZGF0YTp7bmFtZToiTmVwdHVuZWRhdGEifSxwY2Fjb25uZWN0b3JhZDp7cHJlZml4OiJwY2EtY29ubmVjdG9yLWFkIixuYW1lOiJQY2FDb25uZWN0b3JBZCJ9fX0se31dLDU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTEtMDYtMTUiLGVuZHBvaW50UHJlZml4OiJzdHMiLGdsb2JhbEVuZHBvaW50OiJzdHMuYW1hem9uYXdzLmNvbSIscHJvdG9jb2w6InF1ZXJ5IixzZXJ2aWNlQWJicmV2aWF0aW9uOiJBV1MgU1RTIixzZXJ2aWNlRnVsbE5hbWU6IkFXUyBTZWN1cml0eSBUb2tlbiBTZXJ2aWNlIixzZXJ2aWNlSWQ6IlNUUyIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHVpZDoic3RzLTIwMTEtMDYtMTUiLHhtbE5hbWVzcGFjZToiaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8ifSxvcGVyYXRpb25zOntBc3N1bWVSb2xlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJSb2xlU2Vzc2lvbk5hbWUiXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sVGFnczp7c2hhcGU6IlM4In0sVHJhbnNpdGl2ZVRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sRXh0ZXJuYWxJZDp7fSxTZXJpYWxOdW1iZXI6e30sVG9rZW5Db2RlOnt9LFNvdXJjZUlkZW50aXR5Ont9LFByb3ZpZGVkQ29udGV4dHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlckFybjp7fSxDb250ZXh0QXNzZXJ0aW9uOnt9fX19fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTb3VyY2VJZGVudGl0eTp7fX19fSxBc3N1bWVSb2xlV2l0aFNBTUw6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlByaW5jaXBhbEFybiIsIlNBTUxBc3NlcnRpb24iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFByaW5jaXBhbEFybjp7fSxTQU1MQXNzZXJ0aW9uOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlV2l0aFNBTUxSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFN1YmplY3Q6e30sU3ViamVjdFR5cGU6e30sSXNzdWVyOnt9LEF1ZGllbmNlOnt9LE5hbWVRdWFsaWZpZXI6e30sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIiwiV2ViSWRlbnRpdHlUb2tlbiJdLG1lbWJlcnM6e1JvbGVBcm46e30sUm9sZVNlc3Npb25OYW1lOnt9LFdlYklkZW50aXR5VG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxQcm92aWRlcklkOnt9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sU3ViamVjdEZyb21XZWJJZGVudGl0eVRva2VuOnt9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFByb3ZpZGVyOnt9LEF1ZGllbmNlOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LERlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkVuY29kZWRNZXNzYWdlIl0sbWVtYmVyczp7RW5jb2RlZE1lc3NhZ2U6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkRlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0RlY29kZWRNZXNzYWdlOnt9fX19LEdldEFjY2Vzc0tleUluZm86e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0QWNjZXNzS2V5SW5mb1Jlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2NvdW50Ont9fX19LEdldENhbGxlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldENhbGxlcklkZW50aXR5UmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1VzZXJJZDp7fSxBY2NvdW50Ont9LEFybjp7fX19fSxHZXRGZWRlcmF0aW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTmFtZSJdLG1lbWJlcnM6e05hbWU6e30sUG9saWN5Ont9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRGZWRlcmF0aW9uVG9rZW5SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEZlZGVyYXRlZFVzZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJGZWRlcmF0ZWRVc2VySWQiLCJBcm4iXSxtZW1iZXJzOntGZWRlcmF0ZWRVc2VySWQ6e30sQXJuOnt9fX0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9fX19LEdldFNlc3Npb25Ub2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7RHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0U2Vzc2lvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifX19fX0sc2hhcGVzOntTNDp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2Fybjp7fX19fSxTODp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiS2V5IiwiVmFsdWUiXSxtZW1iZXJzOntLZXk6e30sVmFsdWU6e319fX0sU2w6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBY2Nlc3NLZXlJZCIsIlNlY3JldEFjY2Vzc0tleSIsIlNlc3Npb25Ub2tlbiIsIkV4cGlyYXRpb24iXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRBY2Nlc3NLZXk6e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxTZXNzaW9uVG9rZW46e30sRXhwaXJhdGlvbjp7dHlwZToidGltZXN0YW1wIn19fSxTcTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFzc3VtZWRSb2xlSWQiLCJBcm4iXSxtZW1iZXJzOntBc3N1bWVkUm9sZUlkOnt9LEFybjp7fX19fX19LHt9XSw2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOnt9fX0se31dLDc6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuLi9saWIvbm9kZV9sb2FkZXIiKTt2YXIgcj1lKCIuLi9saWIvY29yZSIpLG89ci5TZXJ2aWNlLGk9ci5hcGlMb2FkZXI7aS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHk9e30sci5Db2duaXRvSWRlbnRpdHk9by5kZWZpbmVTZXJ2aWNlKCJjb2duaXRvaWRlbnRpdHkiLFsiMjAxNC0wNi0zMCJdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHksIjIwMTQtMDYtMzAiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiIpO3JldHVybiB0LnBhZ2luYXRvcnM9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLkNvZ25pdG9JZGVudGl0eX0seyIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiI6MSwiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIjoyLCIuLi9saWIvY29yZSI6MTksIi4uL2xpYi9ub2RlX2xvYWRlciI6MTZ9XSw4OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuc3RzPXt9LHIuU1RTPW8uZGVmaW5lU2VydmljZSgic3RzIixbIjIwMTEtMDYtMTUiXSksZSgiLi4vbGliL3NlcnZpY2VzL3N0cyIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnNlcnZpY2VzLnN0cywiMjAxMS0wNi0xNSIse2dldDpmdW5jdGlvbigpe3ZhciB0PWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLlNUU30seyIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIjo1LCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiI6NiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2LCIuLi9saWIvc2VydmljZXMvc3RzIjo2M31dLDk6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7aWYoIXIuc2VydmljZXMuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkU2VydmljZTogRmFpbGVkIHRvIGxvYWQgYXBpIGZvciAiK2UpO3JldHVybiByLnNlcnZpY2VzW2VdW3RdfXIuc2VydmljZXM9e30sdC5leHBvcnRzPXJ9LHt9XSwxMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3NlckhtYWMiKSxvPWUoIi4vYnJvd3Nlck1kNSIpLGk9ZSgiLi9icm93c2VyU2hhMSIpLHM9ZSgiLi9icm93c2VyU2hhMjU2Iik7dC5leHBvcnRzPXtjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe2lmKCJtZDUiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbmV3IG87aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcztpZigic2hhMSI9PT1lKXJldHVybiBuZXcgaTt0aHJvdyBuZXcgRXJyb3IoIkhhc2ggYWxnb3JpdGhtICIrZSsiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgU0RLIil9LGNyZWF0ZUhtYWM6ZnVuY3Rpb24oZSx0KXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyByKG8sdCk7aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcihzLHQpO2lmKCJzaGExIj09PWUpcmV0dXJuIG5ldyByKGksdCk7dGhyb3cgbmV3IEVycm9yKCJITUFDIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVTaWduOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJjcmVhdGVTaWduIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgYnJvd3NlciIpfX19LHsiLi9icm93c2VySG1hYyI6MTIsIi4vYnJvd3Nlck1kNSI6MTMsIi4vYnJvd3NlclNoYTEiOjE0LCIuL2Jyb3dzZXJTaGEyNTYiOjE1fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyOyJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnZvaWQgMD09PUFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gby5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSk+LTF9KTt2YXIgbz1bIltvYmplY3QgSW50OEFycmF5XSIsIltvYmplY3QgVWludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsIltvYmplY3QgSW50MTZBcnJheV0iLCJbb2JqZWN0IFVpbnQxNkFycmF5XSIsIltvYmplY3QgSW50MzJBcnJheV0iLCJbb2JqZWN0IFVpbnQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIltvYmplY3QgRGF0YVZpZXddIl07dC5leHBvcnRzPXtpc0VtcHR5RGF0YTpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/MD09PWUubGVuZ3RoOjA9PT1lLmJ5dGVMZW5ndGh9LGNvbnZlcnRUb0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPW5ldyByKGUsInV0ZjgiKSksQXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgvVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk6bmV3IFVpbnQ4QXJyYXkoZSl9fX0seyJidWZmZXIvIjo4Nn1dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySGFzaFV0aWxzIik7ZnVuY3Rpb24gbyhlLHQpe3RoaXMuaGFzaD1uZXcgZSx0aGlzLm91dGVyPW5ldyBlO3ZhciBuPWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5jb252ZXJ0VG9CdWZmZXIodCk7aWYobi5ieXRlTGVuZ3RoPmUuQkxPQ0tfU0laRSl7dmFyIG89bmV3IGU7by51cGRhdGUobiksbj1vLmRpZ2VzdCgpfXZhciBpPW5ldyBVaW50OEFycmF5KGUuQkxPQ0tfU0laRSk7cmV0dXJuIGkuc2V0KG4pLGl9KGUsdCksbz1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO28uc2V0KG4pO2Zvcih2YXIgaT0wO2k8ZS5CTE9DS19TSVpFO2krKyluW2ldXj01NCxvW2ldXj05Mjtmb3IodGhpcy5oYXNoLnVwZGF0ZShuKSx0aGlzLm91dGVyLnVwZGF0ZShvKSxpPTA7aTxuLmJ5dGVMZW5ndGg7aSsrKW5baV09MH10LmV4cG9ydHM9byxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKXx8dGhpcy5lcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5oYXNoLnVwZGF0ZShyLmNvbnZlcnRUb0J1ZmZlcihlKSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXJldHVybiB0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWR8fHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaGFzaC5kaWdlc3QoKSksdGhpcy5vdXRlci5kaWdlc3QoZSl9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTF9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpLG89ZSgiYnVmZmVyLyIpLkJ1ZmZlcixpPTY0O2Z1bmN0aW9uIHMoKXt0aGlzLnN0YXRlPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdLHRoaXMuYnVmZmVyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoaSkpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITF9ZnVuY3Rpb24gYShlLHQsbixyLG8saSl7cmV0dXJuKCh0PSh0K2UmNDI5NDk2NzI5NSkrKHIraSY0Mjk0OTY3Mjk1KSY0Mjk0OTY3Mjk1KTw8b3x0Pj4+MzItbykrbiY0Mjk0OTY3Mjk1fWZ1bmN0aW9uIGMoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodCZufH50JnIsZSx0LG8saSxzKX1mdW5jdGlvbiB1KGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmcnxuJn5yLGUsdCxvLGkscyl9ZnVuY3Rpb24gbChlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0Xm5ecixlLHQsbyxpLHMpfWZ1bmN0aW9uIHAoZSx0LG4scixvLGkscyl7cmV0dXJuIGEobl4odHx+ciksZSx0LG8saSxzKX10LmV4cG9ydHM9cyxzLkJMT0NLX1NJWkU9aSxzLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpcztpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7dmFyIHQ9ci5jb252ZXJ0VG9CdWZmZXIoZSksbj0wLG89dC5ieXRlTGVuZ3RoO2Zvcih0aGlzLmJ5dGVzSGFzaGVkKz1vO28+MDspdGhpcy5idWZmZXIuc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKyx0W24rK10pLG8tLSx0aGlzLmJ1ZmZlckxlbmd0aD09PWkmJih0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wKTtyZXR1cm4gdGhpc30scy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLG49dC5idWZmZXIscj10LmJ1ZmZlckxlbmd0aCxzPTgqdC5ieXRlc0hhc2hlZDtpZihuLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssMTI4KSxyJWk+PTU2KXtmb3IodmFyIGE9dGhpcy5idWZmZXJMZW5ndGg7YTxpO2ErKyluLnNldFVpbnQ4KGEsMCk7dGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MH1mb3IoYT10aGlzLmJ1ZmZlckxlbmd0aDthPDU2O2ErKyluLnNldFVpbnQ4KGEsMCk7bi5zZXRVaW50MzIoNTYscz4+PjAsITApLG4uc2V0VWludDMyKDYwLE1hdGguZmxvb3Iocy80Mjk0OTY3Mjk2KSwhMCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYz1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7Zm9yKGE9MDthPDQ7YSsrKWMuc2V0VWludDMyKDQqYSx0aGlzLnN0YXRlW2FdLCEwKTt2YXIgdT1uZXcgbyhjLmJ1ZmZlcixjLmJ5dGVPZmZzZXQsYy5ieXRlTGVuZ3RoKTtyZXR1cm4gZT91LnRvU3RyaW5nKGUpOnV9LHMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ1ZmZlcix0PXRoaXMuc3RhdGUsbj10WzBdLHI9dFsxXSxvPXRbMl0saT10WzNdO249YyhuLHIsbyxpLGUuZ2V0VWludDMyKDAsITApLDcsMzYxNDA5MDM2MCksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNCwhMCksMTIsMzkwNTQwMjcxMCksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTcsNjA2MTA1ODE5KSxyPWMocixvLGksbixlLmdldFVpbnQzMigxMiwhMCksMjIsMzI1MDQ0MTk2Niksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMTYsITApLDcsNDExODU0ODM5OSksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMjAsITApLDEyLDEyMDAwODA0MjYpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDI0LCEwKSwxNywyODIxNzM1OTU1KSxyPWMocixvLGksbixlLmdldFVpbnQzMigyOCwhMCksMjIsNDI0OTI2MTMxMyksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMzIsITApLDcsMTc3MDAzNTQxNiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMzYsITApLDEyLDIzMzY1NTI4NzkpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNyw0Mjk0OTI1MjMzKSxyPWMocixvLGksbixlLmdldFVpbnQzMig0NCwhMCksMjIsMjMwNDU2MzEzNCksbj1jKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDcsMTgwNDYwMzY4MiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNTIsITApLDEyLDQyNTQ2MjYxOTUpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNywyNzkyOTY1MDA2KSxuPXUobixyPWMocixvLGksbixlLmdldFVpbnQzMig2MCwhMCksMjIsMTIzNjUzNTMyOSksbyxpLGUuZ2V0VWludDMyKDQsITApLDUsNDEyOTE3MDc4NiksaT11KGksbixyLG8sZS5nZXRVaW50MzIoMjQsITApLDksMzIyNTQ2NTY2NCksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoNDQsITApLDE0LDY0MzcxNzcxMykscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMCwhMCksMjAsMzkyMTA2OTk5NCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMjAsITApLDUsMzU5MzQwODYwNSksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNDAsITApLDksMzgwMTYwODMpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDYwLCEwKSwxNCwzNjM0NDg4OTYxKSxyPXUocixvLGksbixlLmdldFVpbnQzMigxNiwhMCksMjAsMzg4OTQyOTQ0OCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMzYsITApLDUsNTY4NDQ2NDM4KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig1NiwhMCksOSwzMjc1MTYzNjA2KSxvPXUobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTQsNDEwNzYwMzMzNSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMzIsITApLDIwLDExNjM1MzE1MDEpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDUyLCEwKSw1LDI4NTAyODU4MjkpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDgsITApLDksNDI0MzU2MzUxMiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE0LDE3MzUzMjg0NzMpLG49bChuLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDQ4LCEwKSwyMCwyMzY4MzU5NTYyKSxvLGksZS5nZXRVaW50MzIoMjAsITApLDQsNDI5NDU4ODczOCksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMzIsITApLDExLDIyNzIzOTI4MzMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNiwxODM5MDMwNTYyKSxyPWwocixvLGksbixlLmdldFVpbnQzMig1NiwhMCksMjMsNDI1OTY1Nzc0MCksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNCwhMCksNCwyNzYzOTc1MjM2KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigxNiwhMCksMTEsMTI3Mjg5MzM1Myksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE2LDQxMzk0Njk2NjQpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDQwLCEwKSwyMywzMjAwMjM2NjU2KSxuPWwobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNCw2ODEyNzkxNzQpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDAsITApLDExLDM5MzY0MzAwNzQpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDEyLCEwKSwxNiwzNTcyNDQ1MzE3KSxyPWwocixvLGksbixlLmdldFVpbnQzMigyNCwhMCksMjMsNzYwMjkxODkpLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw0LDM2NTQ2MDI4MDkpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDQ4LCEwKSwxMSwzODczMTUxNDYxKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTYsNTMwNzQyNTIwKSxuPXAobixyPWwocixvLGksbixlLmdldFVpbnQzMig4LCEwKSwyMywzMjk5NjI4NjQ1KSxvLGksZS5nZXRVaW50MzIoMCwhMCksNiw0MDk2MzM2NDUyKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigyOCwhMCksMTAsMTEyNjg5MTQxNSksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNTYsITApLDE1LDI4Nzg2MTIzOTEpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDIwLCEwKSwyMSw0MjM3NTMzMjQxKSxuPXAobixyLG8saSxlLmdldFVpbnQzMig0OCwhMCksNiwxNzAwNDg1NTcxKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigxMiwhMCksMTAsMjM5OTk4MDY5MCksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNDAsITApLDE1LDQyOTM5MTU3NzMpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDQsITApLDIxLDIyNDAwNDQ0OTcpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw2LDE4NzMzMTMzNTkpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDYwLCEwKSwxMCw0MjY0MzU1NTUyKSxvPXAobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTUsMjczNDc2ODkxNikscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoNTIsITApLDIxLDEzMDkxNTE2NDkpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw2LDQxNDk0NDQyMjYpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDQ0LCEwKSwxMCwzMTc0NzU2OTE3KSxvPXAobyxpLG4scixlLmdldFVpbnQzMig4LCEwKSwxNSw3MTg3ODcyNTkpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDM2LCEwKSwyMSwzOTUxNDgxNzQ1KSx0WzBdPW4rdFswXSY0Mjk0OTY3Mjk1LHRbMV09cit0WzFdJjQyOTQ5NjcyOTUsdFsyXT1vK3RbMl0mNDI5NDk2NzI5NSx0WzNdPWkrdFszXSY0Mjk0OTY3Mjk1fX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixvPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIGkoKXt0aGlzLmgwPTE3MzI1ODQxOTMsdGhpcy5oMT00MDIzMjMzNDE3LHRoaXMuaDI9MjU2MjM4MzEwMix0aGlzLmgzPTI3MTczMzg3OCx0aGlzLmg0PTMyODUzNzc1MjAsdGhpcy5ibG9jaz1uZXcgVWludDMyQXJyYXkoODApLHRoaXMub2Zmc2V0PTAsdGhpcy5zaGlmdD0yNCx0aGlzLnRvdGFsTGVuZ3RoPTB9bmV3IFVpbnQzMkFycmF5KFsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0pLE1hdGgucG93KDIsNTMpLHQuZXhwb3J0cz1pLGkuQkxPQ0tfU0laRT02NCxpLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmxlbmd0aDt0aGlzLnRvdGFsTGVuZ3RoKz04KnQ7Zm9yKHZhciBuPTA7bjx0O24rKyl0aGlzLndyaXRlKGVbbl0pO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlKXt0aGlzLmJsb2NrW3RoaXMub2Zmc2V0XXw9KDI1NSZlKTw8dGhpcy5zaGlmdCx0aGlzLnNoaWZ0P3RoaXMuc2hpZnQtPTg6KHRoaXMub2Zmc2V0KyssdGhpcy5zaGlmdD0yNCksMTY9PT10aGlzLm9mZnNldCYmdGhpcy5wcm9jZXNzQmxvY2soKX0saS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoMTI4KSwodGhpcy5vZmZzZXQ+MTR8fDE0PT09dGhpcy5vZmZzZXQmJnRoaXMuc2hpZnQ8MjQpJiZ0aGlzLnByb2Nlc3NCbG9jaygpLHRoaXMub2Zmc2V0PTE0LHRoaXMuc2hpZnQ9MjQsdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKDApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4weGZmZmZmZmZmZmY/dGhpcy50b3RhbExlbmd0aC8xMDk5NTExNjI3Nzc2OjApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD40Mjk0OTY3Mjk1P3RoaXMudG90YWxMZW5ndGgvNDI5NDk2NzI5NjowKTtmb3IodmFyIHQ9MjQ7dD49MDt0LT04KXRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4+dCk7dmFyIG49bmV3IHIoMjApLG89bmV3IERhdGFWaWV3KG4uYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0aGlzLmgwLCExKSxvLnNldFVpbnQzMig0LHRoaXMuaDEsITEpLG8uc2V0VWludDMyKDgsdGhpcy5oMiwhMSksby5zZXRVaW50MzIoMTIsdGhpcy5oMywhMSksby5zZXRVaW50MzIoMTYsdGhpcy5oNCwhMSksZT9uLnRvU3RyaW5nKGUpOm59LGkucHJvdG90eXBlLnByb2Nlc3NCbG9jaz1mdW5jdGlvbigpe2Zvcih2YXIgZT0xNjtlPDgwO2UrKyl7dmFyIHQ9dGhpcy5ibG9ja1tlLTNdXnRoaXMuYmxvY2tbZS04XV50aGlzLmJsb2NrW2UtMTRdXnRoaXMuYmxvY2tbZS0xNl07dGhpcy5ibG9ja1tlXT10PDwxfHQ+Pj4zMX12YXIgbixyLG89dGhpcy5oMCxpPXRoaXMuaDEscz10aGlzLmgyLGE9dGhpcy5oMyxjPXRoaXMuaDQ7Zm9yKGU9MDtlPDgwO2UrKyl7ZTwyMD8obj1hXmkmKHNeYSkscj0xNTE4NTAwMjQ5KTplPDQwPyhuPWlec15hLHI9MTg1OTc3NTM5Myk6ZTw2MD8obj1pJnN8YSYoaXxzKSxyPTI0MDA5NTk3MDgpOihuPWlec15hLHI9MzM5NTQ2OTc4Mik7dmFyIHU9KG88PDV8bz4+PjI3KStuK2MrcisoMHx0aGlzLmJsb2NrW2VdKTtjPWEsYT1zLHM9aTw8MzB8aT4+PjIsaT1vLG89dX1mb3IodGhpcy5oMD10aGlzLmgwK298MCx0aGlzLmgxPXRoaXMuaDEraXwwLHRoaXMuaDI9dGhpcy5oMitzfDAsdGhpcy5oMz10aGlzLmgzK2F8MCx0aGlzLmg0PXRoaXMuaDQrY3wwLHRoaXMub2Zmc2V0PTAsZT0wO2U8MTY7ZSsrKXRoaXMuYmxvY2tbZV09MH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxpPTY0LHM9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKSxhPU1hdGgucG93KDIsNTMpLTE7ZnVuY3Rpb24gYygpe3RoaXMuc3RhdGU9WzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfXQuZXhwb3J0cz1jLGMuQkxPQ0tfU0laRT1pLGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7aWYoby5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpczt2YXIgdD0wLG49KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmJ5dGVMZW5ndGg7aWYodGhpcy5ieXRlc0hhc2hlZCs9biw4KnRoaXMuYnl0ZXNIYXNoZWQ+YSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzIik7Zm9yKDtuPjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbdCsrXSxuLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9OCp0aGlzLmJ5dGVzSGFzaGVkLG49bmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyLmJ1ZmZlcix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0LHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpLG89dGhpcy5idWZmZXJMZW5ndGg7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksbyVpPj01Nil7Zm9yKHZhciBzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8aTtzKyspbi5zZXRVaW50OChzLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKHM9dGhpcy5idWZmZXJMZW5ndGg7czw1NjtzKyspbi5zZXRVaW50OChzLDApO24uc2V0VWludDMyKDU2LE1hdGguZmxvb3IodC80Mjk0OTY3Mjk2KSwhMCksbi5zZXRVaW50MzIoNjAsdCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYT1uZXcgcigzMik7Zm9yKHM9MDtzPDg7cysrKWFbNCpzXT10aGlzLnN0YXRlW3NdPj4+MjQmMjU1LGFbNCpzKzFdPXRoaXMuc3RhdGVbc10+Pj4xNiYyNTUsYVs0KnMrMl09dGhpcy5zdGF0ZVtzXT4+PjgmMjU1LGFbNCpzKzNdPXRoaXMuc3RhdGVbc10+Pj4wJjI1NTtyZXR1cm4gZT9hLnRvU3RyaW5nKGUpOmF9LGMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGE9dFszXSxjPXRbNF0sdT10WzVdLGw9dFs2XSxwPXRbN10sZD0wO2Q8aTtkKyspe2lmKGQ8MTYpdGhpcy50ZW1wW2RdPSgyNTUmZVs0KmRdKTw8MjR8KDI1NSZlWzQqZCsxXSk8PDE2fCgyNTUmZVs0KmQrMl0pPDw4fDI1NSZlWzQqZCszXTtlbHNle3ZhciBoPXRoaXMudGVtcFtkLTJdLGY9KGg+Pj4xN3xoPDwxNSleKGg+Pj4xOXxoPDwxMyleaD4+PjEwLGc9KChoPXRoaXMudGVtcFtkLTE1XSk+Pj43fGg8PDI1KV4oaD4+PjE4fGg8PDE0KV5oPj4+Mzt0aGlzLnRlbXBbZF09KGYrdGhpcy50ZW1wW2QtN118MCkrKGcrdGhpcy50ZW1wW2QtMTZdfDApfXZhciBtPSgoKGM+Pj42fGM8PDI2KV4oYz4+PjExfGM8PDIxKV4oYz4+PjI1fGM8PDcpKSsoYyZ1Xn5jJmwpfDApKyhwKyhzW2RdK3RoaXMudGVtcFtkXXwwKXwwKXwwLHY9KChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpKyhuJnJebiZvXnImbyl8MDtwPWwsbD11LHU9YyxjPWErbXwwLGE9byxvPXIscj1uLG49bSt2fDB9dFswXSs9bix0WzFdKz1yLHRbMl0rPW8sdFszXSs9YSx0WzRdKz1jLHRbNV0rPXUsdFs2XSs9bCx0WzddKz1wfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vdXRpbCIpO24uY3J5cHRvLmxpYj1lKCIuL2Jyb3dzZXJDcnlwdG9MaWIiKSxuLkJ1ZmZlcj1lKCJidWZmZXIvIikuQnVmZmVyLG4udXJsPWUoInVybC8iKSxuLnF1ZXJ5c3RyaW5nPWUoInF1ZXJ5c3RyaW5nLyIpLG4ucmVhbENsb2NrPWUoIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayIpLG4uZW52aXJvbm1lbnQ9ImpzIixuLmNyZWF0ZUV2ZW50U3RyZWFtPWUoIi4vZXZlbnQtc3RyZWFtL2J1ZmZlcmVkLWNyZWF0ZS1ldmVudC1zdHJlYW0iKS5jcmVhdGVFdmVudFN0cmVhbSxuLmlzQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybiEwfSxuLmlzTm9kZT1mdW5jdGlvbigpe3JldHVybiExfTt2YXIgcj1lKCIuL2NvcmUiKTtpZih0LmV4cG9ydHM9cixlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksZSgiLi9jcmVkZW50aWFscy90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3dlYl9pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyIpLHIuWE1MLlBhcnNlcj1lKCIuL3htbC9icm93c2VyX3BhcnNlciIpLGUoIi4vaHR0cC94aHIiKSx2b2lkIDA9PT1vKXZhciBvPXticm93c2VyOiEwfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9icm93c2VyQ3J5cHRvTGliIjoxMCwiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY2hhaW5hYmxlX3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjEsIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyI6MjIsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjMsIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyI6MjQsIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIjoyNSwiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiOjI2LCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIjoyOCwiLi9odHRwL3hociI6MzYsIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayI6NTQsIi4vdXRpbCI6NzQsIi4veG1sL2Jyb3dzZXJfcGFyc2VyIjo3NSxfcHJvY2Vzczo5MSwiYnVmZmVyLyI6ODYsInF1ZXJ5c3RyaW5nLyI6OTgsInVybC8iOjEwMH1dLDE3OltmdW5jdGlvbihlLHQsbil7dmFyIHIsbz1lKCIuL2NvcmUiKTtlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksby5Db25maWc9by51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlPXRoaXMuZXh0cmFjdENyZWRlbnRpYWxzKGUpLG8udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKHQsbil7dGhpcy5zZXQodCxlW3RdLG4pfSkpfSxnZXRDcmVkZW50aWFsczpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4uY3JlZGVudGlhbHMpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IkNyZWRlbnRpYWxzRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJDcmVkZW50aWFsc0Vycm9yIn0pfW4uY3JlZGVudGlhbHM/ImZ1bmN0aW9uIj09dHlwZW9mIG4uY3JlZGVudGlhbHMuZ2V0P24uY3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tICIrbi5jcmVkZW50aWFscy5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmbi5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXl8fCh0PWkoIk1pc3NpbmcgY3JlZGVudGlhbHMiKSkscih0KSk6bi5jcmVkZW50aWFsUHJvdmlkZXI/bi5jcmVkZW50aWFsUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLmNyZWRlbnRpYWxzPXQscihlKX0pKTpyKGkoIk5vIGNyZWRlbnRpYWxzIHRvIGxvYWQiKSl9LGdldFRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcztmdW5jdGlvbiByKHQpe2UodCx0P251bGw6bi50b2tlbil9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBuZXcgby51dGlsLmVycm9yKHR8fG5ldyBFcnJvcix7Y29kZToiVG9rZW5FcnJvciIsbWVzc2FnZTplLG5hbWU6IlRva2VuRXJyb3IifSl9bi50b2tlbj8iZnVuY3Rpb24iPT10eXBlb2Ygbi50b2tlbi5nZXQ/bi50b2tlbi5nZXQoKGZ1bmN0aW9uKGUpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIHRva2VuIGZyb20gIituLnRva2VuLmNvbnN0cnVjdG9yLm5hbWUsZSkpLHIoZSl9KSk6KHQ9bnVsbCxuLnRva2VuLnRva2VufHwodD1pKCJNaXNzaW5nIHRva2VuIikpLHIodCkpOm4udG9rZW5Qcm92aWRlcj9uLnRva2VuUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLnRva2VuPXQscihlKX0pKTpyKGkoIk5vIHRva2VuIHRvIGxvYWQiKSl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ITEsZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSxuKXsodHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMua2V5cyxlKXx8by5TZXJ2aWNlLmhhc1NlcnZpY2UoZSkpJiZ0aGlzLnNldChlLG4pfSkpfSxsb2FkRnJvbVBhdGg6ZnVuY3Rpb24oZSl7dGhpcy5jbGVhcigpO3ZhciB0PUpTT04ucGFyc2Uoby51dGlsLnJlYWRGaWxlU3luYyhlKSksbj1uZXcgby5GaWxlU3lzdGVtQ3JlZGVudGlhbHMoZSkscj1uZXcgby5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbjtyZXR1cm4gci5wcm92aWRlcnMudW5zaGlmdChuKSxyLnJlc29sdmUoKGZ1bmN0aW9uKGUsbil7aWYoZSl0aHJvdyBlO3QuY3JlZGVudGlhbHM9bn0pKSx0aGlzLmNvbnN0cnVjdG9yKHQpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7by51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMua2V5cywoZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXNbZV19KSksdGhpcy5zZXQoImNyZWRlbnRpYWxzIix2b2lkIDApLHRoaXMuc2V0KCJjcmVkZW50aWFsUHJvdmlkZXIiLHZvaWQgMCl9LHNldDpmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dD8odm9pZCAwPT09biYmKG49dGhpcy5rZXlzW2VdKSx0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzKTpuKToiaHR0cE9wdGlvbnMiPT09ZSYmdGhpc1tlXT90aGlzW2VdPW8udXRpbC5tZXJnZSh0aGlzW2VdLHQpOnRoaXNbZV09dH0sa2V5czp7Y3JlZGVudGlhbHM6bnVsbCxjcmVkZW50aWFsUHJvdmlkZXI6bnVsbCxyZWdpb246bnVsbCxsb2dnZXI6bnVsbCxhcGlWZXJzaW9uczp7fSxhcGlWZXJzaW9uOm51bGwsZW5kcG9pbnQ6dm9pZCAwLGh0dHBPcHRpb25zOnt0aW1lb3V0OjEyZTR9LG1heFJldHJpZXM6dm9pZCAwLG1heFJlZGlyZWN0czoxMCxwYXJhbVZhbGlkYXRpb246ITAsc3NsRW5hYmxlZDohMCxzM0ZvcmNlUGF0aFN0eWxlOiExLHMzQnVja2V0RW5kcG9pbnQ6ITEsczNEaXNhYmxlQm9keVNpZ25pbmc6ITAsczNVc0Vhc3QxUmVnaW9uYWxFbmRwb2ludDoibGVnYWN5IixzM1VzZUFyblJlZ2lvbjp2b2lkIDAsY29tcHV0ZUNoZWNrc3VtczohMCxjb252ZXJ0UmVzcG9uc2VUeXBlczohMCxjb3JyZWN0Q2xvY2tTa2V3OiExLGN1c3RvbVVzZXJBZ2VudDpudWxsLGR5bmFtb0RiQ3JjMzI6ITAsc3lzdGVtQ2xvY2tPZmZzZXQ6MCxzaWduYXR1cmVWZXJzaW9uOm51bGwsc2lnbmF0dXJlQ2FjaGU6ITAscmV0cnlEZWxheU9wdGlvbnM6e30sdXNlQWNjZWxlcmF0ZUVuZHBvaW50OiExLGNsaWVudFNpZGVNb25pdG9yaW5nOiExLGVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDp2b2lkIDAsZW5kcG9pbnRDYWNoZVNpemU6MWUzLGhvc3RQcmVmaXhFbmFibGVkOiEwLHN0c1JlZ2lvbmFsRW5kcG9pbnRzOiJsZWdhY3kiLHVzZUZpcHNFbmRwb2ludDohMSx1c2VEdWFsc3RhY2tFbmRwb2ludDohMSx0b2tlbjpudWxsfSxleHRyYWN0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWNjZXNzS2V5SWQmJmUuc2VjcmV0QWNjZXNzS2V5JiYoKGU9by51dGlsLmNvcHkoZSkpLmNyZWRlbnRpYWxzPW5ldyBvLkNyZWRlbnRpYWxzKGUpKSxlfSxzZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oZSl7cj1lLG51bGw9PT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSYmKHI9UHJvbWlzZSk7dmFyIHQ9W28uUmVxdWVzdCxvLkNyZWRlbnRpYWxzLG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW5dO28uUzMmJih0LnB1c2goby5TMyksby5TMy5NYW5hZ2VkVXBsb2FkJiZ0LnB1c2goby5TMy5NYW5hZ2VkVXBsb2FkKSksby51dGlsLmFkZFByb21pc2VzKHQscil9LGdldFByb21pc2VzRGVwZW5kZW5jeTpmdW5jdGlvbigpe3JldHVybiByfX0pLG8uY29uZmlnPW5ldyBvLkNvbmZpZ30seyIuL2NvcmUiOjE5LCIuL2NyZWRlbnRpYWxzIjoyMCwiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIjoyM31dLDE4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpO2Z1bmN0aW9uIG8oZSx0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKFsibGVnYWN5IiwicmVnaW9uYWwiXS5pbmRleE9mKGUudG9Mb3dlckNhc2UoKSk+PTApcmV0dXJuIGUudG9Mb3dlckNhc2UoKTt0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHQpfX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgaTtpZigoZT1lfHx7fSlbdC5jbGllbnRDb25maWddJiYoaT1vKGVbdC5jbGllbnRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZTonaW52YWxpZCAiJyt0LmNsaWVudENvbmZpZysnIiBjb25maWd1cmF0aW9uLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytlW3QuY2xpZW50Q29uZmlnXSsnIi4nfSkpKXJldHVybiBpO2lmKCFyLnV0aWwuaXNOb2RlKCkpcmV0dXJuIGk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LHQuZW52KSYmKGk9byhuLmVudlt0LmVudl0se2NvZGU6IkludmFsaWRFbnZpcm9ubWVudGFsVmFyaWFibGUiLG1lc3NhZ2U6ImludmFsaWQgIit0LmVudisnIGVudmlyb25tZW50YWwgdmFyaWFibGUuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK24uZW52W3QuZW52XSsnIi4nfSkpKXJldHVybiBpO3ZhciBzPXt9O3RyeXtzPXIudXRpbC5nZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWcoci51dGlsLmluaUxvYWRlcilbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV19Y2F0Y2goZSl7fXJldHVybiBzJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0LnNoYXJlZENvbmZpZykmJihpPW8oc1t0LnNoYXJlZENvbmZpZ10se2NvZGU6IkludmFsaWRDb25maWd1cmF0aW9uIixtZXNzYWdlOiJpbnZhbGlkICIrdC5zaGFyZWRDb25maWcrJyBwcm9maWxlIGNvbmZpZy4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrc1t0LnNoYXJlZENvbmZpZ10rJyIuJ30pKSxpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSxfcHJvY2Vzczo5MX1dLDE5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e3V0aWw6ZSgiLi91dGlsIil9Oyh7fSkudG9TdHJpbmcoKSx0LmV4cG9ydHM9cixyLnV0aWwudXBkYXRlKHIse1ZFUlNJT046IjIuMTQ1NS4wIixTaWduZXJzOnt9LFByb3RvY29sOntKc29uOmUoIi4vcHJvdG9jb2wvanNvbiIpLFF1ZXJ5OmUoIi4vcHJvdG9jb2wvcXVlcnkiKSxSZXN0OmUoIi4vcHJvdG9jb2wvcmVzdCIpLFJlc3RKc29uOmUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIiksUmVzdFhtbDplKCIuL3Byb3RvY29sL3Jlc3RfeG1sIil9LFhNTDp7QnVpbGRlcjplKCIuL3htbC9idWlsZGVyIiksUGFyc2VyOm51bGx9LEpTT046e0J1aWxkZXI6ZSgiLi9qc29uL2J1aWxkZXIiKSxQYXJzZXI6ZSgiLi9qc29uL3BhcnNlciIpfSxNb2RlbDp7QXBpOmUoIi4vbW9kZWwvYXBpIiksT3BlcmF0aW9uOmUoIi4vbW9kZWwvb3BlcmF0aW9uIiksU2hhcGU6ZSgiLi9tb2RlbC9zaGFwZSIpLFBhZ2luYXRvcjplKCIuL21vZGVsL3BhZ2luYXRvciIpLFJlc291cmNlV2FpdGVyOmUoIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIil9LGFwaUxvYWRlcjplKCIuL2FwaV9sb2FkZXIiKSxFbmRwb2ludENhY2hlOmUoIi4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSIpLkVuZHBvaW50Q2FjaGV9KSxlKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxlKCIuL3NlcnZpY2UiKSxlKCIuL2NvbmZpZyIpLGUoIi4vaHR0cCIpLGUoIi4vZXZlbnRfbGlzdGVuZXJzIiksZSgiLi9yZXF1ZXN0IiksZSgiLi9yZXNwb25zZSIpLGUoIi4vcmVzb3VyY2Vfd2FpdGVyIiksZSgiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIiksZSgiLi9wYXJhbV92YWxpZGF0b3IiKSxlKCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSIpLHIuZXZlbnRzPW5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcixyLnV0aWwubWVtb2l6ZWRQcm9wZXJ0eShyLCJlbmRwb2ludENhY2hlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuRW5kcG9pbnRDYWNoZShyLmNvbmZpZy5lbmRwb2ludENhY2hlU2l6ZSl9KSwhMCl9LHsiLi4vdmVuZG9yL2VuZHBvaW50LWNhY2hlIjoxMTEsIi4vYXBpX2xvYWRlciI6OSwiLi9jb25maWciOjE3LCIuL2V2ZW50X2xpc3RlbmVycyI6MzQsIi4vaHR0cCI6MzUsIi4vanNvbi9idWlsZGVyIjozNywiLi9qc29uL3BhcnNlciI6MzgsIi4vbWFpbnRlbmFuY2VfbW9kZV9tZXNzYWdlIjozOSwiLi9tb2RlbC9hcGkiOjQwLCIuL21vZGVsL29wZXJhdGlvbiI6NDIsIi4vbW9kZWwvcGFnaW5hdG9yIjo0MywiLi9tb2RlbC9yZXNvdXJjZV93YWl0ZXIiOjQ0LCIuL21vZGVsL3NoYXBlIjo0NSwiLi9wYXJhbV92YWxpZGF0b3IiOjQ2LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9yZXF1ZXN0Ijo1OCwiLi9yZXNvdXJjZV93YWl0ZXIiOjU5LCIuL3Jlc3BvbnNlIjo2MCwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSwiLi9zZXJ2aWNlIjo2MiwiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIjo2NiwiLi91dGlsIjo3NCwiLi94bWwvYnVpbGRlciI6NzZ9XSwyMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuQ3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7aWYoci51dGlsLmhpZGVQcm9wZXJ0aWVzKHRoaXMsWyJzZWNyZXRBY2Nlc3NLZXkiXSksdGhpcy5leHBpcmVkPSExLHRoaXMuZXhwaXJlVGltZT1udWxsLHRoaXMucmVmcmVzaENhbGxiYWNrcz1bXSwxPT09YXJndW1lbnRzLmxlbmd0aCYmIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXS5jcmVkZW50aWFsc3x8YXJndW1lbnRzWzBdO3RoaXMuYWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCx0aGlzLnNlY3JldEFjY2Vzc0tleT1lLnNlY3JldEFjY2Vzc0tleSx0aGlzLnNlc3Npb25Ub2tlbj1lLnNlc3Npb25Ub2tlbn1lbHNlIHRoaXMuYWNjZXNzS2V5SWQ9YXJndW1lbnRzWzBdLHRoaXMuc2VjcmV0QWNjZXNzS2V5PWFyZ3VtZW50c1sxXSx0aGlzLnNlc3Npb25Ub2tlbj1hcmd1bWVudHNbMl19LGV4cGlyeVdpbmRvdzoxNSxuZWVkc1JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZT1yLnV0aWwuZGF0ZS5nZXREYXRlKCkuZ2V0VGltZSgpLHQ9bmV3IERhdGUoZSsxZTMqdGhpcy5leHBpcnlXaW5kb3cpO3JldHVybiEhKHRoaXMuZXhwaXJlVGltZSYmdD50aGlzLmV4cGlyZVRpbWUpfHx0aGlzLmV4cGlyZWR8fCF0aGlzLmFjY2Vzc0tleUlkfHwhdGhpcy5zZWNyZXRBY2Nlc3NLZXl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMubmVlZHNSZWZyZXNoKCk/dGhpcy5yZWZyZXNoKChmdW5jdGlvbihuKXtufHwodC5leHBpcmVkPSExKSxlJiZlKG4pfSkpOmUmJmUoKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmV4cGlyZWQ9ITEsZSgpfSxjb2FsZXNjZVJlZnJlc2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzOzE9PT1uLnJlZnJlc2hDYWxsYmFja3MucHVzaChlKSYmbi5sb2FkKChmdW5jdGlvbihlKXtyLnV0aWwuYXJyYXlFYWNoKG4ucmVmcmVzaENhbGxiYWNrcywoZnVuY3Rpb24obil7dD9uKGUpOnIudXRpbC5kZWZlcigoZnVuY3Rpb24oKXtuKGUpfSkpfSkpLG4ucmVmcmVzaENhbGxiYWNrcy5sZW5ndGg9MH0pKX0sbG9hZDpmdW5jdGlvbihlKXtlKCl9fSksci5DcmVkZW50aWFscy5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUuZ2V0UHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJnZXQiLGUpLHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoInJlZnJlc2giLGUpfSxyLkNyZWRlbnRpYWxzLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLmdldFByb21pc2UsZGVsZXRlIHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlfSxyLnV0aWwuYWRkUHJvbWlzZXMoci5DcmVkZW50aWFscyl9LHsiLi9jb3JlIjoxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNoYWluYWJsZVRlbXBvcmFyeUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSxlPWV8fHt9LHRoaXMuZXJyb3JDb2RlPSJDaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZSIsdGhpcy5leHBpcmVkPSEwLHRoaXMudG9rZW5Db2RlRm49bnVsbDt2YXIgdD1yLnV0aWwuY29weShlLnBhcmFtcyl8fHt9O2lmKHQuUm9sZUFybiYmKHQuUm9sZVNlc3Npb25OYW1lPXQuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIiksdC5TZXJpYWxOdW1iZXIpe2lmKCFlLnRva2VuQ29kZUZufHwiZnVuY3Rpb24iIT10eXBlb2YgZS50b2tlbkNvZGVGbil0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcigidG9rZW5Db2RlRm4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcGFyYW1zLlNlcmlhbE51bWJlciBpcyBnaXZlbiIpLHtjb2RlOnRoaXMuZXJyb3JDb2RlfSk7dGhpcy50b2tlbkNvZGVGbj1lLnRva2VuQ29kZUZufXZhciBuPXIudXRpbC5tZXJnZSh7cGFyYW1zOnQsY3JlZGVudGlhbHM6ZS5tYXN0ZXJDcmVkZW50aWFsc3x8ci5jb25maWcuY3JlZGVudGlhbHN9LGUuc3RzQ29uZmlnfHx7fSk7dGhpcy5zZXJ2aWNlPW5ldyBvKG4pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuc2VydmljZS5jb25maWcucGFyYW1zLlJvbGVBcm4/ImFzc3VtZVJvbGUiOiJnZXRTZXNzaW9uVG9rZW4iO3RoaXMuZ2V0VG9rZW5Db2RlKChmdW5jdGlvbihyLG8pe3ZhciBpPXt9O3I/ZShyKToobyYmKGkuVG9rZW5Db2RlPW8pLHQuc2VydmljZVtuXShpLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpKX0pKX0sZ2V0VG9rZW5Db2RlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy50b2tlbkNvZGVGbj90aGlzLnRva2VuQ29kZUZuKHRoaXMuc2VydmljZS5jb25maWcucGFyYW1zLlNlcmlhbE51bWJlciwoZnVuY3Rpb24obixvKXtpZihuKXt2YXIgaT1uO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJihpPW4ubWVzc2FnZSksdm9pZCBlKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIkVycm9yIGZldGNoaW5nIE1GQSB0b2tlbjogIitpKSx7Y29kZTp0LmVycm9yQ29kZX0pKX1lKG51bGwsbyl9KSk6ZShudWxsKX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5IiksaT1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuQ29nbml0b0lkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7bG9jYWxTdG9yYWdlS2V5OntpZDoiYXdzLmNvZ25pdG8uaWRlbnRpdHktaWQuIixwcm92aWRlcnM6ImF3cy5jb2duaXRvLmlkZW50aXR5LXByb3ZpZGVycy4ifSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLl9pZGVudGl0eUlkPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KSx0aGlzLmxvYWRDYWNoZWRJZCgpO3ZhciBuPXRoaXM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkZW50aXR5SWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5sb2FkQ2FjaGVkSWQoKSxuLl9pZGVudGl0eUlkfHxuLnBhcmFtcy5JZGVudGl0eUlkfSxzZXQ6ZnVuY3Rpb24oZSl7bi5faWRlbnRpdHlJZD1lfX0pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LmRhdGE9bnVsbCx0Ll9pZGVudGl0eUlkPW51bGwsdC5nZXRJZCgoZnVuY3Rpb24obil7bj8odC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pLGUobikpOnQucGFyYW1zLlJvbGVBcm4/dC5nZXRDcmVkZW50aWFsc0Zyb21TVFMoZSk6dC5nZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5KGUpfSkpfSxjbGVhckNhY2hlZElkOmZ1bmN0aW9uKCl7dGhpcy5faWRlbnRpdHlJZD1udWxsLGRlbGV0ZSB0aGlzLnBhcmFtcy5JZGVudGl0eUlkO3ZhciBlPXRoaXMucGFyYW1zLklkZW50aXR5UG9vbElkLHQ9dGhpcy5wYXJhbXMuTG9naW5JZHx8IiI7ZGVsZXRlIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleS5pZCtlK3RdLGRlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkucHJvdmlkZXJzK2UrdF19LGNsZWFySWRPbk5vdEF1dGhvcml6ZWQ6ZnVuY3Rpb24oZSl7Ik5vdEF1dGhvcml6ZWRFeGNlcHRpb24iPT1lLmNvZGUmJnRoaXMuY2xlYXJDYWNoZWRJZCgpfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXJhbXMuSWRlbnRpdHlJZClyZXR1cm4gZShudWxsLHQucGFyYW1zLklkZW50aXR5SWQpO3QuY29nbml0by5nZXRJZCgoZnVuY3Rpb24obixyKXshbiYmci5JZGVudGl0eUlkPyh0LnBhcmFtcy5JZGVudGl0eUlkPXIuSWRlbnRpdHlJZCxlKG51bGwsci5JZGVudGl0eUlkKSk6ZShuKX0pKX0sbG9hZENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUsdCl7ZSYmdCYmKHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbil9LGdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNvZ25pdG8uZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eSgoZnVuY3Rpb24obixyKXtuP3QuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKToodC5jYWNoZUlkKHIpLHQuZGF0YT1yLHQubG9hZENyZWRlbnRpYWxzKHQuZGF0YSx0KSksZShuKX0pKX0sZ2V0Q3JlZGVudGlhbHNGcm9tU1RTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldE9wZW5JZFRva2VuKChmdW5jdGlvbihuLHIpe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKToodC5jYWNoZUlkKHIpLHQucGFyYW1zLldlYklkZW50aXR5VG9rZW49ci5Ub2tlbix0LndlYklkZW50aXR5Q3JlZGVudGlhbHMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZGF0YT10LndlYklkZW50aXR5Q3JlZGVudGlhbHMuZGF0YSx0LnN0cy5jcmVkZW50aWFsc0Zyb20odC5kYXRhLHQpKSxlKG4pfSkpKX0pKX0sbG9hZENhY2hlZElkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihyLnV0aWwuaXNCcm93c2VyKCkmJiFlLnBhcmFtcy5JZGVudGl0eUlkKXt2YXIgdD1lLmdldFN0b3JhZ2UoImlkIik7aWYodCYmZS5wYXJhbXMuTG9naW5zKXt2YXIgbj1PYmplY3Qua2V5cyhlLnBhcmFtcy5Mb2dpbnMpOzAhPT0oZS5nZXRTdG9yYWdlKCJwcm92aWRlcnMiKXx8IiIpLnNwbGl0KCIsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMSE9PW4uaW5kZXhPZihlKX0pKS5sZW5ndGgmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfWVsc2UgdCYmKGUucGFyYW1zLklkZW50aXR5SWQ9dCl9fSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xpZW50Q29uZmlnO2lmKHRoaXMud2ViSWRlbnRpdHlDcmVkZW50aWFscz10aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHN8fG5ldyByLldlYklkZW50aXR5Q3JlZGVudGlhbHModGhpcy5wYXJhbXMsZSksIXRoaXMuY29nbml0byl7dmFyIHQ9ci51dGlsLm1lcmdlKHt9LGUpO3QucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuY29nbml0bz1uZXcgbyh0KX10aGlzLnN0cz10aGlzLnN0c3x8bmV3IGkoZSl9LGNhY2hlSWQ6ZnVuY3Rpb24oZSl7dGhpcy5faWRlbnRpdHlJZD1lLklkZW50aXR5SWQsdGhpcy5wYXJhbXMuSWRlbnRpdHlJZD10aGlzLl9pZGVudGl0eUlkLHIudXRpbC5pc0Jyb3dzZXIoKSYmKHRoaXMuc2V0U3RvcmFnZSgiaWQiLGUuSWRlbnRpdHlJZCksdGhpcy5wYXJhbXMuTG9naW5zJiZ0aGlzLnNldFN0b3JhZ2UoInByb3ZpZGVycyIsT2JqZWN0LmtleXModGhpcy5wYXJhbXMuTG9naW5zKS5qb2luKCIsIikpKX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5W2VdK3RoaXMucGFyYW1zLklkZW50aXR5UG9vbElkKyh0aGlzLnBhcmFtcy5Mb2dpbklkfHwiIildfSxzZXRTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dHJ5e3RoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXT10fWNhdGNoKGUpe319LHN0b3JhZ2U6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci51dGlsLmlzQnJvd3NlcigpJiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlP3dpbmRvdy5sb2NhbFN0b3JhZ2U6e307cmV0dXJuIGVbImF3cy50ZXN0LXN0b3JhZ2UiXT0iZm9vYmFyIixkZWxldGUgZVsiYXdzLnRlc3Qtc3RvcmFnZSJdLGV9Y2F0Y2goZSl7cmV0dXJue319fSgpfSl9LHsiLi4vLi4vY2xpZW50cy9jb2duaXRvaWRlbnRpdHkiOjcsIi4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDIzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW49ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5wcm92aWRlcnM9ZXx8ci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWZhdWx0UHJvdmlkZXJzLnNsaWNlKDApLHRoaXMucmVzb2x2ZUNhbGxiYWNrcz1bXX0scmVzb2x2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKDA9PT10LnByb3ZpZGVycy5sZW5ndGgpcmV0dXJuIGUobmV3IEVycm9yKCJObyBwcm92aWRlcnMiKSksdDtpZigxPT09dC5yZXNvbHZlQ2FsbGJhY2tzLnB1c2goZSkpe3ZhciBuPTAsbz10LnByb3ZpZGVycy5zbGljZSgwKTshZnVuY3Rpb24gZShpLHMpe2lmKCFpJiZzfHxuPT09by5sZW5ndGgpcmV0dXJuIHIudXRpbC5hcnJheUVhY2godC5yZXNvbHZlQ2FsbGJhY2tzLChmdW5jdGlvbihlKXtlKGkscyl9KSksdm9pZCh0LnJlc29sdmVDYWxsYmFja3MubGVuZ3RoPTApO3ZhciBhPW9bbisrXTsocz0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLmNhbGwoKTphKS5nZXQ/cy5nZXQoKGZ1bmN0aW9uKHQpe2UodCx0P251bGw6cyl9KSk6ZShudWxsLHMpfSgpfXJldHVybiB0fX0pLHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycz1bXSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZXNvbHZlIixlKX0sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4pfSx7Ii4uL2NvcmUiOjE5fV0sMjQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuU0FNTENyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoU0FNTCgoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5UZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmxvYWRNYXN0ZXJDcmVkZW50aWFscyh0KSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZXx8e30sdGhpcy5wYXJhbXMuUm9sZUFybiYmKHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ0ZW1wb3JhcnktY3JlZGVudGlhbHMiKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5tYXN0ZXJDcmVkZW50aWFscy5nZXQoKGZ1bmN0aW9uKCl7dC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscz10Lm1hc3RlckNyZWRlbnRpYWxzLCh0LnBhcmFtcy5Sb2xlQXJuP3Quc2VydmljZS5hc3N1bWVSb2xlOnQuc2VydmljZS5nZXRTZXNzaW9uVG9rZW4pLmNhbGwodC5zZXJ2aWNlLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpfSkpfSxsb2FkTWFzdGVyQ3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7Zm9yKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9ZXx8ci5jb25maWcuY3JlZGVudGlhbHM7dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczspdGhpcy5tYXN0ZXJDcmVkZW50aWFscz10aGlzLm1hc3RlckNyZWRlbnRpYWxzLm1hc3RlckNyZWRlbnRpYWxzOyJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLm1hc3RlckNyZWRlbnRpYWxzLmdldCYmKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9bmV3IHIuQ3JlZGVudGlhbHModGhpcy5tYXN0ZXJDcmVkZW50aWFscykpfSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dGhpcy5zZXJ2aWNlPXRoaXMuc2VydmljZXx8bmV3IG8oe3BhcmFtczp0aGlzLnBhcmFtc30pfX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLldlYklkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lPXRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZXx8IndlYi1pZGVudGl0eSIsdGhpcy5kYXRhPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7dC5kYXRhPW51bGwsbnx8KHQuZGF0YT1yLHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe2lmKCF0aGlzLnNlcnZpY2Upe3ZhciBlPXIudXRpbC5tZXJnZSh7fSx0aGlzLl9jbGllbnRDb25maWcpO2UucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuc2VydmljZT1uZXcgbyhlKX19fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIiksbz1lKCIuL3V0aWwiKSxpPVsiQVdTX0VOQUJMRV9FTkRQT0lOVF9ESVNDT1ZFUlkiLCJBV1NfRU5EUE9JTlRfRElTQ09WRVJZX0VOQUJMRUQiXTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpfHx7fSxyPShuLm9wZXJhdGlvbnMse30pO3JldHVybiB0LmNvbmZpZy5yZWdpb24mJihyLnJlZ2lvbj10LmNvbmZpZy5yZWdpb24pLG4uc2VydmljZUlkJiYoci5zZXJ2aWNlSWQ9bi5zZXJ2aWNlSWQpLHQuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkJiYoci5hY2Nlc3NLZXlJZD10LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCkscn1mdW5jdGlvbiBhKGUsdCxuKXtuJiZudWxsIT10JiYic3RydWN0dXJlIj09PW4udHlwZSYmbi5yZXF1aXJlZCYmbi5yZXF1aXJlZC5sZW5ndGg+MCYmby5hcnJheUVhY2gobi5yZXF1aXJlZCwoZnVuY3Rpb24ocil7dmFyIG89bi5tZW1iZXJzW3JdO2lmKCEwPT09by5lbmRwb2ludERpc2NvdmVyeUlkKXt2YXIgaT1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTpyO2VbaV09U3RyaW5nKHRbcl0pfWVsc2UgYShlLHRbcl0sbyl9KSl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBhKG4sZS5wYXJhbXMsdCksbn1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpLGk9bi5vcGVyYXRpb25zP24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl06dm9pZCAwLGE9YyhlLGk/aS5pbnB1dDp2b2lkIDApLHU9cyhlKTtPYmplY3Qua2V5cyhhKS5sZW5ndGg+MCYmKHU9by51cGRhdGUodSxhKSxpJiYodS5vcGVyYXRpb249aS5uYW1lKSk7dmFyIGw9ci5lbmRwb2ludENhY2hlLmdldCh1KTtpZighbHx8MSE9PWwubGVuZ3RofHwiIiE9PWxbMF0uQWRkcmVzcylpZihsJiZsLmxlbmd0aD4wKWUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQobFswXS5BZGRyZXNzKTtlbHNle3ZhciBwPXQubWFrZVJlcXVlc3Qobi5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmkubmFtZSxJZGVudGlmaWVyczphfSk7ZChwKSxwLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHAucmVtb3ZlTGlzdGVuZXIoInJldHJ5IixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuUkVUUllfQ0hFQ0spLHIuZW5kcG9pbnRDYWNoZS5wdXQodSxbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6MX1dKSxwLnNlbmQoKGZ1bmN0aW9uKGUsdCl7dCYmdC5FbmRwb2ludHM/ci5lbmRwb2ludENhY2hlLnB1dCh1LHQuRW5kcG9pbnRzKTplJiZyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSl9KSl9fXZhciBsPXt9O2Z1bmN0aW9uIHAoZSx0KXt2YXIgbj1lLnNlcnZpY2UsaT1uLmFwaSxhPWkub3BlcmF0aW9ucz9pLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCx1PWE/YS5pbnB1dDp2b2lkIDAscD1jKGUsdSksaD1zKGUpO09iamVjdC5rZXlzKHApLmxlbmd0aD4wJiYoaD1vLnVwZGF0ZShoLHApLGEmJihoLm9wZXJhdGlvbj1hLm5hbWUpKTt2YXIgZj1yLkVuZHBvaW50Q2FjaGUuZ2V0S2V5U3RyaW5nKGgpLGc9ci5lbmRwb2ludENhY2hlLmdldChmKTtpZihnJiYxPT09Zy5sZW5ndGgmJiIiPT09Z1swXS5BZGRyZXNzKXJldHVybiBsW2ZdfHwobFtmXT1bXSksdm9pZCBsW2ZdLnB1c2goe3JlcXVlc3Q6ZSxjYWxsYmFjazp0fSk7aWYoZyYmZy5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGdbMF0uQWRkcmVzcyksdCgpO2Vsc2V7dmFyIG09bi5tYWtlUmVxdWVzdChpLmVuZHBvaW50T3BlcmF0aW9uLHtPcGVyYXRpb246YS5uYW1lLElkZW50aWZpZXJzOnB9KTttLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLGQobSksci5lbmRwb2ludENhY2hlLnB1dChmLFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczo2MH1dKSxtLnNlbmQoKGZ1bmN0aW9uKG4saSl7aWYobil7aWYoZS5yZXNwb25zZS5lcnJvcj1vLmVycm9yKG4se3JldHJ5YWJsZTohMX0pLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUoaCksbFtmXSl7dmFyIHM9bFtmXTtvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxlLmNhbGxiYWNrKCl9KSksZGVsZXRlIGxbZl19fWVsc2UgaSYmKHIuZW5kcG9pbnRDYWNoZS5wdXQoZixpLkVuZHBvaW50cyksZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChpLkVuZHBvaW50c1swXS5BZGRyZXNzKSxsW2ZdKSYmKHM9bFtmXSxvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdKTt0KCl9KSl9fWZ1bmN0aW9uIGQoZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uO3QmJiFlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl0mJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl09dCl9ZnVuY3Rpb24gaChlKXt2YXIgdD1lLmVycm9yLG49ZS5odHRwUmVzcG9uc2U7aWYodCYmKCJJbnZhbGlkRW5kcG9pbnRFeGNlcHRpb24iPT09dC5jb2RlfHw0MjE9PT1uLnN0YXR1c0NvZGUpKXt2YXIgaT1lLnJlcXVlc3QsYT1pLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9LHU9YyhpLGFbaS5vcGVyYXRpb25dP2FbaS5vcGVyYXRpb25dLmlucHV0OnZvaWQgMCksbD1zKGkpO09iamVjdC5rZXlzKHUpLmxlbmd0aD4wJiYobD1vLnVwZGF0ZShsLHUpLGFbaS5vcGVyYXRpb25dJiYobC5vcGVyYXRpb249YVtpLm9wZXJhdGlvbl0ubmFtZSkpLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUobCl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJuWyJmYWxzZSIsIjAiXS5pbmRleE9mKGUpPj0wfXQuZXhwb3J0cz17ZGlzY292ZXJFbmRwb2ludDpmdW5jdGlvbihlLHQpe3ZhciBzPWUuc2VydmljZXx8e307aWYoZnVuY3Rpb24oZSl7aWYoZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50JiYhMD09PWUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiQ3VzdG9tIGVuZHBvaW50IGlzIHN1cHBsaWVkOyBlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQgbXVzdCBub3QgYmUgdHJ1ZS4ifSk7dmFyIHQ9ci5jb25maWdbZS5zZXJ2aWNlSWRlbnRpZmllcl18fHt9O3JldHVybiBCb29sZWFuKHIuY29uZmlnLmVuZHBvaW50fHx0LmVuZHBvaW50fHxlLl9vcmlnaW5hbENvbmZpZyYmZS5fb3JpZ2luYWxDb25maWcuZW5kcG9pbnQpfShzKXx8ZS5pc1ByZXNpZ25lZCgpKXJldHVybiB0KCk7dmFyIGE9KHMuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1hP2EuZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZDoiTlVMTCIsbD1mdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2V8fHt9O2lmKHZvaWQgMCE9PXQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZClyZXR1cm4gdC5jb25maWcuZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkO2lmKCFvLmlzQnJvd3NlcigpKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGE9aVtzXTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobi5lbnYsYSkpe2lmKCIiPT09bi5lbnZbYV18fHZvaWQgMD09PW4uZW52W2FdKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJlbnZpcm9ubWVudGFsIHZhcmlhYmxlICIrYSsiIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZihuLmVudlthXSl9fXZhciBjPXt9O3RyeXtjPXIudXRpbC5pbmlMb2FkZXI/ci51dGlsLmluaUxvYWRlci5sb2FkRnJvbSh7aXNDb25maWc6ITAsZmlsZW5hbWU6bi5lbnZbci51dGlsLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSk6e319Y2F0Y2goZSl7fXZhciB1PWNbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV18fHt9O2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1LCJlbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCIpKXtpZih2b2lkIDA9PT11LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJjb25maWcgZmlsZSBlbnRyeSAnZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQnIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZih1LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKX19fShlKSxkPXMuYXBpLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3Zlcnk7c3dpdGNoKChsfHxkKSYmZS5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiZW5kcG9pbnQtZGlzY292ZXJ5IiksYyl7Y2FzZSJPUFRJT05BTCI6KGx8fGQpJiYodShlKSxlLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkpLHQoKTticmVhaztjYXNlIlJFUVVJUkVEIjppZighMT09PWwpe2UucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkVuZHBvaW50IERpc2NvdmVyeSBpcyBkaXNhYmxlZCBidXQgIitzLmFwaS5jbGFzc05hbWUrIi4iK2Uub3BlcmF0aW9uKyIoKSByZXF1aXJlcyBpdC4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbnMuIn0pLHQoKTticmVha31lLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkscChlLHQpO2JyZWFrO2RlZmF1bHQ6dCgpfX0scmVxdWlyZWREaXNjb3ZlckVuZHBvaW50OnAsb3B0aW9uYWxEaXNjb3ZlckVuZHBvaW50OnUsbWFyc2hhbGxDdXN0b21JZGVudGlmaWVyczpjLGdldENhY2hlS2V5OnMsaW52YWxpZGF0ZUNhY2hlZEVuZHBvaW50Omh9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3V0aWwiOjc0LF9wcm9jZXNzOjkxfV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIikuZXZlbnRNZXNzYWdlQ2h1bmtlcixvPWUoIi4vcGFyc2UtZXZlbnQiKS5wYXJzZUV2ZW50O3QuZXhwb3J0cz17Y3JlYXRlRXZlbnRTdHJlYW06ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1yKGUpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXMucHVzaChvKHQsaVthXSxuKSk7cmV0dXJuIHN9fX0seyIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIjoyOSwiLi9wYXJzZS1ldmVudCI6MzF9XSwyOTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXZlbnRNZXNzYWdlQ2h1bmtlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KXt2YXIgcj1lLnJlYWRJbnQzMkJFKG4pLG89ZS5zbGljZShuLHIrbik7bis9cix0LnB1c2gobyl9cmV0dXJuIHR9fX0se31dLDMwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjtmdW5jdGlvbiBpKGUpe2lmKDghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludDY0IGJ1ZmZlcnMgbXVzdCBiZSBleGFjdGx5IDggYnl0ZXMiKTtyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksdGhpcy5ieXRlcz1lfWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0PTA7dDw4O3QrKyllW3RdXj0yNTU7Zm9yKHQ9Nzt0Pi0xJiYoZVt0XSsrLDA9PT1lW3RdKTt0LS0pO31pLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoZT4weDgwMDAwMDAwMDAwMDAwMDB8fGU8LTB4ODAwMDAwMDAwMDAwMDAwMCl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIHRvbyBsYXJnZSAob3IsIGlmIG5lZ2F0aXZlLCB0b28gc21hbGwpIHRvIHJlcHJlc2VudCBhcyBhbiBJbnQ2NCIpO2Zvcih2YXIgdD1uZXcgVWludDhBcnJheSg4KSxuPTcscj1NYXRoLmFicyhNYXRoLnJvdW5kKGUpKTtuPi0xJiZyPjA7bi0tLHIvPTI1Nil0W25dPXI7cmV0dXJuIGU8MCYmcyh0KSxuZXcgaSh0KX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnl0ZXMuc2xpY2UoMCksdD0xMjgmZVswXTtyZXR1cm4gdCYmcyhlKSxwYXJzZUludChlLnRvU3RyaW5nKCJoZXgiKSwxNikqKHQ/LTE6MSl9LGkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlT2YoKSl9LHQuZXhwb3J0cz17SW50NjQ6aX19LHsiLi4vY29yZSI6MTl9XSwzMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vcGFyc2UtbWVzc2FnZSIpLnBhcnNlTWVzc2FnZTt0LmV4cG9ydHM9e3BhcnNlRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXIodCksaT1vLmhlYWRlcnNbIjptZXNzYWdlLXR5cGUiXTtpZihpKXtpZigiZXJyb3IiPT09aS52YWx1ZSl0aHJvdyBmdW5jdGlvbihlKXt2YXIgdD1lLmhlYWRlcnNbIjplcnJvci1jb2RlIl0sbj1lLmhlYWRlcnNbIjplcnJvci1tZXNzYWdlIl0scj1uZXcgRXJyb3Iobi52YWx1ZXx8bik7cmV0dXJuIHIuY29kZT1yLm5hbWU9dC52YWx1ZXx8dCxyfShvKTtpZigiZXZlbnQiIT09aS52YWx1ZSlyZXR1cm59dmFyIHM9by5oZWFkZXJzWyI6ZXZlbnQtdHlwZSJdLGE9bi5tZW1iZXJzW3MudmFsdWVdO2lmKGEpe3ZhciBjPXt9LHU9YS5ldmVudFBheWxvYWRNZW1iZXJOYW1lO2lmKHUpe3ZhciBsPWEubWVtYmVyc1t1XTsiYmluYXJ5Ij09PWwudHlwZT9jW3VdPW8uYm9keTpjW3VdPWUucGFyc2Uoby5ib2R5LnRvU3RyaW5nKCksbCl9Zm9yKHZhciBwPWEuZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyxkPTA7ZDxwLmxlbmd0aDtkKyspe3ZhciBoPXBbZF07by5oZWFkZXJzW2hdJiYoY1toXT1hLm1lbWJlcnNbaF0udG9UeXBlKG8uaGVhZGVyc1toXS52YWx1ZSkpfXZhciBmPXt9O3JldHVybiBmW3MudmFsdWVdPWMsZn19fX0seyIuL3BhcnNlLW1lc3NhZ2UiOjMyfV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2ludDY0IikuSW50NjQsbz1lKCIuL3NwbGl0LW1lc3NhZ2UiKS5zcGxpdE1lc3NhZ2UsaT0iYm9vbGVhbiIscz0iYnl0ZSIsYT0ic2hvcnQiLGM9ImludGVnZXIiLHU9ImxvbmciLGw9ImJpbmFyeSIscD0ic3RyaW5nIixkPSJ0aW1lc3RhbXAiLGg9InV1aWQiO2Z1bmN0aW9uIGYoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOyl7dmFyIG89ZS5yZWFkVUludDgobisrKSxmPWUuc2xpY2UobixuK28pLnRvU3RyaW5nKCk7c3dpdGNoKG4rPW8sZS5yZWFkVUludDgobisrKSl7Y2FzZSAwOnRbZl09e3R5cGU6aSx2YWx1ZTohMH07YnJlYWs7Y2FzZSAxOnRbZl09e3R5cGU6aSx2YWx1ZTohMX07YnJlYWs7Y2FzZSAyOnRbZl09e3R5cGU6cyx2YWx1ZTplLnJlYWRJbnQ4KG4rKyl9O2JyZWFrO2Nhc2UgMzp0W2ZdPXt0eXBlOmEsdmFsdWU6ZS5yZWFkSW50MTZCRShuKX0sbis9MjticmVhaztjYXNlIDQ6dFtmXT17dHlwZTpjLHZhbHVlOmUucmVhZEludDMyQkUobil9LG4rPTQ7YnJlYWs7Y2FzZSA1OnRbZl09e3R5cGU6dSx2YWx1ZTpuZXcgcihlLnNsaWNlKG4sbis4KSl9LG4rPTg7YnJlYWs7Y2FzZSA2OnZhciBnPWUucmVhZFVJbnQxNkJFKG4pO24rPTIsdFtmXT17dHlwZTpsLHZhbHVlOmUuc2xpY2UobixuK2cpfSxuKz1nO2JyZWFrO2Nhc2UgNzp2YXIgbT1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6cCx2YWx1ZTplLnNsaWNlKG4sbittKS50b1N0cmluZygpfSxuKz1tO2JyZWFrO2Nhc2UgODp0W2ZdPXt0eXBlOmQsdmFsdWU6bmV3IERhdGUobmV3IHIoZS5zbGljZShuLG4rOCkpLnZhbHVlT2YoKSl9LG4rPTg7YnJlYWs7Y2FzZSA5OnZhciB2PWUuc2xpY2UobixuKzE2KS50b1N0cmluZygiaGV4Iik7bis9MTYsdFtmXT17dHlwZTpoLHZhbHVlOnYuc3Vic3RyKDAsOCkrIi0iK3Yuc3Vic3RyKDgsNCkrIi0iK3Yuc3Vic3RyKDEyLDQpKyItIit2LnN1YnN0cigxNiw0KSsiLSIrdi5zdWJzdHIoMjApfTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIGhlYWRlciB0eXBlIHRhZyIpfX1yZXR1cm4gdH10LmV4cG9ydHM9e3BhcnNlTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3JldHVybntoZWFkZXJzOmYodC5oZWFkZXJzKSxib2R5OnQuYm9keX19fX0seyIuL2ludDY0IjozMCwiLi9zcGxpdC1tZXNzYWdlIjozM31dLDMzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjt0LmV4cG9ydHM9e3NwbGl0TWVzc2FnZTpmdW5jdGlvbihlKXtpZihyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksZS5sZW5ndGg8MTYpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBtZXNzYWdlIHRvbyBzaG9ydCB0byBhY2NvbW1vZGF0ZSBldmVudCBzdHJlYW0gbWVzc2FnZSBvdmVyaGVhZCIpO2lmKGUubGVuZ3RoIT09ZS5yZWFkVUludDMyQkUoMCkpdGhyb3cgbmV3IEVycm9yKCJSZXBvcnRlZCBtZXNzYWdlIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aCIpO3ZhciB0PWUucmVhZFVJbnQzMkJFKDgpO2lmKHQhPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsOCkpKXRocm93IG5ldyBFcnJvcigiVGhlIHByZWx1ZGUgY2hlY2tzdW0gc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlICgiK3QrIikgZG9lcyBub3QgbWF0Y2ggdGhlIGNhbGN1bGF0ZWQgQ1JDMzIgY2hlY2tzdW0uIik7dmFyIG49ZS5yZWFkVUludDMyQkUoZS5sZW5ndGgtNCk7aWYobiE9PXIuY3J5cHRvLmNyYzMyKGUuc2xpY2UoMCxlLmxlbmd0aC00KSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgbWVzc2FnZSBjaGVja3N1bSBkaWQgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiAiK24pO3ZhciBpPTEyK2UucmVhZFVJbnQzMkJFKDQpO3JldHVybntoZWFkZXJzOmUuc2xpY2UoMTIsaSksYm9keTplLnNsaWNlKGksZS5sZW5ndGgtNCl9fX19LHsiLi4vY29yZSI6MTl9XSwzNDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL2NvcmUiKSxyPWUoIi4vc2VxdWVudGlhbF9leGVjdXRvciIpLG89ZSgiLi9kaXNjb3Zlcl9lbmRwb2ludCIpLmRpc2NvdmVyRW5kcG9pbnQ7ZnVuY3Rpb24gaShlKXtpZighZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXJldHVybiIiO3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07cmV0dXJuIHQ/dC5hdXRodHlwZToiIn1mdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZTtyZXR1cm4gdC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbj90LmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uOnQuYXBpLnNpZ25hdHVyZVZlcnNpb24/dC5hcGkuc2lnbmF0dXJlVmVyc2lvbjppKGUpfW4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6e319LG4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSxyKXtyKCJWQUxJREFURV9DUkVERU5USUFMUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSx0KXtpZighZS5zZXJ2aWNlLmFwaS5zaWduYXR1cmVWZXJzaW9uJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7ImJlYXJlciIhPT1zKGUpP2Uuc2VydmljZS5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIGNyZWRlbnRpYWxzIGluIGNvbmZpZywgaWYgdXNpbmcgQVdTX0NPTkZJR19GSUxFLCBzZXQgQVdTX1NES19MT0FEX0NPTkZJRz0xIn0pKSx0KCl9KSk6ZS5zZXJ2aWNlLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocil7ciYmKGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKHIse2NvZGU6IlRva2VuRXJyb3IifSkpLHQoKX0pKX0pKSxlKCJWQUxJREFURV9SRUdJT04iLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuaXNHbG9iYWxFbmRwb2ludCl7dmFyIHQ9bmV3IFJlZ0V4cCgvXihbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKSQvKTtlLnNlcnZpY2UuY29uZmlnLnJlZ2lvbj90LnRlc3QoZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24pfHwoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiSW52YWxpZCByZWdpb24gaW4gY29uZmlnIn0pKTplLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSl9fSkpLGUoIkJVSUxEX0lERU1QT1RFTkNZX1RPS0VOUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSl7aWYoZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKHQpe3ZhciByPXQuaWRlbXBvdGVudE1lbWJlcnM7aWYoci5sZW5ndGgpe2Zvcih2YXIgbz1uLnV0aWwuY29weShlLnBhcmFtcyksaT0wLHM9ci5sZW5ndGg7aTxzO2krKylvW3JbaV1dfHwob1tyW2ldXT1uLnV0aWwudXVpZC52NCgpKTtlLnBhcmFtcz1vfX19fSkpLGUoIlZBTElEQVRFX1BBUkFNRVRFUlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxyPWUuc2VydmljZS5jb25maWcucGFyYW1WYWxpZGF0aW9uO25ldyBuLlBhcmFtVmFsaWRhdG9yKHIpLnZhbGlkYXRlKHQsZS5wYXJhbXMpfX0pKSxlKCJDT01QVVRFX0NIRUNLU1VNIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj1lLmh0dHBSZXF1ZXN0LmJvZHksbz1yJiYobi51dGlsLkJ1ZmZlci5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByKSxpPWUuaHR0cFJlcXVlc3QuaGVhZGVycztpZih0Lmh0dHBDaGVja3N1bVJlcXVpcmVkJiZlLnNlcnZpY2UuY29uZmlnLmNvbXB1dGVDaGVja3N1bXMmJm8mJiFpWyJDb250ZW50LU1ENSJdKXt2YXIgcz1uLnV0aWwuY3J5cHRvLm1kNShyLCJiYXNlNjQiKTtpWyJDb250ZW50LU1ENSJdPXN9fX19KSkscigiQ09NUFVURV9TSEEyNTYiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSx0KXtpZihlLmhhbHRIYW5kbGVyc09uRXJyb3IoKSxlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciByPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbz1yP3IuYXV0aHR5cGU6IiI7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIW8mJiFlLnNlcnZpY2UuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24pcmV0dXJuIHQoKTtpZihlLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk9PT1uLlNpZ25lcnMuVjQpe3ZhciBpPWUuaHR0cFJlcXVlc3QuYm9keXx8IiI7aWYoby5pbmRleE9mKCJ1bnNpZ25lZC1ib2R5Iik+PTApcmV0dXJuIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT0iVU5TSUdORUQtUEFZTE9BRCIsdCgpO24udXRpbC5jb21wdXRlU2hhMjU2KGksKGZ1bmN0aW9uKG4scil7bj90KG4pOihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09cix0KCkpfSkpfWVsc2UgdCgpfX0pKSxlKCJTRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7dmFyIHQ9aShlKSxyPW4udXRpbC5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpO2lmKHZvaWQgMD09PWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSl0cnl7dmFyIG89bi51dGlsLnN0cmluZy5ieXRlTGVuZ3RoKGUuaHR0cFJlcXVlc3QuYm9keSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW99Y2F0Y2gobil7aWYociYmci5pc1N0cmVhbWluZyl7aWYoci5yZXF1aXJlc0xlbmd0aCl0aHJvdyBuO2lmKHQuaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiB2b2lkKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVHJhbnNmZXItRW5jb2RpbmciXT0iY2h1bmtlZCIpO3Rocm93IG59dGhyb3cgbn19KSksZSgiU0VUX0hUVFBfSE9TVCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3R9KSksZSgiU0VUX1RSQUNFX0lEIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciByPSJYLUFtem4tVHJhY2UtSWQiO2lmKG4udXRpbC5pc05vZGUoKSYmIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuaHR0cFJlcXVlc3QuaGVhZGVycyxyKSl7dmFyIG89dC5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FLGk9dC5lbnYuX1hfQU1aTl9UUkFDRV9JRDsic3RyaW5nIj09dHlwZW9mIG8mJm8ubGVuZ3RoPjAmJiJzdHJpbmciPT10eXBlb2YgaSYmaS5sZW5ndGg+MCYmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tyXT1pKX19KSksZSgiUkVTVEFSVCIsInJlc3RhcnQiLChmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVzcG9uc2UuZXJyb3I7ZSYmZS5yZXRyeWFibGUmJih0aGlzLmh0dHBSZXF1ZXN0PW5ldyBuLkh0dHBSZXF1ZXN0KHRoaXMuc2VydmljZS5lbmRwb2ludCx0aGlzLnNlcnZpY2UucmVnaW9uKSx0aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQ8dGhpcy5zZXJ2aWNlLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMucmVzcG9uc2UucmV0cnlDb3VudCsrOnRoaXMucmVzcG9uc2UuZXJyb3I9bnVsbCl9KSkscigiRElTQ09WRVJfRU5EUE9JTlQiLCJzaWduIixvLCEwKSxyKCJTSUdOIiwic2lnbiIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLHI9cyhlKTtpZighcnx8MD09PXIubGVuZ3RoKXJldHVybiB0KCk7ImJlYXJlciI9PT1yP24uY29uZmlnLmdldFRva2VuKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e25ldyhuLmdldFNpZ25lckNsYXNzKGUpKShlLmh0dHBSZXF1ZXN0KS5hZGRBdXRob3JpemF0aW9uKG8pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSk6bi5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZS5yZXNwb25zZS5lcnJvcj1yLHQoKTt0cnl7dmFyIGk9bi5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHM9bi5nZXRTaWduZXJDbGFzcyhlKSxhPShlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1uZXcgcyhlLmh0dHBSZXF1ZXN0LG4uZ2V0U2lnbmluZ05hbWUoZSkse3NpZ25hdHVyZUNhY2hlOm4uY29uZmlnLnNpZ25hdHVyZUNhY2hlLG9wZXJhdGlvbjphLHNpZ25hdHVyZVZlcnNpb246bi5hcGkuc2lnbmF0dXJlVmVyc2lvbn0pO2Muc2V0U2VydmljZUNsaWVudElkKG4uX2NsaWVudElkKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5EYXRlLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXSxjLmFkZEF1dGhvcml6YXRpb24obyxpKSxlLnNpZ25lZEF0PWl9Y2F0Y2godCl7ZS5yZXNwb25zZS5lcnJvcj10fXQoKX0pKX0pKSxlKCJWQUxJREFURV9SRVNQT05TRSIsInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXt0aGlzLnNlcnZpY2Uuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUsdGhpcyk/KGUuZGF0YT17fSxlLmVycm9yPW51bGwpOihlLmRhdGE9bnVsbCxlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlVua25vd25FcnJvciIsbWVzc2FnZToiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4ifSkpfSkpLGUoIkVSUk9SIiwiZXJyb3IiLChmdW5jdGlvbihlLHQpe2lmKHQucmVxdWVzdC5zZXJ2aWNlLmFwaS5hd3NRdWVyeUNvbXBhdGlibGUpe3ZhciBuPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnMscj1uP25bIngtYW16bi1xdWVyeS1lcnJvciJdOnZvaWQgMDtyJiZyLmluY2x1ZGVzKCI7IikmJih0LmVycm9yLmNvZGU9ci5zcGxpdCgiOyIpWzBdKX19KSwhMCkscigiU0VORCIsInNlbmQiLChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIocil7ZS5odHRwUmVzcG9uc2Uuc3RyZWFtPXI7dmFyIG89ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnN0cmVhbSxpPWUucmVxdWVzdC5zZXJ2aWNlLHM9aS5hcGksYT1lLnJlcXVlc3Qub3BlcmF0aW9uLGM9cy5vcGVyYXRpb25zW2FdfHx7fTtyLm9uKCJoZWFkZXJzIiwoZnVuY3Rpb24obyxzLGEpe2lmKGUucmVxdWVzdC5lbWl0KCJodHRwSGVhZGVycyIsW28scyxlLGFdKSwhZS5odHRwUmVzcG9uc2Uuc3RyZWFtaW5nKWlmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24pe2lmKGMuaGFzRXZlbnRPdXRwdXQmJmkuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUpKXJldHVybiBlLnJlcXVlc3QuZW1pdCgiaHR0cERvbmUiKSx2b2lkIHQoKTtyLm9uKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5yZWFkKCk7bnVsbCE9PXQmJmUucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfWVsc2Ugci5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfSkpLHIub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoIW98fCFvLmRpZENhbGxiYWNrKXtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uJiZjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm47ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdCgpfX0pKX1mdW5jdGlvbiBvKHIpe2lmKCJSZXF1ZXN0QWJvcnRlZEVycm9yIiE9PXIuY29kZSl7dmFyIG89IlRpbWVvdXRFcnJvciI9PT1yLmNvZGU/ci5jb2RlOiJOZXR3b3JraW5nRXJyb3IiO3I9bi51dGlsLmVycm9yKHIse2NvZGU6byxyZWdpb246ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnJlZ2lvbixob3N0bmFtZTplLnJlcXVlc3QuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUscmV0cnlhYmxlOiEwfSl9ZS5lcnJvcj1yLGUucmVxdWVzdC5lbWl0KCJodHRwRXJyb3IiLFtlLmVycm9yLGVdLChmdW5jdGlvbigpe3QoKX0pKX1mdW5jdGlvbiBpKCl7dmFyIHQsaT1uLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5odHRwT3B0aW9uc3x8e307dHJ5e3ZhciBhPWkuaGFuZGxlUmVxdWVzdChlLnJlcXVlc3QuaHR0cFJlcXVlc3QscyxyLG8pOyh0PWEpLm9uKCJzZW5kUHJvZ3Jlc3MiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cFVwbG9hZFByb2dyZXNzIixbdCxlXSl9KSksdC5vbigicmVjZWl2ZVByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbdCxlXSl9KSl9Y2F0Y2goZSl7byhlKX19ZS5odHRwUmVzcG9uc2UuX2Fib3J0Q2FsbGJhY2s9dCxlLmVycm9yPW51bGwsZS5kYXRhPW51bGwsKGUucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCktdGhpcy5zaWduZWRBdCkvMWUzPj02MDA/dGhpcy5lbWl0KCJzaWduIixbdGhpc10sKGZ1bmN0aW9uKGUpe2U/dChlKTppKCl9KSk6aSgpfSkpLGUoIkhUVFBfSEVBREVSUyIsImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24oZSx0LHIsbyl7ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT1lLHIuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2U9byxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPXQsci5odHRwUmVzcG9uc2UuYm9keT1uLnV0aWwuYnVmZmVyLnRvQnVmZmVyKCIiKSxyLmh0dHBSZXNwb25zZS5idWZmZXJzPVtdLHIuaHR0cFJlc3BvbnNlLm51bUJ5dGVzPTA7dmFyIGk9dC5kYXRlfHx0LkRhdGUscz1yLnJlcXVlc3Quc2VydmljZTtpZihpKXt2YXIgYT1EYXRlLnBhcnNlKGkpO3MuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJnMuaXNDbG9ja1NrZXdlZChhKSYmcy5hcHBseUNsb2NrT2Zmc2V0KGEpfX0pKSxlKCJIVFRQX0RBVEEiLCJodHRwRGF0YSIsKGZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYobi51dGlsLmlzTm9kZSgpKXt0Lmh0dHBSZXNwb25zZS5udW1CeXRlcys9ZS5sZW5ndGg7dmFyIHI9dC5odHRwUmVzcG9uc2UuaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSxvPXtsb2FkZWQ6dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMsdG90YWw6cn07dC5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbbyx0XSl9dC5odHRwUmVzcG9uc2UuYnVmZmVycy5wdXNoKG4udXRpbC5idWZmZXIudG9CdWZmZXIoZSkpfX0pKSxlKCJIVFRQX0RPTkUiLCJodHRwRG9uZSIsKGZ1bmN0aW9uKGUpe2lmKGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMmJmUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMubGVuZ3RoPjApe3ZhciB0PW4udXRpbC5idWZmZXIuY29uY2F0KGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMpO2UuaHR0cFJlc3BvbnNlLmJvZHk9dH1kZWxldGUgZS5odHRwUmVzcG9uc2UubnVtQnl0ZXMsZGVsZXRlIGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnN9KSksZSgiRklOQUxJWkVfRVJST1IiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihlLmVycm9yLnN0YXR1c0NvZGU9ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx2b2lkIDA9PT1lLmVycm9yLnJldHJ5YWJsZSYmKGUuZXJyb3IucmV0cnlhYmxlPXRoaXMuc2VydmljZS5yZXRyeWFibGVFcnJvcihlLmVycm9yLHRoaXMpKSl9KSksZSgiSU5WQUxJREFURV9DUkVERU5USUFMUyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7aWYoZS5lcnJvcilzd2l0Y2goZS5lcnJvci5jb2RlKXtjYXNlIlJlcXVlc3RFeHBpcmVkIjpjYXNlIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI6Y2FzZSJFeHBpcmVkVG9rZW4iOmUuZXJyb3IucmV0cnlhYmxlPSEwLGUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5leHBpcmVkPSEwfX0pKSxlKCJFWFBJUkVEX1NJR05BVFVSRSIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lcnJvcjt0JiYic3RyaW5nIj09dHlwZW9mIHQuY29kZSYmInN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJnQuY29kZS5tYXRjaCgvU2lnbmF0dXJlLykmJnQubWVzc2FnZS5tYXRjaCgvZXhwaXJlZC8pJiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIkNMT0NLX1NLRVdFRCIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5lcnJvciYmdGhpcy5zZXJ2aWNlLmNsb2NrU2tld0Vycm9yKGUuZXJyb3IpJiZ0aGlzLnNlcnZpY2UuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJihlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVESVJFQ1QiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJmUuZXJyb3Iuc3RhdHVzQ29kZT49MzAwJiZlLmVycm9yLnN0YXR1c0NvZGU8NDAwJiZlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uJiYodGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludD1uZXcgbi5FbmRwb2ludChlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uKSx0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD10aGlzLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3QsZS5lcnJvci5yZWRpcmVjdD0hMCxlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJihlLmVycm9yLnJlZGlyZWN0JiZlLnJlZGlyZWN0Q291bnQ8ZS5tYXhSZWRpcmVjdHM/ZS5lcnJvci5yZXRyeURlbGF5PTA6ZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcyYmKGUuZXJyb3IucmV0cnlEZWxheT10aGlzLnNlcnZpY2UucmV0cnlEZWxheXMoZS5yZXRyeUNvdW50LGUuZXJyb3IpfHwwKSl9KSkscigiUkVTRVRfUkVUUllfU1RBVEUiLCJhZnRlclJldHJ5IiwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPSExO2UuZXJyb3ImJihuPWUuZXJyb3IucmV0cnlEZWxheXx8MCxlLmVycm9yLnJldHJ5YWJsZSYmZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcz8oZS5yZXRyeUNvdW50Kysscj0hMCk6ZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzJiYoZS5yZWRpcmVjdENvdW50Kysscj0hMCkpLHImJm4+PTA/KGUuZXJyb3I9bnVsbCxzZXRUaW1lb3V0KHQsbikpOnQoKX0pKX0pKSxDb3JlUG9zdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RGF0YSIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVYVFJBQ1RfUkVRVUVTVF9JRCIsImV4dHJhY3RFcnJvciIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVOT1RGT1VORF9FUlJPUiIsImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe2lmKCJOZXR3b3JraW5nRXJyb3IiPT09ZS5jb2RlJiZmdW5jdGlvbihlKXtyZXR1cm4iRU5PVEZPVU5EIj09PWUuZXJybm98fCJudW1iZXIiPT10eXBlb2YgZS5lcnJubyYmImZ1bmN0aW9uIj09dHlwZW9mIG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUmJlsiRUFJX05PTkFNRSIsIkVBSV9OT0RBVEEiXS5pbmRleE9mKG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUoZS5lcnJubyk+PTApfShlKSl7dmFyIHQ9IkluYWNjZXNzaWJsZSBob3N0OiBgIitlLmhvc3RuYW1lKyInIGF0IHBvcnQgYCIrZS5wb3J0KyInLiBUaGlzIHNlcnZpY2UgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGAiK2UucmVnaW9uKyInIHJlZ2lvbi4iO3RoaXMucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZToiVW5rbm93bkVuZHBvaW50IixyZWdpb246ZS5yZWdpb24saG9zdG5hbWU6ZS5ob3N0bmFtZSxyZXRyeWFibGU6ITAsb3JpZ2luYWxFcnJvcjplfSl9fSkpfSkpLExvZ2dlcjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt0KCJMT0dfUkVRVUVTVCIsImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dmFyIHI9dC5yZXF1ZXN0LG89ci5zZXJ2aWNlLmNvbmZpZy5sb2dnZXI7aWYobyl7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgaT0odC5yZXF1ZXN0LnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKS5nZXRUaW1lKCktci5zdGFydFRpbWUuZ2V0VGltZSgpKS8xZTMsYT0hIW8uaXNUVFksYz10Lmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLHU9ci5wYXJhbXM7ci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0JiYodT1zKHIuc2VydmljZS5hcGkub3BlcmF0aW9uc1tyLm9wZXJhdGlvbl0uaW5wdXQsci5wYXJhbXMpKTt2YXIgbD1lKCJ1dGlsIikuaW5zcGVjdCh1LCEwLG51bGwpLHA9IiI7cmV0dXJuIGEmJihwKz0iG1szM20iKSxwKz0iW0FXUyAiK3Iuc2VydmljZS5zZXJ2aWNlSWRlbnRpZmllcisiICIrYyxwKz0iICIraS50b1N0cmluZygpKyJzICIrdC5yZXRyeUNvdW50KyIgcmV0cmllc10iLGEmJihwKz0iG1swOzFtIikscCs9IiAiK24udXRpbC5zdHJpbmcubG93ZXJGaXJzdChyLm9wZXJhdGlvbikscCs9IigiK2wrIikiLGEmJihwKz0iG1swbSIpLHB9KCk7ImZ1bmN0aW9uIj09dHlwZW9mIG8ubG9nP28ubG9nKGkpOiJmdW5jdGlvbiI9PXR5cGVvZiBvLndyaXRlJiZvLndyaXRlKGkrIlxuIil9ZnVuY3Rpb24gcyhlLHQpe2lmKCF0KXJldHVybiB0O2lmKGUuaXNTZW5zaXRpdmUpcmV0dXJuIioqKlNlbnNpdGl2ZUluZm9ybWF0aW9uKioqIjtzd2l0Y2goZS50eXBlKXtjYXNlInN0cnVjdHVyZSI6dmFyIHI9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUubWVtYmVycyx0KT9yW3RdPXMoZS5tZW1iZXJzW3RdLG4pOnJbdF09bn0pKSxyO2Nhc2UibGlzdCI6dmFyIG89W107cmV0dXJuIG4udXRpbC5hcnJheUVhY2godCwoZnVuY3Rpb24odCxuKXtvLnB1c2gocyhlLm1lbWJlcix0KSl9KSksbztjYXNlIm1hcCI6dmFyIGk9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7aVt0XT1zKGUudmFsdWUsbil9KSksaTtkZWZhdWx0OnJldHVybiB0fX19KSl9KSksSnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL2pzb24iKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFJlc3RKc29uOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvciksdCgiVU5TRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIixuLnVuc2V0Q29udGVudExlbmd0aCl9KSksUmVzdFhtbDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfeG1sIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUXVlcnk6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9xdWVyeSIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9kaXNjb3Zlcl9lbmRwb2ludCI6MjcsIi4vcHJvdG9jb2wvanNvbiI6NDgsIi4vcHJvdG9jb2wvcXVlcnkiOjQ5LCIuL3Byb3RvY29sL3Jlc3QiOjUwLCIuL3Byb3RvY29sL3Jlc3RfanNvbiI6NTEsIi4vcHJvdG9jb2wvcmVzdF94bWwiOjUyLCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiOjYxLF9wcm9jZXNzOjkxLHV0aWw6ODV9XSwzNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5FbmRwb2ludD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2xhc2hlcyIsImF1dGgiLCJoYXNoIiwic2VhcmNoIiwicXVlcnkiXSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZW5kcG9pbnQ6ICIrZSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiByLnV0aWwuY29weShlKTtlLm1hdGNoKC9eaHR0cC8pfHwoZT0oKHQmJnZvaWQgMCE9PXQuc3NsRW5hYmxlZD90LnNzbEVuYWJsZWQ6ci5jb25maWcuc3NsRW5hYmxlZCk/Imh0dHBzIjoiaHR0cCIpKyI6Ly8iK2UpLHIudXRpbC51cGRhdGUodGhpcyxyLnV0aWwudXJsUGFyc2UoZSkpLHRoaXMucG9ydD90aGlzLnBvcnQ9cGFyc2VJbnQodGhpcy5wb3J0LDEwKTp0aGlzLnBvcnQ9Imh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MH19KSxyLkh0dHBSZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ZT1uZXcgci5FbmRwb2ludChlKSx0aGlzLm1ldGhvZD0iUE9TVCIsdGhpcy5wYXRoPWUucGF0aHx8Ii8iLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9IiIsdGhpcy5lbmRwb2ludD1lLHRoaXMucmVnaW9uPXQsdGhpcy5fdXNlckFnZW50PSIiLHRoaXMuc2V0VXNlckFnZW50KCl9LHNldFVzZXJBZ2VudDpmdW5jdGlvbigpe3RoaXMuX3VzZXJBZ2VudD10aGlzLmhlYWRlcnNbdGhpcy5nZXRVc2VyQWdlbnRIZWFkZXJOYW1lKCldPXIudXRpbC51c2VyQWdlbnQoKX0sZ2V0VXNlckFnZW50SGVhZGVyTmFtZTpmdW5jdGlvbigpe3JldHVybihyLnV0aWwuaXNCcm93c2VyKCk/IlgtQW16LSI6IiIpKyJVc2VyLUFnZW50In0sYXBwZW5kVG9Vc2VyQWdlbnQ6ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiZlJiYodGhpcy5fdXNlckFnZW50Kz0iICIrZSksdGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT10aGlzLl91c2VyQWdlbnR9LGdldFVzZXJBZ2VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyQWdlbnR9LHBhdGhuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aC5zcGxpdCgiPyIsMSlbMF19LHNlYXJjaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aC5zcGxpdCgiPyIsMilbMV07cmV0dXJuIGU/KGU9ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2UoZSksci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcoZSkpOiIifSx1cGRhdGVFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1uZXcgci5FbmRwb2ludChlKTt0aGlzLmVuZHBvaW50PXQsdGhpcy5wYXRoPXQucGF0aHx8Ii8iLHRoaXMuaGVhZGVycy5Ib3N0JiYodGhpcy5oZWFkZXJzLkhvc3Q9dC5ob3N0KX19KSxyLkh0dHBSZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzQ29kZT12b2lkIDAsdGhpcy5oZWFkZXJzPXt9LHRoaXMuYm9keT12b2lkIDAsdGhpcy5zdHJlYW1pbmc9ITEsdGhpcy5zdHJlYW09bnVsbH0sY3JlYXRlVW5idWZmZXJlZFN0cmVhbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmVhbWluZz0hMCx0aGlzLnN0cmVhbX19KSxyLkh0dHBDbGllbnQ9byh7fSksci5IdHRwQ2xpZW50LmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuc2luZ2xldG9uJiYodGhpcy5zaW5nbGV0b249bmV3IHRoaXMpLHRoaXMuc2luZ2xldG9ufX0seyIuL2NvcmUiOjE5fV0sMzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7ZSgiLi4vaHR0cCIpLHIuWEhSQ2xpZW50PXIudXRpbC5pbmhlcml0KHtoYW5kbGVSZXF1ZXN0OmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPXRoaXMsYT1lLmVuZHBvaW50LGM9bmV3IG8sdT1hLnByb3RvY29sKyIvLyIrYS5ob3N0bmFtZTs4MCE9PWEucG9ydCYmNDQzIT09YS5wb3J0JiYodSs9IjoiK2EucG9ydCksdSs9ZS5wYXRoO3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdCxwPSExO2Uuc3RyZWFtPWwsbC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwoZnVuY3Rpb24oKXt0cnl7aWYoMD09PWwuc3RhdHVzKXJldHVybn1jYXRjaChlKXtyZXR1cm59dGhpcy5yZWFkeVN0YXRlPj10aGlzLkhFQURFUlNfUkVDRUlWRUQmJiFwJiYoYy5zdGF0dXNDb2RlPWwuc3RhdHVzLGMuaGVhZGVycz1zLnBhcnNlSGVhZGVycyhsLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxjLmVtaXQoImhlYWRlcnMiLGMuc3RhdHVzQ29kZSxjLmhlYWRlcnMsbC5zdGF0dXNUZXh0KSxwPSEwKSx0aGlzLnJlYWR5U3RhdGU9PT10aGlzLkRPTkUmJnMuZmluaXNoUmVxdWVzdChsLGMpfSksITEpLGwudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJzZW5kUHJvZ3Jlc3MiLGUpfSkpLGwuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLChmdW5jdGlvbihlKXtjLmVtaXQoInJlY2VpdmVQcm9ncmVzcyIsZSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlRpbWVvdXQiKSx7Y29kZToiVGltZW91dEVycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIk5ldHdvcmsgRmFpbHVyZSIpLHtjb2RlOiJOZXR3b3JraW5nRXJyb3IifSkpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLChmdW5jdGlvbigpe2koci51dGlsLmVycm9yKG5ldyBFcnJvcigiUmVxdWVzdCBhYm9ydGVkIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IifSkpfSksITEpLG4oYyksbC5vcGVuKGUubWV0aG9kLHUsITEhPT10LnhockFzeW5jKSxyLnV0aWwuZWFjaChlLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7IkNvbnRlbnQtTGVuZ3RoIiE9PWUmJiJVc2VyLUFnZW50IiE9PWUmJiJIb3N0IiE9PWUmJmwuc2V0UmVxdWVzdEhlYWRlcihlLHQpfSkpLHQudGltZW91dCYmITEhPT10LnhockFzeW5jJiYobC50aW1lb3V0PXQudGltZW91dCksdC54aHJXaXRoQ3JlZGVudGlhbHMmJihsLndpdGhDcmVkZW50aWFscz0hMCk7dHJ5e2wucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7fXRyeXtlLmJvZHk/bC5zZW5kKGUuYm9keSk6bC5zZW5kKCl9Y2F0Y2godCl7aWYoIWUuYm9keXx8Im9iamVjdCIhPXR5cGVvZiBlLmJvZHkuYnVmZmVyKXRocm93IHQ7bC5zZW5kKGUuYm9keS5idWZmZXIpfXJldHVybiBjfSxwYXJzZUhlYWRlcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHIudXRpbC5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgiOiIsMSlbMF0scj1lLnN1YnN0cmluZyhuLmxlbmd0aCsyKTtuLmxlbmd0aD4wJiYodFtuLnRvTG93ZXJDYXNlKCldPXIpfSkpLHR9LGZpbmlzaFJlcXVlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZigiYXJyYXlidWZmZXIiPT09ZS5yZXNwb25zZVR5cGUmJmUucmVzcG9uc2Upe3ZhciBvPWUucmVzcG9uc2U7bj1uZXcgci51dGlsLkJ1ZmZlcihvLmJ5dGVMZW5ndGgpO2Zvcih2YXIgaT1uZXcgVWludDhBcnJheShvKSxzPTA7czxuLmxlbmd0aDsrK3MpbltzXT1pW3NdfXRyeXtufHwic3RyaW5nIiE9dHlwZW9mIGUucmVzcG9uc2VUZXh0fHwobj1uZXcgci51dGlsLkJ1ZmZlcihlLnJlc3BvbnNlVGV4dCkpfWNhdGNoKGUpe31uJiZ0LmVtaXQoImRhdGEiLG4pLHQuZW1pdCgiZW5kIil9fSksci5IdHRwQ2xpZW50LnByb3RvdHlwZT1yLlhIUkNsaWVudC5wcm90b3R5cGUsci5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPTF9LHsiLi4vY29yZSI6MTksIi4uL2h0dHAiOjM1LGV2ZW50czo4N31dLDM3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJm51bGwhPWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89dC5tZW1iZXJzW2VdO2lmKG8pe2lmKCJib2R5IiE9PW8ubG9jYXRpb24pcmV0dXJuO3ZhciBzPW8uaXNMb2NhdGlvbk5hbWU/by5uYW1lOmUsYT1pKHIsbyk7dm9pZCAwIT09YSYmKG5bc109YSl9fSkpLG59KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7dm9pZCAwIT09byYmKG5bZV09byl9KSksbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMCE9PXImJm4ucHVzaChyKX0pKSxufShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9XaXJlRm9ybWF0KGUpfShlLHQpfX1vLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShpKGUsdCkpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJnZvaWQgMCE9PWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fSxvPXQubWVtYmVycztyZXR1cm4gci5lYWNoKG8sKGZ1bmN0aW9uKHQscil7dmFyIG89ci5pc0xvY2F0aW9uTmFtZT9yLm5hbWU6dDtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSl7dmFyIHM9aShlW29dLHIpO3ZvaWQgMCE9PXMmJihuW3RdPXMpfX0pKSxufX0oZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPWkocix0LnZhbHVlKTtuW2VdPXZvaWQgMD09PW8/bnVsbDpvfSkpLG59fShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49W107cmV0dXJuIHIuYXJyYXlFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPWkoZSx0Lm1lbWJlcik7dm9pZCAwPT09cj9uLnB1c2gobnVsbCk6bi5wdXNoKHIpfSkpLG59fShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9UeXBlKGUpfShlLHQpfX1vLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe3JldHVybiBpKEpTT04ucGFyc2UoZSksdCl9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7dmFyIG49WyJXZSBhcmUgZm9ybWFsaXppbmcgb3VyIHBsYW5zIHRvIGVudGVyIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYyKSBpbnRvIG1haW50ZW5hbmNlIG1vZGUgaW4gMjAyMy5cbiIsIlBsZWFzZSBtaWdyYXRlIHlvdXIgY29kZSB0byB1c2UgQVdTIFNESyBmb3IgSmF2YVNjcmlwdCAodjMpLiIsIkZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgbWlncmF0aW9uIGd1aWRlIGF0IGh0dHBzOi8vYS5jby83UHpNQ2N5Il0uam9pbigiXG4iKTt0LmV4cG9ydHM9e3N1cHByZXNzOiExfSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZXhwb3J0cy5zdXBwcmVzc3x8dm9pZCAwIT09ZSYmKCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19FWEVDVVRJT05fRU5WJiYwPT09ZS5lbnYuQVdTX0VYRUNVVElPTl9FTlYuaW5kZXhPZigiQVdTX0xhbWJkYV8iKXx8Im9iamVjdCI9PXR5cGVvZiBlLmVudiYmdm9pZCAwIT09ZS5lbnYuQVdTX1NES19KU19TVVBQUkVTU19NQUlOVEVOQU5DRV9NT0RFX01FU1NBR0V8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLmVtaXRXYXJuaW5nJiZlLmVtaXRXYXJuaW5nKG4se3R5cGU6Ik5PVEUifSkpfSksMCl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7X3Byb2Nlc3M6OTF9XSw0MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi9vcGVyYXRpb24iKSxpPWUoIi4vc2hhcGUiKSxzPWUoIi4vcGFnaW5hdG9yIiksYT1lKCIuL3Jlc291cmNlX3dhaXRlciIpLGM9ZSgiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIiksdT1lKCIuLi91dGlsIiksbD11LnByb3BlcnR5LHA9dS5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZT1lfHx7fSwodD10fHx7fSkuYXBpPXRoaXMsZS5tZXRhZGF0YT1lLm1ldGFkYXRhfHx7fTt2YXIgZD10LnNlcnZpY2VJZGVudGlmaWVyO2RlbGV0ZSB0LnNlcnZpY2VJZGVudGlmaWVyLGwodGhpcywiaXNBcGkiLCEwLCExKSxsKHRoaXMsImFwaVZlcnNpb24iLGUubWV0YWRhdGEuYXBpVmVyc2lvbiksbCh0aGlzLCJlbmRwb2ludFByZWZpeCIsZS5tZXRhZGF0YS5lbmRwb2ludFByZWZpeCksbCh0aGlzLCJzaWduaW5nTmFtZSIsZS5tZXRhZGF0YS5zaWduaW5nTmFtZSksbCh0aGlzLCJnbG9iYWxFbmRwb2ludCIsZS5tZXRhZGF0YS5nbG9iYWxFbmRwb2ludCksbCh0aGlzLCJzaWduYXR1cmVWZXJzaW9uIixlLm1ldGFkYXRhLnNpZ25hdHVyZVZlcnNpb24pLGwodGhpcywianNvblZlcnNpb24iLGUubWV0YWRhdGEuanNvblZlcnNpb24pLGwodGhpcywidGFyZ2V0UHJlZml4IixlLm1ldGFkYXRhLnRhcmdldFByZWZpeCksbCh0aGlzLCJwcm90b2NvbCIsZS5tZXRhZGF0YS5wcm90b2NvbCksbCh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUubWV0YWRhdGEudGltZXN0YW1wRm9ybWF0KSxsKHRoaXMsInhtbE5hbWVzcGFjZVVyaSIsZS5tZXRhZGF0YS54bWxOYW1lc3BhY2UpLGwodGhpcywiYWJicmV2aWF0aW9uIixlLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb24pLGwodGhpcywiZnVsbE5hbWUiLGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lKSxsKHRoaXMsInNlcnZpY2VJZCIsZS5tZXRhZGF0YS5zZXJ2aWNlSWQpLGQmJmNbZF0mJmwodGhpcywieG1sTm9EZWZhdWx0TGlzdHMiLGNbZF0ueG1sTm9EZWZhdWx0TGlzdHMsITEpLHAodGhpcywiY2xhc3NOYW1lIiwoZnVuY3Rpb24oKXt2YXIgdD1lLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb258fGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lO3JldHVybiB0PygiRWxhc3RpY0xvYWRCYWxhbmNpbmciPT09KHQ9dC5yZXBsYWNlKC9eQW1hem9ufEFXU1xzKnxcKC4qfFxzK3xcVysvZywiIikpJiYodD0iRUxCIiksdCk6bnVsbH0pKSxsKHRoaXMsIm9wZXJhdGlvbnMiLG5ldyByKGUub3BlcmF0aW9ucyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgbyhlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0LChmdW5jdGlvbihlLHQpeyEwPT09dC5lbmRwb2ludG9wZXJhdGlvbiYmbChuLCJlbmRwb2ludE9wZXJhdGlvbiIsdS5zdHJpbmcubG93ZXJGaXJzdChlKSksdC5lbmRwb2ludGRpc2NvdmVyeSYmIW4uaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSYmbChuLCJoYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5IiwhMD09PXQuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQpfSkpKSxsKHRoaXMsInNoYXBlcyIsbmV3IHIoZS5zaGFwZXMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gaS5jcmVhdGUobix0KX0pKSksbCh0aGlzLCJwYWdpbmF0b3JzIixuZXcgcihlLnBhZ2luYXRvcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHMoZSxuLHQpfSkpKSxsKHRoaXMsIndhaXRlcnMiLG5ldyByKGUud2FpdGVycyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgYShlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0KSksdC5kb2N1bWVudGF0aW9uJiYobCh0aGlzLCJkb2N1bWVudGF0aW9uIixlLmRvY3VtZW50YXRpb24pLGwodGhpcywiZG9jdW1lbnRhdGlvblVybCIsZS5kb2N1bWVudGF0aW9uVXJsKSksbCh0aGlzLCJhd3NRdWVyeUNvbXBhdGlibGUiLGUubWV0YWRhdGEuYXdzUXVlcnlDb21wYXRpYmxlKX19LHsiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuLi91dGlsIjo3NCwiLi9jb2xsZWN0aW9uIjo0MSwiLi9vcGVyYXRpb24iOjQyLCIuL3BhZ2luYXRvciI6NDMsIi4vcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9zaGFwZSI6NDV9XSw0MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5tZW1vaXplZFByb3BlcnR5O2Z1bmN0aW9uIG8oZSx0LG4sbyl7cih0aGlzLG8oZSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4oZSx0KX0pKX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIHMgaW4gcj1yfHxTdHJpbmcsZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmKG8uY2FsbCh0aGlzLHMsZVtzXSxuLHIpLGkmJmkocyxlW3NdKSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3NoYXBlIiksbz1lKCIuLi91dGlsIiksaT1vLnByb3BlcnR5LHM9by5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcztuPW58fHt9LGkodGhpcywibmFtZSIsdC5uYW1lfHxlKSxpKHRoaXMsImFwaSIsbi5hcGksITEpLHQuaHR0cD10Lmh0dHB8fHt9LGkodGhpcywiZW5kcG9pbnQiLHQuZW5kcG9pbnQpLGkodGhpcywiaHR0cE1ldGhvZCIsdC5odHRwLm1ldGhvZHx8IlBPU1QiKSxpKHRoaXMsImh0dHBQYXRoIix0Lmh0dHAucmVxdWVzdFVyaXx8Ii8iKSxpKHRoaXMsImF1dGh0eXBlIix0LmF1dGh0eXBlfHwiIiksaSh0aGlzLCJlbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkIix0LmVuZHBvaW50ZGlzY292ZXJ5P3QuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQ/IlJFUVVJUkVEIjoiT1BUSU9OQUwiOiJOVUxMIik7dmFyIGE9dC5odHRwQ2hlY2tzdW1SZXF1aXJlZHx8dC5odHRwQ2hlY2tzdW0mJnQuaHR0cENoZWNrc3VtLnJlcXVlc3RDaGVja3N1bVJlcXVpcmVkO2kodGhpcywiaHR0cENoZWNrc3VtUmVxdWlyZWQiLGEsITEpLHModGhpcywiaW5wdXQiLChmdW5jdGlvbigpe3JldHVybiB0LmlucHV0P3IuY3JlYXRlKHQuaW5wdXQsbik6bmV3IHIuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSxuKX0pKSxzKHRoaXMsIm91dHB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHQub3V0cHV0P3IuY3JlYXRlKHQub3V0cHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJlcnJvcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdO2lmKCF0LmVycm9ycylyZXR1cm4gbnVsbDtmb3IodmFyIG89MDtvPHQuZXJyb3JzLmxlbmd0aDtvKyspZS5wdXNoKHIuY3JlYXRlKHQuZXJyb3JzW29dLG4pKTtyZXR1cm4gZX0pKSxzKHRoaXMsInBhZ2luYXRvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBpLnBhZ2luYXRvcnNbZV19KSksbi5kb2N1bWVudGF0aW9uJiYoaSh0aGlzLCJkb2N1bWVudGF0aW9uIix0LmRvY3VtZW50YXRpb24pLGkodGhpcywiZG9jdW1lbnRhdGlvblVybCIsdC5kb2N1bWVudGF0aW9uVXJsKSkscyh0aGlzLCJpZGVtcG90ZW50TWVtYmVycyIsKGZ1bmN0aW9uKCl7dmFyIGU9W10sdD1vLmlucHV0LG49dC5tZW1iZXJzO2lmKCF0Lm1lbWJlcnMpcmV0dXJuIGU7Zm9yKHZhciByIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmITA9PT1uW3JdLmlzSWRlbXBvdGVudCYmZS5wdXNoKHIpO3JldHVybiBlfSkpLHModGhpcywiaGFzRXZlbnRPdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm1lbWJlcnMsbj1lLnBheWxvYWQ7aWYoIWUubWVtYmVycylyZXR1cm4hMTtpZihuKXJldHVybiB0W25dLmlzRXZlbnRTdHJlYW07Zm9yKHZhciByIGluIHQpaWYoIXQuaGFzT3duUHJvcGVydHkocikmJiEwPT09dFtyXS5pc0V2ZW50U3RyZWFtKXJldHVybiEwO3JldHVybiExfShvLm91dHB1dCl9KSl9fSx7Ii4uL3V0aWwiOjc0LCIuL3NoYXBlIjo0NX1dLDQzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IodGhpcywiaW5wdXRUb2tlbiIsdC5pbnB1dF90b2tlbikscih0aGlzLCJsaW1pdEtleSIsdC5saW1pdF9rZXkpLHIodGhpcywibW9yZVJlc3VsdHMiLHQubW9yZV9yZXN1bHRzKSxyKHRoaXMsIm91dHB1dFRva2VuIix0Lm91dHB1dF90b2tlbikscih0aGlzLCJyZXN1bHRLZXkiLHQucmVzdWx0X2tleSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1yLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7bj1ufHx7fSxvKHRoaXMsIm5hbWUiLGUpLG8odGhpcywiYXBpIixuLmFwaSwhMSksdC5vcGVyYXRpb24mJm8odGhpcywib3BlcmF0aW9uIixyLnN0cmluZy5sb3dlckZpcnN0KHQub3BlcmF0aW9uKSk7dmFyIGk9dGhpcztbInR5cGUiLCJkZXNjcmlwdGlvbiIsImRlbGF5IiwibWF4QXR0ZW1wdHMiLCJhY2NlcHRvcnMiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10W2VdO24mJm8oaSxlLG4pfSkpfX0seyIuLi91dGlsIjo3NH1dLDQ1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb2xsZWN0aW9uIiksbz1lKCIuLi91dGlsIik7ZnVuY3Rpb24gaShlLHQsbil7bnVsbCE9biYmby5wcm9wZXJ0eS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe2UuY29uc3RydWN0b3IucHJvdG90eXBlW3RdfHxvLm1lbW9pemVkUHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSx0LG4pe3Q9dHx8e30saSh0aGlzLCJzaGFwZSIsZS5zaGFwZSksaSh0aGlzLCJhcGkiLHQuYXBpLCExKSxpKHRoaXMsInR5cGUiLGUudHlwZSksaSh0aGlzLCJlbnVtIixlLmVudW0pLGkodGhpcywibWluIixlLm1pbiksaSh0aGlzLCJtYXgiLGUubWF4KSxpKHRoaXMsInBhdHRlcm4iLGUucGF0dGVybiksaSh0aGlzLCJsb2NhdGlvbiIsZS5sb2NhdGlvbnx8dGhpcy5sb2NhdGlvbnx8ImJvZHkiKSxpKHRoaXMsIm5hbWUiLHRoaXMubmFtZXx8ZS54bWxOYW1lfHxlLnF1ZXJ5TmFtZXx8ZS5sb2NhdGlvbk5hbWV8fG4pLGkodGhpcywiaXNTdHJlYW1pbmciLGUuc3RyZWFtaW5nfHx0aGlzLmlzU3RyZWFtaW5nfHwhMSksaSh0aGlzLCJyZXF1aXJlc0xlbmd0aCIsZS5yZXF1aXJlc0xlbmd0aCwhMSksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsZS5pc0NvbXBvc2l0ZXx8ITEpLGkodGhpcywiaXNTaGFwZSIsITAsITEpLGkodGhpcywiaXNRdWVyeU5hbWUiLEJvb2xlYW4oZS5xdWVyeU5hbWUpLCExKSxpKHRoaXMsImlzTG9jYXRpb25OYW1lIixCb29sZWFuKGUubG9jYXRpb25OYW1lKSwhMSksaSh0aGlzLCJpc0lkZW1wb3RlbnQiLCEwPT09ZS5pZGVtcG90ZW5jeVRva2VuKSxpKHRoaXMsImlzSnNvblZhbHVlIiwhMD09PWUuanNvbnZhbHVlKSxpKHRoaXMsImlzU2Vuc2l0aXZlIiwhMD09PWUuc2Vuc2l0aXZlfHxlLnByb3RvdHlwZSYmITA9PT1lLnByb3RvdHlwZS5zZW5zaXRpdmUpLGkodGhpcywiaXNFdmVudFN0cmVhbSIsQm9vbGVhbihlLmV2ZW50c3RyZWFtKSwhMSksaSh0aGlzLCJpc0V2ZW50IixCb29sZWFuKGUuZXZlbnQpLCExKSxpKHRoaXMsImlzRXZlbnRQYXlsb2FkIixCb29sZWFuKGUuZXZlbnRwYXlsb2FkKSwhMSksaSh0aGlzLCJpc0V2ZW50SGVhZGVyIixCb29sZWFuKGUuZXZlbnRoZWFkZXIpLCExKSxpKHRoaXMsImlzVGltZXN0YW1wRm9ybWF0U2V0IixCb29sZWFuKGUudGltZXN0YW1wRm9ybWF0KXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuaXNUaW1lc3RhbXBGb3JtYXRTZXQsITEpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlJZCIsQm9vbGVhbihlLmVuZHBvaW50ZGlzY292ZXJ5aWQpLCExKSxpKHRoaXMsImhvc3RMYWJlbCIsQm9vbGVhbihlLmhvc3RMYWJlbCksITEpLHQuZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGUueG1sQXR0cmlidXRlJiZpKHRoaXMsImlzWG1sQXR0cmlidXRlIixlLnhtbEF0dHJpYnV0ZXx8ITEpLGkodGhpcywiZGVmYXVsdFZhbHVlIixudWxsKSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplfSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX19ZnVuY3Rpb24gYyhlKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpKHRoaXMsImlzQ29tcG9zaXRlIiwhMCksZS5mbGF0dGVuZWQmJmkodGhpcywiZmxhdHRlbmVkIixlLmZsYXR0ZW5lZHx8ITEpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj10aGlzLG89bnVsbCx1PSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdSYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsIm1lbWJlcnMiLHt9KSxpKHRoaXMsIm1lbWJlck5hbWVzIixbXSksaSh0aGlzLCJyZXF1aXJlZCIsW10pLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksaSh0aGlzLCJpc0RvY3VtZW50IixCb29sZWFuKGUuZG9jdW1lbnQpKSksZS5tZW1iZXJzJiYoaSh0aGlzLCJtZW1iZXJzIixuZXcgcihlLm1lbWJlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gYS5jcmVhdGUobix0LGUpfSkpKSxzKHRoaXMsIm1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtyZXR1cm4gZS54bWxPcmRlcnx8T2JqZWN0LmtleXMoZS5tZW1iZXJzKX0pKSxlLmV2ZW50JiYocyh0aGlzLCJldmVudFBheWxvYWRNZW1iZXJOYW1lIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWlmKGVbdFtyXV0uaXNFdmVudFBheWxvYWQpcmV0dXJuIHRbcl19KSkscyh0aGlzLCJldmVudEhlYWRlck1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPVtdLG89MCxpPXQubGVuZ3RoO288aTtvKyspZVt0W29dXS5pc0V2ZW50SGVhZGVyJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9KSkpKSxlLnJlcXVpcmVkJiYoaSh0aGlzLCJyZXF1aXJlZCIsZS5yZXF1aXJlZCksaSh0aGlzLCJpc1JlcXVpcmVkIiwoZnVuY3Rpb24odCl7aWYoIW8pe289e307Zm9yKHZhciBuPTA7bjxlLnJlcXVpcmVkLmxlbmd0aDtuKyspb1tlLnJlcXVpcmVkW25dXT0hMH1yZXR1cm4gb1t0XX0pLCExLCEwKSksaSh0aGlzLCJyZXN1bHRXcmFwcGVyIixlLnJlc3VsdFdyYXBwZXJ8fG51bGwpLGUucGF5bG9hZCYmaSh0aGlzLCJwYXlsb2FkIixlLnBheWxvYWQpLCJzdHJpbmciPT10eXBlb2YgZS54bWxOYW1lc3BhY2U/aSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlKToib2JqZWN0Ij09dHlwZW9mIGUueG1sTmFtZXNwYWNlJiYoaSh0aGlzLCJ4bWxOYW1lc3BhY2VQcmVmaXgiLGUueG1sTmFtZXNwYWNlLnByZWZpeCksaSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlLnVyaSkpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbj10aGlzLHI9IXRoaXMuaXNTaGFwZTtpZihjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuW119KSksZS5tZW1iZXImJnModGhpcywibWVtYmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS5tZW1iZXIsdCl9KSksdGhpcy5mbGF0dGVuZWQpe3ZhciBvPXRoaXMubmFtZTtzKHRoaXMsIm5hbWUiLChmdW5jdGlvbigpe3JldHVybiBuLm1lbWJlci5uYW1lfHxvfSkpfX1mdW5jdGlvbiBwKGUsdCl7dmFyIG49IXRoaXMuaXNTaGFwZTtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuJiYoaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybnt9fSkpLGkodGhpcywia2V5IixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpLGkodGhpcywidmFsdWUiLGEuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx0KSkpLGUua2V5JiZzKHRoaXMsImtleSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUua2V5LHQpfSkpLGUudmFsdWUmJnModGhpcywidmFsdWUiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLnZhbHVlLHQpfSkpfWZ1bmN0aW9uIGQoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1bInJlc3QteG1sIiwicXVlcnkiLCJlYzIiXTt0aGlzLnRvVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmFwaSYmZS5pbmRleE9mKHRoaXMuYXBpLnByb3RvY29sKT4tMT90fHwiIjp0LHRoaXMuaXNKc29uVmFsdWU/SlNPTi5wYXJzZSh0KTp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b1N0cmluZz90LnRvU3RyaW5nKCk6dH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaXNKc29uVmFsdWU/SlNPTi5zdHJpbmdpZnkoZSk6ZX19ZnVuY3Rpb24gaCgpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3ZhciB0PW8uYmFzZTY0LmRlY29kZShlKTtpZih0aGlzLmlzU2Vuc2l0aXZlJiZvLmlzTm9kZSgpJiYiZnVuY3Rpb24iPT10eXBlb2Ygby5CdWZmZXIuYWxsb2Mpe3ZhciBuPW8uQnVmZmVyLmFsbG9jKHQubGVuZ3RoLHQpO3QuZmlsbCgwKSx0PW59cmV0dXJuIHR9LHRoaXMudG9XaXJlRm9ybWF0PW8uYmFzZTY0LmVuY29kZX1mdW5jdGlvbiBmKCl7aC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZygpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZTpudWxsPT1lP251bGw6InRydWUiPT09ZX19YS5ub3JtYWxpemVkVHlwZXM9e2NoYXJhY3Rlcjoic3RyaW5nIixkb3VibGU6ImZsb2F0Iixsb25nOiJpbnRlZ2VyIixzaG9ydDoiaW50ZWdlciIsYmlnaW50ZWdlcjoiaW50ZWdlciIsYmlnZGVjaW1hbDoiZmxvYXQiLGJsb2I6ImJpbmFyeSJ9LGEudHlwZXM9e3N0cnVjdHVyZTp1LGxpc3Q6bCxtYXA6cCxib29sZWFuOmcsdGltZXN0YW1wOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50aW1lc3RhbXBGb3JtYXQpaSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUudGltZXN0YW1wRm9ybWF0KTtlbHNlIGlmKHQuaXNUaW1lc3RhbXBGb3JtYXRTZXQmJnRoaXMudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0Iix0aGlzLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZigiaGVhZGVyIj09PXRoaXMubG9jYXRpb24paSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJyZmM4MjIiKTtlbHNlIGlmKCJxdWVyeXN0cmluZyI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpO2Vsc2UgaWYodGhpcy5hcGkpc3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImpzb24iOmNhc2UicmVzdC1qc29uIjppKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsInVuaXhUaW1lc3RhbXAiKTticmVhaztjYXNlInJlc3QteG1sIjpjYXNlInF1ZXJ5IjpjYXNlImVjMiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJpc284NjAxIil9dGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgZS50b1VUQ1N0cmluZz9lOiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP28uZGF0ZS5wYXJzZVRpbWVzdGFtcChlKTpudWxsfSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gby5kYXRlLmZvcm1hdChlLHQudGltZXN0YW1wRm9ybWF0KX19LGZsb2F0OmZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDpwYXJzZUZsb2F0KGUpfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0saW50ZWdlcjpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VJbnQoZSwxMCl9LHRoaXMudG9XaXJlRm9ybWF0PXRoaXMudG9UeXBlfSxzdHJpbmc6ZCxiYXNlNjQ6ZixiaW5hcnk6aH0sYS5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7aWYoZS5zaGFwZSl7dmFyIG49dC5hcGkuc2hhcGVzW2Uuc2hhcGVdO2lmKCFuKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgc2hhcGUgcmVmZXJlbmNlOiAiK2Uuc2hhcGUpO3JldHVybiBufXJldHVybiBudWxsfSxhLmNyZWF0ZT1mdW5jdGlvbihlLHQsbil7aWYoZS5pc1NoYXBlKXJldHVybiBlO3ZhciByPWEucmVzb2x2ZShlLHQpO2lmKHIpe3ZhciBvPU9iamVjdC5rZXlzKGUpO3QuZG9jdW1lbnRhdGlvbnx8KG89by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLm1hdGNoKC9kb2N1bWVudGF0aW9uLyl9KSkpO3ZhciBpPWZ1bmN0aW9uKCl7ci5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSx0LG4pfTtyZXR1cm4gaS5wcm90b3R5cGU9cixuZXcgaX1lLnR5cGV8fChlLm1lbWJlcnM/ZS50eXBlPSJzdHJ1Y3R1cmUiOmUubWVtYmVyP2UudHlwZT0ibGlzdCI6ZS5rZXk/ZS50eXBlPSJtYXAiOmUudHlwZT0ic3RyaW5nIik7dmFyIHM9ZS50eXBlO2lmKGEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0mJihlLnR5cGU9YS5ub3JtYWxpemVkVHlwZXNbZS50eXBlXSksYS50eXBlc1tlLnR5cGVdKXJldHVybiBuZXcgYS50eXBlc1tlLnR5cGVdKGUsdCxuKTt0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBzaGFwZSB0eXBlOiAiK3MpfSxhLnNoYXBlcz17U3RydWN0dXJlU2hhcGU6dSxMaXN0U2hhcGU6bCxNYXBTaGFwZTpwLFN0cmluZ1NoYXBlOmQsQm9vbGVhblNoYXBlOmcsQmFzZTY0U2hhcGU6Zn0sdC5leHBvcnRzPWF9LHsiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDF9XSw0NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuUGFyYW1WYWxpZGF0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpeyEwIT09ZSYmdm9pZCAwIT09ZXx8KGU9e21pbjohMH0pLHRoaXMudmFsaWRhdGlvbj1lfSx2YWxpZGF0ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy5lcnJvcnM9W10sdGhpcy52YWxpZGF0ZU1lbWJlcihlLHR8fHt9LG58fCJwYXJhbXMiKSx0aGlzLmVycm9ycy5sZW5ndGg+MSl7dmFyIG89dGhpcy5lcnJvcnMuam9pbigiXG4qICIpO3Rocm93IG89IlRoZXJlIHdlcmUgIit0aGlzLmVycm9ycy5sZW5ndGgrIiB2YWxpZGF0aW9uIGVycm9yczpcbiogIitvLHIudXRpbC5lcnJvcihuZXcgRXJyb3Iobykse2NvZGU6Ik11bHRpcGxlVmFsaWRhdGlvbkVycm9ycyIsZXJyb3JzOnRoaXMuZXJyb3JzfSl9aWYoMT09PXRoaXMuZXJyb3JzLmxlbmd0aCl0aHJvdyB0aGlzLmVycm9yc1swXTtyZXR1cm4hMH0sZmFpbDpmdW5jdGlvbihlLHQpe3RoaXMuZXJyb3JzLnB1c2goci51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZTplfSkpfSx2YWxpZGF0ZVN0cnVjdHVyZTpmdW5jdGlvbihlLHQsbil7aWYoZS5pc0RvY3VtZW50KXJldHVybiEwO3ZhciByO3RoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJzdHJ1Y3R1cmUiKTtmb3IodmFyIG89MDtlLnJlcXVpcmVkJiZvPGUucmVxdWlyZWQubGVuZ3RoO28rKyl7dmFyIGk9dFtyPWUucmVxdWlyZWRbb11dO251bGw9PWkmJnRoaXMuZmFpbCgiTWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyIiwiTWlzc2luZyByZXF1aXJlZCBrZXkgJyIrcisiJyBpbiAiK24pfWZvcihyIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikpe3ZhciBzPXRbcl0sYT1lLm1lbWJlcnNbcl07aWYodm9pZCAwIT09YSl7dmFyIGM9W24scl0uam9pbigiLiIpO3RoaXMudmFsaWRhdGVNZW1iZXIoYSxzLGMpfWVsc2UgbnVsbCE9cyYmdGhpcy5mYWlsKCJVbmV4cGVjdGVkUGFyYW1ldGVyIiwiVW5leHBlY3RlZCBrZXkgJyIrcisiJyBmb3VuZCBpbiAiK24pfXJldHVybiEwfSx2YWxpZGF0ZU1lbWJlcjpmdW5jdGlvbihlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiB0aGlzLnZhbGlkYXRlU3RydWN0dXJlKGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiB0aGlzLnZhbGlkYXRlTGlzdChlLHQsbik7Y2FzZSJtYXAiOnJldHVybiB0aGlzLnZhbGlkYXRlTWFwKGUsdCxuKTtkZWZhdWx0OnJldHVybiB0aGlzLnZhbGlkYXRlU2NhbGFyKGUsdCxuKX19LHZhbGlkYXRlTGlzdDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFtBcnJheV0pKXt0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJsaXN0IG1lbWJlciBjb3VudCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMudmFsaWRhdGVNZW1iZXIoZS5tZW1iZXIsdFtyXSxuKyJbIityKyJdIil9fSx2YWxpZGF0ZU1hcDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFsib2JqZWN0Il0sIm1hcCIpKXt2YXIgcj0wO2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYodGhpcy52YWxpZGF0ZU1lbWJlcihlLmtleSxvLG4rIltrZXk9JyIrbysiJ10iKSx0aGlzLnZhbGlkYXRlTWVtYmVyKGUudmFsdWUsdFtvXSxuKyJbJyIrbysiJ10iKSxyKyspO3RoaXMudmFsaWRhdGVSYW5nZShlLHIsbiwibWFwIG1lbWJlciBjb3VudCIpfX0sdmFsaWRhdGVTY2FsYXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgbnVsbDpjYXNlIHZvaWQgMDpjYXNlInN0cmluZyI6cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmcoZSx0LG4pO2Nhc2UiYmFzZTY0IjpjYXNlImJpbmFyeSI6cmV0dXJuIHRoaXMudmFsaWRhdGVQYXlsb2FkKHQsbik7Y2FzZSJpbnRlZ2VyIjpjYXNlImZsb2F0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZU51bWJlcihlLHQsbik7Y2FzZSJib29sZWFuIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVR5cGUodCxuLFsiYm9vbGVhbiJdKTtjYXNlInRpbWVzdGFtcCI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbRGF0ZSwvXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT9aJC8sIm51bWJlciJdLCJEYXRlIG9iamVjdCwgSVNPLTg2MDEgc3RyaW5nLCBvciBhIFVOSVggdGltZXN0YW1wIik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5mYWlsKCJVbmtvd25UeXBlIiwiVW5oYW5kbGVkIHR5cGUgIitlLnR5cGUrIiBmb3IgIituKX19LHZhbGlkYXRlU3RyaW5nOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bInN0cmluZyJdO2UuaXNKc29uVmFsdWUmJihyPXIuY29uY2F0KFsibnVtYmVyIiwib2JqZWN0IiwiYm9vbGVhbiJdKSksbnVsbCE9PXQmJnRoaXMudmFsaWRhdGVUeXBlKHQsbixyKSYmKHRoaXMudmFsaWRhdGVFbnVtKGUsdCxuKSx0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJzdHJpbmcgbGVuZ3RoIiksdGhpcy52YWxpZGF0ZVBhdHRlcm4oZSx0LG4pLHRoaXMudmFsaWRhdGVVcmkoZSx0LG4pKX0sdmFsaWRhdGVVcmk6ZnVuY3Rpb24oZSx0LG4peyJ1cmkiPT09ZS5sb2NhdGlvbiYmMD09PXQubGVuZ3RoJiZ0aGlzLmZhaWwoIlVyaVBhcmFtZXRlckVycm9yIiwnRXhwZWN0ZWQgdXJpIHBhcmFtZXRlciB0byBoYXZlIGxlbmd0aCA+PSAxLCBidXQgZm91bmQgIicrdCsnIiBmb3IgJytuKX0sdmFsaWRhdGVQYXR0ZXJuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24ucGF0dGVybiYmdm9pZCAwIT09ZS5wYXR0ZXJuJiYobmV3IFJlZ0V4cChlLnBhdHRlcm4pLnRlc3QodCl8fHRoaXMuZmFpbCgiUGF0dGVybk1hdGNoRXJyb3IiLCdQcm92aWRlZCB2YWx1ZSAiJyt0KyciIGRvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gLycrZS5wYXR0ZXJuKyIvIGZvciAiK24pKX0sdmFsaWRhdGVSYW5nZTpmdW5jdGlvbihlLHQsbixyKXt0aGlzLnZhbGlkYXRpb24ubWluJiZ2b2lkIDAhPT1lLm1pbiYmdDxlLm1pbiYmdGhpcy5mYWlsKCJNaW5SYW5nZUVycm9yIiwiRXhwZWN0ZWQgIityKyIgPj0gIitlLm1pbisiLCBidXQgZm91bmQgIit0KyIgZm9yICIrbiksdGhpcy52YWxpZGF0aW9uLm1heCYmdm9pZCAwIT09ZS5tYXgmJnQ+ZS5tYXgmJnRoaXMuZmFpbCgiTWF4UmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiIDw9ICIrZS5tYXgrIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pfSx2YWxpZGF0ZUVudW06ZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFsaWRhdGlvbi5lbnVtJiZ2b2lkIDAhPT1lLmVudW0mJi0xPT09ZS5lbnVtLmluZGV4T2YodCkmJnRoaXMuZmFpbCgiRW51bUVycm9yIiwiRm91bmQgc3RyaW5nIHZhbHVlIG9mICIrdCsiLCBidXQgZXhwZWN0ZWQgIitlLmVudW0uam9pbigifCIpKyIgZm9yICIrbil9LHZhbGlkYXRlVHlwZTpmdW5jdGlvbihlLHQsbixvKXtpZihudWxsPT1lKXJldHVybiExO2Zvcih2YXIgaT0hMSxzPTA7czxuLmxlbmd0aDtzKyspe2lmKCJzdHJpbmciPT10eXBlb2YgbltzXSl7aWYodHlwZW9mIGU9PT1uW3NdKXJldHVybiEwfWVsc2UgaWYobltzXWluc3RhbmNlb2YgUmVnRXhwKXtpZigoZXx8IiIpLnRvU3RyaW5nKCkubWF0Y2gobltzXSkpcmV0dXJuITB9ZWxzZXtpZihlIGluc3RhbmNlb2YgbltzXSlyZXR1cm4hMDtpZihyLnV0aWwuaXNUeXBlKGUsbltzXSkpcmV0dXJuITA7b3x8aXx8KG49bi5zbGljZSgpKSxuW3NdPXIudXRpbC50eXBlTmFtZShuW3NdKX1pPSEwfXZhciBhPW87YXx8KGE9bi5qb2luKCIsICIpLnJlcGxhY2UoLywoW14sXSspJC8sIiwgb3IkMSIpKTt2YXIgYz1hLm1hdGNoKC9eW2FlaW91XS9pKT8ibiI6IiI7cmV0dXJuIHRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIitjKyIgIithKSwhMX0sdmFsaWRhdGVOdW1iZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPXQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9cGFyc2VGbG9hdCh0KTtyLnRvU3RyaW5nKCk9PT10JiYodD1yKX10aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJudW1iZXIiXSkmJnRoaXMudmFsaWRhdGVSYW5nZShlLHQsbiwibnVtZXJpYyB2YWx1ZSIpfX0sdmFsaWRhdGVQYXlsb2FkOmZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSYmInN0cmluZyIhPXR5cGVvZiBlJiYoIWV8fCJudW1iZXIiIT10eXBlb2YgZS5ieXRlTGVuZ3RoKSl7aWYoci51dGlsLmlzTm9kZSgpKXt2YXIgbj1yLnV0aWwuc3RyZWFtLlN0cmVhbTtpZihyLnV0aWwuQnVmZmVyLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgbilyZXR1cm59ZWxzZSBpZih2b2lkIDAhPT10eXBlb2YgQmxvYiYmZSBpbnN0YW5jZW9mIEJsb2IpcmV0dXJuO3ZhciBvPVsiQnVmZmVyIiwiU3RyZWFtIiwiRmlsZSIsIkJsb2IiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3Il07aWYoZSlmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyl7aWYoci51dGlsLmlzVHlwZShlLG9baV0pKXJldHVybjtpZihyLnV0aWwudHlwZU5hbWUoZS5jb25zdHJ1Y3Rvcik9PT1vW2ldKXJldHVybn10aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSBzdHJpbmcsIEJ1ZmZlciwgU3RyZWFtLCBCbG9iLCBvciB0eXBlZCBhcnJheSBvYmplY3QiKX19fSl9LHsiLi9jb3JlIjoxOX1dLDQ3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vY29yZSIpO3QuZXhwb3J0cz17cG9wdWxhdGVIb3N0UHJlZml4OmZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuY29uZmlnLmhvc3RQcmVmaXhFbmFibGVkKXJldHVybiBlO3ZhciB0LG4saSxzLGEsYz1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGksbj10Lm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89dC5lbmRwb2ludE9wZXJhdGlvbiYmdC5lbmRwb2ludE9wZXJhdGlvbj09PXIuc3RyaW5nLmxvd2VyRmlyc3Qobi5uYW1lKTtyZXR1cm4iTlVMTCIhPT1uLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWR8fCEwPT09b30oZSkpcmV0dXJuIGU7aWYoYy5lbmRwb2ludCYmYy5lbmRwb2ludC5ob3N0UHJlZml4KXt2YXIgdT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZWFjaChuLm1lbWJlcnMsKGZ1bmN0aW9uKG4sbyl7aWYoITA9PT1vLmhvc3RMYWJlbCl7aWYoInN0cmluZyIhPXR5cGVvZiB0W25dfHwiIj09PXRbbl0pdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlBhcmFtZXRlciAiK24rIiBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLiIsY29kZToiSW52YWxpZFBhcmFtZXRlciJ9KTt2YXIgaT1uZXcgUmVnRXhwKCJcXHsiK24rIlxcfSIsImciKTtlPWUucmVwbGFjZShpLHRbbl0pfX0pKSxlfShjLmVuZHBvaW50Lmhvc3RQcmVmaXgsZS5wYXJhbXMsYy5pbnB1dCk7cz1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LGE9dSxzLmhvc3QmJihzLmhvc3Q9YStzLmhvc3QpLHMuaG9zdG5hbWUmJihzLmhvc3RuYW1lPWErcy5ob3N0bmFtZSksdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLG49dC5zcGxpdCgiLiIpLGk9L15bYS16QS1aMC05XXsxfSR8XlthLXpBLVowLTldW2EtekEtWjAtOVwtXSpbYS16QS1aMC05XSQvLHIuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aHx8ZS5sZW5ndGg8MXx8ZS5sZW5ndGg+NjMpdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZToiSG9zdG5hbWUgbGFiZWwgbGVuZ3RoIHNob3VsZCBiZSBiZXR3ZWVuIDEgdG8gNjMgY2hhcmFjdGVycywgaW5jbHVzaXZlLiJ9KTtpZighaS50ZXN0KGUpKXRocm93IG8udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZTplKyIgaXMgbm90IGhvc3RuYW1lIGNvbXBhdGlibGUuIn0pfSkpfXJldHVybiBlfX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0fV0sNDg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9qc29uL2J1aWxkZXIiKSxpPWUoIi4uL2pzb24vcGFyc2VyIikscz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdCxuPWUuc2VydmljZS5hcGkscj1uLnRhcmdldFByZWZpeCsiLiIrbi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5uYW1lLGk9bi5qc29uVmVyc2lvbnx8IjEuMCIsYT1uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0LGM9bmV3IG87MT09PWkmJihpPSIxLjAiKSxuLmF3c1F1ZXJ5Q29tcGF0aWJsZSYmKHQucGFyYW1zfHwodC5wYXJhbXM9e30pLE9iamVjdC5hc3NpZ24odC5wYXJhbXMsZS5wYXJhbXMpKSx0LmJvZHk9Yy5idWlsZChlLnBhcmFtc3x8e30sYSksdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC1hbXotanNvbi0iK2ksdC5oZWFkZXJzWyJYLUFtei1UYXJnZXQiXT1yLHMoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPWUuaHR0cFJlc3BvbnNlO2lmKHQuY29kZT1uLmhlYWRlcnNbIngtYW16bi1lcnJvcnR5cGUiXXx8IlVua25vd25FcnJvciIsInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJih0LmNvZGU9dC5jb2RlLnNwbGl0KCI6IilbMF0pLG4uYm9keS5sZW5ndGg+MCl0cnl7dmFyIG89SlNPTi5wYXJzZShuLmJvZHkudG9TdHJpbmcoKSksaT1vLl9fdHlwZXx8by5jb2RlfHxvLkNvZGU7Zm9yKHZhciBzIGluIGkmJih0LmNvZGU9aS5zcGxpdCgiIyIpLnBvcCgpKSwiUmVxdWVzdEVudGl0eVRvb0xhcmdlIj09PXQuY29kZT90Lm1lc3NhZ2U9IlJlcXVlc3QgYm9keSBtdXN0IGJlIGxlc3MgdGhhbiAxIE1CIjp0Lm1lc3NhZ2U9by5tZXNzYWdlfHxvLk1lc3NhZ2V8fG51bGwsb3x8e30pImNvZGUiIT09cyYmIm1lc3NhZ2UiIT09cyYmKHRbIlsiK3MrIl0iXT0iU2VlIGVycm9yLiIrcysiIGZvciBkZXRhaWxzLiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscyx7dmFsdWU6b1tzXSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfSkpfWNhdGNoKG8pe3Quc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzTWVzc2FnZX1lbHNlIHQuc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzQ29kZS50b1N0cmluZygpO2UuZXJyb3I9ci5lcnJvcihuZXcgRXJyb3IsdCl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKXx8Int9IjtpZighMT09PWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jb252ZXJ0UmVzcG9uc2VUeXBlcyllLmRhdGE9SlNPTi5wYXJzZSh0KTtlbHNle3ZhciBuPWUucmVxdWVzdC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2UucmVxdWVzdC5vcGVyYXRpb25dLm91dHB1dHx8e30scj1uZXcgaTtlLmRhdGE9ci5wYXJzZSh0LG4pfX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw0OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiKSxzPWUoIi4uL21vZGVsL3NoYXBlIiksYT1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPWUuaHR0cFJlcXVlc3Q7bi5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PXV0Zi04IixuLnBhcmFtcz17VmVyc2lvbjplLnNlcnZpY2UuYXBpLmFwaVZlcnNpb24sQWN0aW9uOnQubmFtZX0sKG5ldyBpKS5zZXJpYWxpemUoZS5wYXJhbXMsdC5pbnB1dCwoZnVuY3Rpb24oZSx0KXtuLnBhcmFtc1tlXT10fSkpLG4uYm9keT1vLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobi5wYXJhbXMpLGEoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdCxuPWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKTtpZihuLm1hdGNoKCI8VW5rbm93bk9wZXJhdGlvbkV4Y2VwdGlvbiIpKXQ9e0NvZGU6IlVua25vd25PcGVyYXRpb24iLE1lc3NhZ2U6IlVua25vd24gb3BlcmF0aW9uICIrZS5yZXF1ZXN0Lm9wZXJhdGlvbn07ZWxzZSB0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2Uobil9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5yZXF1ZXN0SWQmJiFlLnJlcXVlc3RJZCYmKGUucmVxdWVzdElkPXQucmVxdWVzdElkKSx0LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LGk9bjtpZihpLnJlc3VsdFdyYXBwZXIpe3ZhciBhPXMuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSk7YS5tZW1iZXJzW2kucmVzdWx0V3JhcHBlcl09bixhLm1lbWJlck5hbWVzPVtpLnJlc3VsdFdyYXBwZXJdLG8ucHJvcGVydHkobiwibmFtZSIsbi5yZXN1bHRXcmFwcGVyKSxuPWF9dmFyIGM9bmV3IHIuWE1MLlBhcnNlcjtpZihuJiZuLm1lbWJlcnMmJiFuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQpe3ZhciB1PXMuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx7YXBpOntwcm90b2NvbDoicXVlcnkifX0sInJlcXVlc3RJZCIpO24ubWVtYmVycy5fWEFNWlJlcXVlc3RJZD11fXZhciBsPWMucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpLG4pO2UucmVxdWVzdElkPWwuX1hBTVpSZXF1ZXN0SWR8fGwucmVxdWVzdElkLGwuX1hBTVpSZXF1ZXN0SWQmJmRlbGV0ZSBsLl9YQU1aUmVxdWVzdElkLGkucmVzdWx0V3JhcHBlciYmbFtpLnJlc3VsdFdyYXBwZXJdJiYoby51cGRhdGUobCxsW2kucmVzdWx0V3JhcHBlcl0pLGRlbGV0ZSBsW2kucmVzdWx0V3JhcHBlcl0pLGUuZGF0YT1sfX19LHsiLi4vY29yZSI6MTksIi4uL21vZGVsL3NoYXBlIjo0NSwiLi4vcXVlcnkvcXVlcnlfcGFyYW1fc2VyaWFsaXplciI6NTMsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7ZnVuY3Rpb24gaShlLHQsbixvKXt2YXIgaT1bZSx0XS5qb2luKCIvIik7aT1pLnJlcGxhY2UoL1wvKy9nLCIvIik7dmFyIHM9e30sYT0hMTtpZihyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBuPW9bZV07aWYobnVsbCE9bilpZigidXJpIj09PXQubG9jYXRpb24pe3ZhciBjPW5ldyBSZWdFeHAoIlxceyIrdC5uYW1lKyIoXFwrKT9cXH0iKTtpPWkucmVwbGFjZShjLChmdW5jdGlvbihlLHQpe3JldHVybih0P3IudXJpRXNjYXBlUGF0aDpyLnVyaUVzY2FwZSkoU3RyaW5nKG4pKX0pKX1lbHNlInF1ZXJ5c3RyaW5nIj09PXQubG9jYXRpb24mJihhPSEwLCJsaXN0Ij09PXQudHlwZT9zW3QubmFtZV09bi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiByLnVyaUVzY2FwZSh0Lm1lbWJlci50b1dpcmVGb3JtYXQoZSkudG9TdHJpbmcoKSl9KSk6Im1hcCI9PT10LnR5cGU/ci5lYWNoKG4sKGZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KT9zW2VdPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUoU3RyaW5nKGUpKX0pKTpzW2VdPXIudXJpRXNjYXBlKFN0cmluZyh0KSl9KSk6c1t0Lm5hbWVdPXIudXJpRXNjYXBlKHQudG9XaXJlRm9ybWF0KG4pLnRvU3RyaW5nKCkpKX0pKSxhKXtpKz1pLmluZGV4T2YoIj8iKT49MD8iJiI6Ij8iO3ZhciBjPVtdO3IuYXJyYXlFYWNoKE9iamVjdC5rZXlzKHMpLnNvcnQoKSwoZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShzW2VdKXx8KHNbZV09W3NbZV1dKTtmb3IodmFyIHQ9MDt0PHNbZV0ubGVuZ3RoO3QrKyljLnB1c2goci51cmlFc2NhcGUoU3RyaW5nKGUpKSsiPSIrc1tlXVt0XSl9KSksaSs9Yy5qb2luKCImIil9cmV0dXJuIGl9dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QubWV0aG9kPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaHR0cE1ldGhvZH0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXQuaW5wdXQscj1pKGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQucGF0aCx0Lmh0dHBQYXRoLG4sZS5wYXJhbXMpO2UuaHR0cFJlcXVlc3QucGF0aD1yfShlKSxmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3IuZWFjaCh0LmlucHV0Lm1lbWJlcnMsKGZ1bmN0aW9uKHQsbil7dmFyIG89ZS5wYXJhbXNbdF07bnVsbCE9byYmKCJoZWFkZXJzIj09PW4ubG9jYXRpb24mJiJtYXAiPT09bi50eXBlP3IuZWFjaChvLChmdW5jdGlvbih0LHIpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tuLm5hbWUrdF09cn0pKToiaGVhZGVyIj09PW4ubG9jYXRpb24mJihvPW4udG9XaXJlRm9ybWF0KG8pLnRvU3RyaW5nKCksbi5pc0pzb25WYWx1ZSYmKG89ci5iYXNlNjQuZW5jb2RlKG8pKSxlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lXT1vKSl9KSl9KGUpLG8oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbigpe30sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49e30sbz1lLmh0dHBSZXNwb25zZSxpPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0LHM9e307ci5lYWNoKG8uaGVhZGVycywoZnVuY3Rpb24oZSx0KXtzW2UudG9Mb3dlckNhc2UoKV09dH0pKSxyLmVhY2goaS5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBpPSh0Lm5hbWV8fGUpLnRvTG93ZXJDYXNlKCk7aWYoImhlYWRlcnMiPT09dC5sb2NhdGlvbiYmIm1hcCI9PT10LnR5cGUpe25bZV09e307dmFyIGE9dC5pc0xvY2F0aW9uTmFtZT90Lm5hbWU6IiIsYz1uZXcgUmVnRXhwKCJeIithKyIoLispIiwiaSIpO3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKHQscil7dmFyIG89dC5tYXRjaChjKTtudWxsIT09byYmKG5bZV1bb1sxXV09cil9KSl9ZWxzZSBpZigiaGVhZGVyIj09PXQubG9jYXRpb24pe2lmKHZvaWQgMCE9PXNbaV0pe3ZhciB1PXQuaXNKc29uVmFsdWU/ci5iYXNlNjQuZGVjb2RlKHNbaV0pOnNbaV07bltlXT10LnRvVHlwZSh1KX19ZWxzZSJzdGF0dXNDb2RlIj09PXQubG9jYXRpb24mJihuW2VdPXBhcnNlSW50KG8uc3RhdHVzQ29kZSwxMCkpfSkpLGUuZGF0YT1ufSxnZW5lcmF0ZVVSSTppfX0seyIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9yZXN0IiksaT1lKCIuL2pzb24iKSxzPWUoIi4uL2pzb24vYnVpbGRlciIpLGE9ZSgiLi4vanNvbi9wYXJzZXIiKSxjPVsiR0VUIiwiSEVBRCIsIkRFTEVURSJdO2Z1bmN0aW9uIHUoZSx0KXtpZighZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSl7dmFyIG49dD8iYmluYXJ5L29jdGV0LXN0cmVhbSI6ImFwcGxpY2F0aW9uL2pzb24iO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl09bn19dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7by5idWlsZFJlcXVlc3QoZSksYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKTwwJiZmdW5jdGlvbihlKXt2YXIgdD1uZXcgcyxuPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQ7aWYobi5wYXlsb2FkKXt2YXIgcixvPW4ubWVtYmVyc1tuLnBheWxvYWRdO3I9ZS5wYXJhbXNbbi5wYXlsb2FkXSwic3RydWN0dXJlIj09PW8udHlwZT8oZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQocnx8e30sbyksdShlKSk6dm9pZCAwIT09ciYmKGUuaHR0cFJlcXVlc3QuYm9keT1yLCgiYmluYXJ5Ij09PW8udHlwZXx8by5pc1N0cmVhbWluZykmJnUoZSwhMCkpfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQoZS5wYXJhbXMsbiksdShlKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXtpLmV4dHJhY3RFcnJvcihlKX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7by5leHRyYWN0RGF0YShlKTt2YXIgdD1lLnJlcXVlc3Qsbj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLHM9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9O2lmKG4uaGFzRXZlbnRPdXRwdXQscy5wYXlsb2FkKXt2YXIgYz1zLm1lbWJlcnNbcy5wYXlsb2FkXSx1PWUuaHR0cFJlc3BvbnNlLmJvZHk7aWYoYy5pc0V2ZW50U3RyZWFtKWw9bmV3IGEsZS5kYXRhW3BheWxvYWRdPXIuY3JlYXRlRXZlbnRTdHJlYW0oMj09PUFXUy5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP2UuaHR0cFJlc3BvbnNlLnN0cmVhbTp1LGwsYyk7ZWxzZSBpZigic3RydWN0dXJlIj09PWMudHlwZXx8Imxpc3QiPT09Yy50eXBlKXt2YXIgbD1uZXcgYTtlLmRhdGFbcy5wYXlsb2FkXT1sLnBhcnNlKHUsYyl9ZWxzZSJiaW5hcnkiPT09Yy50eXBlfHxjLmlzU3RyZWFtaW5nP2UuZGF0YVtzLnBheWxvYWRdPXU6ZS5kYXRhW3MucGF5bG9hZF09Yy50b1R5cGUodSl9ZWxzZXt2YXIgcD1lLmRhdGE7aS5leHRyYWN0RGF0YShlKSxlLmRhdGE9ci5tZXJnZShwLGUuZGF0YSl9fSx1bnNldENvbnRlbnRMZW5ndGg6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ci5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpJiZjLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPj0wJiZkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdfX19LHsiLi4vanNvbi9idWlsZGVyIjozNywiLi4vanNvbi9wYXJzZXIiOjM4LCIuLi91dGlsIjo3NCwiLi9qc29uIjo0OCwiLi9yZXN0Ijo1MH1dLDUyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vdXRpbCIpLGk9ZSgiLi9yZXN0Iik7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7aS5idWlsZFJlcXVlc3QoZSksWyJHRVQiLCJIRUFEIl0uaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxuPW5ldyByLlhNTC5CdWlsZGVyLGk9ZS5wYXJhbXMscz10LnBheWxvYWQ7aWYocyl7dmFyIGE9dC5tZW1iZXJzW3NdO2lmKHZvaWQgMD09PShpPWlbc10pKXJldHVybjtpZigic3RydWN0dXJlIj09PWEudHlwZSl7dmFyIGM9YS5uYW1lO2UuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksYSxjLCEwKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1pfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PW4udG9YTUwoaSx0LHQubmFtZXx8dC5zaGFwZXx8by5zdHJpbmcudXBwZXJGaXJzdChlLm9wZXJhdGlvbikrIlJlcXVlc3QiKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdDtpLmV4dHJhY3RFcnJvcihlKTt0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpKX1jYXRjaChuKXt0PXtDb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsTWVzc2FnZTplLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlfX10LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RGF0YShlKTt2YXIgbj1lLnJlcXVlc3Qscz1lLmh0dHBSZXNwb25zZS5ib2R5LGE9bi5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW24ub3BlcmF0aW9uXSxjPWEub3V0cHV0LHU9KGEuaGFzRXZlbnRPdXRwdXQsYy5wYXlsb2FkKTtpZih1KXt2YXIgbD1jLm1lbWJlcnNbdV07bC5pc0V2ZW50U3RyZWFtPyh0PW5ldyByLlhNTC5QYXJzZXIsZS5kYXRhW3VdPW8uY3JlYXRlRXZlbnRTdHJlYW0oMj09PXIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06ZS5odHRwUmVzcG9uc2UuYm9keSx0LGwpKToic3RydWN0dXJlIj09PWwudHlwZT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT10LnBhcnNlKHMudG9TdHJpbmcoKSxsKSk6ImJpbmFyeSI9PT1sLnR5cGV8fGwuaXNTdHJlYW1pbmc/ZS5kYXRhW3VdPXM6ZS5kYXRhW3VdPWwudG9UeXBlKHMpfWVsc2UgaWYocy5sZW5ndGg+MCl7dmFyIHA9KHQ9bmV3IHIuWE1MLlBhcnNlcikucGFyc2Uocy50b1N0cmluZygpLGMpO28udXBkYXRlKGUuZGF0YSxwKX19fX0seyIuLi9jb3JlIjoxOSwiLi4vdXRpbCI6NzQsIi4vcmVzdCI6NTB9XSw1MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaXNRdWVyeU5hbWV8fCJlYzIiIT09ZS5hcGkucHJvdG9jb2w/ZS5uYW1lOmUubmFtZVswXS50b1VwcGVyQ2FzZSgpK2UubmFtZS5zdWJzdHIoMSl9ZnVuY3Rpb24gcyhlLHQsbixvKXtyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLHIpe3ZhciBzPXRbbl07aWYobnVsbCE9cyl7dmFyIGM9aShyKTthKGM9ZT9lKyIuIitjOmMscyxyLG8pfX0pKX1mdW5jdGlvbiBhKGUsdCxuLG8pe251bGwhPXQmJigic3RydWN0dXJlIj09PW4udHlwZT9zKGUsdCxuLG8pOiJsaXN0Ij09PW4udHlwZT9mdW5jdGlvbihlLHQsbixvKXt2YXIgcz1uLm1lbWJlcnx8e307MCE9PXQubGVuZ3RoP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9Ii4iKyhyKzEpO2lmKCJlYzIiPT09bi5hcGkucHJvdG9jb2wpYys9IiI7ZWxzZSBpZihuLmZsYXR0ZW5lZCl7aWYocy5uYW1lKXt2YXIgdT1lLnNwbGl0KCIuIik7dS5wb3AoKSx1LnB1c2goaShzKSksZT11LmpvaW4oIi4iKX19ZWxzZSBjPSIuIisocy5uYW1lP3MubmFtZToibWVtYmVyIikrYzthKGUrYyx0LHMsbyl9KSk6by5jYWxsKHRoaXMsZSxudWxsKX0oZSx0LG4sbyk6Im1hcCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9MTtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgcz0obi5mbGF0dGVuZWQ/Ii4iOiIuZW50cnkuIikraSsrKyIuIixjPXMrKG4ua2V5Lm5hbWV8fCJrZXkiKSx1PXMrKG4udmFsdWUubmFtZXx8InZhbHVlIik7YShlK2MsdCxuLmtleSxvKSxhKGUrdSxyLG4udmFsdWUsbyl9KSl9KGUsdCxuLG8pOm8oZSxuLnRvV2lyZUZvcm1hdCh0KS50b1N0cmluZygpKSl9by5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtzKCIiLGUsdCxuKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSw1NDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17bm93OmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBwZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTpEYXRlLm5vdygpfX19LHt9XSw1NTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17aXNGaXBzUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGUuc3RhcnRzV2l0aCgiZmlwcy0iKXx8ZS5lbmRzV2l0aCgiLWZpcHMiKSl9LGlzR2xvYmFsUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmWyJhd3MtZ2xvYmFsIiwiYXdzLXVzLWdvdi1nbG9iYWwiXS5pbmNsdWRlcyhlKX0sZ2V0UmVhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm5bImZpcHMtYXdzLWdsb2JhbCIsImF3cy1maXBzIiwiYXdzLWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1lYXN0LTEiOlsiZmlwcy1hd3MtdXMtZ292LWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSk/InVzLWdvdi13ZXN0LTEiOmUucmVwbGFjZSgvZmlwcy0oZGtyLXxwcm9kLSk/fC1maXBzLywiIil9fX0se31dLDU2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi91dGlsIiksbz1lKCIuL3JlZ2lvbl9jb25maWdfZGF0YS5qc29uIik7ZnVuY3Rpb24gaShlLHQpe3IuZWFjaCh0LChmdW5jdGlvbih0LG4peyJnbG9iYWxFbmRwb2ludCIhPT10JiYodm9pZCAwIT09ZS5jb25maWdbdF0mJm51bGwhPT1lLmNvbmZpZ1t0XXx8KGUuY29uZmlnW3RdPW4pKX0pKX10LmV4cG9ydHM9e2NvbmZpZ3VyZUVuZHBvaW50OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5yZWdpb24sbj1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgdD1lLnNwbGl0KCItIik7cmV0dXJuIHQubGVuZ3RoPDM/bnVsbDp0LnNsaWNlKDAsdC5sZW5ndGgtMikuam9pbigiLSIpKyItKiJ9KHQpLHI9ZS5hcGkuZW5kcG9pbnRQcmVmaXg7cmV0dXJuW1t0LHJdLFtuLHJdLFt0LCIqIl0sW24sIioiXSxbIioiLHJdLFt0LCJpbnRlcm5hbC0qIl0sWyIqIiwiKiJdXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdJiZlWzFdP2Uuam9pbigiLyIpOm51bGx9KSl9KGUpLG49ZS5jb25maWcudXNlRmlwc0VuZHBvaW50LHI9ZS5jb25maWcudXNlRHVhbHN0YWNrRW5kcG9pbnQscz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgYT10W3NdO2lmKGEpe3ZhciBjPW4/cj9vLmR1YWxzdGFja0ZpcHNSdWxlczpvLmZpcHNSdWxlczpyP28uZHVhbHN0YWNrUnVsZXM6by5ydWxlcztpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxhKSl7dmFyIHU9Y1thXTsic3RyaW5nIj09dHlwZW9mIHUmJih1PW8ucGF0dGVybnNbdV0pLGUuaXNHbG9iYWxFbmRwb2ludD0hIXUuZ2xvYmFsRW5kcG9pbnQsdS5zaWduaW5nUmVnaW9uJiYoZS5zaWduaW5nUmVnaW9uPXUuc2lnbmluZ1JlZ2lvbiksdS5zaWduYXR1cmVWZXJzaW9ufHwodS5zaWduYXR1cmVWZXJzaW9uPSJ2NCIpO3ZhciBsPSJiZWFyZXIiPT09KGUuYXBpJiZlLmFwaS5zaWduYXR1cmVWZXJzaW9uKTtyZXR1cm4gdm9pZCBpKGUsT2JqZWN0LmFzc2lnbih7fSx1LHtzaWduYXR1cmVWZXJzaW9uOmw/ImJlYXJlciI6dS5zaWduYXR1cmVWZXJzaW9ufSkpfX19fSxnZXRFbmRwb2ludFN1ZmZpeDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9eyJeKHVzfGV1fGFwfHNhfGNhfG1lKVxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJeY25cXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tLmNuIiwiXnVzXFwtZ292XFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbSIsIl51c1xcLWlzb1xcLVxcdytcXC1cXGQrJCI6ImMycy5pYy5nb3YiLCJedXNcXC1pc29iXFwtXFx3K1xcLVxcZCskIjoic2Mycy5zZ292LmdvdiJ9LG49T2JqZWN0LmtleXModCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1SZWdFeHAobltyXSksaT10W25bcl1dO2lmKG8udGVzdChlKSlyZXR1cm4gaX1yZXR1cm4iYW1hem9uYXdzLmNvbSJ9fX0seyIuL3JlZ2lvbl9jb25maWdfZGF0YS5qc29uIjo1NywiLi91dGlsIjo3NH1dLDU3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtydWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSwidXMtaXNvLSovKiI6InVzSXNvIiwidXMtaXNvYi0qLyoiOiJ1c0lzb2IiLCIqL2J1ZGdldHMiOiJnbG9iYWxTU0wiLCIqL2Nsb3VkZnJvbnQiOiJnbG9iYWxTU0wiLCIqL3N0cyI6Imdsb2JhbFNTTCIsIiovaW1wb3J0ZXhwb3J0Ijp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiIsZ2xvYmFsRW5kcG9pbnQ6ITB9LCIqL3JvdXRlNTMiOiJnbG9iYWxTU0wiLCJjbi0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20uY24iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246ImNuLW5vcnRod2VzdC0xIn0sInVzLWdvdi0qL3JvdXRlNTMiOiJnbG9iYWxHb3ZDbG91ZCIsInVzLWlzby0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LmMycy5pYy5nb3YiLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWlzby1lYXN0LTEifSwidXMtaXNvYi0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LnNjMnMuc2dvdi5nb3YiLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWlzb2ItZWFzdC0xIn0sIiovd2FmIjoiZ2xvYmFsU1NMIiwiKi9pYW0iOiJnbG9iYWxTU0wiLCJjbi0qL2lhbSI6e2VuZHBvaW50OiJ7c2VydmljZX0uY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aC0xIn0sInVzLWlzby0qL2lhbSI6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtaXNvLWVhc3QtMS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWdvdi0qL2lhbSI6Imdsb2JhbEdvdkNsb3VkIiwiKi9jZSI6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtZWFzdC0xLmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWVhc3QtMSJ9LCJjbi0qL2NlIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jbi1ub3J0aHdlc3QtMS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9zdHMiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwidXMtZ292LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy13ZXN0LTIvczMiOiJzM3NpZ25hdHVyZSIsImV1LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwiYXAtc291dGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJhcC1ub3J0aGVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwic2EtZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy1lYXN0LTEvczMiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sInVzLWVhc3QtMS9zZGIiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIn0sIiovc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2tlbmRyYS1yYW5raW5nIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9pbnRlcm5ldG1vbml0b3IiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2NvZGVjYXRhbHlzdCI6Imdsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGZpcHNSdWxlczp7IiovKiI6ImZpcHNTdGFuZGFyZCIsInVzLWdvdi0qLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1pc28tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmMycy5pYy5nb3YifSwidXMtaXNvLSovZG1zIjoidXNJc28iLCJ1cy1pc29iLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sInVzLWlzb2ItKi9kbXMiOiJ1c0lzb2IiLCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LCIqL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCIqL2FwaS5zYWdlbWFrZXIiOiJmaXBzLmFwaS5zYWdlbWFrZXIiLCIqL2JhdGNoIjoiZmlwc0RvdFByZWZpeCIsIiovZWtzIjoiZmlwc0RvdFByZWZpeCIsIiovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsIiovcnVudGltZS5sZXgiOiJmaXBzLnJ1bnRpbWUubGV4IiwiKi9ydW50aW1lLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMuc2FnZW1ha2VyLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiKi9pYW0iOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovcm91dGU1MyI6ImZpcHNXaXRob3V0UmVnaW9uIiwiKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsIiovd2FmIjoiZmlwc1dpdGhvdXRSZWdpb24iLCJ1cy1nb3YtKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsInVzLWdvdi0qL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCJ1cy1nb3YtKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwidXMtZ292LSovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsInVzLWdvdi0qL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsInVzLWdvdi0qL2FjbS1wY2EiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovYmF0Y2giOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY2xvdWRmb3JtYXRpb24iOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY29uZmlnIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VrcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9lbGFzdGljbWFwcmVkdWNlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2lkZW50aXR5c3RvcmUiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZHluYW1vZGIiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY2xvYWRiYWxhbmNpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZ3VhcmRkdXR5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL21vbml0b3JpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovcmVzb3VyY2UtZ3JvdXBzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3J1bnRpbWUuc2FnZW1ha2VyIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VjYXRhbG9nLWFwcHJlZ2lzdHJ5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VxdW90YXMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3NtIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3N0cyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdXBwb3J0IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi13ZXN0LTEvc3RhdGVzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWlzby1lYXN0LTEvZWxhc3RpY2ZpbGVzeXN0ZW0iOntlbmRwb2ludDoiZWxhc3RpY2ZpbGVzeXN0ZW0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWdvdi13ZXN0LTEvb3JnYW5pemF0aW9ucyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3JvdXRlNTMiOntlbmRwb2ludDoicm91dGU1My51cy1nb3YuYW1hem9uYXdzLmNvbSJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJmaXBzRHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0In0sZHVhbHN0YWNrUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYW1hem9ud2Vic2VydmljZXMuY29tLmNuIn0sIiovczMiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3lDbiIsImFwLXNvdXRoLTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwiZXUtd2VzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInNhLWVhc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0yL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLXdlc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIifSxkdWFsc3RhY2tGaXBzUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmF3cyJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMiOiJkdWFsc3RhY2tGaXBzTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tGaXBzTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIn0scGF0dGVybnM6e2dsb2JhbFNTTDp7ZW5kcG9pbnQ6Imh0dHBzOi8ve3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWVhc3QtMSJ9LGdsb2JhbEdvdkNsb3VkOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWdvdi5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1nb3Ytd2VzdC0xIn0sczNzaWduYXR1cmU6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoiczMifSx1c0lzbzp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5jMnMuaWMuZ292In0sdXNJc29iOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LnNjMnMuc2dvdi5nb3YifSxmaXBzU3RhbmRhcmQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc0RvdFByZWZpeDp7ZW5kcG9pbnQ6ImZpcHMue3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aG91dFJlZ2lvbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuZWNyIjp7ZW5kcG9pbnQ6ImVjci1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuc2FnZW1ha2VyIjp7ZW5kcG9pbnQ6ImFwaS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMubW9kZWxzLmxleCI6e2VuZHBvaW50OiJtb2RlbHMtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLnJ1bnRpbWUubGV4Ijp7ZW5kcG9pbnQ6InJ1bnRpbWUtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNXaXRoU2VydmljZU9ubHk6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSxkdWFsc3RhY2tMZWdhY3lFYzI6e2VuZHBvaW50OiJhcGkuZWMyLntyZWdpb259LmF3cyJ9LGR1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sZmlwc0R1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSxnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0uZ2xvYmFsLmFwaS5hd3MifSxmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZ2xvYmFsLmFwaS5hd3MifX19fSx7fV0sNTg6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3N0YXRlX21hY2hpbmUiKSxvPW4udXRpbC5pbmhlcml0LGk9bi51dGlsLmRvbWFpbixzPWUoImptZXNwYXRoIiksYT17c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0sYz1uZXcgcjtjLnNldHVwU3RhdGVzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO24uX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5lbWl0KG4uX2FzbS5jdXJyZW50U3RhdGUsKGZ1bmN0aW9uKGUpe2lmKGUpaWYocj1uLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLHIuX2FzbS5jdXJyZW50U3RhdGUpKXtpZighKGkmJm4uZG9tYWluIGluc3RhbmNlb2YgaS5Eb21haW4pKXRocm93IGU7ZS5kb21haW5FbWl0dGVyPW4sZS5kb21haW49bi5kb21haW4sZS5kb21haW5UaHJvd249ITEsbi5kb21haW4uZW1pdCgiZXJyb3IiLGUpfWVsc2Ugbi5yZXNwb25zZS5lcnJvcj1lLHQoZSk7ZWxzZSB0KG4ucmVzcG9uc2UuZXJyb3IpO3ZhciByfSkpfTt0aGlzLmFkZFN0YXRlKCJ2YWxpZGF0ZSIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyQnVpbGQiLCJzaWduIiwicmVzdGFydCIsZSksdGhpcy5hZGRTdGF0ZSgic2lnbiIsInNlbmQiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmV0cnkiLCJhZnRlclJldHJ5IiwiYWZ0ZXJSZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiYWZ0ZXJSZXRyeSIsInNpZ24iLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgic2VuZCIsInZhbGlkYXRlUmVzcG9uc2UiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgidmFsaWRhdGVSZXNwb25zZSIsImV4dHJhY3REYXRhIiwiZXh0cmFjdEVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RXJyb3IiLCJleHRyYWN0RGF0YSIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RGF0YSIsInN1Y2Nlc3MiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmVzdGFydCIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInN1Y2Nlc3MiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJlcnJvciIsImNvbXBsZXRlIiwiY29tcGxldGUiLGUpLHRoaXMuYWRkU3RhdGUoImNvbXBsZXRlIixudWxsLG51bGwsZSl9LGMuc2V0dXBTdGF0ZXMoKSxuLlJlcXVlc3Q9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG8pe3ZhciBzPWUuZW5kcG9pbnQsYT1lLmNvbmZpZy5yZWdpb24sdT1lLmNvbmZpZy5jdXN0b21Vc2VyQWdlbnQ7ZS5zaWduaW5nUmVnaW9uP2E9ZS5zaWduaW5nUmVnaW9uOmUuaXNHbG9iYWxFbmRwb2ludCYmKGE9InVzLWVhc3QtMSIpLHRoaXMuZG9tYWluPWkmJmkuYWN0aXZlLHRoaXMuc2VydmljZT1lLHRoaXMub3BlcmF0aW9uPXQsdGhpcy5wYXJhbXM9b3x8e30sdGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdChzLGEpLHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQodSksdGhpcy5zdGFydFRpbWU9ZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHRoaXMucmVzcG9uc2U9bmV3IG4uUmVzcG9uc2UodGhpcyksdGhpcy5fYXNtPW5ldyByKGMuc3RhdGVzLCJ2YWxpZGF0ZSIpLHRoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSx0aGlzLmVtaXQ9dGhpcy5lbWl0RXZlbnR9LHNlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJih0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJjYWxsYmFjayIpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7ZS5jYWxsKHQsdC5lcnJvcix0LmRhdGEpfSkpKSx0aGlzLnJ1blRvKCksdGhpcy5yZXNwb25zZX0sYnVpbGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucnVuVG8oInNlbmQiLGUpfSxydW5UbzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9hc20ucnVuVG8oZSx0LHRoaXMpLHRoaXN9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJ2YWxpZGF0ZVJlc3BvbnNlIiksdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3RFcnJvciIpLHRoaXMub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXtlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCBieSB1c2VyIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IiLHJldHJ5YWJsZTohMX0pfSkpLHRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtJiYhdGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uZGlkQ2FsbGJhY2smJih0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbS5hYm9ydCgpLHRoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2s/dGhpcy5odHRwUmVxdWVzdC5fYWJvcnRDYWxsYmFjaygpOnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJzZW5kIikpLHRoaXN9LGVhY2hQYWdlOmZ1bmN0aW9uKGUpe2U9bi51dGlsLmZuLm1ha2VBc3luYyhlLDMpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24gdChyKXtlLmNhbGwocixyLmVycm9yLHIuZGF0YSwoZnVuY3Rpb24obyl7ITEhPT1vJiYoci5oYXNOZXh0UGFnZSgpP3IubmV4dFBhZ2UoKS5vbigiY29tcGxldGUiLHQpLnNlbmQoKTplLmNhbGwocixudWxsLG51bGwsbi51dGlsLmZuLm5vb3ApKX0pKX0pKS5zZW5kKCl9LGVhY2hJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5lYWNoUGFnZSgoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlKHIsbnVsbCk7aWYobnVsbD09PW8pcmV0dXJuIGUobnVsbCxudWxsKTt2YXIgaT10LnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0Lm9wZXJhdGlvbikucmVzdWx0S2V5O0FycmF5LmlzQXJyYXkoaSkmJihpPWlbMF0pO3ZhciBhPXMuc2VhcmNoKG8saSksYz0hMDtyZXR1cm4gbi51dGlsLmFycmF5RWFjaChhLChmdW5jdGlvbih0KXtpZighMT09PShjPWUobnVsbCx0KSkpcmV0dXJuIG4udXRpbC5hYm9ydH0pKSxjfSkpfSxpc1BhZ2VhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0aGlzLm9wZXJhdGlvbil9LGNyZWF0ZVJlYWRTdHJlYW06ZnVuY3Rpb24oKXt2YXIgZT1uLnV0aWwuc3RyZWFtLHI9dGhpcyxvPW51bGw7cmV0dXJuIDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/KG89bmV3IGUuUGFzc1Rocm91Z2gsdC5uZXh0VGljaygoZnVuY3Rpb24oKXtyLnNlbmQoKX0pKSk6KChvPW5ldyBlLlN0cmVhbSkucmVhZGFibGU9ITAsby5zZW50PSExLG8ub24oIm5ld0xpc3RlbmVyIiwoZnVuY3Rpb24oZSl7by5zZW50fHwiZGF0YSIhPT1lfHwoby5zZW50PSEwLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpfSkpKSx0aGlzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZXJyb3IiLGUpfSkpLHRoaXMub24oImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24odCxpLHMpe2lmKHQ8MzAwKXtyLnJlbW92ZUxpc3RlbmVyKCJodHRwRGF0YSIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfREFUQSksci5yZW1vdmVMaXN0ZW5lcigiaHR0cEVycm9yIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuSFRUUF9FUlJPUiksci5vbigiaHR0cEVycm9yIiwoZnVuY3Rpb24oZSl7cy5lcnJvcj1lLHMuZXJyb3IucmV0cnlhYmxlPSExfSkpO3ZhciBhLGM9ITE7aWYoIkhFQUQiIT09ci5odHRwUmVxdWVzdC5tZXRob2QmJihhPXBhcnNlSW50KGlbImNvbnRlbnQtbGVuZ3RoIl0sMTApKSx2b2lkIDAhPT1hJiYhaXNOYU4oYSkmJmE+PTApe2M9ITA7dmFyIHU9MH12YXIgbD1mdW5jdGlvbigpe2MmJnUhPT1hP28uZW1pdCgiZXJyb3IiLG4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlN0cmVhbSBjb250ZW50IGxlbmd0aCBtaXNtYXRjaC4gUmVjZWl2ZWQgIit1KyIgb2YgIithKyIgYnl0ZXMuIikse2NvZGU6IlN0cmVhbUNvbnRlbnRMZW5ndGhNaXNtYXRjaCJ9KSk6Mj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9vLmVuZCgpOm8uZW1pdCgiZW5kIil9LHA9cy5odHRwUmVzcG9uc2UuY3JlYXRlVW5idWZmZXJlZFN0cmVhbSgpO2lmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24paWYoYyl7dmFyIGQ9bmV3IGUuUGFzc1Rocm91Z2g7ZC5fd3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoJiYodSs9dC5sZW5ndGgpLGUuUGFzc1Rocm91Z2gucHJvdG90eXBlLl93cml0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQub24oImVuZCIsbCksby5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtjPSExLHAudW5waXBlKGQpLGQuZW1pdCgiZW5kIiksZC5lbmQoKX0pKSxwLnBpcGUoZCkucGlwZShvLHtlbmQ6ITF9KX1lbHNlIHAucGlwZShvKTtlbHNlIGMmJnAub24oImRhdGEiLChmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmKHUrPWUubGVuZ3RoKX0pKSxwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by5lbWl0KCJkYXRhIixlKX0pKSxwLm9uKCJlbmQiLGwpO3Aub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxvLmVtaXQoImVycm9yIixlKX0pKX19KSksb30sZW1pdEV2ZW50OmZ1bmN0aW9uKGUsdCxyKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCx0PW51bGwpLHJ8fChyPWZ1bmN0aW9uKCl7fSksdHx8KHQ9dGhpcy5ldmVudFBhcmFtZXRlcnMoZSx0aGlzLnJlc3BvbnNlKSksbi5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmVtaXQuY2FsbCh0aGlzLGUsdCwoZnVuY3Rpb24oZSl7ZSYmKHRoaXMucmVzcG9uc2UuZXJyb3I9ZSksci5jYWxsKHRoaXMsZSl9KSl9LGV2ZW50UGFyYW1ldGVyczpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJyZXN0YXJ0IjpjYXNlInZhbGlkYXRlIjpjYXNlInNpZ24iOmNhc2UiYnVpbGQiOmNhc2UiYWZ0ZXJWYWxpZGF0ZSI6Y2FzZSJhZnRlckJ1aWxkIjpyZXR1cm5bdGhpc107Y2FzZSJlcnJvciI6cmV0dXJuW3RoaXMucmVzcG9uc2UuZXJyb3IsdGhpcy5yZXNwb25zZV07ZGVmYXVsdDpyZXR1cm5bdGhpcy5yZXNwb25zZV19fSxwcmVzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCJmdW5jdGlvbiIhPXR5cGVvZiBlfHwodD1lLGU9bnVsbCksKG5ldyBuLlNpZ25lcnMuUHJlc2lnbikuc2lnbih0aGlzLnRvR2V0KCksZSx0KX0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuaHR0cFJlcXVlc3QuaGVhZGVycywicHJlc2lnbmVkLWV4cGlyZXMiKX0sdG9VbmF1dGhlbnRpY2F0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkPSEwLHRoaXMucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfQ1JFREVOVElBTFMpLHRoaXMucmVtb3ZlTGlzdGVuZXIoInNpZ24iLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5TSUdOKSx0aGlzfSx0b0dldDpmdW5jdGlvbigpe3JldHVybiJxdWVyeSIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sJiYiZWMyIiE9PXRoaXMuc2VydmljZS5hcGkucHJvdG9jb2x8fCh0aGlzLnJlbW92ZUxpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSx0aGlzLmFkZExpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSksdGhpc30sYnVpbGRBc0dldDpmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD0iR0VUIixlLmh0dHBSZXF1ZXN0LnBhdGg9ZS5zZXJ2aWNlLmVuZHBvaW50LnBhdGgrIj8iK2UuaHR0cFJlcXVlc3QuYm9keSxlLmh0dHBSZXF1ZXN0LmJvZHk9IiIsZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXX0saGFsdEhhbmRsZXJzT25FcnJvcjpmdW5jdGlvbigpe3RoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITB9fSksbi5SZXF1ZXN0LmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgicHJvbWlzZSIpLG5ldyBlKChmdW5jdGlvbihlLG4pe3Qub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dC5lcnJvcj9uKHQuZXJyb3IpOmUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZGF0YXx8e30sIiRyZXNwb25zZSIse3ZhbHVlOnR9KSl9KSksdC5ydW5UbygpfSkpfX0sbi5SZXF1ZXN0LmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLnByb21pc2V9LG4udXRpbC5hZGRQcm9taXNlcyhuLlJlcXVlc3QpLG4udXRpbC5taXhpbihuLlJlcXVlc3Qsbi5TZXF1ZW50aWFsRXhlY3V0b3IpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3N0YXRlX21hY2hpbmUiOjczLF9wcm9jZXNzOjkxLGptZXNwYXRoOjkwfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9ZSgiam1lc3BhdGgiKTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyLG49dC5jb25maWcuYWNjZXB0b3JzLHI9ITEsbz0icmV0cnkiO24uZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXIpe3ZhciBpPXQubWF0Y2hlcnNbbi5tYXRjaGVyXTtpJiZpKGUsbi5leHBlY3RlZCxuLmFyZ3VtZW50KSYmKHI9ITAsbz1uLnN0YXRlKX19KSksIXImJmUuZXJyb3ImJihvPSJmYWlsdXJlIiksInN1Y2Nlc3MiPT09bz90LnNldFN1Y2Nlc3MoZSk6dC5zZXRFcnJvcihlLCJyZXRyeSI9PT1vKX1yLlJlc291cmNlV2FpdGVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXJ2aWNlPWUsdGhpcy5zdGF0ZT10LHRoaXMubG9hZFdhaXRlckNvbmZpZyh0aGlzLnN0YXRlKX0sc2VydmljZTpudWxsLHN0YXRlOm51bGwsY29uZmlnOm51bGwsbWF0Y2hlcnM6e3BhdGg6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIGkuc3RyaWN0RGVlcEVxdWFsKHIsdCl9LHBhdGhBbGw6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9QXJyYXkuaXNBcnJheShyKXx8KHI9W3JdKTt2YXIgbz1yLmxlbmd0aDtpZighbylyZXR1cm4hMTtmb3IodmFyIHM9MDtzPG87cysrKWlmKCFpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiExO3JldHVybiEwfSxwYXRoQW55OmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7Zm9yKHZhciBvPXIubGVuZ3RoLHM9MDtzPG87cysrKWlmKGkuc3RyaWN0RGVlcEVxdWFsKHJbc10sdCkpcmV0dXJuITA7cmV0dXJuITF9LHN0YXR1czpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZuPT09dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJmUuZXJyb3I/dD09PWUuZXJyb3IuY29kZTp0PT09ISFlLmVycm9yfX0sbGlzdGVuZXJzOihuZXcgci5TZXF1ZW50aWFsRXhlY3V0b3IpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJSRVRSWV9DSEVDSyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0Ll93YWl0ZXI7ZS5lcnJvciYmIlJlc291cmNlTm90UmVhZHkiPT09ZS5lcnJvci5jb2RlJiYoZS5lcnJvci5yZXRyeURlbGF5PTFlMyoodC5jb25maWcuZGVsYXl8fDApKX0pKSxlKCJDSEVDS19PVVRQVVQiLCJleHRyYWN0RGF0YSIscyksZSgiQ0hFQ0tfRVJST1IiLCJleHRyYWN0RXJyb3IiLHMpfSkpLHdhaXQ6ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZSYmZS4kd2FpdGVyJiYoIm51bWJlciI9PXR5cGVvZihlPXIudXRpbC5jb3B5KGUpKS4kd2FpdGVyLmRlbGF5JiYodGhpcy5jb25maWcuZGVsYXk9ZS4kd2FpdGVyLmRlbGF5KSwibnVtYmVyIj09dHlwZW9mIGUuJHdhaXRlci5tYXhBdHRlbXB0cyYmKHRoaXMuY29uZmlnLm1heEF0dGVtcHRzPWUuJHdhaXRlci5tYXhBdHRlbXB0cyksZGVsZXRlIGUuJHdhaXRlcik7dmFyIG49dGhpcy5zZXJ2aWNlLm1ha2VSZXF1ZXN0KHRoaXMuY29uZmlnLm9wZXJhdGlvbixlKTtyZXR1cm4gbi5fd2FpdGVyPXRoaXMsbi5yZXNwb25zZS5tYXhSZXRyaWVzPXRoaXMuY29uZmlnLm1heEF0dGVtcHRzLG4uYWRkTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKSx0JiZuLnNlbmQodCksbn0sc2V0U3VjY2VzczpmdW5jdGlvbihlKXtlLmVycm9yPW51bGwsZS5kYXRhPWUuZGF0YXx8e30sZS5yZXF1ZXN0LnJlbW92ZUFsbExpc3RlbmVycygiZXh0cmFjdERhdGEiKX0sc2V0RXJyb3I6ZnVuY3Rpb24oZSx0KXtlLmRhdGE9bnVsbCxlLmVycm9yPXIudXRpbC5lcnJvcihlLmVycm9yfHxuZXcgRXJyb3Ise2NvZGU6IlJlc291cmNlTm90UmVhZHkiLG1lc3NhZ2U6IlJlc291cmNlIGlzIG5vdCBpbiB0aGUgc3RhdGUgIit0aGlzLnN0YXRlLHJldHJ5YWJsZTp0fSl9LGxvYWRXYWl0ZXJDb25maWc6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiU3RhdGVOb3RGb3VuZEVycm9yIixtZXNzYWdlOiJTdGF0ZSAiK2UrIiBub3QgZm91bmQuIn0pO3RoaXMuY29uZmlnPXIudXRpbC5jb3B5KHRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MH1dLDYwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ci5SZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLmVycm9yPW51bGwsdGhpcy5yZXRyeUNvdW50PTAsdGhpcy5yZWRpcmVjdENvdW50PTAsdGhpcy5odHRwUmVzcG9uc2U9bmV3IHIuSHR0cFJlc3BvbnNlLGUmJih0aGlzLm1heFJldHJpZXM9ZS5zZXJ2aWNlLm51bVJldHJpZXMoKSx0aGlzLm1heFJlZGlyZWN0cz1lLnNlcnZpY2UuY29uZmlnLm1heFJlZGlyZWN0cyl9LG5leHRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5yZXF1ZXN0LnNlcnZpY2Usbz10aGlzLnJlcXVlc3Qub3BlcmF0aW9uO3RyeXt0PW4ucGFnaW5hdGlvbkNvbmZpZyhvLCEwKX1jYXRjaChlKXt0aGlzLmVycm9yPWV9aWYoIXRoaXMuaGFzTmV4dFBhZ2UoKSl7aWYoZSllKHRoaXMuZXJyb3IsbnVsbCk7ZWxzZSBpZih0aGlzLmVycm9yKXRocm93IHRoaXMuZXJyb3I7cmV0dXJuIG51bGx9dmFyIGk9ci51dGlsLmNvcHkodGhpcy5yZXF1ZXN0LnBhcmFtcyk7aWYodGhpcy5uZXh0UGFnZVRva2Vucyl7dmFyIHM9dC5pbnB1dFRva2VuOyJzdHJpbmciPT10eXBlb2YgcyYmKHM9W3NdKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylpW3NbYV1dPXRoaXMubmV4dFBhZ2VUb2tlbnNbYV07cmV0dXJuIG4ubWFrZVJlcXVlc3QodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbixpLGUpfXJldHVybiBlP2UobnVsbCxudWxsKTpudWxsfSxoYXNOZXh0UGFnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlTmV4dFBhZ2VUb2tlbnMoKSwhIXRoaXMubmV4dFBhZ2VUb2tlbnN8fHZvaWQgMD09PXRoaXMubmV4dFBhZ2VUb2tlbnMmJnZvaWQgMH0sY2FjaGVOZXh0UGFnZVRva2VuczpmdW5jdGlvbigpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJuZXh0UGFnZVRva2VucyIpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3RoaXMubmV4dFBhZ2VUb2tlbnM9dm9pZCAwO3ZhciBlPXRoaXMucmVxdWVzdC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbik7aWYoIWUpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7aWYodGhpcy5uZXh0UGFnZVRva2Vucz1udWxsLGUubW9yZVJlc3VsdHMmJiFpLnNlYXJjaCh0aGlzLmRhdGEsZS5tb3JlUmVzdWx0cykpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7dmFyIHQ9ZS5vdXRwdXRUb2tlbjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsdCwoZnVuY3Rpb24oZSl7dmFyIHQ9aS5zZWFyY2godGhpcy5kYXRhLGUpO3QmJih0aGlzLm5leHRQYWdlVG9rZW5zPXRoaXMubmV4dFBhZ2VUb2tlbnN8fFtdLHRoaXMubmV4dFBhZ2VUb2tlbnMucHVzaCh0KSl9KSksdGhpcy5uZXh0UGFnZVRva2Vuc319KX0seyIuL2NvcmUiOjE5LGptZXNwYXRoOjkwfV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlNlcXVlbnRpYWxFeGVjdXRvcj1yLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9ldmVudHM9e319LGxpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP3RoaXMuX2V2ZW50c1tlXS5zbGljZSgwKTpbXX0sb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9ldmVudHNbZV0/bj90aGlzLl9ldmVudHNbZV0udW5zaGlmdCh0KTp0aGlzLl9ldmVudHNbZV0ucHVzaCh0KTp0aGlzLl9ldmVudHNbZV09W3RdLHRoaXN9LG9uQXN5bmM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0Ll9pc0FzeW5jPSEwLHRoaXMub24oZSx0LG4pfSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2V2ZW50c1tlXTtpZihuKXtmb3IodmFyIHI9bi5sZW5ndGgsbz0tMSxpPTA7aTxyOysraSluW2ldPT09dCYmKG89aSk7bz4tMSYmbi5zcGxpY2UobywxKX1yZXR1cm4gdGhpc30scmVtb3ZlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3JldHVybiBlP2RlbGV0ZSB0aGlzLl9ldmVudHNbZV06dGhpcy5fZXZlbnRzPXt9LHRoaXN9LGVtaXQ6ZnVuY3Rpb24oZSx0LG4pe258fChuPWZ1bmN0aW9uKCl7fSk7dmFyIHI9dGhpcy5saXN0ZW5lcnMoZSksbz1yLmxlbmd0aDtyZXR1cm4gdGhpcy5jYWxsTGlzdGVuZXJzKHIsdCxuKSxvPjB9LGNhbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9dGhpcyxzPW98fG51bGw7ZnVuY3Rpb24gYShvKXtpZihvJiYocz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLG8pLGkuX2hhbHRIYW5kbGVyc09uRXJyb3IpKXJldHVybiBuLmNhbGwoaSxzKTtpLmNhbGxMaXN0ZW5lcnMoZSx0LG4scyl9Zm9yKDtlLmxlbmd0aD4wOyl7dmFyIGM9ZS5zaGlmdCgpO2lmKGMuX2lzQXN5bmMpcmV0dXJuIHZvaWQgYy5hcHBseShpLHQuY29uY2F0KFthXSkpO3RyeXtjLmFwcGx5KGksdCl9Y2F0Y2goZSl7cz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLGUpfWlmKHMmJmkuX2hhbHRIYW5kbGVyc09uRXJyb3IpcmV0dXJuIHZvaWQgbi5jYWxsKGkscyl9bi5jYWxsKGkscyl9LGFkZExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlLl9ldmVudHMmJihlPWUuX2V2ZW50cyksci51dGlsLmVhY2goZSwoZnVuY3Rpb24oZSxuKXsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49W25dKSxyLnV0aWwuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKG4pe3Qub24oZSxuKX0pKX0pKSx0fSxhZGROYW1lZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzW2VdPW4sdGhpcy5hZGRMaXN0ZW5lcih0LG4sciksdGhpc30sYWRkTmFtZWRBc3luY0xpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuLl9pc0FzeW5jPSEwLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcihlLHQsbixyKX0sYWRkTmFtZWRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgoZnVuY3Rpb24oKXt0LmFkZE5hbWVkTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSksKGZ1bmN0aW9uKCl7dC5hZGROYW1lZEFzeW5jTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSkpLHRoaXN9fSksci5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmFkZExpc3RlbmVyPXIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5vbix0LmV4cG9ydHM9ci5TZXF1ZW50aWFsRXhlY3V0b3J9LHsiLi9jb3JlIjoxOX1dLDYyOltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi9tb2RlbC9hcGkiKSxpPWUoIi4vcmVnaW9uX2NvbmZpZyIpLHM9ci51dGlsLmluaGVyaXQsYT0wLGM9ZSgiLi9yZWdpb24vdXRpbHMiKTtyLlNlcnZpY2U9cyh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7aWYoIXRoaXMubG9hZFNlcnZpY2VDbGFzcyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLCJTZXJ2aWNlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBgbmV3JyBvcGVyYXRvciIpO2lmKGUpe2lmKGUucmVnaW9uKXt2YXIgdD1lLnJlZ2lvbjtjLmlzRmlwc1JlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSxlLnVzZUZpcHNFbmRwb2ludD0hMCksYy5pc0dsb2JhbFJlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSl9ImJvb2xlYW4iPT10eXBlb2YgZS51c2VEdWFsc3RhY2smJiJib29sZWFuIiE9dHlwZW9mIGUudXNlRHVhbHN0YWNrRW5kcG9pbnQmJihlLnVzZUR1YWxzdGFja0VuZHBvaW50PWUudXNlRHVhbHN0YWNrKX12YXIgbj10aGlzLmxvYWRTZXJ2aWNlQ2xhc3MoZXx8e30pO2lmKG4pe3ZhciBvPXIudXRpbC5jb3B5KGUpLGk9bmV3IG4oZSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJfb3JpZ2luYWxDb25maWciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxpLl9jbGllbnRJZD0rK2EsaX10aGlzLmluaXRpYWxpemUoZSl9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7dmFyIHQ9ci5jb25maWdbdGhpcy5zZXJ2aWNlSWRlbnRpZmllcl07aWYodGhpcy5jb25maWc9bmV3IHIuQ29uZmlnKHIuY29uZmlnKSx0JiZ0aGlzLmNvbmZpZy51cGRhdGUodCwhMCksZSYmdGhpcy5jb25maWcudXBkYXRlKGUsITApLHRoaXMudmFsaWRhdGVTZXJ2aWNlKCksdGhpcy5jb25maWcuZW5kcG9pbnR8fGkuY29uZmlndXJlRW5kcG9pbnQodGhpcyksdGhpcy5jb25maWcuZW5kcG9pbnQ9dGhpcy5lbmRwb2ludEZyb21UZW1wbGF0ZSh0aGlzLmNvbmZpZy5lbmRwb2ludCksdGhpcy5zZXRFbmRwb2ludCh0aGlzLmNvbmZpZy5lbmRwb2ludCksci5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnModGhpcyksKHRoaXMuY29uZmlnLmNsaWVudFNpZGVNb25pdG9yaW5nfHxyLlNlcnZpY2UuX2NsaWVudFNpZGVNb25pdG9yaW5nKSYmdGhpcy5wdWJsaXNoZXIpe3ZhciBvPXRoaXMucHVibGlzaGVyO3RoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQ0FMTCIsImFwaUNhbGwiLChmdW5jdGlvbihlKXtuLm5leHRUaWNrKChmdW5jdGlvbigpe28uZXZlbnRIYW5kbGVyKGUpfSkpfSkpLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQVRURU1QVCIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKX19LHZhbGlkYXRlU2VydmljZTpmdW5jdGlvbigpe30sbG9hZFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXt2YXIgdD1lO2lmKHIudXRpbC5pc0VtcHR5KHRoaXMuYXBpKSl7aWYodC5hcGlDb25maWcpcmV0dXJuIHIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsdC5hcGlDb25maWcpO2lmKHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMpeyh0PW5ldyByLkNvbmZpZyhyLmNvbmZpZykpLnVwZGF0ZShlLCEwKTt2YXIgbj10LmFwaVZlcnNpb25zW3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXJdO3JldHVybiBuPW58fHQuYXBpVmVyc2lvbix0aGlzLmdldExhdGVzdFNlcnZpY2VDbGFzcyhuKX1yZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sZ2V0TGF0ZXN0U2VydmljZUNsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMuZ2V0TGF0ZXN0U2VydmljZVZlcnNpb24oZSksbnVsbD09PXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV0mJnIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsZSksdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc1tlXX0sZ2V0TGF0ZXN0U2VydmljZVZlcnNpb246ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXN8fDA9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNlcnZpY2VzIGRlZmluZWQgb24gIit0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyKTtpZihlP3IudXRpbC5pc1R5cGUoZSxEYXRlKSYmKGU9ci51dGlsLmRhdGUuaXNvODYwMShlKS5zcGxpdCgiVCIpWzBdKTplPSJsYXRlc3QiLE9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLGUpKXJldHVybiBlO2Zvcih2YXIgdD1PYmplY3Qua2V5cyh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKS5zb3J0KCksbj1udWxsLG89dC5sZW5ndGgtMTtvPj0wO28tLSlpZigiKiIhPT10W29dW3Rbb10ubGVuZ3RoLTFdJiYobj10W29dKSx0W29dLnN1YnN0cigwLDEwKTw9ZSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcisiIEFQSSB0byBzYXRpc2Z5IHZlcnNpb24gY29uc3RyYWludCBgIitlKyInIil9LGFwaTp7fSxkZWZhdWx0UmV0cnlDb3VudDozLGN1c3RvbWl6ZVJlcXVlc3RzOmZ1bmN0aW9uKGUpe2lmKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjYWxsYmFjayB0eXBlICciK3R5cGVvZiBlKyInIHByb3ZpZGVkIGluIGN1c3RvbWl6ZVJlcXVlc3RzIik7dGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1lfWVsc2UgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1udWxsfSxtYWtlUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD1udWxsKSx0PXR8fHt9LHRoaXMuY29uZmlnLnBhcmFtcyl7dmFyIG89dGhpcy5hcGkub3BlcmF0aW9uc1tlXTtvJiYodD1yLnV0aWwuY29weSh0KSxyLnV0aWwuZWFjaCh0aGlzLmNvbmZpZy5wYXJhbXMsKGZ1bmN0aW9uKGUsbil7by5pbnB1dC5tZW1iZXJzW2VdJiYodm9pZCAwIT09dFtlXSYmbnVsbCE9PXRbZV18fCh0W2VdPW4pKX0pKSl9dmFyIGk9bmV3IHIuUmVxdWVzdCh0aGlzLGUsdCk7cmV0dXJuIHRoaXMuYWRkQWxsUmVxdWVzdExpc3RlbmVycyhpKSx0aGlzLmF0dGFjaE1vbml0b3JpbmdFbWl0dGVyKGkpLG4mJmkuc2VuZChuKSxpfSxtYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD17fSk7dmFyIHI9dGhpcy5tYWtlUmVxdWVzdChlLHQpLnRvVW5hdXRoZW50aWNhdGVkKCk7cmV0dXJuIG4/ci5zZW5kKG4pOnJ9LHdhaXRGb3I6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuZXcgci5SZXNvdXJjZVdhaXRlcih0aGlzLGUpLndhaXQodCxuKX0sYWRkQWxsUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W3IuZXZlbnRzLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZSx0aGlzLnNlcnZpY2VJbnRlcmZhY2UoKSxyLkV2ZW50TGlzdGVuZXJzLkNvcmVQb3N0XSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXSYmZS5hZGRMaXN0ZW5lcnModFtuXSk7dGhpcy5jb25maWcucGFyYW1WYWxpZGF0aW9ufHxlLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHRoaXMuY29uZmlnLmxvZ2dlciYmZS5hZGRMaXN0ZW5lcnMoci5FdmVudExpc3RlbmVycy5Mb2dnZXIpLHRoaXMuc2V0dXBSZXF1ZXN0TGlzdGVuZXJzKGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXIoZSksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsImN1c3RvbVJlcXVlc3RIYW5kbGVyIikmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyJiZ0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpfSxhcGlDYWxsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXtUeXBlOiJBcGlDYWxsIixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsUmVnaW9uOmUuaHR0cFJlcXVlc3QucmVnaW9uLE1heFJldHJpZXNFeGNlZWRlZDowLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7aWYoci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uRmluYWxIdHRwU3RhdHVzQ29kZT1yLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSxyLmVycm9yKXt2YXIgbz1yLmVycm9yO3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhvLmNvZGUmJihuLkZpbmFsQXdzRXhjZXB0aW9uPW8uY29kZSksby5tZXNzYWdlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSk6KChvLmNvZGV8fG8ubmFtZSkmJihuLkZpbmFsU2RrRXhjZXB0aW9uPW8uY29kZXx8by5uYW1lKSxvLm1lc3NhZ2UmJihuLkZpbmFsU2RrRXhjZXB0aW9uTWVzc2FnZT1vLm1lc3NhZ2UpKX1yZXR1cm4gbn0sYXBpQXR0ZW1wdEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbEF0dGVtcHQiLEFwaTp0P3QubmFtZTplLm9wZXJhdGlvbixWZXJzaW9uOjEsU2VydmljZTplLnNlcnZpY2UuYXBpLnNlcnZpY2VJZHx8ZS5zZXJ2aWNlLmFwaS5lbmRwb2ludFByZWZpeCxGcWRuOmUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUsVXNlckFnZW50OmUuaHR0cFJlcXVlc3QuZ2V0VXNlckFnZW50KCl9LHI9ZS5yZXNwb25zZTtyZXR1cm4gci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksIWUuX3VuQXV0aGVudGljYXRlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscyYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKG4uQWNjZXNzS2V5PWUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnM/KGUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSYmKG4uU2Vzc2lvblRva2VuPWUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSksci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdJiYobi5YQW16blJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LXJlcXVlc3QtaWQiXSYmKG4uWEFtelJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LWlkLTIiXSYmKG4uWEFteklkMj1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0pLG4pOm59LGF0dGVtcHRGYWlsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hcGlBdHRlbXB0RXZlbnQoZSksbj1lLnJlc3BvbnNlLHI9bi5lcnJvcjtyZXR1cm4gbi5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT4yOTk/KHIuY29kZSYmKHQuQXdzRXhjZXB0aW9uPXIuY29kZSksci5tZXNzYWdlJiYodC5Bd3NFeGNlcHRpb25NZXNzYWdlPXIubWVzc2FnZSkpOigoci5jb2RlfHxyLm5hbWUpJiYodC5TZGtFeGNlcHRpb249ci5jb2RlfHxyLm5hbWUpLHIubWVzc2FnZSYmKHQuU2RrRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKSx0fSxhdHRhY2hNb25pdG9yaW5nRW1pdHRlcjpmdW5jdGlvbihlKXt2YXIgdCxuLG8saSxzLGEsYz0wLHU9dGhpcztlLm9uKCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKCl7aT1yLnV0aWwucmVhbENsb2NrLm5vdygpLGE9RGF0ZS5ub3coKX0pLCEwKSxlLm9uKCJzaWduIiwoZnVuY3Rpb24oKXtuPXIudXRpbC5yZWFsQ2xvY2subm93KCksdD1EYXRlLm5vdygpLHM9ZS5odHRwUmVxdWVzdC5yZWdpb24sYysrfSksITApLGUub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbigpe289TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVCIsInN1Y2Nlc3MiLChmdW5jdGlvbigpe3ZhciBuPXUuYXBpQXR0ZW1wdEV2ZW50KGUpO24uVGltZXN0YW1wPXQsbi5BdHRlbXB0TGF0ZW5jeT1vPj0wP286MCxuLlJlZ2lvbj1zLHUuZW1pdCgiYXBpQ2FsbEF0dGVtcHQiLFtuXSl9KSksZS5hZGROYW1lZExpc3RlbmVyKCJBUElfQ0FMTF9BVFRFTVBUX1JFVFJZIiwicmV0cnkiLChmdW5jdGlvbigpe3ZhciBpPXUuYXR0ZW1wdEZhaWxFdmVudChlKTtpLlRpbWVzdGFtcD10LG89b3x8TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pLGkuQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsaS5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0IixbaV0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTEwiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dS5hcGlDYWxsRXZlbnQoZSk7aWYodC5BdHRlbXB0Q291bnQ9YywhKHQuQXR0ZW1wdENvdW50PD0wKSl7dC5UaW1lc3RhbXA9YTt2YXIgbj1NYXRoLnJvdW5kKHIudXRpbC5yZWFsQ2xvY2subm93KCktaSk7dC5MYXRlbmN5PW4+PTA/bjowO3ZhciBvPWUucmVzcG9uc2U7by5lcnJvciYmby5lcnJvci5yZXRyeWFibGUmJiJudW1iZXIiPT10eXBlb2Ygby5yZXRyeUNvdW50JiYibnVtYmVyIj09dHlwZW9mIG8ubWF4UmV0cmllcyYmby5yZXRyeUNvdW50Pj1vLm1heFJldHJpZXMmJih0Lk1heFJldHJpZXNFeGNlZWRlZD0xKSx1LmVtaXQoImFwaUNhbGwiLFt0XSl9fSkpfSxzZXR1cFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7fSxnZXRTaWduaW5nTmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwaS5zaWduaW5nTmFtZXx8dGhpcy5hcGkuZW5kcG9pbnRQcmVmaXh9LGdldFNpZ25lckNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnVsbCxvPSIiO3JldHVybiBlJiYobz0obj0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dfHxudWxsKT9uLmF1dGh0eXBlOiIiKSx0PXRoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dGhpcy5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjoidjQiPT09b3x8InY0LXVuc2lnbmVkLWJvZHkiPT09bz8idjQiOiJiZWFyZXIiPT09bz8iYmVhcmVyIjp0aGlzLmFwaS5zaWduYXR1cmVWZXJzaW9uLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb24odCl9LHNlcnZpY2VJbnRlcmZhY2U6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5hcGkucHJvdG9jb2wpe2Nhc2UiZWMyIjpjYXNlInF1ZXJ5IjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5RdWVyeTtjYXNlImpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLkpzb247Y2FzZSJyZXN0LWpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RKc29uO2Nhc2UicmVzdC14bWwiOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RYbWx9aWYodGhpcy5hcGkucHJvdG9jb2wpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNlcnZpY2UgYHByb3RvY29sJyAiK3RoaXMuYXBpLnByb3RvY29sKyIgaW4gQVBJIGNvbmZpZyIpfSxzdWNjZXNzZnVsUmVzcG9uc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU8MzAwfSxudW1SZXRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY29uZmlnLm1heFJldHJpZXM/dGhpcy5jb25maWcubWF4UmV0cmllczp0aGlzLmRlZmF1bHRSZXRyeUNvdW50fSxyZXRyeURlbGF5czpmdW5jdGlvbihlLHQpe3JldHVybiByLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShlLHRoaXMuY29uZmlnLnJldHJ5RGVsYXlPcHRpb25zLHQpfSxyZXRyeWFibGVFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMudGltZW91dEVycm9yKGUpfHwhIXRoaXMubmV0d29ya2luZ0Vycm9yKGUpfHwhIXRoaXMuZXhwaXJlZENyZWRlbnRpYWxzRXJyb3IoZSl8fCEhdGhpcy50aHJvdHRsZWRFcnJvcihlKXx8ZS5zdGF0dXNDb2RlPj01MDB9LG5ldHdvcmtpbmdFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZX0sdGltZW91dEVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlfSxleHBpcmVkQ3JlZGVudGlhbHNFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iRXhwaXJlZFRva2VuRXhjZXB0aW9uIj09PWUuY29kZX0sY2xvY2tTa2V3RXJyb3I6ZnVuY3Rpb24oZSl7c3dpdGNoKGUuY29kZSl7Y2FzZSJSZXF1ZXN0VGltZVRvb1NrZXdlZCI6Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJJbnZhbGlkU2lnbmF0dXJlRXhjZXB0aW9uIjpjYXNlIlNpZ25hdHVyZURvZXNOb3RNYXRjaCI6Y2FzZSJBdXRoRmFpbHVyZSI6Y2FzZSJSZXF1ZXN0SW5UaGVGdXR1cmUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnZXRTa2V3Q29ycmVjdGVkRGF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpK3RoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KX0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYodGhpcy5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS1EYXRlLm5vdygpKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBNYXRoLmFicyh0aGlzLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLWUpPj0zZTV9LHRocm90dGxlZEVycm9yOmZ1bmN0aW9uKGUpe2lmKDQyOT09PWUuc3RhdHVzQ29kZSlyZXR1cm4hMDtzd2l0Y2goZS5jb2RlKXtjYXNlIlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uIjpjYXNlIlRocm90dGxpbmciOmNhc2UiVGhyb3R0bGluZ0V4Y2VwdGlvbiI6Y2FzZSJSZXF1ZXN0TGltaXRFeGNlZWRlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkIjpjYXNlIlJlcXVlc3RUaHJvdHRsZWRFeGNlcHRpb24iOmNhc2UiVG9vTWFueVJlcXVlc3RzRXhjZXB0aW9uIjpjYXNlIlRyYW5zYWN0aW9uSW5Qcm9ncmVzc0V4Y2VwdGlvbiI6Y2FzZSJFQzJUaHJvdHRsZWRFeGNlcHRpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxlbmRwb2ludEZyb21UZW1wbGF0ZTpmdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGU7dmFyIHQ9ZTtyZXR1cm4gdD0odD0odD10LnJlcGxhY2UoL1x7c2VydmljZVx9L2csdGhpcy5hcGkuZW5kcG9pbnRQcmVmaXgpKS5yZXBsYWNlKC9ce3JlZ2lvblx9L2csdGhpcy5jb25maWcucmVnaW9uKSkucmVwbGFjZSgvXHtzY2hlbWVcfS9nLHRoaXMuY29uZmlnLnNzbEVuYWJsZWQ/Imh0dHBzIjoiaHR0cCIpfSxzZXRFbmRwb2ludDpmdW5jdGlvbihlKXt0aGlzLmVuZHBvaW50PW5ldyByLkVuZHBvaW50KGUsdGhpcy5jb25maWcpfSxwYWdpbmF0aW9uQ29uZmlnOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hcGkub3BlcmF0aW9uc1tlXS5wYWdpbmF0b3I7aWYoIW4pe2lmKHQpe3ZhciBvPW5ldyBFcnJvcjt0aHJvdyByLnV0aWwuZXJyb3IobywiTm8gcGFnaW5hdGlvbiBjb25maWd1cmF0aW9uIGZvciAiK2UpfXJldHVybiBudWxsfXJldHVybiBufX0pLHIudXRpbC51cGRhdGUoci5TZXJ2aWNlLHtkZWZpbmVNZXRob2RzOmZ1bmN0aW9uKGUpe3IudXRpbC5lYWNoKGUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zLChmdW5jdGlvbih0KXtlLnByb3RvdHlwZVt0XXx8KCJub25lIj09PWUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zW3RdLmF1dGh0eXBlP2UucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QodCxlLG4pfTplLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHQsZSxuKX0pfSkpfSxkZWZpbmVTZXJ2aWNlOmZ1bmN0aW9uKGUsdCxuKXtyLlNlcnZpY2UuX3NlcnZpY2VNYXBbZV09ITAsQXJyYXkuaXNBcnJheSh0KXx8KG49dCx0PVtdKTt2YXIgbz1zKHIuU2VydmljZSxufHx7fSk7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtyLlNlcnZpY2UuYWRkVmVyc2lvbnMobyx0KTt2YXIgaT1vLnNlcnZpY2VJZGVudGlmaWVyfHxlO28uc2VydmljZUlkZW50aWZpZXI9aX1lbHNlIG8ucHJvdG90eXBlLmFwaT1lLHIuU2VydmljZS5kZWZpbmVNZXRob2RzKG8pO2lmKHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcy5wcm90b3R5cGUpLCF0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXImJnIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZyl7dmFyIGE9ci51dGlsLmNsaWVudFNpZGVNb25pdG9yaW5nLlB1Ymxpc2hlcixjPSgwLHIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5jb25maWdQcm92aWRlcikoKTt0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXI9bmV3IGEoYyksYy5lbmFibGVkJiYoci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZz0hMCl9cmV0dXJuIHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwoby5wcm90b3R5cGUpLHIuU2VydmljZS5hZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVycyhvLnByb3RvdHlwZSksb30sYWRkVmVyc2lvbnM6ZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLGUuc2VydmljZXM9ZS5zZXJ2aWNlc3x8e307Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdm9pZCAwPT09ZS5zZXJ2aWNlc1t0W25dXSYmKGUuc2VydmljZXNbdFtuXV09bnVsbCk7ZS5hcGlWZXJzaW9ucz1PYmplY3Qua2V5cyhlLnNlcnZpY2VzKS5zb3J0KCl9LGRlZmluZVNlcnZpY2VBcGk6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXMoZSx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pO2Z1bmN0aW9uIGEodCl7dC5pc0FwaT9pLnByb3RvdHlwZS5hcGk9dDppLnByb3RvdHlwZS5hcGk9bmV3IG8odCx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pfWlmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYobilhKG4pO2Vsc2UgdHJ5e2Eoci5hcGlMb2FkZXIoZS5zZXJ2aWNlSWRlbnRpZmllcix0KSl9Y2F0Y2gobil7dGhyb3cgci51dGlsLmVycm9yKG4se21lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIEFQSSBjb25maWd1cmF0aW9uICIrZS5zZXJ2aWNlSWRlbnRpZmllcisiLSIrdH0pfU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLnNlcnZpY2VzLHQpfHwoZS5hcGlWZXJzaW9ucz1lLmFwaVZlcnNpb25zLmNvbmNhdCh0KS5zb3J0KCkpLGUuc2VydmljZXNbdF09aX1lbHNlIGEodCk7cmV0dXJuIHIuU2VydmljZS5kZWZpbmVNZXRob2RzKGkpLGl9LGhhc1NlcnZpY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLlNlcnZpY2UuX3NlcnZpY2VNYXAsZSl9LGFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTmFtZWRMaXN0ZW5lcigiTU9OSVRPUl9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbEF0dGVtcHQiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGxBdHRlbXB0IixbdF0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQ0FMTF9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbCIsKGZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtuLl9ldmVudHMmJm4uZW1pdCgiYXBpQ2FsbCIsW3RdKX0pKX0sX3NlcnZpY2VNYXA6e319KSxyLnV0aWwubWl4aW4oci5TZXJ2aWNlLHIuU2VxdWVudGlhbEV4ZWN1dG9yKSx0LmV4cG9ydHM9ci5TZXJ2aWNlfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL21vZGVsL2FwaSI6NDAsIi4vcmVnaW9uL3V0aWxzIjo1NSwiLi9yZWdpb25fY29uZmlnIjo1NixfcHJvY2Vzczo5MX1dLDYzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50Iik7ci51dGlsLnVwZGF0ZShyLlNUUy5wcm90b3R5cGUse2NyZWRlbnRpYWxzRnJvbTpmdW5jdGlvbihlLHQpe3JldHVybiBlPyh0fHwodD1uZXcgci5UZW1wb3JhcnlDcmVkZW50aWFscyksdC5leHBpcmVkPSExLHQuYWNjZXNzS2V5SWQ9ZS5DcmVkZW50aWFscy5BY2Nlc3NLZXlJZCx0LnNlY3JldEFjY2Vzc0tleT1lLkNyZWRlbnRpYWxzLlNlY3JldEFjY2Vzc0tleSx0LnNlc3Npb25Ub2tlbj1lLkNyZWRlbnRpYWxzLlNlc3Npb25Ub2tlbix0LmV4cGlyZVRpbWU9ZS5DcmVkZW50aWFscy5FeHBpcmF0aW9uLHQpOm51bGx9LGFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdCgiYXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eSIsZSx0KX0sYXNzdW1lUm9sZVdpdGhTQU1MOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoU0FNTCIsZSx0KX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTGlzdGVuZXIoInZhbGlkYXRlIix0aGlzLm9wdEluUmVnaW9uYWxFbmRwb2ludCwhMCl9LG9wdEluUmVnaW9uYWxFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmNvbmZpZztpZihuLnN0c1JlZ2lvbmFsRW5kcG9pbnRzPW8odC5fb3JpZ2luYWxDb25maWcse2VudjoiQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFMiLHNoYXJlZENvbmZpZzoic3RzX3JlZ2lvbmFsX2VuZHBvaW50cyIsY2xpZW50Q29uZmlnOiJzdHNSZWdpb25hbEVuZHBvaW50cyJ9KSwicmVnaW9uYWwiPT09bi5zdHNSZWdpb25hbEVuZHBvaW50cyYmdC5pc0dsb2JhbEVuZHBvaW50KXtpZighbi5yZWdpb24pdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6Ik1pc3NpbmcgcmVnaW9uIGluIGNvbmZpZyJ9KTt2YXIgaT1uLmVuZHBvaW50LmluZGV4T2YoIi5hbWF6b25hd3MuY29tIikscz1uLmVuZHBvaW50LnN1YnN0cmluZygwLGkpKyIuIituLnJlZ2lvbituLmVuZHBvaW50LnN1YnN0cmluZyhpKTtlLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KHMpLGUuaHR0cFJlcXVlc3QucmVnaW9uPW4ucmVnaW9ufX19KX0seyIuLi9jb25maWdfcmVnaW9uYWxfZW5kcG9pbnQiOjE4LCIuLi9jb3JlIjoxOX1dLDY0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuU2lnbmVycy5CZWFyZXI9ci51dGlsLmluaGVyaXQoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPSJCZWFyZXIgIitlLnRva2VufX0pfSx7Ii4uL2NvcmUiOjE5fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPSJwcmVzaWduZWQtZXhwaXJlcyI7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV0sbj1lLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk7aWYoZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVXNlci1BZ2VudCJdLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LVVzZXItQWdlbnQiXSxuPT09ci5TaWduZXJzLlY0KXtpZih0PjYwNDgwMCl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJJbnZhbGlkRXhwaXJ5VGltZSIsbWVzc2FnZToiUHJlc2lnbmluZyBkb2VzIG5vdCBzdXBwb3J0IGV4cGlyeSB0aW1lIGdyZWF0ZXIgdGhhbiBhIHdlZWsgd2l0aCBTaWdWNCBzaWduaW5nLiIscmV0cnlhYmxlOiExfSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR9ZWxzZXtpZihuIT09ci5TaWduZXJzLlMzKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlByZXNpZ25pbmcgb25seSBzdXBwb3J0cyBTMyBvciBTaWdWNCBzaWduaW5nLiIsY29kZToiVW5zdXBwb3J0ZWRTaWduZXIiLHJldHJ5YWJsZTohMX0pO3ZhciBvPWUuc2VydmljZT9lLnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKTpyLnV0aWwuZGF0ZS5nZXREYXRlKCk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXBhcnNlSW50KHIudXRpbC5kYXRlLnVuaXhUaW1lc3RhbXAobykrdCwxMCkudG9TdHJpbmcoKX19ZnVuY3Rpb24gYShlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LG49ci51dGlsLnVybFBhcnNlKGUuaHR0cFJlcXVlc3QucGF0aCksbz17fTtuLnNlYXJjaCYmKG89ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2Uobi5zZWFyY2guc3Vic3RyKDEpKSk7dmFyIHM9ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3BsaXQoIiAiKTtpZigiQVdTIj09PXNbMF0pcz1zWzFdLnNwbGl0KCI6Iiksby5TaWduYXR1cmU9cy5wb3AoKSxvLkFXU0FjY2Vzc0tleUlkPXMuam9pbigiOiIpLHIudXRpbC5lYWNoKGUuaHR0cFJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtlPT09aSYmKGU9IkV4cGlyZXMiKSwwPT09ZS5pbmRleE9mKCJ4LWFtei1tZXRhLSIpJiYoZGVsZXRlIG9bZV0sZT1lLnRvTG93ZXJDYXNlKCkpLG9bZV09dH0pKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLGRlbGV0ZSBvLkF1dGhvcml6YXRpb24sZGVsZXRlIG8uSG9zdDtlbHNlIGlmKCJBV1M0LUhNQUMtU0hBMjU2Ij09PXNbMF0pe3Muc2hpZnQoKTt2YXIgYT1zLmpvaW4oIiAiKS5tYXRjaCgvU2lnbmF0dXJlPSguKj8pKD86LHxcc3xccj9cbnwkKS8pWzFdO29bIlgtQW16LVNpZ25hdHVyZSJdPWEsZGVsZXRlIG8uRXhwaXJlc310LnBhdGhuYW1lPW4ucGF0aG5hbWUsdC5zZWFyY2g9ci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9ci5TaWduZXJzLlByZXNpZ249byh7c2lnbjpmdW5jdGlvbihlLHQsbil7aWYoZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR8fDM2MDAsZS5vbigiYnVpbGQiLHMpLGUub24oInNpZ24iLGEpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5TRVRfQ09OVEVOVF9MRU5HVEgpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5DT01QVVRFX1NIQTI1NiksZS5lbWl0KCJiZWZvcmVQcmVzaWduIixbZV0pLCFuKXtpZihlLmJ1aWxkKCksZS5yZXNwb25zZS5lcnJvcil0aHJvdyBlLnJlc3BvbnNlLmVycm9yO3JldHVybiByLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpfWUuYnVpbGQoKGZ1bmN0aW9uKCl7dGhpcy5yZXNwb25zZS5lcnJvcj9uKHRoaXMucmVzcG9uc2UuZXJyb3IpOm4obnVsbCxyLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpKX0pKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlByZXNpZ259LHsiLi4vY29yZSI6MTl9XSw2NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdD1lfSxzZXRTZXJ2aWNlQ2xpZW50SWQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlQ2xpZW50SWQ9ZX0sZ2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VydmljZUNsaWVudElkfX0pLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb249ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UidjIiOnJldHVybiByLlNpZ25lcnMuVjI7Y2FzZSJ2MyI6cmV0dXJuIHIuU2lnbmVycy5WMztjYXNlInMzdjQiOmNhc2UidjQiOnJldHVybiByLlNpZ25lcnMuVjQ7Y2FzZSJzMyI6cmV0dXJuIHIuU2lnbmVycy5TMztjYXNlInYzaHR0cHMiOnJldHVybiByLlNpZ25lcnMuVjNIdHRwcztjYXNlImJlYXJlciI6cmV0dXJuIHIuU2lnbmVycy5CZWFyZXJ9dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHNpZ25pbmcgdmVyc2lvbiAiK2UpfSxlKCIuL3YyIiksZSgiLi92MyIpLGUoIi4vdjNodHRwcyIpLGUoIi4vdjQiKSxlKCIuL3MzIiksZSgiLi9wcmVzaWduIiksZSgiLi9iZWFyZXIiKX0seyIuLi9jb3JlIjoxOSwiLi9iZWFyZXIiOjY0LCIuL3ByZXNpZ24iOjY1LCIuL3MzIjo2NywiLi92MiI6NjgsIi4vdjMiOjY5LCIuL3YzaHR0cHMiOjcwLCIuL3Y0Ijo3MX1dLDY3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlMzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse3N1YlJlc291cmNlczp7YWNsOjEsYWNjZWxlcmF0ZToxLGFuYWx5dGljczoxLGNvcnM6MSxsaWZlY3ljbGU6MSxkZWxldGU6MSxpbnZlbnRvcnk6MSxsb2NhdGlvbjoxLGxvZ2dpbmc6MSxtZXRyaWNzOjEsbm90aWZpY2F0aW9uOjEscGFydE51bWJlcjoxLHBvbGljeToxLHJlcXVlc3RQYXltZW50OjEscmVwbGljYXRpb246MSxyZXN0b3JlOjEsdGFnZ2luZzoxLHRvcnJlbnQ6MSx1cGxvYWRJZDoxLHVwbG9hZHM6MSx2ZXJzaW9uSWQ6MSx2ZXJzaW9uaW5nOjEsdmVyc2lvbnM6MSx3ZWJzaXRlOjF9LHJlc3BvbnNlSGVhZGVyczp7InJlc3BvbnNlLWNvbnRlbnQtdHlwZSI6MSwicmVzcG9uc2UtY29udGVudC1sYW5ndWFnZSI6MSwicmVzcG9uc2UtZXhwaXJlcyI6MSwicmVzcG9uc2UtY2FjaGUtY29udHJvbCI6MSwicmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbiI6MSwicmVzcG9uc2UtY29udGVudC1lbmNvZGluZyI6MX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMucmVxdWVzdC5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1yLnV0aWwuZGF0ZS5yZmM4MjIodCkpLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pO3ZhciBuPXRoaXMuc2lnbihlLnNlY3JldEFjY2Vzc0tleSx0aGlzLnN0cmluZ1RvU2lnbigpKSxvPSJBV1MgIitlLmFjY2Vzc0tleUlkKyI6IituO3RoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249b30sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0LHQ9W107dC5wdXNoKGUubWV0aG9kKSx0LnB1c2goZS5oZWFkZXJzWyJDb250ZW50LU1ENSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1UeXBlIl18fCIiKSx0LnB1c2goZS5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwiIik7dmFyIG49dGhpcy5jYW5vbmljYWxpemVkQW16SGVhZGVycygpO3JldHVybiBuJiZ0LnB1c2gobiksdC5wdXNoKHRoaXMuY2Fub25pY2FsaXplZFJlc291cmNlKCkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsaXplZEFtekhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaCh0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dC5tYXRjaCgvXngtYW16LS9pKSYmZS5wdXNoKHQpfSkpLGUuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPHQudG9Mb3dlckNhc2UoKT8tMToxfSkpO3ZhciB0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxlLChmdW5jdGlvbihlKXt0LnB1c2goZS50b0xvd2VyQ2FzZSgpKyI6IitTdHJpbmcodGhpcy5yZXF1ZXN0LmhlYWRlcnNbZV0pKX0pKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRSZXNvdXJjZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PWUucGF0aC5zcGxpdCgiPyIpLG49dFswXSxvPXRbMV0saT0iIjtpZihlLnZpcnR1YWxIb3N0ZWRCdWNrZXQmJihpKz0iLyIrZS52aXJ0dWFsSG9zdGVkQnVja2V0KSxpKz1uLG8pe3ZhciBzPVtdO3IudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLG8uc3BsaXQoIiYiKSwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiPSIpWzBdLG49ZS5zcGxpdCgiPSIpWzFdO2lmKHRoaXMuc3ViUmVzb3VyY2VzW3RdfHx0aGlzLnJlc3BvbnNlSGVhZGVyc1t0XSl7dmFyIHI9e25hbWU6dH07dm9pZCAwIT09biYmKHRoaXMuc3ViUmVzb3VyY2VzW3RdP3IudmFsdWU9bjpyLnZhbHVlPWRlY29kZVVSSUNvbXBvbmVudChuKSkscy5wdXNoKHIpfX0pKSxzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubmFtZTx0Lm5hbWU/LTE6MX0pKSxzLmxlbmd0aCYmKG89W10sci51dGlsLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXt2b2lkIDA9PT1lLnZhbHVlP28ucHVzaChlLm5hbWUpOm8ucHVzaChlLm5hbWUrIj0iK2UudmFsdWUpfSkpLGkrPSI/IitvLmpvaW4oIiYiKSl9cmV0dXJuIGl9LHNpZ246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUsdCwiYmFzZTY0Iiwic2hhMSIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuUzN9LHsiLi4vY29yZSI6MTl9XSw2ODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMj1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpKTt2YXIgbj10aGlzLnJlcXVlc3Q7bi5wYXJhbXMuVGltZXN0YW1wPXIudXRpbC5kYXRlLmlzbzg2MDEodCksbi5wYXJhbXMuU2lnbmF0dXJlVmVyc2lvbj0iMiIsbi5wYXJhbXMuU2lnbmF0dXJlTWV0aG9kPSJIbWFjU0hBMjU2IixuLnBhcmFtcy5BV1NBY2Nlc3NLZXlJZD1lLmFjY2Vzc0tleUlkLGUuc2Vzc2lvblRva2VuJiYobi5wYXJhbXMuU2VjdXJpdHlUb2tlbj1lLnNlc3Npb25Ub2tlbiksZGVsZXRlIG4ucGFyYW1zLlNpZ25hdHVyZSxuLnBhcmFtcy5TaWduYXR1cmU9dGhpcy5zaWduYXR1cmUoZSksbi5ib2R5PXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxuLmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl09bi5ib2R5Lmxlbmd0aH0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHRoaXMucmVxdWVzdC5lbmRwb2ludC5ob3N0LnRvTG93ZXJDYXNlKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QucGF0aG5hbWUoKSksZS5wdXNoKHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKHRoaXMucmVxdWVzdC5wYXJhbXMpKSxlLmpvaW4oIlxuIil9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WMn0seyIuLi9jb3JlIjoxOX1dLDY5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlYzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2FkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLnV0aWwuZGF0ZS5yZmM4MjIodCk7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1uLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtem4tQXV0aG9yaXphdGlvbiJdPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25lZEhlYWRlcnM9Iit0aGlzLnNpZ25lZEhlYWRlcnMoKSsiLFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKHQpe2UucHVzaCh0LnRvTG93ZXJDYXNlKCkpfSkpLGUuc29ydCgpLmpvaW4oIjsiKX0sY2Fub25pY2FsSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdC5oZWFkZXJzLHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKG4pe3QucHVzaChuLnRvTG93ZXJDYXNlKCkudHJpbSgpKyI6IitTdHJpbmcoZVtuXSkudHJpbSgpKX0pKSx0LnNvcnQoKS5qb2luKCJcbiIpKyJcbiJ9LGhlYWRlcnNUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpeygiSG9zdCI9PT10fHwiQ29udGVudC1FbmNvZGluZyI9PT10fHx0Lm1hdGNoKC9eWC1BbXovaSkpJiZlLnB1c2godCl9KSksZX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKCIvIiksZS5wdXNoKCIiKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QuYm9keSksci51dGlsLmNyeXB0by5zaGEyNTYoZS5qb2luKCJcbiIpKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzfSx7Ii4uL2NvcmUiOjE5fV0sNzA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtlKCIuL3YzIiksci5TaWduZXJzLlYzSHR0cHM9byhyLlNpZ25lcnMuVjMse2F1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIkFXUzMtSFRUUFMgQVdTQWNjZXNzS2V5SWQ9IitlLmFjY2Vzc0tleUlkKyIsQWxnb3JpdGhtPUhtYWNTSEEyNTYsU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSl9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjNIdHRwc30seyIuLi9jb3JlIjoxOSwiLi92MyI6Njl9XSw3MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4vdjRfY3JlZGVudGlhbHMiKSxpPXIudXRpbC5pbmhlcml0LHM9InByZXNpZ25lZC1leHBpcmVzIjtyLlNpZ25lcnMuVjQ9aShyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG4pe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKSx0aGlzLnNlcnZpY2VOYW1lPXQsbj1ufHx7fSx0aGlzLnNpZ25hdHVyZUNhY2hlPSJib29sZWFuIiE9dHlwZW9mIG4uc2lnbmF0dXJlQ2FjaGV8fG4uc2lnbmF0dXJlQ2FjaGUsdGhpcy5vcGVyYXRpb249bi5vcGVyYXRpb24sdGhpcy5zaWduYXR1cmVWZXJzaW9uPW4uc2lnbmF0dXJlVmVyc2lvbn0sYWxnb3JpdGhtOiJBV1M0LUhNQUMtU0hBMjU2IixhZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUuaXNvODYwMSh0KS5yZXBsYWNlKC9bOlwtXXxcLlxkezN9L2csIiIpO3RoaXMuaXNQcmVzaWduZWQoKT90aGlzLnVwZGF0ZUZvclByZXNpZ25lZChlLG4pOnRoaXMuYWRkSGVhZGVycyhlLG4pLHRoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249dGhpcy5hdXRob3JpemF0aW9uKGUsbil9LGFkZEhlYWRlcnM6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdPXQsZS5zZXNzaW9uVG9rZW4mJih0aGlzLnJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXT1lLnNlc3Npb25Ub2tlbil9LHVwZGF0ZUZvclByZXNpZ25lZDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KSxvPXsiWC1BbXotRGF0ZSI6dCwiWC1BbXotQWxnb3JpdGhtIjp0aGlzLmFsZ29yaXRobSwiWC1BbXotQ3JlZGVudGlhbCI6ZS5hY2Nlc3NLZXlJZCsiLyIrbiwiWC1BbXotRXhwaXJlcyI6dGhpcy5yZXF1ZXN0LmhlYWRlcnNbc10sIlgtQW16LVNpZ25lZEhlYWRlcnMiOnRoaXMuc2lnbmVkSGVhZGVycygpfTtlLnNlc3Npb25Ub2tlbiYmKG9bIlgtQW16LVNlY3VyaXR5LVRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSYmKG9bIkNvbnRlbnQtVHlwZSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTUQ1Il0mJihvWyJDb250ZW50LU1ENSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdJiYob1siQ2FjaGUtQ29udHJvbCJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDYWNoZS1Db250cm9sIl0pLHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtpZihlIT09cyYmdGhpcy5pc1NpZ25hYmxlSGVhZGVyKGUpKXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7MD09PW4uaW5kZXhPZigieC1hbXotbWV0YS0iKT9vW25dPXQ6MD09PW4uaW5kZXhPZigieC1hbXotIikmJihvW2VdPXQpfX0pKTt2YXIgaT10aGlzLnJlcXVlc3QucGF0aC5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt0aGlzLnJlcXVlc3QucGF0aCs9aStyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhvKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9dGhpcy5jcmVkZW50aWFsU3RyaW5nKHQpO3JldHVybiBuLnB1c2godGhpcy5hbGdvcml0aG0rIiBDcmVkZW50aWFsPSIrZS5hY2Nlc3NLZXlJZCsiLyIrciksbi5wdXNoKCJTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkpLG4ucHVzaCgiU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSx0KSksbi5qb2luKCIsICIpfSxzaWduYXR1cmU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldFNpZ25pbmdLZXkoZSx0LnN1YnN0cigwLDgpLHRoaXMucmVxdWVzdC5yZWdpb24sdGhpcy5zZXJ2aWNlTmFtZSx0aGlzLnNpZ25hdHVyZUNhY2hlKTtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKG4sdGhpcy5zdHJpbmdUb1NpZ24odCksImhleCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHQucHVzaCgiQVdTNC1ITUFDLVNIQTI1NiIpLHQucHVzaChlKSx0LnB1c2godGhpcy5jcmVkZW50aWFsU3RyaW5nKGUpKSx0LnB1c2godGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLmNhbm9uaWNhbFN0cmluZygpKSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMucmVxdWVzdC5wYXRobmFtZSgpO3JldHVybiJzMyIhPT10aGlzLnNlcnZpY2VOYW1lJiYiczN2NCIhPT10aGlzLnNpZ25hdHVyZVZlcnNpb24mJih0PXIudXRpbC51cmlFc2NhcGVQYXRoKHQpKSxlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHQpLGUucHVzaCh0aGlzLnJlcXVlc3Quc2VhcmNoKCkpLGUucHVzaCh0aGlzLmNhbm9uaWNhbEhlYWRlcnMoKSsiXG4iKSxlLnB1c2godGhpcy5zaWduZWRIZWFkZXJzKCkpLGUucHVzaCh0aGlzLmhleEVuY29kZWRCb2R5SGFzaCgpKSxlLmpvaW4oIlxuIil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQsbil7ZS5wdXNoKFt0LG5dKX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKTx0WzBdLnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dmFyIG49ZVswXS50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuaXNTaWduYWJsZUhlYWRlcihuKSl7dmFyIG89ZVsxXTtpZihudWxsPT1vfHwiZnVuY3Rpb24iIT10eXBlb2Ygby50b1N0cmluZyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yKCJIZWFkZXIgIituKyIgY29udGFpbnMgaW52YWxpZCB2YWx1ZSIpLHtjb2RlOiJJbnZhbGlkSGVhZGVyIn0pO3QucHVzaChuKyI6Iit0aGlzLmNhbm9uaWNhbEhlYWRlclZhbHVlcyhvLnRvU3RyaW5nKCkpKX19KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJWYWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXHMrL2csIiAiKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9LHNpZ25lZEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKSx0aGlzLmlzU2lnbmFibGVIZWFkZXIodCkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNyZWRlbnRpYWxTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIG8uY3JlYXRlU2NvcGUoZS5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUpfSxoZXhFbmNvZGVkSGFzaDpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5zaGEyNTYoZSwiaGV4Iil9LGhleEVuY29kZWRCb2R5SGFzaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdDtyZXR1cm4gdGhpcy5pc1ByZXNpZ25lZCgpJiZbInMzIiwiczMtb2JqZWN0LWxhbWJkYSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlTmFtZSk+LTEmJiFlLmJvZHk/IlVOU0lHTkVELVBBWUxPQUQiOmUuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT9lLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il06dGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLnJlcXVlc3QuYm9keXx8IiIpfSx1bnNpZ25hYmxlSGVhZGVyczpbImF1dGhvcml6YXRpb24iLCJjb250ZW50LXR5cGUiLCJjb250ZW50LWxlbmd0aCIsInVzZXItYWdlbnQiLHMsImV4cGVjdCIsIngtYW16bi10cmFjZS1pZCJdLGlzU2lnbmFibGVIZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigieC1hbXotIil8fHRoaXMudW5zaWduYWJsZUhlYWRlcnMuaW5kZXhPZihlKTwwfSxpc1ByZXNpZ25lZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5yZXF1ZXN0LmhlYWRlcnNbc119fSksdC5leHBvcnRzPXIuU2lnbmVycy5WNH0seyIuLi9jb3JlIjoxOSwiLi92NF9jcmVkZW50aWFscyI6NzJ9XSw3MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXt9LGk9W10scz0iYXdzNF9yZXF1ZXN0Ijt0LmV4cG9ydHM9e2NyZWF0ZVNjb3BlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bZS5zdWJzdHIoMCw4KSx0LG4sc10uam9pbigiLyIpfSxnZXRTaWduaW5nS2V5OmZ1bmN0aW9uKGUsdCxuLGEsYyl7dmFyIHU9W3IudXRpbC5jcnlwdG8uaG1hYyhlLnNlY3JldEFjY2Vzc0tleSxlLmFjY2Vzc0tleUlkLCJiYXNlNjQiKSx0LG4sYV0uam9pbigiXyIpO2lmKChjPSExIT09YykmJnUgaW4gbylyZXR1cm4gb1t1XTt2YXIgbD1yLnV0aWwuY3J5cHRvLmhtYWMoIkFXUzQiK2Uuc2VjcmV0QWNjZXNzS2V5LHQsImJ1ZmZlciIpLHA9ci51dGlsLmNyeXB0by5obWFjKGwsbiwiYnVmZmVyIiksZD1yLnV0aWwuY3J5cHRvLmhtYWMocCxhLCJidWZmZXIiKSxoPXIudXRpbC5jcnlwdG8uaG1hYyhkLHMsImJ1ZmZlciIpO3JldHVybiBjJiYob1t1XT1oLGkucHVzaCh1KSxpLmxlbmd0aD41MCYmZGVsZXRlIG9baS5zaGlmdCgpXSksaH0sZW1wdHlDYWNoZTpmdW5jdGlvbigpe289e30saT1bXX19fSx7Ii4uL2NvcmUiOjE5fV0sNzM6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7dGhpcy5jdXJyZW50U3RhdGU9dHx8bnVsbCx0aGlzLnN0YXRlcz1lfHx7fX1yLnByb3RvdHlwZS5ydW5Ubz1mdW5jdGlvbihlLHQsbixyKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9bixuPXQsdD1lLGU9bnVsbCk7dmFyIG89dGhpcyxpPW8uc3RhdGVzW28uY3VycmVudFN0YXRlXTtpLmZuLmNhbGwobnx8byxyLChmdW5jdGlvbihyKXtpZihyKXtpZighaS5mYWlsKXJldHVybiB0P3QuY2FsbChuLHIpOm51bGw7by5jdXJyZW50U3RhdGU9aS5mYWlsfWVsc2V7aWYoIWkuYWNjZXB0KXJldHVybiB0P3QuY2FsbChuKTpudWxsO28uY3VycmVudFN0YXRlPWkuYWNjZXB0fWlmKG8uY3VycmVudFN0YXRlPT09ZSlyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28ucnVuVG8oZSx0LG4scil9KSl9LHIucHJvdG90eXBlLmFkZFN0YXRlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLG49bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihyPW4sbj1udWxsKSx0aGlzLmN1cnJlbnRTdGF0ZXx8KHRoaXMuY3VycmVudFN0YXRlPWUpLHRoaXMuc3RhdGVzW2VdPXthY2NlcHQ6dCxmYWlsOm4sZm46cn0sdGhpc30sdC5leHBvcnRzPXJ9LHt9XSw3NDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuLHIpeyhmdW5jdGlvbigpe3ZhciBvLGk9e2Vudmlyb25tZW50OiJub2RlanMiLGVuZ2luZTpmdW5jdGlvbigpe2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O3ZhciBlPW4ucGxhdGZvcm0rIi8iK24udmVyc2lvbjtyZXR1cm4gbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYmJihlKz0iIGV4ZWMtZW52LyIrbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYpLGV9LHVzZXJBZ2VudDpmdW5jdGlvbigpe3ZhciB0PWkuZW52aXJvbm1lbnQsbj0iYXdzLXNkay0iK3QrIi8iK2UoIi4vY29yZSIpLlZFUlNJT047cmV0dXJuIm5vZGVqcyI9PT10JiYobis9IiAiK2kuZW5naW5lKCkpLG59LHVyaUVzY2FwZTpmdW5jdGlvbihlKXt2YXIgdD1lbmNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIHQ9KHQ9dC5yZXBsYWNlKC9bXkEtWmEtejAtOV8uflwtJV0rL2csZXNjYXBlKSkucmVwbGFjZSgvWypdL2csKGZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9KSl9LHVyaUVzY2FwZVBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGkuYXJyYXlFYWNoKGUuc3BsaXQoIi8iKSwoZnVuY3Rpb24oZSl7dC5wdXNoKGkudXJpRXNjYXBlKGUpKX0pKSx0LmpvaW4oIi8iKX0sdXJsUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLnBhcnNlKGUpfSx1cmxGb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLmZvcm1hdChlKX0scXVlcnlTdHJpbmdQYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gaS5xdWVyeXN0cmluZy5wYXJzZShlKX0scXVlcnlQYXJhbXNUb1N0cmluZzpmdW5jdGlvbihlKXt2YXIgdD1bXSxuPWkudXJpRXNjYXBlLHI9T2JqZWN0LmtleXMoZSkuc29ydCgpO3JldHVybiBpLmFycmF5RWFjaChyLChmdW5jdGlvbihyKXt2YXIgbz1lW3JdLHM9bihyKSxhPXMrIj0iO2lmKEFycmF5LmlzQXJyYXkobykpe3ZhciBjPVtdO2kuYXJyYXlFYWNoKG8sKGZ1bmN0aW9uKGUpe2MucHVzaChuKGUpKX0pKSxhPXMrIj0iK2Muc29ydCgpLmpvaW4oIiYiK3MrIj0iKX1lbHNlIG51bGwhPW8mJihhPXMrIj0iK24obykpO3QucHVzaChhKX0pKSx0LmpvaW4oIiYiKX0scmVhZEZpbGVTeW5jOmZ1bmN0aW9uKHQpe3JldHVybiBpLmlzQnJvd3NlcigpP251bGw6ZSgiZnMiKS5yZWFkRmlsZVN5bmModCwidXRmLTgiKX0sYmFzZTY0OntlbmNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGVuY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlKS50b1N0cmluZygiYmFzZTY0Iil9LGRlY29kZTpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBiYXNlNjQgZGVjb2RlIG51bWJlciAiK2UpKTtyZXR1cm4gbnVsbD09ZT9lOmkuYnVmZmVyLnRvQnVmZmVyKGUsImJhc2U2NCIpfX0sYnVmZmVyOnt0b0J1ZmZlcjpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5mcm9tJiZpLkJ1ZmZlci5mcm9tIT09VWludDhBcnJheS5mcm9tP2kuQnVmZmVyLmZyb20oZSx0KTpuZXcgaS5CdWZmZXIoZSx0KX0sYWxsb2M6ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInNpemUgcGFzc2VkIHRvIGFsbG9jIG11c3QgYmUgYSBudW1iZXIuIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGkuQnVmZmVyLmFsbG9jKXJldHVybiBpLkJ1ZmZlci5hbGxvYyhlLHQsbik7dmFyIHI9bmV3IGkuQnVmZmVyKGUpO3JldHVybiB2b2lkIDAhPT10JiYiZnVuY3Rpb24iPT10eXBlb2Ygci5maWxsJiZyLmZpbGwodCx2b2lkIDAsdm9pZCAwLG4pLHJ9LHRvU3RyZWFtOmZ1bmN0aW9uKGUpe2kuQnVmZmVyLmlzQnVmZmVyKGUpfHwoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7dmFyIHQ9bmV3IGkuc3RyZWFtLlJlYWRhYmxlLG49MDtyZXR1cm4gdC5fcmVhZD1mdW5jdGlvbihyKXtpZihuPj1lLmxlbmd0aClyZXR1cm4gdC5wdXNoKG51bGwpO3ZhciBvPW4rcjtvPmUubGVuZ3RoJiYobz1lLmxlbmd0aCksdC5wdXNoKGUuc2xpY2UobixvKSksbj1vfSx0fSxjb25jYXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTAsbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXS5sZW5ndGg7Zm9yKHQ9aS5idWZmZXIuYWxsb2Mociksbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uY29weSh0LG8pLG8rPWVbbl0ubGVuZ3RoO3JldHVybiB0fX0sc3RyaW5nOntieXRlTGVuZ3RoOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksIm51bWJlciI9PXR5cGVvZiB0LmJ5dGVMZW5ndGgpcmV0dXJuIHQuYnl0ZUxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQuc2l6ZSlyZXR1cm4gdC5zaXplO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXRoKXJldHVybiBlKCJmcyIpLmxzdGF0U3luYyh0LnBhdGgpLnNpemU7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBkZXRlcm1pbmUgbGVuZ3RoIG9mICIrdCkse29iamVjdDp0fSl9LHVwcGVyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9VcHBlckNhc2UoKStlLnN1YnN0cigxKX0sbG93ZXJGaXJzdDpmdW5jdGlvbihlKXtyZXR1cm4gZVswXS50b0xvd2VyQ2FzZSgpK2Uuc3Vic3RyKDEpfX0saW5pOntwYXJzZTpmdW5jdGlvbihlKXt2YXIgdCxuPXt9O3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KC9ccj9cbi8pLChmdW5jdGlvbihlKXtpZigiWyI9PT0oZT1lLnNwbGl0KC8oXnxccylbOyNdLylbMF0udHJpbSgpKVswXSYmIl0iPT09ZVtlLmxlbmd0aC0xXSl7aWYoIl9fcHJvdG9fXyI9PT0odD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKXx8Il9fcHJvdG9fXyI9PT10LnNwbGl0KC9ccy8pWzFdKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgbG9hZCBwcm9maWxlIG5hbWUgJyIrdCsiJyBmcm9tIHNoYXJlZCBpbmkgZmlsZS4iKSl9ZWxzZSBpZih0KXt2YXIgcj1lLmluZGV4T2YoIj0iKSxvPWUubGVuZ3RoLTE7aWYoLTEhPT1yJiYwIT09ciYmciE9PW8pe3ZhciBzPWUuc3Vic3RyaW5nKDAscikudHJpbSgpLGE9ZS5zdWJzdHJpbmcocisxKS50cmltKCk7blt0XT1uW3RdfHx7fSxuW3RdW3NdPWF9fX0pKSxufX0sZm46e25vb3A6ZnVuY3Rpb24oKXt9LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUpdGhyb3cgZX0sbWFrZUFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJnQ8PWUubGVuZ3RoP2U6ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7dC5wb3AoKShlLmFwcGx5KG51bGwsdCkpfX19LGRhdGU6e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gb3x8KG89ZSgiLi9jb3JlIikpLG8uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0P25ldyBEYXRlKChuZXcgRGF0ZSkuZ2V0VGltZSgpK28uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KTpuZXcgRGF0ZX0saXNvODYwMTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sIloiKX0scmZjODIyOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLnRvVVRDU3RyaW5nKCl9LHVuaXhUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUuZ2V0VGltZSgpLzFlM30sZnJvbTpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/bmV3IERhdGUoMWUzKmUpOm5ldyBEYXRlKGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9Imlzbzg2MDEiKSxpLmRhdGVbdF0oaS5kYXRlLmZyb20oZSkpfSxwYXJzZVRpbWVzdGFtcDpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBEYXRlKDFlMyplKTtpZihlLm1hdGNoKC9eXGQrJC8pKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkezR9LykpcmV0dXJuIG5ldyBEYXRlKGUpO2lmKGUubWF0Y2goL15cd3szfSwvKSlyZXR1cm4gbmV3IERhdGUoZSk7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoInVuaGFuZGxlZCB0aW1lc3RhbXAgZm9ybWF0OiAiK2UpLHtjb2RlOiJUaW1lc3RhbXBQYXJzZXJFcnJvciJ9KX19LGNyeXB0bzp7Y3JjMzJUYWJsZTpbMCwxOTk2OTU5ODk0LDM5OTM5MTk3ODgsMjU2NzUyNDc5NCwxMjQ2MzQxMzcsMTg4NjA1NzYxNSwzOTE1NjIxNjg1LDI2NTczOTIwMzUsMjQ5MjY4Mjc0LDIwNDQ1MDgzMjQsMzc3MjExNTIzMCwyNTQ3MTc3ODY0LDE2Mjk0MTk5NSwyMTI1NTYxMDIxLDM4ODc2MDcwNDcsMjQyODQ0NDA0OSw0OTg1MzY1NDgsMTc4OTkyNzY2Niw0MDg5MDE2NjQ4LDIyMjcwNjEyMTQsNDUwNTQ4ODYxLDE4NDMyNTg2MDMsNDEwNzU4MDc1MywyMjExNjc3NjM5LDMyNTg4Mzk5MCwxNjg0Nzc3MTUyLDQyNTExMjIwNDIsMjMyMTkyNjYzNiwzMzU2MzM0ODcsMTY2MTM2NTQ2NSw0MTk1MzAyNzU1LDIzNjYxMTUzMTcsOTk3MDczMDk2LDEyODE5NTM4ODYsMzU3OTg1NTMzMiwyNzI0Njg4MjQyLDEwMDY4ODgxNDUsMTI1ODYwNzY4NywzNTI0MTAxNjI5LDI3Njg5NDI0NDMsOTAxMDk3NzIyLDExMTkwMDA2ODQsMzY4NjUxNzIwNiwyODk4MDY1NzI4LDg1MzA0NDQ1MSwxMTcyMjY2MTAxLDM3MDUwMTU3NTksMjg4MjYxNjY2NSw2NTE3Njc5ODAsMTM3MzUwMzU0NiwzMzY5NTU0MzA0LDMyMTgxMDQ1OTgsNTY1NTA3MjUzLDE0NTQ2MjE3MzEsMzQ4NTExMTcwNSwzMDk5NDM2MzAzLDY3MTI2Njk3NCwxNTk0MTk4MDI0LDMzMjI3MzA5MzAsMjk3MDM0NzgxMiw3OTU4MzU1MjcsMTQ4MzIzMDIyNSwzMjQ0MzY3Mjc1LDMwNjAxNDk1NjUsMTk5NDE0NjE5MiwzMTE1ODUzNCwyNTYzOTA3NzcyLDQwMjM3MTc5MzAsMTkwNzQ1OTQ2NSwxMTI2MzcyMTUsMjY4MDE1MzI1MywzOTA0NDI3MDU5LDIwMTM3NzYyOTAsMjUxNzIyMDM2LDI1MTcyMTUzNzQsMzc3NTgzMDA0MCwyMTM3NjU2NzYzLDE0MTM3NjgxMywyNDM5Mjc3NzE5LDM4NjUyNzEyOTcsMTgwMjE5NTQ0NCw0NzY4NjQ4NjYsMjIzODAwMTM2OCw0MDY2NTA4ODc4LDE4MTIzNzA5MjUsNDUzMDkyNzMxLDIxODE2MjUwMjUsNDExMTQ1MTIyMywxNzA2MDg4OTAyLDMxNDA0MjcwNCwyMzQ0NTMyMjAyLDQyNDAwMTc1MzIsMTY1ODY1ODI3MSwzNjY2MTk5NzcsMjM2MjY3MDMyMyw0MjI0OTk0NDA1LDEzMDM1MzU5NjAsOTg0OTYxNDg2LDI3NDcwMDcwOTIsMzU2OTAzNzUzOCwxMjU2MTcwODE3LDEwMzc2MDQzMTEsMjc2NTIxMDczMywzNTU0MDc5OTk1LDExMzEwMTQ1MDYsODc5Njc5OTk2LDI5MDkyNDM0NjIsMzY2Mzc3MTg1NiwxMTQxMTI0NDY3LDg1NTg0MjI3NywyODUyODAxNjMxLDM3MDg2NDg2NDksMTM0MjUzMzk0OCw2NTQ0NTkzMDYsMzE4ODM5NjA0OCwzMzczMDE1MTc0LDE0NjY0Nzk5MDksNTQ0MTc5NjM1LDMxMTA1MjM5MTMsMzQ2MjUyMjAxNSwxNTkxNjcxMDU0LDcwMjEzODc3NiwyOTY2NDYwNDUwLDMzNTI3OTk0MTIsMTUwNDkxODgwNyw3ODM1NTE4NzMsMzA4MjY0MDQ0MywzMjMzNDQyOTg5LDM5ODgyOTIzODQsMjU5NjI1NDY0Niw2MjMxNzA2OCwxOTU3ODEwODQyLDM5Mzk4NDU5NDUsMjY0NzgxNjExMSw4MTQ3MDk5NywxOTQzODAzNTIzLDM4MTQ5MTg5MzAsMjQ4OTU5NjgwNCwyMjUyNzQ0MzAsMjA1Mzc5MDM3NiwzODI2MTc1NzU1LDI0NjY5MDYwMTMsMTY3ODE2NzQzLDIwOTc2NTEzNzcsNDAyNzU1MjU4MCwyMjY1NDkwMzg2LDUwMzQ0NDA3MiwxNzYyMDUwODE0LDQxNTA0MTcyNDUsMjE1NDEyOTM1NSw0MjY1MjIyMjUsMTg1MjUwNzg3OSw0Mjc1MzEzNTI2LDIzMTIzMTc5MjAsMjgyNzUzNjI2LDE3NDI1NTU4NTIsNDE4OTcwODE0MywyMzk0ODc3OTQ1LDM5NzkxNzc2MywxNjIyMTgzNjM3LDM2MDQzOTA4ODgsMjcxNDg2NjU1OCw5NTM3Mjk3MzIsMTM0MDA3NjYyNiwzNTE4NzE5OTg1LDI3OTczNjA5OTksMTA2ODgyODM4MSwxMjE5NjM4ODU5LDM2MjQ3NDE4NTAsMjkzNjY3NTE0OCw5MDYxODU0NjIsMTA5MDgxMjUxMiwzNzQ3NjcyMDAzLDI4MjUzNzk2NjksODI5MzI5MTM1LDExODEzMzUxNjEsMzQxMjE3NzgwNCwzMTYwODM0ODQyLDYyODA4NTQwOCwxMzgyNjA1MzY2LDM0MjMzNjkxMDksMzEzODA3ODQ2Nyw1NzA1NjIyMzMsMTQyNjQwMDgxNSwzMzE3MzE2NTQyLDI5OTg3MzM2MDgsNzMzMjM5OTU0LDE1NTUyNjE5NTYsMzI2ODkzNTU5MSwzMDUwMzYwNjI1LDc1MjQ1OTQwMywxNTQxMzIwMjIxLDI2MDcwNzE5MjAsMzk2NTk3MzAzMCwxOTY5OTIyOTcyLDQwNzM1NDk4LDI2MTc4MzcyMjUsMzk0MzU3NzE1MSwxOTEzMDg3ODc3LDgzOTA4MzcxLDI1MTIzNDE2MzQsMzgwMzc0MDY5MiwyMDc1MjA4NjIyLDIxMzI2MTExMiwyNDYzMjcyNjAzLDM4NTU5OTAyODUsMjA5NDg1NDA3MSwxOTg5NTg4ODEsMjI2MjAyOTAxMiw0MDU3MjYwNjEwLDE3NTkzNTk5OTIsNTM0NDE0MTkwLDIxNzY3MTg1NDEsNDEzOTMyOTExNSwxODczODM2MDAxLDQxNDY2NDU2NywyMjgyMjQ4OTM0LDQyNzkyMDAzNjgsMTcxMTY4NDU1NCwyODUyODExMTYsMjQwNTgwMTcyNyw0MTY3MjE2NzQ1LDE2MzQ0Njc3OTUsMzc2MjI5NzAxLDI2ODUwNjc4OTYsMzYwODAwNzQwNiwxMzA4OTE4NjEyLDk1NjU0MzkzOCwyODA4NTU1MTA1LDM0OTU5NTgyNjMsMTIzMTYzNjMwMSwxMDQ3NDI3MDM1LDI5MzI5NTk4MTgsMzY1NDcwMzgzNiwxMDg4MzU5MjcwLDkzNjkxOGUzLDI4NDc3MTQ4OTksMzczNjgzNzgyOSwxMjAyOTAwODYzLDgxNzIzMzg5NywzMTgzMzQyMTA4LDM0MDEyMzcxMzAsMTQwNDI3NzU1Miw2MTU4MTgxNTAsMzEzNDIwNzQ5MywzNDUzNDIxMjAzLDE0MjM4NTc0NDksNjAxNDUwNDMxLDMwMDk4Mzc2MTQsMzI5NDcxMDQ1NiwxNTY3MTAzNzQ2LDcxMTkyODcyNCwzMDIwNjY4NDcxLDMyNzIzODAwNjUsMTUxMDMzNDIzNSw3NTUxNjcxMTddLGNyYzMyOmZ1bmN0aW9uKGUpe3ZhciB0PWkuY3J5cHRvLmNyYzMyVGFibGUsbj0tMTsic3RyaW5nIj09dHlwZW9mIGUmJihlPWkuYnVmZmVyLnRvQnVmZmVyKGUpKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyluPW4+Pj44XnRbMjU1JihuXmUucmVhZFVJbnQ4KHIpKV07cmV0dXJuKC0xXm4pPj4+MH0saG1hYzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSxyfHwocj0ic2hhMjU2IiksInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksaS5jcnlwdG8ubGliLmNyZWF0ZUhtYWMocixlKS51cGRhdGUodCkuZGlnZXN0KG4pfSxtZDU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBpLmNyeXB0by5oYXNoKCJtZDUiLGUsdCxuKX0sc2hhMjU2OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgic2hhMjU2IixlLHQsbil9LGhhc2g6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89aS5jcnlwdG8uY3JlYXRlSGFzaChlKTtufHwobj0iYmluYXJ5IiksImJ1ZmZlciI9PT1uJiYobj12b2lkIDApLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpO3ZhciBzPWkuYXJyYXlTbGljZUZuKHQpLGE9aS5CdWZmZXIuaXNCdWZmZXIodCk7aWYoaS5pc0Jyb3dzZXIoKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKGE9ITApLHImJiJvYmplY3QiPT10eXBlb2YgdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQub24mJiFhKXQub24oImRhdGEiLChmdW5jdGlvbihlKXtvLnVwZGF0ZShlKX0pKSx0Lm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe3IoZSl9KSksdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtyKG51bGwsby5kaWdlc3QobikpfSkpO2Vsc2V7aWYoIXJ8fCFzfHxhfHwidW5kZWZpbmVkIj09dHlwZW9mIEZpbGVSZWFkZXIpe2kuaXNCcm93c2VyKCkmJiJvYmplY3QiPT10eXBlb2YgdCYmIWEmJih0PW5ldyBpLkJ1ZmZlcihuZXcgVWludDhBcnJheSh0KSkpO3ZhciBjPW8udXBkYXRlKHQpLmRpZ2VzdChuKTtyZXR1cm4gciYmcihudWxsLGMpLGN9dmFyIHU9MCxsPW5ldyBGaWxlUmVhZGVyO2wub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IEVycm9yKCJGYWlsZWQgdG8gcmVhZCBkYXRhLiIpKX0sbC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkobC5yZXN1bHQpKTtvLnVwZGF0ZShlKSx1Kz1lLmxlbmd0aCxsLl9jb250aW51ZVJlYWRpbmcoKX0sbC5fY29udGludWVSZWFkaW5nPWZ1bmN0aW9uKCl7aWYodT49dC5zaXplKXIobnVsbCxvLmRpZ2VzdChuKSk7ZWxzZXt2YXIgZT11KzUyNDI4ODtlPnQuc2l6ZSYmKGU9dC5zaXplKSxsLnJlYWRBc0FycmF5QnVmZmVyKHMuY2FsbCh0LHUsZSkpfX0sbC5fY29udGludWVSZWFkaW5nKCl9fSx0b0hleDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCgoIjAiK2UuY2hhckNvZGVBdChuKS50b1N0cmluZygxNikpLnN1YnN0cigtMiwyKSk7cmV0dXJuIHQuam9pbigiIil9LGNyZWF0ZUhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY3J5cHRvLmxpYi5jcmVhdGVIYXNoKGUpfX0sYWJvcnQ6e30sZWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxuLGVbbl0pPT09aS5hYm9ydClicmVha30sYXJyYXlFYWNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQuY2FsbCh0aGlzLGVbbl0scGFyc2VJbnQobiwxMCkpPT09aS5hYm9ydClicmVha30sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkuZWFjaCh0LChmdW5jdGlvbih0LG4pe2VbdF09bn0pKSxlfSxtZXJnZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLnVwZGF0ZShpLmNvcHkoZSksdCl9LGNvcHk6ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LGlzRW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkpcmV0dXJuITE7cmV0dXJuITB9LGFycmF5U2xpY2VGbjpmdW5jdGlvbihlKXt2YXIgdD1lLnNsaWNlfHxlLndlYmtpdFNsaWNlfHxlLm1velNsaWNlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbH0saXNUeXBlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWkudHlwZU5hbWUodCkpLE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKT09PSJbb2JqZWN0ICIrdCsiXSJ9LHR5cGVOYW1lOmZ1bmN0aW9uKGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikpcmV0dXJuIGUubmFtZTt2YXIgdD1lLnRvU3RyaW5nKCksbj10Lm1hdGNoKC9eXHMqZnVuY3Rpb24gKC4rKVwoLyk7cmV0dXJuIG4/blsxXTp0fSxlcnJvcjpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7Zm9yKHZhciByIGluInN0cmluZyI9PXR5cGVvZiBlLm1lc3NhZ2UmJiIiIT09ZS5tZXNzYWdlJiYoInN0cmluZyI9PXR5cGVvZiB0fHx0JiZ0Lm1lc3NhZ2UpJiYoKG49aS5jb3B5KGUpKS5tZXNzYWdlPWUubWVzc2FnZSksZS5tZXNzYWdlPWUubWVzc2FnZXx8bnVsbCwic3RyaW5nIj09dHlwZW9mIHQ/ZS5tZXNzYWdlPXQ6Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmKGkudXBkYXRlKGUsdCksdC5tZXNzYWdlJiYoZS5tZXNzYWdlPXQubWVzc2FnZSksKHQuY29kZXx8dC5uYW1lKSYmKGUuY29kZT10LmNvZGV8fHQubmFtZSksdC5zdGFjayYmKGUuc3RhY2s9dC5zdGFjaykpLCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJihPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmFtZSIse3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITB9KSksZS5uYW1lPVN0cmluZyh0JiZ0Lm5hbWV8fGUubmFtZXx8ZS5jb2RlfHwiRXJyb3IiKSxlLnRpbWU9bmV3IERhdGUsbiYmKGUub3JpZ2luYWxFcnJvcj1uKSx0fHx7fSlpZigiWyI9PT1yWzBdJiYiXSI9PT1yW3IubGVuZ3RoLTFdKXtpZigiY29kZSI9PT0ocj1yLnNsaWNlKDEsLTEpKXx8Im1lc3NhZ2UiPT09ciljb250aW51ZTtlWyJbIityKyJdIl09IlNlZSBlcnJvci4iK3IrIiBmb3IgZGV0YWlscy4iLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse3ZhbHVlOmVbcl18fHQmJnRbcl18fG4mJm5bcl0sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pfXJldHVybiBlfSxpbmhlcml0OmZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbDtpZih2b2lkIDA9PT10KXQ9ZSxlPU9iamVjdCxuPXt9O2Vsc2V7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLG49bmV3IHJ9cmV0dXJuIHQuY29uc3RydWN0b3I9PT1PYmplY3QmJih0LmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7aWYoZSE9PU9iamVjdClyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSx0LmNvbnN0cnVjdG9yLnByb3RvdHlwZT1uLGkudXBkYXRlKHQuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHQuY29uc3RydWN0b3IuX19zdXBlcl9fPWUsdC5jb25zdHJ1Y3Rvcn0sbWl4aW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWZvcih2YXIgbiBpbiBhcmd1bWVudHNbdF0ucHJvdG90eXBlKXt2YXIgcj1hcmd1bWVudHNbdF0ucHJvdG90eXBlW25dOyJjb25zdHJ1Y3RvciIhPT1uJiYoZS5wcm90b3R5cGVbbl09cil9cmV0dXJuIGV9LGhpZGVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmaS5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0pKX0scHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6dm9pZCAwPT09cnx8cn07ImZ1bmN0aW9uIiE9dHlwZW9mIG58fG8/KGkudmFsdWU9bixpLndyaXRhYmxlPSEwKTppLmdldD1uLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsaSl9LG1lbW9pemVkUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bnVsbDtpLnByb3BlcnR5KGUsdCwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PW8mJihvPW4oKSksb30pLHIpfSxob2lzdFBheWxvYWRNZW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0sbz1yLm91dHB1dDtpZihvLnBheWxvYWQmJiFyLmhhc0V2ZW50T3V0cHV0KXt2YXIgcz1vLm1lbWJlcnNbby5wYXlsb2FkXSxhPWUuZGF0YVtvLnBheWxvYWRdOyJzdHJ1Y3R1cmUiPT09cy50eXBlJiZpLmVhY2goYSwoZnVuY3Rpb24odCxuKXtpLnByb3BlcnR5KGUuZGF0YSx0LG4sITEpfSkpfX0sY29tcHV0ZVNoYTI1NjpmdW5jdGlvbih0LG4pe2lmKGkuaXNOb2RlKCkpe3ZhciByPWkuc3RyZWFtLlN0cmVhbSxvPWUoImZzIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJnQgaW5zdGFuY2VvZiByKXtpZigic3RyaW5nIiE9dHlwZW9mIHQucGF0aClyZXR1cm4gbihuZXcgRXJyb3IoIk5vbi1maWxlIHN0cmVhbSBvYmplY3RzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU2lnVjQiKSk7dmFyIHM9e307Im51bWJlciI9PXR5cGVvZiB0LnN0YXJ0JiYocy5zdGFydD10LnN0YXJ0KSwibnVtYmVyIj09dHlwZW9mIHQuZW5kJiYocy5lbmQ9dC5lbmQpLHQ9by5jcmVhdGVSZWFkU3RyZWFtKHQucGF0aCxzKX19aS5jcnlwdG8uc2hhMjU2KHQsImhleCIsKGZ1bmN0aW9uKGUsdCl7ZT9uKGUpOm4obnVsbCx0KX0pKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBpLnByb3BlcnR5KG8uY29uZmlnLCJpc0Nsb2NrU2tld2VkIixNYXRoLmFicygobmV3IERhdGUpLmdldFRpbWUoKS1lKT49M2U1LCExKSxvLmNvbmZpZy5pc0Nsb2NrU2tld2VkfSxhcHBseUNsb2NrT2Zmc2V0OmZ1bmN0aW9uKGUpe2UmJihvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD1lLShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sZXh0cmFjdFJlcXVlc3RJZDpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl18fGUuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXTshdCYmZS5kYXRhJiZlLmRhdGEuUmVzcG9uc2VNZXRhZGF0YSYmKHQ9ZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEuUmVxdWVzdElkKSx0JiYoZS5yZXF1ZXN0SWQ9dCksZS5lcnJvciYmKGUuZXJyb3IucmVxdWVzdElkPXQpfSxhZGRQcm9taXNlczpmdW5jdGlvbihlLHQpe3ZhciBuPSExO3ZvaWQgMD09PXQmJm8mJm8uY29uZmlnJiYodD1vLmNvbmZpZy5nZXRQcm9taXNlc0RlcGVuZGVuY3koKSksdm9pZCAwPT09dCYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlJiYodD1Qcm9taXNlKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKG49ITApLEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07bj9pLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzJiZpLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzKCk6aS5hZGRQcm9taXNlc1RvQ2xhc3MmJmkuYWRkUHJvbWlzZXNUb0NsYXNzKHQpfX0scHJvbWlzaWZ5TWV0aG9kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIG5ldyB0KChmdW5jdGlvbih0LG8pe3IucHVzaCgoZnVuY3Rpb24oZSxuKXtlP28oZSk6dChuKX0pKSxuW2VdLmFwcGx5KG4scil9KSl9fSxpc0R1YWxzdGFja0F2YWlsYWJsZTpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTt2YXIgbj1lKCIuLi9hcGlzL21ldGFkYXRhLmpzb24iKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PXQuc2VydmljZUlkZW50aWZpZXIpLCEoInN0cmluZyIhPXR5cGVvZiB0fHwhbi5oYXNPd25Qcm9wZXJ0eSh0KXx8IW5bdF0uZHVhbHN0YWNrQXZhaWxhYmxlKX0sY2FsY3VsYXRlUmV0cnlEZWxheTpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPXQuY3VzdG9tQmFja29mZnx8bnVsbDtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gcihlLG4pO3ZhciBvPSJudW1iZXIiPT10eXBlb2YgdC5iYXNlP3QuYmFzZToxMDA7cmV0dXJuIE1hdGgucmFuZG9tKCkqKE1hdGgucG93KDIsZSkqbyl9LGhhbmRsZVJlcXVlc3RXaXRoUmV0cmllczpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPW8uSHR0cENsaWVudC5nZXRJbnN0YW5jZSgpLHM9dC5odHRwT3B0aW9uc3x8e30sYT0wLGM9ZnVuY3Rpb24oZSl7dmFyIHI9dC5tYXhSZXRyaWVzfHwwO2lmKGUmJiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlJiYoZS5yZXRyeWFibGU9ITApLGUmJmUucmV0cnlhYmxlJiZhPHIpe3ZhciBvPWkuY2FsY3VsYXRlUmV0cnlEZWxheShhLHQucmV0cnlEZWxheU9wdGlvbnMsZSk7aWYobz49MClyZXR1cm4gYSsrLHZvaWQgc2V0VGltZW91dCh1LG8rKGUucmV0cnlBZnRlcnx8MCkpfW4oZSl9LHU9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyLmhhbmRsZVJlcXVlc3QoZSxzLChmdW5jdGlvbihlKXtlLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7dCs9ZS50b1N0cmluZygpfSkpLGUub24oImVuZCIsKGZ1bmN0aW9uKCl7dmFyIHI9ZS5zdGF0dXNDb2RlO2lmKHI8MzAwKW4obnVsbCx0KTtlbHNle3ZhciBvPTFlMypwYXJzZUludChlLmhlYWRlcnNbInJldHJ5LWFmdGVyIl0sMTApfHwwLHM9aS5lcnJvcihuZXcgRXJyb3Ise3N0YXR1c0NvZGU6cixyZXRyeWFibGU6cj49NTAwfHw0Mjk9PT1yfSk7byYmcy5yZXRyeWFibGUmJihzLnJldHJ5QWZ0ZXI9byksYyhzKX19KSl9KSxjKX07by51dGlsLmRlZmVyKHUpfSx1dWlkOnt2NDpmdW5jdGlvbigpe3JldHVybiBlKCJ1dWlkIikudjQoKX19LGNvbnZlcnRQYXlsb2FkVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0ub3V0cHV0fHx7fTtyLnBheWxvYWQmJmUuZGF0YVtyLnBheWxvYWRdJiYoZS5kYXRhW3IucGF5bG9hZF09ZS5kYXRhW3IucGF5bG9hZF0udG9TdHJpbmcoKSl9LGRlZmVyOmZ1bmN0aW9uKGUpeyJvYmplY3QiPT10eXBlb2YgbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ubmV4dFRpY2s/bi5uZXh0VGljayhlKToiZnVuY3Rpb24iPT10eXBlb2Ygcj9yKGUpOnNldFRpbWVvdXQoZSwwKX0sZ2V0UmVxdWVzdFBheWxvYWRTaGFwZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnM7aWYodCl7dmFyIG49KHR8fHt9KVtlLm9wZXJhdGlvbl07aWYobiYmbi5pbnB1dCYmbi5pbnB1dC5wYXlsb2FkKXJldHVybiBuLmlucHV0Lm1lbWJlcnNbbi5pbnB1dC5wYXlsb2FkXX19LGdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciByPXt9LG89e307bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJihvPWUubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W2kuc2hhcmVkQ29uZmlnRmlsZUVudl19KSk7dmFyIHM9e307dHJ5e3M9ZS5sb2FkRnJvbSh7ZmlsZW5hbWU6dHx8bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJm4uZW52W2kuc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52XX0pfWNhdGNoKGUpe2lmKCFuLmVudltpLmNvbmZpZ09wdEluRW52XSl0aHJvdyBlfWZvcih2YXIgYT0wLGM9T2JqZWN0LmtleXMobyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LG9bY1thXV0pO2ZvcihhPTAsYz1PYmplY3Qua2V5cyhzKTthPGMubGVuZ3RoO2ErKylyW2NbYV1dPXUocltjW2FdXXx8e30sc1tjW2FdXSk7cmV0dXJuIHI7ZnVuY3Rpb24gdShlLHQpe2Zvcih2YXIgbj0wLHI9T2JqZWN0LmtleXModCk7bjxyLmxlbmd0aDtuKyspZVtyW25dXT10W3Jbbl1dO3JldHVybiBlfX0sQVJOOnt2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmMD09PWUuaW5kZXhPZigiYXJuOiIpJiZlLnNwbGl0KCI6IikubGVuZ3RoPj02fSxwYXJzZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCI6Iik7cmV0dXJue3BhcnRpdGlvbjp0WzFdLHNlcnZpY2U6dFsyXSxyZWdpb246dFszXSxhY2NvdW50SWQ6dFs0XSxyZXNvdXJjZTp0LnNsaWNlKDUpLmpvaW4oIjoiKX19LGJ1aWxkOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUuc2VydmljZXx8dm9pZCAwPT09ZS5yZWdpb258fHZvaWQgMD09PWUuYWNjb3VudElkfHx2b2lkIDA9PT1lLnJlc291cmNlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJJbnB1dCBBUk4gb2JqZWN0IGlzIGludmFsaWQiKSk7cmV0dXJuImFybjoiKyhlLnBhcnRpdGlvbnx8ImF3cyIpKyI6IitlLnNlcnZpY2UrIjoiK2UucmVnaW9uKyI6IitlLmFjY291bnRJZCsiOiIrZS5yZXNvdXJjZX19LGRlZmF1bHRQcm9maWxlOiJkZWZhdWx0Iixjb25maWdPcHRJbkVudjoiQVdTX1NES19MT0FEX0NPTkZJRyIsc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52OiJBV1NfU0hBUkVEX0NSRURFTlRJQUxTX0ZJTEUiLHNoYXJlZENvbmZpZ0ZpbGVFbnY6IkFXU19DT05GSUdfRklMRSIsaW1kc0Rpc2FibGVkRW52OiJBV1NfRUMyX01FVEFEQVRBX0RJU0FCTEVEIn07dC5leHBvcnRzPWl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksZSgidGltZXJzIikuc2V0SW1tZWRpYXRlKX0seyIuLi9hcGlzL21ldGFkYXRhLmpzb24iOjQsIi4vY29yZSI6MTksX3Byb2Nlc3M6OTEsZnM6ODIsdGltZXJzOjk5LHV1aWQ6MTAyfV0sNzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9tb2RlbC9zaGFwZSIpO2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpLHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspaWYobltyXS5wYXJlbnROb2RlPT09ZSlyZXR1cm4gbltyXX1mdW5jdGlvbiBhKGUsdCl7c3dpdGNoKHR8fCh0PXt9KSx0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gYyhlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49e30scj10LmtleS5uYW1lfHwia2V5IixvPXQudmFsdWUubmFtZXx8InZhbHVlIixpPXQuZmxhdHRlbmVkP3QubmFtZToiZW50cnkiLGM9ZS5maXJzdEVsZW1lbnRDaGlsZDtjOyl7aWYoYy5ub2RlTmFtZT09PWkpe3ZhciB1PXMoYyxyKS50ZXh0Q29udGVudCxsPXMoYyxvKTtuW3VdPWEobCx0LnZhbHVlKX1jPWMubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBufShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9dC5mbGF0dGVuZWQ/dC5uYW1lOnQubWVtYmVyLm5hbWV8fCJtZW1iZXIiLG89ZS5maXJzdEVsZW1lbnRDaGlsZDtvOylvLm5vZGVOYW1lPT09ciYmbi5wdXNoKGEobyx0Lm1lbWJlcikpLG89by5uZXh0RWxlbWVudFNpYmxpbmc7cmV0dXJuIG59KGUsdCk7Y2FzZSB2b2lkIDA6Y2FzZSBudWxsOnJldHVybiBmdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiIiO2lmKCFlLmZpcnN0RWxlbWVudENoaWxkKXJldHVybiBudWxsPT09ZS5wYXJlbnROb2RlLnBhcmVudE5vZGU/e306MD09PWUuY2hpbGROb2Rlcy5sZW5ndGg/IiI6ZS50ZXh0Q29udGVudDtmb3IodmFyIHQ9e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sbj1lLmZpcnN0RWxlbWVudENoaWxkO247KXt2YXIgcj1uLm5vZGVOYW1lO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0Lm1lbWJlcnMscik/dC5tZW1iZXJzW3JdLnR5cGU9Imxpc3QiOnQubWVtYmVyc1tyXT17bmFtZTpyfSxuPW4ubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBjKGUsdCl9KGUpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoZS5nZXRBdHRyaWJ1dGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJlbmNvZGluZyIpOyJiYXNlNjQiPT09biYmKHQ9bmV3IG8uY3JlYXRlKHt0eXBlOm59KSl9dmFyIHI9ZS50ZXh0Q29udGVudDtyZXR1cm4iIj09PXImJihyPW51bGwpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRvVHlwZT90LnRvVHlwZShyKTpyfShlLHQpfX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49e307cmV0dXJuIG51bGw9PT1lfHxyLmVhY2godC5tZW1iZXJzLChmdW5jdGlvbihyLG8pe2lmKG8uaXNYbWxBdHRyaWJ1dGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLmF0dHJpYnV0ZXMsby5uYW1lKSl7dmFyIGk9ZS5hdHRyaWJ1dGVzW28ubmFtZV0udmFsdWU7bltyXT1hKHt0ZXh0Q29udGVudDppfSxvKX19ZWxzZXt2YXIgYz1vLmZsYXR0ZW5lZD9lOnMoZSxvLm5hbWUpO2M/bltyXT1hKGMsbyk6by5mbGF0dGVuZWR8fCJsaXN0IiE9PW8udHlwZXx8dC5hcGkueG1sTm9EZWZhdWx0TGlzdHN8fChuW3JdPW8uZGVmYXVsdFZhbHVlKX19KSksbn1pLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe2lmKCIiPT09ZS5yZXBsYWNlKC9eXHMrLywiIikpcmV0dXJue307dmFyIG4sbzt0cnl7aWYod2luZG93LkRPTVBhcnNlcil7dHJ5e249KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe3Rocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtvcmlnaW5hbEVycm9yOmUsY29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfWlmKG51bGw9PT1uLmRvY3VtZW50RWxlbWVudCl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IHBhcnNlIGVtcHR5IGRvY3VtZW50LiIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7dmFyIGk9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXTtpZihpJiYoaS5wYXJlbnROb2RlPT09bnx8ImJvZHkiPT09aS5wYXJlbnROb2RlLm5vZGVOYW1lfHxpLnBhcmVudE5vZGUucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSl7dmFyIGM9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IilbMF18fGk7dGhyb3cgci5lcnJvcihuZXcgRXJyb3IoYy50ZXh0Q29udGVudHx8IlBhcnNlciBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWVsc2V7aWYoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgWE1MIHBhcnNlciIpO2lmKChuPW5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpKS5hc3luYz0hMSwhbi5sb2FkWE1MKGUpKXRocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWNhdGNoKGUpe289ZX1pZihuJiZuLmRvY3VtZW50RWxlbWVudCYmIW8pe3ZhciB1PWEobi5kb2N1bWVudEVsZW1lbnQsdCksbD1zKG4uZG9jdW1lbnRFbGVtZW50LCJSZXNwb25zZU1ldGFkYXRhIik7cmV0dXJuIGwmJih1LlJlc3BvbnNlTWV0YWRhdGE9YShsLHt9KSksdX1pZihvKXRocm93IHIuZXJyb3Iob3x8bmV3IEVycm9yLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7cmV0dXJue319LHQuZXhwb3J0cz1pfSx7Ii4uL21vZGVsL3NoYXBlIjo0NSwiLi4vdXRpbCI6NzR9XSw3NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4veG1sLW5vZGUiKS5YbWxOb2RlLGk9ZSgiLi94bWwtdGV4dCIpLlhtbFRleHQ7ZnVuY3Rpb24gcygpe31mdW5jdGlvbiBhKGUsdCxuKXtzd2l0Y2gobi50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtyLmFycmF5RWFjaChuLm1lbWJlck5hbWVzLChmdW5jdGlvbihyKXt2YXIgaT1uLm1lbWJlcnNbcl07aWYoImJvZHkiPT09aS5sb2NhdGlvbil7dmFyIHM9dFtyXSx1PWkubmFtZTtpZihudWxsIT1zKWlmKGkuaXNYbWxBdHRyaWJ1dGUpZS5hZGRBdHRyaWJ1dGUodSxzKTtlbHNlIGlmKGkuZmxhdHRlbmVkKWEoZSxzLGkpO2Vsc2V7dmFyIGw9bmV3IG8odSk7ZS5hZGRDaGlsZE5vZGUobCksYyhsLGkpLGEobCxzLGkpfX19KSl9KGUsdCxuKTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmtleS5uYW1lfHwia2V5IixzPW4udmFsdWUubmFtZXx8InZhbHVlIjtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgYz1uZXcgbyhuLmZsYXR0ZW5lZD9uLm5hbWU6ImVudHJ5Iik7ZS5hZGRDaGlsZE5vZGUoYyk7dmFyIHU9bmV3IG8oaSksbD1uZXcgbyhzKTtjLmFkZENoaWxkTm9kZSh1KSxjLmFkZENoaWxkTm9kZShsKSxhKHUsdCxuLmtleSksYShsLHIsbi52YWx1ZSl9KSl9KGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQsbil7bi5mbGF0dGVuZWQ/ci5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7dmFyIHI9bi5tZW1iZXIubmFtZXx8bi5uYW1lLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpOnIuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fCJtZW1iZXIiLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpfShlLHQsbik7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2UuYWRkQ2hpbGROb2RlKG5ldyBpKG4udG9XaXJlRm9ybWF0KHQpKSl9KGUsdCxuKX19ZnVuY3Rpb24gYyhlLHQsbil7dmFyIHIsbz0ieG1sbnMiO3QueG1sTmFtZXNwYWNlVXJpPyhyPXQueG1sTmFtZXNwYWNlVXJpLHQueG1sTmFtZXNwYWNlUHJlZml4JiYobys9IjoiK3QueG1sTmFtZXNwYWNlUHJlZml4KSk6biYmdC5hcGkueG1sTmFtZXNwYWNlVXJpJiYocj10LmFwaS54bWxOYW1lc3BhY2VVcmkpLHImJmUuYWRkQXR0cmlidXRlKG8scil9cy5wcm90b3R5cGUudG9YTUw9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bmV3IG8obik7cmV0dXJuIGMoaSx0LCEwKSxhKGksZSx0KSxpLmNoaWxkcmVuLmxlbmd0aD4wfHxyP2kudG9TdHJpbmcoKToiIn0sdC5leHBvcnRzPXN9LHsiLi4vdXRpbCI6NzQsIi4veG1sLW5vZGUiOjc5LCIuL3htbC10ZXh0Ijo4MH1dLDc3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVBdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLycvZywiJmFwb3M7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX19fSx7fV0sNzg6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2VzY2FwZUVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoL1xyL2csIiYjeDBEOyIpLnJlcGxhY2UoL1xuL2csIiYjeDBBOyIpLnJlcGxhY2UoL1x1MDA4NS9nLCImI3g4NTsiKS5yZXBsYWNlKC9cdTIwMjgvLCImI3gyMDI4OyIpfX19LHt9XSw3OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWF0dHJpYnV0ZSIpLmVzY2FwZUF0dHJpYnV0ZTtmdW5jdGlvbiBvKGUsdCl7dm9pZCAwPT09dCYmKHQ9W10pLHRoaXMubmFtZT1lLHRoaXMuY2hpbGRyZW49dCx0aGlzLmF0dHJpYnV0ZXM9e319by5wcm90b3R5cGUuYWRkQXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tlXT10LHRoaXN9LG8ucHJvdG90eXBlLmFkZENoaWxkTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5wdXNoKGUpLHRoaXN9LG8ucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tlXSx0aGlzfSxvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1Cb29sZWFuKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSx0PSI8Iit0aGlzLm5hbWUsbj10aGlzLmF0dHJpYnV0ZXMsbz0wLGk9T2JqZWN0LmtleXMobik7bzxpLmxlbmd0aDtvKyspe3ZhciBzPWlbb10sYT1uW3NdO251bGwhPWEmJih0Kz0iICIrcysnPSInK3IoIiIrYSkrJyInKX1yZXR1cm4gdCsoZT8iPiIrdGhpcy5jaGlsZHJlbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KSkuam9pbigiIikrIjwvIit0aGlzLm5hbWUrIj4iOiIvPiIpfSx0LmV4cG9ydHM9e1htbE5vZGU6b319LHsiLi9lc2NhcGUtYXR0cmlidXRlIjo3N31dLDgwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9lc2NhcGUtZWxlbWVudCIpLmVzY2FwZUVsZW1lbnQ7ZnVuY3Rpb24gbyhlKXt0aGlzLnZhbHVlPWV9by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcigiIit0aGlzLnZhbHVlKX0sdC5leHBvcnRzPXtYbWxUZXh0Om99fSx7Ii4vZXNjYXBlLWVsZW1lbnQiOjc4fV0sODE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5ieXRlTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWMoZSksbj10WzBdLHI9dFsxXTtyZXR1cm4gMyoobityKS80LXJ9LG4udG9CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWMoZSkscz1yWzBdLGE9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMyoodCtuKS80LW59KDAscyxhKSksbD0wLHA9YT4wP3MtNDpzO2ZvcihuPTA7bjxwO24rPTQpdD1vW2UuY2hhckNvZGVBdChuKV08PDE4fG9bZS5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW2UuY2hhckNvZGVBdChuKzIpXTw8NnxvW2UuY2hhckNvZGVBdChuKzMpXSx1W2wrK109dD4+MTYmMjU1LHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQ7cmV0dXJuIDI9PT1hJiYodD1vW2UuY2hhckNvZGVBdChuKV08PDJ8b1tlLmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZ0KSwxPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwxMHxvW2UuY2hhckNvZGVBdChuKzEpXTw8NHxvW2UuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0KSx1fSxuLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZS5sZW5ndGgsbz1uJTMsaT1bXSxzPTE2MzgzLGE9MCxjPW4tbzthPGM7YSs9cylpLnB1c2godShlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PW8/KHQ9ZVtuLTFdLGkucHVzaChyW3Q+PjJdK3JbdDw8NCY2M10rIj09IikpOjI9PT1vJiYodD0oZVtuLTJdPDw4KStlW24tMV0saS5wdXNoKHJbdD4+MTBdK3JbdD4+NCY2M10rclt0PDwyJjYzXSsiPSIpKSxpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LHM9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGE9MDthPDY0OysrYSlyW2FdPXNbYV0sb1tzLmNoYXJDb2RlQXQoYSldPWE7ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmxlbmd0aDtpZih0JTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj1lLmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPXQpLFtuLG49PT10PzA6NC1uJTRdfWZ1bmN0aW9uIHUoZSx0LG4pe2Zvcih2YXIgbyxpLHM9W10sYT10O2E8bjthKz0zKW89KGVbYV08PDE2JjE2NzExNjgwKSsoZVthKzFdPDw4JjY1MjgwKSsoMjU1JmVbYSsyXSkscy5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBzLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sODI6W2Z1bmN0aW9uKGUsdCxuKXt9LHt9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OnQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fSx7fV0sODQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29weSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZmlsbCYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmVhZFVJbnQ4fX0se31dLDg1OltmdW5jdGlvbihlLHQscil7KGZ1bmN0aW9uKHQsbil7KGZ1bmN0aW9uKCl7dmFyIG89LyVbc2RqJV0vZztyLmZvcm1hdD1mdW5jdGlvbihlKXtpZighdihlKSl7Zm9yKHZhciB0PVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhKGFyZ3VtZW50c1tuXSkpO3JldHVybiB0LmpvaW4oIiAiKX1uPTE7Zm9yKHZhciByPWFyZ3VtZW50cyxpPXIubGVuZ3RoLHM9U3RyaW5nKGUpLnJlcGxhY2UobywoZnVuY3Rpb24oZSl7aWYoIiUlIj09PWUpcmV0dXJuIiUiO2lmKG4+PWkpcmV0dXJuIGU7c3dpdGNoKGUpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcocltuKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKHJbbisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShyW24rK10pfWNhdGNoKGUpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiBlfX0pKSxjPXJbbl07bjxpO2M9clsrK25dKWcoYyl8fCFTKGMpP3MrPSIgIitjOnMrPSIgIithKGMpO3JldHVybiBzfSxyLmRlcHJlY2F0ZT1mdW5jdGlvbihlLG8pe2lmKHkobi5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gci5kZXByZWNhdGUoZSxvKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09dC5ub0RlcHJlY2F0aW9uKXJldHVybiBlO3ZhciBpPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFpKXtpZih0LnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKG8pO3QudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKG8pOmNvbnNvbGUuZXJyb3IobyksaT0hMH1yZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTt2YXIgaSxzPXt9O2Z1bmN0aW9uIGEoZSx0KXt2YXIgbj17c2VlbjpbXSxzdHlsaXplOnV9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYobi5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihuLmNvbG9ycz1hcmd1bWVudHNbM10pLGYodCk/bi5zaG93SGlkZGVuPXQ6dCYmci5fZXh0ZW5kKG4sdCkseShuLnNob3dIaWRkZW4pJiYobi5zaG93SGlkZGVuPSExKSx5KG4uZGVwdGgpJiYobi5kZXB0aD0yKSx5KG4uY29sb3JzKSYmKG4uY29sb3JzPSExKSx5KG4uY3VzdG9tSW5zcGVjdCkmJihuLmN1c3RvbUluc3BlY3Q9ITApLG4uY29sb3JzJiYobi5zdHlsaXplPWMpLGwobixlLG4uZGVwdGgpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1hLnN0eWxlc1t0XTtyZXR1cm4gbj8iG1siK2EuY29sb3JzW25dWzBdKyJtIitlKyIbWyIrYS5jb2xvcnNbbl1bMV0rIm0iOmV9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBlfWZ1bmN0aW9uIGwoZSx0LG4pe2lmKGUuY3VzdG9tSW5zcGVjdCYmdCYmVCh0Lmluc3BlY3QpJiZ0Lmluc3BlY3QhPT1yLmluc3BlY3QmJighdC5jb25zdHJ1Y3Rvcnx8dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT10KSl7dmFyIG89dC5pbnNwZWN0KG4sZSk7cmV0dXJuIHYobyl8fChvPWwoZSxvLG4pKSxvfXZhciBpPWZ1bmN0aW9uKGUsdCl7aWYoeSh0KSlyZXR1cm4gZS5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZih2KHQpKXt2YXIgbj0iJyIrSlNPTi5zdHJpbmdpZnkodCkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gZS5zdHlsaXplKG4sInN0cmluZyIpfXJldHVybiBtKHQpP2Uuc3R5bGl6ZSgiIit0LCJudW1iZXIiKTpmKHQpP2Uuc3R5bGl6ZSgiIit0LCJib29sZWFuIik6Zyh0KT9lLnN0eWxpemUoIm51bGwiLCJudWxsIik6dm9pZCAwfShlLHQpO2lmKGkpcmV0dXJuIGk7dmFyIHM9T2JqZWN0LmtleXModCksYT1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3RbZV09ITB9KSksdH0ocyk7aWYoZS5zaG93SGlkZGVuJiYocz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSksQyh0KSYmKHMuaW5kZXhPZigibWVzc2FnZSIpPj0wfHxzLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiBwKHQpO2lmKDA9PT1zLmxlbmd0aCl7aWYoVCh0KSl7dmFyIGM9dC5uYW1lPyI6ICIrdC5uYW1lOiIiO3JldHVybiBlLnN0eWxpemUoIltGdW5jdGlvbiIrYysiXSIsInNwZWNpYWwiKX1pZihFKHQpKXJldHVybiBlLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTtpZihiKHQpKXJldHVybiBlLnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwiZGF0ZSIpO2lmKEModCkpcmV0dXJuIHAodCl9dmFyIHUsUz0iIixJPSExLEE9WyJ7IiwifSJdO3JldHVybiBoKHQpJiYoST0hMCxBPVsiWyIsIl0iXSksVCh0KSYmKFM9IiBbRnVuY3Rpb24iKyh0Lm5hbWU/IjogIit0Lm5hbWU6IiIpKyJdIiksRSh0KSYmKFM9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSksYih0KSYmKFM9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodCkpLEModCkmJihTPSIgIitwKHQpKSwwIT09cy5sZW5ndGh8fEkmJjAhPXQubGVuZ3RoP248MD9FKHQpP2Uuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksInJlZ2V4cCIpOmUuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KGUuc2Vlbi5wdXNoKHQpLHU9ST9mdW5jdGlvbihlLHQsbixyLG8pe2Zvcih2YXIgaT1bXSxzPTAsYT10Lmxlbmd0aDtzPGE7KytzKXcodCxTdHJpbmcocykpP2kucHVzaChkKGUsdCxuLHIsU3RyaW5nKHMpLCEwKSk6aS5wdXNoKCIiKTtyZXR1cm4gby5mb3JFYWNoKChmdW5jdGlvbihvKXtvLm1hdGNoKC9eXGQrJC8pfHxpLnB1c2goZChlLHQsbixyLG8sITApKX0pKSxpfShlLHQsbixhLHMpOnMubWFwKChmdW5jdGlvbihyKXtyZXR1cm4gZChlLHQsbixhLHIsSSl9KSksZS5zZWVuLnBvcCgpLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5pbmRleE9mKCJcbiIpLGUrdC5yZXBsYWNlKC9cdTAwMWJcW1xkXGQ/bS9nLCIiKS5sZW5ndGgrMX0pLDApO3JldHVybiByPjYwP25bMF0rKCIiPT09dD8iIjp0KyJcbiAiKSsiICIrZS5qb2luKCIsXG4gICIpKyIgIituWzFdOm5bMF0rdCsiICIrZS5qb2luKCIsICIpKyIgIituWzFdfSh1LFMsQSkpOkFbMF0rUytBWzFdfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKyJdIn1mdW5jdGlvbiBkKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGM7aWYoKGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG8pfHx7dmFsdWU6dFtvXX0pLmdldD9hPWMuc2V0P2Uuc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOmUuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6Yy5zZXQmJihhPWUuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLHcocixvKXx8KHM9IlsiK28rIl0iKSxhfHwoZS5zZWVuLmluZGV4T2YoYy52YWx1ZSk8MD8oYT1nKG4pP2woZSxjLnZhbHVlLG51bGwpOmwoZSxjLnZhbHVlLG4tMSkpLmluZGV4T2YoIlxuIik+LTEmJihhPWk/YS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiIgICIrZX0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAgIitlfSkpLmpvaW4oIlxuIikpOmE9ZS5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSx5KHMpKXtpZihpJiZvLm1hdGNoKC9eXGQrJC8pKXJldHVybiBhOyhzPUpTT04uc3RyaW5naWZ5KCIiK28pKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz1lLnN0eWxpemUocywibmFtZSIpKToocz1zLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxzPWUuc3R5bGl6ZShzLCJzdHJpbmciKSl9cmV0dXJuIHMrIjogIithfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gZihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGcoZSl7cmV0dXJuIG51bGw9PT1lfWZ1bmN0aW9uIG0oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfWZ1bmN0aW9uIHYoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gRShlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgUmVnRXhwXSI9PT1JKGUpfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBiKGUpe3JldHVybiBTKGUpJiYiW29iamVjdCBEYXRlXSI9PT1JKGUpfWZ1bmN0aW9uIEMoZSl7cmV0dXJuIFMoZSkmJigiW29iamVjdCBFcnJvcl0iPT09SShlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBUKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBBKGUpe3JldHVybiBlPDEwPyIwIitlLnRvU3RyaW5nKDEwKTplLnRvU3RyaW5nKDEwKX1yLmRlYnVnbG9nPWZ1bmN0aW9uKGUpe2lmKHkoaSkmJihpPXQuZW52Lk5PREVfREVCVUd8fCIiKSxlPWUudG9VcHBlckNhc2UoKSwhc1tlXSlpZihuZXcgUmVnRXhwKCJcXGIiK2UrIlxcYiIsImkiKS50ZXN0KGkpKXt2YXIgbj10LnBpZDtzW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9ci5mb3JtYXQuYXBwbHkocixhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsZSxuLHQpfX1lbHNlIHNbZV09ZnVuY3Rpb24oKXt9O3JldHVybiBzW2VdfSxyLmluc3BlY3Q9YSxhLmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0sYS5zdHlsZXM9e3NwZWNpYWw6ImN5YW4iLG51bWJlcjoieWVsbG93Iixib29sZWFuOiJ5ZWxsb3ciLHVuZGVmaW5lZDoiZ3JleSIsbnVsbDoiYm9sZCIsc3RyaW5nOiJncmVlbiIsZGF0ZToibWFnZW50YSIscmVnZXhwOiJyZWQifSxyLmlzQXJyYXk9aCxyLmlzQm9vbGVhbj1mLHIuaXNOdWxsPWcsci5pc051bGxPclVuZGVmaW5lZD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZX0sci5pc051bWJlcj1tLHIuaXNTdHJpbmc9dixyLmlzU3ltYm9sPWZ1bmN0aW9uKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZX0sci5pc1VuZGVmaW5lZD15LHIuaXNSZWdFeHA9RSxyLmlzT2JqZWN0PVMsci5pc0RhdGU9YixyLmlzRXJyb3I9QyxyLmlzRnVuY3Rpb249VCxyLmlzUHJpbWl0aXZlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3RyaW5nIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8dm9pZCAwPT09ZX0sci5pc0J1ZmZlcj1lKCIuL3N1cHBvcnQvaXNCdWZmZXIiKTt2YXIgXz1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO2Z1bmN0aW9uIHcoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ci5sb2c9ZnVuY3Rpb24oKXt2YXIgZSx0O2NvbnNvbGUubG9nKCIlcyAtICVzIiwoZT1uZXcgRGF0ZSx0PVtBKGUuZ2V0SG91cnMoKSksQShlLmdldE1pbnV0ZXMoKSksQShlLmdldFNlY29uZHMoKSldLmpvaW4oIjoiKSxbZS5nZXREYXRlKCksX1tlLmdldE1vbnRoKCldLHRdLmpvaW4oIiAiKSksci5mb3JtYXQuYXBwbHkocixhcmd1bWVudHMpKX0sci5pbmhlcml0cz1lKCJpbmhlcml0cyIpLHIuX2V4dGVuZD1mdW5jdGlvbihlLHQpe2lmKCF0fHwhUyh0KSlyZXR1cm4gZTtmb3IodmFyIG49T2JqZWN0LmtleXModCkscj1uLmxlbmd0aDtyLS07KWVbbltyXV09dFtuW3JdXTtyZXR1cm4gZX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vc3VwcG9ydC9pc0J1ZmZlciI6ODQsX3Byb2Nlc3M6OTEsaW5oZXJpdHM6ODN9XSw4NjpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1lKCJiYXNlNjQtanMiKSxvPWUoImllZWU3NTQiKSxpPWUoImlzYXJyYXkiKTtmdW5jdGlvbiBzKCl7cmV0dXJuIGMuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gYShlLHQpe2lmKHMoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBjKHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIGMoZSx0LG4pe2lmKCEoYy5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgYykpcmV0dXJuIG5ldyBjKGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIHAodGhpcyxlKX1yZXR1cm4gdSh0aGlzLGUsdCxuKX1mdW5jdGlvbiB1KGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7cmV0dXJuIHQ9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQsbik6bmV3IFVpbnQ4QXJyYXkodCxuLHIpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Yy5wcm90b3R5cGU6ZT1kKGUsdCksZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKSwhYy5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8Zih0LG4pLG89KGU9YShlLHIpKS53cml0ZSh0LG4pO3JldHVybiBvIT09ciYmKGU9ZS5zbGljZSgwLG8pKSxlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZihjLmlzQnVmZmVyKHQpKXt2YXIgbj0wfGgodC5sZW5ndGgpO3JldHVybiAwPT09KGU9YShlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/YShlLDApOmQoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmaSh0LmRhdGEpKXJldHVybiBkKGUsdC5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gbChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIHAoZSx0KXtpZihsKHQpLGU9YShlLHQ8MD8wOjB8aCh0KSksIWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPHQ7KytuKWVbbl09MDtyZXR1cm4gZX1mdW5jdGlvbiBkKGUsdCl7dmFyIG49dC5sZW5ndGg8MD8wOjB8aCh0Lmxlbmd0aCk7ZT1hKGUsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpZVtyXT0yNTUmdFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBoKGUpe2lmKGU+PXMoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrcygpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBmKGUsdCl7aWYoYy5pc0J1ZmZlcihlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIG49ZS5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gQihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIGooZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gQihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKGUsdCxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIF8odGhpcyx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBSKHRoaXMsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIEEodGhpcyx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gTih0aGlzLHQsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBtKGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gdihlLHQsbixyLG8pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDplLmxlbmd0aC0xKSxuPDAmJihuPWUubGVuZ3RoK24pLG4+PWUubGVuZ3RoKXtpZihvKXJldHVybi0xO249ZS5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9Yy5mcm9tKHQscikpLGMuaXNCdWZmZXIodCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTp5KGUsdCxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsYy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQsbik6eShlLFt0XSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24geShlLHQsbixyLG8pe3ZhciBpLHM9MSxhPWUubGVuZ3RoLGM9dC5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89MixjLz0yLG4vPTJ9ZnVuY3Rpb24gdShlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPGE7aSsrKWlmKHUoZSxpKT09PXUodCwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09YylyZXR1cm4gbCpzfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3IobitjPmEmJihuPWEtYyksaT1uO2k+PTA7aS0tKXtmb3IodmFyIHA9ITAsZD0wO2Q8YztkKyspaWYodShlLGkrZCkhPT11KHQsZCkpe3A9ITE7YnJlYWt9aWYocClyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBFKGUsdCxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPWUubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT10Lmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW24rc109YX1yZXR1cm4gc31mdW5jdGlvbiBTKGUsdCxuLHIpe3JldHVybiBWKEIodCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gYihlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KytuKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gdH0odCksZSxuLHIpfWZ1bmN0aW9uIEMoZSx0LG4scil7cmV0dXJuIGIoZSx0LG4scil9ZnVuY3Rpb24gVChlLHQsbixyKXtyZXR1cm4gVihqKHQpLGUsbixyKX1mdW5jdGlvbiBJKGUsdCxuLHIpe3JldHVybiBWKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsbyxpPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpcj0obj1lLmNoYXJDb2RlQXQocykpPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gQShlLHQscil7cmV0dXJuIDA9PT10JiZyPT09ZS5sZW5ndGg/bi5mcm9tQnl0ZUFycmF5KGUpOm4uZnJvbUJ5dGVBcnJheShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIF8oZSx0LG4pe249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89dDtvPG47KXt2YXIgaSxzLGEsYyx1PWVbb10sbD1udWxsLHA9dT4yMzk/NDp1PjIyMz8zOnU+MTkxPzI6MTtpZihvK3A8PW4pc3dpdGNoKHApe2Nhc2UgMTp1PDEyOCYmKGw9dSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT1lW28rMV0pKSYmKGM9KDMxJnUpPDw2fDYzJmkpPjEyNyYmKGw9Yyk7YnJlYWs7Y2FzZSAzOmk9ZVtvKzFdLHM9ZVtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmdSk8PDEyfCg2MyZpKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJihsPWMpO2JyZWFrO2Nhc2UgNDppPWVbbysxXSxzPWVbbysyXSxhPWVbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYoYz0oMTUmdSk8PDE4fCg2MyZpKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZjPDExMTQxMTImJihsPWMpfW51bGw9PT1sPyhsPTY1NTMzLHA9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1wfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD13KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTtmb3IodmFyIG49IiIscj0wO3I8dDspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZS5zbGljZShyLHIrPXcpKTtyZXR1cm4gbn0ocil9ci5CdWZmZXI9YyxyLlNsb3dCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuK2UhPWUmJihlPTApLGMuYWxsb2MoK2UpfSxyLklOU1BFQ1RfTUFYX0JZVEVTPTUwLGMuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT10LlRZUEVEX0FSUkFZX1NVUFBPUlQ/dC5UWVBFRF9BUlJBWV9TVVBQT1JUOmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBlLl9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09ZS5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc3ViYXJyYXkmJjA9PT1lLnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaChlKXtyZXR1cm4hMX19KCksci5rTWF4TGVuZ3RoPXMoKSxjLnBvb2xTaXplPTgxOTIsYy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Yy5wcm90b3R5cGUsZX0sYy5mcm9tPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdShudWxsLGUsdCxuKX0sYy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoYy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGMuX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZjW1N5bWJvbC5zcGVjaWVzXT09PWMmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSxjLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGwodCksdDw9MD9hKGUsdCk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI/YShlLHQpLmZpbGwobixyKTphKGUsdCkuZmlsbChuKTphKGUsdCl9KG51bGwsZSx0LG4pfSxjLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBwKG51bGwsZSl9LGMuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe3JldHVybiBwKG51bGwsZSl9LGMuaXNCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfSxjLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighYy5pc0J1ZmZlcihlKXx8IWMuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT10KXJldHVybiAwO2Zvcih2YXIgbj1lLmxlbmd0aCxyPXQubGVuZ3RoLG89MCxpPU1hdGgubWluKG4scik7bzxpOysrbylpZihlW29dIT09dFtvXSl7bj1lW29dLHI9dFtvXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LGMuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYy5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighaShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBjLmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7dmFyIHI9Yy5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIHM9ZVtuXTtpZighYy5pc0J1ZmZlcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7cy5jb3B5KHIsbyksbys9cy5sZW5ndGh9cmV0dXJuIHJ9LGMuYnl0ZUxlbmd0aD1mLGMucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxjLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpbSh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz00KW0odGhpcyx0LHQrMyksbSh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTgpbSh0aGlzLHQsdCs3KSxtKHRoaXMsdCsxLHQrNiksbSh0aGlzLHQrMix0KzUpLG0odGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9fKHRoaXMsMCxlKTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFjLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT1jLmNvbXBhcmUodGhpcyxlKX0sYy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiLHQ9ci5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLHQpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD50JiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGMucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4scixvKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxyPDB8fG8+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI+PW8mJnQ+PW4pcmV0dXJuIDA7aWYocj49bylyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgaT0obz4+Pj0wKS0ocj4+Pj0wKSxzPShuPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4oaSxzKSx1PXRoaXMuc2xpY2UocixvKSxsPWUuc2xpY2UodCxuKSxwPTA7cDxhOysrcClpZih1W3BdIT09bFtwXSl7aT11W3BdLHM9bFtwXTticmVha31yZXR1cm4gaTxzPy0xOnM8aT8xOjB9LGMucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQsbil9LGMucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITApfSxjLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHYodGhpcyxlLHQsbiwhMSl9LGMucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHZvaWQgMD09PXQpcj0idXRmOCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIHQpcj10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBvPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PW58fG4+bykmJihuPW8pLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBFKHRoaXMsZSx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIFModGhpcyxlLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIGIodGhpcyxlLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gQyh0aGlzLGUsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19LGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIHc9NDA5NjtmdW5jdGlvbiBSKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgbz10O288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gayhlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTChlLHQsbil7dmFyIHIsbz1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPm8pJiYobj1vKTtmb3IodmFyIGk9IiIscz10O3M8bjsrK3MpaSs9KHI9ZVtzXSk8MTY/IjAiK3IudG9TdHJpbmcoMTYpOnIudG9TdHJpbmcoMTYpO3JldHVybiBpfWZ1bmN0aW9uIE4oZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBPKGUsdCxuKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0Pm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBEKGUsdCxuLHIsbyxpKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5vfHx0PGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUChlLHQsbixyKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDIpO288aTsrK28pZVtuK29dPSh0JjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24geChlLHQsbixyKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKGUubGVuZ3RoLW4sNCk7bzxpOysrbyllW24rb109dD4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBNKGUsdCxuLHIsbyxpKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gVShlLHQsbixyLGkpe3JldHVybiBpfHxNKGUsMCxuLDQpLG8ud3JpdGUoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gRihlLHQsbixyLGkpe3JldHVybiBpfHxNKGUsMCxuLDgpLG8ud3JpdGUoZSx0LG4sciw1Miw4KSxuKzh9Yy5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSwodD12b2lkIDA9PT10P3I6fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLHQ8ZSYmKHQ9ZSksYy5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPWMucHJvdG90eXBlO2Vsc2V7dmFyIG89dC1lO249bmV3IGMobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krZV19cmV0dXJuIG59LGMucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0sbz0xLGk9MDsrK2k8dCYmKG8qPTI1Nik7KXIrPXRoaXNbZStpXSpvO3JldHVybiByfSxjLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxvPTE7dD4wJiYobyo9MjU2KTspcis9dGhpc1tlKy0tdF0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxjLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxjLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LGMucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sYy5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqdCkpLHJ9LGMucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dCxvPTEsaT10aGlzW2UrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW2UrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCp0KSksaX0sYy5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxjLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fE8oZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sYy5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LGMucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LGMucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCEwLDIzLDQpfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMSwyMyw0KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCEwLDUyLDgpfSxjLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsNTIsOCl9LGMucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2U9K2UsdHw9MCxufD0wLHJ8fEQodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8biYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2U9K2UsdHw9MCxufD0wLHJ8fEQodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz1uLTEsaT0xO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrbn0sYy5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDEsMjU1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOlAodGhpcyxlLHQsITApLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsNjU1MzUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6UCh0aGlzLGUsdCwhMSksdCsyfSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPTI1NSZlKTp4KHRoaXMsZSx0LCEwKSx0KzR9LGMucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOngodGhpcyxlLHQsITEpLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtpZihlPStlLHR8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO0QodGhpcyxlLHQsbixvLTEsLW8pfXZhciBpPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8biYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QraS0xXSYmKGE9MSksdGhpc1t0K2ldPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT1uLTEscz0xLGE9MDtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QraSsxXSYmKGE9MSksdGhpc1t0K2ldPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPTI1NSZlLHQrMX0sYy5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOlAodGhpcyxlLHQsITApLHQrMn0sYy5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFUodGhpcyxlLHQsITAsbil9LGMucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFUodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMSxuKX0sYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8ci1uJiYocj1lLmxlbmd0aC10K24pO3ZhciBvLGk9ci1uO2lmKHRoaXM9PT1lJiZuPHQmJnQ8cilmb3Iobz1pLTE7bz49MDstLW8pZVtvK3RdPXRoaXNbbytuXTtlbHNlIGlmKGk8MWUzfHwhYy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihvPTA7bzxpOysrbyllW28rdF09dGhpc1tvK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4sbitpKSx0KTtyZXR1cm4gaX0sYy5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdD8ocj10LHQ9MCxuPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIG4mJihyPW4sbj10aGlzLmxlbmd0aCksMT09PWUubGVuZ3RoKXt2YXIgbz1lLmNoYXJDb2RlQXQoMCk7bzwyNTYmJihlPW8pfWlmKHZvaWQgMCE9PXImJiJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiByJiYhYy5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD10KXJldHVybiB0aGlzO3ZhciBpO2lmKHQ+Pj49MCxuPXZvaWQgMD09PW4/dGhpcy5sZW5ndGg6bj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihpPXQ7aTxuOysraSl0aGlzW2ldPWU7ZWxzZXt2YXIgcz1jLmlzQnVmZmVyKGUpP2U6QihuZXcgYyhlLHIpLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKGk9MDtpPG4tdDsrK2kpdGhpc1tpK3RdPXNbaSVhXX1yZXR1cm4gdGhpc307dmFyIHE9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gQihlLHQpe3ZhciBuO3Q9dHx8MS8wO2Zvcih2YXIgcj1lLmxlbmd0aCxvPW51bGwsaT1bXSxzPTA7czxyOysrcyl7aWYoKG49ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmbjw1NzM0NCl7aWYoIW8pe2lmKG4+NTYzMTkpeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1yKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPW47Y29udGludWV9bj02NTUzNisoby01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBvJiYodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLG48MTI4KXtpZigodC09MSk8MClicmVhaztpLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO2kucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigodC09Myk8MClicmVhaztpLnB1c2gobj4+MTJ8MjI0LG4+PjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO2kucHVzaChuPj4xOHwyNDAsbj4+MTImNjN8MTI4LG4+PjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gaihlKXtyZXR1cm4gbi50b0J5dGVBcnJheShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHEsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIFYoZSx0LG4scil7Zm9yKHZhciBvPTA7bzxyJiYhKG8rbj49dC5sZW5ndGh8fG8+PWUubGVuZ3RoKTsrK28pdFtvK25dPWVbb107cmV0dXJuIG99fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxlKCJidWZmZXIiKS5CdWZmZXIpfSx7ImJhc2U2NC1qcyI6ODEsYnVmZmVyOjg2LGllZWU3NTQ6ODgsaXNhcnJheTo4OX1dLDg3OltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBvKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBzKGUpe3JldHVybiB2b2lkIDA9PT1lfXQuZXhwb3J0cz1yLHIuRXZlbnRFbWl0dGVyPXIsci5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsci5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsci5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLHIucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGV8fGU8MHx8aXNOYU4oZSkpdGhyb3cgVHlwZUVycm9yKCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc30sci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsYSxjLHU7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSwiZXJyb3IiPT09ZSYmKCF0aGlzLl9ldmVudHMuZXJyb3J8fGkodGhpcy5fZXZlbnRzLmVycm9yKSYmIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKXtpZigodD1hcmd1bWVudHNbMV0paW5zdGFuY2VvZiBFcnJvcil0aHJvdyB0O3ZhciBsPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK3QrIikiKTt0aHJvdyBsLmNvbnRleHQ9dCxsfWlmKHMobj10aGlzLl9ldmVudHNbZV0pKXJldHVybiExO2lmKG8obikpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbi5hcHBseSh0aGlzLGEpfWVsc2UgaWYoaShuKSlmb3IoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkscj0odT1uLnNsaWNlKCkpLmxlbmd0aCxjPTA7YzxyO2MrKyl1W2NdLmFwcGx5KHRoaXMsYSk7cmV0dXJuITB9LHIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gdGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSx0aGlzLl9ldmVudHMubmV3TGlzdGVuZXImJnRoaXMuZW1pdCgibmV3TGlzdGVuZXIiLGUsbyh0Lmxpc3RlbmVyKT90Lmxpc3RlbmVyOnQpLHRoaXMuX2V2ZW50c1tlXT9pKHRoaXMuX2V2ZW50c1tlXSk/dGhpcy5fZXZlbnRzW2VdLnB1c2godCk6dGhpcy5fZXZlbnRzW2VdPVt0aGlzLl9ldmVudHNbZV0sdF06dGhpcy5fZXZlbnRzW2VdPXQsaSh0aGlzLl9ldmVudHNbZV0pJiYhdGhpcy5fZXZlbnRzW2VdLndhcm5lZCYmKG49cyh0aGlzLl9tYXhMaXN0ZW5lcnMpP3IuZGVmYXVsdE1heExpc3RlbmVyczp0aGlzLl9tYXhMaXN0ZW5lcnMpJiZuPjAmJnRoaXMuX2V2ZW50c1tlXS5sZW5ndGg+biYmKHRoaXMuX2V2ZW50c1tlXS53YXJuZWQ9ITAsY29uc29sZS5lcnJvcigiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4iLHRoaXMuX2V2ZW50c1tlXS5sZW5ndGgpLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpLHRoaXN9LHIucHJvdG90eXBlLm9uPXIucHJvdG90eXBlLmFkZExpc3RlbmVyLHIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtpZighbyh0KSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBuPSExO2Z1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUxpc3RlbmVyKGUsciksbnx8KG49ITAsdC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiByLmxpc3RlbmVyPXQsdGhpcy5vbihlLHIpLHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLGE7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW2VdKXJldHVybiB0aGlzO2lmKHM9KG49dGhpcy5fZXZlbnRzW2VdKS5sZW5ndGgscj0tMSxuPT09dHx8byhuLmxpc3RlbmVyKSYmbi5saXN0ZW5lcj09PXQpZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCk7ZWxzZSBpZihpKG4pKXtmb3IoYT1zO2EtLSA+MDspaWYoblthXT09PXR8fG5bYV0ubGlzdGVuZXImJm5bYV0ubGlzdGVuZXI9PT10KXtyPWE7YnJlYWt9aWYocjwwKXJldHVybiB0aGlzOzE9PT1uLmxlbmd0aD8obi5sZW5ndGg9MCxkZWxldGUgdGhpcy5fZXZlbnRzW2VdKTpuLnNwbGljZShyLDEpLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSx0KX1yZXR1cm4gdGhpc30sci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW2VdJiZkZWxldGUgdGhpcy5fZXZlbnRzW2VdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih0IGluIHRoaXMuX2V2ZW50cykicmVtb3ZlTGlzdGVuZXIiIT09dCYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnModCk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz17fSx0aGlzfWlmKG8obj10aGlzLl9ldmVudHNbZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuKTtlbHNlIGlmKG4pZm9yKDtuLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcihlLG5bbi5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW2VdLHRoaXN9LHIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbZV0/byh0aGlzLl9ldmVudHNbZV0pP1t0aGlzLl9ldmVudHNbZV1dOnRoaXMuX2V2ZW50c1tlXS5zbGljZSgpOltdfSxyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2V2ZW50cyl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKG8odCkpcmV0dXJuIDE7aWYodClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9LHIubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxpc3RlbmVyQ291bnQodCl9fSx7fV0sODg6W2Z1bmN0aW9uKGUsdCxuKXtuLnJlYWQ9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaSxzLGE9OCpvLXItMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LHA9bj9vLTE6MCxkPW4/LTE6MSxoPWVbdCtwXTtmb3IocCs9ZCxpPWgmKDE8PC1sKS0xLGg+Pj0tbCxsKz1hO2w+MDtpPTI1NippK2VbdCtwXSxwKz1kLGwtPTgpO2ZvcihzPWkmKDE8PC1sKS0xLGk+Pj0tbCxsKz1yO2w+MDtzPTI1NipzK2VbdCtwXSxwKz1kLGwtPTgpO2lmKDA9PT1pKWk9MS11O2Vsc2V7aWYoaT09PWMpcmV0dXJuIHM/TmFOOjEvMCooaD8tMToxKTtzKz1NYXRoLnBvdygyLHIpLGktPXV9cmV0dXJuKGg/LTE6MSkqcypNYXRoLnBvdygyLGktcil9LG4ud3JpdGU9ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBzLGEsYyx1PTgqaS1vLTEsbD0oMTw8dSktMSxwPWw+PjEsZD0yMz09PW8/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmktMSxmPXI/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK3A+PTE/ZC9jOmQqTWF0aC5wb3coMiwxLXApKSpjPj0yJiYocysrLGMvPTIpLHMrcD49bD8oYT0wLHM9bCk6cytwPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixvKSxzKz1wKTooYT10Kk1hdGgucG93KDIscC0xKSpNYXRoLnBvdygyLG8pLHM9MCkpO28+PTg7ZVtuK2hdPTI1NSZhLGgrPWYsYS89MjU2LG8tPTgpO2ZvcihzPXM8PG98YSx1Kz1vO3U+MDtlW24raF09MjU1JnMsaCs9ZixzLz0yNTYsdS09OCk7ZVtuK2gtZl18PTEyOCpnfX0se31dLDg5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PXIuY2FsbChlKX19LHt9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbnVsbCE9PWUmJiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbCE9PWUmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHIoZSxvKXtpZihlPT09bylyZXR1cm4hMDtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykpcmV0dXJuITE7aWYoITA9PT10KGUpKXtpZihlLmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKCExPT09cihlW2ldLG9baV0pKXJldHVybiExO3JldHVybiEwfWlmKCEwPT09bihlKSl7dmFyIHM9e307Zm9yKHZhciBhIGluIGUpaWYoaGFzT3duUHJvcGVydHkuY2FsbChlLGEpKXtpZighMT09PXIoZVthXSxvW2FdKSlyZXR1cm4hMTtzW2FdPSEwfWZvcih2YXIgYyBpbiBvKWlmKGhhc093blByb3BlcnR5LmNhbGwobyxjKSYmITAhPT1zW2NdKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIG8oZSl7aWYoIiI9PT1lfHwhMT09PWV8fG51bGw9PT1lKXJldHVybiEwO2lmKHQoZSkmJjA9PT1lLmxlbmd0aClyZXR1cm4hMDtpZihuKGUpKXtmb3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfXZhciBpO2k9ImZ1bmN0aW9uIj09dHlwZW9mIFN0cmluZy5wcm90b3R5cGUudHJpbUxlZnQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbUxlZnQoKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyooLiopLylbMV19O3ZhciBzPTAsYT0xLGM9Mix1PTMsbD00LHA9NixkPTgsaD05LGY9ezA6Im51bWJlciIsMToiYW55IiwyOiJzdHJpbmciLDM6ImFycmF5Iiw0OiJvYmplY3QiLDU6ImJvb2xlYW4iLDY6ImV4cHJlc3Npb24iLDc6Im51bGwiLDg6IkFycmF5PG51bWJlcj4iLDk6IkFycmF5PHN0cmluZz4ifSxnPSJFT0YiLG09IlVucXVvdGVkSWRlbnRpZmllciIsdj0iUXVvdGVkSWRlbnRpZmllciIseT0iUmJyYWNrZXQiLEU9IlJwYXJlbiIsUz0iQ29tbWEiLGI9IkNvbG9uIixDPSJSYnJhY2UiLFQ9Ik51bWJlciIsST0iQ3VycmVudCIsQT0iRXhwcmVmIixfPSJQaXBlIix3PSJPciIsUj0iQW5kIixrPSJFUSIsTD0iR1QiLE49IkxUIixPPSJHVEUiLEQ9IkxURSIsUD0iTkUiLHg9IkZsYXR0ZW4iLE09IlN0YXIiLFU9IkZpbHRlciIsRj0iRG90IixxPSJOb3QiLEI9IkxicmFjZSIsaj0iTGJyYWNrZXQiLFY9IkxwYXJlbiIsVz0iTGl0ZXJhbCIsSD17Ii4iOkYsIioiOk0sIiwiOlMsIjoiOmIsInsiOkIsIn0iOkMsIl0iOnksIigiOlYsIikiOkUsIkAiOkl9LEc9eyI8IjohMCwiPiI6ITAsIj0iOiEwLCIhIjohMH0sej17IiAiOiEwLCJcdCI6ITAsIlxuIjohMH07ZnVuY3Rpb24gSyhlKXtyZXR1cm4gZT49IjAiJiZlPD0iOSJ8fCItIj09PWV9ZnVuY3Rpb24gWCgpe31YLnByb3RvdHlwZT17dG9rZW5pemU6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saT1bXTtmb3IodGhpcy5fY3VycmVudD0wO3RoaXMuX2N1cnJlbnQ8ZS5sZW5ndGg7KWlmKChvPWVbdGhpcy5fY3VycmVudF0pPj0iYSImJm88PSJ6Inx8bz49IkEiJiZvPD0iWiJ8fCJfIj09PW8pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6bSx2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKHZvaWQgMCE9PUhbZVt0aGlzLl9jdXJyZW50XV0paS5wdXNoKHt0eXBlOkhbZVt0aGlzLl9jdXJyZW50XV0sdmFsdWU6ZVt0aGlzLl9jdXJyZW50XSxzdGFydDp0aGlzLl9jdXJyZW50fSksdGhpcy5fY3VycmVudCsrO2Vsc2UgaWYoSyhlW3RoaXMuX2N1cnJlbnRdKSlyPXRoaXMuX2NvbnN1bWVOdW1iZXIoZSksaS5wdXNoKHIpO2Vsc2UgaWYoIlsiPT09ZVt0aGlzLl9jdXJyZW50XSlyPXRoaXMuX2NvbnN1bWVMQnJhY2tldChlKSxpLnB1c2gocik7ZWxzZSBpZignIic9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVRdW90ZWRJZGVudGlmaWVyKGUpLGkucHVzaCh7dHlwZTp2LHZhbHVlOm4sc3RhcnQ6dH0pO2Vsc2UgaWYoIiciPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUmF3U3RyaW5nTGl0ZXJhbChlKSxpLnB1c2goe3R5cGU6Vyx2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCJgIj09PWVbdGhpcy5fY3VycmVudF0pe3Q9dGhpcy5fY3VycmVudDt2YXIgcz10aGlzLl9jb25zdW1lTGl0ZXJhbChlKTtpLnB1c2goe3R5cGU6Vyx2YWx1ZTpzLHN0YXJ0OnR9KX1lbHNlIGlmKHZvaWQgMCE9PUdbZVt0aGlzLl9jdXJyZW50XV0paS5wdXNoKHRoaXMuX2NvbnN1bWVPcGVyYXRvcihlKSk7ZWxzZSBpZih2b2lkIDAhPT16W2VbdGhpcy5fY3VycmVudF1dKXRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKCImIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LHRoaXMuX2N1cnJlbnQrKywiJiI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50KyssaS5wdXNoKHt0eXBlOlIsdmFsdWU6IiYmIixzdGFydDp0fSkpOmkucHVzaCh7dHlwZTpBLHZhbHVlOiImIixzdGFydDp0fSk7ZWxzZXtpZigifCIhPT1lW3RoaXMuX2N1cnJlbnRdKXt2YXIgYT1uZXcgRXJyb3IoIlVua25vd24gY2hhcmFjdGVyOiIrZVt0aGlzLl9jdXJyZW50XSk7dGhyb3cgYS5uYW1lPSJMZXhlckVycm9yIixhfXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssInwiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTp3LHZhbHVlOiJ8fCIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6Xyx2YWx1ZToifCIsc3RhcnQ6dH0pfXJldHVybiBpfSxfY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2N1cnJlbnQ7Zm9yKHRoaXMuX2N1cnJlbnQrKzt0aGlzLl9jdXJyZW50PGUubGVuZ3RoJiYoKHQ9ZVt0aGlzLl9jdXJyZW50XSk+PSJhIiYmdDw9InoifHx0Pj0iQSImJnQ8PSJaInx8dD49IjAiJiZ0PD0iOSJ8fCJfIj09PXQpOyl0aGlzLl9jdXJyZW50Kys7cmV0dXJuIGUuc2xpY2Uobix0aGlzLl9jdXJyZW50KX0sX2NvbnN1bWVRdW90ZWRJZGVudGlmaWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsnIichPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYnIichPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssSlNPTi5wYXJzZShlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpfSxfY29uc3VtZVJhd1N0cmluZ0xpdGVyYWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciBuPWUubGVuZ3RoOyInIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8bjspe3ZhciByPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbcl18fCJcXCIhPT1lW3IrMV0mJiInIiE9PWVbcisxXT9yKys6cis9Mix0aGlzLl9jdXJyZW50PXJ9cmV0dXJuIHRoaXMuX2N1cnJlbnQrKyxlLnNsaWNlKHQrMSx0aGlzLl9jdXJyZW50LTEpLnJlcGxhY2UoIlxcJyIsIiciKX0sX2NvbnN1bWVOdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciBuPWUubGVuZ3RoO0soZVt0aGlzLl9jdXJyZW50XSkmJnRoaXMuX2N1cnJlbnQ8bjspdGhpcy5fY3VycmVudCsrO3ZhciByPXBhcnNlSW50KGUuc2xpY2UodCx0aGlzLl9jdXJyZW50KSk7cmV0dXJue3R5cGU6VCx2YWx1ZTpyLHN0YXJ0OnR9fSxfY29uc3VtZUxCcmFja2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiPyI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6VSx2YWx1ZToiWz8iLHN0YXJ0OnR9KToiXSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6eCx2YWx1ZToiW10iLHN0YXJ0OnR9KTp7dHlwZTpqLHZhbHVlOiJbIixzdGFydDp0fX0sX2NvbnN1bWVPcGVyYXRvcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50LG49ZVt0XTtyZXR1cm4gdGhpcy5fY3VycmVudCsrLCIhIj09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlAsdmFsdWU6IiE9IixzdGFydDp0fSk6e3R5cGU6cSx2YWx1ZToiISIsc3RhcnQ6dH06IjwiPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6RCx2YWx1ZToiPD0iLHN0YXJ0OnR9KTp7dHlwZTpOLHZhbHVlOiI8IixzdGFydDp0fToiPiI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpPLHZhbHVlOiI+PSIsc3RhcnQ6dH0pOnt0eXBlOkwsdmFsdWU6Ij4iLHN0YXJ0OnR9OiI9Ij09PW4mJiI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTprLHZhbHVlOiI9PSIsc3RhcnQ6dH0pOnZvaWQgMH0sX2NvbnN1bWVMaXRlcmFsOmZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIHQsbj10aGlzLl9jdXJyZW50LHI9ZS5sZW5ndGg7ImAiIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxyOyl7dmFyIG89dGhpcy5fY3VycmVudDsiXFwiIT09ZVtvXXx8IlxcIiE9PWVbbysxXSYmImAiIT09ZVtvKzFdP28rKzpvKz0yLHRoaXMuX2N1cnJlbnQ9b312YXIgcz1pKGUuc2xpY2Uobix0aGlzLl9jdXJyZW50KSk7cmV0dXJuIHM9cy5yZXBsYWNlKCJcXGAiLCJgIiksdD10aGlzLl9sb29rc0xpa2VKU09OKHMpP0pTT04ucGFyc2Uocyk6SlNPTi5wYXJzZSgnIicrcysnIicpLHRoaXMuX2N1cnJlbnQrKyx0fSxfbG9va3NMaWtlSlNPTjpmdW5jdGlvbihlKXtpZigiIj09PWUpcmV0dXJuITE7aWYoJ1t7IicuaW5kZXhPZihlWzBdKT49MClyZXR1cm4hMDtpZihbInRydWUiLCJmYWxzZSIsIm51bGwiXS5pbmRleE9mKGUpPj0wKXJldHVybiEwO2lmKCEoIi0wMTIzNDU2Nzg5Ii5pbmRleE9mKGVbMF0pPj0wKSlyZXR1cm4hMTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX07dmFyIFk9e307ZnVuY3Rpb24gJCgpe31mdW5jdGlvbiBKKGUpe3RoaXMucnVudGltZT1lfWZ1bmN0aW9uIFEoZSl7dGhpcy5faW50ZXJwcmV0ZXI9ZSx0aGlzLmZ1bmN0aW9uVGFibGU9e2Ficzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25BYnMsX3NpZ25hdHVyZTpbe3R5cGVzOltzXX1dfSxhdmc6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQXZnLF9zaWduYXR1cmU6W3t0eXBlczpbZF19XX0sY2VpbDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25DZWlsLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sY29udGFpbnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ29udGFpbnMsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHVdfSx7dHlwZXM6W2FdfV19LGVuZHNfd2l0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25FbmRzV2l0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2NdfV19LGZsb29yOntfZnVuYzp0aGlzLl9mdW5jdGlvbkZsb29yLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sbGVuZ3RoOntfZnVuYzp0aGlzLl9mdW5jdGlvbkxlbmd0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdSxsXX1dfSxtYXA6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWFwLF9zaWduYXR1cmU6W3t0eXBlczpbcF19LHt0eXBlczpbdV19XX0sbWF4OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heCxfc2lnbmF0dXJlOlt7dHlwZXM6W2QsaF19XX0sbWVyZ2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWVyZ2UsX3NpZ25hdHVyZTpbe3R5cGVzOltsXSx2YXJpYWRpYzohMH1dfSxtYXhfYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWF4QnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSxzdW06e19mdW5jOnRoaXMuX2Z1bmN0aW9uU3VtLF9zaWduYXR1cmU6W3t0eXBlczpbZF19XX0sc3RhcnRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uU3RhcnRzV2l0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2NdfV19LG1pbjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NaW4sX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1pbl9ieTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NaW5CeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LHR5cGU6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVHlwZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LGtleXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uS2V5cyxfc2lnbmF0dXJlOlt7dHlwZXM6W2xdfV19LHZhbHVlczp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25WYWx1ZXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSxzb3J0OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnQsX3NpZ25hdHVyZTpbe3R5cGVzOltoLGRdfV19LHNvcnRfYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uU29ydEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sam9pbjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Kb2luLF9zaWduYXR1cmU6W3t0eXBlczpbY119LHt0eXBlczpbaF19XX0scmV2ZXJzZTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25SZXZlcnNlLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX1dfSx0b19hcnJheTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub0FycmF5LF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sdG9fc3RyaW5nOntfZnVuYzp0aGlzLl9mdW5jdGlvblRvU3RyaW5nLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sdG9fbnVtYmVyOntfZnVuYzp0aGlzLl9mdW5jdGlvblRvTnVtYmVyLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sbm90X251bGw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTm90TnVsbCxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdLHZhcmlhZGljOiEwfV19fX1ZW2ddPTAsWVttXT0wLFlbdl09MCxZW3ldPTAsWVtFXT0wLFlbU109MCxZW0NdPTAsWVtUXT0wLFlbSV09MCxZW0FdPTAsWVtfXT0xLFlbd109MixZW1JdPTMsWVtrXT01LFlbTF09NSxZW05dPTUsWVtPXT01LFlbRF09NSxZW1BdPTUsWVt4XT05LFlbTV09MjAsWVtVXT0yMSxZW0ZdPTQwLFlbcV09NDUsWVtCXT01MCxZW2pdPTU1LFlbVl09NjAsJC5wcm90b3R5cGU9e3BhcnNlOmZ1bmN0aW9uKGUpe3RoaXMuX2xvYWRUb2tlbnMoZSksdGhpcy5pbmRleD0wO3ZhciB0PXRoaXMuZXhwcmVzc2lvbigwKTtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1nKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiVW5leHBlY3RlZCB0b2tlbiB0eXBlOiAiK24udHlwZSsiLCB2YWx1ZTogIituLnZhbHVlKTt0aHJvdyByLm5hbWU9IlBhcnNlckVycm9yIixyfXJldHVybiB0fSxfbG9hZFRva2VuczpmdW5jdGlvbihlKXt2YXIgdD0obmV3IFgpLnRva2VuaXplKGUpO3QucHVzaCh7dHlwZTpnLHZhbHVlOiIiLHN0YXJ0OmUubGVuZ3RofSksdGhpcy50b2tlbnM9dH0sZXhwcmVzc2lvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKTt0aGlzLl9hZHZhbmNlKCk7Zm9yKHZhciBuPXRoaXMubnVkKHQpLHI9dGhpcy5fbG9va2FoZWFkKDApO2U8WVtyXTspdGhpcy5fYWR2YW5jZSgpLG49dGhpcy5sZWQocixuKSxyPXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm4gbn0sX2xvb2thaGVhZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5pbmRleCtlXS50eXBlfSxfbG9va2FoZWFkVG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV19LF9hZHZhbmNlOmZ1bmN0aW9uKCl7dGhpcy5pbmRleCsrfSxudWQ6ZnVuY3Rpb24oZSl7dmFyIHQsbjtzd2l0Y2goZS50eXBlKXtjYXNlIFc6cmV0dXJue3R5cGU6IkxpdGVyYWwiLHZhbHVlOmUudmFsdWV9O2Nhc2UgbTpyZXR1cm57dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07Y2FzZSB2OnZhciByPXt0eXBlOiJGaWVsZCIsbmFtZTplLnZhbHVlfTtpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1WKXRocm93IG5ldyBFcnJvcigiUXVvdGVkIGlkZW50aWZpZXIgbm90IGFsbG93ZWQgZm9yIGZ1bmN0aW9uIG5hbWVzLiIpO3JldHVybiByO2Nhc2UgcTpyZXR1cm57dHlwZToiTm90RXhwcmVzc2lvbiIsY2hpbGRyZW46W3Q9dGhpcy5leHByZXNzaW9uKFkuTm90KV19O2Nhc2UgTTpyZXR1cm4gdD1udWxsLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifSx0PXRoaXMuX2xvb2thaGVhZCgwKT09PXk/e3R5cGU6IklkZW50aXR5In06dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfTtjYXNlIFU6cmV0dXJuIHRoaXMubGVkKGUudHlwZSx7dHlwZToiSWRlbnRpdHkifSk7Y2FzZSBCOnJldHVybiB0aGlzLl9wYXJzZU11bHRpc2VsZWN0SGFzaCgpO2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9XX0sdD10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgajpyZXR1cm4gdGhpcy5fbG9va2FoZWFkKDApPT09VHx8dGhpcy5fbG9va2FoZWFkKDApPT09Yj8odD10aGlzLl9wYXJzZUluZGV4RXhwcmVzc2lvbigpLHRoaXMuX3Byb2plY3RJZlNsaWNlKHt0eXBlOiJJZGVudGl0eSJ9LHQpKTp0aGlzLl9sb29rYWhlYWQoMCk9PT1NJiZ0aGlzLl9sb29rYWhlYWQoMSk9PT15Pyh0aGlzLl9hZHZhbmNlKCksdGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19KTp0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpO2Nhc2UgSTpyZXR1cm57dHlwZTpJfTtjYXNlIEE6cmV0dXJue3R5cGU6IkV4cHJlc3Npb25SZWZlcmVuY2UiLGNoaWxkcmVuOltuPXRoaXMuZXhwcmVzc2lvbihZLkV4cHJlZildfTtjYXNlIFY6Zm9yKHZhciBvPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PUU7KXRoaXMuX2xvb2thaGVhZCgwKT09PUk/KG49e3R5cGU6SX0sdGhpcy5fYWR2YW5jZSgpKTpuPXRoaXMuZXhwcmVzc2lvbigwKSxvLnB1c2gobik7cmV0dXJuIHRoaXMuX21hdGNoKEUpLG9bMF07ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKGUpfX0sbGVkOmZ1bmN0aW9uKGUsdCl7dmFyIG47c3dpdGNoKGUpe2Nhc2UgRjp2YXIgcj1ZLkRvdDtyZXR1cm4gdGhpcy5fbG9va2FoZWFkKDApIT09TT97dHlwZToiU3ViZXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZURvdFJIUyhyKV19Oih0aGlzLl9hZHZhbmNlKCkse3R5cGU6IlZhbHVlUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMocildfSk7Y2FzZSBfOnJldHVybiBuPXRoaXMuZXhwcmVzc2lvbihZLlBpcGUpLHt0eXBlOl8sY2hpbGRyZW46W3Qsbl19O2Nhc2UgdzpyZXR1cm57dHlwZToiT3JFeHByZXNzaW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuZXhwcmVzc2lvbihZLk9yKV19O2Nhc2UgUjpyZXR1cm57dHlwZToiQW5kRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5BbmQpXX07Y2FzZSBWOmZvcih2YXIgbyxpPXQubmFtZSxzPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PUU7KXRoaXMuX2xvb2thaGVhZCgwKT09PUk/KG89e3R5cGU6SX0sdGhpcy5fYWR2YW5jZSgpKTpvPXRoaXMuZXhwcmVzc2lvbigwKSx0aGlzLl9sb29rYWhlYWQoMCk9PT1TJiZ0aGlzLl9tYXRjaChTKSxzLnB1c2gobyk7cmV0dXJuIHRoaXMuX21hdGNoKEUpLHt0eXBlOiJGdW5jdGlvbiIsbmFtZTppLGNoaWxkcmVuOnN9O2Nhc2UgVTp2YXIgYT10aGlzLmV4cHJlc3Npb24oMCk7cmV0dXJuIHRoaXMuX21hdGNoKHkpLHt0eXBlOiJGaWx0ZXJQcm9qZWN0aW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuX2xvb2thaGVhZCgwKT09PXg/e3R5cGU6IklkZW50aXR5In06dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmlsdGVyKSxhXX07Y2FzZSB4OnJldHVybnt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6eCxjaGlsZHJlbjpbdF19LHRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZsYXR0ZW4pXX07Y2FzZSBrOmNhc2UgUDpjYXNlIEw6Y2FzZSBPOmNhc2UgTjpjYXNlIEQ6cmV0dXJuIHRoaXMuX3BhcnNlQ29tcGFyYXRvcih0LGUpO2Nhc2Ugajp2YXIgYz10aGlzLl9sb29rYWhlYWRUb2tlbigwKTtyZXR1cm4gYy50eXBlPT09VHx8Yy50eXBlPT09Yj8obj10aGlzLl9wYXJzZUluZGV4RXhwcmVzc2lvbigpLHRoaXMuX3Byb2plY3RJZlNsaWNlKHQsbikpOih0aGlzLl9tYXRjaChNKSx0aGlzLl9tYXRjaCh5KSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19KTtkZWZhdWx0OnRoaXMuX2Vycm9yVG9rZW4odGhpcy5fbG9va2FoZWFkVG9rZW4oMCkpfX0sX21hdGNoOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2xvb2thaGVhZCgwKSE9PWUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZFRva2VuKDApLG49bmV3IEVycm9yKCJFeHBlY3RlZCAiK2UrIiwgZ290OiAiK3QudHlwZSk7dGhyb3cgbi5uYW1lPSJQYXJzZXJFcnJvciIsbn10aGlzLl9hZHZhbmNlKCl9LF9lcnJvclRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcigiSW52YWxpZCB0b2tlbiAoIitlLnR5cGUrJyk6ICInK2UudmFsdWUrJyInKTt0aHJvdyB0Lm5hbWU9IlBhcnNlckVycm9yIix0fSxfcGFyc2VJbmRleEV4cHJlc3Npb246ZnVuY3Rpb24oKXtpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1ifHx0aGlzLl9sb29rYWhlYWQoMSk9PT1iKXJldHVybiB0aGlzLl9wYXJzZVNsaWNlRXhwcmVzc2lvbigpO3ZhciBlPXt0eXBlOiJJbmRleCIsdmFsdWU6dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWV9O3JldHVybiB0aGlzLl9hZHZhbmNlKCksdGhpcy5fbWF0Y2goeSksZX0sX3Byb2plY3RJZlNsaWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49e3R5cGU6IkluZGV4RXhwcmVzc2lvbiIsY2hpbGRyZW46W2UsdF19O3JldHVybiJTbGljZSI9PT10LnR5cGU/e3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOltuLHRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX06bn0sX3BhcnNlU2xpY2VFeHByZXNzaW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtudWxsLG51bGwsbnVsbF0sdD0wLG49dGhpcy5fbG9va2FoZWFkKDApO24hPT15JiZ0PDM7KXtpZihuPT09Yil0KyssdGhpcy5fYWR2YW5jZSgpO2Vsc2V7aWYobiE9PVQpe3ZhciByPXRoaXMuX2xvb2thaGVhZCgwKSxvPW5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK3IudmFsdWUrIigiK3IudHlwZSsiKSIpO3Rocm93IG8ubmFtZT0iUGFyc2VyZXJyb3IiLG99ZVt0XT10aGlzLl9sb29rYWhlYWRUb2tlbigwKS52YWx1ZSx0aGlzLl9hZHZhbmNlKCl9bj10aGlzLl9sb29rYWhlYWQoMCl9cmV0dXJuIHRoaXMuX21hdGNoKHkpLHt0eXBlOiJTbGljZSIsY2hpbGRyZW46ZX19LF9wYXJzZUNvbXBhcmF0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZToiQ29tcGFyYXRvciIsbmFtZTp0LGNoaWxkcmVuOltlLHRoaXMuZXhwcmVzc2lvbihZW3RdKV19fSxfcGFyc2VEb3RSSFM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkKDApO3JldHVyblttLHYsTV0uaW5kZXhPZih0KT49MD90aGlzLmV4cHJlc3Npb24oZSk6dD09PWo/KHRoaXMuX21hdGNoKGopLHRoaXMuX3BhcnNlTXVsdGlzZWxlY3RMaXN0KCkpOnQ9PT1CPyh0aGlzLl9tYXRjaChCKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0SGFzaCgpKTp2b2lkIDB9LF9wYXJzZVByb2plY3Rpb25SSFM6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoWVt0aGlzLl9sb29rYWhlYWQoMCldPDEwKXQ9e3R5cGU6IklkZW50aXR5In07ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1qKXQ9dGhpcy5leHByZXNzaW9uKGUpO2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09VSl0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNle2lmKHRoaXMuX2xvb2thaGVhZCgwKSE9PUYpe3ZhciBuPXRoaXMuX2xvb2thaGVhZFRva2VuKDApLHI9bmV3IEVycm9yKCJTeXRhbnggZXJyb3IsIHVuZXhwZWN0ZWQgdG9rZW46ICIrbi52YWx1ZSsiKCIrbi50eXBlKyIpIik7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn10aGlzLl9tYXRjaChGKSx0PXRoaXMuX3BhcnNlRG90UkhTKGUpfXJldHVybiB0fSxfcGFyc2VNdWx0aXNlbGVjdExpc3Q6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W107dGhpcy5fbG9va2FoZWFkKDApIT09eTspe3ZhciB0PXRoaXMuZXhwcmVzc2lvbigwKTtpZihlLnB1c2godCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmKHRoaXMuX21hdGNoKFMpLHRoaXMuX2xvb2thaGVhZCgwKT09PXkpKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBSYnJhY2tldCIpfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiTXVsdGlTZWxlY3RMaXN0IixjaGlsZHJlbjplfX0sX3BhcnNlTXVsdGlzZWxlY3RIYXNoOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQsbixyPVtdLG89W20sdl07Oyl7aWYoZT10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxvLmluZGV4T2YoZS50eXBlKTwwKXRocm93IG5ldyBFcnJvcigiRXhwZWN0aW5nIGFuIGlkZW50aWZpZXIgdG9rZW4sIGdvdDogIitlLnR5cGUpO2lmKHQ9ZS52YWx1ZSx0aGlzLl9hZHZhbmNlKCksdGhpcy5fbWF0Y2goYiksbj17dHlwZToiS2V5VmFsdWVQYWlyIixuYW1lOnQsdmFsdWU6dGhpcy5leHByZXNzaW9uKDApfSxyLnB1c2gobiksdGhpcy5fbG9va2FoZWFkKDApPT09Uyl0aGlzLl9tYXRjaChTKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PUMpe3RoaXMuX21hdGNoKEMpO2JyZWFrfX1yZXR1cm57dHlwZToiTXVsdGlTZWxlY3RIYXNoIixjaGlsZHJlbjpyfX19LEoucHJvdG90eXBlPXtzZWFyY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy52aXNpdChlLHQpfSx2aXNpdDpmdW5jdGlvbihlLGkpe3ZhciBzLGEsYyx1LGwscCxkLGgsZjtzd2l0Y2goZS50eXBlKXtjYXNlIkZpZWxkIjpyZXR1cm4gbnVsbCE9PWkmJm4oaSk/dm9pZCAwPT09KHA9aVtlLm5hbWVdKT9udWxsOnA6bnVsbDtjYXNlIlN1YmV4cHJlc3Npb24iOmZvcihjPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSxmPTE7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaWYobnVsbD09PShjPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxjKSkpcmV0dXJuIG51bGw7cmV0dXJuIGM7Y2FzZSJJbmRleEV4cHJlc3Npb24iOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSJJbmRleCI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIGc9ZS52YWx1ZTtyZXR1cm4gZzwwJiYoZz1pLmxlbmd0aCtnKSx2b2lkIDA9PT0oYz1pW2ddKSYmKGM9bnVsbCksYztjYXNlIlNsaWNlIjppZighdChpKSlyZXR1cm4gbnVsbDt2YXIgbT1lLmNoaWxkcmVuLnNsaWNlKDApLHY9dGhpcy5jb21wdXRlU2xpY2VQYXJhbXMoaS5sZW5ndGgsbSkseT12WzBdLEU9dlsxXSxTPXZbMl07aWYoYz1bXSxTPjApZm9yKGY9eTtmPEU7Zis9UyljLnB1c2goaVtmXSk7ZWxzZSBmb3IoZj15O2Y+RTtmKz1TKWMucHVzaChpW2ZdKTtyZXR1cm4gYztjYXNlIlByb2plY3Rpb24iOnZhciBiPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKTtpZighdChiKSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxiLmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxiW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIlZhbHVlUHJvamVjdGlvbiI6aWYoIW4oYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpKXJldHVybiBudWxsO2g9W107dmFyIEM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49W10scj0wO3I8dC5sZW5ndGg7cisrKW4ucHVzaChlW3Rbcl1dKTtyZXR1cm4gbn0oYik7Zm9yKGY9MDtmPEMubGVuZ3RoO2YrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLENbZl0pKSYmaC5wdXNoKGEpO3JldHVybiBoO2Nhc2UiRmlsdGVyUHJvamVjdGlvbiI6aWYoIXQoYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpKXJldHVybiBudWxsO3ZhciBUPVtdLHc9W107Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKylvKHM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzJdLGJbZl0pKXx8VC5wdXNoKGJbZl0pO2Zvcih2YXIgUj0wO1I8VC5sZW5ndGg7UisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sVFtSXSkpJiZ3LnB1c2goYSk7cmV0dXJuIHc7Y2FzZSJDb21wYXJhdG9yIjpzd2l0Y2godT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksbD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSksZS5uYW1lKXtjYXNlIGs6Yz1yKHUsbCk7YnJlYWs7Y2FzZSBQOmM9IXIodSxsKTticmVhaztjYXNlIEw6Yz11Pmw7YnJlYWs7Y2FzZSBPOmM9dT49bDticmVhaztjYXNlIE46Yz11PGw7YnJlYWs7Y2FzZSBEOmM9dTw9bDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb21wYXJhdG9yOiAiK2UubmFtZSl9cmV0dXJuIGM7Y2FzZSB4OnZhciBNPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKTtpZighdChNKSlyZXR1cm4gbnVsbDt2YXIgVT1bXTtmb3IoZj0wO2Y8TS5sZW5ndGg7ZisrKXQoYT1NW2ZdKT9VLnB1c2guYXBwbHkoVSxhKTpVLnB1c2goYSk7cmV0dXJuIFU7Y2FzZSJJZGVudGl0eSI6cmV0dXJuIGk7Y2FzZSJNdWx0aVNlbGVjdExpc3QiOmlmKG51bGw9PT1pKXJldHVybiBudWxsO2ZvcihoPVtdLGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloLnB1c2godGhpcy52aXNpdChlLmNoaWxkcmVuW2ZdLGkpKTtyZXR1cm4gaDtjYXNlIk11bHRpU2VsZWN0SGFzaCI6aWYobnVsbD09PWkpcmV0dXJuIG51bGw7dmFyIEY7Zm9yKGg9e30sZj0wO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWhbKEY9ZS5jaGlsZHJlbltmXSkubmFtZV09dGhpcy52aXNpdChGLnZhbHVlLGkpO3JldHVybiBoO2Nhc2UiT3JFeHByZXNzaW9uIjpyZXR1cm4gbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSkmJihzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxpKSkscztjYXNlIkFuZEV4cHJlc3Npb24iOnJldHVybiEwPT09byh1PXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSk/dTp0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSk7Y2FzZSJOb3RFeHByZXNzaW9uIjpyZXR1cm4gbyh1PXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSk7Y2FzZSJMaXRlcmFsIjpyZXR1cm4gZS52YWx1ZTtjYXNlIF86cmV0dXJuIGQ9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLHRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxkKTtjYXNlIEk6cmV0dXJuIGk7Y2FzZSJGdW5jdGlvbiI6dmFyIHE9W107Zm9yKGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKylxLnB1c2godGhpcy52aXNpdChlLmNoaWxkcmVuW2ZdLGkpKTtyZXR1cm4gdGhpcy5ydW50aW1lLmNhbGxGdW5jdGlvbihlLm5hbWUscSk7Y2FzZSJFeHByZXNzaW9uUmVmZXJlbmNlIjp2YXIgQj1lLmNoaWxkcmVuWzBdO3JldHVybiBCLmptZXNwYXRoVHlwZT1BLEI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbm9kZSB0eXBlOiAiK2UudHlwZSl9fSxjb21wdXRlU2xpY2VQYXJhbXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxvPXRbMl0saT1bbnVsbCxudWxsLG51bGxdO2lmKG51bGw9PT1vKW89MTtlbHNlIGlmKDA9PT1vKXt2YXIgcz1uZXcgRXJyb3IoIkludmFsaWQgc2xpY2UsIHN0ZXAgY2Fubm90IGJlIDAiKTt0aHJvdyBzLm5hbWU9IlJ1bnRpbWVFcnJvciIsc312YXIgYT1vPDA7cmV0dXJuIG49bnVsbD09PW4/YT9lLTE6MDp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxuLG8pLHI9bnVsbD09PXI/YT8tMTplOnRoaXMuY2FwU2xpY2VSYW5nZShlLHIsbyksaVswXT1uLGlbMV09cixpWzJdPW8saX0sY2FwU2xpY2VSYW5nZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ8MD8odCs9ZSk8MCYmKHQ9bjwwPy0xOjApOnQ+PWUmJih0PW48MD9lLTE6ZSksdH19LFEucHJvdG90eXBlPXtjYWxsRnVuY3Rpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZ1bmN0aW9uVGFibGVbZV07aWYodm9pZCAwPT09bil0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZnVuY3Rpb246ICIrZSsiKCkiKTtyZXR1cm4gdGhpcy5fdmFsaWRhdGVBcmdzKGUsdCxuLl9zaWduYXR1cmUpLG4uX2Z1bmMuY2FsbCh0aGlzLHQpfSxfdmFsaWRhdGVBcmdzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGkscztpZihuW24ubGVuZ3RoLTFdLnZhcmlhZGljKXtpZih0Lmxlbmd0aDxuLmxlbmd0aCl0aHJvdyByPTE9PT1uLmxlbmd0aD8iIGFyZ3VtZW50IjoiIGFyZ3VtZW50cyIsbmV3IEVycm9yKCJBcmd1bWVudEVycm9yOiAiK2UrIigpIHRha2VzIGF0IGxlYXN0IituLmxlbmd0aCtyKyIgYnV0IHJlY2VpdmVkICIrdC5sZW5ndGgpfWVsc2UgaWYodC5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyByPTE9PT1uLmxlbmd0aD8iIGFyZ3VtZW50IjoiIGFyZ3VtZW50cyIsbmV3IEVycm9yKCJBcmd1bWVudEVycm9yOiAiK2UrIigpIHRha2VzICIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7cz0hMSxvPW5bYV0udHlwZXMsaT10aGlzLl9nZXRUeXBlTmFtZSh0W2FdKTtmb3IodmFyIGM9MDtjPG8ubGVuZ3RoO2MrKylpZih0aGlzLl90eXBlTWF0Y2hlcyhpLG9bY10sdFthXSkpe3M9ITA7YnJlYWt9aWYoIXMpe3ZhciB1PW8ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZltlXX0pKS5qb2luKCIsIik7dGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3I6ICIrZSsiKCkgZXhwZWN0ZWQgYXJndW1lbnQgIisoYSsxKSsiIHRvIGJlIHR5cGUgIit1KyIgYnV0IHJlY2VpdmVkIHR5cGUgIitmW2ldKyIgaW5zdGVhZC4iKX19fSxfdHlwZU1hdGNoZXM6ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT1hKXJldHVybiEwO2lmKHQhPT1oJiZ0IT09ZCYmdCE9PXUpcmV0dXJuIGU9PT10O2lmKHQ9PT11KXJldHVybiBlPT09dTtpZihlPT09dSl7dmFyIHI7dD09PWQ/cj1zOnQ9PT1oJiYocj1jKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKylpZighdGhpcy5fdHlwZU1hdGNoZXModGhpcy5fZ2V0VHlwZU5hbWUobltvXSkscixuW29dKSlyZXR1cm4hMTtyZXR1cm4hMH19LF9nZXRUeXBlTmFtZTpmdW5jdGlvbihlKXtzd2l0Y2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXtjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIGM7Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBzO2Nhc2UiW29iamVjdCBBcnJheV0iOnJldHVybiB1O2Nhc2UiW29iamVjdCBCb29sZWFuXSI6cmV0dXJuIDU7Y2FzZSJbb2JqZWN0IE51bGxdIjpyZXR1cm4gNztjYXNlIltvYmplY3QgT2JqZWN0XSI6cmV0dXJuIGUuam1lc3BhdGhUeXBlPT09QT9wOmx9fSxfZnVuY3Rpb25TdGFydHNXaXRoOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZVswXS5sYXN0SW5kZXhPZihlWzFdKX0sX2Z1bmN0aW9uRW5kc1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV07cmV0dXJuLTEhPT10LmluZGV4T2Yobix0Lmxlbmd0aC1uLmxlbmd0aCl9LF9mdW5jdGlvblJldmVyc2U6ZnVuY3Rpb24oZSl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXSk9PT1jKXtmb3IodmFyIHQ9ZVswXSxuPSIiLHI9dC5sZW5ndGgtMTtyPj0wO3ItLSluKz10W3JdO3JldHVybiBufXZhciBvPWVbMF0uc2xpY2UoMCk7cmV0dXJuIG8ucmV2ZXJzZSgpLG99LF9mdW5jdGlvbkFiczpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5hYnMoZVswXSl9LF9mdW5jdGlvbkNlaWw6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguY2VpbChlWzBdKX0sX2Z1bmN0aW9uQXZnOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZVswXSxyPTA7cjxuLmxlbmd0aDtyKyspdCs9bltyXTtyZXR1cm4gdC9uLmxlbmd0aH0sX2Z1bmN0aW9uQ29udGFpbnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0uaW5kZXhPZihlWzFdKT49MH0sX2Z1bmN0aW9uRmxvb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoZVswXSl9LF9mdW5jdGlvbkxlbmd0aDpmdW5jdGlvbihlKXtyZXR1cm4gbihlWzBdKT9PYmplY3Qua2V5cyhlWzBdKS5sZW5ndGg6ZVswXS5sZW5ndGh9LF9mdW5jdGlvbk1hcDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj10aGlzLl9pbnRlcnByZXRlcixyPWVbMF0sbz1lWzFdLGk9MDtpPG8ubGVuZ3RoO2krKyl0LnB1c2gobi52aXNpdChyLG9baV0pKTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWVyZ2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtmb3IodmFyIG8gaW4gcil0W29dPXJbb119cmV0dXJuIHR9LF9mdW5jdGlvbk1heDpmdW5jdGlvbihlKXtpZihlWzBdLmxlbmd0aD4wKXtpZih0aGlzLl9nZXRUeXBlTmFtZShlWzBdWzBdKT09PXMpcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsZVswXSk7Zm9yKHZhciB0PWVbMF0sbj10WzBdLHI9MTtyPHQubGVuZ3RoO3IrKyluLmxvY2FsZUNvbXBhcmUodFtyXSk8MCYmKG49dFtyXSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LF9mdW5jdGlvbk1pbjpmdW5jdGlvbihlKXtpZihlWzBdLmxlbmd0aD4wKXtpZih0aGlzLl9nZXRUeXBlTmFtZShlWzBdWzBdKT09PXMpcmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsZVswXSk7Zm9yKHZhciB0PWVbMF0sbj10WzBdLHI9MTtyPHQubGVuZ3RoO3IrKyl0W3JdLmxvY2FsZUNvbXBhcmUobik8MCYmKG49dFtyXSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LF9mdW5jdGlvblN1bTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHR9LF9mdW5jdGlvblR5cGU6ZnVuY3Rpb24oZSl7c3dpdGNoKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pKXtjYXNlIHM6cmV0dXJuIm51bWJlciI7Y2FzZSBjOnJldHVybiJzdHJpbmciO2Nhc2UgdTpyZXR1cm4iYXJyYXkiO2Nhc2UgbDpyZXR1cm4ib2JqZWN0IjtjYXNlIDU6cmV0dXJuImJvb2xlYW4iO2Nhc2UgcDpyZXR1cm4iZXhwcmVmIjtjYXNlIDc6cmV0dXJuIm51bGwifX0sX2Z1bmN0aW9uS2V5czpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZVswXSl9LF9mdW5jdGlvblZhbHVlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZVswXSxuPU9iamVjdC5rZXlzKHQpLHI9W10sbz0wO288bi5sZW5ndGg7bysrKXIucHVzaCh0W25bb11dKTtyZXR1cm4gcn0sX2Z1bmN0aW9uSm9pbjpmdW5jdGlvbihlKXt2YXIgdD1lWzBdO3JldHVybiBlWzFdLmpvaW4odCl9LF9mdW5jdGlvblRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09dT9lWzBdOltlWzBdXX0sX2Z1bmN0aW9uVG9TdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yz9lWzBdOkpTT04uc3RyaW5naWZ5KGVbMF0pfSxfZnVuY3Rpb25Ub051bWJlcjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2dldFR5cGVOYW1lKGVbMF0pO3JldHVybiBuPT09cz9lWzBdOm4hPT1jfHwodD0rZVswXSxpc05hTih0KSk/bnVsbDp0fSxfZnVuY3Rpb25Ob3ROdWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKDchPT10aGlzLl9nZXRUeXBlTmFtZShlW3RdKSlyZXR1cm4gZVt0XTtyZXR1cm4gbnVsbH0sX2Z1bmN0aW9uU29ydDpmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnNsaWNlKDApO3JldHVybiB0LnNvcnQoKSx0fSxfZnVuY3Rpb25Tb3J0Qnk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHQ7dmFyIG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzFdLG89dGhpcy5fZ2V0VHlwZU5hbWUobi52aXNpdChyLHRbMF0pKTtpZihbcyxjXS5pbmRleE9mKG8pPDApdGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3IiKTtmb3IodmFyIGk9dGhpcyxhPVtdLHU9MDt1PHQubGVuZ3RoO3UrKylhLnB1c2goW3UsdFt1XV0pO2Euc29ydCgoZnVuY3Rpb24oZSx0KXt2YXIgcz1uLnZpc2l0KHIsZVsxXSksYT1uLnZpc2l0KHIsdFsxXSk7aWYoaS5fZ2V0VHlwZU5hbWUocykhPT1vKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiBleHBlY3RlZCAiK28rIiwgcmVjZWl2ZWQgIitpLl9nZXRUeXBlTmFtZShzKSk7aWYoaS5fZ2V0VHlwZU5hbWUoYSkhPT1vKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiBleHBlY3RlZCAiK28rIiwgcmVjZWl2ZWQgIitpLl9nZXRUeXBlTmFtZShhKSk7cmV0dXJuIHM+YT8xOnM8YT8tMTplWzBdLXRbMF19KSk7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDtsKyspdFtsXT1hW2xdWzFdO3JldHVybiB0fSxfZnVuY3Rpb25NYXhCeTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyPWVbMV0sbz1lWzBdLGk9dGhpcy5jcmVhdGVLZXlGdW5jdGlvbihyLFtzLGNdKSxhPS0xLzAsdT0wO3U8by5sZW5ndGg7dSsrKShuPWkob1t1XSkpPmEmJihhPW4sdD1vW3VdKTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWluQnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0xLzAsdT0wO3U8by5sZW5ndGg7dSsrKShuPWkob1t1XSkpPGEmJihhPW4sdD1vW3VdKTtyZXR1cm4gdH0sY3JlYXRlS2V5RnVuY3Rpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9dGhpcy5faW50ZXJwcmV0ZXI7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBpPXIudmlzaXQoZSxvKTtpZih0LmluZGV4T2Yobi5fZ2V0VHlwZU5hbWUoaSkpPDApe3ZhciBzPSJUeXBlRXJyb3I6IGV4cGVjdGVkIG9uZSBvZiAiK3QrIiwgcmVjZWl2ZWQgIituLl9nZXRUeXBlTmFtZShpKTt0aHJvdyBuZXcgRXJyb3Iocyl9cmV0dXJuIGl9fX0sZS50b2tlbml6ZT1mdW5jdGlvbihlKXtyZXR1cm4obmV3IFgpLnRva2VuaXplKGUpfSxlLmNvbXBpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyAkKS5wYXJzZShlKX0sZS5zZWFyY2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgJCxyPW5ldyBRLG89bmV3IEoocik7ci5faW50ZXJwcmV0ZXI9bzt2YXIgaT1uLnBhcnNlKHQpO3JldHVybiBvLnNlYXJjaChpLGUpfSxlLnN0cmljdERlZXBFcXVhbD1yfSh2b2lkIDA9PT1uP3RoaXMuam1lc3BhdGg9e306bil9LHt9XSw5MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saT10LmV4cG9ydHM9e307ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGEoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGMoZSl7aWYocj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigocj09PXN8fCFyKSYmc2V0VGltZW91dClyZXR1cm4gcj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIHIoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHIuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIHIuY2FsbCh0aGlzLGUsMCl9fX0hZnVuY3Rpb24oKXt0cnl7cj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnN9Y2F0Y2goZSl7cj1zfXRyeXtvPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmF9Y2F0Y2goZSl7bz1hfX0oKTt2YXIgdSxsPVtdLHA9ITEsZD0tMTtmdW5jdGlvbiBoKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/bD11LmNvbmNhdChsKTpkPS0xLGwubGVuZ3RoJiZmKCkpfWZ1bmN0aW9uIGYoKXtpZighcCl7dmFyIGU9YyhoKTtwPSEwO2Zvcih2YXIgdD1sLmxlbmd0aDt0Oyl7Zm9yKHU9bCxsPVtdOysrZDx0Oyl1JiZ1W2RdLnJ1bigpO2Q9LTEsdD1sLmxlbmd0aH11PW51bGwscD0hMSxmdW5jdGlvbihlKXtpZihvPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKG89PT1hfHwhbykmJmNsZWFyVGltZW91dClyZXR1cm4gbz1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtyZXR1cm4gbyhlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG8uY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiBvLmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gZyhlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fWZ1bmN0aW9uIG0oKXt9aS5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO2wucHVzaChuZXcgZyhlLHQpKSwxIT09bC5sZW5ndGh8fHB8fGMoZil9LGcucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGkudGl0bGU9ImJyb3dzZXIiLGkuYnJvd3Nlcj0hMCxpLmVudj17fSxpLmFyZ3Y9W10saS52ZXJzaW9uPSIiLGkudmVyc2lvbnM9e30saS5vbj1tLGkuYWRkTGlzdGVuZXI9bSxpLm9uY2U9bSxpLm9mZj1tLGkucmVtb3ZlTGlzdGVuZXI9bSxpLnJlbW92ZUFsbExpc3RlbmVycz1tLGkuZW1pdD1tLGkucHJlcGVuZExpc3RlbmVyPW0saS5wcmVwZW5kT25jZUxpc3RlbmVyPW0saS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuW119LGkuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGkuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxpLmNoZGlyPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LGkudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LHt9XSw5MjpbZnVuY3Rpb24oZSx0LG8peyhmdW5jdGlvbihlKXsoZnVuY3Rpb24oKXshZnVuY3Rpb24oaSl7Im9iamVjdCI9PXR5cGVvZiBvJiZvJiZvLm5vZGVUeXBlLCJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5ub2RlVHlwZTt2YXIgcz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7cy5nbG9iYWwhPT1zJiZzLndpbmRvdyE9PXMmJnMuc2VsZjt2YXIgYSxjPTIxNDc0ODM2NDcsdT0zNixsPTEscD0yNixkPTM4LGg9NzAwLGY9NzIsZz0xMjgsbT0iLSIsdj0vXnhuLS0vLHk9L1teXHgyMC1ceDdFXS8sRT0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csUz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sYj11LWwsQz1NYXRoLmZsb29yLFQ9U3RyaW5nLmZyb21DaGFyQ29kZTtmdW5jdGlvbiBJKGUpe3Rocm93IG5ldyBSYW5nZUVycm9yKFNbZV0pfWZ1bmN0aW9uIEEoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj1bXTtuLS07KXJbbl09dChlW25dKTtyZXR1cm4gcn1mdW5jdGlvbiBfKGUsdCl7dmFyIG49ZS5zcGxpdCgiQCIpLHI9IiI7cmV0dXJuIG4ubGVuZ3RoPjEmJihyPW5bMF0rIkAiLGU9blsxXSkscitBKChlPWUucmVwbGFjZShFLCIuIikpLnNwbGl0KCIuIiksdCkuam9pbigiLiIpfWZ1bmN0aW9uIHcoZSl7Zm9yKHZhciB0LG4scj1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7KSh0PWUuY2hhckNvZGVBdChvKyspKT49NTUyOTYmJnQ8PTU2MzE5JiZvPGk/NTYzMjA9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQobysrKSkpP3IucHVzaCgoKDEwMjMmdCk8PDEwKSsoMTAyMyZuKSs2NTUzNik6KHIucHVzaCh0KSxvLS0pOnIucHVzaCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBSKGUpe3JldHVybiBBKGUsKGZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlPjY1NTM1JiYodCs9VCgoZS09NjU1MzYpPj4+MTAmMTAyM3w1NTI5NiksZT01NjMyMHwxMDIzJmUpLHQrPVQoZSl9KSkuam9pbigiIil9ZnVuY3Rpb24gayhlLHQpe3JldHVybiBlKzIyKzc1KihlPDI2KS0oKDAhPXQpPDw1KX1mdW5jdGlvbiBMKGUsdCxuKXt2YXIgcj0wO2ZvcihlPW4/QyhlL2gpOmU+PjEsZSs9QyhlL3QpO2U+YipwPj4xO3IrPXUpZT1DKGUvYik7cmV0dXJuIEMocisoYisxKSplLyhlK2QpKX1mdW5jdGlvbiBOKGUpe3ZhciB0LG4scixvLGkscyxhLGQsaCx2LHksRT1bXSxTPWUubGVuZ3RoLGI9MCxUPWcsQT1mO2Zvcigobj1lLmxhc3RJbmRleE9mKG0pKTwwJiYobj0wKSxyPTA7cjxuOysrcillLmNoYXJDb2RlQXQocik+PTEyOCYmSSgibm90LWJhc2ljIiksRS5wdXNoKGUuY2hhckNvZGVBdChyKSk7Zm9yKG89bj4wP24rMTowO288Uzspe2ZvcihpPWIscz0xLGE9dTtvPj1TJiZJKCJpbnZhbGlkLWlucHV0IiksKChkPSh5PWUuY2hhckNvZGVBdChvKyspKS00ODwxMD95LTIyOnktNjU8MjY/eS02NTp5LTk3PDI2P3ktOTc6dSk+PXV8fGQ+QygoYy1iKS9zKSkmJkkoIm92ZXJmbG93IiksYis9ZCpzLCEoZDwoaD1hPD1BP2w6YT49QStwP3A6YS1BKSk7YSs9dSlzPkMoYy8odj11LWgpKSYmSSgib3ZlcmZsb3ciKSxzKj12O0E9TChiLWksdD1FLmxlbmd0aCsxLDA9PWkpLEMoYi90KT5jLVQmJkkoIm92ZXJmbG93IiksVCs9QyhiL3QpLGIlPXQsRS5zcGxpY2UoYisrLDAsVCl9cmV0dXJuIFIoRSl9ZnVuY3Rpb24gTyhlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEUsUyxiLEEsXz1bXTtmb3IoRT0oZT13KGUpKS5sZW5ndGgsdD1nLG49MCxpPWYscz0wO3M8RTsrK3MpKHk9ZVtzXSk8MTI4JiZfLnB1c2goVCh5KSk7Zm9yKHI9bz1fLmxlbmd0aCxvJiZfLnB1c2gobSk7cjxFOyl7Zm9yKGE9YyxzPTA7czxFOysrcykoeT1lW3NdKT49dCYmeTxhJiYoYT15KTtmb3IoYS10PkMoKGMtbikvKFM9cisxKSkmJkkoIm92ZXJmbG93Iiksbis9KGEtdCkqUyx0PWEscz0wO3M8RTsrK3MpaWYoKHk9ZVtzXSk8dCYmKytuPmMmJkkoIm92ZXJmbG93IikseT09dCl7Zm9yKGQ9bixoPXU7IShkPCh2PWg8PWk/bDpoPj1pK3A/cDpoLWkpKTtoKz11KUE9ZC12LGI9dS12LF8ucHVzaChUKGsoditBJWIsMCkpKSxkPUMoQS9iKTtfLnB1c2goVChrKGQsMCkpKSxpPUwobixTLHI9PW8pLG49MCwrK3J9KytuLCsrdH1yZXR1cm4gXy5qb2luKCIiKX1hPXt2ZXJzaW9uOiIxLjQuMSIsdWNzMjp7ZGVjb2RlOncsZW5jb2RlOlJ9LGRlY29kZTpOLGVuY29kZTpPLHRvQVNDSUk6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHkudGVzdChlKT8ieG4tLSIrTyhlKTplfSkpfSx0b1VuaWNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHYudGVzdChlKT9OKGUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6ZX0pKX19LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LmNhbGwobyxuLG8sdCkpfHwodC5leHBvcnRzPXIpfSgpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHt9XSw5MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixpKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgcz17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gczt2YXIgYT0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGM9MWUzO2kmJiJudW1iZXIiPT10eXBlb2YgaS5tYXhLZXlzJiYoYz1pLm1heEtleXMpO3ZhciB1PWUubGVuZ3RoO2M+MCYmdT5jJiYodT1jKTtmb3IodmFyIGw9MDtsPHU7KytsKXt2YXIgcCxkLGgsZixnPWVbbF0ucmVwbGFjZShhLCIlMjAiKSxtPWcuaW5kZXhPZihuKTttPj0wPyhwPWcuc3Vic3RyKDAsbSksZD1nLnN1YnN0cihtKzEpKToocD1nLGQ9IiIpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLGY9ZGVjb2RlVVJJQ29tcG9uZW50KGQpLHIocyxoKT9vKHNbaF0pP3NbaF0ucHVzaChmKTpzW2hdPVtzW2hdLGZdOnNbaF09Zn1yZXR1cm4gc307dmFyIG89QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX19LHt9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/aShzKGUpLChmdW5jdGlvbihzKXt2YXIgYT1lbmNvZGVVUklDb21wb25lbnQocihzKSkrbjtyZXR1cm4gbyhlW3NdKT9pKGVbc10sKGZ1bmN0aW9uKGUpe3JldHVybiBhK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKX0pKS5qb2luKHQpOmErZW5jb2RlVVJJQ29tcG9uZW50KHIoZVtzXSkpfSkpLmpvaW4odCk6YT9lbmNvZGVVUklDb21wb25lbnQocihhKSkrbitlbmNvZGVVUklDb21wb25lbnQocihlKSk6IiJ9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9O2Z1bmN0aW9uIGkoZSx0KXtpZihlLm1hcClyZXR1cm4gZS5tYXAodCk7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKyluLnB1c2godChlW3JdLHIpKTtyZXR1cm4gbn12YXIgcz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQucHVzaChuKTtyZXR1cm4gdH19LHt9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmRlY29kZT1uLnBhcnNlPWUoIi4vZGVjb2RlIiksbi5lbmNvZGU9bi5zdHJpbmdpZnk9ZSgiLi9lbmNvZGUiKX0seyIuL2RlY29kZSI6OTMsIi4vZW5jb2RlIjo5NH1dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3Q9dHx8IiYiLG49bnx8Ij0iO3ZhciBpPXt9O2lmKCJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKXJldHVybiBpO3ZhciBzPS9cKy9nO2U9ZS5zcGxpdCh0KTt2YXIgYT0xZTM7byYmIm51bWJlciI9PXR5cGVvZiBvLm1heEtleXMmJihhPW8ubWF4S2V5cyk7dmFyIGM9ZS5sZW5ndGg7YT4wJiZjPmEmJihjPWEpO2Zvcih2YXIgdT0wO3U8YzsrK3Upe3ZhciBsLHAsZCxoLGY9ZVt1XS5yZXBsYWNlKHMsIiUyMCIpLGc9Zi5pbmRleE9mKG4pO2c+PTA/KGw9Zi5zdWJzdHIoMCxnKSxwPWYuc3Vic3RyKGcrMSkpOihsPWYscD0iIiksZD1kZWNvZGVVUklDb21wb25lbnQobCksaD1kZWNvZGVVUklDb21wb25lbnQocCkscihpLGQpP0FycmF5LmlzQXJyYXkoaVtkXSk/aVtkXS5wdXNoKGgpOmlbZF09W2lbZF0saF06aVtkXT1ofXJldHVybiBpfX0se31dLDk3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBlO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/InRydWUiOiJmYWxzZSI7Y2FzZSJudW1iZXIiOnJldHVybiBpc0Zpbml0ZShlKT9lOiIiO2RlZmF1bHQ6cmV0dXJuIiJ9fTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIHQ9dHx8IiYiLG49bnx8Ij0iLG51bGw9PT1lJiYoZT12b2lkIDApLCJvYmplY3QiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5tYXAoKGZ1bmN0aW9uKG8pe3ZhciBpPWVuY29kZVVSSUNvbXBvbmVudChyKG8pKStuO3JldHVybiBBcnJheS5pc0FycmF5KGVbb10pP2Vbb10ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gaStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTppK2VuY29kZVVSSUNvbXBvbmVudChyKGVbb10pKX0pKS5qb2luKHQpOm8/ZW5jb2RlVVJJQ29tcG9uZW50KHIobykpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifX0se31dLDk4OltmdW5jdGlvbihlLHQsbil7YXJndW1lbnRzWzRdWzk1XVswXS5hcHBseShuLGFyZ3VtZW50cyl9LHsiLi9kZWNvZGUiOjk2LCIuL2VuY29kZSI6OTcsZHVwOjk1fV0sOTk6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCxyKXsoZnVuY3Rpb24oKXt2YXIgbz1lKCJwcm9jZXNzL2Jyb3dzZXIuanMiKS5uZXh0VGljayxpPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxzPUFycmF5LnByb3RvdHlwZS5zbGljZSxhPXt9LGM9MDtmdW5jdGlvbiB1KGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9jbGVhckZuPXR9bi5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRUaW1lb3V0LHdpbmRvdyxhcmd1bWVudHMpLGNsZWFyVGltZW91dCl9LG4uc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHUoaS5jYWxsKHNldEludGVydmFsLHdpbmRvdyxhcmd1bWVudHMpLGNsZWFySW50ZXJ2YWwpfSxuLmNsZWFyVGltZW91dD1uLmNsZWFySW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSx1LnByb3RvdHlwZS51bnJlZj11LnByb3RvdHlwZS5yZWY9ZnVuY3Rpb24oKXt9LHUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdyx0aGlzLl9pZCl9LG4uZW5yb2xsPWZ1bmN0aW9uKGUsdCl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpLGUuX2lkbGVUaW1lb3V0PXR9LG4udW5lbnJvbGw9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpLGUuX2lkbGVUaW1lb3V0PS0xfSxuLl91bnJlZkFjdGl2ZT1uLmFjdGl2ZT1mdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCk7dmFyIHQ9ZS5faWRsZVRpbWVvdXQ7dD49MCYmKGUuX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLl9vblRpbWVvdXQmJmUuX29uVGltZW91dCgpfSksdCkpfSxuLnNldEltbWVkaWF0ZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKGUpe3ZhciB0PWMrKyxyPSEoYXJndW1lbnRzLmxlbmd0aDwyKSYmcy5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gYVt0XT0hMCxvKChmdW5jdGlvbigpe2FbdF0mJihyP2UuYXBwbHkobnVsbCxyKTplLmNhbGwobnVsbCksbi5jbGVhckltbWVkaWF0ZSh0KSl9KSksdH0sbi5jbGVhckltbWVkaWF0ZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOmZ1bmN0aW9uKGUpe2RlbGV0ZSBhW2VdfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgidGltZXJzIikuc2V0SW1tZWRpYXRlLGUoInRpbWVycyIpLmNsZWFySW1tZWRpYXRlKX0seyJwcm9jZXNzL2Jyb3dzZXIuanMiOjkxLHRpbWVyczo5OX1dLDEwMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoInB1bnljb2RlIik7ZnVuY3Rpb24gbygpe3RoaXMucHJvdG9jb2w9bnVsbCx0aGlzLnNsYXNoZXM9bnVsbCx0aGlzLmF1dGg9bnVsbCx0aGlzLmhvc3Q9bnVsbCx0aGlzLnBvcnQ9bnVsbCx0aGlzLmhvc3RuYW1lPW51bGwsdGhpcy5oYXNoPW51bGwsdGhpcy5zZWFyY2g9bnVsbCx0aGlzLnF1ZXJ5PW51bGwsdGhpcy5wYXRobmFtZT1udWxsLHRoaXMucGF0aD1udWxsLHRoaXMuaHJlZj1udWxsfW4ucGFyc2U9dixuLnJlc29sdmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdihlLCExLCEwKS5yZXNvbHZlKHQpfSxuLnJlc29sdmVPYmplY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT92KGUsITEsITApLnJlc29sdmVPYmplY3QodCk6dH0sbi5mb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHkoZSkmJihlPXYoZSkpLGUgaW5zdGFuY2VvZiBvP2UuZm9ybWF0KCk6by5wcm90b3R5cGUuZm9ybWF0LmNhbGwoZSl9LG4uVXJsPW87dmFyIGk9L14oW2EtejAtOS4rLV0rOikvaSxzPS86WzAtOV0qJC8sYT1bInsiLCJ9IiwifCIsIlxcIiwiXiIsImAiXS5jb25jYXQoWyI8IiwiPiIsJyInLCJgIiwiICIsIlxyIiwiXG4iLCJcdCJdKSxjPVsiJyJdLmNvbmNhdChhKSx1PVsiJSIsIi8iLCI/IiwiOyIsIiMiXS5jb25jYXQoYyksbD1bIi8iLCI/IiwiIyJdLHA9L15bYS16MC05QS1aXy1dezAsNjN9JC8sZD0vXihbYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxoPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGY9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sZz17aHR0cDohMCxodHRwczohMCxmdHA6ITAsZ29waGVyOiEwLGZpbGU6ITAsImh0dHA6IjohMCwiaHR0cHM6IjohMCwiZnRwOiI6ITAsImdvcGhlcjoiOiEwLCJmaWxlOiI6ITB9LG09ZSgicXVlcnlzdHJpbmciKTtmdW5jdGlvbiB2KGUsdCxuKXtpZihlJiZFKGUpJiZlIGluc3RhbmNlb2YgbylyZXR1cm4gZTt2YXIgcj1uZXcgbztyZXR1cm4gci5wYXJzZShlLHQsbikscn1mdW5jdGlvbiB5KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiBFKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gUyhlKXtyZXR1cm4gbnVsbD09PWV9by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0LG4pe2lmKCF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgIit0eXBlb2YgZSk7dmFyIG89ZTtvPW8udHJpbSgpO3ZhciBzPWkuZXhlYyhvKTtpZihzKXt2YXIgYT0ocz1zWzBdKS50b0xvd2VyQ2FzZSgpO3RoaXMucHJvdG9jb2w9YSxvPW8uc3Vic3RyKHMubGVuZ3RoKX1pZihufHxzfHxvLm1hdGNoKC9eXC9cL1teQFwvXStAW15AXC9dKy8pKXt2YXIgdj0iLy8iPT09by5zdWJzdHIoMCwyKTshdnx8cyYmZltzXXx8KG89by5zdWJzdHIoMiksdGhpcy5zbGFzaGVzPSEwKX1pZighZltzXSYmKHZ8fHMmJiFnW3NdKSl7Zm9yKHZhciBFLFMsYj0tMSxDPTA7QzxsLmxlbmd0aDtDKyspLTEhPT0oVD1vLmluZGV4T2YobFtDXSkpJiYoLTE9PT1ifHxUPGIpJiYoYj1UKTtmb3IoLTEhPT0oUz0tMT09PWI/by5sYXN0SW5kZXhPZigiQCIpOm8ubGFzdEluZGV4T2YoIkAiLGIpKSYmKEU9by5zbGljZSgwLFMpLG89by5zbGljZShTKzEpLHRoaXMuYXV0aD1kZWNvZGVVUklDb21wb25lbnQoRSkpLGI9LTEsQz0wO0M8dS5sZW5ndGg7QysrKXt2YXIgVDstMSE9PShUPW8uaW5kZXhPZih1W0NdKSkmJigtMT09PWJ8fFQ8YikmJihiPVQpfS0xPT09YiYmKGI9by5sZW5ndGgpLHRoaXMuaG9zdD1vLnNsaWNlKDAsYiksbz1vLnNsaWNlKGIpLHRoaXMucGFyc2VIb3N0KCksdGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lfHwiIjt2YXIgST0iWyI9PT10aGlzLmhvc3RuYW1lWzBdJiYiXSI9PT10aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoLTFdO2lmKCFJKWZvcih2YXIgQT10aGlzLmhvc3RuYW1lLnNwbGl0KC9cLi8pLF89KEM9MCxBLmxlbmd0aCk7QzxfO0MrKyl7dmFyIHc9QVtDXTtpZih3JiYhdy5tYXRjaChwKSl7Zm9yKHZhciBSPSIiLGs9MCxMPXcubGVuZ3RoO2s8TDtrKyspdy5jaGFyQ29kZUF0KGspPjEyNz9SKz0ieCI6Uis9d1trXTtpZighUi5tYXRjaChwKSl7dmFyIE49QS5zbGljZSgwLEMpLE89QS5zbGljZShDKzEpLEQ9dy5tYXRjaChkKTtEJiYoTi5wdXNoKERbMV0pLE8udW5zaGlmdChEWzJdKSksTy5sZW5ndGgmJihvPSIvIitPLmpvaW4oIi4iKStvKSx0aGlzLmhvc3RuYW1lPU4uam9pbigiLiIpO2JyZWFrfX19aWYodGhpcy5ob3N0bmFtZS5sZW5ndGg+MjU1P3RoaXMuaG9zdG5hbWU9IiI6dGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCksIUkpe3ZhciBQPXRoaXMuaG9zdG5hbWUuc3BsaXQoIi4iKSx4PVtdO2ZvcihDPTA7QzxQLmxlbmd0aDsrK0Mpe3ZhciBNPVBbQ107eC5wdXNoKE0ubWF0Y2goL1teQS1aYS16MC05Xy1dLyk/InhuLS0iK3IuZW5jb2RlKE0pOk0pfXRoaXMuaG9zdG5hbWU9eC5qb2luKCIuIil9dmFyIFU9dGhpcy5wb3J0PyI6Iit0aGlzLnBvcnQ6IiIsRj10aGlzLmhvc3RuYW1lfHwiIjt0aGlzLmhvc3Q9RitVLHRoaXMuaHJlZis9dGhpcy5ob3N0LEkmJih0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsdGhpcy5ob3N0bmFtZS5sZW5ndGgtMiksIi8iIT09b1swXSYmKG89Ii8iK28pKX1pZighaFthXSlmb3IoQz0wLF89Yy5sZW5ndGg7QzxfO0MrKyl7dmFyIHE9Y1tDXSxCPWVuY29kZVVSSUNvbXBvbmVudChxKTtCPT09cSYmKEI9ZXNjYXBlKHEpKSxvPW8uc3BsaXQocSkuam9pbihCKX12YXIgaj1vLmluZGV4T2YoIiMiKTstMSE9PWomJih0aGlzLmhhc2g9by5zdWJzdHIoaiksbz1vLnNsaWNlKDAsaikpO3ZhciBWPW8uaW5kZXhPZigiPyIpO3JldHVybi0xIT09Vj8odGhpcy5zZWFyY2g9by5zdWJzdHIoViksdGhpcy5xdWVyeT1vLnN1YnN0cihWKzEpLHQmJih0aGlzLnF1ZXJ5PW0ucGFyc2UodGhpcy5xdWVyeSkpLG89by5zbGljZSgwLFYpKTp0JiYodGhpcy5zZWFyY2g9IiIsdGhpcy5xdWVyeT17fSksbyYmKHRoaXMucGF0aG5hbWU9byksZ1thXSYmdGhpcy5ob3N0bmFtZSYmIXRoaXMucGF0aG5hbWUmJih0aGlzLnBhdGhuYW1lPSIvIiksKHRoaXMucGF0aG5hbWV8fHRoaXMuc2VhcmNoKSYmKFU9dGhpcy5wYXRobmFtZXx8IiIsTT10aGlzLnNlYXJjaHx8IiIsdGhpcy5wYXRoPVUrTSksdGhpcy5ocmVmPXRoaXMuZm9ybWF0KCksdGhpc30sby5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hdXRofHwiIjtlJiYoZT0oZT1lbmNvZGVVUklDb21wb25lbnQoZSkpLnJlcGxhY2UoLyUzQS9pLCI6IiksZSs9IkAiKTt2YXIgdD10aGlzLnByb3RvY29sfHwiIixuPXRoaXMucGF0aG5hbWV8fCIiLHI9dGhpcy5oYXNofHwiIixvPSExLGk9IiI7dGhpcy5ob3N0P289ZSt0aGlzLmhvc3Q6dGhpcy5ob3N0bmFtZSYmKG89ZSsoLTE9PT10aGlzLmhvc3RuYW1lLmluZGV4T2YoIjoiKT90aGlzLmhvc3RuYW1lOiJbIit0aGlzLmhvc3RuYW1lKyJdIiksdGhpcy5wb3J0JiYobys9IjoiK3RoaXMucG9ydCkpLHRoaXMucXVlcnkmJkUodGhpcy5xdWVyeSkmJk9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCYmKGk9bS5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO3ZhciBzPXRoaXMuc2VhcmNofHxpJiYiPyIraXx8IiI7cmV0dXJuIHQmJiI6IiE9PXQuc3Vic3RyKC0xKSYmKHQrPSI6IiksdGhpcy5zbGFzaGVzfHwoIXR8fGdbdF0pJiYhMSE9PW8/KG89Ii8vIisob3x8IiIpLG4mJiIvIiE9PW4uY2hhckF0KDApJiYobj0iLyIrbikpOm98fChvPSIiKSxyJiYiIyIhPT1yLmNoYXJBdCgwKSYmKHI9IiMiK3IpLHMmJiI/IiE9PXMuY2hhckF0KDApJiYocz0iPyIrcyksdCtvKyhuPW4ucmVwbGFjZSgvWz8jXS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpfSkpKSsocz1zLnJlcGxhY2UoIiMiLCIlMjMiKSkrcn0sby5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHYoZSwhMSwhMCkpLmZvcm1hdCgpfSxvLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKHkoZSkpe3ZhciB0PW5ldyBvO3QucGFyc2UoZSwhMSwhMCksZT10fXZhciBuPW5ldyBvO2lmKE9iamVjdC5rZXlzKHRoaXMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZV09dGhpc1tlXX0pLHRoaXMpLG4uaGFzaD1lLmhhc2gsIiI9PT1lLmhyZWYpcmV0dXJuIG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoZS5zbGFzaGVzJiYhZS5wcm90b2NvbClyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7InByb3RvY29sIiE9PXQmJihuW3RdPWVbdF0pfSkpLGdbbi5wcm90b2NvbF0mJm4uaG9zdG5hbWUmJiFuLnBhdGhuYW1lJiYobi5wYXRoPW4ucGF0aG5hbWU9Ii8iKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUucHJvdG9jb2wmJmUucHJvdG9jb2whPT1uLnByb3RvY29sKXtpZighZ1tlLnByb3RvY29sXSlyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0XT1lW3RdfSkpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYobi5wcm90b2NvbD1lLnByb3RvY29sLGUuaG9zdHx8ZltlLnByb3RvY29sXSluLnBhdGhuYW1lPWUucGF0aG5hbWU7ZWxzZXtmb3IodmFyIHI9KGUucGF0aG5hbWV8fCIiKS5zcGxpdCgiLyIpO3IubGVuZ3RoJiYhKGUuaG9zdD1yLnNoaWZ0KCkpOyk7ZS5ob3N0fHwoZS5ob3N0PSIiKSxlLmhvc3RuYW1lfHwoZS5ob3N0bmFtZT0iIiksIiIhPT1yWzBdJiZyLnVuc2hpZnQoIiIpLHIubGVuZ3RoPDImJnIudW5zaGlmdCgiIiksbi5wYXRobmFtZT1yLmpvaW4oIi8iKX1pZihuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnksbi5ob3N0PWUuaG9zdHx8IiIsbi5hdXRoPWUuYXV0aCxuLmhvc3RuYW1lPWUuaG9zdG5hbWV8fGUuaG9zdCxuLnBvcnQ9ZS5wb3J0LG4ucGF0aG5hbWV8fG4uc2VhcmNoKXt2YXIgaT1uLnBhdGhuYW1lfHwiIixzPW4uc2VhcmNofHwiIjtuLnBhdGg9aStzfXJldHVybiBuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn12YXIgYT1uLnBhdGhuYW1lJiYiLyI9PT1uLnBhdGhuYW1lLmNoYXJBdCgwKSxjPWUuaG9zdHx8ZS5wYXRobmFtZSYmIi8iPT09ZS5wYXRobmFtZS5jaGFyQXQoMCksdT1jfHxhfHxuLmhvc3QmJmUucGF0aG5hbWUsbD11LHA9bi5wYXRobmFtZSYmbi5wYXRobmFtZS5zcGxpdCgiLyIpfHxbXSxkPShyPWUucGF0aG5hbWUmJmUucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sbi5wcm90b2NvbCYmIWdbbi5wcm90b2NvbF0pO2lmKGQmJihuLmhvc3RuYW1lPSIiLG4ucG9ydD1udWxsLG4uaG9zdCYmKCIiPT09cFswXT9wWzBdPW4uaG9zdDpwLnVuc2hpZnQobi5ob3N0KSksbi5ob3N0PSIiLGUucHJvdG9jb2wmJihlLmhvc3RuYW1lPW51bGwsZS5wb3J0PW51bGwsZS5ob3N0JiYoIiI9PT1yWzBdP3JbMF09ZS5ob3N0OnIudW5zaGlmdChlLmhvc3QpKSxlLmhvc3Q9bnVsbCksdT11JiYoIiI9PT1yWzBdfHwiIj09PXBbMF0pKSxjKW4uaG9zdD1lLmhvc3R8fCIiPT09ZS5ob3N0P2UuaG9zdDpuLmhvc3Qsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHwiIj09PWUuaG9zdG5hbWU/ZS5ob3N0bmFtZTpuLmhvc3RuYW1lLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxwPXI7ZWxzZSBpZihyLmxlbmd0aClwfHwocD1bXSkscC5wb3AoKSxwPXAuY29uY2F0KHIpLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeTtlbHNlIGlmKG51bGwhPWUuc2VhcmNoKXJldHVybiBkJiYobi5ob3N0bmFtZT1uLmhvc3Q9cC5zaGlmdCgpLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnksUyhuLnBhdGhuYW1lKSYmUyhuLnNlYXJjaCl8fChuLnBhdGg9KG4ucGF0aG5hbWU/bi5wYXRobmFtZToiIikrKG4uc2VhcmNoP24uc2VhcmNoOiIiKSksbi5ocmVmPW4uZm9ybWF0KCksbjtpZighcC5sZW5ndGgpcmV0dXJuIG4ucGF0aG5hbWU9bnVsbCxuLnNlYXJjaD9uLnBhdGg9Ii8iK24uc2VhcmNoOm4ucGF0aD1udWxsLG4uaHJlZj1uLmZvcm1hdCgpLG47Zm9yKHZhciBoPXAuc2xpY2UoLTEpWzBdLG09KG4uaG9zdHx8ZS5ob3N0KSYmKCIuIj09PWh8fCIuLiI9PT1oKXx8IiI9PT1oLHY9MCxFPXAubGVuZ3RoO0U+PTA7RS0tKSIuIj09KGg9cFtFXSk/cC5zcGxpY2UoRSwxKToiLi4iPT09aD8ocC5zcGxpY2UoRSwxKSx2KyspOnYmJihwLnNwbGljZShFLDEpLHYtLSk7aWYoIXUmJiFsKWZvcig7di0tO3YpcC51bnNoaWZ0KCIuLiIpOyF1fHwiIj09PXBbMF18fHBbMF0mJiIvIj09PXBbMF0uY2hhckF0KDApfHxwLnVuc2hpZnQoIiIpLG0mJiIvIiE9PXAuam9pbigiLyIpLnN1YnN0cigtMSkmJnAucHVzaCgiIik7dmFyIGIsQz0iIj09PXBbMF18fHBbMF0mJiIvIj09PXBbMF0uY2hhckF0KDApO3JldHVybiBkJiYobi5ob3N0bmFtZT1uLmhvc3Q9Qz8iIjpwLmxlbmd0aD9wLnNoaWZ0KCk6IiIsKGI9ISEobi5ob3N0JiZuLmhvc3QuaW5kZXhPZigiQCIpPjApJiZuLmhvc3Quc3BsaXQoIkAiKSkmJihuLmF1dGg9Yi5zaGlmdCgpLG4uaG9zdD1uLmhvc3RuYW1lPWIuc2hpZnQoKSkpLCh1PXV8fG4uaG9zdCYmcC5sZW5ndGgpJiYhQyYmcC51bnNoaWZ0KCIiKSxwLmxlbmd0aD9uLnBhdGhuYW1lPXAuam9pbigiLyIpOihuLnBhdGhuYW1lPW51bGwsbi5wYXRoPW51bGwpLFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uYXV0aD1lLmF1dGh8fG4uYXV0aCxuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn0sby5wcm90b3R5cGUucGFyc2VIb3N0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3N0LHQ9cy5leGVjKGUpO3QmJigiOiIhPT0odD10WzBdKSYmKHRoaXMucG9ydD10LnN1YnN0cigxKSksZT1lLnN1YnN0cigwLGUubGVuZ3RoLXQubGVuZ3RoKSksZSYmKHRoaXMuaG9zdG5hbWU9ZSl9fSx7cHVueWNvZGU6OTIscXVlcnlzdHJpbmc6OTV9XSwxMDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7Zm9yKHZhciByPVtdLG89MDtvPDI1NjsrK28pcltvXT0obysyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7dmFyIGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHwwLG89cjtyZXR1cm5bb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXV0uam9pbigiIil9O24uZGVmYXVsdD1pfSx7fV0sMTAyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2NCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLmRlZmF1bHR9fSk7dmFyIHI9YShlKCIuL3YxLmpzIikpLG89YShlKCIuL3YzLmpzIikpLGk9YShlKCIuL3Y0LmpzIikpLHM9YShlKCIuL3Y1LmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fX0seyIuL3YxLmpzIjoxMDYsIi4vdjMuanMiOjEwNywiLi92NC5qcyI6MTA5LCIuL3Y1LmpzIjoxMTB9XSwxMDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPSg2NTUzNSZlKSsoNjU1MzUmdCk7cmV0dXJuKGU+PjE2KSsodD4+MTYpKyhuPj4xNik8PDE2fDY1NTM1Jm59ZnVuY3Rpb24gbyhlLHQsbixvLGkscyl7cmV0dXJuIHIoKGE9cihyKHQsZSkscihvLHMpKSk8PChjPWkpfGE+Pj4zMi1jLG4pO3ZhciBhLGN9ZnVuY3Rpb24gaShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Jm58fnQmcixlLHQsaSxzLGEpfWZ1bmN0aW9uIHMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZyfG4mfnIsZSx0LGkscyxhKX1mdW5jdGlvbiBhKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHRebl5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYyhlLHQsbixyLGkscyxhKXtyZXR1cm4gbyhuXih0fH5yKSxlLHQsaSxzLGEpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciB1PWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZVtuXT10LmNoYXJDb2RlQXQobil9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvPVtdLGk9MzIqZS5sZW5ndGgscz0iMDEyMzQ1Njc4OWFiY2RlZiI7Zm9yKHQ9MDt0PGk7dCs9OCluPWVbdD4+NV0+Pj50JTMyJjI1NSxyPXBhcnNlSW50KHMuY2hhckF0KG4+Pj40JjE1KStzLmNoYXJBdCgxNSZuKSwxNiksby5wdXNoKHIpO3JldHVybiBvfShmdW5jdGlvbihlLHQpe3ZhciBuLG8sdSxsLHA7ZVt0Pj41XXw9MTI4PDx0JTMyLGVbMTQrKHQrNjQ+Pj45PDw0KV09dDt2YXIgZD0xNzMyNTg0MTkzLGg9LTI3MTczMzg3OSxmPS0xNzMyNTg0MTk0LGc9MjcxNzMzODc4O2ZvcihuPTA7bjxlLmxlbmd0aDtuKz0xNilvPWQsdT1oLGw9ZixwPWcsZD1pKGQsaCxmLGcsZVtuXSw3LC02ODA4NzY5MzYpLGc9aShnLGQsaCxmLGVbbisxXSwxMiwtMzg5NTY0NTg2KSxmPWkoZixnLGQsaCxlW24rMl0sMTcsNjA2MTA1ODE5KSxoPWkoaCxmLGcsZCxlW24rM10sMjIsLTEwNDQ1MjUzMzApLGQ9aShkLGgsZixnLGVbbis0XSw3LC0xNzY0MTg4OTcpLGc9aShnLGQsaCxmLGVbbis1XSwxMiwxMjAwMDgwNDI2KSxmPWkoZixnLGQsaCxlW24rNl0sMTcsLTE0NzMyMzEzNDEpLGg9aShoLGYsZyxkLGVbbis3XSwyMiwtNDU3MDU5ODMpLGQ9aShkLGgsZixnLGVbbis4XSw3LDE3NzAwMzU0MTYpLGc9aShnLGQsaCxmLGVbbis5XSwxMiwtMTk1ODQxNDQxNyksZj1pKGYsZyxkLGgsZVtuKzEwXSwxNywtNDIwNjMpLGg9aShoLGYsZyxkLGVbbisxMV0sMjIsLTE5OTA0MDQxNjIpLGQ9aShkLGgsZixnLGVbbisxMl0sNywxODA0NjAzNjgyKSxnPWkoZyxkLGgsZixlW24rMTNdLDEyLC00MDM0MTEwMSksZj1pKGYsZyxkLGgsZVtuKzE0XSwxNywtMTUwMjAwMjI5MCksZD1zKGQsaD1pKGgsZixnLGQsZVtuKzE1XSwyMiwxMjM2NTM1MzI5KSxmLGcsZVtuKzFdLDUsLTE2NTc5NjUxMCksZz1zKGcsZCxoLGYsZVtuKzZdLDksLTEwNjk1MDE2MzIpLGY9cyhmLGcsZCxoLGVbbisxMV0sMTQsNjQzNzE3NzEzKSxoPXMoaCxmLGcsZCxlW25dLDIwLC0zNzM4OTczMDIpLGQ9cyhkLGgsZixnLGVbbis1XSw1LC03MDE1NTg2OTEpLGc9cyhnLGQsaCxmLGVbbisxMF0sOSwzODAxNjA4MyksZj1zKGYsZyxkLGgsZVtuKzE1XSwxNCwtNjYwNDc4MzM1KSxoPXMoaCxmLGcsZCxlW24rNF0sMjAsLTQwNTUzNzg0OCksZD1zKGQsaCxmLGcsZVtuKzldLDUsNTY4NDQ2NDM4KSxnPXMoZyxkLGgsZixlW24rMTRdLDksLTEwMTk4MDM2OTApLGY9cyhmLGcsZCxoLGVbbiszXSwxNCwtMTg3MzYzOTYxKSxoPXMoaCxmLGcsZCxlW24rOF0sMjAsMTE2MzUzMTUwMSksZD1zKGQsaCxmLGcsZVtuKzEzXSw1LC0xNDQ0NjgxNDY3KSxnPXMoZyxkLGgsZixlW24rMl0sOSwtNTE0MDM3ODQpLGY9cyhmLGcsZCxoLGVbbis3XSwxNCwxNzM1MzI4NDczKSxkPWEoZCxoPXMoaCxmLGcsZCxlW24rMTJdLDIwLC0xOTI2NjA3NzM0KSxmLGcsZVtuKzVdLDQsLTM3ODU1OCksZz1hKGcsZCxoLGYsZVtuKzhdLDExLC0yMDIyNTc0NDYzKSxmPWEoZixnLGQsaCxlW24rMTFdLDE2LDE4MzkwMzA1NjIpLGg9YShoLGYsZyxkLGVbbisxNF0sMjMsLTM1MzA5NTU2KSxkPWEoZCxoLGYsZyxlW24rMV0sNCwtMTUzMDk5MjA2MCksZz1hKGcsZCxoLGYsZVtuKzRdLDExLDEyNzI4OTMzNTMpLGY9YShmLGcsZCxoLGVbbis3XSwxNiwtMTU1NDk3NjMyKSxoPWEoaCxmLGcsZCxlW24rMTBdLDIzLC0xMDk0NzMwNjQwKSxkPWEoZCxoLGYsZyxlW24rMTNdLDQsNjgxMjc5MTc0KSxnPWEoZyxkLGgsZixlW25dLDExLC0zNTg1MzcyMjIpLGY9YShmLGcsZCxoLGVbbiszXSwxNiwtNzIyNTIxOTc5KSxoPWEoaCxmLGcsZCxlW24rNl0sMjMsNzYwMjkxODkpLGQ9YShkLGgsZixnLGVbbis5XSw0LC02NDAzNjQ0ODcpLGc9YShnLGQsaCxmLGVbbisxMl0sMTEsLTQyMTgxNTgzNSksZj1hKGYsZyxkLGgsZVtuKzE1XSwxNiw1MzA3NDI1MjApLGQ9YyhkLGg9YShoLGYsZyxkLGVbbisyXSwyMywtOTk1MzM4NjUxKSxmLGcsZVtuXSw2LC0xOTg2MzA4NDQpLGc9YyhnLGQsaCxmLGVbbis3XSwxMCwxMTI2ODkxNDE1KSxmPWMoZixnLGQsaCxlW24rMTRdLDE1LC0xNDE2MzU0OTA1KSxoPWMoaCxmLGcsZCxlW24rNV0sMjEsLTU3NDM0MDU1KSxkPWMoZCxoLGYsZyxlW24rMTJdLDYsMTcwMDQ4NTU3MSksZz1jKGcsZCxoLGYsZVtuKzNdLDEwLC0xODk0OTg2NjA2KSxmPWMoZixnLGQsaCxlW24rMTBdLDE1LC0xMDUxNTIzKSxoPWMoaCxmLGcsZCxlW24rMV0sMjEsLTIwNTQ5MjI3OTkpLGQ9YyhkLGgsZixnLGVbbis4XSw2LDE4NzMzMTMzNTkpLGc9YyhnLGQsaCxmLGVbbisxNV0sMTAsLTMwNjExNzQ0KSxmPWMoZixnLGQsaCxlW24rNl0sMTUsLTE1NjAxOTgzODApLGg9YyhoLGYsZyxkLGVbbisxM10sMjEsMTMwOTE1MTY0OSksZD1jKGQsaCxmLGcsZVtuKzRdLDYsLTE0NTUyMzA3MCksZz1jKGcsZCxoLGYsZVtuKzExXSwxMCwtMTEyMDIxMDM3OSksZj1jKGYsZyxkLGgsZVtuKzJdLDE1LDcxODc4NzI1OSksaD1jKGgsZixnLGQsZVtuKzldLDIxLC0zNDM0ODU1NTEpLGQ9cihkLG8pLGg9cihoLHUpLGY9cihmLGwpLGc9cihnLHApO3JldHVybltkLGgsZixnXX0oZnVuY3Rpb24oZSl7dmFyIHQsbj1bXTtmb3IoblsoZS5sZW5ndGg+PjIpLTFdPXZvaWQgMCx0PTA7dDxuLmxlbmd0aDt0Kz0xKW5bdF09MDt2YXIgcj04KmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpblt0Pj41XXw9KDI1NSZlW3QvOF0pPDx0JTMyO3JldHVybiBufShlKSw4KmUubGVuZ3RoKSl9O24uZGVmYXVsdD11fSx7fV0sMTA0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oKXtpZighcil0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIHIobyl9O3ZhciByPSJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBtc0NyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLG89bmV3IFVpbnQ4QXJyYXkoMTYpfSx7fV0sMTA1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdCZuXn50JnI7Y2FzZSAxOmNhc2UgMzpyZXR1cm4gdF5uXnI7Y2FzZSAyOnJldHVybiB0Jm5edCZyXm4mcn19ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PVsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwzMzk1NDY5NzgyXSxuPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF07aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgaT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2U9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyllW3NdPWkuY2hhckNvZGVBdChzKX1lLnB1c2goMTI4KTt2YXIgYT1lLmxlbmd0aC80KzIsYz1NYXRoLmNlaWwoYS8xNiksdT1uZXcgQXJyYXkoYyk7Zm9yKHM9MDtzPGM7cysrKXt1W3NdPW5ldyBBcnJheSgxNik7Zm9yKHZhciBsPTA7bDwxNjtsKyspdVtzXVtsXT1lWzY0KnMrNCpsXTw8MjR8ZVs2NCpzKzQqbCsxXTw8MTZ8ZVs2NCpzKzQqbCsyXTw8OHxlWzY0KnMrNCpsKzNdfWZvcih1W2MtMV1bMTRdPTgqKGUubGVuZ3RoLTEpL01hdGgucG93KDIsMzIpLHVbYy0xXVsxNF09TWF0aC5mbG9vcih1W2MtMV1bMTRdKSx1W2MtMV1bMTVdPTgqKGUubGVuZ3RoLTEpJjQyOTQ5NjcyOTUscz0wO3M8YztzKyspe2Zvcih2YXIgcD1uZXcgQXJyYXkoODApLGQ9MDtkPDE2O2QrKylwW2RdPXVbc11bZF07Zm9yKGQ9MTY7ZDw4MDtkKyspcFtkXT1vKHBbZC0zXV5wW2QtOF1ecFtkLTE0XV5wW2QtMTZdLDEpO3ZhciBoPW5bMF0sZj1uWzFdLGc9blsyXSxtPW5bM10sdj1uWzRdO2ZvcihkPTA7ZDw4MDtkKyspe3ZhciB5PU1hdGguZmxvb3IoZC8yMCksRT1vKGgsNSkrcih5LGYsZyxtKSt2K3RbeV0rcFtkXT4+PjA7dj1tLG09ZyxnPW8oZiwzMCk+Pj4wLGY9aCxoPUV9blswXT1uWzBdK2g+Pj4wLG5bMV09blsxXStmPj4+MCxuWzJdPW5bMl0rZz4+PjAsblszXT1uWzNdK20+Pj4wLG5bNF09bls0XSt2Pj4+MH1yZXR1cm5bblswXT4+MjQmMjU1LG5bMF0+PjE2JjI1NSxuWzBdPj44JjI1NSwyNTUmblswXSxuWzFdPj4yNCYyNTUsblsxXT4+MTYmMjU1LG5bMV0+PjgmMjU1LDI1NSZuWzFdLG5bMl0+PjI0JjI1NSxuWzJdPj4xNiYyNTUsblsyXT4+OCYyNTUsMjU1Jm5bMl0sblszXT4+MjQmMjU1LG5bM10+PjE2JjI1NSxuWzNdPj44JjI1NSwyNTUmblszXSxuWzRdPj4yNCYyNTUsbls0XT4+MTYmMjU1LG5bNF0+PjgmMjU1LDI1NSZuWzRdXX07bi5kZWZhdWx0PWl9LHt9XSwxMDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHIsbyxpPWEoZSgiLi9ybmcuanMiKSkscz1hKGUoIi4vYnl0ZXNUb1V1aWQuanMiKSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIGM9MCx1PTAsbD1mdW5jdGlvbihlLHQsbil7dmFyIGE9dCYmbnx8MCxsPXR8fFtdLHA9KGU9ZXx8e30pLm5vZGV8fHIsZD12b2lkIDAhPT1lLmNsb2Nrc2VxP2UuY2xvY2tzZXE6bztpZihudWxsPT1wfHxudWxsPT1kKXt2YXIgaD1lLnJhbmRvbXx8KGUucm5nfHxpLmRlZmF1bHQpKCk7bnVsbD09cCYmKHA9cj1bMXxoWzBdLGhbMV0saFsyXSxoWzNdLGhbNF0saFs1XV0pLG51bGw9PWQmJihkPW89MTYzODMmKGhbNl08PDh8aFs3XSkpfXZhciBmPXZvaWQgMCE9PWUubXNlY3M/ZS5tc2VjczoobmV3IERhdGUpLmdldFRpbWUoKSxnPXZvaWQgMCE9PWUubnNlY3M/ZS5uc2Vjczp1KzEsbT1mLWMrKGctdSkvMWU0O2lmKG08MCYmdm9pZCAwPT09ZS5jbG9ja3NlcSYmKGQ9ZCsxJjE2MzgzKSwobTwwfHxmPmMpJiZ2b2lkIDA9PT1lLm5zZWNzJiYoZz0wKSxnPj0xZTQpdGhyb3cgbmV3IEVycm9yKCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlYyIpO2M9Zix1PWcsbz1kO3ZhciB2PSgxZTQqKDI2ODQzNTQ1NSYoZis9MTIyMTkyOTI4ZTUpKStnKSU0Mjk0OTY3Mjk2O2xbYSsrXT12Pj4+MjQmMjU1LGxbYSsrXT12Pj4+MTYmMjU1LGxbYSsrXT12Pj4+OCYyNTUsbFthKytdPTI1NSZ2O3ZhciB5PWYvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O2xbYSsrXT15Pj4+OCYyNTUsbFthKytdPTI1NSZ5LGxbYSsrXT15Pj4+MjQmMTV8MTYsbFthKytdPXk+Pj4xNiYyNTUsbFthKytdPWQ+Pj44fDEyOCxsW2ErK109MjU1JmQ7Zm9yKHZhciBFPTA7RTw2OysrRSlsW2ErRV09cFtFXTtyZXR1cm4gdHx8KDAscy5kZWZhdWx0KShsKX07bi5kZWZhdWx0PWx9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxLCIuL3JuZy5qcyI6MTA0fV0sMTA3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi92MzUuanMiKSksbz1pKGUoIi4vbWQ1LmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInYzIiw0OCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vbWQ1LmpzIjoxMDMsIi4vdjM1LmpzIjoxMDh9XSwxMDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSxyLGkscyl7dmFyIGE9aSYmc3x8MDtpZigic3RyaW5nIj09dHlwZW9mIGUmJihlPWZ1bmN0aW9uKGUpe2U9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtmb3IodmFyIHQ9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9KGUpKSwic3RyaW5nIj09dHlwZW9mIHImJihyPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBlLnJlcGxhY2UoL1thLWZBLUYwLTldezJ9L2csKGZ1bmN0aW9uKGUpe3QucHVzaChwYXJzZUludChlLDE2KSl9KSksdH0ocikpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IFR5cGVFcnJvcigidmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBieXRlcyIpO2lmKCFBcnJheS5pc0FycmF5KHIpfHwxNiE9PXIubGVuZ3RoKXRocm93IFR5cGVFcnJvcigibmFtZXNwYWNlIG11c3QgYmUgdXVpZCBzdHJpbmcgb3IgYW4gQXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMiKTt2YXIgYz1uKHIuY29uY2F0KGUpKTtpZihjWzZdPTE1JmNbNl18dCxjWzhdPTYzJmNbOF18MTI4LGkpZm9yKHZhciB1PTA7dTwxNjsrK3UpaVthK3VdPWNbdV07cmV0dXJuIGl8fCgwLG8uZGVmYXVsdCkoYyl9O3RyeXtyLm5hbWU9ZX1jYXRjaChlKXt9cmV0dXJuIHIuRE5TPWksci5VUkw9cyxyfSxuLlVSTD1uLkROUz12b2lkIDA7dmFyIHIsbz0ocj1lKCIuL2J5dGVzVG9VdWlkLmpzIikpJiZyLl9fZXNNb2R1bGU/cjp7ZGVmYXVsdDpyfTtjb25zdCBpPSI2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgiO24uRE5TPWk7Y29uc3Qgcz0iNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLlVSTD1zfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMX1dLDEwOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vcm5nLmpzIikpLG89aShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10JiZufHwwOyJzdHJpbmciPT10eXBlb2YgZSYmKHQ9ImJpbmFyeSI9PT1lP25ldyBBcnJheSgxNik6bnVsbCxlPW51bGwpO3ZhciBzPShlPWV8fHt9KS5yYW5kb218fChlLnJuZ3x8ci5kZWZhdWx0KSgpO2lmKHNbNl09MTUmc1s2XXw2NCxzWzhdPTYzJnNbOF18MTI4LHQpZm9yKHZhciBhPTA7YTwxNjsrK2EpdFtpK2FdPXNbYV07cmV0dXJuIHR8fCgwLG8uZGVmYXVsdCkocyl9O24uZGVmYXVsdD1zfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDExMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL3NoYTEuanMiKSk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIHM9KDAsci5kZWZhdWx0KSgidjUiLDgwLG8uZGVmYXVsdCk7bi5kZWZhdWx0PXN9LHsiLi9zaGExLmpzIjoxMDUsIi4vdjM1LmpzIjoxMDh9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWUoIi4vdXRpbHMvTFJVIiksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9MWUzKSx0aGlzLm1heFNpemU9ZSx0aGlzLmNhY2hlPW5ldyByLkxSVUNhY2hlKGUpfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZS5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsbil7dmFyIHI9InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQsbz10aGlzLnBvcHVsYXRlVmFsdWUobik7dGhpcy5jYWNoZS5wdXQocixvKX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LHI9RGF0ZS5ub3coKSxvPXRoaXMuY2FjaGUuZ2V0KG4pO2lmKG8pe2Zvcih2YXIgaT1vLmxlbmd0aC0xO2k+PTA7aS0tKW9baV0uRXhwaXJlPHImJm8uc3BsaWNlKGksMSk7aWYoMD09PW8ubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMuY2FjaGUucmVtb3ZlKG4pfXJldHVybiBvfSxlLmdldEtleVN0cmluZz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1PYmplY3Qua2V5cyhlKS5zb3J0KCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO3ZvaWQgMCE9PWVbb10mJnQucHVzaChlW29dKX1yZXR1cm4gdC5qb2luKCIgIil9LGUucHJvdG90eXBlLnBvcHVsYXRlVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQ9RGF0ZS5ub3coKTtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybntBZGRyZXNzOmUuQWRkcmVzc3x8IiIsRXhwaXJlOnQrNjAqKGUuQ2FjaGVQZXJpb2RJbk1pbnV0ZXN8fDEpKjFlM319KSl9LGUucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5lbXB0eSgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIG49InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQ7dGhpcy5jYWNoZS5yZW1vdmUobil9LGV9KCk7bi5FbmRwb2ludENhY2hlPW99LHsiLi91dGlscy9MUlUiOjExMn1dLDExMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSx0KXt0aGlzLmtleT1lLHRoaXMudmFsdWU9dH0sbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5ub2RlTWFwPXt9LHRoaXMuc2l6ZT0wLCJudW1iZXIiIT10eXBlb2YgZXx8ZTwxKXRocm93IG5ldyBFcnJvcigiQ2FjaGUgc2l6ZSBjYW4gb25seSBiZSBwb3NpdGl2ZSBudW1iZXIiKTt0aGlzLnNpemVMaW1pdD1lfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucHJlcGVuZFRvTGlzdD1mdW5jdGlvbihlKXt0aGlzLmhlYWRlck5vZGU/KHRoaXMuaGVhZGVyTm9kZS5wcmV2PWUsZS5uZXh0PXRoaXMuaGVhZGVyTm9kZSk6dGhpcy50YWlsTm9kZT1lLHRoaXMuaGVhZGVyTm9kZT1lLHRoaXMuc2l6ZSsrfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tVGFpbD1mdW5jdGlvbigpe2lmKHRoaXMudGFpbE5vZGUpe3ZhciBlPXRoaXMudGFpbE5vZGUsdD1lLnByZXY7cmV0dXJuIHQmJih0Lm5leHQ9dm9pZCAwKSxlLnByZXY9dm9pZCAwLHRoaXMudGFpbE5vZGU9dCx0aGlzLnNpemUtLSxlfX0sZS5wcm90b3R5cGUuZGV0YWNoRnJvbUxpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPT09ZSYmKHRoaXMuaGVhZGVyTm9kZT1lLm5leHQpLHRoaXMudGFpbE5vZGU9PT1lJiYodGhpcy50YWlsTm9kZT1lLnByZXYpLGUucHJldiYmKGUucHJldi5uZXh0PWUubmV4dCksZS5uZXh0JiYoZS5uZXh0LnByZXY9ZS5wcmV2KSxlLm5leHQ9dm9pZCAwLGUucHJldj12b2lkIDAsdGhpcy5zaXplLS19LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXtpZih0aGlzLm5vZGVNYXBbZV0pe3ZhciB0PXRoaXMubm9kZU1hcFtlXTtyZXR1cm4gdGhpcy5kZXRhY2hGcm9tTGlzdCh0KSx0aGlzLnByZXBlbmRUb0xpc3QodCksdC52YWx1ZX19LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtpZih0aGlzLm5vZGVNYXBbZV0pe3ZhciB0PXRoaXMubm9kZU1hcFtlXTt0aGlzLmRldGFjaEZyb21MaXN0KHQpLGRlbGV0ZSB0aGlzLm5vZGVNYXBbZV19fSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLm5vZGVNYXBbZV0pdGhpcy5yZW1vdmUoZSk7ZWxzZSBpZih0aGlzLnNpemU9PT10aGlzLnNpemVMaW1pdCl7dmFyIG49dGhpcy5yZW1vdmVGcm9tVGFpbCgpLmtleTtkZWxldGUgdGhpcy5ub2RlTWFwW25dfXZhciBvPW5ldyByKGUsdCk7dGhpcy5ub2RlTWFwW2VdPW8sdGhpcy5wcmVwZW5kVG9MaXN0KG8pfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh0aGlzLm5vZGVNYXApLHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XSxyPXRoaXMubm9kZU1hcFtuXTt0aGlzLmRldGFjaEZyb21MaXN0KHIpLGRlbGV0ZSB0aGlzLm5vZGVNYXBbbl19fSxlfSgpO24uTFJVQ2FjaGU9b30se31dLDExMzpbZnVuY3Rpb24oZSx0LG4pe2UoIi4vYnJvd3Nlcl9sb2FkZXIiKTt2YXIgcj1lKCIuL2NvcmUiKTsidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5BV1M9ciksdm9pZCAwIT09dCYmKHQuZXhwb3J0cz1yKSwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJihzZWxmLkFXUz1yKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiQ29ubmVjdCIpfHwoci5hcGlMb2FkZXIuc2VydmljZXMuY29ubmVjdD17fSxyLkNvbm5lY3Q9ci5TZXJ2aWNlLmRlZmluZVNlcnZpY2UoImNvbm5lY3QiLFsiMjAxNy0wMi0xNSJdKSksci5hcGlMb2FkZXIuc2VydmljZXMuY29ubmVjdFsiMjAxNy0wMi0xNSJdPWUoIi4uL2FwaXMvY29ubmVjdC0yMDE3LTAyLTE1Lm1pbiIpfSx7Ii4uL2FwaXMvY29ubmVjdC0yMDE3LTAyLTE1Lm1pbiI6MywiLi9icm93c2VyX2xvYWRlciI6MTYsIi4vY29yZSI6MTl9XX0se30sWzExM10pfSw3NTQ6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LkNsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImdldEFnZW50U25hcHNob3QiLCJwdXRBZ2VudFN0YXRlIiwiZ2V0QWdlbnRTdGF0ZXMiLCJnZXREaWFsYWJsZUNvdW50cnlDb2RlcyIsImdldFJvdXRpbmdQcm9maWxlUXVldWVzIiwiZ2V0QWdlbnRQZXJtaXNzaW9ucyIsImdldEFnZW50Q29uZmlndXJhdGlvbiIsInVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbiIsImFjY2VwdENvbnRhY3QiLCJjcmVhdGVPdXRib3VuZENvbnRhY3QiLCJjcmVhdGVUYXNrQ29udGFjdCIsImNsZWFyQ29udGFjdCIsImNvbXBsZXRlQ29udGFjdCIsImRlc3Ryb3lDb250YWN0IiwicmVqZWN0Q29udGFjdCIsIm5vdGlmeUNvbnRhY3RJc3N1ZSIsInVwZGF0ZUNvbnRhY3RBdHRyaWJ1dGVzIiwiY3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb24iLCJkZXN0cm95Q29ubmVjdGlvbiIsImhvbGRDb25uZWN0aW9uIiwicmVzdW1lQ29ubmVjdGlvbiIsInRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zIiwiY29uZmVyZW5jZUNvbm5lY3Rpb25zIiwic2VuZENsaWVudExvZ3MiLCJzZW5kRGlnaXRzIiwic2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQiLCJzZW5kU29mdHBob25lQ2FsbE1ldHJpY3MiLCJnZXRFbmRwb2ludHMiLCJnZXROZXdBdXRoVG9rZW4iLCJjcmVhdGVUcmFuc3BvcnQiLCJtdXRlUGFydGljaXBhbnQiLCJ1bm11dGVQYXJ0aWNpcGFudCIsInVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlIl0pLHQuQWdlbnRBcHBDbGllbnRNZXRob2RzPXtHRVRfQ09OVEFDVDoiQWdlbnRBcHBTZXJ2aWNlLkxjbXMuZ2V0Q29udGFjdCIsREVMRVRFX1NQRUFLRVI6IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlbGV0ZVNwZWFrZXIiLEVOUk9MTF9CWV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5lbnJvbGxCeVNlc3Npb24iLEVWQUxVQVRFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmV2YWx1YXRlU2Vzc2lvbiIsREVTQ1JJQkVfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVzY3JpYmVTcGVha2VyIixPUFRfT1VUX1NQRUFLRVI6IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLm9wdE91dFNwZWFrZXIiLFVQREFURV9WT0lDRV9JRF9EQVRBOiJBZ2VudEFwcFNlcnZpY2UuTGNtcy51cGRhdGVWb2ljZUlkRGF0YSIsREVTQ1JJQkVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVzY3JpYmVTZXNzaW9uIixVUERBVEVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQudXBkYXRlU2Vzc2lvbiIsU1RBUlRfVk9JQ0VfSURfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLk5hc2Euc3RhcnRWb2ljZUlkU2Vzc2lvbiIsTElTVF9JTlRFR1JBVElPTl9BU1NPQ0lBVElPTlM6IkFnZW50QXBwU2VydmljZS5BY3MubGlzdEludGVncmF0aW9uQXNzb2NpYXRpb25zIn0sdC5NYXN0ZXJNZXRob2RzPXQubWFrZUVudW0oWyJiZWNvbWVNYXN0ZXIiLCJjaGVja01hc3RlciJdKSx0LlRhc2tUZW1wbGF0ZXNDbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJsaXN0VGFza1RlbXBsYXRlcyIsImdldFRhc2tUZW1wbGF0ZSIsImNyZWF0ZVRlbXBsYXRlZFRhc2siLCJ1cGRhdGVDb250YWN0Il0pLHQuQXBpUHJveHlDbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJxckludGVncmF0aW9uRXhpc3RzIiwicXJTZWFyY2hRdWlja1Jlc3BvbnNlcyJdKSx0LlJldHJ5YWJsZUNsaWVudE1ldGhvZHNMaXN0PVt0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NOQVBTSE9ULHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHQuQ2xpZW50TWV0aG9kcy5HRVRfRElBTEFCTEVfQ09VTlRSWV9DT0RFUyx0LkNsaWVudE1ldGhvZHMuR0VUX1JPVVRJTkdfUFJPRklMRV9RVUVVRVNdLHQuUmV0cnlhYmxlRXJyb3JzPXQubWFrZUVudW0oWyJ1bmF1dGhvcml6ZWQiLCJhY2Nlc3NEZW5pZWQiXSksdC5SZXRyeVN0YXR1cz10Lm1ha2VFbnVtKFsicmV0cnlpbmciLCJleGhhdXN0ZWQiLCJub25lIl0pO3ZhciBuPWZ1bmN0aW9uKCl7fTtuLkVNUFRZX0NBTExCQUNLUz17c3VjY2VzczpmdW5jdGlvbigpe30sZmFpbHVyZTpmdW5jdGlvbigpe319LG4ucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJtZXRob2QiKTt2YXIgaT1yfHx7fSxzPW98fG4uRU1QVFlfQ0FMTEJBQ0tTO3RoaXMuX2NhbGxJbXBsKGUsaSxzKX0sbi5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfTt2YXIgcj1mdW5jdGlvbigpe24uY2FsbCh0aGlzKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7aWYociYmci5mYWlsdXJlKXt2YXIgbz10LnNwcmludGYoIk5vIHN1Y2ggbWV0aG9kIGV4aXN0cyBvbiBOVUxMIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKG8pLHttZXNzYWdlOm99KX19O3ZhciBvPWZ1bmN0aW9uKGUscixvKXtuLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PWUsdGhpcy5yZXF1ZXN0RXZlbnQ9cix0aGlzLnJlc3BvbnNlRXZlbnQ9byx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e30sdGhpcy5jb25kdWl0Lm9uVXBzdHJlYW0obyx0LmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVxdWVzdCh0aGlzLnJlcXVlc3RFdmVudCxlLG4pO3RoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtvLnJlcXVlc3RJZF09cjtjb25zdCBpPVt0LkNsaWVudE1ldGhvZHMuU0VORF9DTElFTlRfTE9HUyx0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTLHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVF07dHJ5e28uZXZlbnQhPT10LkV2ZW50VHlwZS5BUElfUkVRVUVTVHx8aS5pbmNsdWRlcyhvLm1ldGhvZCl8fHQuZ2V0TG9nKCkudHJhY2UoYFNlbmRpbmcgQVBJX1JFUVVFU1QgZXZlbnQgZm9yICR7by5tZXRob2R9IHRvIHVwc3RyZWFtYCkud2l0aE9iamVjdCh7bWV0aG9kOm8ubWV0aG9kLHBhcmFtczpvLnBhcmFtcyxzdGFjazoobmV3IEVycm9yKS5zdGFja30pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiU3RhY2sgdHJhY2UgTG9nIEZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10aGlzLmNvbmR1aXQuc2VuZFVwc3RyZWFtKG8uZXZlbnQsbyl9LG8ucHJvdG90eXBlLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXXx8bnVsbDtyZXR1cm4gbnVsbCE9dCYmZGVsZXRlIHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXSx0fSxvLnByb3RvdHlwZS5faGFuZGxlUmVzcG9uc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdChlLnJlcXVlc3RJZCk7bnVsbCE9dCYmKGUuZXJyJiZ0LmZhaWx1cmU/dC5mYWlsdXJlKGUuZXJyLGUuZGF0YSk6dC5zdWNjZXNzJiZ0LnN1Y2Nlc3MoZS5kYXRhKSl9O3ZhciBpPWZ1bmN0aW9uKGUpe28uY2FsbCh0aGlzLGUsdC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFKX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pO3ZhciBzPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BUElfUFJPWFlfUkVTUE9OU0UsdC5oaXRjaCh0aGlzLHRoaXMuX2hhbmRsZVJlc3BvbnNlKSksdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwPXt9fTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXF1ZXN0KHQuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVFVRVNULGUsbik7dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW28ucmVxdWVzdElkXT1yLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQVBJX1BST1hZX1JFUVVFU1Qsbyl9LHMucHJvdG90eXBlLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXXx8bnVsbDtyZXR1cm4gbnVsbCE9dCYmZGVsZXRlIHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXSx0fSxzLnByb3RvdHlwZS5faGFuZGxlUmVzcG9uc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdChlLnJlcXVlc3RJZCk7bnVsbCE9dCYmKGUuZXJyJiZ0LmZhaWx1cmU/dC5mYWlsdXJlKGUuZXJyLGUuZGF0YSk6dC5zdWNjZXNzJiZ0LnN1Y2Nlc3MoZS5kYXRhKSl9O3ZhciBhPWZ1bmN0aW9uKGUpe28uY2FsbCh0aGlzLGUsdC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFKX07KGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1hO3ZhciBjPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiYXV0aENvb2tpZU5hbWUiKSx0LmFzc2VydE5vdE51bGwociwiYXV0aFRva2VuIiksdC5hc3NlcnROb3ROdWxsKG8sImVuZHBvaW50Iiksbi5jYWxsKHRoaXMpLHRoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2wobyksdGhpcy5hdXRoVG9rZW49cix0aGlzLmF1dGhDb29raWVOYW1lPWV9OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT17fTtpW28uYXV0aENvb2tpZU5hbWVdPW8uYXV0aFRva2VuO3ZhciBzPXttZXRob2Q6InBvc3QiLGJvZHk6SlNPTi5zdHJpbmdpZnkobnx8e30pLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUFtei10YXJnZXQiOmUsIlgtQW16LUJlYXJlciI6SlNPTi5zdHJpbmdpZnkoaSl9fTt0LmZldGNoKG8uZW5kcG9pbnRVcmwscykudGhlbigoZnVuY3Rpb24oZSl7ci5zdWNjZXNzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zdCB0PWUuYm9keS5nZXRSZWFkZXIoKTtsZXQgbj0iIjtjb25zdCBvPW5ldyBUZXh0RGVjb2Rlcjt0LnJlYWQoKS50aGVuKChmdW5jdGlvbiBpKHtkb25lOnMsdmFsdWU6YX0pe2lmKHMpe3ZhciBjPUpTT04ucGFyc2Uobik7cmV0dXJuIGMuc3RhdHVzPWUuc3RhdHVzLHZvaWQgci5mYWlsdXJlKGMpfXJldHVybiBuKz1vLmRlY29kZShhKSx0LnJlYWQoKS50aGVuKGkpfSkpfSkpfTt2YXIgdT1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImF1dGhUb2tlbiIpLHQuYXNzZXJ0Tm90TnVsbChyLCJyZWdpb24iKSxuLmNhbGwodGhpcyksQVdTLmNvbmZpZy5jcmVkZW50aWFscz1uZXcgQVdTLkNyZWRlbnRpYWxzKHt9KSxBV1MuY29uZmlnLnJlZ2lvbj1yLHRoaXMuYXV0aFRva2VuPWU7dmFyIGk9dC5nZXRCYXNlVXJsKCkscz1vfHwoaS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIik/aSsiL2Nvbm5lY3QvYXBpIjppKyIvYXBpIiksYT1uZXcgQVdTLkVuZHBvaW50KHMpO3RoaXMuY2xpZW50PW5ldyBBV1MuQ29ubmVjdCh7ZW5kcG9pbnQ6YX0pLHRoaXMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCx0aGlzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTB9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmdldExvZygpO2lmKHQuY29udGFpbnModGhpcy5jbGllbnQsZSkpbj10aGlzLl90cmFuc2xhdGVQYXJhbXMoZSxuKSxpLnRyYWNlKCJBV1NDbGllbnQ6IC0tXHgzZSBDYWxsaW5nIG9wZXJhdGlvbiAnJXMnIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50W2VdKG4pLm9uKCJidWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQmVhcmVyIl09by5hdXRoVG9rZW59KSkuc2VuZCgoZnVuY3Rpb24obixzKXt0cnl7aWYobiluLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTnx8NDAxPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEKTpuLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT058fDQwMz09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQpOihvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHIuZmFpbHVyZShvLl9mb3JtYXRDYWxsRXJyb3Ioby5fYWRkU3RhdHVzQ29kZVRvRXJyb3IobikpLHMpKSxpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBmYWlsZWQ6ICVzIixlLEpTT04uc3RyaW5naWZ5KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7bGV0IHQ9e307aS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgc3VjY2VlZGVkLiIsZSkud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsdGhpcy5odHRwUmVzcG9uc2UmJnRoaXMuaHR0cFJlc3BvbnNlLmhhc093blByb3BlcnR5KCJib2R5IikmJih0LmNvbnRlbnRMZW5ndGg9dGhpcy5odHRwUmVzcG9uc2UuYm9keS5sZW5ndGgpLHIuc3VjY2VzcyhzLHQpfX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaGFuZGxlIEFXUyBBUEkgcmVxdWVzdCBmb3IgbWV0aG9kICVzIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpO2Vsc2V7dmFyIHM9dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gQVdTIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKHMpLHttZXNzYWdlOnN9KX19LHUucHJvdG90eXBlLl9pc1JldHJ5YWJsZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdC5pbmNsdWRlcyhlKX0sdS5wcm90b3R5cGUuX3JldHJ5TWV0aG9kPWZ1bmN0aW9uKGUsbixyLG8saSl7dmFyIHM9dGhpcyxhPXQuZ2V0TG9nKCk7Y29uc3QgYz1lPT5zLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpO2xldCB1PXttYXhDb3VudDp0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOihlLHQpPT5uLmZhaWx1cmUoYyhlKSx0KSxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYXV0aEZhaWx1cmUoYyhlKSx0KX07c3dpdGNoKGkpe2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDp1PXsuLi51LG1heENvdW50OnQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6ImFjY2VzcyBkZW5pZWQiLGV4aGF1c3RlZFJldHJpZXM6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hY2Nlc3NEZW5pZWQoYyhlKSx0KX19bGV0IGw9ey4uLnIscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5OT05FfTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIXUuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkIHdpdGggJHt1LmVycm9yTWVzc2FnZX0gZXJyb3IuIFJldHJ5aW5nIGNhbGwgZm9yIGEgJHt1LmZhaWxDb3VudGVyKzF9IHRpbWVgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUuaW5jcmVhc2VDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLlJFVFJZSU5HfSx2b2lkIHUucmV0cnlDYWxsYmFjayhsLG8pO2EudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGV4aGF1c3RlZCBtYXggJHt1Lm1heENvdW50fSBudW1iZXIgb2YgcmV0cmllcyBmb3IgJHt1LmVycm9yTWVzc2FnZX0gZXJyb3JgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUucmVzZXRDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLkVYSEFVU1RFRH19ZWxzZSBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocil9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt1LmRlZmF1bHRDYWxsYmFjayhsLG8pfSx1LnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKGUpe2NvbnN0IG49e3R5cGU6ZS5jb2RlLG1lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOmUucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSwuLi5lLnN0YXR1c0NvZGUmJntzdGF0dXNDb2RlOmUuc3RhdHVzQ29kZX19O2lmKGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/bi5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz9uLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYobi5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1maW5hbGx5e31yZXR1cm4gbn0sdS5wcm90b3R5cGUuX2FkZFN0YXR1c0NvZGVUb0Vycm9yPWZ1bmN0aW9uKGUpe2lmKGUuc3RhdHVzQ29kZSlyZXR1cm4gZTtjb25zdCBuPXsuLi5lfTtpZihlLmNvZGUpc3dpdGNoKG4uY29kZSl7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2UgdC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDN9ZWxzZSBuLnN0YXR1c0NvZGU9NDAwO3JldHVybiBufSx1LnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsbil7c3dpdGNoKGUpe2Nhc2UgdC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOm4uY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24obi5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6bi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3Mobi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDpuLnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KG4ucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYobi5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksbn0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LHUucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgbD1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciByPW5ldyBBV1MuRW5kcG9pbnQoZSksbz1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woYCR7ci5ob3N0fSR7b30vdGFzay10ZW1wbGF0ZXMvYXBpL2NjcGApfX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKGUsIm1ldGhvZCIpLHQuYXNzZXJ0Tm90TnVsbChuLCJwYXJhbXMiKTt2YXIgbz17Y3JlZGVudGlhbHM6ImluY2x1ZGUiLG1ldGhvZDoiR0VUIixoZWFkZXJzOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwieC1jc3JmLXRva2VuIjoiY3NyZiJ9fSxpPW4uaW5zdGFuY2VJZCxzPXRoaXMuZW5kcG9pbnRVcmwsYT10LlRhc2tUZW1wbGF0ZXNDbGllbnRNZXRob2RzO3N3aXRjaChlKXtjYXNlIGEuTElTVF9UQVNLX1RFTVBMQVRFUzppZihzKz1gL3Byb3h5L2luc3RhbmNlLyR7aX0vdGFzay90ZW1wbGF0ZWAsbi5xdWVyeVBhcmFtcyl7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zKG4ucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7ZSYmKHMrPWA/JHtlfWApfWJyZWFrO2Nhc2UgYS5HRVRfVEFTS19URU1QTEFURTp0LmFzc2VydE5vdE51bGwobi50ZW1wbGF0ZVBhcmFtcywicGFyYW1zLnRlbXBsYXRlUGFyYW1zIik7Y29uc3Qgcj10LmFzc2VydE5vdE51bGwobi50ZW1wbGF0ZVBhcmFtcy5pZCwicGFyYW1zLnRlbXBsYXRlUGFyYW1zLmlkIiksYz1uLnRlbXBsYXRlUGFyYW1zLnZlcnNpb247cys9YC9wcm94eS9pbnN0YW5jZS8ke2l9L3Rhc2svdGVtcGxhdGUvJHtyfWAsYyYmKHMrPWA/c25hcHNob3RWZXJzaW9uPSR7Y31gKTticmVhaztjYXNlIGEuQ1JFQVRFX1RFTVBMQVRFRF9UQVNLOnMrPWAvJHtlfWAsby5ib2R5PUpTT04uc3RyaW5naWZ5KG4pLG8ubWV0aG9kPSJQVVQiO2JyZWFrO2Nhc2UgYS5VUERBVEVfQ09OVEFDVDpzKz1gLyR7ZX1gLG8uYm9keT1KU09OLnN0cmluZ2lmeShuKSxvLm1ldGhvZD0iUE9TVCJ9dC5mZXRjaChzLG8pLnRoZW4oKGZ1bmN0aW9uKGUpe3Iuc3VjY2VzcyhlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJvZHkuZ2V0UmVhZGVyKCk7bGV0IG49IiI7Y29uc3Qgbz1uZXcgVGV4dERlY29kZXI7dC5yZWFkKCkudGhlbigoZnVuY3Rpb24gaSh7ZG9uZTpzLHZhbHVlOmF9KXtpZihzKXt2YXIgYz1KU09OLnBhcnNlKG4pO3JldHVybiBjLnN0YXR1cz1lLnN0YXR1cyx2b2lkIHIuZmFpbHVyZShjKX1yZXR1cm4gbis9by5kZWNvZGUoYSksdC5yZWFkKCkudGhlbihpKX0pKX0pKX0sdC5DbGllbnRCYXNlPW4sdC5OdWxsQ2xpZW50PXIsdC5VcHN0cmVhbUNvbmR1aXRDbGllbnQ9aSx0LkFwaVByb3h5Q2xpZW50PXMsdC5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQ9YSx0LkFXU0NsaWVudD11LHQuQWdlbnRBcHBDbGllbnQ9Yyx0LlRhc2tUZW1wbGF0ZXNDbGllbnQ9bH0oKX0sODk1OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5jb3JlPXt9LHQuY29yZS5pbml0aWFsaXplZD0hMSx0LnZlcnNpb249IjIuMTAuMCIsdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1udWxsLHQuREVGQVVMVF9CQVRDSF9TSVpFPTUwMDt2YXIgbj0iQW1hem9uIENvbm5lY3QgQ0NQIixyPSJodHRwczovL3thbGlhc30uYXdzYXBwcy5jb20vYXV0aC8/Y2xpZW50X2lkPXtjbGllbnRfaWR9JnJlZGlyZWN0X3VyaT17cmVkaXJlY3R9IixvPSIwNjkxOWY0ZmQ4ZWQzMjRlIixpPSIvYXV0aC9hdXRob3JpemUiLHM9Ii9jb25uZWN0L2F1dGgvYXV0aG9yaXplIixhPSJJZnJhbWVSZWZyZXNoQXR0ZW1wdHMiLGM9IklmcmFtZVJlZnJlc2hBdHRlbXB0c0RyIix1PSJJZnJhbWVJbml0aWFsaXphdGlvblN1Y2Nlc3MiLGw9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2Vzc0RyIjtjb25zdCBwPXsiMC0xMDAiOlswLDEwMF0sIjEwMS01MDAiOlsxMDEsNTAwXSwiNTAxLTEwMDAiOls1MDEsMWUzXSwiMTAwMC0zMDAwIjpbMTAwMSwzZTNdLCIzMDAxLTUwMDAiOlszMDAxLDVlM10sIjUwMDEtMTAwMDAiOls1MDAxLDFlNF0sIjEwMDAxLTIwMDAwIjpbMTAwMDEsMmU0XSwiMjAwMDArIjpbMjAwMDEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdfTt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz0wLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPTAsdC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT049Myx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UPTEwLHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudD0wLHQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9bnVsbCx0LmNvcmUuY3RpVGltZW91dElkPW51bGwsdC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQ9MjAsdC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5UPTEwLHQuU2Vzc2lvblN0b3JhZ2VLZXlzPXQubWFrZUVudW0oWyJ0YWJfaWQiLCJhdXRob3JpemVfcmV0cnlfY291bnQiXSk7Y2xhc3MgZHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT1gJHt0fVBhcmFtc1N0b3JhZ2U6OiR7ZS5sb2NhdGlvbi5vcmlnaW59YH1nZXQoKXt0cnl7Y29uc3QgdD1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKGAke3RoaXMua2V5fTo6IEZhaWxlZCB0byBnZXQgc29mdHBob25lIHBhcmFtcyBmcm9tIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXJldHVybiBudWxsfXNldChuKXt0cnl7biYmZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmtleSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gc2V0IHNvZnRwaG9uZSBwYXJhbXMgdG8gbG9jYWwgc3RvcmFnZSFgKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fWNsZWFuKCl7ZS5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmtleSl9fWNvbnN0IGg9bmV3IGNsYXNzIGV4dGVuZHMgZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJTb2Z0cGhvbmUiKX19LGY9bmV3IGNsYXNzIGV4dGVuZHMgZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJSaW5ndG9uZSIpfX07ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLm1hdGNoKC9eKD86aHR0cHM/OlwvXC8pPyg/OlteQFxuXStAKT8oPzp3d3dcLik/KFteOlwvXG4/XSspL2dpKTtyZXR1cm4gdC5sZW5ndGg/dFswXToiIn10LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZD1mdW5jdGlvbigpe3QuY29yZS5pbml0aWFsaXplZCYmdC5nZXRMb2coKS53YXJuKCJDb25uZWN0IGNvcmUgYWxyZWFkeSBpbml0aWFsaXplZCwgb25seSBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBvbmNlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3ZhciBtPWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBZ2VudFN0YXRlcygpLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10LkFnZW50U3RhdGVUeXBlLk9GRkxJTkV9KSk7ZS5zZXRTdGF0ZShyLG4pfSx2PWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBjb250YWN0cyBzdXBwcmVzc29yIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLHtzdXBwcmVzczplLHNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW06ITF9KX0seT1mdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuaW5mbygiW0RJU0FTVEVSIFJFQ09WRVJZXSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBmb3JjZU9mZmxpbmUgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSx0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7b2ZmbGluZTplLG5leHRBY3RpdmVBcm46bn0pfSxFPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKTtjb25zdCBvPXQuYWdlbnQuaW5pdGlhbGl6ZWQ/dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpOnQuY29yZS5yZWdpb247ci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEF0dGVtcHRpbmcgdG8gZm9yY2UgaW5zdGFuY2UgJHtvfSBvZmZsaW5lIHVzaW5nICR7ZT8ic29mdCI6ImhhcmQifSBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hZ2VudCgoZnVuY3Rpb24obyl7dmFyIGk9MCxzPW8uZ2V0Q29udGFjdHMoKSxhPSExO2lmKHMubGVuZ3RoKWZvcihsZXQgYyBvZiBzKXtpZihhKWJyZWFrOyFlfHxjLmdldFR5cGUoKSE9PXQuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJmMuZ2V0VHlwZSgpIT10LkNvbnRhY3RUeXBlLlZPSUNFP2MuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZGVzdHJveSh7c3VjY2VzczpmdW5jdGlvbigpeysraT09PXMubGVuZ3RoJiYoeSghMSxuKSxtKG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7ci53YXJuKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIG9mZmxpbmUgaW4gcmVnaW9uICVzIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIud2FybihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHkoITAsbiksYT0hMH19KTooci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFdpbGwgd2FpdCB0byBjb21wbGV0ZSBmYWlsb3ZlciBvZiBpbnN0YW5jZSAlcyB1bnRpbCB2b2ljZSBjb250YWN0IHdpdGggSUQgJXMgaXMgZGVzdHJveWVkIix0LmNvcmUucmVnaW9uLGMuZ2V0Q29udGFjdElkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcse25leHRBY3RpdmVBcm46bn0pLGMub25EZXN0cm95KChmdW5jdGlvbihlKXtyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gVm9pY2UgY29udGFjdCB3aXRoIElEICVzIGRlc3Ryb3llZCwgY29udGludWluZyB3aXRoIGZhaWxvdmVyIGluIGluc3RhbmNlICVzIixlLmdldENvbnRhY3RJZCgpLHQuY29yZS5yZWdpb24pLEUoITAsbil9KSkpfWVsc2UgeSghMSxuKSxtKG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX07dC5jb3JlLmluaXREaXNhc3RlclJlY292ZXJ5PWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10LmdldExvZygpO3QuY29yZS5yZWdpb249ZS5yZWdpb24sdC5jb3JlLnN1cHByZXNzQ29udGFjdHM9bnx8dix0LmNvcmUuZm9yY2VPZmZsaW5lPXJ8fEUsdC5jb3JlLmdldFVwc3RyZWFtKCkub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TRVRfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5GQUlMT1ZFUiwoZnVuY3Rpb24oKXt0LmNvcmUuZm9yY2VPZmZsaW5lKGUmJmUuc29mdEZhaWxvdmVyKX0pKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe3QuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIsZSYmZS5uZXh0QWN0aXZlQXJuKX0pKX0pKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe28uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbml0aWFsaXppbmcgcmVnaW9uICVzIGFzIHBhcnQgb2YgYSBEaXNhc3RlciBSZWNvdmVyeSBmbGVldCIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pLChmdW5jdGlvbigpe28uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBhbHJlYWR5IHBhcnQgb2YgYSBEaXNhc3RlciBSZWNvdmVyeSBmbGVldCIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLnBvbGxGb3JGYWlsb3ZlciYmdC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORz90LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORyx7aW5zdGFuY2VBcm46ZS5pbnN0YW5jZUFybixvdGhlckFybjplLm90aGVyQXJuLGF1dGhUb2tlbjplLmF1dGhUb2tlbn0pOmUuaXNQcmltYXJ5Pyh0LmNvcmUuc3VwcHJlc3NDb250YWN0cyghMSksby5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGluc3RhbmNlIGlzIHNldCB0byBwcmltYXJ5Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKToodC5jb3JlLnN1cHByZXNzQ29udGFjdHMoITApLHQuY29yZS5mb3JjZU9mZmxpbmUoKSxvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHN0YW5kLWJ5Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sdC5jb3JlLmluaXQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgSSh0LmNvcmUuZ2V0RXZlbnRCdXMoKSksdC5jb3JlLmluaXRDbGllbnQoZSksdC5jb3JlLmluaXRBZ2VudEFwcENsaWVudChlKSx0LmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQoZSksdC5jb3JlLmluaXRpYWxpemVkPSEwfSx0LmNvcmUuaW5pdENsaWVudD1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIik7dmFyIG49dC5hc3NlcnROb3ROdWxsKGUuYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIikscj10LmFzc2VydE5vdE51bGwoZS5yZWdpb24sInBhcmFtcy5yZWdpb24iKSxvPWUuZW5kcG9pbnR8fG51bGw7dC5jb3JlLmNsaWVudD1uZXcgdC5BV1NDbGllbnQobixyLG8pfSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj10LmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxyPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhDb29raWVOYW1lLCJwYXJhbXMuYXV0aENvb2tpZU5hbWUiKSxvPXQuYXNzZXJ0Tm90TnVsbChlLmFnZW50QXBwRW5kcG9pbnQsInBhcmFtcy5hZ2VudEFwcEVuZHBvaW50Iik7dC5jb3JlLmFnZW50QXBwQ2xpZW50PW5ldyB0LkFnZW50QXBwQ2xpZW50KHIsbixvKX0sdC5jb3JlLmluaXRUYXNrVGVtcGxhdGVzQ2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj1lLnRhc2tUZW1wbGF0ZXNFbmRwb2ludHx8ZS5lbmRwb2ludDt0LmFzc2VydE5vdE51bGwobiwidGFza1RlbXBsYXRlc0VuZHBvaW50IiksdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnQ9bmV3IHQuVGFza1RlbXBsYXRlc0NsaWVudChuKX0sdC5jb3JlLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3QuY29yZS5jbGllbnQ9bmV3IHQuTnVsbENsaWVudCx0LmNvcmUuYXBpUHJveHlDbGllbnQ9bmV3IHQuTnVsbENsaWVudCx0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IHQuTnVsbENsaWVudCx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuTnVsbENsaWVudDt2YXIgZT10LmNvcmUuZ2V0RXZlbnRCdXMoKTtlJiZlLnVuc3Vic2NyaWJlQWxsKCksdC5jb3JlLmJ1cz1uZXcgdC5FdmVudEJ1cyx0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bnVsbCx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1udWxsLHQuY29yZS51cHN0cmVhbT1udWxsLHQuY29yZS5rZWVwYWxpdmVNYW5hZ2VyPW51bGwsdC5zdG9yYWdlQWNjZXNzLnJlc2V0U3RvcmFnZUFjY2Vzc1N0YXRlKCksdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITF9LHQuY29yZS5zb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09bnVsbCx0LmNvcmUuc2V0U29mdHBob25lVXNlck1lZGlhU3RyZWFtPWZ1bmN0aW9uKGUpe3QuY29yZS5zb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZX0sdC5jb3JlLmluaXRSaW5ndG9uZUVuZ2luZXM9ZnVuY3Rpb24obixyKXt0LmdldExvZygpLmluZm8oIltSaW5ndG9uZSBFbmdpbmVdIGluaXRSaW5ndG9uZUVuZ2luZSBzdGFydGVkIikud2l0aE9iamVjdCh7cGFyYW1zOm59KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYXNzZXJ0Tm90TnVsbChuLCJwYXJhbXMiKTtjb25zdCBvPXJ8fGI7dmFyIGk9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInJpbmd0b25lU2V0dGluZ3MiKSx0LmFzc2VydE5vdE51bGwoZS52b2ljZSwicmluZ3RvbmVTZXR0aW5ncy52b2ljZSIpLHQuYXNzZXJ0VHJ1ZShlLnZvaWNlLnJpbmd0b25lVXJsfHxlLnZvaWNlLmRpc2FibGVkLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlLnJpbmd0b25lVXJsIG11c3QgYmUgcHJvdmlkZWQgb3IgcmluZ3RvbmVTZXR0aW5ncy52b2ljZS5kaXNhYmxlZCBtdXN0IGJlIHRydWUiKSx0LmFzc2VydE5vdE51bGwoZS5xdWV1ZV9jYWxsYmFjaywicmluZ3RvbmVTZXR0aW5ncy5xdWV1ZV9jYWxsYmFjayIpLHQuYXNzZXJ0VHJ1ZShlLnF1ZXVlX2NhbGxiYWNrLnJpbmd0b25lVXJsfHxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlLnJpbmd0b25lVXJsIG11c3QgYmUgcHJvdmlkZWQgb3IgcmluZ3RvbmVTZXR0aW5ncy5xdWV1ZV9jYWxsYmFjay5kaXNhYmxlZCBtdXN0IGJlIHRydWUiKSx0LmNvcmUucmluZ3RvbmVFbmdpbmVzPXt9LHQuYWdlbnQoKGZ1bmN0aW9uKG4pe24ub25SZWZyZXNoKChmdW5jdGlvbigpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuUklOR1RPTkUsKGZ1bmN0aW9uKCl7bGV0IG49ITE7ZS52b2ljZS5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZXx8KHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudm9pY2U9bmV3IHQuVm9pY2VSaW5ndG9uZUVuZ2luZShlLnZvaWNlKSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiVm9pY2VSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLmNoYXQuZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMuY2hhdHx8KHQuY29yZS5yaW5ndG9uZUVuZ2luZXMuY2hhdD1uZXcgdC5DaGF0UmluZ3RvbmVFbmdpbmUoZS5jaGF0KSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiQ2hhdFJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUudGFzay5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy50YXNrfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy50YXNrPW5ldyB0LlRhc2tSaW5ndG9uZUVuZ2luZShlLnRhc2spLG49ITAsdC5nZXRMb2coKS5pbmZvKCJUYXNrUmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS5xdWV1ZV9jYWxsYmFjay5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFja3x8KHQuY29yZS5yaW5ndG9uZUVuZ2luZXMucXVldWVfY2FsbGJhY2s9bmV3IHQuUXVldWVDYWxsYmFja1Jpbmd0b25lRW5naW5lKGUucXVldWVfY2FsbGJhY2spLG49ITAsdC5nZXRMb2coKS5pbmZvKCJRdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksbiYmdC5jb3JlLl9yaW5nZXJEZXZpY2VJZCYmbyh7ZGV2aWNlSWQ6dC5jb3JlLl9yaW5nZXJEZXZpY2VJZH0pfSkpfSkpfSkpLFMoKX0scz1mdW5jdGlvbihlLG4pe2UucmluZ3RvbmU9ZS5yaW5ndG9uZXx8e30sZS5yaW5ndG9uZS52b2ljZT1lLnJpbmd0b25lLnZvaWNlfHx7fSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPWUucmluZ3RvbmUucXVldWVfY2FsbGJhY2t8fHt9LGUucmluZ3RvbmUuY2hhdD1lLnJpbmd0b25lLmNoYXR8fHtkaXNhYmxlZDohMH0sZS5yaW5ndG9uZS50YXNrPWUucmluZ3RvbmUudGFza3x8e2Rpc2FibGVkOiEwfSxuLnNvZnRwaG9uZSYmKG4uc29mdHBob25lLmRpc2FibGVSaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2UuZGlzYWJsZWQ9ITAsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5kaXNhYmxlZD0hMCksbi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLnZvaWNlLnJpbmd0b25lVXJsPW4uc29mdHBob25lLnJpbmd0b25lVXJsLGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmw9bi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwpKSxuLmNoYXQmJihuLmNoYXQuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS5jaGF0LmRpc2FibGVkPSEwKSxuLmNoYXQucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLmNoYXQucmluZ3RvbmVVcmw9bi5jaGF0LnJpbmd0b25lVXJsKSksbi5yaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2U9dC5tZXJnZShlLnJpbmd0b25lLnZvaWNlLG4ucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPXQubWVyZ2UoZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjayxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5jaGF0PXQubWVyZ2UoZS5yaW5ndG9uZS5jaGF0LG4ucmluZ3RvbmUuY2hhdHx8e30pKX07aWYocyhuLG4pLHQuaXNGcmFtZWQoKSl7bGV0IHI7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24obyl7ZS5jbGVhclRpbWVvdXQociksdC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmUgRW5naW5lXSBDb25maWd1cmUgZXZlbnQgaGFuZGxlciBleGVjdXRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLHMobixvKSxmLnNldChuLnJpbmd0b25lKSxpKG4ucmluZ3RvbmUpfSkpO2NvbnN0IG89Zi5nZXQoKTtvJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihuKXtuJiZuLmlkJiYodC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IGFuZCB3YWl0aW5nIGZvciBjb25maWd1cmUgTWVzc2FnZSBoYW5kbGVyIHRvIGV4ZWN1dGUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxyPWUuc2V0VGltZW91dCgoKCk9Pnt0LmdldExvZygpLmluZm8oIltSaW5ndG9uZUVuZ2luZV0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCB3aXRob3V0IGNvbmZpZ3VyZSBtZXNzYWdlICYgSW5pdGlhbGl6aW5nIHNldHVwUmluZ3RvbmVFbmdpbmVzIChSaW5ndG9uZSBFbmdpbmUpIGZyb20gbG9jYWxTdG9yYWdlIHJpbmd0b25lIHBhcmFtcy4gIikud2l0aE9iamVjdCh7cmluZ3RvbmU6b30pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShvKX0pLDEwMCkpfSkpfWVsc2UgaShuLnJpbmd0b25lKX07dmFyIFM9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9SSU5HRVJfREVWSUNFLGIpfSxiPWZ1bmN0aW9uKGU9e30pe2NvbnN0IG49ZS5kZXZpY2VJZHx8IiI7aWYodC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBBdHRlbXB0aW5nIHRvIHNldCByaW5nZXIgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDA9PT10LmtleXModC5jb3JlLnJpbmd0b25lRW5naW5lcykubGVuZ3RoKXJldHVybiB0LmdldExvZygpLmluZm8oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHNldFJpbmdlckRldmljZSBjYWxsZWQgYmVmb3JlIHJpbmd0b25lIGVuZ2luZSBpcyBpbml0aWFsaXplZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZChuJiYodC5jb3JlLl9yaW5nZXJEZXZpY2VJZD1uLHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gc3RvcmVkIGRldmljZSBJZCBmb3IgbGF0ZXIgdXNlLCBvbmNlIHJpbmd0b25lIGVuZ2luZSBpcyB1cC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiU2V0UmluZ2VyRGV2aWNlQmVmb3JlSW5pdFJpbmd0b25lRW5naW5lIixkYXRhOntjb3VudDoxfX0pKSk7aWYobil7Zm9yKGxldCBlIGluIHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpdC5jb3JlLnJpbmd0b25lRW5naW5lc1tlXS5zZXRPdXRwdXREZXZpY2UobikudGhlbigoZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSByaW5ndG9uZVR5cGUgJHtlfSBzdWNjZXNzZnVsbHkgc2V0IHRvIGRldmljZWlkICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKGUpfSkpO3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5SSU5HRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX1lbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyByaW5nZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3QuY29yZS5pbml0U29mdHBob25lTWFuYWdlcj1mdW5jdGlvbihuKXt2YXIgcj1ufHx7fTt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gaW5pdFNvZnRwaG9uZU1hbmFnZXIgc3RhcnRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG89ZnVuY3Rpb24oZSl7dmFyIG49dC5tZXJnZShyLnNvZnRwaG9uZXx8e30sZSk7dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGNvbXBldGVGb3JNYXN0ZXJPbkFnZW50VXBkYXRlIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7c29mdHBob25lUGFyYW1zOm59KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXt2YXIgcj10aGlzO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBhZ2VudCByZWZyZXNoIGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb25maXJtZWQgYXMgc29mdHBob25lIG1hc3RlciB0b3BpYyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksIXQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyJiZlLmlzU29mdHBob25lRW5hYmxlZCgpJiYodC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTKSx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1uZXcgdC5Tb2Z0cGhvbmVNYW5hZ2VyKG4pLHIudW5zdWJzY3JpYmUoKSl9KSl9KSl9KSl9O2lmKHQuaXNGcmFtZWQoKSYmdC5pc0NDUCgpKXtsZXQgbjt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihyKXtlLmNsZWFyVGltZW91dChuKSx0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS53aXRoT2JqZWN0KHtkYXRhOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGguc2V0KHIuc29mdHBob25lKSxyLnNvZnRwaG9uZSYmci5zb2Z0cGhvbmUuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0aGlzLnVuc3Vic2NyaWJlKCksbyhyLnNvZnRwaG9uZSkpLGkoci5zb2Z0cGhvbmUpfSkpO2xldCByPWguZ2V0KCk7ciYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24ocyl7cyYmcy5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCksbj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSBoYW5kbGVyIGV4ZWN1dGlvbiIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtc0Zyb21Mb2NhbFN0b3JhZ2U6cn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJFbWJlZGRlZENDUFJlZnJlc2hlZFdpdGhvdXRJbml0Q0NQIixkYXRhOntjb3VudDoxfX0pLGkociksci5hbGxvd0ZyYW1lZFNvZnRwaG9uZSYmKHQuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkICYgSW5pdGlhbGl6aW5nIGNvbXBldGVGb3JNYXN0ZXJPbkFnZW50VXBkYXRlIChTb2Z0cGhvbmUgbWFuYWdlcikgZnJvbSBsb2NhbFN0b3JhZ2Ugc29mdHBob25lIHBhcmFtcyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhyKSl9KSwxMDApKX0pKX1lbHNlIG8ociksaShyKTtmdW5jdGlvbiBpKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuY29yZS5zb2Z0cGhvbmVQYXJhbXM9bix0LmlzRmlyZWZveEJyb3dzZXIoKSYmKHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLChmdW5jdGlvbihlKXtlLmRhdGEmJmUuZGF0YS50b3BpYz09PXQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSYmZS5kYXRhLnRha2VPdmVyJiZlLmRhdGEubWFzdGVySWQhPT10LmNvcmUucG9ydFN0cmVhbUlkJiZ0LmNvcmUuc29mdHBob25lTWFuYWdlciYmKHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUoKSxkZWxldGUgdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXIpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTiwoZnVuY3Rpb24oKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmNvcmUuc29mdHBob25lTWFuYWdlciYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXIuc3RhcnRTZXNzaW9uKCl9KSwoZnVuY3Rpb24oKXt0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5hZ2VudCgoZnVuY3Rpb24oZSl7IXQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyJiZlLmlzU29mdHBob25lRW5hYmxlZCgpJiYodC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTKSx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1uZXcgdC5Tb2Z0cGhvbmVNYW5hZ2VyKG4pLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpKX0pKX0pKX0pKX0pKSx0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe3QuYWdlbnQoKGZ1bmN0aW9uKG4pe2Uub25SZWZyZXNoKChmdW5jdGlvbihlKXtpZih0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcygpJiYidmlzaWJsZSI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUmJihlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkd8fGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkcpKXt2YXIgcj1lLmlzU29mdHBob25lQ2FsbCgpJiYhZS5pc0luYm91bmQoKSxvPWUuaXNTb2Z0cGhvbmVDYWxsKCkmJm4uZ2V0Q29uZmlndXJhdGlvbigpLnNvZnRwaG9uZUF1dG9BY2NlcHQsaT1lLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0s7KHJ8fG98fGkpJiZ0LmNvcmUudHJpZ2dlclJlYWR5VG9TdGFydFNlc3Npb25FdmVudCgpfX0pKX0pKX0pKSl9dC5hZ2VudCgoZnVuY3Rpb24oZSl7ZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmZS5nZXRDaGFubmVsQ29uY3VycmVuY3kodC5DaGFubmVsVHlwZS5WT0lDRSkmJnQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEV9KX0pKX0sdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10LmNvcmUuc29mdHBob25lUGFyYW1zJiZ0LmNvcmUuc29mdHBob25lUGFyYW1zLmFsbG93RnJhbWVkU29mdHBob25lO3QuaXNDQ1AoKT9lP3QuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuaXNGcmFtZWQoKT90LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTik6dC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTik6ZT90LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pfSx0LmNvcmUuaW5pdFBhZ2VPcHRpb25zPWZ1bmN0aW9uKGUpe2lmKHQuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKSx0LmlzRnJhbWVkKCkpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpO24uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLkNPTkZJR1VSRSxkYXRhOmV9KX0pKSxuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVRVUVTVCwoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVNQT05TRSxlKX1uYXZpZ2F0b3ImJm5hdmlnYXRvci5tZWRpYURldmljZXM/bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigoZnVuY3Rpb24odCl7ZGV2aWNlcz10fHxbXSxkZXZpY2VzPWRldmljZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSxlKGRldmljZXMpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlKHtlcnJvcjp0Lm1lc3NhZ2V9KX0pKTplKHtlcnJvcjoiTm8gbmF2aWdhdG9yIG9yIG5hdmlnYXRvci5tZWRpYURldmljZXMgb2JqZWN0IGZvdW5kIn0pfSkpfX0sdC5jb3JlLmluaXRBcGlQcm94eVNlcnZpY2U9ZnVuY3Rpb24oKXt0LmNvcmUuYXBpUHJveHlDbGllbnQ9bmV3IHQuQXBpUHJveHlDbGllbnQsdC5pc0ZyYW1lZCgpJiYodC5jb3JlLmhhbmRsZUFwaVByb3h5UmVxdWVzdD1mdW5jdGlvbihlKXtlPy5tZXRob2QmJnQuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpLmNhbGwoZS5tZXRob2QsZS5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24obil7Y29uc3Qgcj17ZGF0YTpuLHJlcXVlc3RJZDplLnJlcXVlc3RJZH07dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLHIpfSxmYWlsdXJlOmZ1bmN0aW9uKG4pe2NvbnN0IHI9e2VycjpuLHJlcXVlc3RJZDplLnJlcXVlc3RJZH07dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLHIpfX0pfSl9LHQuY29yZS5nZXRGcmFtZU1lZGlhRGV2aWNlcz1mdW5jdGlvbihlKXt2YXIgbj1udWxsLHI9ZXx8MWUzLG89bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0KG5ldyBFcnJvcigiVGltZW91dCBleGNlZWRlZCIpKX0pLHIpfSkpLGk9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7aWYodC5pc0ZyYW1lZCgpfHx0LmlzQ0NQKCkpbmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKTpyKG5ldyBFcnJvcigiTm8gbmF2aWdhdG9yIG9yIG5hdmlnYXRvci5tZWRpYURldmljZXMgb2JqZWN0IGZvdW5kIikpO2Vsc2V7dmFyIG89dC5jb3JlLmdldEV2ZW50QnVzKCk7bj1vLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/cihuZXcgRXJyb3IodC5lcnJvcikpOmUodCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVFVRVNUKX19KSk7cmV0dXJuIFByb21pc2UucmFjZShbaSxvXSkuZmluYWxseSgoZnVuY3Rpb24oKXtuJiZuLnVuc3Vic2NyaWJlKCl9KSl9LHQuY29yZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49ZTtyZXR1cm4gbnx8KG49dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKSx0LmZldGNoKG4se2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0sMmUzLDUpfSx0LmNvcmUudmVyaWZ5RG9tYWluQWNjZXNzPWZ1bmN0aW9uKGUsbil7aWYodC5nZXRMb2coKS53YXJuKCJUaGlzIEFQSSB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiByZWxlYXNlIiksIXQuaXNGcmFtZWQoKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIHI9e2hlYWRlcnM6eyJYLUFtei1CZWFyZXIiOmV9fSxvPW51bGw7cmV0dXJuIG89bnx8KHQuY29yZS5pc0xlZ2FjeURvbWFpbigpPyIvY29ubmVjdC93aGl0ZWxpc3RlZC1vcmlnaW5zIjoiL3doaXRlbGlzdGVkLW9yaWdpbnMiKSx0LmZldGNoKG8sciwyZTMsNSkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9Zyh3aW5kb3cuZG9jdW1lbnQucmVmZXJyZXIpO3JldHVybiBlLndoaXRlbGlzdGVkT3JpZ2lucy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdD09PWcoZSl9KSk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZWplY3QoKX0pKX0sdC5jb3JlLmlzTGVnYWN5RG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybihlPWV8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIil9LHQuY29yZS5pbml0U2hhcmVkV29ya2VyPWZ1bmN0aW9uKG4pe2lmKHQuY29yZS5jaGVja05vdEluaXRpYWxpemVkKCksIXQuY29yZS5pbml0aWFsaXplZCl7dC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO3ZhciByPXQuYXNzZXJ0Tm90TnVsbChuLnNoYXJlZFdvcmtlclVybCwicGFyYW1zLnNoYXJlZFdvcmtlclVybCIpLG89dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIiksYT10LmFzc2VydE5vdE51bGwobi5yZWZyZXNoVG9rZW4sInBhcmFtcy5yZWZyZXNoVG9rZW4iKSxjPXQuYXNzZXJ0Tm90TnVsbChuLmF1dGhUb2tlbkV4cGlyYXRpb24sInBhcmFtcy5hdXRoVG9rZW5FeHBpcmF0aW9uIiksdT10LmFzc2VydE5vdE51bGwobi5yZWdpb24sInBhcmFtcy5yZWdpb24iKSxsPW4uZW5kcG9pbnR8fG51bGwscD1uLmF1dGhvcml6ZUVuZHBvaW50O3B8fChwPXQuY29yZS5pc0xlZ2FjeURvbWFpbigpP3M6aSk7dmFyIGQ9bi5hZ2VudEFwcEVuZHBvaW50fHxudWxsLGg9bi50YXNrVGVtcGxhdGVzRW5kcG9pbnR8fG51bGwsZj1uLmF1dGhDb29raWVOYW1lfHxudWxsO3RyeXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMoe2xvZ0V2ZW50czohMH0pLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgSSh0LmNvcmUuZ2V0RXZlbnRCdXMoKSksdC5jb3JlLm1lZGlhRmFjdG9yeT1uZXcgdC5NZWRpYUZhY3Rvcnkobik7dmFyIGc9bmV3IFNoYXJlZFdvcmtlcihyLCJDb25uZWN0U2hhcmVkV29ya2VyIiksbT1uZXcgdC5Db25kdWl0KCJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCIsbmV3IHQuUG9ydFN0cmVhbShnLnBvcnQpLG5ldyB0LldpbmRvd0lPU3RyZWFtKHdpbmRvdyxwYXJlbnQpKTt0LmNvcmUudXBzdHJlYW09bSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IFQsZS5vbnVubG9hZD1mdW5jdGlvbigpe20uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkNMT1NFKSxnLnBvcnQuY2xvc2UoKX0sdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtTG9nUHVzaChtKSx0LmdldExvZygpLnNjaGVkdWxlRG93bnN0cmVhbUNsaWVudFNpZGVMb2dzUHVzaCgpLG0ub25BbGxVcHN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbFVwc3RyZWFtKG0ucGFzc0Rvd25zdHJlYW0oKSksdC5pc0ZyYW1lZCgpJiYobS5vbkFsbERvd25zdHJlYW0odC5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLG0ub25BbGxEb3duc3RyZWFtKChmdW5jdGlvbihlLG4pe249PT10LkV2ZW50VHlwZS5BUElfUkVRVUVTVCYmdC5jb250YWluc1ZhbHVlKHQuQXBpUHJveHlDbGllbnRNZXRob2RzLGU/Lm1ldGhvZCk/dC5jb3JlLmhhbmRsZUFwaVByb3h5UmVxdWVzdChlKTptLnBhc3NVcHN0cmVhbSgpKGUsbil9KSkpLG0uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSx7YXV0aFRva2VuOm8sYXV0aFRva2VuRXhwaXJhdGlvbjpjLGVuZHBvaW50OmwscmVmcmVzaFRva2VuOmEscmVnaW9uOnUsYXV0aG9yaXplRW5kcG9pbnQ6cCxhZ2VudEFwcEVuZHBvaW50OmQsdGFza1RlbXBsYXRlc0VuZHBvaW50OmgsYXV0aENvb2tpZU5hbWU6Zixsb25nUG9sbGluZ09wdGlvbnM6bi5sb25nUG9sbGluZ09wdGlvbnN8fHZvaWQgMH0pLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJBY2tub3dsZWRnZWQgYnkgdGhlIENvbm5lY3RTaGFyZWRXb3JrZXIhIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITAsdC5jb3JlLl9zZXRUYWJJZCgpLHQuY29yZS5wb3J0U3RyZWFtSWQ9ZS5pZCx0aGlzLnVuc3Vic2NyaWJlKCl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRywoZnVuY3Rpb24oZSl7ZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLChmdW5jdGlvbihlKXt0LmlzRnJhbWVkKCkmJkFycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyKHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSl9KSksbS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXt0LmlzRnJhbWVkKCkmJmUubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSx0LmNvcmUub25BdXRoRmFpbCh0LmhpdGNoKHQuY29yZSx0LmNvcmUuX2hhbmRsZUF1dGhGYWlsLG4ubG9naW5FbmRwb2ludHx8bnVsbCxwKSksdC5jb3JlLm9uQXV0aG9yaXplU3VjY2Vzcyh0LmhpdGNoKHQuY29yZSx0LmNvcmUuX2hhbmRsZUF1dGhvcml6ZVN1Y2Nlc3MpKSx0LmdldExvZygpLmluZm8oIlVzZXIgQWdlbnQ6ICIrbmF2aWdhdG9yLnVzZXJBZ2VudCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzQ0NQdjI6ICIrITApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKCJpc0ZyYW1lZDogIit0LmlzRnJhbWVkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLnVwc3RyZWFtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5PVVRFUl9DT05URVhUX0lORk8sKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc3RyZWFtc1ZlcnNpb258fG51bGw7dC5nZXRMb2coKS5pbmZvKCJTdHJlYW1zSlMgVmVyc2lvbjogIituKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQub3V0ZXJDb250ZXh0U3RyZWFtc1ZlcnNpb249bn0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIk51bWJlciBvZiBjb25uZWN0ZWQgQ0NQcyB1cGRhdGVkOiAiK2UubGVuZ3RoKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RoLGVbdC5jb3JlLnRhYklkXSYmIWlzTmFOKGVbdC5jb3JlLnRhYklkXS5sZW5ndGgpJiZ0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYiE9PWVbdC5jb3JlLnRhYklkXS5sZW5ndGgmJih0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYj1lW3QuY29yZS50YWJJZF0ubGVuZ3RoLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPjEmJnQuZ2V0TG9nKCkud2FybigiVGhlcmUgYXJlICIrdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWIrIiBjb25uZWN0ZWQgQ0NQcyBpbiB0aGlzIHRhYi4gUGxlYXNlIGFkanVzdCB5b3VyIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMuIElmIHlvdSBhcmUgZW1iZWRkaW5nIENDUCwgcGxlYXNlIGRvIHNvIGV4Y2x1c2l2ZWx5IHdpdGggaW5pdENDUC4gSW5pdENDUCB3aWxsIG5vdCBsZXQgeW91IGVtYmVkIG1vcmUgdGhhbiBvbmUgQ0NQLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJDb25uZWN0ZWRDQ1BTaW5nbGVUYWJDb3VudCIsZGF0YTp7Y291bnQ6dC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWJ9fSkpLGUudGFiSWQmJmUuc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyJiZ0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLk1FVFJJQ1MsKCgpPT50LmFnZW50KCgoKT0+dC5wdWJsaXNoTWV0cmljKHtuYW1lOiJDQ1BUYWJzQWNyb3NzQnJvd3NlckNvdW50IixkYXRhOnt0YWJJZDplLnRhYklkLGNvdW50OmUuc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyfX0pKSkpKX0pKSx0LmNvcmUuY2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdENsaWVudChtKSx0LmNvcmUubWFzdGVyQ2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudChtKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuVEVSTUlOQVRFLG0ucGFzc1Vwc3RyZWFtKCkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEVELChmdW5jdGlvbigpe3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQoITApfSkpLGcucG9ydC5zdGFydCgpLG0ub25VcHN0cmVhbSh0LlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCwoZnVuY3Rpb24oZSl7ZSYmZS5kb21haW5JZCYmKHQuY29yZS52b2ljZUlkRG9tYWluSWQ9ZS5kb21haW5JZCl9KSksdC5hZ2VudCgoZnVuY3Rpb24oKXsobmV3IHQuVm9pY2VJZCkuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgc3VjY2Vzc2Z1bGx5IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb246ICIrZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJ2b2ljZUlkIGRvbWFpbklkIG5vdCBmZXRjaGVkIGF0IGFnZW50IGluaXRpYWxpemF0aW9uIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfSkpLHQuY29yZS5nZXROb3RpZmljYXRpb25NYW5hZ2VyKCkucmVxdWVzdFBlcm1pc3Npb24oKSxtLm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9ESVNBU1RFUl9SRUNPVkVSWSwoZnVuY3Rpb24oZSl7dC5jb3JlLmluaXREaXNhc3RlclJlY292ZXJ5KGUpfSkpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBBUEkgc2hhcmVkIHdvcmtlciwgd2UncmUgZGVhZCEiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fX0sdC5jb3JlLl9zZXRUYWJJZD1mdW5jdGlvbigpe3RyeXt0LmNvcmUudGFiSWQ9d2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lEKSx0LmNvcmUudGFiSWR8fCh0LmNvcmUudGFiSWQ9dC5yYW5kb21JZCgpLHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLlRBQl9JRCx0LmNvcmUudGFiSWQpKSx0LmNvcmUudXBzdHJlYW0uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlRBQl9JRCx7dGFiSWQ6dC5jb3JlLnRhYklkfSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW1RhYiBJZF0gVGhlcmUgd2FzIGFuIGlzc3VlIHNldHRpbmcgdGhlIHRhYiBJZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19LHQuY29yZS5pbml0Q0NQPWZ1bmN0aW9uKG4saSl7aWYodC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhdC5jb3JlLmluaXRpYWxpemVkKXt0LmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBzdGFydGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcz1EYXRlLm5vdygpO3RyeXtpZih0LmNvcmUuX2dldENDUElmcmFtZSgpKXJldHVybiB2b2lkIHQuZ2V0TG9nKCkuZXJyb3IoIkF0dGVtcHRlZCB0byBjYWxsIGluaXRDQ1Agd2hlbiBhbiBpZnJhbWUgZ2VuZXJhdGVkIGJ5IGluaXRDQ1AgYWxyZWFkeSBleGlzdHMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkVycm9yIHdoaWxlIGNoZWNraW5nIGlmIGluaXRDQ1AgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dmFyIHA9e307InN0cmluZyI9PXR5cGVvZiBpP3AuY2NwVXJsPWk6cD1pLHQuYXNzZXJ0Tm90TnVsbChuLCJjb250YWluZXJEaXYiKSx0LmFzc2VydE5vdE51bGwocC5jY3BVcmwsInBhcmFtcy5jY3BVcmwiKSxoLmNsZWFuKCksZi5jbGVhbigpLHQuc3RvcmFnZUFjY2Vzcy5pbml0KHAuY2NwVXJsLG4scC5zdG9yYWdlQWNjZXNzfHx7fSk7dmFyIGQ9dC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWUobixwKSxnPW5ldyB0LklGcmFtZUNvbmR1aXQocC5jY3BVcmwsd2luZG93LGQpO3QuY29yZS51cHN0cmVhbT1nLHQuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiExfSksdC5zdG9yYWdlQWNjZXNzLmNhblJlcXVlc3QoKT90LnN0b3JhZ2VBY2Nlc3Muc2V0dXBSZXF1ZXN0SGFuZGxlcnMoe29uR3JhbnQ6bX0pOm0oKX1mdW5jdGlvbiBtKCl7dC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBJKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShwKSx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lKGQsZyksdC5jb3JlLndlYlNvY2tldFByb3ZpZGVyPW5ldyBULGcub25BbGxVcHN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bmV3IEMoZyx0LmNvcmUuZ2V0RXZlbnRCdXMoKSxwLmNjcFN5blRpbWVvdXR8fDFlMyxwLmNjcEFja1RpbWVvdXR8fDNlMyksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PW51bGwsdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCksdC5nZXRMb2coKS5pbmZvKCJDQ1AgTG9hZFRpbWVvdXQgdHJpZ2dlcmVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pLHAuY2NwTG9hZFRpbWVvdXR8fDVlMyksdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQTG9nc1B1c2goZyksdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzUHVzaChnKSxnLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKG4pe2lmKHQuZ2V0TG9nKCkuaW5mbygiQWNrbm93bGVkZ2VkIGJ5IHRoZSBDQ1AhIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuY2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdENsaWVudChnKSx0LmNvcmUubWFzdGVyQ2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudChnKSx0LmNvcmUucG9ydFN0cmVhbUlkPW4uaWQsKHAuc29mdHBob25lfHxwLmNoYXR8fHAucGFnZU9wdGlvbnN8fHAuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzfHxwLmRpc2FzdGVyUmVjb3ZlcnlPbikmJmcuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSx7c29mdHBob25lOnAuc29mdHBob25lLGNoYXQ6cC5jaGF0LHBhZ2VPcHRpb25zOnAucGFnZU9wdGlvbnMsc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzOnAuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzLGRpc2FzdGVyUmVjb3ZlcnlPbjpwLmRpc2FzdGVyUmVjb3ZlcnlPbn0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5jb3JlLnJlZ2lvbj1wLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz12LHQuY29yZS5mb3JjZU9mZmxpbmU9ZnVuY3Rpb24oZSl7Zy5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLGUpfSxnLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9ESVNBU1RFUl9SRUNPVkVSWSxwKSksdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UmJihlLmNsZWFyVGltZW91dCh0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZSksdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCksZy5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuT1VURVJfQ09OVEVYVF9JTkZPLHtzdHJlYW1zVmVyc2lvbjp0LnZlcnNpb259KSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlci5zdGFydCgpLHRoaXMudW5zdWJzY3JpYmUoKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITAsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5JTklUKSxzKXt2YXIgcj1EYXRlLm5vdygpLXMsbz10LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDA7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSBpbml0aWFsaXphdGlvbiB0aW1lICR7cn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgJHtvfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksc2V0VGltZW91dCgoKCk9Pnt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YSxkYXRhOntjb3VudDpvfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTp1LGRhdGE6e2NvdW50OjF9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWUiLGRhdGE6e2NvdW50OnJ9fSkscC5kaXNhc3RlclJlY292ZXJ5T24mJih0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YyxkYXRhOntjb3VudDpvfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTpsLGRhdGE6e2NvdW50OjF9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWVEciIsZGF0YTp7Y291bnQ6cn19KSkscz1udWxsfSksMWUzKX19KSksZy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRywoZnVuY3Rpb24oZSl7ZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCwoZnVuY3Rpb24oKXtpZighMSE9PXAubG9naW5Qb3B1cCl0cnl7dmFyIGk9ZnVuY3Rpb24obil7dmFyIGk9Imh0dHBzOi8vbGlseS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS90YXcvYXV0aC9jb2RlIjtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGkpLG4ubG9naW5Vcmw/bi5sb2dpblVybDpuLmFsaWFzPyhsb2cud2FybigiVGhlIGBhbGlhc2AgcGFyYW0gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBleHBlY3RlZCB0byBmdW5jdGlvbiBwcm9wZXJseS4gUGxlYXNlIHVzZSBgY2NwVXJsYCBvciBgbG9naW5VcmxgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FtYXpvbi1jb25uZWN0L2FtYXpvbi1jb25uZWN0LXN0cmVhbXMvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI2Nvbm5lY3Rjb3JlaW5pdGNjcCBmb3IgdmFsaWQgcGFyYW1ldGVycy4iKSxyLnJlcGxhY2UoInthbGlhc30iLG4uYWxpYXMpLnJlcGxhY2UoIntjbGllbnRfaWR9IixvKS5yZXBsYWNlKCJ7cmVkaXJlY3R9IixlLmVuY29kZVVSSUNvbXBvbmVudChpKSkpOm4uY2NwVXJsfShwKTt0LmdldExvZygpLndhcm4oIkFDS19USU1FT1VUIG9jY3VycmVkLCBhdHRlbXB0aW5nIHRvIHBvcCB0aGUgbG9naW4gcGFnZSBpZiBub3QgYWxyZWFkeSBvcGVuLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscC5sb2dpblVybCYmdC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLmNsZWFyKHQuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQKSx0LmNvcmUubG9naW5XaW5kb3c9dC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLm9wZW4oaSx0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCxwLmxvZ2luT3B0aW9ucyl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiQUNLX1RJTUVPVVQgb2NjdXJyZWQgYnV0IHdlIGFyZSB1bmFibGUgdG8gb3BlbiB0aGUgbG9naW4gcG9wdXAuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWlmKG51bGw9PXQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl0cnl7Zy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLHQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5jbGVhcih0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCksKHAubG9naW5Qb3B1cEF1dG9DbG9zZXx8cC5sb2dpbk9wdGlvbnMmJnAubG9naW5PcHRpb25zLmF1dG9DbG9zZSkmJnQuY29yZS5sb2dpbldpbmRvdyYmKHQuY29yZS5sb2dpbldpbmRvdy5jbG9zZSgpLHQuY29yZS5sb2dpbldpbmRvdz1udWxsKX0pKSx0LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQocCxuKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSByZWZyZXNoaW5nIGlmcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSkscC5vblZpZXdDb250YWN0JiZ0LmNvcmUub25WaWV3Q29udGFjdChwLm9uVmlld0NvbnRhY3QpLGcub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RofSkpLGcub25VcHN0cmVhbSh0LlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCwoZnVuY3Rpb24oZSl7ZSYmZS5kb21haW5JZCYmKHQuY29yZS52b2ljZUlkRG9tYWluSWQ9ZS5kb21haW5JZCl9KSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCwoZnVuY3Rpb24oKXtpZihzKXt2YXIgZT10LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQtMTt0LmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiVGltZSBhZnRlciBpZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCAiKyhEYXRlLm5vdygpLXMpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDowfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDowfX0pKSxzPW51bGx9fSkpLHQuY29yZS5zb2Z0cGhvbmVQYXJhbXM9cC5zb2Z0cGhvbmV9fSx0LmNvcmUub25JZnJhbWVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dD1mdW5jdGlvbihuLHIpe3QuYXNzZXJ0Tm90TnVsbChuLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKHIsImNvbnRhaW5lckRpdiIpO3ZhciBvPW4uY2NwTG9hZFRpbWVvdXQ/bi5jY3BMb2FkVGltZW91dDpuLmRpc2FzdGVyUmVjb3ZlcnlPbj8xZTQ6NWUzO2UuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZih0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ9KHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdHx8MCkrMSx0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ8PTEwKXt0cnl7dmFyIG89dC5jb3JlLl9nZXRDQ1BJZnJhbWUoKTtvJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7dmFyIGk9dC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWUocixuKTt0LmNvcmUudXBzdHJlYW0udXBzdHJlYW0ub3V0cHV0PWkuY29udGVudFdpbmRvdyx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lKGksdC5jb3JlLnVwc3RyZWFtKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciB3aGlsZSBjaGVja2luZyBmb3IsIGFuZCByZWNyZWF0aW5nLCB0aGUgQ0NQIElGcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQobixyKX1lbHNlIHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVEKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpfSksbyl9LHQuY29yZS5fZ2V0Q0NQSWZyYW1lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIG9mIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIikpaWYoZS5uYW1lPT09bilyZXR1cm4gZTtyZXR1cm4gbnVsbH0sdC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWU9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwociwiaW5pdENDUFBhcmFtcyIpLHQuYXNzZXJ0Tm90TnVsbChlLCJjb250YWluZXJEaXYiKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtyZXR1cm4gby5zcmM9ci5jY3BVcmwsby5hbGxvdz0ibWljcm9waG9uZTsgY2FtZXJhOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlIixvLnN0eWxlPXIuc3R5bGV8fCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlIixvLnRpdGxlPXIuaWZyYW1lVGl0bGV8fG4sby5uYW1lPW4sdC5zdG9yYWdlQWNjZXNzLmNhblJlcXVlc3QoKSYmKG8uc3JjPXQuc3RvcmFnZUFjY2Vzcy5nZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybCgpLG8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdC5zdG9yYWdlQWNjZXNzLnJlcXVlc3QpKSxlLmFwcGVuZENoaWxkKG8pLG99LHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWU9ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiaWZyYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbmR1aXQiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciByPXtkaXNwbGF5OndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkuZGlzcGxheSxvZmZzZXRXaWR0aDplLm9mZnNldFdpZHRoLG9mZnNldEhlaWdodDplLm9mZnNldEhlaWdodCxjbGllbnRSZWN0c0xlbmd0aDplLmdldENsaWVudFJlY3RzKCkubGVuZ3RofTtuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5JRlJBTUVfU1RZTEUscil9KSwxZTQpfTt2YXIgQz1mdW5jdGlvbihlLHQsbixyKXt0aGlzLmNvbmR1aXQ9ZSx0aGlzLmV2ZW50QnVzPXQsdGhpcy5zeW5UaW1lb3V0PW4sdGhpcy5hY2tUaW1lb3V0PXIsdGhpcy5hY2tUaW1lcj1udWxsLHRoaXMuc3luVGltZXI9bnVsbCx0aGlzLmFja1N1Yj1udWxsfTtDLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5jb25kdWl0LnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TWU5DSFJPTklaRSksdGhpcy5hY2tTdWI9dGhpcy5jb25kdWl0Lm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KG4uYWNrVGltZXIpLG4uX2RlZmVyU3RhcnQoKX0pKSx0aGlzLmFja1RpbWVyPWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLmFja1N1Yi51bnN1YnNjcmliZSgpLG4uZXZlbnRCdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCksbi5fZGVmZXJTdGFydCgpfSksdGhpcy5hY2tUaW1lb3V0KX0sQy5wcm90b3R5cGUuX2RlZmVyU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnN5blRpbWVyPWUuc2V0VGltZW91dCh0LmhpdGNoKHRoaXMsdGhpcy5zdGFydCksdGhpcy5zeW5UaW1lb3V0KX0sQy5wcm90b3R5cGUuZGVmZXJTdGFydD1mdW5jdGlvbigpe251bGw9PXRoaXMuc3luVGltZXImJih0aGlzLnN5blRpbWVyPWUuc2V0VGltZW91dCh0LmhpdGNoKHRoaXMsdGhpcy5zdGFydCksdGhpcy5zeW5UaW1lb3V0KSl9O3ZhciBUPWZ1bmN0aW9uKCl7dmFyIGU9e2luaXRGYWlsdXJlOm5ldyBTZXQsc3Vic2NyaXB0aW9uVXBkYXRlOm5ldyBTZXQsc3Vic2NyaXB0aW9uRmFpbHVyZTpuZXcgU2V0LHRvcGljOm5ldyBNYXAsYWxsTWVzc2FnZTpuZXcgU2V0LGNvbm5lY3Rpb25HYWluOm5ldyBTZXQsY29ubmVjdGlvbkxvc3Q6bmV3IFNldCxjb25uZWN0aW9uT3BlbjpuZXcgU2V0LGNvbm5lY3Rpb25DbG9zZTpuZXcgU2V0fSxuPWZ1bmN0aW9uKGUsdCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlKHQpfSkpfTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSwoZnVuY3Rpb24oKXtuKGUuaW5pdEZhaWx1cmUpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbk9wZW4sdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbkNsb3NlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9HQUlOLChmdW5jdGlvbigpe24oZS5jb25uZWN0aW9uR2Fpbil9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0xPU1QsKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uTG9zdCx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9VUERBVEUsKGZ1bmN0aW9uKHQpe24oZS5zdWJzY3JpcHRpb25VcGRhdGUsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fRkFJTFVSRSwoZnVuY3Rpb24odCl7bihlLnN1YnNjcmlwdGlvbkZhaWx1cmUsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSwoZnVuY3Rpb24odCl7bihlLmFsbE1lc3NhZ2UsdCksZS50b3BpYy5oYXModC50b3BpYykmJm4oZS50b3BpYy5nZXQodC50b3BpYyksdCl9KSksdGhpcy5zZW5kTWVzc2FnZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU0VORCxlKX0sdGhpcy5vbkluaXRGYWlsdXJlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5pbml0RmFpbHVyZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5pbml0RmFpbHVyZS5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbk9wZW49ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25PcGVuLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25PcGVuLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uQ2xvc2U9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25DbG9zZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uQ2xvc2UuZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25HYWluPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uR2Fpbi5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uR2Fpbi5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25Mb3N0LmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25Mb3N0LmRlbGV0ZShuKX19LHRoaXMub25TdWJzY3JpcHRpb25VcGRhdGU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5zdWJzY3JpcHRpb25VcGRhdGUuZGVsZXRlKG4pfX0sdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnN1YnNjcmlwdGlvbkZhaWx1cmUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUobil9fSx0aGlzLnN1YnNjcmliZVRvcGljcz1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwidG9waWNzIiksdC5hc3NlcnRUcnVlKHQuaXNBcnJheShlKSwidG9waWNzIG11c3QgYmUgYSBhcnJheSIpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsZSl9LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKG4scil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChuLCJ0b3BpY05hbWUiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS50b3BpYy5oYXMobik/ZS50b3BpYy5nZXQobikuYWRkKHIpOmUudG9waWMuc2V0KG4sbmV3IFNldChbcl0pKSxmdW5jdGlvbigpe3JldHVybiBlLnRvcGljLmdldChuKS5kZWxldGUocil9fSx0aGlzLm9uQWxsTWVzc2FnZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuYWxsTWVzc2FnZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5hbGxNZXNzYWdlLmRlbGV0ZShuKX19fSxJPWZ1bmN0aW9uKGUpe3RoaXMuYnVzPWUsdGhpcy5idXMuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuVVBEQVRFLHQuaGl0Y2godGhpcyx0aGlzLnVwZGF0ZUFnZW50RGF0YSkpfTtJLnByb3RvdHlwZS51cGRhdGVBZ2VudERhdGE9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5hZ2VudERhdGE7dGhpcy5hZ2VudERhdGE9ZTt0cnl7Y29uc3Qgcj1EYXRlLnBhcnNlKGUuc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXApO2lmKCFufHxyIT09RGF0ZS5wYXJzZShuLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKSl7Y29uc3Qgbj0obmV3IERhdGUpLmdldFRpbWUoKS1yO0EoIlNuYXBzaG90UmVjZWl2ZWRCeUNsaWVudCIsbix7Q29udGVudExlbmd0aEluQnl0ZXM6dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldChlLnNuYXBzaG90KSxJc0NDUExheWVyOnQuaXNDQ1AoKX0pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbTWV0cmljc10gRmFpbGVkIHRvIHNlbmQgbWV0cmljcy4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bnVsbD09biYmKHQuYWdlbnQuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLklOSVQsbmV3IHQuQWdlbnQpKSx0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuUkVGUkVTSCxuZXcgdC5BZ2VudCksdGhpcy5fZmlyZUFnZW50VXBkYXRlRXZlbnRzKG4pfSxJLnByb3RvdHlwZS5nZXRBZ2VudERhdGE9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmFnZW50RGF0YSl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJObyBhZ2VudCBkYXRhIGlzIGF2YWlsYWJsZSB5ZXQhIik7cmV0dXJuIHRoaXMuYWdlbnREYXRhfSxJLnByb3RvdHlwZS5nZXRDb250YWN0RGF0YT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmdldEFnZW50RGF0YSgpLHI9dC5maW5kKG4uc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRhY3RJZD09PWV9KSk7aWYobnVsbD09cil0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJDb250YWN0ICVzIG5vIGxvbmdlciBleGlzdHMuIixlKTtyZXR1cm4gcn0sSS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvbkRhdGE9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLmdldENvbnRhY3REYXRhKGUpLG89dC5maW5kKHIuY29ubmVjdGlvbnMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbm5lY3Rpb25JZD09PW59KSk7aWYobnVsbD09byl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJDb25uZWN0aW9uICVzIGZvciBjb250YWN0ICVzIG5vIGxvbmdlciBleGlzdHMuIixuLGUpO3JldHVybiBvfSxJLnByb3RvdHlwZS5nZXRJbnN0YW5jZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWdlbnREYXRhKCkuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkLm1hdGNoKC9pbnN0YW5jZVwvKFswLTlhLWZBLUZ8LV0rKVwvLylbMV19LEkucHJvdG90eXBlLmdldEFXU0FjY291bnRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvOihbMC05XSspOmluc3RhbmNlLylbMV19LEkucHJvdG90eXBlLl9kaWZmQ29udGFjdHM9ZnVuY3Rpb24oZSl7dmFyIG49e2FkZGVkOnt9LHJlbW92ZWQ6e30sY29tbW9uOnt9LG9sZE1hcDp0LmluZGV4KG51bGw9PWU/W106ZS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLG5ld01hcDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksZW5kVGltZTowfTtyZXR1cm4gdC5rZXlzKG4ub2xkTWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvbnRhaW5zKG4ubmV3TWFwLGUpP24uY29tbW9uW2VdPW4ubmV3TWFwW2VdOm4ucmVtb3ZlZFtlXT1uLm9sZE1hcFtlXX0pKSx0LmtleXMobi5uZXdNYXApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29udGFpbnMobi5vbGRNYXAsZSl8fChuLmFkZGVkW2VdPW4ubmV3TWFwW2VdKX0pKSxuLmVuZFRpbWU9cGVyZm9ybWFuY2Uubm93KCksbn0sSS5wcm90b3R5cGUuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cz1mdW5jdGlvbihlKXt2YXIgbj10aGlzLHI9bnVsbCxvPW51bGw9PWU/dC5BZ2VudEF2YWlsU3RhdGVzLklOSVQ6ZS5zbmFwc2hvdC5zdGF0ZS5uYW1lLGk9dGhpcy5hZ2VudERhdGEuc25hcHNob3Quc3RhdGUubmFtZSxzPW51bGw9PWU/dC5BZ2VudFN0YXRlVHlwZS5JTklUOmUuc25hcHNob3Quc3RhdGUudHlwZSxhPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLnR5cGU7cyE9PWEmJnQuY29yZS5nZXRBZ2VudFJvdXRpbmdFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMscyxhKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKGUsbmV3IHQuQWdlbnQpfSkpLG8hPT1pJiYodGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLlNUQVRFX0NIQU5HRSx7YWdlbnQ6bmV3IHQuQWdlbnQsb2xkU3RhdGU6byxuZXdTdGF0ZTppfSksdC5jb3JlLmdldEFnZW50U3RhdGVFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMsbyxpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKGUsbmV3IHQuQWdlbnQpfSkpKTt2YXIgYz1lJiZlLnNuYXBzaG90Lm5leHRTdGF0ZT9lLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGwsdT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5uZXh0U3RhdGU/dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlLm5hbWU6bnVsbDtjIT09dSYmdSYmbi5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLkVOUVVFVUVEX05FWFRfU1RBVEUsbmV3IHQuQWdlbnQpO2NvbnN0IGw9cGVyZm9ybWFuY2Uubm93KCk7cj1udWxsIT09ZT90aGlzLl9kaWZmQ29udGFjdHMoZSk6e2FkZGVkOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6e30sbmV3TWFwOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxlbmRUaW1lOnBlcmZvcm1hbmNlLm5vdygpfTtjb25zdCBwPXBlcmZvcm1hbmNlLm5vdygpO3QudmFsdWVzKHIuYWRkZWQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLklOSVQsbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCkpLG4uX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzKGUuY29udGFjdElkLHQuQ29udGFjdFN0YXRlVHlwZS5JTklULGUuc3RhdGUudHlwZSl9KSksdC52YWx1ZXMoci5yZW1vdmVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpKSxuLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsZS5jb250YWN0SWQpLG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKSksbi5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdChlLmNvbnRhY3RJZCl9KSksdC5rZXlzKHIuY29tbW9uKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLHIub2xkTWFwW2VdLnN0YXRlLnR5cGUsci5uZXdNYXBbZV0uc3RhdGUudHlwZSl9KSk7Y29uc3QgZD1wZXJmb3JtYW5jZS5ub3coKSxoPXtDb250ZW50TGVuZ3RoSW5CeXRlczp0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90KSxJc0NDUExheWVyOnQuaXNDQ1AoKX07dHJ5e0EoIlNuYXBzaG90Q29tcGFyaXNvblN0ZXBUaW1lIixyLmVuZFRpbWUtbCxoKSxBKCJTbmFwc2hvdEV2ZW50VHJpZ2dlclN0ZXBUaW1lIixkLXAsaCksQSgiU25hcHNob3RUb3RhbFByb2Nlc3NpbmdUaW1lIixkLWwsaCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW01ldHJpY3NdIEZhaWxlZCB0byBzZW5kIG1ldHJpY3MuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX07bGV0IEE9KGUsbixyKT0+e3QucHVibGlzaE1ldHJpYyh7bmFtZTplLGRhdGE6e2xhdGVuY3k6bixvcHRpb25hbERpbWVuc2lvbnM6cn19KX07dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldD1mdW5jdGlvbihlKXtpZihlJiZlLmhhc093blByb3BlcnR5KCJjb250ZW50TGVuZ3RoIikpe2NvbnN0IHQ9cGFyc2VJbnQoZS5jb250ZW50TGVuZ3RoKTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhwKSl7Y29uc3RbbixyXT1wW2VdO2lmKHQ+PW4mJnQ8PXIpcmV0dXJuIGV9fXJldHVybiJ1bmRlZmluZWQifSxJLnByb3RvdHlwZS5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXM7biE9PXImJnQuY29yZS5nZXRDb250YWN0RXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLG4scikuZm9yRWFjaCgoZnVuY3Rpb24obil7by5idXMudHJpZ2dlcihuLG5ldyB0LkNvbnRhY3QoZSkpLG8uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUobixlKSxuZXcgdC5Db250YWN0KGUpKX0pKSxvLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5SRUZSRVNILG5ldyB0LkNvbnRhY3QoZSkpLG8uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLlJFRlJFU0gsZSksbmV3IHQuQ29udGFjdChlKSl9LEkucHJvdG90eXBlLl91bnN1YkFsbENvbnRhY3RFdmVudHNGb3JDb250YWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC52YWx1ZXModC5Db250YWN0RXZlbnRzKS5mb3JFYWNoKChmdW5jdGlvbihyKXtuLmJ1cy5nZXRTdWJzY3JpcHRpb25zKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHIsZSkpLm1hcCgoZnVuY3Rpb24oZSl7ZS51bnN1YnNjcmliZSgpfSkpfSkpfSx0LmNvcmUub25WaWV3Q29udGFjdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29udGFjdEV2ZW50cy5WSUVXLGUpfSx0LmNvcmUudmlld0NvbnRhY3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLlZJRVcsZGF0YTp7Y29udGFjdElkOmV9fSl9LHQuY29yZS5vbkFjdGl2YXRlQ2hhbm5lbFdpdGhWaWV3VHlwZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ2hhbm5lbFZpZXdFdmVudHMuQUNUSVZBVEVfQ0hBTk5FTF9XSVRIX1ZJRVdfVFlQRSxlKX0sdC5jb3JlLmFjdGl2YXRlQ2hhbm5lbFdpdGhWaWV3VHlwZT1mdW5jdGlvbihlLG4scixvKXtjb25zdCBpPXt2aWV3VHlwZTplLG1lZGlhVHlwZTpufTtyJiYoaS5zb3VyY2U9ciksbyYmKGkuY2FzZUlkPW8pLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ2hhbm5lbFZpZXdFdmVudHMuQUNUSVZBVEVfQ0hBTk5FTF9XSVRIX1ZJRVdfVFlQRSxkYXRhOml9KX0sdC5jb3JlLnRyaWdnZXJUYXNrQ3JlYXRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuVGFza0V2ZW50cy5DUkVBVEVELGUpfSx0LmNvcmUub25BY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0NFU1NfREVOSUVELGUpfSx0LmNvcmUub25BdXRoRmFpbD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0sdC5jb3JlLm9uQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTLGUpfSx0LmNvcmUuX2hhbmRsZUF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCl9LHQuY29yZS5faGFuZGxlQXV0aEZhaWw9ZnVuY3Rpb24oZSxuLHIpe3ImJnIuYXV0aG9yaXplP3QuY29yZS5faGFuZGxlQXV0aG9yaXplRmFpbChlKTp0LmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsKG4pfSx0LmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWw9ZnVuY3Rpb24oZSl7bGV0IG49dC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpO2lmKCF0LmNvcmUuYXV0aG9yaXplVGltZW91dElkKWlmKG48dC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT04pe3QuY29yZS5faW5jcmVtZW50QXV0aFJldHJ5Q291bnQoKTtsZXQgcj1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KG4rMXx8MCx7YmFzZToyZTN9KTt0LmNvcmUuYXV0aG9yaXplVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57dC5jb3JlLl9yZWRpcmVjdFRvTG9naW4oZSl9KSxyKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBhdXRob3JpemUgYXBpLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgaW4gdGhpcyBzZXNzaW9uIHVudGlsIHRoZSBhdXRob3JpemUgYXBpIHJldHVybnMgMjAwLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSx0LmNvcmUuX3JlZGlyZWN0VG9Mb2dpbj1mdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGU/bG9jYXRpb24uYXNzaWduKGUpOmxvY2F0aW9uLnJlbG9hZCgpfSx0LmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2lmKCF0LmNvcmUuY3RpVGltZW91dElkKWlmKHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudDx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UKXt0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQrKztsZXQgbj1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudHx8MCx7YmFzZTo1MDB9KTt0LmNvcmUuY3RpVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57dC5jb3JlLmF1dGhvcml6ZShlKS50aGVuKHQuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3MuYmluZCh0LmNvcmUpKS5jYXRjaCh0LmNvcmUuX3RyaWdnZXJBdXRoRmFpbC5iaW5kKHQuY29yZSx7YXV0aG9yaXplOiEwfSkpLHQuY29yZS5jdGlUaW1lb3V0SWQ9bnVsbH0pLG4pfWVsc2UgdC5nZXRMb2coKS53YXJuKCJXZSBoYXZlIGV4aGF1c3RlZCBvdXIgYXV0aG9yaXphdGlvbiByZXRyaWVzIGR1ZSB0byA0MDFzIGZyb20gdGhlIENUSSBzZXJ2aWNlLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgdW50aWwgdGhlIHBhZ2UgaXMgcmVmcmVzaGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0sdC5jb3JlLl90cmlnZ2VyQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSE9SSVpFX1NVQ0NFU1MpfSx0LmNvcmUuX3RyaWdnZXJBdXRoRmFpbD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0sdC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe2xldCBlPXdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCk7aWYobnVsbCE9PWUpe2lmKGlzTmFOKHBhcnNlSW50KGUpKSl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgc2Vzc2lvbiBzdG9yYWdlIHZhbHVlIGZvciBhdXRoIHJldHJ5IGNvdW50IHdhcyBOYU4iKTtyZXR1cm4gcGFyc2VJbnQoZSl9cmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwwKSwwfSx0LmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50PWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULCh0LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50KCkrMSkudG9TdHJpbmcoKSl9LHQuY29yZS5vbkF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLm9uQ1RJQXV0aG9yaXplUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLm9uU29mdHBob25lU2Vzc2lvbkluaXQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGUpfSx0LmNvcmUub25Db25maWd1cmU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ09ORklHVVJFLGUpfSx0LmNvcmUub25Jbml0aWFsaXplZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuSU5JVCxlKX0sdC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWU9ZnVuY3Rpb24oZSxuKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhY3RJZCIpLCF0LmNvbnRhaW5zKHQudmFsdWVzKHQuQ29udGFjdEV2ZW50cyksZSkpdGhyb3cgbmV3IHQuVmFsdWVFcnJvcigiJXMgaXMgbm90IGEgdmFsaWQgY29udGFjdCBldmVudC4iLGUpO3JldHVybiB0LnNwcmludGYoIiVzOjolcyIsZSxuKX0sdC5jb3JlLmdldEV2ZW50QnVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5ldmVudEJ1c30sdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLndlYlNvY2tldFByb3ZpZGVyfSx0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyfSx0LmNvcmUuZ2V0TG9jYWxUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCkuc25hcHNob3QubG9jYWxUaW1lc3RhbXB9LHQuY29yZS5nZXRTa2V3PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LnNrZXd9LHQuY29yZS5nZXRBZ2VudFJvdXRpbmdFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudFJvdXRpbmdFdmVudEdyYXBofSx0LmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLlJPVVRBQkxFLHQuQWdlbnRFdmVudHMuUk9VVEFCTEUpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5OT1RfUk9VVEFCTEUsdC5BZ2VudEV2ZW50cy5OT1RfUk9VVEFCTEUpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5PRkZMSU5FLHQuQWdlbnRFdmVudHMuT0ZGTElORSksdC5jb3JlLmdldEFnZW50U3RhdGVFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaH0sdC5jb3JlLmFnZW50U3RhdGVFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQudmFsdWVzKHQuQWdlbnRFcnJvclN0YXRlcyksdC5BZ2VudEV2ZW50cy5FUlJPUikuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50QXZhaWxTdGF0ZXMuQUZURVJfQ0FMTF9XT1JLLHQuQWdlbnRFdmVudHMuQUNXKSx0LmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmNvbnRhY3RFdmVudEdyYXBofSx0LmNvcmUuY29udGFjdEV2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdEV2ZW50cy5JTkNPTUlORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuUEVORElORyx0LkNvbnRhY3RFdmVudHMuUEVORElORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RFdmVudHMuQ09OTkVDVElORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29udGFjdEV2ZW50cy5DT05ORUNURUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkVOREVELHQuQ29udGFjdEV2ZW50cy5BQ1cpLmFzc29jKHQudmFsdWVzKHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTKSx0LnZhbHVlcyh0LnJlbGF0aXZlQ29tcGxlbWVudCh0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyx0LkNvbnRhY3RTdGF0ZVR5cGUpKSx0LkNvbnRhY3RFdmVudHMuRU5ERUQpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5FUlJPUikuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLk1JU1NFRCx0LkNvbnRhY3RFdmVudHMuTUlTU0VEKSx0LmNvcmUuZ2V0Q2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5jbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgY29yZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5jbGllbnR9LHQuY29yZS5jbGllbnQ9bnVsbCx0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLmFwaVByb3h5Q2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGFwaVByb3h5IENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5hcGlQcm94eUNsaWVudH0sdC5jb3JlLmFwaVByb3h5Q2xpZW50PW51bGwsdC5jb3JlLmdldEFnZW50QXBwQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5hZ2VudEFwcENsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBBZ2VudEFwcCBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuYWdlbnRBcHBDbGllbnR9LHQuY29yZS5hZ2VudEFwcENsaWVudD1udWxsLHQuY29yZS5nZXRUYXNrVGVtcGxhdGVzQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IFRhc2tUZW1wbGF0ZXMgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnR9LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW51bGwsdC5jb3JlLmdldE1hc3RlckNsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUubWFzdGVyQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IG1hc3RlciBjbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUubWFzdGVyQ2xpZW50fSx0LmNvcmUubWFzdGVyQ2xpZW50PW51bGwsdC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXJ9LHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ8fCh0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcj1uZXcgdC5Ob3RpZmljYXRpb25NYW5hZ2VyKSx0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcn0sdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bnVsbCx0LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5wb3B1cE1hbmFnZXJ9LHQuY29yZS5wb3B1cE1hbmFnZXI9bmV3IHQuUG9wdXBNYW5hZ2VyLHQuY29yZS5nZXRVcHN0cmVhbT1mdW5jdGlvbigpe2lmKCF0LmNvcmUudXBzdHJlYW0pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlcmUgaXMgbm8gdXBzdHJlYW0gY29uZHVpdCEiKTtyZXR1cm4gdC5jb3JlLnVwc3RyZWFtfSx0LmNvcmUudXBzdHJlYW09bnVsbCx0LmNvcmUuQWdlbnREYXRhUHJvdmlkZXI9SX0oKX0sNTkyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQ7dmFyIG49Ijw8YWxsPj4iLHI9dC5tYWtlRW51bShbImFja25vd2xlZGdlIiwiYWNrX3RpbWVvdXQiLCJpbml0IiwiYXBpX3JlcXVlc3QiLCJhcGlfcmVzcG9uc2UiLCJhdXRoX2ZhaWwiLCJhY2Nlc3NfZGVuaWVkIiwiY2xvc2UiLCJjb25maWd1cmUiLCJsb2ciLCJtYXN0ZXJfcmVxdWVzdCIsIm1hc3Rlcl9yZXNwb25zZSIsInN5bmNocm9uaXplIiwidGVybWluYXRlIiwidGVybWluYXRlZCIsInNlbmRfbG9ncyIsInJlbG9hZF9hZ2VudF9jb25maWd1cmF0aW9uIiwiYnJvYWRjYXN0IiwiYXBpX21ldHJpYyIsImNsaWVudF9tZXRyaWMiLCJzb2Z0cGhvbmVfc3RhdHMiLCJzb2Z0cGhvbmVfcmVwb3J0IiwiY2xpZW50X3NpZGVfbG9ncyIsInNlcnZlcl9ib3VuZF9pbnRlcm5hbF9sb2ciLCJtdXRlIiwiaWZyYW1lX3N0eWxlIiwiaWZyYW1lX3JldHJpZXNfZXhoYXVzdGVkIiwidXBkYXRlX2Nvbm5lY3RlZF9jY3BzIiwib3V0ZXJfY29udGV4dF9pbmZvIiwibWVkaWFfZGV2aWNlX3JlcXVlc3QiLCJtZWRpYV9kZXZpY2VfcmVzcG9uc2UiLCJ0YWJfaWQiLCJhdXRob3JpemVfc3VjY2VzcyIsImF1dGhvcml6ZV9yZXRyaWVzX2V4aGF1c3RlZCIsImN0aV9hdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjbGlja19zdHJlYW1fZGF0YSIsInNldF9xdWlja19nZXRfYWdlbnRfc25hcHNob3RfZmxhZyIsImFwaV9wcm94eV9yZXF1ZXN0IiwiYXBpX3Byb3h5X3Jlc3BvbnNlIl0pLG89dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3QiLFsibG9naW5Qb3B1cCIsInNlbmRMb2dzIiwic29mdHBob25lIiwicmluZ3RvbmUiLCJtZXRyaWNzIiwiZmFpbG92ZXIiXSksaT10Lm1ha2VOYW1lc3BhY2VkRW51bSgiYWdlbnQiLFsiaW5pdCIsInVwZGF0ZSIsInJlZnJlc2giLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsInBlbmRpbmciLCJjb250YWN0X3BlbmRpbmciLCJvZmZsaW5lIiwiZXJyb3IiLCJzb2Z0cGhvbmVfZXJyb3IiLCJ3ZWJzb2NrZXRfY29ubmVjdGlvbl9sb3N0Iiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fZ2FpbmVkIiwic3RhdGVfY2hhbmdlIiwiYWN3IiwibXV0ZV90b2dnbGUiLCJsb2NhbF9tZWRpYV9zdHJlYW1fY3JlYXRlZCIsImVucXVldWVkX25leHRfc3RhdGUiXSkscz10Lm1ha2VOYW1lc3BhY2VkRW51bSgid2ViU29ja2V0IixbImluaXRfZmFpbHVyZSIsImNvbm5lY3Rpb25fb3BlbiIsImNvbm5lY3Rpb25fY2xvc2UiLCJjb25uZWN0aW9uX2Vycm9yIiwiY29ubmVjdGlvbl9nYWluIiwiY29ubmVjdGlvbl9sb3N0Iiwic3Vic2NyaXB0aW9uX3VwZGF0ZSIsInN1YnNjcmlwdGlvbl9mYWlsdXJlIiwiYWxsX21lc3NhZ2UiLCJzZW5kIiwic3Vic2NyaWJlIl0pLGE9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbnRhY3QiLFsiaW5pdCIsInJlZnJlc2giLCJkZXN0cm95ZWQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiYWN3IiwidmlldyIsImVuZGVkIiwiZXJyb3IiLCJhY2NlcHRlZCJdKSxjPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ0YXNrTGlzdCIsWyJhY3RpdmF0ZV9jaGFubmVsX3dpdGhfdmlld190eXBlIl0pLHU9dC5tYWtlTmFtZXNwYWNlZEVudW0oInRhc2siLFsiY3JlYXRlZCJdKSxsPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25uZWN0aW9uIixbInNlc3Npb25faW5pdCIsInJlYWR5X3RvX3N0YXJ0X3Nlc3Npb24iXSkscD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29uZmlndXJhdGlvbiIsWyJjb25maWd1cmUiLCJzZXRfc3BlYWtlcl9kZXZpY2UiLCJzZXRfbWljcm9waG9uZV9kZXZpY2UiLCJzZXRfcmluZ2VyX2RldmljZSIsInNwZWFrZXJfZGV2aWNlX2NoYW5nZWQiLCJtaWNyb3Bob25lX2RldmljZV9jaGFuZ2VkIiwicmluZ2VyX2RldmljZV9jaGFuZ2VkIiwiY2FtZXJhX2RldmljZV9jaGFuZ2VkIiwiYmFja2dyb3VuZF9ibHVyX2NoYW5nZWQiXSksZD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiZGlzYXN0ZXJSZWNvdmVyeSIsWyJzdXBwcmVzcyIsImZvcmNlX29mZmxpbmUiLCJzZXRfb2ZmbGluZSIsImluaXRfZGlzYXN0ZXJfcmVjb3ZlcnkiLCJmYWlsb3ZlciIsImZhaWxvdmVyX3BlbmRpbmciLCJpbml0X2RyX3BvbGxpbmciXSksaD10Lm1ha2VOYW1lc3BhY2VkRW51bSgidm9pY2VJZCIsWyJ1cGRhdGVfZG9tYWluX2lkIl0pLGY9ZnVuY3Rpb24oKXt9O2YuY3JlYXRlUmVxdWVzdD1mdW5jdGlvbihlLG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmFuZG9tSWQoKSxtZXRob2Q6bixwYXJhbXM6cn19LGYuY3JlYXRlUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmVxdWVzdElkLGRhdGE6bixlcnI6cnx8bnVsbH19O3ZhciBnPWZ1bmN0aW9uKGUsbixyKXt0aGlzLnN1Yk1hcD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpLHRoaXMuZXZlbnROYW1lPW4sdGhpcy5mPXJ9O2cucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAudW5zdWJzY3JpYmUodGhpcy5ldmVudE5hbWUsdGhpcy5pZCl9O3ZhciBtPWZ1bmN0aW9uKCl7dGhpcy5zdWJJZE1hcD17fSx0aGlzLnN1YkV2ZW50TmFtZU1hcD17fX07bS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGcodGhpcyxlLHQpO3RoaXMuc3ViSWRNYXBbbi5pZF09bjt2YXIgcj10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W107cmV0dXJuIHIucHVzaChuKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT1yLG59LG0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7dC5jb250YWlucyh0aGlzLnN1YkV2ZW50TmFtZU1hcCxlKSYmKHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdPXRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQhPT1ufSkpLHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmxlbmd0aDwxJiZkZWxldGUgdGhpcy5zdWJFdmVudE5hbWVNYXBbZV0pLHQuY29udGFpbnModGhpcy5zdWJJZE1hcCxuKSYmZGVsZXRlIHRoaXMuc3ViSWRNYXBbbl19LG0ucHJvdG90eXBlLmdldEFsbFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdC52YWx1ZXModGhpcy5zdWJFdmVudE5hbWVNYXApLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQodCl9KSxbXSl9LG0ucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdfHxbXX07dmFyIHY9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5zdWJNYXA9bmV3IG0sdGhpcy5sb2dFdmVudHM9dC5sb2dFdmVudHN8fCExfTt2LnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnN1Yk1hcC5zdWJzY3JpYmUoZSxuKX0sdi5wcm90b3R5cGUuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24oZSksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKG4sZSl9LHYucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMoZSl9LHYucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIik7dmFyIG89dGhpcyxpPXRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMobikscz10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpO3RoaXMubG9nRXZlbnRzJiZlIT09dC5FdmVudFR5cGUuTE9HJiZlIT09dC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFJiZlIT09dC5FdmVudFR5cGUuQVBJX01FVFJJQyYmZSE9PXQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0cmJnQuZ2V0TG9nKCkudHJhY2UoIlB1Ymxpc2hpbmcgZXZlbnQ6ICVzIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc3RhcnRzV2l0aCh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQpJiZyJiZyLmNvbnRhY3RJZCYmIShyIGluc3RhbmNlb2YgdC5Db250YWN0KSYmKHI9bmV3IHQuQ29udGFjdChyLmNvbnRhY3RJZCkpLGkuY29uY2F0KHMpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3RyeXtuLmYocnx8bnVsbCxlLG8pfWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IoIiclcycgZXZlbnQgaGFuZGxlciBmYWlsZWQuIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpfSx2LnByb3RvdHlwZS5icmlkZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudHJpZ2dlcihuLHQpfX0sdi5wcm90b3R5cGUudW5zdWJzY3JpYmVBbGw9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1hcC5nZXRBbGxTdWJzY3JpcHRpb25zKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS51bnN1YnNjcmliZSgpfSkpfSx0LkV2ZW50QnVzPXYsdC5FdmVudEZhY3Rvcnk9Zix0LkV2ZW50VHlwZT1yLHQuQWdlbnRFdmVudHM9aSx0LkNvbmZpZ3VyYXRpb25FdmVudHM9cCx0LkNvbm5lY3Rpb25FdmVudHM9bCx0LkNvbm5uZWN0aW9uRXZlbnRzPWwsdC5Db250YWN0RXZlbnRzPWEsdC5DaGFubmVsVmlld0V2ZW50cz1jLHQuVGFza0V2ZW50cz11LHQuVm9pY2VJZEV2ZW50cz1oLHQuV2ViU29ja2V0RXZlbnRzPXMsdC5NYXN0ZXJUb3BpY3M9byx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHM9ZH0oKX0sMjg2OigpPT57IWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKW4uZChyLG8sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsImEiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPSIiLG4obi5zPTIpfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLG89IkRFQlVHIixpPSJBTVpfV0VCX1NPQ0tFVF9NQU5BR0VSOiIscz0iTmV0d29yayBvZmZsaW5lIixhPSJOZXR3b3JrIG9ubGluZSwgY29ubmVjdGluZyB0byBXZWJTb2NrZXQgc2VydmVyIixjPSJOZXR3b3JrIG9mZmxpbmUsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0Iix1PSJIZWFydGJlYXQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIixsPSJGYWlsZWQgdG8gc2VuZCBoZWFydGJlYXQgc2luY2UgV2ViU29ja2V0IGlzIG5vdCBvcGVuIixwPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCEiLGQ9IldlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZCIsaD0iV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6ICIsZj0iU2NoZWR1bGluZyBXZWJTb2NrZXQgcmVpbml0aWFsaXphdGlvbiwgYWZ0ZXIgZGVsYXkgIixnPSJXZWJTb2NrZXQgVVJMIGNhbm5vdCBiZSB1c2VkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIixtPSJXZWJTb2NrZXQgSW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gVGVybWluYXRpbmcgYW5kIGNsZWFuaW5nIHN1YnNjcmlwdGlvbnMiLHY9IkZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIix5PSJTdWNjZXNzZnVsbHkgZmV0Y2hlZCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixFPSJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsUz0iUmV0cnlpbmcgZmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLGI9IkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciIsQz0iV2ViU29ja2V0TWFuYWdlciBNZXNzYWdlIEVycm9yIixUPSJNZXNzYWdlIHJlY2VpdmVkIGZvciB0b3BpYyAiLEk9IkludmFsaWQgaW5jb21pbmcgbWVzc2FnZSIsQT0iYXdzL3N1YnNjcmliZSIsXz0iYXdzL2hlYXJ0YmVhdCIsdz0iZGlzY29ubmVjdGVkIjtmdW5jdGlvbiBSKGUpe3JldHVybihSPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9dmFyIGs9e2Fzc2VydFRydWU6ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9LGFzc2VydE5vdE51bGw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gay5hc3NlcnRUcnVlKG51bGwhPT1lJiZ2b2lkIDAhPT1SKGUpLE9iamVjdChyLnNwcmludGYpKCIlcyBtdXN0IGJlIHByb3ZpZGVkIix0fHwiQSB2YWx1ZSIpKSxlfSxpc05vbkVtcHR5U3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MH0sYXNzZXJ0SXNMaXN0OmZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gYXJyYXkiKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSxpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4hKCJvYmplY3QiIT09UihlKXx8bnVsbD09PWUpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX19LEw9bmV3IFJlZ0V4cCgiXih3c3M6Ly8pXFx3KiIpO2sudmFsaWRXU1VybD1mdW5jdGlvbihlKXtyZXR1cm4gTC50ZXN0KGUpfSxrLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57dG9waWM6ZSxjb250ZW50OntzdGF0dXM6dD8ic3VjY2VzcyI6ImZhaWx1cmUiLHRvcGljczpufX19LGsuYXNzZXJ0SXNPYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZighay5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIil9LGsuYWRkSml0dGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxO3Q9TWF0aC5taW4odCwxKTt2YXIgbj1NYXRoLnJhbmRvbSgpPi41PzE6LTE7cmV0dXJuIE1hdGguZmxvb3IoZStuKmUqTWF0aC5yYW5kb20oKSp0KX0say5pc05ldHdvcmtPbmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLm9uTGluZX0say5pc05ldHdvcmtGYWlsdXJlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWUuX2RlYnVnfHwhZS5fZGVidWcudHlwZSkmJiJOZXR3b3JraW5nRXJyb3IiPT09ZS5fZGVidWcudHlwZX07dmFyIE49aztmdW5jdGlvbiBPKGUpe3JldHVybihPPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiBEKGUsdCl7cmV0dXJuKEQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIFAoZSl7cmV0dXJuKFA9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiB4KGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWZ1bmN0aW9uIFUoZSx0LG4pe3JldHVybiB0JiZNKGUucHJvdG90eXBlLHQpLG4mJk0oZSxuKSxlfXZhciBGPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKX1yZXR1cm4gVShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXt9fV0pLGV9KCkscT1pLEI9e0RFQlVHOjEwLElORk86MjAsV0FSTjozMCxFUlJPUjo0MCxBRFZBTkNFRF9MT0c6NTB9LGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpLHRoaXMudXBkYXRlTG9nZ2VyQ29uZmlnKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1IKCl9cmV0dXJuIFUoZSxbe2tleToid3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmhhc0NsaWVudExvZ2dlcigpKXN3aXRjaChlKXtjYXNlIEIuREVCVUc6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyh0KXx8dDtjYXNlIEIuSU5GTzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8odCl8fHQ7Y2FzZSBCLldBUk46cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKHQpfHx0O2Nhc2UgQi5FUlJPUjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKHQpfHx0O2Nhc2UgQi5BRFZBTkNFRF9MT0c6cmV0dXJuIHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyP3RoaXMuX2NsaWVudExvZ2dlclt0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcl0odCl8fHQ6IiJ9fX0se2tleToiaXNMZXZlbEVuYWJsZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLl9sZXZlbH19LHtrZXk6Imhhc0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2NsaWVudExvZ2dlcn19LHtrZXk6ImdldExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcmVmaXh8fHE7cmV0dXJuIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj09PW8/dGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcjpuZXcgVyh0KX19LHtrZXk6InVwZGF0ZUxvZ2dlckNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5fbGV2ZWw9dC5sZXZlbHx8Qi5JTkZPLHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPSJ3YXJuIix0LmFkdmFuY2VkTG9nV3JpdGVyJiYodGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9dC5hZHZhbmNlZExvZ1dyaXRlciksdC5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAodC5jdXN0b21pemVkTG9nZ2VyKSYmKHRoaXMudXNlQ2xpZW50TG9nZ2VyPSEwKSx0aGlzLl9jbGllbnRMb2dnZXI9dC5sb2dnZXJ8fHRoaXMuc2VsZWN0TG9nZ2VyKHQpLHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iTlVMTCIsdC5kZWJ1ZyYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj1vKSx0LmxvZ2dlciYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iQ0xJRU5UX0xPR0dFUiIpfX0se2tleToic2VsZWN0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAoZS5jdXN0b21pemVkTG9nZ2VyKT9lLmN1c3RvbWl6ZWRMb2dnZXI6ZS51c2VEZWZhdWx0TG9nZ2VyPyh0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUgoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyKTpudWxsfX1dKSxlfSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpfXJldHVybiBVKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLGV9KCksVz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3ZhciBuO3JldHVybiB4KHRoaXMsdCksKG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1QKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9KGUpOnR9KHRoaXMsTyh0KS5jYWxsKHRoaXMpKSkucHJlZml4PWV8fHEsbn1yZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmRChlLHQpfSh0LFYpLFUodCxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkRFQlVHLHQpfX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuSU5GTyx0KX19LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLldBUk4sdCl9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuRVJST1IsdCl9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuQURWQU5DRURfTE9HLHQpfX0se2tleToiX3Nob3VsZExvZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEcuaGFzQ2xpZW50TG9nZ2VyKCkmJkcuaXNMZXZlbEVuYWJsZWQoZSl9fSx7a2V5OiJfd3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRy53cml0ZVRvQ2xpZW50TG9nZ2VyKGUsdCl9fSx7a2V5OiJfbG9nIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX3Nob3VsZExvZyhlKSl7dmFyIG49Ry51c2VDbGllbnRMb2dnZXI/dDp0aGlzLl9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQodCxlKTtyZXR1cm4gdGhpcy5fd3JpdGVUb0NsaWVudExvZ2dlcihlLG4pfX19LHtrZXk6Il9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxyPXRoaXMuX2dldExvZ0xldmVsQnlWYWx1ZSh0KSxvPSJbIi5jb25jYXQobiwiXVsiKS5jb25jYXQociwiXSIpO3RoaXMucHJlZml4JiYobys9dGhpcy5wcmVmaXgrIiAiKSx0aGlzLm9wdGlvbnMmJih0aGlzLm9wdGlvbnMucHJlZml4P28rPSIgIit0aGlzLm9wdGlvbnMucHJlZml4KyI6IjpvKz0iIix0aGlzLm9wdGlvbnMubG9nTWV0YURhdGE/bys9IiBNZXRhIGRhdGE6ICIrSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxvZ01ldGFEYXRhKTpvKz0iIik7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBzPWVbaV07bys9dGhpcy5fY29udmVydFRvU3RyaW5nKHMpKyIgIn1yZXR1cm4gb319LHtrZXk6Il9nZXRMb2dMZXZlbEJ5VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDEwOnJldHVybiJERUJVRyI7Y2FzZSAyMDpyZXR1cm4iSU5GTyI7Y2FzZSAzMDpyZXR1cm4iV0FSTiI7Y2FzZSA0MDpyZXR1cm4iRVJST1IiO2Nhc2UgNTA6cmV0dXJuIkFEVkFOQ0VEX0xPRyJ9fX0se2tleToiX2NvbnZlcnRUb1N0cmluZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dHJ5e2lmKCFlKXJldHVybiIiO2lmKE4uaXNTdHJpbmcoZSkpcmV0dXJuIGU7aWYoTi5pc09iamVjdChlKSYmTi5pc0Z1bmN0aW9uKGUudG9TdHJpbmcpKXt2YXIgdD1lLnRvU3RyaW5nKCk7aWYoIltvYmplY3QgT2JqZWN0XSIhPT10KXJldHVybiB0fXJldHVybiBKU09OLnN0cmluZ2lmeShlKX1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3Igd2hpbGUgY29udmVydGluZyBhcmd1bWVudCB0byBzdHJpbmciLGUsdCksIiJ9fX1dKSx0fSgpLEg9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVjtyZXR1cm4gZS5kZWJ1Zz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmRlYnVnLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmluZm8uYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS53YXJuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUud2Fybi5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLmVycm9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZXJyb3IuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZX0sRz1uZXcgajtmdW5jdGlvbiB6KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19dmFyIEs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToyZTM7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5udW1BdHRlbXB0cz0wLHRoaXMuZXhlY3V0b3I9dCx0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmRlZmF1bHRSZXRyeT1ufXZhciB0LG47cmV0dXJuIHQ9ZSwobj1be2tleToicmV0cnkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbnx8KHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSEwLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fZXhlY3V0ZSgpfSksdGhpcy5fZ2V0RGVsYXkoKSkpfX0se2tleToiX2V4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITEsdGhpcy5leGVjdXRvcigpLHRoaXMubnVtQXR0ZW1wdHMrK319LHtrZXk6ImNvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm51bUF0dGVtcHRzPTB9fSx7a2V5OiJfZ2V0RGVsYXkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9TWF0aC5wb3coMix0aGlzLm51bUF0dGVtcHRzKSp0aGlzLmRlZmF1bHRSZXRyeTtyZXR1cm4gZTw9M2U0P2U6M2U0fX0se2tleToiZ2V0SXNDb25uZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubnVtQXR0ZW1wdHN9fV0pJiZ6KHQucHJvdG90eXBlLG4pLGV9KCk7bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBZfSkpO3ZhciBYPWZ1bmN0aW9uKCl7dmFyIGU9Ry5nZXRMb2dnZXIoe3ByZWZpeDppfSksdD1OLmlzTmV0d29ya09ubGluZSgpLG49e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH0scj17cmVjb25uZWN0V2ViU29ja2V0OiEwLHdlYnNvY2tldEluaXRGYWlsZWQ6ITEsZXhwb25lbnRpYWxCYWNrT2ZmVGltZToxZTMsZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlOm51bGwsbGlmZVRpbWVUaW1lb3V0SGFuZGxlOm51bGwsd2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ6bnVsbCxjb25uU3RhdGU6bnVsbH0sbz17Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6MCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpudWxsLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9LFI9e3BlbmRpbmdSZXNwb25zZTohMSxpbnRlcnZhbEhhbmRsZTpudWxsfSxrPXtpbml0RmFpbHVyZTpuZXcgU2V0LGdldFdlYlNvY2tldFRyYW5zcG9ydDpudWxsLHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sTD17Y29ubkNvbmZpZzpudWxsLHByb21pc2VIYW5kbGU6bnVsbCxwcm9taXNlQ29tcGxldGVkOiEwfSxPPXtzdWJzY3JpYmVkOm5ldyBTZXQscGVuZGluZzpuZXcgU2V0LHN1YnNjcmlwdGlvbkhpc3Rvcnk6bmV3IFNldH0sRD17cmVzcG9uc2VDaGVja0ludGVydmFsSWQ6bnVsbCxyZXF1ZXN0Q29tcGxldGVkOiEwLHJlU3Vic2NyaWJlSW50ZXJ2YWxJZDpudWxsLGNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM6MCxjb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0OjB9LFA9bmV3IEsoKGZ1bmN0aW9uKCl7c2UoKX0pKSx4PW5ldyBTZXQoW0EsImF3cy91bnN1YnNjcmliZSIsX10pLE09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodCE9PU4uaXNOZXR3b3JrT25saW5lKCkpe2lmKCEodD1OLmlzTmV0d29ya09ubGluZSgpKSlyZXR1cm4gZS5hZHZhbmNlZExvZyhzKSx2b2lkIHVlKGUuaW5mbyhzKSk7dmFyIG49VygpO3QmJighbnx8QihuLFdlYlNvY2tldC5DTE9TSU5HKXx8QihuLFdlYlNvY2tldC5DTE9TRUQpKSYmKGUuYWR2YW5jZWRMb2coYSksdWUoZS5pbmZvKGEpKSxzZSgpKX19KSwyNTApLFU9ZnVuY3Rpb24odCxuKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0KG4pfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGV4ZWN1dGluZyBjYWxsYmFjayIsdCkpfX0pKX0sRj1mdW5jdGlvbihlKXtpZihudWxsPT09ZSlyZXR1cm4iTlVMTCI7c3dpdGNoKGUucmVhZHlTdGF0ZSl7Y2FzZSBXZWJTb2NrZXQuQ09OTkVDVElORzpyZXR1cm4iQ09OTkVDVElORyI7Y2FzZSBXZWJTb2NrZXQuT1BFTjpyZXR1cm4iT1BFTiI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0lORzpyZXR1cm4iQ0xPU0lORyI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0VEOnJldHVybiJDTE9TRUQiO2RlZmF1bHQ6cmV0dXJuIlVOREVGSU5FRCJ9fSxxPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3VlKGUuZGVidWcoIlsiK3QrIl0gUHJpbWFyeSBXZWJTb2NrZXQ6ICIrRihuLnByaW1hcnkpKyIgfCBTZWNvbmRhcnkgV2ViU29ja2V0OiAiK0Yobi5zZWNvbmRhcnkpKSl9LEI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5yZWFkeVN0YXRlPT09dH0saj1mdW5jdGlvbihlKXtyZXR1cm4gQihlLFdlYlNvY2tldC5PUEVOKX0sVj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PWUucmVhZHlTdGF0ZXx8QihlLFdlYlNvY2tldC5DTE9TRUQpfSxXPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1uLnNlY29uZGFyeT9uLnNlY29uZGFyeTpuLnByaW1hcnl9LEg9ZnVuY3Rpb24oKXtyZXR1cm4gaihXKCkpfSx6PWZ1bmN0aW9uKCl7aWYoUi5wZW5kaW5nUmVzcG9uc2UpcmV0dXJuIGUuYWR2YW5jZWRMb2codSksdWUoZS53YXJuKHUpKSxjbGVhckludGVydmFsKFIuaW50ZXJ2YWxIYW5kbGUpLFIucGVuZGluZ1Jlc3BvbnNlPSExLHZvaWQgc2UoKTtIKCk/KHVlKGUuZGVidWcoIlNlbmRpbmcgaGVhcnRiZWF0IikpLFcoKS5zZW5kKG9lKF8pKSxSLnBlbmRpbmdSZXNwb25zZT0hMCk6KGUuYWR2YW5jZWRMb2cobCksdWUoZS53YXJuKGwpKSxxKCJzZW5kSGVhcnRCZWF0Iiksc2UoKSl9LFg9ZnVuY3Rpb24oKXtlLmFkdmFuY2VkTG9nKCJSZXNldCBXZWJzb2NrZXQgc3RhdGUiKSxyLmV4cG9uZW50aWFsQmFja09mZlRpbWU9MWUzLFIucGVuZGluZ1Jlc3BvbnNlPSExLHIucmVjb25uZWN0V2ViU29ja2V0PSEwLGNsZWFyVGltZW91dChyLmxpZmVUaW1lVGltZW91dEhhbmRsZSksY2xlYXJJbnRlcnZhbChSLmludGVydmFsSGFuZGxlKSxjbGVhclRpbWVvdXQoci5leHBvbmVudGlhbFRpbWVvdXRIYW5kbGUpLGNsZWFyVGltZW91dChyLndlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkKX0sWT1mdW5jdGlvbigpe0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGNsZWFySW50ZXJ2YWwoRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZCksY2xlYXJJbnRlcnZhbChELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZCl9LCQ9ZnVuY3Rpb24oKXtvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50PTAsby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZT1udWxsLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9bnVsbH0sSj1mdW5jdGlvbigpe1AuY29ubmVjdGVkKCk7dHJ5e2UuYWR2YW5jZWRMb2cocCksdWUoZS5pbmZvKHApKSxxKCJ3ZWJTb2NrZXRPbk9wZW4iKSxudWxsIT09ci5jb25uU3RhdGUmJnIuY29ublN0YXRlIT09d3x8VShrLmNvbm5lY3Rpb25HYWluKSxyLmNvbm5TdGF0ZT0iY29ubmVjdGVkIjt2YXIgdD1EYXRlLm5vdygpO1Uoay5jb25uZWN0aW9uT3Blbix7Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXAsY29ubmVjdGlvbkVzdGFibGlzaGVkVGltZTp0LHRpbWVUb0Nvbm5lY3Q6dC1vLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLHRpbWVXaXRob3V0Q29ubmVjdGlvbjpvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wP3Qtby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpudWxsfSksJCgpLFgoKSxXKCkub3BlblRpbWVzdGFtcD1EYXRlLm5vdygpLDA9PT1PLnN1YnNjcmliZWQuc2l6ZSYmaihuLnNlY29uZGFyeSkmJnRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpLChPLnN1YnNjcmliZWQuc2l6ZT4wfHxPLnBlbmRpbmcuc2l6ZT4wKSYmKGoobi5zZWNvbmRhcnkpJiZ1ZShlLmluZm8oIlN1YnNjcmliaW5nIHNlY29uZGFyeSB3ZWJzb2NrZXQgdG8gdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLE8uc3Vic2NyaWJlZC5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmlwdGlvbkhpc3RvcnkuYWRkKGUpLE8ucGVuZGluZy5hZGQoZSl9KSksTy5zdWJzY3JpYmVkLmNsZWFyKCksZWUoKSkseigpLFIuaW50ZXJ2YWxIYW5kbGU9c2V0SW50ZXJ2YWwoeiwxZTQpO3ZhciBpPTFlMypMLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzO3VlKGUuZGVidWcoIlNjaGVkdWxpbmcgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0aW9uLCBhZnRlciBkZWxheSAiK2krIiBtcyIpKSxyLmxpZmVUaW1lVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3VlKGUuZGVidWcoIlN0YXJ0aW5nIHNjaGVkdWxlZCBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24iKSksc2UoKX0pLGkpfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGFmdGVyIGVzdGFibGlzaGluZyBXZWJTb2NrZXQgY29ubmVjdGlvbiIsdCkpfX0sUT1mdW5jdGlvbih0KXtxKCJ3ZWJTb2NrZXRPbkVycm9yIiksZS5hZHZhbmNlZExvZyhoLEpTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmVycm9yKGgsSlNPTi5zdHJpbmdpZnkodCkpKSxQLmdldElzQ29ubmVjdGVkKCk/c2UoKTpQLnJldHJ5KCl9LFo9ZnVuY3Rpb24odCl7dmFyIHI9SlNPTi5wYXJzZSh0LmRhdGEpO3N3aXRjaChyLnRvcGljKXtjYXNlIEE6aWYodWUoZS5kZWJ1ZygiU3Vic2NyaXB0aW9uIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3ZWJTb2NrZXQgc2VydmVyIix0LmRhdGEpKSxELnJlcXVlc3RDb21wbGV0ZWQ9ITAsRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsInN1Y2Nlc3MiPT09ci5jb250ZW50LnN0YXR1cylELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCxyLmNvbnRlbnQudG9waWNzLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaXB0aW9uSGlzdG9yeS5kZWxldGUoZSksTy5wZW5kaW5nLmRlbGV0ZShlKSxPLnN1YnNjcmliZWQuYWRkKGUpfSkpLDA9PT1PLnN1YnNjcmlwdGlvbkhpc3Rvcnkuc2l6ZT9qKG4uc2Vjb25kYXJ5KSYmKHVlKGUuaW5mbygiU3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byBhbGwgdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLHRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpKTplZSgpLFUoay5zdWJzY3JpcHRpb25VcGRhdGUscik7ZWxzZXtpZihjbGVhckludGVydmFsKEQucmVTdWJzY3JpYmVJbnRlcnZhbElkKSwrK0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cyw1PT09RC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzKXJldHVybiBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxyKSx2b2lkKEQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wKTtELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlZSgpfSksNTAwKX1icmVhaztjYXNlIF86dWUoZS5kZWJ1ZygiSGVhcnRiZWF0IHJlc3BvbnNlIHJlY2VpdmVkIikpLFIucGVuZGluZ1Jlc3BvbnNlPSExO2JyZWFrO2RlZmF1bHQ6aWYoci50b3BpYyl7aWYoZS5hZHZhbmNlZExvZyhULHIudG9waWMpLHVlKGUuZGVidWcoVCtyLnRvcGljKSksaihuLnByaW1hcnkpJiZqKG4uc2Vjb25kYXJ5KSYmMD09PU8uc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplJiZ0aGlzPT09bi5wcmltYXJ5KXJldHVybiB2b2lkIHVlKGUud2FybigiSWdub3JpbmcgTWVzc2FnZSBmb3IgVG9waWMgIityLnRvcGljKyIsIHRvIGF2b2lkIGR1cGxpY2F0ZXMiKSk7aWYoMD09PWsuYWxsTWVzc2FnZS5zaXplJiYwPT09ay50b3BpYy5zaXplKXJldHVybiB2b2lkIHVlKGUud2FybigiTm8gcmVnaXN0ZXJlZCBjYWxsYmFjayBsaXN0ZW5lciBmb3IgVG9waWMiLHIudG9waWMpKTtlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXRNYW5hZ2VyIGludm9rZSBjYWxsYmFja3MgZm9yIHRvcGljIHN1Y2Nlc3MgIixyLnRvcGljKSxVKGsuYWxsTWVzc2FnZSxyKSxrLnRvcGljLmhhcyhyLnRvcGljKSYmVShrLnRvcGljLmdldChyLnRvcGljKSxyKX1lbHNlIHIubWVzc2FnZT8oZS5hZHZhbmNlZExvZyhDLHIpLHVlKGUud2FybihDLHIpKSk6KGUuYWR2YW5jZWRMb2coSSxyKSx1ZShlLndhcm4oSSxyKSkpfX0sZWU9ZnVuY3Rpb24gdCgpe2lmKEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD4zKXJldHVybiB1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3Mgc2luY2Ugd2UgaGF2ZSBleGhhdXN0ZWQgbWF4IHN1YnNjcmlwdGlvbiByZXRyaWVzIHdpdGggbm8gcmVzcG9uc2UiKSksdm9pZCBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxOLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlKEEsITEsQXJyYXkuZnJvbShPLnBlbmRpbmcpKSk7SCgpPzAhPT1BcnJheS5mcm9tKE8ucGVuZGluZykubGVuZ3RoJiYoY2xlYXJJbnRlcnZhbChELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxXKCkuc2VuZChvZShBLHt0b3BpY3M6QXJyYXkuZnJvbShPLnBlbmRpbmcpfSkpLEQucmVxdWVzdENvbXBsZXRlZD0hMSxELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe0QucmVxdWVzdENvbXBsZXRlZHx8KCsrRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0LHQoKSl9KSwxZTMpKTp1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3MgY2FsbCBzaW5jZSBEZWZhdWx0IFdlYlNvY2tldCBpcyBub3Qgb3BlbiIpKX0sdGU9ZnVuY3Rpb24odCxuKXtCKHQsV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHxCKHQsV2ViU29ja2V0Lk9QRU4pP3QuY2xvc2UoMWUzLG4pOnVlKGUud2FybigiSWdub3JpbmcgV2ViU29ja2V0IENsb3NlIHJlcXVlc3QsIFdlYlNvY2tldCBTdGF0ZTogIitGKHQpKSl9LG5lPWZ1bmN0aW9uKGUpe3RlKG4ucHJpbWFyeSwiW1ByaW1hcnldIFdlYlNvY2tldCAiK2UpLHRlKG4uc2Vjb25kYXJ5LCJbU2Vjb25kYXJ5XSBXZWJTb2NrZXQgIitlKX0scmU9ZnVuY3Rpb24odCl7WCgpLFkoKSxlLmFkdmFuY2VkTG9nKG0sdCksdWUoZS5lcnJvcihtKSksci53ZWJzb2NrZXRJbml0RmFpbGVkPSEwLG5lKCJUZXJtaW5hdGluZyBXZWJTb2NrZXQgTWFuYWdlciIpLGNsZWFySW50ZXJ2YWwoTSksVShrLmluaXRGYWlsdXJlLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUscmVhc29uOnR9KSwkKCl9LG9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHt0b3BpYzplLGNvbnRlbnQ6dH0pfSxpZT1mdW5jdGlvbih0KXtyZXR1cm4hIShOLmlzT2JqZWN0KHQpJiZOLmlzT2JqZWN0KHQud2ViU29ja2V0VHJhbnNwb3J0KSYmTi5pc05vbkVtcHR5U3RyaW5nKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJk4udmFsaWRXU1VybCh0LndlYlNvY2tldFRyYW5zcG9ydC51cmwpJiYxZTMqdC53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM+PTNlNSl8fCh1ZShlLmVycm9yKCJJbnZhbGlkIFdlYlNvY2tldCBDb25uZWN0aW9uIENvbmZpZ3VyYXRpb24iLHQpKSwhMSl9LHNlPWZ1bmN0aW9uKCl7aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIGUuYWR2YW5jZWRMb2coYyksdm9pZCB1ZShlLmluZm8oYykpO2lmKHIud2Vic29ja2V0SW5pdEZhaWxlZCl1ZShlLmRlYnVnKCJXZWJTb2NrZXQgSW5pdCBoYWQgZmFpbGVkLCBpZ25vcmluZyB0aGlzIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCIpKTtlbHNle2lmKEwucHJvbWlzZUNvbXBsZXRlZClyZXR1cm4gWCgpLGUuYWR2YW5jZWRMb2codiksdWUoZS5pbmZvKHYpKSxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWV8fERhdGUubm93KCksTC5wcm9taXNlQ29tcGxldGVkPSExLEwucHJvbWlzZUhhbmRsZT1rLmdldFdlYlNvY2tldFRyYW5zcG9ydCgpLEwucHJvbWlzZUhhbmRsZS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gTC5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coeSksdWUoZS5kZWJ1Zyh5LHQpKSxpZSh0KT8oTC5jb25uQ29uZmlnPXQsTC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU9RGF0ZS5ub3coKSs4NWUzLGFlKCkpOihyZSgiSW52YWxpZCBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uOiAiK3QpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIEwucHJvbWlzZUNvbXBsZXRlZD0hMCxlLmFkdmFuY2VkTG9nKEUpLHVlKGUuZXJyb3IoRSx0KSksTi5pc05ldHdvcmtGYWlsdXJlKHQpPyhlLmFkdmFuY2VkTG9nKFMrSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuaW5mbyhTK0pTT04uc3RyaW5naWZ5KHQpKSksUC5yZXRyeSgpKTpyZSgiRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrSlNPTi5zdHJpbmdpZnkodCkpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX0pKTt1ZShlLmRlYnVnKCJUaGVyZSBpcyBhbiBvbmdvaW5nIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCwgdGhpcyByZXF1ZXN0IHdpbGwgYmUgaWdub3JlZCIpKX19LGFlPWZ1bmN0aW9uKCl7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKXJldHVybiB1ZShlLmluZm8oIndlYi1zb2NrZXQgaW5pdGlhbGl6aW5nIGhhZCBmYWlsZWQsIGFib3J0aW5nIHJlLWluaXQiKSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9O2lmKCFOLmlzTmV0d29ya09ubGluZSgpKXJldHVybiB1ZShlLndhcm4oIlN5c3RlbSBpcyBvZmZsaW5lIGFib3J0aW5nIHdlYi1zb2NrZXQgaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07ZS5hZHZhbmNlZExvZyhiKSx1ZShlLmluZm8oYikpLHEoImluaXRXZWJTb2NrZXQiKTt0cnl7aWYoaWUoTC5jb25uQ29uZmlnKSl7dmFyIHQ9bnVsbDtyZXR1cm4gaihuLnByaW1hcnkpPyh1ZShlLmRlYnVnKCJQcmltYXJ5IFNvY2tldCBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbiIpKSxCKG4uc2Vjb25kYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KHVlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHNlY29uZGFyeSB3ZWItc29ja2V0IGNvbm5lY3Rpb24iKSksUC5udW1BdHRlbXB0cz0wLG4uc2Vjb25kYXJ5PWNlKCkpLHQ9bi5zZWNvbmRhcnkpOihCKG4ucHJpbWFyeSxXZWJTb2NrZXQuQ09OTkVDVElORyl8fCh1ZShlLmRlYnVnKCJFc3RhYmxpc2hpbmcgYSBwcmltYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxuLnByaW1hcnk9Y2UoKSksdD1uLnByaW1hcnkpLHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtqKHQpfHxmdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQrKzt2YXIgdD1OLmFkZEppdHRlcihyLmV4cG9uZW50aWFsQmFja09mZlRpbWUsLjMpO0RhdGUubm93KCkrdDw9TC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU/KGUuYWR2YW5jZWRMb2coZiksdWUoZS5kZWJ1ZyhmK3QrIiBtcyIpKSxyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBhZSgpfSksdCksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lKj0yKTooZS5hZHZhbmNlZExvZyhnKSx1ZShlLndhcm4oZykpLHNlKCkpfSgpfSksMWUzKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMX19fWNhdGNoKHQpe3JldHVybiB1ZShlLmVycm9yKCJFcnJvciBJbml0aWFsaXppbmcgd2ViLXNvY2tldC1tYW5hZ2VyIix0KSkscmUoIkZhaWxlZCB0byBpbml0aWFsaXplIG5ldyBXZWJTb2NrZXQ6ICIrdC5tZXNzYWdlKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH19fSxjZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBXZWJTb2NrZXQoTC5jb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC51cmwpO3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLEopLHQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsWiksdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsUSksdC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKGZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbih0LGkpe2UuYWR2YW5jZWRMb2coZCxKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5pbmZvKGQsSlNPTi5zdHJpbmdpZnkodCkpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGJlZm9yZS1jbGVhbnVwIiksVShrLmNvbm5lY3Rpb25DbG9zZSx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksVihuLnByaW1hcnkpJiYobi5wcmltYXJ5PW51bGwpLFYobi5zZWNvbmRhcnkpJiYobi5zZWNvbmRhcnk9bnVsbCksci5yZWNvbm5lY3RXZWJTb2NrZXQmJihqKG4ucHJpbWFyeSl8fGoobi5zZWNvbmRhcnkpP1Yobi5wcmltYXJ5KSYmaihuLnNlY29uZGFyeSkmJih1ZShlLmluZm8oIltQcmltYXJ5XSBXZWJTb2NrZXQgQ2xlYW5seSBDbG9zZWQiKSksbi5wcmltYXJ5PW4uc2Vjb25kYXJ5LG4uc2Vjb25kYXJ5PW51bGwpOih1ZShlLndhcm4oIk5laXRoZXIgcHJpbWFyeSB3ZWJzb2NrZXQgYW5kIG5vciBzZWNvbmRhcnkgd2Vic29ja2V0IGhhdmUgb3BlbiBjb25uZWN0aW9ucywgYXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbiIpKSxyLmNvbm5TdGF0ZT09PXc/dWUoZS5pbmZvKCJJZ25vcmluZyBjb25uZWN0aW9uTG9zdCBjYWxsYmFjayBpbnZvY2F0aW9uIikpOihVKGsuY29ubmVjdGlvbkxvc3Qse29wZW5UaW1lc3RhbXA6aS5vcGVuVGltZXN0YW1wLGNsb3NlVGltZXN0YW1wOkRhdGUubm93KCksY29ubmVjdGlvbkR1cmF0aW9uOkRhdGUubm93KCktaS5vcGVuVGltZXN0YW1wLGNvZGU6dC5jb2RlLHJlYXNvbjp0LnJlYXNvbn0pLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9RGF0ZS5ub3coKSksci5jb25uU3RhdGU9dyxzZSgpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGFmdGVyLWNsZWFudXAiKSl9KGksdCl9KSksdH0sdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyJiZlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZX07dGhpcy5pbml0PWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksInRyYW5zcG9ydEhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxudWxsPT09ay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQpcmV0dXJuIGsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0PXQsc2UoKTt1ZShlLndhcm4oIldlYiBTb2NrZXQgTWFuYWdlciB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCIpKX0sdGhpcy5vbkluaXRGYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXIgRmFpbGVkISIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuaW5pdEZhaWx1cmUuYWRkKHQpLHIud2Vic29ja2V0SW5pdEZhaWxlZCYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuaW5pdEZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBvcGVuIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uT3Blbi5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uT3Blbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkNsb3NlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25DbG9zZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkdhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGdhaW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25HYWluLmFkZCh0KSxIKCkmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25HYWluLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uTG9zdD1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gbG9zdCIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkxvc3QuYWRkKHQpLHIuY29ublN0YXRlPT09dyYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkxvc3QuZGVsZXRlKHQpfX0sdGhpcy5vblN1YnNjcmlwdGlvblVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShlKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgc3Vic2NyaXB0aW9uIGZhaWx1cmUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnN1YnNjcmlwdGlvbkZhaWx1cmUuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihlLHQpe3JldHVybiBOLmFzc2VydE5vdE51bGwoZSwidG9waWNOYW1lIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay50b3BpYy5oYXMoZSk/ay50b3BpYy5nZXQoZSkuYWRkKHQpOmsudG9waWMuc2V0KGUsbmV3IFNldChbdF0pKSxmdW5jdGlvbigpe3JldHVybiBrLnRvcGljLmdldChlKS5kZWxldGUodCl9fSx0aGlzLm9uQWxsTWVzc2FnZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5hbGxNZXNzYWdlLmFkZChlKSxmdW5jdGlvbigpe3JldHVybiBrLmFsbE1lc3NhZ2UuZGVsZXRlKGUpfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7Ti5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLE4uYXNzZXJ0SXNMaXN0KGUpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpYmVkLmhhcyhlKXx8Ty5wZW5kaW5nLmFkZChlKX0pKSxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCxlZSgpfSx0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0SXNPYmplY3QodCwicGF5bG9hZCIpLHZvaWQgMD09PXQudG9waWN8fHguaGFzKHQudG9waWMpKXVlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgSW52YWxpZCB0b3BpYyIsdCkpO2Vsc2V7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cmV0dXJuIHZvaWQgdWUoZS53YXJuKCJFcnJvciBzdHJpbmdpZnkgbWVzc2FnZSIsdCkpfUgoKT9XKCkuc2VuZCh0KTp1ZShlLndhcm4oIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIHdlYiBzb2NrZXQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiIpKX19LHRoaXMuY2xvc2VXZWJTb2NrZXQ9ZnVuY3Rpb24oKXtYKCksWSgpLHIucmVjb25uZWN0V2ViU29ja2V0PSExLGNsZWFySW50ZXJ2YWwoTSksbmUoIlVzZXIgcmVxdWVzdCB0byBjbG9zZSBXZWJTb2NrZXQiKX0sdGhpcy50ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyPXJlfSxZPXtjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFh9LHNldEdsb2JhbENvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLmxvZ2dlckNvbmZpZztHLnVwZGF0ZUxvZ2dlckNvbmZpZyh0KX0sTG9nTGV2ZWw6QixMb2dnZXI6Rn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG89e25vdF9zdHJpbmc6L1tec10vLG5vdF9ib29sOi9bXnRdLyxub3RfdHlwZTovW15UXS8sbm90X3ByaW1pdGl2ZTovW152XS8sbnVtYmVyOi9bZGllZmddLyxudW1lcmljX2FyZzovW2JjZGllZmd1eFhdLyxqc29uOi9bal0vLG5vdF9qc29uOi9bXmpdLyx0ZXh0Oi9eW15ceDI1XSsvLG1vZHVsbzovXlx4MjV7Mn0vLHBsYWNlaG9sZGVyOi9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXildKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1naWpvc3RUdXZ4WF0pLyxrZXk6L14oW2Etel9dW2Etel9cZF0qKS9pLGtleV9hY2Nlc3M6L15cLihbYS16X11bYS16X1xkXSopL2ksaW5kZXhfYWNjZXNzOi9eXFsoXGQrKVxdLyxzaWduOi9eWystXS99O2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLGEsYyx1LGwscCxkLGg9MSxmPWUubGVuZ3RoLGc9IiI7Zm9yKHI9MDtyPGY7cisrKWlmKCJzdHJpbmciPT10eXBlb2YgZVtyXSlnKz1lW3JdO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlW3JdKXtpZigoYT1lW3JdKS5rZXlzKWZvcihuPXRbaF0scz0wO3M8YS5rZXlzLmxlbmd0aDtzKyspe2lmKG51bGw9PW4pdGhyb3cgbmV3IEVycm9yKGkoJ1tzcHJpbnRmXSBDYW5ub3QgYWNjZXNzIHByb3BlcnR5ICIlcyIgb2YgdW5kZWZpbmVkIHZhbHVlICIlcyInLGEua2V5c1tzXSxhLmtleXNbcy0xXSkpO249blthLmtleXNbc11dfWVsc2Ugbj1hLnBhcmFtX25vP3RbYS5wYXJhbV9ub106dFtoKytdO2lmKG8ubm90X3R5cGUudGVzdChhLnR5cGUpJiZvLm5vdF9wcmltaXRpdmUudGVzdChhLnR5cGUpJiZuIGluc3RhbmNlb2YgRnVuY3Rpb24mJihuPW4oKSksby5udW1lcmljX2FyZy50ZXN0KGEudHlwZSkmJiJudW1iZXIiIT10eXBlb2YgbiYmaXNOYU4obikpdGhyb3cgbmV3IFR5cGVFcnJvcihpKCJbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJVQiLG4pKTtzd2l0Y2goby5udW1iZXIudGVzdChhLnR5cGUpJiYocD1uPj0wKSxhLnR5cGUpe2Nhc2UiYiI6bj1wYXJzZUludChuLDEwKS50b1N0cmluZygyKTticmVhaztjYXNlImMiOm49U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDEwKSk7YnJlYWs7Y2FzZSJkIjpjYXNlImkiOm49cGFyc2VJbnQobiwxMCk7YnJlYWs7Y2FzZSJqIjpuPUpTT04uc3RyaW5naWZ5KG4sbnVsbCxhLndpZHRoP3BhcnNlSW50KGEud2lkdGgpOjApO2JyZWFrO2Nhc2UiZSI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRXhwb25lbnRpYWwoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobikudG9FeHBvbmVudGlhbCgpO2JyZWFrO2Nhc2UiZiI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRml4ZWQoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobik7YnJlYWs7Y2FzZSJnIjpuPWEucHJlY2lzaW9uP1N0cmluZyhOdW1iZXIobi50b1ByZWNpc2lvbihhLnByZWNpc2lvbikpKTpwYXJzZUZsb2F0KG4pO2JyZWFrO2Nhc2UibyI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOm49U3RyaW5nKG4pLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlInQiOm49U3RyaW5nKCEhbiksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UiVCI6bj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ1IjpuPXBhcnNlSW50KG4sMTApPj4+MDticmVhaztjYXNlInYiOm49bi52YWx1ZU9mKCksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UieCI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfW8uanNvbi50ZXN0KGEudHlwZSk/Zys9bjooIW8ubnVtYmVyLnRlc3QoYS50eXBlKXx8cCYmIWEuc2lnbj9kPSIiOihkPXA/IisiOiItIixuPW4udG9TdHJpbmcoKS5yZXBsYWNlKG8uc2lnbiwiIikpLHU9YS5wYWRfY2hhcj8iMCI9PT1hLnBhZF9jaGFyPyIwIjphLnBhZF9jaGFyLmNoYXJBdCgxKToiICIsbD1hLndpZHRoLShkK24pLmxlbmd0aCxjPWEud2lkdGgmJmw+MD91LnJlcGVhdChsKToiIixnKz1hLmFsaWduP2QrbitjOiIwIj09PXU/ZCtjK246YytkK24pfXJldHVybiBnfShmdW5jdGlvbihlKXtpZihhW2VdKXJldHVybiBhW2VdO2Zvcih2YXIgdCxuPWUscj1bXSxpPTA7bjspe2lmKG51bGwhPT0odD1vLnRleHQuZXhlYyhuKSkpci5wdXNoKHRbMF0pO2Vsc2UgaWYobnVsbCE9PSh0PW8ubW9kdWxvLmV4ZWMobikpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PSh0PW8ucGxhY2Vob2xkZXIuZXhlYyhuKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gdW5leHBlY3RlZCBwbGFjZWhvbGRlciIpO2lmKHRbMl0pe2l8PTE7dmFyIHM9W10sYz10WzJdLHU9W107aWYobnVsbD09PSh1PW8ua2V5LmV4ZWMoYykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTtmb3Iocy5wdXNoKHVbMV0pOyIiIT09KGM9Yy5zdWJzdHJpbmcodVswXS5sZW5ndGgpKTspaWYobnVsbCE9PSh1PW8ua2V5X2FjY2Vzcy5leGVjKGMpKSlzLnB1c2godVsxXSk7ZWxzZXtpZihudWxsPT09KHU9by5pbmRleF9hY2Nlc3MuZXhlYyhjKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleSIpO3MucHVzaCh1WzFdKX10WzJdPXN9ZWxzZSBpfD0yO2lmKDM9PT1pKXRocm93IG5ldyBFcnJvcigiW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCIpO3IucHVzaCh7cGxhY2Vob2xkZXI6dFswXSxwYXJhbV9ubzp0WzFdLGtleXM6dFsyXSxzaWduOnRbM10scGFkX2NoYXI6dFs0XSxhbGlnbjp0WzVdLHdpZHRoOnRbNl0scHJlY2lzaW9uOnRbN10sdHlwZTp0WzhdfSl9bj1uLnN1YnN0cmluZyh0WzBdLmxlbmd0aCl9cmV0dXJuIGFbZV09cn0oZSksYXJndW1lbnRzKX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGkuYXBwbHkobnVsbCxbZV0uY29uY2F0KHR8fFtdKSl9dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTt0LnNwcmludGY9aSx0LnZzcHJpbnRmPXMsInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuc3ByaW50Zj1pLHdpbmRvdy52c3ByaW50Zj1zLHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJue3NwcmludGY6aSx2c3ByaW50ZjpzfX0uY2FsbCh0LG4sdCxlKSl8fChlLmV4cG9ydHM9cikpfSgpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxmdW5jdGlvbihlKXtuLmQodCwiV2ViU29ja2V0TWFuYWdlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9bigwKTtlLmNvbm5lY3Q9ZS5jb25uZWN0fHx7fSxjb25uZWN0LldlYlNvY2tldE1hbmFnZXI9ci5hO3ZhciBvPXIuYX0uY2FsbCh0aGlzLG4oMykpfSxmdW5jdGlvbihlLHQpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX1lLmV4cG9ydHM9bn1dKX0sMTUxOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49e1RFU1Q6IlRFU1QiLFRSQUNFOiJUUkFDRSIsREVCVUc6IkRFQlVHIixJTkZPOiJJTkZPIixMT0c6IkxPRyIsV0FSTjoiV0FSTiIsRVJST1I6IkVSUk9SIixDUklUSUNBTDoiQ1JJVElDQUwifSxyPXtDQ1A6ImNjcCIsU09GVFBIT05FOiJzb2Z0cGhvbmUiLENIQVQ6ImNoYXQiLFRBU0s6InRhc2sifSxvPXtURVNUOjAsVFJBQ0U6MTAsREVCVUc6MjAsSU5GTzozMCxMT0c6NDAsV0FSTjo1MCxFUlJPUjoxMDAsQ1JJVElDQUw6MjAwfSxpPSJDQ1AiLHM9IlNoYXJlZFdvcmtlciIsYT0iQ1JNIixjPXtUUkFDRTpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LERFQlVHOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sSU5GTzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LExPRzpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sVEVTVDpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sV0FSTjpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oZSl9LEVSUk9SOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9LENSSVRJQ0FMOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9fSx1PWZ1bmN0aW9uKGUpe3ZhciB0LG4sbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDApLGk9by5zaGlmdCgpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4tMSE9PU9iamVjdC52YWx1ZXMocikuaW5kZXhPZihlKX0oaSk/KG49aSx0PW8uc2hpZnQoKSk6KHQ9aSxuPXIuQ0NQKSx7Zm9ybWF0OnQsY29tcG9uZW50Om4sYXJnczpvfX0sbD1mdW5jdGlvbihlLG4scixvLGMsdSl7dGhpcy5jb21wb25lbnQ9ZSx0aGlzLmxldmVsPW4sdGhpcy50ZXh0PXIsdGhpcy50aW1lPW5ldyBEYXRlLHRoaXMudGFiSWQ9bnVsbD09PWM/bnVsbDpjfHx0LmNvcmUudGFiSWQsdGhpcy5leGNlcHRpb249bnVsbCx0aGlzLm9iamVjdHM9W10sdGhpcy5saW5lPTAsdGhpcy5hZ2VudFJlc291cmNlSWQ9bnVsbDt0cnl7dC5hZ2VudC5pbml0aWFsaXplZCYmKHRoaXMuYWdlbnRSZXNvdXJjZUlkPShuZXcgdC5BZ2VudCkuX2dldFJlc291cmNlSWQoKSl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIklzc3VlIGZpbmRpbmcgYWdlbnRSZXNvdXJjZUlkOiAiLGUpfXRoaXMubG9nZ2VySWQ9byx1P3RoaXMuY29udGV4dExheWVyPXU6dC5pc1NoYXJlZFdvcmtlcigpP3RoaXMuY29udGV4dExheWVyPXM6dC5pc0NSTSgpP3RoaXMuY29udGV4dExheWVyPWE6dC5pc0NDUCgpJiYodGhpcy5jb250ZXh0TGF5ZXI9aSl9O2wuZnJvbU9iamVjdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhYklkfHxudWxsLG49ZS5jb250ZXh0TGF5ZXJ8fG51bGwsbz1uZXcgbChyLkNDUCxlLmxldmVsLGUudGV4dCxlLmxvZ2dlcklkLHQsbik7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudGltZSk/by50aW1lPW5ldyBEYXRlKGUudGltZS5nZXRUaW1lKCkpOiJudW1iZXIiPT10eXBlb2YgZS50aW1lP28udGltZT1uZXcgRGF0ZShlLnRpbWUpOiJzdHJpbmciPT10eXBlb2YgZS50aW1lP28udGltZT1EYXRlLnBhcnNlKGUudGltZSk6by50aW1lPW5ldyBEYXRlLG8uZXhjZXB0aW9uPWUuZXhjZXB0aW9uLG8ub2JqZWN0cz1lLm9iamVjdHMsb307dmFyIHA9ZnVuY3Rpb24oZSl7dmFyIHQ9L0F1dGhUb2tlbi4qXD0vZztlJiYib2JqZWN0Ij09dHlwZW9mIGUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4peyJvYmplY3QiPT10eXBlb2YgZVtuXT9wKGVbbl0pOiJzdHJpbmciPT10eXBlb2YgZVtuXSYmKCJ1cmwiPT09bnx8InRleHQiPT09bj9lW25dPWVbbl0ucmVwbGFjZSh0LCJbcmVkYWN0ZWRdIik6WyJxdWlja0Nvbm5lY3ROYW1lIl0uaW5jbHVkZXMobik/ZVtuXT0iW3JlZGFjdGVkXSI6WyJjdXN0b21lcklkIiwiQ3VzdG9tZXJJZCIsIlNwZWFrZXJJZCIsIkN1c3RvbWVyU3BlYWtlcklkIl0uaW5jbHVkZXMobikmJihlW25dPWBbb2JmdXNjYXRlZCB2YWx1ZV0gJHttZDUoZVtuXSl9YCkpfSkpfSxkPWZ1bmN0aW9uKGUpe2lmKHRoaXMudHlwZT1lIGluc3RhbmNlb2YgRXJyb3I/ZS5uYW1lOmUuY29kZXx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLHRoaXMubWVzc2FnZT1lLm1lc3NhZ2UsdGhpcy5zdGFjaz1bXSxlLnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KGUuc3RhY2spP3RoaXMuc3RhY2s9ZS5zdGFjazoib2JqZWN0Ij09dHlwZW9mIGUuc3RhY2s/dGhpcy5zdGFjaz1bSlNPTi5zdHJpbmdpZnkoZS5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgZS5zdGFjayYmKHRoaXMuc3RhY2s9ZS5zdGFjay5zcGxpdCgiXG4iKSl9Y2F0Y2h7fX07bC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCJbJXNdIFslc10gWyVzXTogJXMiLHRoaXMuZ2V0VGltZSgpJiZ0aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZz90aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZygpOiI/Pz8iLHRoaXMuZ2V0TGV2ZWwoKSx0aGlzLmdldEFnZW50UmVzb3VyY2VJZCgpLHRoaXMuZ2V0VGV4dCgpKX0sbC5wcm90b3R5cGUuZ2V0VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWV9LGwucHJvdG90eXBlLmdldEFnZW50UmVzb3VyY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50UmVzb3VyY2VJZH0sbC5wcm90b3R5cGUuZ2V0VGFiSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJJZH0sbC5wcm90b3R5cGUuZ2V0Q29udGV4dExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dExheWVyfSxsLnByb3RvdHlwZS5nZXRMZXZlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxldmVsfSxsLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dH0sbC5wcm90b3R5cGUuZ2V0Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50fSxsLnByb3RvdHlwZS53aXRoRXhjZXB0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV4Y2VwdGlvbj1uZXcgZChlKSx0aGlzfSxsLnByb3RvdHlwZS53aXRoT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGVlcGNvcHkoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUud2l0aENyb3NzT3JpZ2luRXZlbnRPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRMb2coKS5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaCh0aGlzKSx0aGlzfTt2YXIgaD1mdW5jdGlvbigpe3RoaXMuX2xvZ3M9W10sdGhpcy5fcm9sbGVkTG9ncz1bXSx0aGlzLl9sb2dzVG9QdXNoPVtdLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdLHRoaXMuX2VjaG9MZXZlbD1vLklORk8sdGhpcy5fbG9nTGV2ZWw9by5JTkZPLHRoaXMuX2xpbmVDb3VudD0wLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD0wLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsLHRoaXMuX2xvZ2dlcklkPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyItIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx0aGlzLnNldExvZ1JvbGxJbnRlcnZhbCgxOGU1KSx0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPTB9O2gucHJvdG90eXBlLnNldExvZ1JvbGxJbnRlcnZhbD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO3RoaXMuX2xvZ1JvbGxUaW1lciYmdD09PXRoaXMuX2xvZ1JvbGxJbnRlcnZhbD90aGlzLndhcm4oIkxvZ2dlciBpcyBhbHJlYWR5IHNldCB0byB0aGUgZ2l2ZW4gaW50ZXJ2YWw6ICVkIix0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpOih0aGlzLl9sb2dSb2xsVGltZXImJmUuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD10LHRoaXMuX2xvZ1JvbGxUaW1lcj1lLnNldEludGVydmFsKChmdW5jdGlvbigpe24uX3JvbGxlZExvZ3M9bi5fbG9ncyxuLl9sb2dzPVtdLG4uX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MCxuLmluZm8oIkxvZyByb2xsIGludGVydmFsIG9jY3VycmVkLiIpfSksdGhpcy5fbG9nUm9sbEludGVydmFsKSl9LGgucHJvdG90eXBlLnNldExvZ0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9sb2dMZXZlbD1vW2VdfSxoLnByb3RvdHlwZS5zZXRFY2hvTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIG8pKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2VjaG9MZXZlbD1vW2VdfSxoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGwoZSx0LG4sdGhpcy5nZXRMb2dnZXJJZCgpKTtyZXR1cm4gcChyKSx0aGlzLmFkZExvZ0VudHJ5KHIpLHJ9LGgucHJvdG90eXBlLmFkZExvZ0VudHJ5PWZ1bmN0aW9uKGUpe3AoZSksdGhpcy5fbG9ncy5wdXNoKGUpLHIuU09GVFBIT05FPT09ZS5jb21wb25lbnQmJnRoaXMuX2xvZ3NUb1B1c2gucHVzaChlKSxlLmxldmVsIGluIG8mJm9bZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYob1tlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZjW2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyPWZ1bmN0aW9uKGUpe3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2goZSksZS5sZXZlbCBpbiBvJiZvW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKG9bZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmY1tlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuY2xlYXJPYmplY3RzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5vYmplY3RzJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5vYmplY3RzfSxoLnByb3RvdHlwZS5jbGVhckV4Y2VwdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbiYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9ufSxoLnByb3RvdHlwZS50cmFjZT1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLlRSQUNFLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uREVCVUcsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLklORk8sdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uTE9HLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5URVNULHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5XQVJOLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uRVJST1IsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuY3JpdGljYWw9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5FUlJPUix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLl9sb2dzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMuX2xvZ3NbdF0udG9TdHJpbmcoKSk7cmV0dXJuIGUuam9pbigiXG4iKX0saC5wcm90b3R5cGUuZG93bmxvYWQ9ZnVuY3Rpb24odCl7dmFyIG49ImFnZW50LWxvZyIscj0hMTsib2JqZWN0Ij09dHlwZW9mIHQ/KG49dC5sb2dOYW1lfHxuLHI9dC5maWx0ZXJCeUxvZ0xldmVsfHxyKToic3RyaW5nIj09dHlwZW9mIHQmJihuPXR8fG4pO3ZhciBpPXRoaXMscz10aGlzLl9yb2xsZWRMb2dzLmNvbmNhdCh0aGlzLl9sb2dzKTtyJiYocz1zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIG9bZS5sZXZlbF0+PWkuX2xvZ0xldmVsfSkpKTt2YXIgYT1uZXcgZS5CbG9iKFtKU09OLnN0cmluZ2lmeShzLHZvaWQgMCw0KV0sWyJ0ZXh0L3BsYWluIl0pLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO249bnx8ImFnZW50LWxvZyIsYy5ocmVmPWUuVVJMLmNyZWF0ZU9iamVjdFVSTChhKSxjLmRvd25sb2FkPW4rIi50eHQiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyksYy5jbGljaygpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoPWZ1bmN0aW9uKG4pe3QudXBzdHJlYW1Mb2dQdXNoU2NoZWR1bGVkfHwodC51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWQ9ITAsZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5yZXBvcnRNYXN0ZXJMb2dzVXBTdHJlYW0sbiksNWUzKSl9LGgucHJvdG90eXBlLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9sb2dzVG9QdXNoLnNsaWNlKCk7dGhpcy5fbG9nc1RvUHVzaD1bXSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUywoZnVuY3Rpb24oKXtuLmxlbmd0aD4wJiZlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1Msbil9KSl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoPWZ1bmN0aW9uKG4pe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtLG4pLDFlMyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaD1mdW5jdGlvbihuKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hPdXRlckNvbnRleHRDQ1BMb2dzVXBzdHJlYW0sbiksMWUzKX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aD4wKXtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0udGV4dD10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXS50ZXh0O2Uuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MpLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbT1mdW5jdGlvbihlKXtmb3IodmFyIG49dGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaDtuPHRoaXMuX2xvZ3MubGVuZ3RoO24rKyl0aGlzLl9sb2dzW25dLmxvZ2dlcklkPT09dGhpcy5fbG9nZ2VySWQmJmUuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyx0aGlzLl9sb2dzW25dKTt0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPXRoaXMuX2xvZ3MubGVuZ3RofSxoLnByb3RvdHlwZS5nZXRMb2dnZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2dnZXJJZH0saC5wcm90b3R5cGUuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoPWZ1bmN0aW9uKCl7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtKSw1ZTMpfSxoLnByb3RvdHlwZS5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9W107dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPDUwfHwodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjUwMD9lPXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnNwbGljZSgwLDUwMCk6KGU9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MsdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W10pLHQucHVibGlzaENsaWVudFNpZGVMb2dzKGUpKX07dmFyIGY9ZnVuY3Rpb24obil7aC5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1uLGUuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMuX3B1c2hMb2dzRG93bnN0cmVhbSksZi5MT0dfUFVTSF9JTlRFUlZBTCksZS5jbGVhckludGVydmFsKHRoaXMuX2xvZ1JvbGxUaW1lciksdGhpcy5fbG9nUm9sbFRpbWVyPW51bGx9O2YuTE9HX1BVU0hfSU5URVJWQUw9MWUzLGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpLGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWYsZi5wcm90b3R5cGUucHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLGUpfSkpfSxmLnByb3RvdHlwZS5fcHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9sb2dzLmZvckVhY2goKGZ1bmN0aW9uKG4pe2UuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csbil9KSksdGhpcy5fbG9ncz1bXTtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0pO3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfTt2YXIgZz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKGUpe2MuRVJST1IoZSl9fX07dC5yb290TG9nZ2VyPW5ldyBoLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKSJmdW5jdGlvbiI9PXR5cGVvZiBlW3RdJiYoZVt0XT1nKGVbdF0pKX0odC5yb290TG9nZ2VyKSwodD10fHx7fSkuZ2V0TG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHQucm9vdExvZ2dlcn0sdC5Mb2dFbnRyeT1sLHQuTG9nZ2VyPWgsdC5Mb2dMZXZlbD1uLHQuTG9nQ29tcG9uZW50PXIsdC5Eb3duc3RyZWFtQ29uZHVpdExvZ2dlcj1mfSgpfSwxNjM6ZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3ZhciBuPSg2NTUzNSZlKSsoNjU1MzUmdCk7cmV0dXJuKGU+PjE2KSsodD4+MTYpKyhuPj4xNik8PDE2fDY1NTM1Jm59ZnVuY3Rpb24gbihlLG4scixvLGkscyl7cmV0dXJuIHQoKGE9dCh0KG4sZSksdChvLHMpKSk8PChjPWkpfGE+Pj4zMi1jLHIpO3ZhciBhLGN9ZnVuY3Rpb24gcihlLHQscixvLGkscyxhKXtyZXR1cm4gbih0JnJ8fnQmbyxlLHQsaSxzLGEpfWZ1bmN0aW9uIG8oZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odCZvfHImfm8sZSx0LGkscyxhKX1mdW5jdGlvbiBpKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHRecl5vLGUsdCxpLHMsYSl9ZnVuY3Rpb24gcyhlLHQscixvLGkscyxhKXtyZXR1cm4gbihyXih0fH5vKSxlLHQsaSxzLGEpfWZ1bmN0aW9uIGEoZSxuKXt2YXIgYSxjLHUsbCxwO2Vbbj4+NV18PTEyODw8biUzMixlWzE0KyhuKzY0Pj4+OTw8NCldPW47dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3IoYT0wO2E8ZS5sZW5ndGg7YSs9MTYpYz1kLHU9aCxsPWYscD1nLGQ9cihkLGgsZixnLGVbYV0sNywtNjgwODc2OTM2KSxnPXIoZyxkLGgsZixlW2ErMV0sMTIsLTM4OTU2NDU4NiksZj1yKGYsZyxkLGgsZVthKzJdLDE3LDYwNjEwNTgxOSksaD1yKGgsZixnLGQsZVthKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPXIoZCxoLGYsZyxlW2ErNF0sNywtMTc2NDE4ODk3KSxnPXIoZyxkLGgsZixlW2ErNV0sMTIsMTIwMDA4MDQyNiksZj1yKGYsZyxkLGgsZVthKzZdLDE3LC0xNDczMjMxMzQxKSxoPXIoaCxmLGcsZCxlW2ErN10sMjIsLTQ1NzA1OTgzKSxkPXIoZCxoLGYsZyxlW2ErOF0sNywxNzcwMDM1NDE2KSxnPXIoZyxkLGgsZixlW2ErOV0sMTIsLTE5NTg0MTQ0MTcpLGY9cihmLGcsZCxoLGVbYSsxMF0sMTcsLTQyMDYzKSxoPXIoaCxmLGcsZCxlW2ErMTFdLDIyLC0xOTkwNDA0MTYyKSxkPXIoZCxoLGYsZyxlW2ErMTJdLDcsMTgwNDYwMzY4MiksZz1yKGcsZCxoLGYsZVthKzEzXSwxMiwtNDAzNDExMDEpLGY9cihmLGcsZCxoLGVbYSsxNF0sMTcsLTE1MDIwMDIyOTApLGQ9byhkLGg9cihoLGYsZyxkLGVbYSsxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbYSsxXSw1LC0xNjU3OTY1MTApLGc9byhnLGQsaCxmLGVbYSs2XSw5LC0xMDY5NTAxNjMyKSxmPW8oZixnLGQsaCxlW2ErMTFdLDE0LDY0MzcxNzcxMyksaD1vKGgsZixnLGQsZVthXSwyMCwtMzczODk3MzAyKSxkPW8oZCxoLGYsZyxlW2ErNV0sNSwtNzAxNTU4NjkxKSxnPW8oZyxkLGgsZixlW2ErMTBdLDksMzgwMTYwODMpLGY9byhmLGcsZCxoLGVbYSsxNV0sMTQsLTY2MDQ3ODMzNSksaD1vKGgsZixnLGQsZVthKzRdLDIwLC00MDU1Mzc4NDgpLGQ9byhkLGgsZixnLGVbYSs5XSw1LDU2ODQ0NjQzOCksZz1vKGcsZCxoLGYsZVthKzE0XSw5LC0xMDE5ODAzNjkwKSxmPW8oZixnLGQsaCxlW2ErM10sMTQsLTE4NzM2Mzk2MSksaD1vKGgsZixnLGQsZVthKzhdLDIwLDExNjM1MzE1MDEpLGQ9byhkLGgsZixnLGVbYSsxM10sNSwtMTQ0NDY4MTQ2NyksZz1vKGcsZCxoLGYsZVthKzJdLDksLTUxNDAzNzg0KSxmPW8oZixnLGQsaCxlW2ErN10sMTQsMTczNTMyODQ3MyksZD1pKGQsaD1vKGgsZixnLGQsZVthKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbYSs1XSw0LC0zNzg1NTgpLGc9aShnLGQsaCxmLGVbYSs4XSwxMSwtMjAyMjU3NDQ2MyksZj1pKGYsZyxkLGgsZVthKzExXSwxNiwxODM5MDMwNTYyKSxoPWkoaCxmLGcsZCxlW2ErMTRdLDIzLC0zNTMwOTU1NiksZD1pKGQsaCxmLGcsZVthKzFdLDQsLTE1MzA5OTIwNjApLGc9aShnLGQsaCxmLGVbYSs0XSwxMSwxMjcyODkzMzUzKSxmPWkoZixnLGQsaCxlW2ErN10sMTYsLTE1NTQ5NzYzMiksaD1pKGgsZixnLGQsZVthKzEwXSwyMywtMTA5NDczMDY0MCksZD1pKGQsaCxmLGcsZVthKzEzXSw0LDY4MTI3OTE3NCksZz1pKGcsZCxoLGYsZVthXSwxMSwtMzU4NTM3MjIyKSxmPWkoZixnLGQsaCxlW2ErM10sMTYsLTcyMjUyMTk3OSksaD1pKGgsZixnLGQsZVthKzZdLDIzLDc2MDI5MTg5KSxkPWkoZCxoLGYsZyxlW2ErOV0sNCwtNjQwMzY0NDg3KSxnPWkoZyxkLGgsZixlW2ErMTJdLDExLC00MjE4MTU4MzUpLGY9aShmLGcsZCxoLGVbYSsxNV0sMTYsNTMwNzQyNTIwKSxkPXMoZCxoPWkoaCxmLGcsZCxlW2ErMl0sMjMsLTk5NTMzODY1MSksZixnLGVbYV0sNiwtMTk4NjMwODQ0KSxnPXMoZyxkLGgsZixlW2ErN10sMTAsMTEyNjg5MTQxNSksZj1zKGYsZyxkLGgsZVthKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1zKGgsZixnLGQsZVthKzVdLDIxLC01NzQzNDA1NSksZD1zKGQsaCxmLGcsZVthKzEyXSw2LDE3MDA0ODU1NzEpLGc9cyhnLGQsaCxmLGVbYSszXSwxMCwtMTg5NDk4NjYwNiksZj1zKGYsZyxkLGgsZVthKzEwXSwxNSwtMTA1MTUyMyksaD1zKGgsZixnLGQsZVthKzFdLDIxLC0yMDU0OTIyNzk5KSxkPXMoZCxoLGYsZyxlW2ErOF0sNiwxODczMzEzMzU5KSxnPXMoZyxkLGgsZixlW2ErMTVdLDEwLC0zMDYxMTc0NCksZj1zKGYsZyxkLGgsZVthKzZdLDE1LC0xNTYwMTk4MzgwKSxoPXMoaCxmLGcsZCxlW2ErMTNdLDIxLDEzMDkxNTE2NDkpLGQ9cyhkLGgsZixnLGVbYSs0XSw2LC0xNDU1MjMwNzApLGc9cyhnLGQsaCxmLGVbYSsxMV0sMTAsLTExMjAyMTAzNzkpLGY9cyhmLGcsZCxoLGVbYSsyXSwxNSw3MTg3ODcyNTkpLGg9cyhoLGYsZyxkLGVbYSs5XSwyMSwtMzQzNDg1NTUxKSxkPXQoZCxjKSxoPXQoaCx1KSxmPXQoZixsKSxnPXQoZyxwKTtyZXR1cm5bZCxoLGYsZ119ZnVuY3Rpb24gYyhlKXt2YXIgdCxuPSIiLHI9MzIqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbdD4+NV0+Pj50JTMyJjI1NSk7cmV0dXJuIG59ZnVuY3Rpb24gdShlKXt2YXIgdCxuPVtdO2ZvcihuWyhlLmxlbmd0aD4+MiktMV09dm9pZCAwLHQ9MDt0PG4ubGVuZ3RoO3QrPTEpblt0XT0wO3ZhciByPTgqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluW3Q+PjVdfD0oMjU1JmUuY2hhckNvZGVBdCh0LzgpKTw8dCUzMjtyZXR1cm4gbn1mdW5jdGlvbiBsKGUpe3ZhciB0LG4scj0iMDEyMzQ1Njc4OWFiY2RlZiIsbz0iIjtmb3Iobj0wO248ZS5sZW5ndGg7bis9MSl0PWUuY2hhckNvZGVBdChuKSxvKz1yLmNoYXJBdCh0Pj4+NCYxNSkrci5jaGFyQXQoMTUmdCk7cmV0dXJuIG99ZnVuY3Rpb24gcChlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX1mdW5jdGlvbiBkKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYyhhKHUoZSksOCplLmxlbmd0aCkpfShwKGUpKX1mdW5jdGlvbiBoKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPXUoZSksaT1bXSxzPVtdO2ZvcihpWzE1XT1zWzE1XT12b2lkIDAsby5sZW5ndGg+MTYmJihvPWEobyw4KmUubGVuZ3RoKSksbj0wO248MTY7bis9MSlpW25dPTkwOTUyMjQ4Nl5vW25dLHNbbl09MTU0OTU1NjgyOF5vW25dO3JldHVybiByPWEoaS5jb25jYXQodSh0KSksNTEyKzgqdC5sZW5ndGgpLGMoYShzLmNvbmNhdChyKSw2NDApKX0ocChlKSxwKHQpKX0odGhpc3x8Z2xvYmFsVGhpcykubWQ1PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD9uP2godCxlKTpsKGgodCxlKSk6bj9kKGUpOmwoZChlKSl9fSgpfSw0Mzk6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LkNoYXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmdldExvZygpLG89dC5Mb2dDb21wb25lbnQuQ0hBVCxpPWZ1bmN0aW9uKG4scil7dC5wdWJsaXNoTWV0cmljKHtuYW1lOm4sY29udGFjdElkOmUuY29udGFjdElkLGRhdGE6cnx8ZX0pfSxzPWZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW9uQnJva2VuKChmdW5jdGlvbihlKXtyLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iLGUpfSkpLGUub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKGZ1bmN0aW9uKGUpe3IuaW5mbyhvLCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtpKCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLHIuaW5mbyhvLCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LkNoYXRTZXNzaW9uLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6cn0scmVnaW9uOm4ucmVnaW9ufSk7dmFyIGE9dC5DaGF0U2Vzc2lvbi5jcmVhdGUoe2NoYXREZXRhaWxzOmUsdHlwZToiQUdFTlQiLHdlYnNvY2tldE1hbmFnZXI6dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKX0pO3JldHVybiBzKGEpLGEuY29ubmVjdCgpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZm8obywiQ2hhdCBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIixlLmNvbnRhY3RJZCksYX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgci5lcnJvcihvLCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIGZvciBjb250YWN0ICVzIixlLmNvbnRhY3RJZCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQiLGUuY29udGFjdElkLHQpLHR9KSl9KCl9fX19KCl9LDI3OTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuTWVkaWFGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9bmV3IFNldCxvPXQuZ2V0TG9nKCksaT10LkxvZ0NvbXBvbmVudC5DSEFULHM9dC5tZXJnZSh7fSxlKXx8e307cy5yZWdpb249cy5yZWdpb258fCJ1cy13ZXN0LTIiO3ZhciBhPWZ1bmN0aW9uKGUpe25bZV0mJiFyLmhhcyhlKSYmKG8uaW5mbyhpLCJEZXN0cm95aW5nIG1lZGlhQ29udHJvbGxlciBmb3IgJXMiLGUpLHIuYWRkKGUpLG5bZV0udGhlbigoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQuY2xlYW5VcCYmdC5jbGVhblVwKCksZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7ZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfShlKT9mdW5jdGlvbihlKXt2YXIgcj1lLmdldENvbm5lY3Rpb25JZCgpO2lmKCFlLmdldE1lZGlhSW5mbygpKXJldHVybiBvLmVycm9yKGksIk1lZGlhIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIGEgbWVkaWEgdHlwZSAlcyIsZS5nZXRNZWRpYVR5cGUoKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFByb21pc2UucmVqZWN0KCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvbm5lY3Rpb24iKTtpZihuW3JdKXJldHVybiBuW3JdO3N3aXRjaChvLmluZm8oaSwibWVkaWEgY29udHJvbGxlciBvZiB0eXBlICVzIGluaXQiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLmdldE1lZGlhVHlwZSgpKXtjYXNlIHQuTWVkaWFUeXBlLkNIQVQ6cmV0dXJuIG5bcl09bmV3IHQuQ2hhdE1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpLHMpLmdldCgpO2Nhc2UgdC5NZWRpYVR5cGUuU09GVFBIT05FOnJldHVybiBuW3JdPW5ldyB0LlNvZnRwaG9uZU1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlRBU0s6cmV0dXJuIG5bcl09bmV3IHQuVGFza01lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtkZWZhdWx0OnJldHVybiBvLmVycm9yKGksIlVucmVjb2duaXplZCBtZWRpYSB0eXBlICVzICIsZS5nZXRNZWRpYVR5cGUoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgpfX0oZSk6KGEoZS5nZXRDb25uZWN0aW9uSWQoKSksUHJvbWlzZS5yZWplY3QoIk1lZGlhIENvbnRyb2xsZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgdGhpcyBjb25uZWN0aW9uIikpfSxkZXN0cm95OmF9fX0oKX0sNDE4OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5Tb2Z0cGhvbmVNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9fX19KCl9LDE4NzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuVGFza01lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlKXt2YXIgbj10LmdldExvZygpLHI9dC5Mb2dDb21wb25lbnQuVEFTSyxvPWZ1bmN0aW9uKG4scil7dC5wdWJsaXNoTWV0cmljKHtuYW1lOm4sY29udGFjdElkOmUuY29udGFjdElkLGRhdGE6cnx8ZX0pfSxpPWZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW9uQnJva2VuKChmdW5jdGlvbihlKXtuLmVycm9yKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIpLndpdGhFeGNlcHRpb24oZSksbygiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIixlKX0pKSxlLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKChmdW5jdGlvbihlKXtuLmluZm8ociwiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKS53aXRoT2JqZWN0KGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIixlKX0pKX07cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe28oIlRhc2sgbWVkaWEgY29udHJvbGxlciBpbml0IixlLmNvbnRhY3RJZCksbi5pbmZvKHIsIlRhc2sgbWVkaWEgY29udHJvbGxlciBpbml0Iikud2l0aE9iamVjdChlKTt2YXIgcz10LlRhc2tTZXNzaW9uLmNyZWF0ZSh7Y29udGFjdElkOmUuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkLHdlYnNvY2tldE1hbmFnZXI6dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKX0pO3JldHVybiBpKHMpLHMuY29ubmVjdCgpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIG4uaW5mbyhyLCJUYXNrIFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGZvciBjb250YWN0SWQgJXMiLGUuY29udGFjdElkKSxvKCJUYXNrIFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIixlLmNvbnRhY3RJZCksc30pKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgbi5lcnJvcihyLCJUYXNrIFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIGZvciBjb250YWN0ICVzIixlLmNvbnRhY3RJZCkud2l0aEV4Y2VwdGlvbih0KSxvKCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIixlLmNvbnRhY3RJZCx0KSx0fSkpfSgpfX19fSgpfSwxNjE6KCk9PnshZnVuY3Rpb24oKXtjb25zdCBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O2NvbnN0IG49Ii9yZXF1ZXN0LXN0b3JhZ2UtYWNjZXNzIixyPXtjYW5SZXF1ZXN0OiEwLG1vZGU6ImRlZmF1bHQiLGN1c3RvbTp7aGlkZUNDUDohMH19O2xldCBvLGk9e30scz0iIixhPW51bGwsYz0hMTtjb25zdCB1PXtJTklUOiJzdG9yYWdlQWNjZXNzOjppbml0IixHUkFOVEVEOiJzdG9yYWdlQWNjZXNzOjpncmFudGVkIixERU5JRUQ6InN0b3JhZ2VBY2Nlc3M6OmRlbmllZCIsUkVRVUVTVDoic3RvcmFnZUFjY2Vzczo6cmVxdWVzdCJ9LGw9KCk9Pih7c2hvdzooKT0+e2Euc3R5bGUuZGlzcGxheT0iYmxvY2sifSxoaWRlOigpPT57YS5zdHlsZS5kaXNwbGF5PSJub25lIn19KSxwPSgpPT5pJiYiY3VzdG9tIj09PWkubW9kZSxkPWU9PmUubWF0Y2goLy5jb25uZWN0LmF3cy5hMnouY29tfC5teS5jb25uZWN0LmF3c3wuZ292Y2xvdWQuY29ubmVjdC5hd3N8LmF3c2FwcHMuY29tLyksaD1lPT57Y29uc3R7b3JpZ2luOnQscGF0aG5hbWU6cn09bmV3IFVSTChlKTtpZih0Lm1hdGNoKC8uYXdzYXBwcy5jb20vKSl7bGV0IGU9ImNvbm5lY3QiO3JldHVybiByLnN0YXJ0c1dpdGgoIi9jb25uZWN0LWdhbW1hIikmJihlPSJjb25uZWN0LWdhbW1hIiksYCR7dH0vJHtlfSR7bn1gfXJldHVybmAke3R9JHtufWB9LGY9ZT0+ZS5tYXRjaCgvXmh0dHBzPzpcL1wvbG9jYWxob3N0LyksZz0oKT0+e2lmKCFzKXRocm93IG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRsYW5kQXRQYXRoXSBJbnZva2UgY29ubmVjdC5zdG9yYWdlQWNjZXNzLmluaXQgZmlyc3QiKTtpZihkKHMpfHxmKHMpKXtjb25zdHtwYXRobmFtZTplfT1uZXcgVVJMKHMpO3JldHVybiBlfXJldHVybiIvY29ubmVjdC9jY3AtdjIifSxtPSh7b25Jbml0OmUsb25EZW55Om4sb25HcmFudDpyfSk9PntmdW5jdGlvbiBvKHtkYXRhOmksc291cmNlOnN9KXtpZih0LmNvcmUuX2dldENDUElmcmFtZSgpLmNvbnRlbnRXaW5kb3chPT1zKXJldHVybiExO3N3aXRjaCh0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKSxpLmV2ZW50KXtjYXNlIHUuSU5JVDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtJTklUXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxlJiZlKGkpO2JyZWFrO2Nhc2UgdS5HUkFOVEVEOnQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW0dSQU5URURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGkpLHImJnIoaSk7YnJlYWs7Y2FzZSB1LkRFTklFRDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtERU5JRURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGkpLG4mJm4oaSk7YnJlYWs7ZGVmYXVsdDp0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKX19cmV0dXJuIGkuY2FuUmVxdWVzdCYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLHt1bnN1YnNjcmliZTooKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKX19fTt0LnN0b3JhZ2VBY2Nlc3M9T2JqZWN0LmZyZWV6ZSh7Y2FuUmVxdWVzdDooKT0+aS5jYW5SZXF1ZXN0LG9wdE91dEZyb21SZXF1ZXN0QWNjZXNzOigpPT57ci5jYW5SZXF1ZXN0PSExfSxvcHRJbkZvclJlcXVlc3RBY2Nlc3M6KCk9PntyLmNhblJlcXVlc3Q9ITB9LGluaXQ6KGUsbixvPXt9KT0+e3QuYXNzZXJ0Tm90TnVsbChlLCJjY3BVcmwiKSx0LmFzc2VydE5vdE51bGwobiwiY29udGFpbmVyIiksYT1uLHM9ZSwoKGU9e30pPT57ZS5jdXN0b209ZS5jdXN0b218fHt9LGk9ey4uLnIsLi4uZSxjdXN0b206ey4uLnIuY3VzdG9tLC4uLmUuY3VzdG9tfX0saS5jYW5SZXF1ZXN0PSEoImZhbHNlIj09PWkuY2FuUmVxdWVzdHx8ITE9PT1pLmNhblJlcXVlc3QpfSkobyksdC5nZXRMb2coKS5pbmZvKGBbU3RvcmFnZUFjY2Vzc11baW5pdF0gUmVxdWVzdCBTdG9yYWdlIEFjY2Nlc3MgaW5pdCBjYWxsZWQgd2l0aCBjY3BVcmwgLSAke2V9IC0gJHtpLmNhblJlcXVlc3Q/IlByb2NlZWRpbmcgd2l0aCByZXF1ZXN0aW5nIHN0b3JhZ2UgYWNjZXNzIjoidXNlciBoYXMgb3B0ZWQgb3V0LCBza2lwcGluZyByZXF1ZXN0IHN0b3JhZ2UgYWNjZXNzIn1gKS53aXRoT2JqZWN0KGkpfSxzZXR1cFJlcXVlc3RIYW5kbGVyczooe29uR3JhbnQ6ZX0pPT57byYmby51bnN1YnNjcmliZSgpLG89bSh7b25Jbml0OmU9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bSU5JVF0iLCJiYWNrZ3JvdW5kOnllbGxvdzsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uSW5pdF0gY2FsbGJhY2sgZXhlY3V0ZWQiKS53aXRoT2JqZWN0KGU/LmRhdGEpLCFlPy5kYXRhLmhhc0FjY2VzcyYmcCgpJiZsKCkuc2hvdygpfSxvbkRlbnk6KCk9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bREVOSUVEXSIsImJhY2tncm91bmQ6cmVkOyBjb2xvcjpibGFjazsgZm9udC1zaXplOmxhcmdlIiksdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bb25EZW55XSBjYWxsYmFjayBleGVjdXRlZCIpLHAoKSYmbCgpLnNob3coKX0sb25HcmFudDooKT0+e2NvbnNvbGUubG9nKCIlY1tTdG9yYWdlQWNjZXNzXVtHUkFOVEVEXSIsImJhY2tncm91bmQ6bGltZTsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uR3JhbnRdIGNhbGxiYWNrIGV4ZWN1dGVkIikscCgpJiZpPy5jdXN0b20/LmhpZGVDQ1AmJmwoKS5oaWRlKCksY3x8KGUoKSxjPSEwKX19KX0sZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmw6KCk9PntpZighcyl0aHJvdyBuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludm9rZSBjb25uZWN0LnN0b3JhZ2VBY2Nlc3MuaW5pdCBmaXJzdCIpO2lmKGQocykpcmV0dXJuIGgocyk7aWYoZihzKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc10gW0NDUF0gTG9jYWwgdGVzdGluZyIpLGAke3N9JHtufWA7aWYoaS5pbnN0YW5jZVVybCYmZChpLmluc3RhbmNlVXJsKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKGBbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBDdXN0b21lciBoYXMgcHJvdmlkZWQgc3RvcmFnZVBhcmFtcy5pbnN0YW5jZVVybCAke2kuaW5zdGFuY2VVcmx9YCksaChpLmluc3RhbmNlVXJsKTtpZihpLmluc3RhbmNlVXJsJiZmKGkuaW5zdGFuY2VVcmwpKXJldHVybiB0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIExvY2FsIHRlc3RpbmciKSxgJHtpLmluc3RhbmNlVXJsfSR7bn1gO3Rocm93IHQuZ2V0TG9nKCkuZXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludmFsaWQgQ29ubmVjdCBpbnN0YW5jZS9DQ1AgVVJMIHByb3ZpZGVkLCBwbGVhc2UgcGFzcyB0aGUgY29ycmVjdCBjY3BVcmwgb3Igc3RvcmFnZUFjY2Vzcy5pbnN0YW5jZVVybCBwYXJhbWV0ZXJzIiksbmV3IEVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZhbGlkIENvbm5lY3QgaW5zdGFuY2UvQ0NQIFVSTCBwcm92aWRlZCwgcGxlYXNlIHBhc3MgdGhlIHZhbGlkIENvbm5lY3QgQ0NQIFVSTCBvciBpbiBjYXNlIENDUCBVUkwgaXMgY29uZmlndXJlZCB0byBiZSB0aGUgU1NPIFVSTCB0aGVuIHVzZSBzdG9yYWdlQWNjZXNzLmluc3RhbmNlVXJsIGFuZCBwYXNzIHRoZSBDb25uZWN0IENDUCBVUkwiKX0sc3RvcmFnZUFjY2Vzc0V2ZW50czp1LHJlc2V0U3RvcmFnZUFjY2Vzc1N0YXRlOigpPT57aT17fSxzPSIiLGE9bnVsbCxjPSExfSxnZXRPbkdyYW50Q2FsbGJhY2tJbnZva2VkOigpPT5jLGdldFN0b3JhZ2VBY2Nlc3NQYXJhbXM6KCk9Pmksb25SZXF1ZXN0Om0scmVxdWVzdDooKT0+e3QuY29yZS5fZ2V0Q0NQSWZyYW1lKCkuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7ZXZlbnQ6dS5SRVFVRVNULGRhdGE6ey4uLmksbGFuZGF0OmcoKX19LCIqIil9fSl9KCl9LDc0MzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYodGhpcy5fcHJldkNvbnRhY3RJZD1udWxsLHQuYXNzZXJ0Tm90TnVsbChuLCJyaW5ndG9uZUNvbmZpZyIpLCFuLnJpbmd0b25lVXJsKXRocm93IG5ldyBFcnJvcigicmluZ3RvbmVVcmwgaXMgcmVxdWlyZWQhIik7ZS5BdWRpbyYmdm9pZCAwIT09ZS5Qcm9taXNlP3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLG8pe3IuX2F1ZGlvPW5ldyBBdWRpbyhuLnJpbmd0b25lVXJsKSxyLl9hdWRpby5sb29wPSEwLHIuX2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXkiLChmdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgaXMgcmVhZHkgdG8gcGxheTogIiwrbi5yaW5ndG9uZVVybCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLl9hdWRpb1BsYXlhYmxlPSEwLGUoci5fYXVkaW8pfSkpfSkpOih0aGlzLl9hdWRpbz1udWxsLHQuZ2V0TG9nKCkuZXJyb3IoIlVuYWJsZSB0byBwcm92aWRlIGEgcmluZ3RvbmUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksci5fZHJpdmVSaW5ndG9uZSgpfTtuLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkLiIpfSxuLnByb3RvdHlwZS5fc3RhcnRSaW5ndG9uZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGxheSgpLnRoZW4oKGZ1bmN0aW9uKCl7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBTdGFydCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdGFydCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHIpe24uX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIsZSksdC5nZXRMb2coKS5lcnJvcigiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIpLndpdGhFeGNlcHRpb24ocikud2l0aE9iamVjdCh7Y3VycmVudFNyYzpuLl9hdWRpby5jdXJyZW50U3JjLHNpbmtJZDpuLl9hdWRpby5zaW5rSWQsdm9sdW1lOm4uX2F1ZGlvLnZvbHVtZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksdC5nZXRMb2coKS5pbmZvKGBBdHRlbXB0aW5nIHRvIHN0YXJ0IHJpbmd0b25lIHRvIGRldmljZSAke3RoaXMuX2F1ZGlvLnNpbmtJZHx8IicnIn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sbi5wcm90b3R5cGUuX3N0b3BSaW5ndG9uZT1mdW5jdGlvbihlKXt0aGlzLl9hdWRpbyYmKHRoaXMuX2F1ZGlvLnBhdXNlKCksdGhpcy5fYXVkaW8uY3VycmVudFRpbWU9MCx0aGlzLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0b3AiLGUpLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgU3RvcCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5zdG9wUmluZ3RvbmU9ZnVuY3Rpb24oKXt0aGlzLl9zdG9wUmluZ3RvbmUoKX0sbi5wcm90b3R5cGUuX3Jpbmd0b25lU2V0dXA9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlJJTkdUT05FLChmdW5jdGlvbigpe24uX3N0YXJ0UmluZ3RvbmUoZSksbi5fcHJldkNvbnRhY3RJZD1lLmdldENvbnRhY3RJZCgpLGUub25Db25uZWN0ZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25BY2NlcHRlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkVuZGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HJiZuLl9zdG9wUmluZ3RvbmUoKX0pKX0pKX0sbi5wcm90b3R5cGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudD1mdW5jdGlvbihlLG4pe24mJm4uZ2V0Q29udGFjdElkKCkmJnQucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLmdldENvbnRhY3RJZCgpfSl9LG4ucHJvdG90eXBlLnNldE91dHB1dERldmljZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U/UHJvbWlzZS5yYWNlKFt0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHBsYXlhYmxlIGF1ZGlvIil9KSwzZTMpfSkpXSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0U2lua0lkP2Uuc2V0U2lua0lkKHQpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogYXVkaW8uc2V0U2lua0lkKCkgZmFpbGVkIHdpdGggZXJyb3IgJHtlfWApfSkpOlByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogJHtlPyJhdWRpbyI6ImF1ZGlvLnNldFNpbmtJZCJ9IG5vdCBmb3VuZC5gKX0pKTplLlByb21pc2U/UHJvbWlzZS5yZWplY3QoIk5vdCBlbGlnaWJsZSByaW5ndG9uZSBvd25lciIpOnZvaWQgMH07dmFyIHI9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuVk9JQ0UmJm4uaXNTb2Z0cGhvbmVDYWxsKCkmJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSksKG5ldyB0LkFnZW50KS5nZXRDb250YWN0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmbihlKX0pKX07dmFyIG89ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuQ0hBVCYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJDaGF0IFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSl9O3ZhciBpPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlRBU0smJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiVGFzayBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zLHMucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LmNvbnRhY3QoKGZ1bmN0aW9uKG4pe24ub25JbmNvbWluZygoZnVuY3Rpb24oKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJDYWxsYmFjayBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9KSl9KSl9LHQuVm9pY2VSaW5ndG9uZUVuZ2luZT1yLHQuQ2hhdFJpbmd0b25lRW5naW5lPW8sdC5UYXNrUmluZ3RvbmVFbmdpbmU9aSx0LlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZT1zfSgpfSw2NDI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCxlLmNjcFZlcnNpb249IlYyIjt2YXIgbj17fTtuW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fT05MWV09IkF1ZGlvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuVklERU9fT05MWV09IlZpZGVvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fVklERU9dPSJBdWRpb1ZpZGVvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuTk9ORV09Ik5vbmUiO3ZhciByPSJhdWRpb19pbnB1dCIsbz0iYXVkaW9fb3V0cHV0Ijsoe30pW3QuQ29udGFjdFR5cGUuVk9JQ0VdPSJWb2ljZSI7dmFyIGk9W10scz1bXSxhPVtdLGM9e30sdT17fSxsPTAscD0wLGQ9MCxoPTAsZj0wLGc9bnVsbCxtPW51bGwsdj1udWxsLHk9dC5Tb2Z0cGhvbmVFcnJvclR5cGVzLEU9e30sUz10LnJhbmRvbUlkKCksYj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsZSx7c3VjY2VzczpmdW5jdGlvbihlKXtuKGUuc29mdHBob25lVHJhbnNwb3J0LnNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe2UubWVzc2FnZSYmZS5tZXNzYWdlLmluY2x1ZGVzKCJTb2Z0cGhvbmVDb25uZWN0aW9uTGltaXRCcmVhY2hlZEV4Y2VwdGlvbiIpJiZ4KCJtdWx0aXBsZV9zb2Z0cGhvbmVfYWN0aXZlX3Nlc3Npb25zIiwiTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhcmUgbW9yZSB0aGVuIGFsbG93ZWQgbGltaXQuIiwiIikscihFcnJvcigicmVxdWVzdEljZUFjY2VzcyBmYWlsZWQiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7cihFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3IoRXJyb3IoIkFjY2VzcyBEZW5pZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX19KX0pKX0sQz1mdW5jdGlvbihlPXt9KXt2YXIgbixyPXRoaXM7KHY9bmV3IEoodC5nZXRMb2coKSkpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gc29mdHBob25lIG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gaGFzIGJlZ3VuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LlJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSYmKG49bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KHYsdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxTLHQuaGl0Y2gocixiLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOlN9KSx0LmhpdGNoKHIseCkpKSxDLmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZCgpfHx4KHkuVU5TVVBQT1JURURfQlJPV1NFUiwiQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYnJvd3Nlci4gU29tZSBmdW5jdGlvbmFsaXR5IG1heSBub3Qgd29yay4gIiwiIiksUCh7c3VjY2VzczpmdW5jdGlvbihlKXtVKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJncmFudGVkIn0pfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3goZSwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIiksVSgiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZGVuaWVkIn0pfX0pO2NvbnN0IG89SSgpLGk9QSgpLHM9XyghZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbik7dygpLHRoaXMucmluZ3RvbmVFbmdpbmU9bnVsbDt2YXIgYT17fSxjPXt9LHU9ITEsbD1udWxsLHA9bnVsbCxkPWZ1bmN0aW9uKCl7dT0hMSxsPW51bGwscD1udWxsfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV19LHRoaXMucmVwbGFjZUxvY2FsTWVkaWFUcmFjaz1mdW5jdGlvbihlLHQpe3ZhciBuPUVbZV0uc3RyZWFtO2lmKG4pe3ZhciByPW4uZ2V0QXVkaW9UcmFja3MoKVswXTt0LmVuYWJsZWQ9ci5lbmFibGVkLHIuZW5hYmxlZD0hMSxuLnJlbW92ZVRyYWNrKHIpLG4uYWRkVHJhY2sodCl9fTt2YXIgaD1mdW5jdGlvbihlKXtpZihhLmhhc093blByb3BlcnR5KGUpKXt2YXIgdD1hW2VdO25ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2RlbGV0ZSBhW2VdLGRlbGV0ZSBjW2VdLHQuaGFuZ3VwKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2xpbHkuZ2V0TG9nKCkud2FybigiQ2xlYW4gdXAgdGhlIHNlc3Npb24gbG9jYWxseSAiK2UsdC5tZXNzYWdlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfX07dGhpcy5zdGFydFNlc3Npb249ZnVuY3Rpb24ocixvKXt2YXIgaT11P2w6cixzPXU/cDpvO2lmKGkmJnMpe2QoKSxjW3NdPSEwLHYuaW5mbygiU29mdHBob25lIGNhbGwgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIraS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrcykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmdW5jdGlvbihlKXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKEYoIk11bHRpU2Vzc2lvbkhhbmdVcCIsZVt0XS5jYWxsSWQsdCksaCh0KSk7dGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUgc2Vzc2lvbiBkZXRlY3RlZCwgcmVmdXNpbmcgdG8gc2V0dXAgbmV3IGNvbm5lY3Rpb24iKX19KGEpLGkuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmVSgiU29mdHBob25lIENvbm5lY3RpbmciLGkuZ2V0Q29udGFjdElkKCkpLFYoKTt2YXIgZixnPWkuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZ2V0U29mdHBob25lTWVkaWFJbmZvKCksbT1EKGcuY2FsbENvbmZpZ0pzb24pO20udXNlV2ViU29ja2V0UHJvdmlkZXImJihmPXQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCkpO3ZhciB5PW5ldyB0LlJUQ1Nlc3Npb24obS5zaWduYWxpbmdFbmRwb2ludCxtLmljZVNlcnZlcnMsZy5jYWxsQ29udGV4dFRva2VuLHYsaS5nZXRDb250YWN0SWQoKSxzLGYpO3kuZWNob0NhbmNlbGxhdGlvbj0hZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbixhW3NdPXksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25uZWN0aW9uRXZlbnRzLlNFU1NJT05fSU5JVCxkYXRhOntjb25uZWN0aW9uSWQ6c319KSx5Lm9uU2Vzc2lvbkZhaWxlZD1mdW5jdGlvbihlLHQpe2RlbGV0ZSBhW3NdLGRlbGV0ZSBjW3NdLE8oZSx0KSxNKGkuZ2V0Q29udGFjdElkKCksdCksWChpLGUuc2Vzc2lvblJlcG9ydCl9LHkub25TZXNzaW9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe1UoIlNvZnRwaG9uZSBTZXNzaW9uIENvbm5lY3RlZCIsaS5nZXRDb250YWN0SWQoKSksdC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTKSxCKGUpLGooaSksVChpKX0seS5vblNlc3Npb25Db21wbGV0ZWQ9ZnVuY3Rpb24oZSl7VSgiU29mdHBob25lIFNlc3Npb24gQ29tcGxldGVkIixpLmdldENvbnRhY3RJZCgpKSxkZWxldGUgYVtzXSxkZWxldGUgY1tzXSxYKGksZS5zZXNzaW9uUmVwb3J0KSxSKHMpfSx5Lm9uTG9jYWxTdHJlYW1BZGRlZD1mdW5jdGlvbihlLG4pe0Vbc109e3N0cmVhbTpufSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLkxPQ0FMX01FRElBX1NUUkVBTV9DUkVBVEVELGRhdGE6e2Nvbm5lY3Rpb25JZDpzfX0pfSx5LnJlbW90ZUF1ZGlvRWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIiksbj95LmNvbm5lY3Qobi5nZXQobS5pY2VTZXJ2ZXJzKSk6eS5jb25uZWN0KCl9fTt2YXIgZj1mdW5jdGlvbihlLG4pe2Fbbl0mJmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVOREVEfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVSUk9SfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLk1JU1NFRH0oZSkmJihoKG4pLGQoKSksIWUuaXNTb2Z0cGhvbmVDYWxsKCl8fGNbbl18fGUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlOR3x8KHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcygpP2Z1bmN0aW9uKGUsdCl7dT0hMCxsPWUscD10fShlLG4pOnIuc3RhcnRTZXNzaW9uKGUsbikpfSxnPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO3YuaW5mbygiQ29udGFjdCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGNbdF18fChlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXtmKGUsdCl9KSksZS5vbkRlc3Ryb3koKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe2FbZV0mJmgoZSl9KHQpfSkpKX07ci5vbkluaXRDb250YWN0U3ViPXQuY29udGFjdChnKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKS5jb25uZWN0aW9uSWQ7di5pbmZvKCJDb250YWN0IGV4aXN0IGluIHRoZSBzbmFwc2hvdC4gUmVpbml0aWF0ZSB0aGUgQ29udGFjdCBhbmQgUlRDIHNlc3Npb24gY3JlYXRpb24gZm9yIGNvbnRhY3RJZCIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxnKGUpLGYoZSx0KX0pKSx0aGlzLnRlcm1pbmF0ZT0oKT0+e3Iub25Jbml0Q29udGFjdFN1YiYmci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlJiZyLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUoKSxvJiZvLnVuc3Vic2NyaWJlJiZvLnVuc3Vic2NyaWJlKCksaSYmaS51bnN1YnNjcmliZSYmaS51bnN1YnNjcmliZSgpLHMmJnMudW5zdWJzY3JpYmUmJnMudW5zdWJzY3JpYmUoKSxuLmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCYmbi5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQoKSxuPW51bGx9fSxUPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRVcHN0cmVhbSgpLHI9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKTtpZihyKXt2YXIgbz1yLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpO28/ITA9PT1vLmF1dG9BY2NlcHQ/KHYuaW5mbygiQXV0by1hY2NlcHQgaXMgZW5hYmxlZCwgc2VuZGluZyBvdXQgQWNjZXB0ZWQgZXZlbnQgdG8gc3RvcCByaW5ndG9uZS4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZS5jb250YWN0SWQpLGRhdGE6bmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9KSk6di5pbmZvKCJBdXRvLWFjY2VwdCBpcyBkaXNhYmxlZCwgcmluZ3RvbmUgd2lsbCBiZSBzdG9wcGVkIGJ5IHVzZXIgYWN0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6di5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgU29mdHBob25lTWVkaWFJbmZvLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugdi5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgQWdlbnRDb25uZWN0aW9uLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxJPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NVVRFLGspfSxBPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLEwpfSxfPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSwodD0+Tih7Li4udCxlbmFibGVFY2hvQ2FuY2VsbGF0aW9uOmV9KSkpfSx3PWZ1bmN0aW9uKCl7dHJ5e3QuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT40MyYmbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOiJtaWNyb3Bob25lIn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXt2LmluZm8oIk1pY3JvcGhvbmUgUGVybWlzc2lvbjogIitlLnN0YXRlKSxVKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOmUuc3RhdGV9KSwiZGVuaWVkIj09PWUuc3RhdGUmJngoeS5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpfX0pKX1jYXRjaChlKXt2LmVycm9yKCJGYWlsZWQgaW4gZGV0ZWN0aW5nIG1pY3JvcGhvbmUgcGVybWlzc2lvbiBzdGF0dXM6ICIrZSl9fSxSPWZ1bmN0aW9uKGUpe2RlbGV0ZSBFW2VdLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6ITF9fSl9LGs9ZnVuY3Rpb24oZSl7dmFyIG47aWYoMCE9PXQua2V5cyhFKS5sZW5ndGgpe2Zvcih2YXIgciBpbiBlJiZ2b2lkIDAhPT1lLm11dGUmJihuPWUubXV0ZSksRSlpZihFLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1FW3JdLnN0cmVhbTtpZihvKXt2YXIgaT1vLmdldEF1ZGlvVHJhY2tzKClbMF07dm9pZCAwIT09bj8oaS5lbmFibGVkPSFuLEVbcl0ubXV0ZWQ9bixuP3YuaW5mbygiQWdlbnQgaGFzIG11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAgIityKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnYuaW5mbygiQWdlbnQgaGFzIHVubXV0ZWQgdGhlIGNvbnRhY3QsIGNvbm5lY3Rpb25JZCAtICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6bj1FW3JdLm11dGVkfHwhMX19dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxkYXRhOnttdXRlZDpufX0pfX0sTD1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgc3BlYWtlciBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpO3ImJiJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFNpbmtJZD9yLnNldFNpbmtJZChuKS50aGVuKCgoKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU3BlYWtlciBkZXZpY2UgJHtufSBzdWNjZXNzZnVsbHkgc2V0IHRvIHNwZWFrZXIgYXVkaW8gZWxlbWVudGApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgc3BlYWtlciBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSk6dC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyByZW1vdGVBdWRpb0VsZW1lbnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LE49ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDAhPT10LmtleXMoRSkubGVuZ3RoKWlmKG4pe3ZhciByPXQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyKCksbz17YXVkaW86e2RldmljZUlkOntleGFjdDpufX19O2UuZW5hYmxlRWNob0NhbmNlbGxhdGlvbnx8KG8uYXVkaW8uZWNob0NhbmNlbGxhdGlvbj0hMSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJlY2hvQ2FuY2VsbGF0aW9uQ2hlY2siLGRhdGE6e2NvdW50OjEsZGlzYWJsZUVjaG9DYW5jZWxsYXRpb246IWUuZW5hYmxlRWNob0NhbmNlbGxhdGlvbn19KSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKChlPT57dHJ5e3ZhciBvPWUuZ2V0QXVkaW9UcmFja3MoKVswXTtmb3IodmFyIGkgaW4gRSlFLmhhc093blByb3BlcnR5KGkpJiYoRVtpXS5zdHJlYW0sci5nZXRTZXNzaW9uKGkpLl9wYy5nZXRTZW5kZXJzKClbMF0ucmVwbGFjZVRyYWNrKG8pLnRoZW4oKGZ1bmN0aW9uKCl7ci5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrKGksbyksdC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBNaWNyb3Bob25lIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gbG9jYWwgbWVkaWEgc3RyZWFtIGluIFJUQ1J0cFNlbmRlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgbWljcm9waG9uZSBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgbG9jYWxNZWRpYVN0cmVhbSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LE89ZnVuY3Rpb24oZSxuKXtpZihuPT09dC5SVENFcnJvcnMuSUNFX0NPTExFQ1RJT05fVElNRU9VVCl7Zm9yKHZhciByPSJcbiIsbz0wO288ZS5faWNlU2VydmVycy5sZW5ndGg7bysrKWZvcih2YXIgaT0wO2k8ZS5faWNlU2VydmVyc1tvXS51cmxzLmxlbmd0aDtpKyspcj1yK2UuX2ljZVNlcnZlcnNbb10udXJsc1tpXSsiXG4iO3goeS5JQ0VfQ09MTEVDVElPTl9USU1FT1VULCJJY2UgY29sbGVjdGlvbiB0aW1lZG91dC4gIixyKX1lbHNlIG49PT10LlJUQ0Vycm9ycy5VU0VSX0JVU1k/eCh5LlVTRVJfQlVTWV9FUlJPUiwiU29mdHBob25lIGNhbGwgVXNlckJ1c3kgZXJyb3IuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFP3goeS5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFLCJIYW5kc2hha2luZyB3aXRoIFNpZ25hbGxpbmcgU2VydmVyICIrZS5fc2lnbmFsaW5nVXJpKyIgZmFpbGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkdVTV9USU1FT1VUX0ZBSUxVUkV8fG49PT10LlJUQ0Vycm9ycy5HVU1fT1RIRVJfRkFJTFVSRT94KHkuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKTpuPT09dC5SVENFcnJvcnMuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkU/eCh5LlNJR05BTExJTkdfQ09OTkVDVElPTl9GQUlMVVJFLCJVUkwgIitlLl9zaWduYWxpbmdVcmkrIiBjYW5ub3QgYmUgcmVhY2hlZC4gIixlLl9zaWduYWxpbmdVcmkpOm49PT10LlJUQ0Vycm9ycy5DQUxMX05PVF9GT1VORD92LmVycm9yKCJTb2Z0cGhvbmUgY2FsbCBmYWlsZWQgZHVlIHRvIENhbGxOb3RGb3VuZEV4Y2VwdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOngoeS5XRUJSVENfRVJST1IsIndlYnJ0YyBzeXN0ZW0gZXJyb3IuICIsIiIpfSxEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvJnF1b3Q7L2csJyInKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX0sUD1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0LnN1Y2Nlc3M9dC5zdWNjZXNzfHxmdW5jdGlvbigpe30sdC5mYWlsdXJlPXQuZmFpbHVyZXx8ZnVuY3Rpb24oKXt9O3ZhciBuPXthdWRpbzohMH0scj1udWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlKXtpZigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSlyPW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG4pO2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpcmV0dXJuIHZvaWQgdC5mYWlsdXJlKHkuVU5TVVBQT1JURURfQlJPV1NFUik7cj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKG4sZSx0KX0pKX1yZXR1cm4gci50aGVuKChmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF1ZGlvVHJhY2tzKCk7biYmbi5sZW5ndGg+MD90LnN1Y2Nlc3MoZSk6dC5mYWlsdXJlKHkuTUlDUk9QSE9ORV9OT1RfU0hBUkVEKX0pLChmdW5jdGlvbihlKXt0LmZhaWx1cmUoeS5NSUNST1BIT05FX05PVF9TSEFSRUQpfSkpLHJ9dC5mYWlsdXJlKHkuVU5TVVBQT1JURURfQlJPV1NFUil9LHg9ZnVuY3Rpb24oZSxuLHIpe3YuZXJyb3IoIlNvZnRwaG9uZSBlcnJvciBvY2N1cnJlZCA6ICIsZSxufHwiIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLlNPRlRQSE9ORV9FUlJPUixkYXRhOm5ldyB0LlNvZnRwaG9uZUVycm9yKGUsbixyKX0pfSxNPWZ1bmN0aW9uKGUsdCl7VSgiU29mdHBob25lIFNlc3Npb24gRmFpbGVkIixlLHtmYWlsZWRSZWFzb246dH0pfSxVPWZ1bmN0aW9uKGUsbixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bixkYXRhOnJ9KX0sRj1mdW5jdGlvbihlLHQsbil7VShlLHQsW3tuYW1lOiJBZ2VudENvbm5lY3Rpb25JZCIsdmFsdWU6bn1dKSx2LmluZm8oIlB1Ymxpc2ggbXVsdGlwbGUgc2Vzc2lvbiBlcnJvciBtZXRyaWNzIixlLCJjb250YWN0SWQgIit0LCJhZ2VudCBjb25uZWN0aW9uSWQgIituKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTtDLmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHQuaXNPcGVyYUJyb3dzZXIoKSYmdC5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uKCk+MTcpfHwhISh0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+MjIpfHwhISh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb24oKT4yMSl9O3ZhciBxPWZ1bmN0aW9uKGUpe3ZhciB0PWkuc2xpY2UoKTtpPVtdLHQubGVuZ3RoPjAmJmUuc2VuZFNvZnRwaG9uZU1ldHJpY3ModCx7c3VjY2VzczpmdW5jdGlvbigpe3YuaW5mbygic2VuZFNvZnRwaG9uZU1ldHJpY3Mgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7di5lcnJvcigic2VuZFNvZnRwaG9uZU1ldHJpY3MgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KX0sQj1mdW5jdGlvbihlKXtnPXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlLmdldFVzZXJBdWRpb1N0YXRzKCkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9YyxuPVcoYz1lLHQscik7aS5wdXNoKG4pLEgobil9KSwoZnVuY3Rpb24oZSl7di5kZWJ1ZygiRmFpbGVkIHRvIGdldCB1c2VyIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLmdldFJlbW90ZUF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD11LG49Vyh1PWUsdCxvKTtpLnB1c2gobiksSChuKX0pLChmdW5jdGlvbihlKXt2LmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlbW90ZSBhdWRpbyBzdGF0cy4iLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSwxZTMpfSxqPWZ1bmN0aW9uKGUpe209d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe3EoZSl9KSwzZTQpfSxWPWZ1bmN0aW9uKCl7Yz1udWxsLHU9bnVsbCxpPVtdLHM9W10sYT1bXSxnPW51bGwsbT1udWxsLGw9MCxwPTAsZD0wLGg9MCxmPTB9LFc9ZnVuY3Rpb24oZSx0LG4pe2lmKHQmJmUpe3ZhciByPWUucGFja2V0c0xvc3Q+dC5wYWNrZXRzTG9zdD9lLnBhY2tldHNMb3N0LXQucGFja2V0c0xvc3Q6MCxvPWUucGFja2V0c0NvdW50PnQucGFja2V0c0NvdW50P2UucGFja2V0c0NvdW50LXQucGFja2V0c0NvdW50OjA7cmV0dXJuIEcobyxuKSx6KGUuYXVkaW9MZXZlbCxuKSxuZXcgWShlLnRpbWVzdGFtcCxyLG8sbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9cmV0dXJuIG5ldyBZKGUudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9LEg9ZnVuY3Rpb24oZSl7aWYoZS5zb2Z0cGhvbmVTdHJlYW1UeXBlPT09cil7Zm9yKDtzLmxlbmd0aD49MTA4MDA7KXMuc2hpZnQoKTtzLnB1c2goZSl9ZWxzZSBpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1vKXtmb3IoO2EubGVuZ3RoPj0xMDgwMDspYS5zaGlmdCgpO2EucHVzaChlKX19LEc9ZnVuY3Rpb24oZSx0KXt0PT09cj8oZisrLGU8PTA/bCsrOmw9MCk6dD09PW8mJihlPD0wP2QrKzpkPTApfSx6PWZ1bmN0aW9uKGUsdCl7dD09PXI/bnVsbCE9PWUmJmU8PTE/cCsrOnA9MDp0PT09byYmKG51bGwhPT1lJiZlPD0xP2grKzpoPTApfSxLPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwoZSksbnVsbH0sWD1mdW5jdGlvbihuLGkpe2c9SyhnKSxtPUsobSksZnVuY3Rpb24obixpLGMsdSl7aS5zdHJlYW1TdGF0cz1bJChjLHIpLCQodSxvKV07dmFyIGc9e2NhbGxTdGFydFRpbWU6aS5zZXNzaW9uU3RhcnRUaW1lLGNhbGxFbmRUaW1lOmkuc2Vzc2lvbkVuZFRpbWUsZ3VtVGltZU1pbGxpczppLmd1bVRpbWVNaWxsaXMsaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOmkuaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOmkuaWNlQ29sbGVjdGlvblRpbWVNaWxsaXMsc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOmkuc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzLGhhbmRzaGFraW5nVGltZU1pbGxpczppLmhhbmRzaGFraW5nVGltZU1pbGxpcyxwcmVUYWxraW5nVGltZU1pbGxpczppLnByZVRhbGtpbmdUaW1lTWlsbGlzLHRhbGtpbmdUaW1lTWlsbGlzOmkudGFsa2luZ1RpbWVNaWxsaXMsY2xlYW51cFRpbWVNaWxsaXM6aS5jbGVhbnVwVGltZU1pbGxpcyxpY2VDb2xsZWN0aW9uRmFpbHVyZTppLmljZUNvbGxlY3Rpb25GYWlsdXJlLHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTppLnNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZSxoYW5kc2hha2luZ0ZhaWx1cmU6aS5oYW5kc2hha2luZ0ZhaWx1cmUsZ3VtT3RoZXJGYWlsdXJlOmkuZ3VtT3RoZXJGYWlsdXJlLGd1bVRpbWVvdXRGYWlsdXJlOmkuZ3VtVGltZW91dEZhaWx1cmUsY3JlYXRlT2ZmZXJGYWlsdXJlOmkuY3JlYXRlT2ZmZXJGYWlsdXJlLHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOmkuc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmUsdXNlckJ1c3lGYWlsdXJlOmkudXNlckJ1c3lGYWlsdXJlLGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOmkuaW52YWxpZFJlbW90ZVNEUEZhaWx1cmUsbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOmkubm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlLHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTppLnNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOmkuc3RyZWFtU3RhdHN9O24uc2VuZFNvZnRwaG9uZVJlcG9ydChnLHtzdWNjZXNzOmZ1bmN0aW9uKCl7di5pbmZvKCJzZW5kU29mdHBob25lUmVwb3J0IHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KGcpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3YuZXJyb3IoInNlbmRTb2Z0cGhvbmVSZXBvcnQgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KTt2YXIgbT17QVVESU9fSU5QVVQ6e3BhY2tldHNDb3VudDpzLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDpzLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6cy5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczpzLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKX0sQVVESU9fT1VUUFVUOntwYWNrZXRzQ291bnQ6YS5tYXAoKGU9PmUucGFja2V0c0NvdW50KSkscGFja2V0c0xvc3Q6YS5tYXAoKGU9PmUucGFja2V0c0xvc3QpKSxhdWRpb0xldmVsOmEubWFwKChlPT5lLmF1ZGlvTGV2ZWwpKSxqaXR0ZXJCdWZmZXJNaWxsaXM6YS5tYXAoKGU9PmUuaml0dGVyQnVmZmVyTWlsbGlzKSkscm91bmRUcmlwVGltZU1pbGxpczphLm1hcCgoZT0+ZS5yb3VuZFRyaXBUaW1lTWlsbGlzKSl9fSx5PXsuLi5nLHNvZnRwaG9uZVN0cmVhbVBlclNlY29uZFN0YXRpc3RpY3M6bSxpY2VDb25uZWN0aW9uc0xvc3Q6aS5pY2VDb25uZWN0aW9uc0xvc3QsaWNlQ29ubmVjdGlvbnNGYWlsZWQ6aS5pY2VDb25uZWN0aW9uc0ZhaWxlZHx8bnVsbCxwZWVyQ29ubmVjdGlvbkZhaWxlZDppLnBlZXJDb25uZWN0aW9uRmFpbGVkfHxudWxsLHJ0Y0pzVmVyc2lvbjppLnJ0Y0pzVmVyc2lvbnx8bnVsbCxjb25zZWN1dGl2ZU5vQXVkaW9JbnB1dFBhY2tldHM6bCxjb25zZWN1dGl2ZUxvd0lucHV0QXVkaW9MZXZlbDpwLGNvbnNlY3V0aXZlTm9BdWRpb091dHB1dFBhY2tldHM6ZCxjb25zZWN1dGl2ZUxvd091dHB1dEF1ZGlvTGV2ZWw6aCxhdWRpb0lucHV0Q29ubmVjdGVkRHVyYXRpb25TZWNvbmRzOmZ9O3QucHVibGlzaFNvZnRwaG9uZVJlcG9ydCh7Y29udGFjdElkOm4uZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24scmVwb3J0Onl9KSx2LmluZm8oInNlbnQgVGVsZW1ldHJ5Q2FsbFJlcG9ydCAiK0pTT04uc3RyaW5naWZ5KHkpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfShuLGksJChjLHIpLCQodSxvKSkscShuKX0sWT1mdW5jdGlvbihlLHQsbixyLG8saSxzKXt0aGlzLnNvZnRwaG9uZVN0cmVhbVR5cGU9cix0aGlzLnRpbWVzdGFtcD1lLHRoaXMucGFja2V0c0xvc3Q9dCx0aGlzLnBhY2tldHNDb3VudD1uLHRoaXMuYXVkaW9MZXZlbD1vLHRoaXMuaml0dGVyQnVmZmVyTWlsbGlzPWksdGhpcy5yb3VuZFRyaXBUaW1lTWlsbGlzPXN9LCQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFkoKGU9ZXx8e30pLnRpbWVzdGFtcCxlLnBhY2tldHNMb3N0LGUucGFja2V0c0NvdW50LHQsZS5hdWRpb0xldmVsKX0sSj1mdW5jdGlvbihlKXt0aGlzLl9vcmlnaW5hbExvZ2dlcj1lO3ZhciBuPXRoaXM7dGhpcy5fdGVlPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWzBdKSxvPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKCl7bys9IiAlcyJ9KSksci5hcHBseShuLl9vcmlnaW5hbExvZ2dlcixbdC5Mb2dDb21wb25lbnQuU09GVFBIT05FLG9dLmNvbmNhdChlKSl9fX07Si5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDEsdGhpcy5fb3JpZ2luYWxMb2dnZXIuZGVidWcpKGFyZ3VtZW50cyl9LEoucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDIsdGhpcy5fb3JpZ2luYWxMb2dnZXIuaW5mbykoYXJndW1lbnRzKX0sSi5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgzLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmxvZykoYXJndW1lbnRzKX0sSi5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNCx0aGlzLl9vcmlnaW5hbExvZ2dlci53YXJuKShhcmd1bWVudHMpfSxKLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNSx0aGlzLl9vcmlnaW5hbExvZ2dlci5lcnJvcikoYXJndW1lbnRzKX0sdC5Tb2Z0cGhvbmVNYW5hZ2VyPUN9KCl9LDk0NDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1mdW5jdGlvbigpe3JldHVybiB0LmNhY2hlLmhhc093blByb3BlcnR5KGFyZ3VtZW50c1swXSl8fCh0LmNhY2hlW2FyZ3VtZW50c1swXV09dC5wYXJzZShhcmd1bWVudHNbMF0pKSx0LmZvcm1hdC5jYWxsKG51bGwsdC5jYWNoZVthcmd1bWVudHNbMF1dLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG49W107dD4wO25bLS10XT1lKTtyZXR1cm4gbi5qb2luKCIiKX10LmZvcm1hdD1mdW5jdGlvbihlLG8pe3ZhciBpLHMsYSxjLHUsbCxwLGQ9MSxoPWUubGVuZ3RoLGY9IiIsZz1bXTtmb3Iocz0wO3M8aDtzKyspaWYoInN0cmluZyI9PT0oZj1uKGVbc10pKSlnLnB1c2goZVtzXSk7ZWxzZSBpZigiYXJyYXkiPT09Zil7aWYoKGM9ZVtzXSlbMl0pZm9yKGk9b1tkXSxhPTA7YTxjWzJdLmxlbmd0aDthKyspe2lmKCFpLmhhc093blByb3BlcnR5KGNbMl1bYV0pKXRocm93IHQoJ1tzcHJpbnRmXSBwcm9wZXJ0eSAiJXMiIGRvZXMgbm90IGV4aXN0JyxjWzJdW2FdKTtpPWlbY1syXVthXV19ZWxzZSBpPWNbMV0/b1tjWzFdXTpvW2QrK107aWYoL1tec10vLnRlc3QoY1s4XSkmJiJudW1iZXIiIT1uKGkpKXRocm93IHQoIltzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlcyIsbihpKSk7c3dpdGNoKGNbOF0pe2Nhc2UiYiI6aT1pLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6aT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpO2JyZWFrO2Nhc2UiZCI6aT1wYXJzZUludChpLDEwKTticmVhaztjYXNlImUiOmk9Y1s3XT9pLnRvRXhwb25lbnRpYWwoY1s3XSk6aS50b0V4cG9uZW50aWFsKCk7YnJlYWs7Y2FzZSJmIjppPWNbN10/cGFyc2VGbG9hdChpKS50b0ZpeGVkKGNbN10pOnBhcnNlRmxvYXQoaSk7YnJlYWs7Y2FzZSJvIjppPWkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjppPShpPVN0cmluZyhpKSkmJmNbN10/aS5zdWJzdHJpbmcoMCxjWzddKTppO2JyZWFrO2Nhc2UidSI6aT4+Pj0wO2JyZWFrO2Nhc2UieCI6aT1pLnRvU3RyaW5nKDE2KTticmVhaztjYXNlIlgiOmk9aS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1pPS9bZGVmXS8udGVzdChjWzhdKSYmY1szXSYmaT49MD8iKyIraTppLGw9Y1s0XT8iMCI9PWNbNF0/IjAiOmNbNF0uY2hhckF0KDEpOiIgIixwPWNbNl0tU3RyaW5nKGkpLmxlbmd0aCx1PWNbNl0/cihsLHApOiIiLGcucHVzaChjWzVdP2krdTp1K2kpfXJldHVybiBnLmpvaW4oIiIpfSx0LmNhY2hlPXt9LHQucGFyc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUsbj1bXSxyPVtdLG89MDt0Oyl7aWYobnVsbCE9PShuPS9eW15ceDI1XSsvLmV4ZWModCkpKXIucHVzaChuWzBdKTtlbHNlIGlmKG51bGwhPT0obj0vXlx4MjV7Mn0vLmV4ZWModCkpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PShuPS9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXlwpXSspXCkpPyhcKyk/KDB8J1teJF0pPygtKT8oXGQrKT8oPzpcLihcZCspKT8oW2ItZm9zdXhYXSkvLmV4ZWModCkpKXRocm93IltzcHJpbnRmXSBodWg/IjtpZihuWzJdKXtvfD0xO3ZhciBpPVtdLHM9blsyXSxhPVtdO2lmKG51bGw9PT0oYT0vXihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2ZvcihpLnB1c2goYVsxXSk7IiIhPT0ocz1zLnN1YnN0cmluZyhhWzBdLmxlbmd0aCkpOylpZihudWxsIT09KGE9L15cLihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpaS5wdXNoKGFbMV0pO2Vsc2V7aWYobnVsbD09PShhPS9eXFsoXGQrKVxdLy5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7aS5wdXNoKGFbMV0pfW5bMl09aX1lbHNlIG98PTI7aWYoMz09PW8pdGhyb3ciW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCI7ci5wdXNoKG4pfXQ9dC5zdWJzdHJpbmcoblswXS5sZW5ndGgpfXJldHVybiByfSxlLnNwcmludGY9dCxlLnZzcHJpbnRmPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4ocj1uLnNsaWNlKDApKS5zcGxpY2UoMCwwLGUpLHQuYXBwbHkobnVsbCxyKX19KCl9LDgyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn0sbi5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe30sci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt9O3ZhciBvPWZ1bmN0aW9uKGUsdCl7bi5jYWxsKHRoaXMpLHRoaXMud2luZG93PWUsdGhpcy5kb21haW49dHx8IioifTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLndpbmRvdy5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0sby5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpfTt2YXIgaT1mdW5jdGlvbihlLHQscil7bi5jYWxsKHRoaXMpLHRoaXMuaW5wdXQ9ZSx0aGlzLm91dHB1dD10LHRoaXMuZG9tYWluPXJ8fCIqIn07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5vdXRwdXQucG9zdE1lc3NhZ2UoZSx0aGlzLmRvbWFpbil9LGkucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh0PT57dC5zb3VyY2U9PT10aGlzLm91dHB1dCYmZSh0KX0pKX07dmFyIHM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMucG9ydD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoZSl9LHMucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9LHMucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9O3ZhciBhPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzKSx0aGlzLnN0cmVhbU1hcD1lP3QuaW5kZXgoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SWQoKX0pKTp7fSx0aGlzLm1lc3NhZ2VMaXN0ZW5lcnM9W119OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0LnNlbmQoZSl9Y2F0Y2goZSl7fX0pKX0sYS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGUpLHRoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25NZXNzYWdlKGUpfSkpfSxhLnByb3RvdHlwZS5hZGRTdHJlYW09ZnVuY3Rpb24oZSl7dGhpcy5zdHJlYW1NYXBbZS5nZXRJZCgpXT1lLHRoaXMubWVzc2FnZUxpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLm9uTWVzc2FnZSh0KX0pKX0sYS5wcm90b3R5cGUucmVtb3ZlU3RyZWFtPWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldfSxhLnByb3RvdHlwZS5nZXRTdHJlYW1zPWZ1bmN0aW9uKGUpe3JldHVybiB0LnZhbHVlcyh0aGlzLnN0cmVhbU1hcCl9LGEucHJvdG90eXBlLmdldFN0cmVhbUZvclBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmluZCh0aGlzLmdldFN0cmVhbXMoKSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucG9ydD09PWV9KSl9O3ZhciBjPWZ1bmN0aW9uKGUsbixvKXt0aGlzLm5hbWU9ZSx0aGlzLnVwc3RyZWFtPW58fG5ldyByLHRoaXMuZG93bnN0cmVhbT1vfHxuZXcgcix0aGlzLmRvd25zdHJlYW1CdXM9bmV3IHQuRXZlbnRCdXMsdGhpcy51cHN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLnVwc3RyZWFtQnVzKSksdGhpcy5kb3duc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLmRvd25zdHJlYW1CdXMpKX07Yy5wcm90b3R5cGUub25VcHN0cmVhbT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsVXBzdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnVwc3RyZWFtQnVzLnN1YnNjcmliZUFsbChlKX0sYy5wcm90b3R5cGUub25Eb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5kb3duc3RyZWFtQnVzLnN1YnNjcmliZShlLG4pfSxjLnByb3RvdHlwZS5vbkFsbERvd25zdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5zZW5kVXBzdHJlYW09ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdGhpcy51cHN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5zZW5kRG93bnN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6ZSxkYXRhOm59KX0sYy5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmRhdGE7bi5ldmVudCYmZS50cmlnZ2VyKG4uZXZlbnQsbi5kYXRhKX0sYy5wcm90b3R5cGUucGFzc1Vwc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnVwc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5wYXNzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5kb3duc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5zaHV0ZG93bj1mdW5jdGlvbigpe3RoaXMudXBzdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKSx0aGlzLmRvd25zdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKX07dmFyIHU9ZnVuY3Rpb24oZSx0LG4scil7Yy5jYWxsKHRoaXMsZSxuZXcgaSh0LG4uY29udGVudFdpbmRvdyxyfHwiKiIpLG51bGwpfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdC5TdHJlYW09bix0Lk51bGxTdHJlYW09cix0LldpbmRvd1N0cmVhbT1vLHQuV2luZG93SU9TdHJlYW09aSx0LlBvcnRTdHJlYW09cyx0LlN0cmVhbU11bHRpcGxleGVyPWEsdC5Db25kdWl0PWMsdC5JRnJhbWVDb25kdWl0PXV9KCl9LDgzMzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJ0b1N0YXRlIiksdGhpcy5mcm9tU3RhdGU9ZSx0aGlzLnRvU3RhdGU9bn07bi5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3Rocm93IHQuTm90SW1wbGVtZW50ZWRFcnJvcigpfSxuLnByb3RvdHlwZS5nZXRGcm9tU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcm9tU3RhdGV9LG4ucHJvdG90eXBlLmdldFRvU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0YXRlfTt2YXIgcj1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIiksdC5hc3NlcnROb3ROdWxsKG8sImFzc29jaWF0aW9ucyIpLG4uY2FsbCh0aGlzLGUsciksdGhpcy5hc3NvY2lhdGlvbnM9b307KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbnN9O3ZhciBvPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiY2xvc3VyZSIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obyksImNsb3N1cmUgbXVzdCBiZSBhIGZ1bmN0aW9uIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmNsb3N1cmU9b307KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zdXJlKGUsdGhpcy5nZXRGcm9tU3RhdGUoKSx0aGlzLmdldFRvU3RhdGUoKSl9O3ZhciBpPWZ1bmN0aW9uKCl7dGhpcy5mcm9tTWFwPXt9fTtpLkFOWT0iPDxhbnk+PiIsaS5wcm90b3R5cGUuYXNzb2M9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJmcm9tU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJ0b1N0YXRlT2JqIGlzIG5vdCBkZWZpbmVkLiIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiYXNzb2NPYmogaXMgbm90IGRlZmluZWQuIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9lLmZvckVhY2goKGZ1bmN0aW9uKGUpe2kuYXNzb2MoZSx0LG4pfSkpOnQgaW5zdGFuY2VvZiBBcnJheT90LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuYXNzb2MoZSx0LG4pfSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyBvKGUsdCxuKSk6biBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyByKGUsdCxuKSk6dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LFtuXSkpLHRoaXN9LGkucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKG4sImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIik7dmFyIG89W10scz10aGlzLmZyb21NYXBbaS5BTlldfHx7fSxhPXRoaXMuZnJvbU1hcFtuXXx8e307cmV0dXJuIG89KG89by5jb25jYXQodGhpcy5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcChzLGUsbixyKSkpLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKGEsZSxuLHIpKX0saS5wcm90b3R5cGUuX2FkZEFzc29jaWF0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXTt0fHwodD10aGlzLmZyb21NYXBbZS5nZXRGcm9tU3RhdGUoKV09e30pO3ZhciBuPXRbZS5nZXRUb1N0YXRlKCldO258fChuPXRbZS5nZXRUb1N0YXRlKCldPVtdKSxuLnB1c2goZSl9LGkucHJvdG90eXBlLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybihlW2kuQU5ZXXx8W10pLmNvbmNhdChlW3JdfHxbXSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlLmNvbmNhdChuLmdldEFzc29jaWF0aW9ucyh0KSl9KSxbXSl9LHQuRXZlbnRHcmFwaD1pfSgpfSw4OTE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1uYXZpZ2F0b3IudXNlckFnZW50LHI9WyJidWJibGVzIiwiY2FuY2VsQnViYmxlIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGF0YSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJldmVudFBoYXNlIiwiaXNUcnVzdGVkIiwibGFzdEV2ZW50SWQiLCJvcmlnaW4iLCJyZXR1cm5WYWx1ZSIsInRpbWVTdGFtcCIsInR5cGUiXTt0LnNwcmludGY9ZS5zcHJpbnRmLHQudnNwcmludGY9ZS52c3ByaW50ZixkZWxldGUgZS5zcHJpbnRmLGRlbGV0ZSBlLnZzcHJpbnRmLHQuSFRUUF9TVEFUVVNfQ09ERVM9e1NVQ0NFU1M6MjAwLFVOQVVUSE9SSVpFRDo0MDEsQUNDRVNTX0RFTklFRDo0MDMsVE9PX01BTllfUkVRVUVTVFM6NDI5LElOVEVSTkFMX1NFUlZFUl9FUlJPUjo1MDB9LHQuVFJBTlNQT1JUX1RZUEVTPXtDSEFUX1RPS0VOOiJjaGF0X3Rva2VuIixXRUJfU09DS0VUOiJ3ZWJfc29ja2V0IixBR0VOVF9ESVNDT1ZFUlk6ImFnZW50X2Rpc2NvdmVyeSIsV0VCX1JUQzoid2ViX3J0YyJ9LHQuaGl0Y2g9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ZS5zaGlmdCgpLHI9ZS5zaGlmdCgpO3JldHVybiB0LmFzc2VydE5vdE51bGwobiwic2NvcGUiKSx0LmFzc2VydE5vdE51bGwociwibWV0aG9kIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gci5hcHBseShuLGUuY29uY2F0KHQpKX19LHQuaXNGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSx0LmlzQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sdC5rZXlzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2gocik7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2goZVtyXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2goe2tleTpuLHZhbHVlOmVbbl19KTtyZXR1cm4gdH0sdC5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZW50cmllcyhlKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2Uua2V5XT1lLnZhbHVlfSkpfSkpLG59LHQubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHQuZmluZD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKHQoZVtuXSkpcmV0dXJuIGVbbl07cmV0dXJuIG51bGx9LHQuY29udGFpbnM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6biBpbiBlfSx0LmNvbnRhaW5zVmFsdWU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6bnVsbCE9dC5maW5kKHQudmFsdWVzKGUpLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSl9LHQucmFuZG9tSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCIlcy0lcyIsdC5ub3coKSxNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSl9LHQubWFrZUVudW09ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKC9cLj8oW2Etel0rKV8/L2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKSsiXyJ9KSkucmVwbGFjZSgvXyQvLCIiKTt0W25dPWV9KSksdH0sdC5tYWtlTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuKXt2YXIgcj10Lm1ha2VFbnVtKG4pO3JldHVybiB0LmtleXMocikuZm9yRWFjaCgoZnVuY3Rpb24obil7cltuXT10LnNwcmludGYoIiVzOjolcyIsZSxyW25dKX0pKSxyfSx0Lm1ha2VHZW5lcmljTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhvKS5mb3JFYWNoKChmdW5jdGlvbihuKXtvW25dPXQuc3ByaW50ZigiJXMiK3IrIiVzIixlLG9bbl0pfSkpLG99LHQuaXNDaHJvbWVCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkNocm9tZSIpfSx0LmlzRmlyZWZveEJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiRmlyZWZveCIpfSx0LmlzT3BlcmFCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIk9wZXJhIil9LHQuaXNFZGdlQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJFZGciKX0sdC5nZXRDaHJvbWVCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiQ2hyb21lIikrNyk7cmV0dXJuIGU/cGFyc2VGbG9hdChlKTotMX0sdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLnN1YnN0cmluZyhuLmluZGV4T2YoIkZpcmVmb3giKSs4KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmlzVmFsaWRMb2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuW3tpZDoiZW5fVVMiLGxhYmVsOiJFbmdsaXNoIn0se2lkOiJkZV9ERSIsbGFiZWw6IkRldXRzY2gifSx7aWQ6ImVzX0VTIixsYWJlbDoiRXNwYcOxb2wifSx7aWQ6ImZyX0ZSIixsYWJlbDoiRnJhbsOnYWlzIn0se2lkOiJqYV9KUCIsbGFiZWw6IuaXpeacrOiqniJ9LHtpZDoiaXRfSVQiLGxhYmVsOiJJdGFsaWFubyJ9LHtpZDoia29fS1IiLGxhYmVsOiLtlZzqta3slrQifSx7aWQ6InB0X0JSIixsYWJlbDoiUG9ydHVndcOqcyJ9LHtpZDoiemhfQ04iLGxhYmVsOiLkuK3mloco566A5L2TKSJ9LHtpZDoiemhfVFciLGxhYmVsOiLkuK3mloco57mB6auUKSJ9XS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSkpLmluY2x1ZGVzKGUpfSx0LmdldE9wZXJhQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLmluZGV4T2YoIk9wZXJhIiksdD0tMSE9PW4uaW5kZXhPZigiVmVyc2lvbiIpP24uc3Vic3RyaW5nKGUrOCk6bi5zdWJzdHJpbmcoZSs2KTtyZXR1cm4gdD9wYXJzZUZsb2F0KHQpOi0xfSx0LmluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7blt0KGUpXT1lfSkpLG59LHQuc2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09MX0pKSx0fSx0LnJlbGF0aXZlQ29tcGxlbWVudD1mdW5jdGlvbihlLG4pe3ZhciByPXt9O3JldHVybiB0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCBpbiBlfHwoclt0XT1uW3RdKX0pKSxyfSx0LmFzc2VydFRydWU9ZnVuY3Rpb24oZSxuKXtpZighZSl0aHJvdyBuZXcgdC5WYWx1ZUVycm9yKG4pfSx0LmFzc2VydE5vdE51bGw9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKG51bGwhPWUmJnZvaWQgMCE9PXR5cGVvZiBlLHQuc3ByaW50ZigiJXMgbXVzdCBiZSBwcm92aWRlZCIsbnx8IkEgdmFsdWUiKSksZX0sdC5kZWVwY29weT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LHQuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50PWZ1bmN0aW9uKGUpe2NvbnN0IG49e307cmV0dXJuIHIuZm9yRWFjaCgocj0+e3RyeXtuW3JdPWVbcl19Y2F0Y2goZSl7dC5nZXRMb2coKS5pbmZvKCJkZWVwY29weUNyb3NzT3JpZ2luRXZlbnQgZmFpbGVkIG9uIGtleTogIixyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSx0LmRlZXBjb3B5KG4pfSx0LmdldEJhc2VVcmw9ZnVuY3Rpb24oKXt2YXIgbj1lLmxvY2F0aW9uO3JldHVybiB0LnNwcmludGYoIiVzLy8lczolcyIsbi5wcm90b2NvbCxuLmhvc3RuYW1lLG4ucG9ydCl9LHQuZ2V0VXJsV2l0aFByb3RvY29sPWZ1bmN0aW9uKG4pe3ZhciByPWUubG9jYXRpb24ucHJvdG9jb2w7cmV0dXJuIG4uc3Vic3RyKDAsci5sZW5ndGgpIT09cj90LnNwcmludGYoIiVzLy8lcyIscixuKTpufSx0LmlzRnJhbWVkPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB3aW5kb3cuc2VsZiE9PXdpbmRvdy50b3B9Y2F0Y2goZSl7cmV0dXJuITB9fSx0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcz1mdW5jdGlvbigpe3JldHVybiB0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz4xfSx0LmZldGNoPWZ1bmN0aW9uKGUsbixyLG8pe3JldHVybiBvPW98fDUscj1yfHwxZTMsbj1ufHx7fSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXshZnVuY3Rpb24gbyhhKXtmZXRjaChlLG4pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5TVUNDRVNTP2UuanNvbigpLnRoZW4oKGU9PmkoZSkpKS5jYXRjaCgoKCk9Pmkoe30pKSk6MSE9PWEmJihlLnN0YXR1cz49dC5IVFRQX1NUQVRVU19DT0RFUy5JTlRFUk5BTF9TRVJWRVJfRVJST1J8fGUuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5UT09fTUFOWV9SRVFVRVNUUyk/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKC0tYSl9KSxyKTpzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfShvKX0pKX0sdC5mZXRjaFdpdGhUaW1lb3V0PWFzeW5jIGZ1bmN0aW9uKGUsbixyLG8saSl7aWYocj1yfHx7fSwhbilyZXR1cm4gdC5mZXRjaChlLHIsbyxpKTtjb25zdCBzPW5ldyBBYm9ydENvbnRyb2xsZXIsYT1zZXRUaW1lb3V0KCgoKT0+cy5hYm9ydCgpKSxuKSxjPWF3YWl0IHQuZmV0Y2goZSx7Li4ucixzaWduYWw6cy5zaWduYWx9LG8saSk7cmV0dXJuIGNsZWFyVGltZW91dChhKSxjfSx0LmJhY2tvZmY9ZnVuY3Rpb24obixyLG8saSl7dC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZnVuYyBtdXN0IGJlIGEgRnVuY3Rpb24iKTt2YXIgcz10aGlzO24oe3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aSYmaS5zdWNjZXNzJiZpLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6ZnVuY3Rpb24odCxhKXtpZihvPjApe3ZhciBjPTIqcipNYXRoLnJhbmRvbSgpO2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLmJhY2tvZmYobiwyKmMsLS1vLGkpfSksYyl9ZWxzZSBpJiZpLmZhaWx1cmUmJmkuZmFpbHVyZSh0LGEpfX0pfSx0LnB1Ymxpc2hNZXRyaWM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJRU5UX01FVFJJQyxkYXRhOmV9KX0sdC5wdWJsaXNoU29mdHBob25lU3RhdHM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1NUQVRTLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1JFUE9SVCxkYXRhOmV9KX0sdC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLkNMSUNLX1NUUkVBTV9EQVRBLGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGllbnRTaWRlTG9ncz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkNMSUVOVF9TSURFX0xPR1MsZSl9LHQuYWRkTmFtZXNwYWNlVG9Mb2dzPWZ1bmN0aW9uKGUpe1sibG9nIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIl0uZm9yRWFjaCgodD0+e2NvbnN0IG49d2luZG93LmNvbnNvbGVbdF07d2luZG93LmNvbnNvbGVbdF09ZnVuY3Rpb24oKXtjb25zdCB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQoYFske2V9XWApLG4uYXBwbHkod2luZG93LmNvbnNvbGUsdCl9fSkpfSx0LlBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe30sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2dldExhc3RPcGVuZWRUaW1lc3RhbXAodCksbz0obmV3IERhdGUpLmdldFRpbWUoKSxpPW51bGw7aWYoby1yPjg2NGU1KXtpZihuKXt2YXIgcz1uLmhlaWdodHx8NTc4LGE9bi53aWR0aHx8NDMzLGM9bi50b3B8fDAsdT1uLmxlZnR8fDA7KGk9d2luZG93Lm9wZW4oIiIsdCwid2lkdGg9IithKyIsIGhlaWdodD0iK3MrIiwgdG9wPSIrYysiLCBsZWZ0PSIrdSkpLmxvY2F0aW9uIT09ZSYmKGk9d2luZG93Lm9wZW4oZSx0LCJ3aWR0aD0iK2ErIiwgaGVpZ2h0PSIrcysiLCB0b3A9IitjKyIsIGxlZnQ9Iit1KSl9ZWxzZShpPXdpbmRvdy5vcGVuKCIiLHQpKS5sb2NhdGlvbiE9PWUmJihpPXdpbmRvdy5vcGVuKGUsdCkpO3RoaXMuX3NldExhc3RPcGVuZWRUaW1lc3RhbXAodCxvKX1yZXR1cm4gaX0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG4pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpLHI9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShuKTtyZXR1cm4gcj9wYXJzZUludChyLDEwKTowfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX3NldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCk7ZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShyLCIiK24pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExvY2FsU3RvcmFnZUtleT1mdW5jdGlvbihlKXtyZXR1cm4iY29ubmVjdFBvcHVwTWFuYWdlcjo6IitlfTt2YXIgbz10Lm1ha2VFbnVtKFsiZ3JhbnRlZCIsImRlbmllZCIsImRlZmF1bHQiXSk7dC5Ob3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5xdWV1ZT1bXSx0aGlzLnBlcm1pc3Npb249by5ERUZBVUxUfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlcXVlc3RQZXJtaXNzaW9uPWZ1bmN0aW9uKCl7dmFyIG49dGhpczsiTm90aWZpY2F0aW9uImluIGU/ZS5Ob3RpZmljYXRpb24ucGVybWlzc2lvbj09PW8uREVOSUVEPyh0LmdldExvZygpLndhcm4oIlRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucy4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucGVybWlzc2lvbj1vLkRFTklFRCk6dGhpcy5wZXJtaXNzaW9uIT09by5HUkFOVEVEJiZlLk5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24ucGVybWlzc2lvbj1lLGU9PT1vLkdSQU5URUQ/bi5fc2hvd1F1ZXVlZCgpOm4ucXVldWU9W119KSk6KHQuZ2V0TG9nKCkud2FybigiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKGUsbil7aWYodGhpcy5wZXJtaXNzaW9uPT09by5HUkFOVEVEKXJldHVybiB0aGlzLl9zaG93SW1wbCh7dGl0bGU6ZSxvcHRpb25zOm59KTtpZih0aGlzLnBlcm1pc3Npb249PT1vLkRFTklFRCl0LmdldExvZygpLndhcm4oIlVuYWJsZSB0byBzaG93IG5vdGlmaWNhdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe3RpdGxlOmUsb3B0aW9uczpufSk7ZWxzZXt2YXIgcj17dGl0bGU6ZSxvcHRpb25zOm59O3QuZ2V0TG9nKCkud2FybigiRGVmZXJyaW5nIG5vdGlmaWNhdGlvbiB1bnRpbCB1c2VyIGRlY2lkZXMgdG8gYWxsb3cgb3IgZGVueS4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5xdWV1ZS5wdXNoKHIpfX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd1F1ZXVlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnF1ZXVlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX3Nob3dJbXBsKHQpfSkpO3JldHVybiB0aGlzLnF1ZXVlPVtdLHR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuX3Nob3dJbXBsPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlLk5vdGlmaWNhdGlvbih0LnRpdGxlLHQub3B0aW9ucyk7cmV0dXJuIHQub3B0aW9ucy5jbGlja2VkJiYobi5vbmNsaWNrPWZ1bmN0aW9uKCl7dC5vcHRpb25zLmNsaWNrZWQuY2FsbChuKX0pLG59LHQuVmFsdWVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlZhbHVlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5WYWx1ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IsRXJyb3IpLHQuVmFsdWVFcnJvci5wcm90b3R5cGUubmFtZT0iVmFsdWVFcnJvciIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvcixFcnJvciksdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZS5uYW1lPSJOb3RJbXBsZW1lbnRlZEVycm9yIix0LlN0YXRlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5TdGF0ZUVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuU3RhdGVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLEVycm9yKSx0LlN0YXRlRXJyb3IucHJvdG90eXBlLm5hbWU9IlN0YXRlRXJyb3IiLHQuVm9pY2VJZEVycm9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gci50eXBlPWUsci5tZXNzYWdlPXQsci5zdGFjaz1FcnJvcih0KS5zdGFjayxyLmVycj1uLHJ9LHQuaXNDQ1A9ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0Ij09PXQuY29yZS5nZXRVcHN0cmVhbSgpLm5hbWV9LHQuaXNTaGFyZWRXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC53b3JrZXImJiEhdC53b3JrZXIuY2xpZW50RW5naW5lfSx0LmlzQ1JNPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNvcmUudXBzdHJlYW0mJnQuY29yZS5nZXRVcHN0cmVhbSgpaW5zdGFuY2VvZiB0LklGcmFtZUNvbmR1aXR9fSgpfSw3MzY6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0Lndvcmtlcj17fTt2YXIgbj0iTEFEUy5HZXRBZ2VudEZhaWxvdmVyQ29uZmlndXJhdGlvbiIscj1mdW5jdGlvbigpe3RoaXMudG9waWNNYXN0ZXJNYXA9e319O3IucHJvdG90eXBlLmdldE1hc3Rlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXXx8bnVsbH0sci5wcm90b3R5cGUuc2V0TWFzdGVyPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdC5hc3NlcnROb3ROdWxsKG4sImlkIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXT1ufSxyLnByb3RvdHlwZS5yZW1vdmVNYXN0ZXI9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsImlkIik7dmFyIG49dGhpczt0LmVudHJpZXModGhpcy50b3BpY01hc3Rlck1hcCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZT09PWV9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZGVsZXRlIG4udG9waWNNYXN0ZXJNYXBbZS5rZXldfSkpfTt2YXIgbz1mdW5jdGlvbihlKXt0LkNsaWVudEJhc2UuY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5DbGllbnRCYXNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dC5jb250YWluc1ZhbHVlKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLGUpP3QuY29yZS5nZXRBZ2VudEFwcENsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGkpLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmZhaWx1cmUodCl9fSk6dC5jb250YWluc1ZhbHVlKHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldFRhc2tUZW1wbGF0ZXNDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpKSxyLnN1Y2Nlc3ModCl9LGZhaWx1cmU6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5mYWlsdXJlKHQpfX0pOnQuY29yZS5nZXRDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGkpLHIuc3VjY2Vzcyh0LG4pfSxmYWlsdXJlOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5mYWlsdXJlKHQsbil9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5hdXRoRmFpbHVyZSgpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24odCxuKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmFjY2Vzc0RlbmllZCYmci5hY2Nlc3NEZW5pZWQoKX19KX0sby5wcm90b3R5cGUuX3JlY29yZEFQSUxhdGVuY3k9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXQ7dGhpcy5fc2VuZEFQSU1ldHJpY3MoZSxyLG4pfSxvLnByb3RvdHlwZS5fc2VuZEFQSU1ldHJpY3M9ZnVuY3Rpb24oZSxuLHIpe2NvbnN0IG89e25hbWU6ZSx0aW1lOm4sZXJyb3I6cixlcnJvcjV4eDowfSxpPXImJnIuc3RhdHVzQ29kZXx8MjAwLHM9ciYmci5yZXRyeVN0YXR1c3x8dC5SZXRyeVN0YXR1cy5OT05FLGE9W3tuYW1lOiJIdHRwU3RhdHVzQ29kZSIsdmFsdWU6aX0se25hbWU6Ikh0dHBHZW5lcmljU3RhdHVzQ29kZSIsdmFsdWU6YCR7aS50b1N0cmluZygpLmNoYXJBdCgwKX1YWGB9LHtuYW1lOiJSZXRyeVN0YXR1cyIsdmFsdWU6c31dOyI1Ij09PWkudG9TdHJpbmcoKS5jaGFyQXQoMCkmJihvLmVycm9yNXh4PTEpLHRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLHsuLi5vLGRpbWVuc2lvbnM6W3tuYW1lOiJDYXRlZ29yeSIsdmFsdWU6IkFQSSJ9XSxvcHRpb25hbERpbWVuc2lvbnM6YX0pfTt2YXIgaT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5tdWx0aXBsZXhlcj1uZXcgdC5TdHJlYW1NdWx0aXBsZXhlcix0aGlzLmNvbmR1aXQ9bmV3IHQuQ29uZHVpdCgiQW1hem9uQ29ubmVjdFNoYXJlZFdvcmtlciIsbnVsbCx0aGlzLm11bHRpcGxleGVyKSx0aGlzLmNsaWVudD1uZXcgbyh0aGlzLmNvbmR1aXQpLHRoaXMudGltZW91dD1udWxsLHRoaXMuYWdlbnQ9bnVsbCx0aGlzLm5leHRUb2tlbj1udWxsLHRoaXMuaW5pdERhdGE9e30sdGhpcy5wb3J0Q29uZHVpdE1hcD17fSx0aGlzLnN0cmVhbU1hcEJ5VGFiSWQ9e30sdGhpcy5tYXN0ZXJDb29yZD1uZXcgcix0aGlzLmxvZ3NCdWZmZXI9W10sdGhpcy5zdXBwcmVzcz0hMSx0aGlzLmZvcmNlT2ZmbGluZT0hMSx0aGlzLmxvbmdQb2xsaW5nT3B0aW9ucz17YWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU6ITEsYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlOiExfSx0aGlzLmRyUG9sbGluZ1VybD1udWxsLHRoaXMudGhpc0Fybj1udWxsLHRoaXMub3RoZXJBcm49bnVsbCx0aGlzLnBlbmRpbmdGYWlsb3Zlcj1udWxsO3ZhciBpPW51bGw7dC5yb290TG9nZ2VyPW5ldyB0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyKHRoaXMuY29uZHVpdCksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkucHVzaExvZ3NEb3duc3RyZWFtKGUpLG4ubG9nc0J1ZmZlcj1uLmxvZ3NCdWZmZXIuY29uY2F0KGUpLG4ubG9nc0J1ZmZlci5sZW5ndGg+NDAwJiZuLmhhbmRsZVNlbmRMb2dzUmVxdWVzdChuLmxvZ3NCdWZmZXIpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLChmdW5jdGlvbihlKXt0LmdldExvZygpLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNldHRpbmcgU3VwcHJlc3MgdG8gJXMiLGUuc3VwcHJlc3MpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz1lLnN1cHByZXNzfHwhMSxuLnN1cHByZXNzfHwobi5mb3JjZU9mZmxpbmU9ITEpLCh2b2lkIDA9PT1lLnNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW18fGUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbSkmJm4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohbi5zdXBwcmVzc30pfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBGT1JDRV9PRkZMSU5FIHRvICVzIixlLm9mZmxpbmUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5mb3JjZU9mZmxpbmV8fChuLnBlbmRpbmdGYWlsb3Zlcj0hMSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtpc1ByaW1hcnk6ITEsbmV4dEFjdGl2ZUFybjplLm5leHRBY3RpdmVBcm59KSksbi5mb3JjZU9mZmxpbmU9ZS5vZmZsaW5lfHwhMX0pKSx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HJiZ0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcsKGZ1bmN0aW9uKGUpe3ZhciByPXQuZ2V0TG9nKCk7bi5kclBvbGxpbmdVcmw/KHIuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gQWRkaW5nIG5ldyBDQ1AgdG8gYWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBY3RpdmVSZWdpb24oITAsITEpKTooci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4udGhpc0Fybj1lLmluc3RhbmNlQXJuLG4ub3RoZXJBcm49ZS5vdGhlckFybixuLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntuLmRyUG9sbGluZ1VybD1lLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMCl9KSwodD0+e3IuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIGdldCBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59OyBzdXBwcmVzc2luZyBjb250YWN0c2ApLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPSEwfSkpKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7Y29uc29sZS5sb2coIkBAQCBjb25maWd1cmUgZXZlbnQgaGFuZGxlciIscik7dHJ5e3IuYXV0aFRva2VuJiZyLmF1dGhUb2tlbiE9PW4uaW5pdERhdGEuYXV0aFRva2VuJiYobi5pbml0RGF0YT1yLHQuY29yZS5pbml0KHIpLHIubG9uZ1BvbGxpbmdPcHRpb25zJiYoImJvb2xlYW4iPT10eXBlb2Ygci5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZT1yLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSksImJvb2xlYW4iPT10eXBlb2Ygci5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlJiYobi5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlPXIubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZSkpLGk/dC5nZXRMb2coKS5pbmZvKCJOb3QgSW5pdGlhbGl6aW5nIGEgbmV3IFdlYnNvY2tldE1hbmFnZXIgaW5zdGFuY2UsIHNpbmNlIG9uZSBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6KHQuZ2V0TG9nKCkuaW5mbygiQ3JlYXRpbmcgYSBuZXcgV2Vic29ja2V0IGNvbm5lY3Rpb24gZm9yIENDUCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5XZWJTb2NrZXRNYW5hZ2VyLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6dC5nZXRMb2coKX19KSwoaT10LldlYlNvY2tldE1hbmFnZXIuY3JlYXRlKCkpLm9uSW5pdEZhaWx1cmUoKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSl9KSksaS5vbkNvbm5lY3Rpb25PcGVuKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLGUpfSkpLGkub25Db25uZWN0aW9uQ2xvc2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLGUpfSkpLGkub25Db25uZWN0aW9uR2FpbigoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4pfSkpLGkub25Db25uZWN0aW9uTG9zdCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULGUpfSkpLGkub25TdWJzY3JpcHRpb25VcGRhdGUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLGUpfSkpLGkub25TdWJzY3JpcHRpb25GYWlsdXJlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsZSl9KSksaS5vbkFsbE1lc3NhZ2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSxlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsKGZ1bmN0aW9uKGUpe2kuc2VuZE1lc3NhZ2UoZSl9KSksbi5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsKGZ1bmN0aW9uKGUpe2kuc3Vic2NyaWJlVG9waWNzKGUpfSkpLGkuaW5pdCh0LmhpdGNoKG4sbi5nZXRXZWJTb2NrZXRVcmwpKS50aGVuKChmdW5jdGlvbihyKXt0cnl7aWYociYmIXIud2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZCl0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGFnZW50IHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFnZW50KCksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBjb25maWcgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKHtyZXBlYXRGb3JldmVyOiEwfSksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBhdXRoIHRva2VuIHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc2V0SW50ZXJ2YWwodC5oaXRjaChuLG4uY2hlY2tBdXRoVG9rZW4pLDNlNSk7ZWxzZSBpZighdC53ZWJTb2NrZXRJbml0RmFpbGVkKXtjb25zdCBlPXQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRTt0aHJvdyBuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0oZSksdC53ZWJTb2NrZXRJbml0RmFpbGVkPSEwLG5ldyBFcnJvcihlKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiV2ViU29ja2V0IGZhaWxlZCB0byBpbml0aWFsaXplIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSkpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkBAQCBlcnJvciIsZSl9fSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFLChmdW5jdGlvbigpe24uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlciksdC5jb3JlLnRlcm1pbmF0ZSgpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEVEKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1QsKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlLmV2ZW50LGUuZGF0YSl9KSksZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wb3J0c1swXSxvPW5ldyB0LlBvcnRTdHJlYW0ocik7bi5tdWx0aXBsZXhlci5hZGRTdHJlYW0obyksci5zdGFydCgpO3ZhciBpPW5ldyB0LkNvbmR1aXQoby5nZXRJZCgpLG51bGwsbyk7aS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSx7aWQ6by5nZXRJZCgpfSksbi5wb3J0Q29uZHVpdE1hcFtvLmdldElkKCldPWksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx7bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0pLG51bGwhPT1uLmFnZW50JiZuLnVwZGF0ZUFnZW50KCksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlQVBJUmVxdWVzdCxpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlTWFzdGVyUmVxdWVzdCxpLG8uZ2V0SWQoKSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQsdC5oaXRjaChuLG4uaGFuZGxlVGFiSWRFdmVudCxvKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UsdC5oaXRjaChuLG4uaGFuZGxlQ2xvc2VFdmVudCxvKSl9fTtpLnByb3RvdHlwZS5wb2xsRm9yQWN0aXZlUmVnaW9uPWZ1bmN0aW9uKHIsbyl7dmFyIGk9dGhpcyxzPXQuZ2V0TG9nKCk7aWYoIWkuZHJQb2xsaW5nVXJsKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVHJpZWQgdG8gcG9sbCBmb3IgYWN0aXZlIHJlZ2lvbiB3aXRob3V0IGZpcnN0IGluaXRpYWxpemluZyBEUiBwb2xsaW5nIGluIHRoZSB3b3JrZXIuIik7cy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBQb2xsaW5nIGZvciBmYWlsb3ZlciB3aXRoIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpLmNhdGNoKChlPT57aWYoZS5zdGF0dXMpe2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7c3RhdHVzQ29kZTplLnN0YXR1c30pLFt0LkhUVFBfU1RBVFVTX0NPREVTLkFDQ0VTU19ERU5JRUQsdC5IVFRQX1NUQVRVU19DT0RFUy5VTkFVVEhPUklaRURdLmluY2x1ZGVzKGUuc3RhdHVzKSlyZXR1cm4gcy5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQ7IHRyeWluZyB0byBnZXQgYSBuZXcgVVJMIGZvciBwb2xsaW5nLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntpLmRyUG9sbGluZ1VybD1lfSkpLnRoZW4oKCgpPT4oYT0obmV3IERhdGUpLmdldFRpbWUoKSx0LmZldGNoV2l0aFRpbWVvdXQoaS5kclBvbGxpbmdVcmwsMWU0KSkpKTt2YXIgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVjZWl2ZWQgdW5leHBlY3RlZCByZXNwb25zZSBjb2RlICR7ZS5zdGF0dXN9YDt0aHJvdyBzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9dGhyb3cgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVxdWVzdCB0aW1lZCBvdXQgb3IgYWJvcnRlZGAsaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOi0xfSkscy5lcnJvcihyKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbmV3IEVycm9yKHIpfSkpLnRoZW4oKGU9PntpZihpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEpLCJib29sZWFuIj09dHlwZW9mIGUuVGVybWluYXRlQWN0aXZlQ29udGFjdHMpe3ZhciBjPSFlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzO2lmKGUuSW5zdGFuY2VBcm4paWYocy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBTdWNjZXNzZnVsbHkgcG9sbGVkIGZvciBhY3RpdmUgcmVnaW9uLiBQcmltYXJ5IGluc3RhbmNlIEFSTiBpcyAke2UuSW5zdGFuY2VBcm59IGFuZCBzb2Z0IGZhaWxvdmVyIGlzIGArKGM/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkudGhpc0Fybj09PWUuSW5zdGFuY2VBcm4mJiFpLnN1cHByZXNzJiZyKXMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBwcmltYXJ5YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KTtlbHNlIGlmKGkub3RoZXJBcm49PT1lLkluc3RhbmNlQXJuKXtpZighY3x8b3x8IXJ8fGkuc3VwcHJlc3MmJiFpLnBlbmRpbmdGYWlsb3Zlcnx8aS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjppLnRoaXNBcm59KSwhaS5zdXBwcmVzcyl7aS5zdXBwcmVzcz0hMDtjb25zdCBuPWMmJiFvO24/KGkucGVuZGluZ0ZhaWxvdmVyPSEwLHMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IHdpbGwgYmUgc2V0IHRvIHN0YW5kLWJ5IHVzaW5nIHNvZnQgZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSBpcyBiZWluZyBzZXQgdG8gc3RhbmQtYnkgaW1tZWRpYXRlbHlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7c29mdEZhaWxvdmVyOm4sbmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSl9fWVsc2VbaS50aGlzQXJuLGkub3RoZXJBcm5dLmluY2x1ZGVzKGUuSW5zdGFuY2VBcm4pfHxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFRoZSBjdXJyZW50IHByaW1hcnkgaW5zdGFuY2UgaW4gdGhpcyBhZ2VudCdzIGZhaWxvdmVyIGdyb3VwICR7ZS5JbnN0YW5jZUFybn0gZG9lc24ndCBtYXRjaCB0aGlzIGluc3RhbmNlICR7aS50aGlzQXJufSBvciB0aGUgb3RoZXIgaW5zdGFuY2UgJHtpLm90aGVyQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdHJ1dGh5IGFjdGl2ZSBpbnN0YW5jZSBBUk4uIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugcy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBEUiBwb2xsaW5nIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHZhbHVlIGZvciBUZXJtaW5hdGVBY3RpdmVDb250YWN0cy4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGU9PntlLnN0YXR1cyYmaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHsuLi5lLHN0YXR1c0NvZGU6ZS5zdGF0dXN9KSxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufS5gKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuZmluYWxseSgoKCk9PnshbyYmcnx8ZS5zZXRUaW1lb3V0KHQuaGl0Y2goaSxpLnBvbGxGb3JBY3RpdmVSZWdpb24pLDZlNCl9KSl9LGkucHJvdG90eXBlLmdldFByZXNpZ25lZERpc2NvdmVyeVVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBHZXR0aW5nIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5BR0VOVF9ESVNDT1ZFUll9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQucHJlc2lnbmVkVXJsPyh0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmwpKToodC5nZXRMb2coKS5pbmZvKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgcmVjZWl2ZWQgZW1wdHkvaW52YWxpZCBkYXRhIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoRXJyb3IoImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKSkpfSxmYWlsdXJlOmZ1bmN0aW9uKG4sbyl7dC5nZXRMb2coKS5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobmV3IEVycm9yKCJGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGF1dGggZmFpbHVyZSB3aGVuIGdldHRpbmcgcHJlc2lnbmVkIFVSTCIpKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKSgpLHIobmV3IEVycm9yKCJFbmNvdW50ZXJlZCBhY2Nlc3MgZGVuaWVkIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfX0pfSkpfSxpLnByb3RvdHlwZS5wb2xsRm9yQWdlbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9dC5oaXRjaChuLG4uaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1Qse25leHRUb2tlbjpuLm5leHRUb2tlbix0aW1lb3V0OjNlNH0se3N1Y2Nlc3M6ZnVuY3Rpb24ocixvKXt0cnl7bi5hZ2VudD1uLmFnZW50fHx7fSxuLmFnZW50LnNuYXBzaG90PXIuc25hcHNob3Qsbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcD10Lm5vdygpLG4uYWdlbnQuc25hcHNob3Quc2tldz1uLmFnZW50LnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wLW4uYWdlbnQuc25hcHNob3QubG9jYWxUaW1lc3RhbXAsbi5uZXh0VG9rZW49ci5uZXh0VG9rZW4sbyYmby5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpJiYobi5hZ2VudC5zbmFwc2hvdC5jb250ZW50TGVuZ3RoPW8uY29udGVudExlbmd0aCksdC5nZXRMb2coKS50cmFjZSgiR0VUX0FHRU5UX1NOQVBTSE9UIHN1Y2NlZWRlZC4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi51cGRhdGVBZ2VudCgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkxvbmcgcG9sbCBmYWlsZWQgdG8gdXBkYXRlIGFnZW50LiIpLndpdGhPYmplY3Qocikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWZpbmFsbHl7ZS5zZXRUaW1lb3V0KHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudCksMTAwKX19LGZhaWx1cmU6ZnVuY3Rpb24ocixvKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGdldCBhZ2VudCBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOnIsZGF0YTpvfSl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSw1ZTMpfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtyKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKG4sbi5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxvPW58fHt9LGk9dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix7fSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT1uLmNvbmZpZ3VyYXRpb247ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhpKSxyLnBvbGxGb3JBZ2VudFN0YXRlcyhpKSxyLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhpKSxyLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhpKSxvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uLG8pLDNlNCl9LGZhaWx1cmU6ZnVuY3Rpb24obixpKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IGNvbmZpZ3VyYXRpb24gZGF0YS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjpuLGRhdGE6aX0pfWZpbmFsbHl7by5yZXBlYXRGb3JldmVyJiZlLnNldFRpbWVvdXQodC5oaXRjaChyLHIucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbiksM2U0LG8pfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtpKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLnBvbGxGb3JBZ2VudFN0YXRlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50U3RhdGVzKGUse3N0YXRlczooby5zdGF0ZXN8fFtdKS5jb25jYXQodC5zdGF0ZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLmFnZW50U3RhdGVzPShvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHN0YXRlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvckFnZW50UGVybWlzc2lvbnM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50UGVybWlzc2lvbnMoZSx7cGVybWlzc2lvbnM6KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucGVybWlzc2lvbnM9KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHBlcm1pc3Npb25zIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxpLnByb3RvdHlwZS5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXMoZSx7Y291bnRyeUNvZGVzOihvLmNvdW50cnlDb2Rlc3x8W10pLmNvbmNhdCh0LmNvdW50cnlDb2RlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuZGlhbGFibGVDb3VudHJpZXM9KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggZGlhbGFibGUgY291bnRyeSBjb2RlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTLHtyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLG5leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXMoZSx7Y291bnRyeUNvZGVzOihvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucm91dGluZ1Byb2ZpbGUucXVldWVzPShvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJvdXRpbmcgcHJvZmlsZSBxdWV1ZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLmhhbmRsZUFQSVJlcXVlc3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RoaXMuY2xpZW50LmNhbGwobi5tZXRob2Qsbi5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4scik7ZS5zZW5kRG93bnN0cmVhbShvLmV2ZW50LG8pfSxmYWlsdXJlOmZ1bmN0aW9uKG8saSl7dmFyIHM9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4saSxKU09OLnN0cmluZ2lmeShvKSk7ZS5zZW5kRG93bnN0cmVhbShzLmV2ZW50LHMpLHQuZ2V0TG9nKCkuZXJyb3IoIiclcycgQVBJIHJlcXVlc3QgZmFpbGVkIixuLm1ldGhvZCkud2l0aE9iamVjdCh7cmVxdWVzdDpyLmZpbHRlckF1dGhUb2tlbihuKSxyZXNwb25zZTpzfSkud2l0aEV4Y2VwdGlvbihvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVBdXRoRmFpbCx7YXV0aG9yaXplOiEwfSl9KX0saS5wcm90b3R5cGUuaGFuZGxlTWFzdGVyUmVxdWVzdD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcy5jb25kdWl0LGk9bnVsbDtzd2l0Y2goci5tZXRob2Qpe2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVI6dmFyIHM9dGhpcy5tYXN0ZXJDb29yZC5nZXRNYXN0ZXIoci5wYXJhbXMudG9waWMpLGE9Qm9vbGVhbihzKSYmcyE9PW47dGhpcy5tYXN0ZXJDb29yZC5zZXRNYXN0ZXIoci5wYXJhbXMudG9waWMsbiksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6bix0YWtlT3ZlcjphLHRvcGljOnIucGFyYW1zLnRvcGljfSksYSYmby5zZW5kRG93bnN0cmVhbShpLmV2ZW50LGkpO2JyZWFrO2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkNIRUNLX01BU1RFUjoocz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYykpfHxyLnBhcmFtcy5zaG91bGROb3RCZWNvbWVNYXN0ZXJJZk5vbmV8fCh0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxzPW4pLGk9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLHIse21hc3RlcklkOnMsaXNNYXN0ZXI6bj09PXMsdG9waWM6ci5wYXJhbXMudG9waWN9KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBtYXN0ZXIgbWV0aG9kOiAiK3IubWV0aG9kKX1lLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSl9LGkucHJvdG90eXBlLmhhbmRsZVRhYklkRXZlbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RyeXtsZXQgbz1uLnRhYklkLGk9ci5zdHJlYW1NYXBCeVRhYklkW29dLHM9ZS5nZXRJZCgpLGE9T2JqZWN0LmtleXMoci5zdHJlYW1NYXBCeVRhYklkKS5maWx0ZXIoKGU9PnIuc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtpZihpJiZpLmxlbmd0aD4wKXtpZighaS5pbmNsdWRlcyhzKSl7ci5zdHJlYW1NYXBCeVRhYklkW29dLnB1c2gocyk7bGV0IGU9e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6YX07ZVtvXT17bGVuZ3RoOmkubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLGUpfX1lbHNle3Iuc3RyZWFtTWFwQnlUYWJJZFtvXT1bZS5nZXRJZCgpXTtsZXQgbj17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphKzF9O25bb109e2xlbmd0aDpyLnN0cmVhbU1hcEJ5VGFiSWRbb10ubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLG4pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgY29ubmVjdGVkIENDUHMgd2l0aGluIHRoZSBzYW1lIHRhYiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19LGkucHJvdG90eXBlLmhhbmRsZUNsb3NlRXZlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLm11bHRpcGxleGVyLnJlbW92ZVN0cmVhbShlKSxkZWxldGUgbi5wb3J0Q29uZHVpdE1hcFtlLmdldElkKCldLG4ubWFzdGVyQ29vcmQucmVtb3ZlTWFzdGVyKGUuZ2V0SWQoKSk7bGV0IHI9e2xlbmd0aDpPYmplY3Qua2V5cyhuLnBvcnRDb25kdWl0TWFwKS5sZW5ndGh9LG89T2JqZWN0LmtleXMobi5zdHJlYW1NYXBCeVRhYklkKTt0cnl7bGV0IHQ9by5maW5kKCh0PT5uLnN0cmVhbU1hcEJ5VGFiSWRbdF0uaW5jbHVkZXMoZS5nZXRJZCgpKSkpO2lmKHQpe2xldCBvPW4uc3RyZWFtTWFwQnlUYWJJZFt0XS5maW5kSW5kZXgoKHQ9PmUuZ2V0SWQoKT09PXQpKTtuLnN0cmVhbU1hcEJ5VGFiSWRbdF0uc3BsaWNlKG8sMSk7bGV0IGk9bi5zdHJlYW1NYXBCeVRhYklkW3RdP24uc3RyZWFtTWFwQnlUYWJJZFt0XS5sZW5ndGg6MDtyW3RdPXtsZW5ndGg6aX0sci50YWJJZD10fWxldCBpPW8uZmlsdGVyKChlPT5uLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjApKS5sZW5ndGg7ci5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI9aX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgdGFiSWQtc3BlY2lmaWMgc3RyZWFtIGRhdGEiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxyKX0saS5wcm90b3R5cGUudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUpe2UucGVybWlzc2lvbnMmJmUuZGlhbGFibGVDb3VudHJpZXMmJmUuYWdlbnRTdGF0ZXMmJmUucm91dGluZ1Byb2ZpbGUucXVldWVzPyh0aGlzLmFnZW50PXRoaXMuYWdlbnR8fHt9LHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbj1lLHRoaXMudXBkYXRlQWdlbnQoKSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgY29uZmlndXJhdGlvbiB1bnRpbCBhbGwgY29uZmlnIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxpLnByb3RvdHlwZS51cGRhdGVBZ2VudD1mdW5jdGlvbigpe3RoaXMuYWdlbnQ/dGhpcy5hZ2VudC5zbmFwc2hvdD90aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24/KHRoaXMuYWdlbnQuc25hcHNob3Quc3RhdHVzPXRoaXMuYWdlbnQuc3RhdGUsdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cyYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5sZW5ndGg+MSYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCktdC5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9ZS5zdGF0ZSxlLmNvbm5lY3Rpb25zLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYWRkcmVzcz1lLmVuZHBvaW50fSkpfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUFSTix0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucXVldWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucXVldWVJZD1lLnF1ZXVlQVJOfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5xdWV1ZSYmKGUucXVldWUucXVldWVJZD1lLnF1ZXVlLnF1ZXVlQVJOKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sdGhpcy5zdXBwcmVzcyYmKHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHM9dGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR8fGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkVOREVEfSkpLHRoaXMuZm9yY2VPZmZsaW5lJiZ0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUpKSx0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5VUERBVEUsdGhpcy5hZ2VudCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBzbmFwc2hvdCBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgaGFzIGJlZW4gZnVsbHkgY29uc3RydWN0ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0saS5wcm90b3R5cGUuZ2V0V2ViU29ja2V0VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQuY29yZS5nZXRDbGllbnQoKSxyPXQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKSxvPXQuaGl0Y2goZSxlLmhhbmRsZUFjY2Vzc0RlbmllZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfU09DS0VUfSx7c3VjY2VzczpmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImdldFdlYlNvY2tldFVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KSxpKHtyZWFzb246ImdldFdlYlNvY2tldFVybCBmYWlsZWQiLF9kZWJ1ZzplfSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEF1dGggRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLHIoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEFjY2VzcyBEZW5pZWQgRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQWNjZXNzIERlbmllZCBGYWlsdXJlIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLG8oKX19KX0pKX0saS5wcm90b3R5cGUuaGFuZGxlU2VuZExvZ3NSZXF1ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPVtdLHI9ZS5sb2dzQnVmZmVyLnNsaWNlKCk7ZS5sb2dzQnVmZmVyPVtdLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5wdXNoKHt0aW1lc3RhbXA6ZS50aW1lLGNvbXBvbmVudDplLmNvbXBvbmVudCxtZXNzYWdlOmUudGV4dH0pfSkpLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1Mse2xvZ0V2ZW50czpufSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlNlbmRMb2dzIHJlcXVlc3Qgc3VjY2VlZGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJTZW5kTG9ncyByZXF1ZXN0IGZhaWxlZC4iKS53aXRoT2JqZWN0KG4pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sYXV0aEZhaWx1cmU6dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpfSl9LGkucHJvdG90eXBlLmhhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2U/dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKTp0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMKX0saS5wcm90b3R5cGUuaGFuZGxlUG9sbGluZ0F1dGhGYWlsPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSxpLnByb3RvdHlwZS5oYW5kbGVBY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCl9LGkucHJvdG90eXBlLmNoZWNrQXV0aFRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPW5ldyBEYXRlKGUuaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbikscj0obmV3IERhdGUpLmdldFRpbWUoKTtuLmdldFRpbWUoKTxyKzE4ZTUmJih0LmdldExvZygpLmluZm8oIkF1dGggdG9rZW4gZXhwaXJlcyBhdCAiK24rIiBTdGFydCByZWZyZXNoaW5nIHRva2VuIHdpdGggcmV0cnkuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmJhY2tvZmYodC5oaXRjaChlLGUuYXV0aG9yaXplKSwxZTQsNCkpfSxpLnByb3RvdHlwZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmNvcmUuYXV0aG9yaXplKHRoaXMuaW5pdERhdGEuYXV0aG9yaXplRW5kcG9pbnQpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBvPW5ldyBEYXRlKHIuZXhwaXJhdGlvbik7dC5nZXRMb2coKS5pbmZvKCJBdXRob3JpemF0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHRva2VuIGV4cGlyZXMgYXQgJXMiLG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5pbml0RGF0YS5hdXRoVG9rZW49ci5hY2Nlc3NUb2tlbixuLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb249byx0LmNvcmUuaW5pdENsaWVudChuLmluaXREYXRhKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KG4uaW5pdERhdGEpLGUuc3VjY2VzcygpfSkpLmNhdGNoKChmdW5jdGlvbihyKXt0LmdldExvZygpLmVycm9yKCJBdXRob3JpemF0aW9uIGZhaWxlZCB3aXRoIGNvZGUgJXMiLHIuc3RhdHVzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDQwMT09PXIuc3RhdHVzP24uaGFuZGxlQXV0aEZhaWwoKTplLmZhaWx1cmUoKX0pKX0saS5wcm90b3R5cGUuZmlsdGVyQXV0aFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKWlmKCJwYXJhbXMiPT09bil7dmFyIHI9e307Zm9yKHZhciBvIGluIGUucGFyYW1zKSJhdXRoZW50aWNhdGlvbiIhPT1vJiYocltvXT1lLnBhcmFtc1tvXSk7dC5wYXJhbXM9cn1lbHNlIHRbbl09ZVtuXTtyZXR1cm4gdH0sdC53b3JrZXIubWFpbj1mdW5jdGlvbigpe3Qud29ya2VyLmNsaWVudEVuZ2luZT1uZXcgaX19KCl9fSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIG89dFtyXTtpZih2b2lkIDAhPT1vKXJldHVybiBvLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLG4oODI3KSxuKDE2Myksbig5NDQpLG4oMTUxKSxuKDg5MSksbig1OTIpLG4oODIpLG4oNzU0KSxuKDgzMyksbigxNjEpLG4oOTY1KSxuKDI4Niksbig4OTUpLG4oNzQzKSxuKDY0Miksbig3MzYpLG4oNDM5KSxuKDI3OSksbig0MTgpLG4oMTg3KSxuKDgyMSksbig1MDApfSkoKTs="),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","","