@gudhub/core 1.2.4-beta.33 → 1.2.4-beta.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/umd/127.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(()=>{"use strict";var __webpack_modules__={9127:module=>{eval('module.exports = "data:application/javascript;base64,KCgpPT57dmFyIF9fd2VicGFja19tb2R1bGVzX189ezk2Njk6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwOSk7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9pbmRleC5qcz8iKTt9LDU0NDg6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2Nyk7XG52YXIgc2V0dGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDI2KTtcbnZhciBjb29raWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzcyKTtcbnZhciBidWlsZFVSTCA9IF9fd2VicGFja19yZXF1aXJlX18oNTMyNyk7XG52YXIgYnVpbGRGdWxsUGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNDA5Nyk7XG52YXIgcGFyc2VIZWFkZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MTA5KTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5ODUpO1xudmFyIGNyZWF0ZUVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDYxKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ID8gcGFyc2VIZWFkZXJzKHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpIDogbnVsbDtcbiAgICAgIHZhciByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8ICByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCdvbmxvYWRlbmQnIGluIHJlcXVlc3QpIHtcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICB2YXIgdGltZW91dEVycm9yTWVzc2FnZSA9ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCc7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGNvbmZpZy50cmFuc2l0aW9uYWwgJiYgY29uZmlnLnRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gJ0VUSU1FRE9VVCcgOiAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4ucHJvbWlzZS50aGVuKGZ1bmN0aW9uIG9uQ2FuY2VsZWQoY2FuY2VsKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVqZWN0KGNhbmNlbCk7XG4gICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3REYXRhKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz8iKTt9LDE2MDk6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnXG5cbnZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2Nyk7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTg0OSk7XG52YXIgQXhpb3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyMSk7XG52YXIgbWVyZ2VDb25maWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxODUpO1xudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjU1KTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgdmFyIGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIHZhciBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoYXhpb3MuZGVmYXVsdHMsIGluc3RhbmNlQ29uZmlnKSk7XG59O1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IF9fd2VicGFja19yZXF1aXJlX18oNTI2Myk7XG5heGlvcy5DYW5jZWxUb2tlbiA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3Mik7XG5heGlvcy5pc0NhbmNlbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUwMik7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5heGlvcy5zcHJlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg3MTMpO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyNjgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBheGlvcztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzPycpO30sNTI2Mzptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanM/Iik7fSw0OTcyOihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgQ2FuY2VsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MjYzKTtcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBDYW5jZWxUb2tlbihleGVjdXRvcikge1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIHJlc29sdmVQcm9taXNlO1xuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAqL1xuQ2FuY2VsVG9rZW4uc291cmNlID0gZnVuY3Rpb24gc291cmNlKCkge1xuICB2YXIgY2FuY2VsO1xuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgIGNhbmNlbCA9IGM7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWxUb2tlbjtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz8iKTt9LDY1MDI6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvaXNDYW5jZWwuanM/Iik7fSwzMjE6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2Nyk7XG52YXIgYnVpbGRVUkwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUzMjcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNzgyKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1NzIpO1xudmFyIG1lcmdlQ29uZmlnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MTg1KTtcbnZhciB2YWxpZGF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4NzUpO1xuXG52YXIgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gQXhpb3MoaW5zdGFuY2VDb25maWcpIHtcbiAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICB9O1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICovXG5BeGlvcy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIHJlcXVlc3QoY29uZmlnKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZyA9IGFyZ3VtZW50c1sxXSB8fCB7fTtcbiAgICBjb25maWcudXJsID0gYXJndW1lbnRzWzBdO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgfVxuXG4gIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gY29uZmlnLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdHMubWV0aG9kKSB7XG4gICAgY29uZmlnLm1ldGhvZCA9IHRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnLm1ldGhvZCA9ICdnZXQnO1xuICB9XG5cbiAgdmFyIHRyYW5zaXRpb25hbCA9IGNvbmZpZy50cmFuc2l0aW9uYWw7XG5cbiAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnModHJhbnNpdGlvbmFsLCB7XG4gICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuLCAnMS4wLjAnKSxcbiAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4sICcxLjAuMCcpLFxuICAgICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuLCAnMS4wLjAnKVxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgdmFyIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gIHZhciBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHZhciByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdmFyIHByb21pc2U7XG5cbiAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICB2YXIgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LCB1bmRlZmluZWRdO1xuXG4gICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICBjaGFpbiA9IGNoYWluLmNvbmNhdChyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGgpIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW4uc2hpZnQoKSwgY2hhaW4uc2hpZnQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuXG4gIHZhciBuZXdDb25maWcgPSBjb25maWc7XG4gIHdoaWxlIChyZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGgpIHtcbiAgICB2YXIgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpO1xuICAgIHZhciBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKTtcbiAgICB0cnkge1xuICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgb25SZWplY3RlZChlcnJvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QobmV3Q29uZmlnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICB9XG5cbiAgd2hpbGUgKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGgpIHtcbiAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbkF4aW9zLnByb3RvdHlwZS5nZXRVcmkgPSBmdW5jdGlvbiBnZXRVcmkoY29uZmlnKSB7XG4gIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gIHJldHVybiBidWlsZFVSTChjb25maWcudXJsLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlxcPy8sICcnKTtcbn07XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF4aW9zO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcz8iKTt9LDc4MjoobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkLFxuICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanM/Iik7fSw0MDk3Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgaXNBYnNvbHV0ZVVSTCA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5Myk7XG52YXIgY29tYmluZVVSTHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMDMpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz8iKTt9LDUwNjE6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBlbmhhbmNlRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4MSk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVycm9yKG1lc3NhZ2UsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzPyIpO30sMzU3MjoobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTI3KTtcbnZhciBpc0NhbmNlbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUwMik7XG52YXIgZGVmYXVsdHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2NTUpO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIC8vIEVuc3VyZSBoZWFkZXJzIGV4aXN0XG4gIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge307XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLmRhdGEsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgY29uZmlnLmhlYWRlcnMgPSB1dGlscy5tZXJnZShcbiAgICBjb25maWcuaGVhZGVycy5jb21tb24gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNcbiAgKTtcblxuICB1dGlscy5mb3JFYWNoKFxuICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5oZWFkZXJzW21ldGhvZF07XG4gICAgfVxuICApO1xuXG4gIHZhciBhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcjtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLmRhdGEsXG4gICAgICByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcz8iKTt9LDQ4MTptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIGVycm9yLmlzQXhpb3NFcnJvciA9IHRydWU7XG5cbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29kZTogdGhpcy5jb2RlXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGVycm9yO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzPyIpO30sNzE4NToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMiA9IGNvbmZpZzIgfHwge307XG4gIHZhciBjb25maWcgPSB7fTtcblxuICB2YXIgdmFsdWVGcm9tQ29uZmlnMktleXMgPSBbJ3VybCcsICdtZXRob2QnLCAnZGF0YSddO1xuICB2YXIgbWVyZ2VEZWVwUHJvcGVydGllc0tleXMgPSBbJ2hlYWRlcnMnLCAnYXV0aCcsICdwcm94eScsICdwYXJhbXMnXTtcbiAgdmFyIGRlZmF1bHRUb0NvbmZpZzJLZXlzID0gW1xuICAgICdiYXNlVVJMJywgJ3RyYW5zZm9ybVJlcXVlc3QnLCAndHJhbnNmb3JtUmVzcG9uc2UnLCAncGFyYW1zU2VyaWFsaXplcicsXG4gICAgJ3RpbWVvdXQnLCAndGltZW91dE1lc3NhZ2UnLCAnd2l0aENyZWRlbnRpYWxzJywgJ2FkYXB0ZXInLCAncmVzcG9uc2VUeXBlJywgJ3hzcmZDb29raWVOYW1lJyxcbiAgICAneHNyZkhlYWRlck5hbWUnLCAnb25VcGxvYWRQcm9ncmVzcycsICdvbkRvd25sb2FkUHJvZ3Jlc3MnLCAnZGVjb21wcmVzcycsXG4gICAgJ21heENvbnRlbnRMZW5ndGgnLCAnbWF4Qm9keUxlbmd0aCcsICdtYXhSZWRpcmVjdHMnLCAndHJhbnNwb3J0JywgJ2h0dHBBZ2VudCcsXG4gICAgJ2h0dHBzQWdlbnQnLCAnY2FuY2VsVG9rZW4nLCAnc29ja2V0UGF0aCcsICdyZXNwb25zZUVuY29kaW5nJ1xuICBdO1xuICB2YXIgZGlyZWN0TWVyZ2VLZXlzID0gWyd2YWxpZGF0ZVN0YXR1cyddO1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhwcm9wKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9XG5cbiAgdXRpbHMuZm9yRWFjaCh2YWx1ZUZyb21Db25maWcyS2V5cywgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcyW3Byb3BdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gobWVyZ2VEZWVwUHJvcGVydGllc0tleXMsIG1lcmdlRGVlcFByb3BlcnRpZXMpO1xuXG4gIHV0aWxzLmZvckVhY2goZGVmYXVsdFRvQ29uZmlnMktleXMsIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9KTtcblxuICB1dGlscy5mb3JFYWNoKGRpcmVjdE1lcmdlS2V5cywgZnVuY3Rpb24gbWVyZ2UocHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGF4aW9zS2V5cyA9IHZhbHVlRnJvbUNvbmZpZzJLZXlzXG4gICAgLmNvbmNhdChtZXJnZURlZXBQcm9wZXJ0aWVzS2V5cylcbiAgICAuY29uY2F0KGRlZmF1bHRUb0NvbmZpZzJLZXlzKVxuICAgIC5jb25jYXQoZGlyZWN0TWVyZ2VLZXlzKTtcblxuICB2YXIgb3RoZXJLZXlzID0gT2JqZWN0XG4gICAgLmtleXMoY29uZmlnMSlcbiAgICAuY29uY2F0KE9iamVjdC5rZXlzKGNvbmZpZzIpKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gZmlsdGVyQXhpb3NLZXlzKGtleSkge1xuICAgICAgcmV0dXJuIGF4aW9zS2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gob3RoZXJLZXlzLCBtZXJnZURlZXBQcm9wZXJ0aWVzKTtcblxuICByZXR1cm4gY29uZmlnO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanM/Iik7fSw2MDI2Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgY3JlYXRlRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwNjEpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QoY3JlYXRlRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgbnVsbCxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/Iik7fSw4NTI3Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4NjcpO1xudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjU1KTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb250ZXh0LCBkYXRhLCBoZWFkZXJzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzPyIpO30sNTY1NToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDE2KTtcbnZhciBlbmhhbmNlRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4MSk7XG5cbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTQ0OCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0NDgpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDoge1xuICAgIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICAgIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlXG4gIH0sXG5cbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSB8fCAoaGVhZGVycyAmJiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgdmFyIHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsO1xuICAgIHZhciBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgdmFyIGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICB2YXIgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmIChzdHJpY3RKU09OUGFyc2luZyB8fCAoZm9yY2VkSlNPTlBhcnNpbmcgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgZGF0YS5sZW5ndGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgZW5oYW5jZUVycm9yKGUsIHRoaXMsICdFX0pTT05fUEFSU0UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfVxufTtcblxuZGVmYXVsdHMuaGVhZGVycyA9IHtcbiAgY29tbW9uOiB7XG4gICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy5qcz8iKTt9LDE4NDk6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzPyIpO30sNTMyNzoobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcblxuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cblxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcz8iKTt9LDczMDM6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcz8iKTt9LDQzNzI6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2Nyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgICB9O1xuICAgIH0pKClcbik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanM/Iik7fSwxNzkzOm1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCdcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggIjxzY2hlbWU+Oi8vIiBvciAiLy8iIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIHJldHVybiAvXihbYS16XVthLXpcXGRcXCtcXC1cXC5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/Jyk7fSw2MjY4Om1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiAodHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzPyIpO30sNzk4NToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgdmFyIG9yaWdpblVSTDtcblxuICAgICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanM/Iik7fSw2MDE2Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4NjcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzPyIpO30sNDEwOToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3KTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/Iik7fSw4NzEzOm1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPyIpO30sNDg3NToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIHBrZyA9IF9fd2VicGFja19yZXF1aXJlX18oODU5Myk7XG5cbnZhciB2YWxpZGF0b3JzID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5bJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdmdW5jdGlvbicsICdzdHJpbmcnLCAnc3ltYm9sJ10uZm9yRWFjaChmdW5jdGlvbih0eXBlLCBpKSB7XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSBmdW5jdGlvbiB2YWxpZGF0b3IodGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcbiAgfTtcbn0pO1xuXG52YXIgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG52YXIgY3VycmVudFZlckFyciA9IHBrZy52ZXJzaW9uLnNwbGl0KCcuJyk7XG5cbi8qKlxuICogQ29tcGFyZSBwYWNrYWdlIHZlcnNpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSB0aGFuVmVyc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT2xkZXJWZXJzaW9uKHZlcnNpb24sIHRoYW5WZXJzaW9uKSB7XG4gIHZhciBwa2dWZXJzaW9uQXJyID0gdGhhblZlcnNpb24gPyB0aGFuVmVyc2lvbi5zcGxpdCgnLicpIDogY3VycmVudFZlckFycjtcbiAgdmFyIGRlc3RWZXIgPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgaWYgKHBrZ1ZlcnNpb25BcnJbaV0gPiBkZXN0VmVyW2ldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHBrZ1ZlcnNpb25BcnJbaV0gPCBkZXN0VmVyW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICB2YXIgaXNEZXByZWNhdGVkID0gdmVyc2lvbiAmJiBpc09sZGVyVmVyc2lvbih2ZXJzaW9uKTtcblxuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgcGtnLnZlcnNpb24gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvcHQsIG9wdHMpIHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQgaW4gJyArIHZlcnNpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZXByZWNhdGVkICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICB2YXIgb3B0ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc09sZGVyVmVyc2lvbjogaXNPbGRlclZlcnNpb24sXG4gIGFzc2VydE9wdGlvbnM6IGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnM6IHZhbGlkYXRvcnNcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3ZhbGlkYXRvci5qcz8iKTt9LDQ4Njc6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQ5KTtcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbCkge1xuICBpZiAodG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGaWxlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBCbG9iXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmVhbSh2YWwpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVUkxTZWFyY2hQYXJhbXModmFsKSB7XG4gIHJldHVybiB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG59XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgcmV0dXJuIHN0ci50cmltID8gc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTmF0aXZlU2NyaXB0JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTlMnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFtrZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICogQHJldHVybiB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmZ1bmN0aW9uIHN0cmlwQk9NKGNvbnRlbnQpIHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FycmF5OiBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdDogaXNQbGFpbk9iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbTogaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zOiBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltLFxuICBzdHJpcEJPTTogc3RyaXBCT01cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcz8iKTt9LDE5MjQ6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBHZXRJbnRyaW5zaWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMCk7XG5cbnZhciBjYWxsQmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTU1OSk7XG5cbnZhciAkaW5kZXhPZiA9IGNhbGxCaW5kKEdldEludHJpbnNpYygnU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJykpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpYyA9IEdldEludHJpbnNpYyhuYW1lLCAhIWFsbG93TWlzc2luZyk7XG5cdGlmICh0eXBlb2YgaW50cmluc2ljID09PSAnZnVuY3Rpb24nICYmICRpbmRleE9mKG5hbWUsICcucHJvdG90eXBlLicpID4gLTEpIHtcblx0XHRyZXR1cm4gY2FsbEJpbmQoaW50cmluc2ljKTtcblx0fVxuXHRyZXR1cm4gaW50cmluc2ljO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcz8iKTt9LDU1NTk6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NjEyKTtcbnZhciBHZXRJbnRyaW5zaWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMCk7XG52YXIgc2V0RnVuY3Rpb25MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NzEpO1xuXG52YXIgJFR5cGVFcnJvciA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ1Myk7XG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDI5KTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmQob3JpZ2luYWxGdW5jdGlvbikge1xuXHRpZiAodHlwZW9mIG9yaWdpbmFsRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYSBmdW5jdGlvbiBpcyByZXF1aXJlZCcpO1xuXHR9XG5cdHZhciBmdW5jID0gJHJlZmxlY3RBcHBseShiaW5kLCAkY2FsbCwgYXJndW1lbnRzKTtcblx0cmV0dXJuIHNldEZ1bmN0aW9uTGVuZ3RoKFxuXHRcdGZ1bmMsXG5cdFx0MSArICRtYXgoMCwgb3JpZ2luYWxGdW5jdGlvbi5sZW5ndGggLSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpKSxcblx0XHR0cnVlXG5cdCk7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcz8iKTt9LDg3Mjk6KF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMpPT57InVzZSBzdHJpY3QiO2V2YWwoJ1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoe1xuICB2YWx1ZTogdHJ1ZVxufSkpO1xuZXhwb3J0cy5nZXREZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zO1xuZXhwb3J0cy5zZXREZWZhdWx0T3B0aW9ucyA9IHNldERlZmF1bHRPcHRpb25zO1xudmFyIGRlZmF1bHRPcHRpb25zID0ge307XG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zL2luZGV4LmpzPycpO30sODczNDoobW9kdWxlLGV4cG9ydHMpPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG4gIHZhbHVlOiB0cnVlXG59KSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHJlcXVpcmVkQXJncztcbmZ1bmN0aW9uIHJlcXVpcmVkQXJncyhyZXF1aXJlZCwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPCByZXF1aXJlZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocmVxdWlyZWQgKyAnIGFyZ3VtZW50JyArIChyZXF1aXJlZCA+IDEgPyAncycgOiAnJykgKyAnIHJlcXVpcmVkLCBidXQgb25seSAnICsgYXJncy5sZW5ndGggKyAnIHByZXNlbnQnKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcz8iKTt9LDIwODQ6KG1vZHVsZSxleHBvcnRzKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCdcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHtcbiAgdmFsdWU6IHRydWVcbn0pKTtcbmV4cG9ydHNbImRlZmF1bHQiXSA9IHRvSW50ZWdlcjtcbmZ1bmN0aW9uIHRvSW50ZWdlcihkaXJ0eU51bWJlcikge1xuICBpZiAoZGlydHlOdW1iZXIgPT09IG51bGwgfHwgZGlydHlOdW1iZXIgPT09IHRydWUgfHwgZGlydHlOdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICB2YXIgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcbiAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIHJldHVybiBudW1iZXIgPCAwID8gTWF0aC5jZWlsKG51bWJlcikgOiBNYXRoLmZsb29yKG51bWJlcik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzPycpO30sNTQzMDoobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnXG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gKF9fd2VicGFja19yZXF1aXJlX18oNDgzNilbImRlZmF1bHQiXSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoe1xuICB2YWx1ZTogdHJ1ZVxufSkpO1xuZXhwb3J0c1siZGVmYXVsdCJdID0gYWRkO1xudmFyIF90eXBlb2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDg2OTgpKTtcbnZhciBfaW5kZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oNzI2MikpO1xudmFyIF9pbmRleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oNjU4MSkpO1xudmFyIF9pbmRleDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oMTE3MSkpO1xudmFyIF9pbmRleDQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oODczNCkpO1xudmFyIF9pbmRleDUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oMjA4NCkpO1xuLyoqXG4gKiBAbmFtZSBhZGRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgeWVhcnMsIG1vbnRocywgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgeWVhcnMsIG1vbnRocywgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge0R1cmF0aW9ufSBkdXJhdGlvbiAtIHRoZSBvYmplY3Qgd2l0aCB5ZWFycywgbW9udGhzLCB3ZWVrcywgZGF5cywgaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqXG4gKiB8IEtleSAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHllYXJzICAgICAgICAgIHwgQW1vdW50IG9mIHllYXJzIHRvIGJlIGFkZGVkICAgICAgICB8XG4gKiB8IG1vbnRocyAgICAgICAgIHwgQW1vdW50IG9mIG1vbnRocyB0byBiZSBhZGRlZCAgICAgICB8XG4gKiB8IHdlZWtzICAgICAgICAgIHwgQW1vdW50IG9mIHdlZWtzIHRvIGJlIGFkZGVkICAgICAgICB8XG4gKiB8IGRheXMgICAgICAgICAgIHwgQW1vdW50IG9mIGRheXMgdG8gYmUgYWRkZWQgICAgICAgICB8XG4gKiB8IGhvdXJzICAgICAgICAgIHwgQW1vdW50IG9mIGhvdXJzIHRvIGJlIGFkZGVkICAgICAgICB8XG4gKiB8IG1pbnV0ZXMgICAgICAgIHwgQW1vdW50IG9mIG1pbnV0ZXMgdG8gYmUgYWRkZWQgICAgICB8XG4gKiB8IHNlY29uZHMgICAgICAgIHwgQW1vdW50IG9mIHNlY29uZHMgdG8gYmUgYWRkZWQgICAgICB8XG4gKlxuICogQWxsIHZhbHVlcyBkZWZhdWx0IHRvIDBcbiAqXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIHNlY29uZHMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIHRoZSBmb2xsb3dpbmcgZHVyYXRpb24gdG8gMSBTZXB0ZW1iZXIgMjAxNCwgMTA6MTk6NTBcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZChuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMCwgMTksIDUwKSwge1xuICogICB5ZWFyczogMixcbiAqICAgbW9udGhzOiA5LFxuICogICB3ZWVrczogMSxcbiAqICAgZGF5czogNyxcbiAqICAgaG91cnM6IDUsXG4gKiAgIG1pbnV0ZXM6IDksXG4gKiAgIHNlY29uZHM6IDMwLFxuICogfSlcbiAqIC8vPT4gVGh1IEp1biAxNSAyMDE3IDE1OjI5OjIwXG4gKi9cbmZ1bmN0aW9uIGFkZChkaXJ0eURhdGUsIGR1cmF0aW9uKSB7XG4gICgwLCBfaW5kZXg0LmRlZmF1bHQpKDIsIGFyZ3VtZW50cyk7XG4gIGlmICghZHVyYXRpb24gfHwgKDAsIF90eXBlb2YyLmRlZmF1bHQpKGR1cmF0aW9uKSAhPT0gXCdvYmplY3RcJykgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIHZhciB5ZWFycyA9IGR1cmF0aW9uLnllYXJzID8gKDAsIF9pbmRleDUuZGVmYXVsdCkoZHVyYXRpb24ueWVhcnMpIDogMDtcbiAgdmFyIG1vbnRocyA9IGR1cmF0aW9uLm1vbnRocyA/ICgwLCBfaW5kZXg1LmRlZmF1bHQpKGR1cmF0aW9uLm1vbnRocykgOiAwO1xuICB2YXIgd2Vla3MgPSBkdXJhdGlvbi53ZWVrcyA/ICgwLCBfaW5kZXg1LmRlZmF1bHQpKGR1cmF0aW9uLndlZWtzKSA6IDA7XG4gIHZhciBkYXlzID0gZHVyYXRpb24uZGF5cyA/ICgwLCBfaW5kZXg1LmRlZmF1bHQpKGR1cmF0aW9uLmRheXMpIDogMDtcbiAgdmFyIGhvdXJzID0gZHVyYXRpb24uaG91cnMgPyAoMCwgX2luZGV4NS5kZWZhdWx0KShkdXJhdGlvbi5ob3VycykgOiAwO1xuICB2YXIgbWludXRlcyA9IGR1cmF0aW9uLm1pbnV0ZXMgPyAoMCwgX2luZGV4NS5kZWZhdWx0KShkdXJhdGlvbi5taW51dGVzKSA6IDA7XG4gIHZhciBzZWNvbmRzID0gZHVyYXRpb24uc2Vjb25kcyA/ICgwLCBfaW5kZXg1LmRlZmF1bHQpKGR1cmF0aW9uLnNlY29uZHMpIDogMDtcblxuICAvLyBBZGQgeWVhcnMgYW5kIG1vbnRoc1xuICB2YXIgZGF0ZSA9ICgwLCBfaW5kZXgzLmRlZmF1bHQpKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXRlV2l0aE1vbnRocyA9IG1vbnRocyB8fCB5ZWFycyA/ICgwLCBfaW5kZXgyLmRlZmF1bHQpKGRhdGUsIG1vbnRocyArIHllYXJzICogMTIpIDogZGF0ZTtcblxuICAvLyBBZGQgd2Vla3MgYW5kIGRheXNcbiAgdmFyIGRhdGVXaXRoRGF5cyA9IGRheXMgfHwgd2Vla3MgPyAoMCwgX2luZGV4LmRlZmF1bHQpKGRhdGVXaXRoTW9udGhzLCBkYXlzICsgd2Vla3MgKiA3KSA6IGRhdGVXaXRoTW9udGhzO1xuXG4gIC8vIEFkZCBkYXlzLCBob3VycywgbWludXRlcyBhbmQgc2Vjb25kc1xuICB2YXIgbWludXRlc1RvQWRkID0gbWludXRlcyArIGhvdXJzICogNjA7XG4gIHZhciBzZWNvbmRzVG9BZGQgPSBzZWNvbmRzICsgbWludXRlc1RvQWRkICogNjA7XG4gIHZhciBtc1RvQWRkID0gc2Vjb25kc1RvQWRkICogMTAwMDtcbiAgdmFyIGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGRhdGVXaXRoRGF5cy5nZXRUaW1lKCkgKyBtc1RvQWRkKTtcbiAgcmV0dXJuIGZpbmFsRGF0ZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkL2luZGV4LmpzPycpO30sNzI2MjoobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnXG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gKF9fd2VicGFja19yZXF1aXJlX18oNDgzNilbImRlZmF1bHQiXSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoe1xuICB2YWx1ZTogdHJ1ZVxufSkpO1xuZXhwb3J0c1siZGVmYXVsdCJdID0gYWRkRGF5cztcbnZhciBfaW5kZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oMjA4NCkpO1xudmFyIF9pbmRleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oMTE3MSkpO1xudmFyIF9pbmRleDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oODczNCkpO1xuLyoqXG4gKiBAbmFtZSBhZGREYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIGRheXMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSAtIHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXlzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IC0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEwIGRheXMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZERheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBUaHUgU2VwIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkRGF5cyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gICgwLCBfaW5kZXgzLmRlZmF1bHQpKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gKDAsIF9pbmRleDIuZGVmYXVsdCkoZGlydHlEYXRlKTtcbiAgdmFyIGFtb3VudCA9ICgwLCBfaW5kZXguZGVmYXVsdCkoZGlydHlBbW91bnQpO1xuICBpZiAoaXNOYU4oYW1vdW50KSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBkYXlzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBkYXRlO1xuICB9XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGFtb3VudCk7XG4gIHJldHVybiBkYXRlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzL2luZGV4LmpzPycpO30sNjU4MToobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnXG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gKF9fd2VicGFja19yZXF1aXJlX18oNDgzNilbImRlZmF1bHQiXSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoe1xuICB2YWx1ZTogdHJ1ZVxufSkpO1xuZXhwb3J0c1siZGVmYXVsdCJdID0gYWRkTW9udGhzO1xudmFyIF9pbmRleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygyMDg0KSk7XG52YXIgX2luZGV4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygxMTcxKSk7XG52YXIgX2luZGV4MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXyg4NzM0KSk7XG4vKipcbiAqIEBuYW1lIGFkZE1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtb250aHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IG1vbnRocyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gRmViIDAxIDIwMTUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkTW9udGhzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgKDAsIF9pbmRleDMuZGVmYXVsdCkoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSAoMCwgX2luZGV4Mi5kZWZhdWx0KShkaXJ0eURhdGUpO1xuICB2YXIgYW1vdW50ID0gKDAsIF9pbmRleC5kZWZhdWx0KShkaXJ0eUFtb3VudCk7XG4gIGlmIChpc05hTihhbW91bnQpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIG1vbnRocywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICB2YXIgZGF5T2ZNb250aCA9IGRhdGUuZ2V0RGF0ZSgpO1xuXG4gIC8vIFRoZSBKUyBEYXRlIG9iamVjdCBzdXBwb3J0cyBkYXRlIG1hdGggYnkgYWNjZXB0aW5nIG91dC1vZi1ib3VuZHMgdmFsdWVzIGZvclxuICAvLyBtb250aCwgZGF5LCBldGMuIEZvciBleGFtcGxlLCBuZXcgRGF0ZSgyMDIwLCAwLCAwKSByZXR1cm5zIDMxIERlYyAyMDE5IGFuZFxuICAvLyBuZXcgRGF0ZSgyMDIwLCAxMywgMSkgcmV0dXJucyAxIEZlYiAyMDIxLiAgVGhpcyBpcyAqYWxtb3N0KiB0aGUgYmVoYXZpb3Igd2VcbiAgLy8gd2FudCBleGNlcHQgdGhhdCBkYXRlcyB3aWxsIHdyYXAgYXJvdW5kIHRoZSBlbmQgb2YgYSBtb250aCwgbWVhbmluZyB0aGF0XG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAzMSkgd2lsbCByZXR1cm4gMyBNYXIgMjAyMSBub3QgMjggRmViIDIwMjEgYXMgZGVzaXJlZC4gU29cbiAgLy8gd2VcJ2xsIGRlZmF1bHQgdG8gdGhlIGVuZCBvZiB0aGUgZGVzaXJlZCBtb250aCBieSBhZGRpbmcgMSB0byB0aGUgZGVzaXJlZFxuICAvLyBtb250aCBhbmQgdXNpbmcgYSBkYXRlIG9mIDAgdG8gYmFjayB1cCBvbmUgZGF5IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWRcbiAgLy8gbW9udGguXG4gIHZhciBlbmRPZkRlc2lyZWRNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgZW5kT2ZEZXNpcmVkTW9udGguc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7XG4gIHZhciBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTtcbiAgaWYgKGRheU9mTW9udGggPj0gZGF5c0luTW9udGgpIHtcbiAgICAvLyBJZiB3ZVwncmUgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBtb250aCwgdGhlbiB0aGlzIGlzIHRoZSBjb3JyZWN0IGRhdGVcbiAgICAvLyBhbmQgd2VcJ3JlIGRvbmUuXG4gICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgd2Ugbm93IGtub3cgdGhhdCBzZXR0aW5nIHRoZSBvcmlnaW5hbCBkYXktb2YtbW9udGggdmFsdWUgd29uXCd0XG4gICAgLy8gY2F1c2UgYW4gb3ZlcmZsb3csIHNvIHNldCB0aGUgZGVzaXJlZCBkYXktb2YtbW9udGguIE5vdGUgdGhhdCB3ZSBjYW5cJ3RcbiAgICAvLyBqdXN0IHNldCB0aGUgZGF0ZSBvZiBgZW5kT2ZEZXNpcmVkTW9udGhgIGJlY2F1c2UgdGhhdCBvYmplY3QgbWF5IGhhdmUgaGFkXG4gICAgLy8gaXRzIHRpbWUgY2hhbmdlZCBpbiB0aGUgdW51c3VhbCBjYXNlIHdoZXJlIHdoZXJlIGEgRFNUIHRyYW5zaXRpb24gd2FzIG9uXG4gICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCBhbmQgaXRzIGxvY2FsIHRpbWUgd2FzIGluIHRoZSBob3VyIHNraXBwZWQgb3JcbiAgICAvLyByZXBlYXRlZCBuZXh0IHRvIGEgRFNUIHRyYW5zaXRpb24uICBTbyB3ZSB1c2UgYGRhdGVgIGluc3RlYWQgd2hpY2ggaXNcbiAgICAvLyBndWFyYW50ZWVkIHRvIHN0aWxsIGhhdmUgdGhlIG9yaWdpbmFsIHRpbWUuXG4gICAgZGF0ZS5zZXRGdWxsWWVhcihlbmRPZkRlc2lyZWRNb250aC5nZXRGdWxsWWVhcigpLCBlbmRPZkRlc2lyZWRNb250aC5nZXRNb250aCgpLCBkYXlPZk1vbnRoKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNb250aHMvaW5kZXguanM/Jyk7fSw1Mjc2Oihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCdcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg0ODM2KVsiZGVmYXVsdCJdKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7XG4gIHZhbHVlOiB0cnVlXG59KSk7XG5leHBvcnRzWyJkZWZhdWx0Il0gPSBpc1NhbWVXZWVrO1xudmFyIF9pbmRleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygyNDY2KSk7XG52YXIgX2luZGV4MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXyg4NzM0KSk7XG4vKipcbiAqIEBuYW1lIGlzU2FtZVdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMzEgQXVndXN0IDIwMTQgYW5kIDQgU2VwdGVtYmVyIDIwMTQgaW4gdGhlIHNhbWUgd2Vlaz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVdlZWsobmV3IERhdGUoMjAxNCwgNywgMzEpLCBuZXcgRGF0ZSgyMDE0LCA4LCA0KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB3ZWVrIHN0YXJ0cyB3aXRoIE1vbmRheSxcbiAqIC8vIGFyZSAzMSBBdWd1c3QgMjAxNCBhbmQgNCBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB3ZWVrP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lV2VlayhuZXcgRGF0ZSgyMDE0LCA3LCAzMSksIG5ldyBEYXRlKDIwMTQsIDgsIDQpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMVxuICogfSlcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDEgSmFudWFyeSAyMDE0IGFuZCAxIEphbnVhcnkgMjAxNSBpbiB0aGUgc2FtZSB3ZWVrP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lV2VlayhuZXcgRGF0ZSgyMDE0LCAwLCAxKSwgbmV3IERhdGUoMjAxNSwgMCwgMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZVdlZWsoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQsIG9wdGlvbnMpIHtcbiAgKDAsIF9pbmRleDIuZGVmYXVsdCkoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0U3RhcnRPZldlZWsgPSAoMCwgX2luZGV4LmRlZmF1bHQpKGRpcnR5RGF0ZUxlZnQsIG9wdGlvbnMpO1xuICB2YXIgZGF0ZVJpZ2h0U3RhcnRPZldlZWsgPSAoMCwgX2luZGV4LmRlZmF1bHQpKGRpcnR5RGF0ZVJpZ2h0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGRhdGVMZWZ0U3RhcnRPZldlZWsuZ2V0VGltZSgpID09PSBkYXRlUmlnaHRTdGFydE9mV2Vlay5nZXRUaW1lKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsvaW5kZXguanM/Jyk7fSw4OTMzOihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCdcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg0ODM2KVsiZGVmYXVsdCJdKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7XG4gIHZhbHVlOiB0cnVlXG59KSk7XG5leHBvcnRzWyJkZWZhdWx0Il0gPSBzZXREYXk7XG52YXIgX2luZGV4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDcyNjIpKTtcbnZhciBfaW5kZXgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDExNzEpKTtcbnZhciBfaW5kZXgzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDIwODQpKTtcbnZhciBfaW5kZXg0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDg3MzQpKTtcbnZhciBfaW5kZXg1ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzI5KTtcbi8qKlxuICogQG5hbWUgc2V0RGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGRheSBvZiB0aGUgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gZGF5IC0gdGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXkgb2YgdGhlIHdlZWsgc2V0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggdGhlIGRlZmF1bHQgd2Vla1N0YXJ0c09uIG9mIFN1bmRheTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldERheShuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMClcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggYSB3ZWVrU3RhcnRzT24gb2YgTW9uZGF5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0RGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAwLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0RGF5KGRpcnR5RGF0ZSwgZGlydHlEYXksIG9wdGlvbnMpIHtcbiAgdmFyIF9yZWYsIF9yZWYyLCBfcmVmMywgX29wdGlvbnMkd2Vla1N0YXJ0c09uLCBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbywgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyO1xuICAoMCwgX2luZGV4NC5kZWZhdWx0KSgyLCBhcmd1bWVudHMpO1xuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4NS5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgdmFyIHdlZWtTdGFydHNPbiA9ICgwLCBfaW5kZXgzLmRlZmF1bHQpKChfcmVmID0gKF9yZWYyID0gKF9yZWYzID0gKF9vcHRpb25zJHdlZWtTdGFydHNPbiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9vcHRpb25zJHdlZWtTdGFydHNPbiAhPT0gdm9pZCAwID8gX29wdGlvbnMkd2Vla1N0YXJ0c09uIDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX29wdGlvbnMkbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9vcHRpb25zJGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSRvcHRpbyA9IF9vcHRpb25zJGxvY2FsZS5vcHRpb25zKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJGxvY2FsZSRvcHRpby53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWYzICE9PSB2b2lkIDAgPyBfcmVmMyA6IGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX3JlZjIgIT09IHZvaWQgMCA/IF9yZWYyIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9IGRlZmF1bHRPcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9IF9kZWZhdWx0T3B0aW9ucyRsb2NhbC5vcHRpb25zKSA9PT0gbnVsbCB8fCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IDApO1xuXG4gIC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwnd2Vla1N0YXJ0c09uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2IGluY2x1c2l2ZWx5XCcpO1xuICB9XG4gIHZhciBkYXRlID0gKDAsIF9pbmRleDIuZGVmYXVsdCkoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9ICgwLCBfaW5kZXgzLmRlZmF1bHQpKGRpcnR5RGF5KTtcbiAgdmFyIGN1cnJlbnREYXkgPSBkYXRlLmdldERheSgpO1xuICB2YXIgcmVtYWluZGVyID0gZGF5ICUgNztcbiAgdmFyIGRheUluZGV4ID0gKHJlbWFpbmRlciArIDcpICUgNztcbiAgdmFyIGRlbHRhID0gNyAtIHdlZWtTdGFydHNPbjtcbiAgdmFyIGRpZmYgPSBkYXkgPCAwIHx8IGRheSA+IDYgPyBkYXkgLSAoY3VycmVudERheSArIGRlbHRhKSAlIDcgOiAoZGF5SW5kZXggKyBkZWx0YSkgJSA3IC0gKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3O1xuICByZXR1cm4gKDAsIF9pbmRleC5kZWZhdWx0KShkYXRlLCBkaWZmKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5L2luZGV4LmpzPycpO30sMjQ2NjoobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnXG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gKF9fd2VicGFja19yZXF1aXJlX18oNDgzNilbImRlZmF1bHQiXSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoe1xuICB2YWx1ZTogdHJ1ZVxufSkpO1xuZXhwb3J0c1siZGVmYXVsdCJdID0gc3RhcnRPZldlZWs7XG52YXIgX2luZGV4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDExNzEpKTtcbnZhciBfaW5kZXgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDIwODQpKTtcbnZhciBfaW5kZXgzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDg3MzQpKTtcbnZhciBfaW5kZXg0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzI5KTtcbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSB3ZWVrXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZldlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfcmVmMiwgX3JlZjMsIF9vcHRpb25zJHdlZWtTdGFydHNPbiwgX29wdGlvbnMkbG9jYWxlLCBfb3B0aW9ucyRsb2NhbGUkb3B0aW8sIF9kZWZhdWx0T3B0aW9ucyRsb2NhbCwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMjtcbiAgKDAsIF9pbmRleDMuZGVmYXVsdCkoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDQuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSAoMCwgX2luZGV4Mi5kZWZhdWx0KSgoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyR3ZWVrU3RhcnRzT24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gIT09IHZvaWQgMCA/IF9vcHRpb25zJHdlZWtTdGFydHNPbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8ud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAwKTtcblxuICAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuICBpZiAoISh3ZWVrU3RhcnRzT24gPj0gMCAmJiB3ZWVrU3RhcnRzT24gPD0gNikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseVwnKTtcbiAgfVxuICB2YXIgZGF0ZSA9ICgwLCBfaW5kZXguZGVmYXVsdCkoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay9pbmRleC5qcz8nKTt9LDExNzE6KG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4MzYpW1wiZGVmYXVsdFwiXSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG4gIHZhbHVlOiB0cnVlXG59KSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHRvRGF0ZTtcbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXyg4Njk4KSk7XG52YXIgX2luZGV4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dlYnBhY2tfcmVxdWlyZV9fKDg3MzQpKTtcbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGFyZ3VtZW50IC0gdGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5mdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgKDAsIF9pbmRleC5kZWZhdWx0KSgxLCBhcmd1bWVudHMpO1xuICB2YXIgYXJnU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KTtcblxuICAvLyBDbG9uZSB0aGUgZGF0ZVxuICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBEYXRlIHx8ICgwLCBfdHlwZW9mMi5kZWZhdWx0KShhcmd1bWVudCkgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50LmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IE51bWJlcl0nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFwiU3RhcnRpbmcgd2l0aCB2Mi4wLjAtYmV0YS4xIGRhdGUtZm5zIGRvZXNuJ3QgYWNjZXB0IHN0cmluZ3MgYXMgZGF0ZSBhcmd1bWVudHMuIFBsZWFzZSB1c2UgYHBhcnNlSVNPYCB0byBwYXJzZSBzdHJpbmdzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNzdHJpbmctYXJndW1lbnRzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS9pbmRleC5qcz8iKTt9LDIyOTY6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0MjkpO1xuXG52YXIgJFN5bnRheEVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNDY0KTtcbnZhciAkVHlwZUVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDUzKTtcblxudmFyIGdvcGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyOTYpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkoXG5cdG9iaixcblx0cHJvcGVydHksXG5cdHZhbHVlXG4pIHtcblx0aWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSAnc3ltYm9sJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHR5cGVvZiBhcmd1bWVudHNbM10gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbM10gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkVudW1lcmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB0eXBlb2YgYXJndW1lbnRzWzRdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzRdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIHR5cGVvZiBhcmd1bWVudHNbNV0gIT09ICdib29sZWFuJyAmJiBhcmd1bWVudHNbNV0gIT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIHR5cGVvZiBhcmd1bWVudHNbNl0gIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBub25FbnVtZXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXHR2YXIgbm9uV3JpdGFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IG51bGw7XG5cdHZhciBub25Db25maWd1cmFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ID8gYXJndW1lbnRzWzZdIDogZmFsc2U7XG5cblx0LyogQHR5cGUge2ZhbHNlIHwgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj59ICovXG5cdHZhciBkZXNjID0gISFnb3BkICYmIGdvcGQob2JqLCBwcm9wZXJ0eSk7XG5cblx0aWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IG5vbkNvbmZpZ3VyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5jb25maWd1cmFibGUgOiAhbm9uQ29uZmlndXJhYmxlLFxuXHRcdFx0ZW51bWVyYWJsZTogbm9uRW51bWVyYWJsZSA9PT0gbnVsbCAmJiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogIW5vbkVudW1lcmFibGUsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogbm9uV3JpdGFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2Mud3JpdGFibGUgOiAhbm9uV3JpdGFibGVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChsb29zZSB8fCAoIW5vbkVudW1lcmFibGUgJiYgIW5vbldyaXRhYmxlICYmICFub25Db25maWd1cmFibGUpKSB7XG5cdFx0Ly8gbXVzdCBmYWxsIGJhY2sgdG8gW1tTZXRdXSwgYW5kIHdhcyBub3QgZXhwbGljaXRseSBhc2tlZCB0byBtYWtlIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1jb25maWd1cmFibGVcblx0XHRvYmpbcHJvcGVydHldID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLicpO1xuXHR9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcz8iKTt9LDQ0Mjk6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBHZXRJbnRyaW5zaWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMCk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmRlZmluZVByb3BlcnR5JScsIHRydWUpIHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvZXMtZGVmaW5lLXByb3BlcnR5L2luZGV4LmpzPyIpO30sMzk4MTptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2V2YWwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXZhbEVycm9yO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcz8iKTt9LDE2NDg6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFcnJvcjtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL2luZGV4LmpzPyIpO30sNDcyNjptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcz8iKTt9LDY3MTI6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWYnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVmZXJlbmNlRXJyb3I7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanM/Iik7fSwzNDY0Om1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvc3ludGF4LmpzPyIpO30sNDQ1Mzptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3R5cGUnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gVHlwZUVycm9yO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcz8iKTt9LDM5MTU6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG4vKiogQHR5cGUge2ltcG9ydCgnLi91cmknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gVVJJRXJyb3I7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy91cmkuanM/Iik7fSw3NjQ4Om1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGNvbmNhdHR5ID0gZnVuY3Rpb24gY29uY2F0dHkoYSwgYikge1xuICAgIHZhciBhcnIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJbaV0gPSBhW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGIubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgYXJyW2ogKyBhLmxlbmd0aF0gPSBiW2pdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgc2xpY3kgPSBmdW5jdGlvbiBzbGljeShhcnJMaWtlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IG9mZnNldCB8fCAwLCBqID0gMDsgaSA8IGFyckxpa2UubGVuZ3RoOyBpICs9IDEsIGogKz0gMSkge1xuICAgICAgICBhcnJbal0gPSBhcnJMaWtlW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIGpvaW55ID0gZnVuY3Rpb24gKGFyciwgam9pbmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBhcnJbaV07XG4gICAgICAgIGlmIChpICsgMSA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0ciArPSBqb2luZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuYXBwbHkodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljeShhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICBjb25jYXR0eShhcmdzLCBhcmd1bWVudHMpXG4gICAgICAgICk7XG5cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3NbaV0gPSAnJCcgKyBpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBqb2lueShib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcz8iKTt9LDg2MTI6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzY0OCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanM/Iik7fSwyMTA6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NDgpO1xudmFyICRFdmFsRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5ODEpO1xudmFyICRSYW5nZUVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzI2KTtcbnZhciAkUmVmZXJlbmNlRXJyb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3MTIpO1xudmFyICRTeW50YXhFcnJvciA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ2NCk7XG52YXIgJFR5cGVFcnJvciA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ1Myk7XG52YXIgJFVSSUVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOTE1KTtcblxudmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDA1KSgpO1xudmFyIGhhc1Byb3RvID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTg1KSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgKFxuXHRoYXNQcm90b1xuXHRcdD8gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblx0XHQ6IG51bGxcbik7XG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQmlnSW50NjRBcnJheSUnOiB0eXBlb2YgQmlnSW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQ2NEFycmF5LFxuXHQnJUJpZ1VpbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdVaW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdVaW50NjRBcnJheSxcblx0JyVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJURhdGUlJzogRGF0ZSxcblx0JyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJUVycm9yJSc6ICRFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiAkRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oODYxMik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODI0KTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyICRzcGxpY2VBcHBseSA9IGJpbmQuY2FsbChGdW5jdGlvbi5hcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGV4ZWMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanM/Iik7fSw3Mjk2Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgR2V0SW50cmluc2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTApO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzPyIpO30sMTA0NDoobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNDQyOSk7XG5cbnZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpIHtcblx0cmV0dXJuICEhJGRlZmluZVByb3BlcnR5O1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCEkZGVmaW5lUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzL2luZGV4LmpzPyIpO30sODE4NTptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB0ZXN0ID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGZvbzoge31cbn07XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNQcm90bygpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvcjogVFMgZXJyb3JzIG9uIGFuIGluaGVyaXRlZCBwcm9wZXJ0eSBmb3Igc29tZSByZWFzb25cblx0cmV0dXJuIHsgX19wcm90b19fOiB0ZXN0IH0uZm9vID09PSB0ZXN0LmZvb1xuXHRcdCYmICEodGVzdCBpbnN0YW5jZW9mICRPYmplY3QpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvaGFzLXByb3RvL2luZGV4LmpzPyIpO30sMTQwNToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCJcblxudmFyIG9yaWdTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2w7XG52YXIgaGFzU3ltYm9sU2hhbSA9IF9fd2VicGFja19yZXF1aXJlX18oNTQxOSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzPyIpO30sNTQxOTptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanM/Iik7fSw4ODI0Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xudmFyICRoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2MTIpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoY2FsbCwgJGhhc093bik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL2hhc293bi9pbmRleC5qcz8iKTt9LDk4MzI6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCIvKiEganNvbnBhdGggMS4xLjEgKi9cblxuKGZ1bmN0aW9uKGYpe2lmKHRydWUpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIHsgdmFyIGc7IH19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT11bmRlZmluZWQ7aWYoIXUmJmEpcmV0dXJuIHJlcXVpcmUobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dW5kZWZpbmVkO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7XCIuL2Flc3ByaW1cIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgQXJpeWEgSGlkYXlhdCA8YXJpeWEuaGlkYXlhdEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMyBUaGFkZGVlIFR5bCA8dGhhZGRlZS50eWxAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgTWF0aGlhcyBCeW5lbnMgPG1hdGhpYXNAcWl3aS5iZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgTWF0aGlhcyBCeW5lbnMgPG1hdGhpYXNAcWl3aS5iZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEpvb3N0LVdpbSBCb2VrZXN0ZWlqbiA8am9vc3Qtd2ltQGJvZWtlc3RlaWpuLm5sPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgS3JpcyBLb3dhbCA8a3Jpcy5rb3dhbEBjaXhhci5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcnBhZCBCb3Jzb3MgPGFycGFkLmJvcnNvc0Bnb29nbGVtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDExIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qanNsaW50IGJpdHdpc2U6dHJ1ZSBwbHVzcGx1czp0cnVlICovXG4vKmdsb2JhbCBlc3ByaW1hOnRydWUsIGRlZmluZTp0cnVlLCBleHBvcnRzOnRydWUsIHdpbmRvdzogdHJ1ZSxcbnRocm93RXJyb3JUb2xlcmFudDogdHJ1ZSxcbnRocm93RXJyb3I6IHRydWUsIGdlbmVyYXRlU3RhdGVtZW50OiB0cnVlLCBwZWVrOiB0cnVlLFxucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbjogdHJ1ZSwgcGFyc2VCbG9jazogdHJ1ZSwgcGFyc2VFeHByZXNzaW9uOiB0cnVlLFxucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uOiB0cnVlLCBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbjogdHJ1ZSxcbnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50czogdHJ1ZSwgcGFyc2VWYXJpYWJsZUlkZW50aWZpZXI6IHRydWUsXG5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb246IHRydWUsXG5wYXJzZVVuYXJ5RXhwcmVzc2lvbjogdHJ1ZSxcbnBhcnNlU3RhdGVtZW50OiB0cnVlLCBwYXJzZVNvdXJjZUVsZW1lbnQ6IHRydWUgKi9cblxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gVW5pdmVyc2FsIE1vZHVsZSBEZWZpbml0aW9uIChVTUQpIHRvIHN1cHBvcnQgQU1ELCBDb21tb25KUy9Ob2RlLmpzLFxuICAgIC8vIFJoaW5vLCBhbmQgcGxhaW4gYnJvd3NlciBsb2FkaW5nLlxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmYWN0b3J5KChyb290LmVzcHJpbWEgPSB7fSkpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgVG9rZW4sXG4gICAgICAgIFRva2VuTmFtZSxcbiAgICAgICAgRm5FeHByVG9rZW5zLFxuICAgICAgICBTeW50YXgsXG4gICAgICAgIFByb3BlcnR5S2luZCxcbiAgICAgICAgTWVzc2FnZXMsXG4gICAgICAgIFJlZ2V4LFxuICAgICAgICBTeW50YXhUcmVlRGVsZWdhdGUsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgc3RyaWN0LFxuICAgICAgICBpbmRleCxcbiAgICAgICAgbGluZU51bWJlcixcbiAgICAgICAgbGluZVN0YXJ0LFxuICAgICAgICBsZW5ndGgsXG4gICAgICAgIGRlbGVnYXRlLFxuICAgICAgICBsb29rYWhlYWQsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBleHRyYTtcblxuICAgIFRva2VuID0ge1xuICAgICAgICBCb29sZWFuTGl0ZXJhbDogMSxcbiAgICAgICAgRU9GOiAyLFxuICAgICAgICBJZGVudGlmaWVyOiAzLFxuICAgICAgICBLZXl3b3JkOiA0LFxuICAgICAgICBOdWxsTGl0ZXJhbDogNSxcbiAgICAgICAgTnVtZXJpY0xpdGVyYWw6IDYsXG4gICAgICAgIFB1bmN0dWF0b3I6IDcsXG4gICAgICAgIFN0cmluZ0xpdGVyYWw6IDgsXG4gICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uOiA5XG4gICAgfTtcblxuICAgIFRva2VuTmFtZSA9IHt9O1xuICAgIFRva2VuTmFtZVtUb2tlbi5Cb29sZWFuTGl0ZXJhbF0gPSAnQm9vbGVhbic7XG4gICAgVG9rZW5OYW1lW1Rva2VuLkVPRl0gPSAnPGVuZD4nO1xuICAgIFRva2VuTmFtZVtUb2tlbi5JZGVudGlmaWVyXSA9ICdJZGVudGlmaWVyJztcbiAgICBUb2tlbk5hbWVbVG9rZW4uS2V5d29yZF0gPSAnS2V5d29yZCc7XG4gICAgVG9rZW5OYW1lW1Rva2VuLk51bGxMaXRlcmFsXSA9ICdOdWxsJztcbiAgICBUb2tlbk5hbWVbVG9rZW4uTnVtZXJpY0xpdGVyYWxdID0gJ051bWVyaWMnO1xuICAgIFRva2VuTmFtZVtUb2tlbi5QdW5jdHVhdG9yXSA9ICdQdW5jdHVhdG9yJztcbiAgICBUb2tlbk5hbWVbVG9rZW4uU3RyaW5nTGl0ZXJhbF0gPSAnU3RyaW5nJztcbiAgICBUb2tlbk5hbWVbVG9rZW4uUmVndWxhckV4cHJlc3Npb25dID0gJ1JlZ3VsYXJFeHByZXNzaW9uJztcblxuICAgIC8vIEEgZnVuY3Rpb24gZm9sbG93aW5nIG9uZSBvZiB0aG9zZSB0b2tlbnMgaXMgYW4gZXhwcmVzc2lvbi5cbiAgICBGbkV4cHJUb2tlbnMgPSBbJygnLCAneycsICdbJywgJ2luJywgJ3R5cGVvZicsICdpbnN0YW5jZW9mJywgJ25ldycsXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm4nLCAnY2FzZScsICdkZWxldGUnLCAndGhyb3cnLCAndm9pZCcsXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgICc9JywgJys9JywgJy09JywgJyo9JywgJy89JywgJyU9JywgJzw8PScsICc+Pj0nLCAnPj4+PScsXG4gICAgICAgICAgICAgICAgICAgICcmPScsICd8PScsICdePScsICcsJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmluYXJ5L3VuYXJ5IG9wZXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICAnKycsICctJywgJyonLCAnLycsICclJywgJysrJywgJy0tJywgJzw8JywgJz4+JywgJz4+PicsICcmJyxcbiAgICAgICAgICAgICAgICAgICAgJ3wnLCAnXicsICchJywgJ34nLCAnJiYnLCAnfHwnLCAnPycsICc6JywgJz09PScsICc9PScsICc+PScsXG4gICAgICAgICAgICAgICAgICAgICc8PScsICc8JywgJz4nLCAnIT0nLCAnIT09J107XG5cbiAgICBTeW50YXggPSB7XG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiAnQXNzaWdubWVudEV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246ICdBcnJheUV4cHJlc3Npb24nLFxuICAgICAgICBCbG9ja1N0YXRlbWVudDogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogJ0JpbmFyeUV4cHJlc3Npb24nLFxuICAgICAgICBCcmVha1N0YXRlbWVudDogJ0JyZWFrU3RhdGVtZW50JyxcbiAgICAgICAgQ2FsbEV4cHJlc3Npb246ICdDYWxsRXhwcmVzc2lvbicsXG4gICAgICAgIENhdGNoQ2xhdXNlOiAnQ2F0Y2hDbGF1c2UnLFxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246ICdDb25kaXRpb25hbEV4cHJlc3Npb24nLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50JyxcbiAgICAgICAgRG9XaGlsZVN0YXRlbWVudDogJ0RvV2hpbGVTdGF0ZW1lbnQnLFxuICAgICAgICBEZWJ1Z2dlclN0YXRlbWVudDogJ0RlYnVnZ2VyU3RhdGVtZW50JyxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICdFeHByZXNzaW9uU3RhdGVtZW50JyxcbiAgICAgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50JyxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG4gICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyxcbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiAnRnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgSWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgICAgICBJZlN0YXRlbWVudDogJ0lmU3RhdGVtZW50JyxcbiAgICAgICAgTGl0ZXJhbDogJ0xpdGVyYWwnLFxuICAgICAgICBMYWJlbGVkU3RhdGVtZW50OiAnTGFiZWxlZFN0YXRlbWVudCcsXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiAnTG9naWNhbEV4cHJlc3Npb24nLFxuICAgICAgICBNZW1iZXJFeHByZXNzaW9uOiAnTWVtYmVyRXhwcmVzc2lvbicsXG4gICAgICAgIE5ld0V4cHJlc3Npb246ICdOZXdFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuICAgICAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG4gICAgICAgIFByb3BlcnR5OiAnUHJvcGVydHknLFxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6ICdSZXR1cm5TdGF0ZW1lbnQnLFxuICAgICAgICBTZXF1ZW5jZUV4cHJlc3Npb246ICdTZXF1ZW5jZUV4cHJlc3Npb24nLFxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6ICdTd2l0Y2hTdGF0ZW1lbnQnLFxuICAgICAgICBTd2l0Y2hDYXNlOiAnU3dpdGNoQ2FzZScsXG4gICAgICAgIFRoaXNFeHByZXNzaW9uOiAnVGhpc0V4cHJlc3Npb24nLFxuICAgICAgICBUaHJvd1N0YXRlbWVudDogJ1Rocm93U3RhdGVtZW50JyxcbiAgICAgICAgVHJ5U3RhdGVtZW50OiAnVHJ5U3RhdGVtZW50JyxcbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiAnVW5hcnlFeHByZXNzaW9uJyxcbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogJ1VwZGF0ZUV4cHJlc3Npb24nLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiAnVmFyaWFibGVEZWNsYXJhdGlvbicsXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogJ1ZhcmlhYmxlRGVjbGFyYXRvcicsXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiAnV2hpbGVTdGF0ZW1lbnQnLFxuICAgICAgICBXaXRoU3RhdGVtZW50OiAnV2l0aFN0YXRlbWVudCdcbiAgICB9O1xuXG4gICAgUHJvcGVydHlLaW5kID0ge1xuICAgICAgICBEYXRhOiAxLFxuICAgICAgICBHZXQ6IDIsXG4gICAgICAgIFNldDogNFxuICAgIH07XG5cbiAgICAvLyBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIFY4LlxuICAgIE1lc3NhZ2VzID0ge1xuICAgICAgICBVbmV4cGVjdGVkVG9rZW46ICAnVW5leHBlY3RlZCB0b2tlbiAlMCcsXG4gICAgICAgIFVuZXhwZWN0ZWROdW1iZXI6ICAnVW5leHBlY3RlZCBudW1iZXInLFxuICAgICAgICBVbmV4cGVjdGVkU3RyaW5nOiAgJ1VuZXhwZWN0ZWQgc3RyaW5nJyxcbiAgICAgICAgVW5leHBlY3RlZElkZW50aWZpZXI6ICAnVW5leHBlY3RlZCBpZGVudGlmaWVyJyxcbiAgICAgICAgVW5leHBlY3RlZFJlc2VydmVkOiAgJ1VuZXhwZWN0ZWQgcmVzZXJ2ZWQgd29yZCcsXG4gICAgICAgIFVuZXhwZWN0ZWRFT1M6ICAnVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnLFxuICAgICAgICBOZXdsaW5lQWZ0ZXJUaHJvdzogICdJbGxlZ2FsIG5ld2xpbmUgYWZ0ZXIgdGhyb3cnLFxuICAgICAgICBJbnZhbGlkUmVnRXhwOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nLFxuICAgICAgICBVbnRlcm1pbmF0ZWRSZWdFeHA6ICAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IG1pc3NpbmcgLycsXG4gICAgICAgIEludmFsaWRMSFNJbkFzc2lnbm1lbnQ6ICAnSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBhc3NpZ25tZW50JyxcbiAgICAgICAgSW52YWxpZExIU0luRm9ySW46ICAnSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItaW4nLFxuICAgICAgICBNdWx0aXBsZURlZmF1bHRzSW5Td2l0Y2g6ICdNb3JlIHRoYW4gb25lIGRlZmF1bHQgY2xhdXNlIGluIHN3aXRjaCBzdGF0ZW1lbnQnLFxuICAgICAgICBOb0NhdGNoT3JGaW5hbGx5OiAgJ01pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBhZnRlciB0cnknLFxuICAgICAgICBVbmtub3duTGFiZWw6ICdVbmRlZmluZWQgbGFiZWwgXFwnJTBcXCcnLFxuICAgICAgICBSZWRlY2xhcmF0aW9uOiAnJTAgXFwnJTFcXCcgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCcsXG4gICAgICAgIElsbGVnYWxDb250aW51ZTogJ0lsbGVnYWwgY29udGludWUgc3RhdGVtZW50JyxcbiAgICAgICAgSWxsZWdhbEJyZWFrOiAnSWxsZWdhbCBicmVhayBzdGF0ZW1lbnQnLFxuICAgICAgICBJbGxlZ2FsUmV0dXJuOiAnSWxsZWdhbCByZXR1cm4gc3RhdGVtZW50JyxcbiAgICAgICAgU3RyaWN0TW9kZVdpdGg6ICAnU3RyaWN0IG1vZGUgY29kZSBtYXkgbm90IGluY2x1ZGUgYSB3aXRoIHN0YXRlbWVudCcsXG4gICAgICAgIFN0cmljdENhdGNoVmFyaWFibGU6ICAnQ2F0Y2ggdmFyaWFibGUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG4gICAgICAgIFN0cmljdFZhck5hbWU6ICAnVmFyaWFibGUgbmFtZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxcbiAgICAgICAgU3RyaWN0UGFyYW1OYW1lOiAgJ1BhcmFtZXRlciBuYW1lIGV2YWwgb3IgYXJndW1lbnRzIGlzIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlJyxcbiAgICAgICAgU3RyaWN0UGFyYW1EdXBlOiAnU3RyaWN0IG1vZGUgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMnLFxuICAgICAgICBTdHJpY3RGdW5jdGlvbk5hbWU6ICAnRnVuY3Rpb24gbmFtZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxcbiAgICAgICAgU3RyaWN0T2N0YWxMaXRlcmFsOiAgJ09jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZS4nLFxuICAgICAgICBTdHJpY3REZWxldGU6ICAnRGVsZXRlIG9mIGFuIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUuJyxcbiAgICAgICAgU3RyaWN0RHVwbGljYXRlUHJvcGVydHk6ICAnRHVwbGljYXRlIGRhdGEgcHJvcGVydHkgaW4gb2JqZWN0IGxpdGVyYWwgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUnLFxuICAgICAgICBBY2Nlc3NvckRhdGFQcm9wZXJ0eTogICdPYmplY3QgbGl0ZXJhbCBtYXkgbm90IGhhdmUgZGF0YSBhbmQgYWNjZXNzb3IgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lJyxcbiAgICAgICAgQWNjZXNzb3JHZXRTZXQ6ICAnT2JqZWN0IGxpdGVyYWwgbWF5IG5vdCBoYXZlIG11bHRpcGxlIGdldC9zZXQgYWNjZXNzb3JzIHdpdGggdGhlIHNhbWUgbmFtZScsXG4gICAgICAgIFN0cmljdExIU0Fzc2lnbm1lbnQ6ICAnQXNzaWdubWVudCB0byBldmFsIG9yIGFyZ3VtZW50cyBpcyBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZScsXG4gICAgICAgIFN0cmljdExIU1Bvc3RmaXg6ICAnUG9zdGZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcbiAgICAgICAgU3RyaWN0TEhTUHJlZml4OiAgJ1ByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcbiAgICAgICAgU3RyaWN0UmVzZXJ2ZWRXb3JkOiAgJ1VzZSBvZiBmdXR1cmUgcmVzZXJ2ZWQgd29yZCBpbiBzdHJpY3QgbW9kZSdcbiAgICB9O1xuXG4gICAgLy8gU2VlIGFsc28gdG9vbHMvZ2VuZXJhdGUtdW5pY29kZS1yZWdleC5weS5cbiAgICBSZWdleCA9IHtcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IG5ldyBSZWdFeHAoJ1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMFxcdTA4QTItXFx1MDhBQ1xcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdGXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzNcXHUwQzM1LVxcdTBDMzlcXHUwQzNEXFx1MEM1OFxcdTBDNTlcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ2MFxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y0XFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkYwXFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFDXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlDMS1cXHUxOUM3XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkNDXFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OTdcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3OTNcXHVBN0EwLVxcdUE3QUFcXHVBN0Y4LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTgwLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCQzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ10nKSxcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogbmV3IFJlZ0V4cCgnW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzAwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTI3XFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMFxcdTA4QTItXFx1MDhBQ1xcdTA4RTQtXFx1MDhGRVxcdTA5MDAtXFx1MDk2M1xcdTA5NjYtXFx1MDk2RlxcdTA5NzEtXFx1MDk3N1xcdTA5NzktXFx1MDk3RlxcdTA5ODEtXFx1MDk4M1xcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkMtXFx1MDlDNFxcdTA5QzdcXHUwOUM4XFx1MDlDQi1cXHUwOUNFXFx1MDlEN1xcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUzXFx1MDlFNi1cXHUwOUYxXFx1MEEwMS1cXHUwQTAzXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTNDXFx1MEEzRS1cXHUwQTQyXFx1MEE0N1xcdTBBNDhcXHUwQTRCLVxcdTBBNERcXHUwQTUxXFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNjYtXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCQy1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFEMFxcdTBBRTAtXFx1MEFFM1xcdTBBRTYtXFx1MEFFRlxcdTBCMDEtXFx1MEIwM1xcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNDLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjNcXHUwQjY2LVxcdTBCNkZcXHUwQjcxXFx1MEI4MlxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEMFxcdTBCRDdcXHUwQkU2LVxcdTBCRUZcXHUwQzAxLVxcdTBDMDNcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzNcXHUwQzM1LVxcdTBDMzlcXHUwQzNELVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNThcXHUwQzU5XFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MlxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDJcXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1N1xcdTBENjAtXFx1MEQ2M1xcdTBENjYtXFx1MEQ2RlxcdTBEN0EtXFx1MEQ3RlxcdTBEODJcXHUwRDgzXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBEQ0FcXHUwRENGLVxcdTBERDRcXHUwREQ2XFx1MEREOC1cXHUwRERGXFx1MERGMlxcdTBERjNcXHUwRTAxLVxcdTBFM0FcXHUwRTQwLVxcdTBFNEVcXHUwRTUwLVxcdTBFNTlcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCOVxcdTBFQkItXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRUM4LVxcdTBFQ0RcXHUwRUQwLVxcdTBFRDlcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEYxOFxcdTBGMTlcXHUwRjIwLVxcdTBGMjlcXHUwRjM1XFx1MEYzN1xcdTBGMzlcXHUwRjNFLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjcxLVxcdTBGODRcXHUwRjg2LVxcdTBGOTdcXHUwRjk5LVxcdTBGQkNcXHUwRkM2XFx1MTAwMC1cXHUxMDQ5XFx1MTA1MC1cXHUxMDlEXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzNUQtXFx1MTM1RlxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGMFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxNFxcdTE3MjAtXFx1MTczNFxcdTE3NDAtXFx1MTc1M1xcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3NzJcXHUxNzczXFx1MTc4MC1cXHUxN0QzXFx1MTdEN1xcdTE3RENcXHUxN0REXFx1MTdFMC1cXHUxN0U5XFx1MTgwQi1cXHUxODBEXFx1MTgxMC1cXHUxODE5XFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFDXFx1MTkyMC1cXHUxOTJCXFx1MTkzMC1cXHUxOTNCXFx1MTk0Ni1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MTlEMC1cXHUxOUQ5XFx1MUEwMC1cXHUxQTFCXFx1MUEyMC1cXHUxQTVFXFx1MUE2MC1cXHUxQTdDXFx1MUE3Ri1cXHUxQTg5XFx1MUE5MC1cXHUxQTk5XFx1MUFBN1xcdTFCMDAtXFx1MUI0QlxcdTFCNTAtXFx1MUI1OVxcdTFCNkItXFx1MUI3M1xcdTFCODAtXFx1MUJGM1xcdTFDMDAtXFx1MUMzN1xcdTFDNDAtXFx1MUM0OVxcdTFDNEQtXFx1MUM3RFxcdTFDRDAtXFx1MUNEMlxcdTFDRDQtXFx1MUNGNlxcdTFEMDAtXFx1MURFNlxcdTFERkMtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OVxcdTMwOUFcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGQ0NcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2OTdcXHVBNjlGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3OEVcXHVBNzkwLVxcdUE3OTNcXHVBN0EwLVxcdUE3QUFcXHVBN0Y4LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzRcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QTkwMC1cXHVBOTJEXFx1QTkzMC1cXHVBOTUzXFx1QTk2MC1cXHVBOTdDXFx1QTk4MC1cXHVBOUMwXFx1QTlDRi1cXHVBOUQ5XFx1QUEwMC1cXHVBQTM2XFx1QUE0MC1cXHVBQTREXFx1QUE1MC1cXHVBQTU5XFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBN0JcXHVBQTgwLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQkMwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTI2XFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXScpXG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGUgY29uZGl0aW9uIGlzIHRydWUsIG90aGVyd2lzZSB0aHJvdyBhbiBlcnJvci5cbiAgICAvLyBUaGlzIGlzIG9ubHkgdG8gaGF2ZSBhIGJldHRlciBjb250cmFjdCBzZW1hbnRpYywgaS5lLiBhbm90aGVyIHNhZmV0eSBuZXRcbiAgICAvLyB0byBjYXRjaCBhIGxvZ2ljIGVycm9yLiBUaGUgY29uZGl0aW9uIHNoYWxsIGJlIGZ1bGZpbGxlZCBpbiBub3JtYWwgY2FzZS5cbiAgICAvLyBEbyBOT1QgdXNlIHRoaXMgdG8gZW5mb3JjZSBhIGNlcnRhaW4gY29uZGl0aW9uIG9uIGFueSB1c2VyIGlucHV0LlxuXG4gICAgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQVNTRVJUOiAnICsgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgICAgICByZXR1cm4gKGNoID49IDQ4ICYmIGNoIDw9IDU3KTsgICAvLyAwLi45XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNIZXhEaWdpdChjaCkge1xuICAgICAgICByZXR1cm4gJzAxMjM0NTY3ODlhYmNkZWZBQkNERUYnLmluZGV4T2YoY2gpID49IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiAnMDEyMzQ1NjcnLmluZGV4T2YoY2gpID49IDA7XG4gICAgfVxuXG5cbiAgICAvLyA3LjIgV2hpdGUgU3BhY2VcblxuICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkge1xuICAgICAgICByZXR1cm4gKGNoID09PSAweDIwKSB8fCAoY2ggPT09IDB4MDkpIHx8IChjaCA9PT0gMHgwQikgfHwgKGNoID09PSAweDBDKSB8fCAoY2ggPT09IDB4QTApIHx8XG4gICAgICAgICAgICAoY2ggPj0gMHgxNjgwICYmIFsweDE2ODAsIDB4MTgwRSwgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsIDB4MjAyRiwgMHgyMDVGLCAweDMwMDAsIDB4RkVGRl0uaW5kZXhPZihjaCkgPj0gMCk7XG4gICAgfVxuXG4gICAgLy8gNy4zIExpbmUgVGVybWluYXRvcnNcblxuICAgIGZ1bmN0aW9uIGlzTGluZVRlcm1pbmF0b3IoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA9PT0gMHgwQSkgfHwgKGNoID09PSAweDBEKSB8fCAoY2ggPT09IDB4MjAyOCkgfHwgKGNoID09PSAweDIwMjkpO1xuICAgIH1cblxuICAgIC8vIDcuNiBJZGVudGlmaWVyIE5hbWVzIGFuZCBJZGVudGlmaWVyc1xuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA9PSAweDQwKSB8fCAgKGNoID09PSAweDI0KSB8fCAoY2ggPT09IDB4NUYpIHx8ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgICAgICAgICAgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSkgfHwgICAgICAgICAvLyBBLi5aXG4gICAgICAgICAgICAoY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBKSB8fCAgICAgICAgIC8vIGEuLnpcbiAgICAgICAgICAgIChjaCA9PT0gMHg1QykgfHwgICAgICAgICAgICAgICAgICAgICAgLy8gXFwgKGJhY2tzbGFzaClcbiAgICAgICAgICAgICgoY2ggPj0gMHg4MCkgJiYgUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY2gpIHtcbiAgICAgICAgcmV0dXJuIChjaCA9PT0gMHgyNCkgfHwgKGNoID09PSAweDVGKSB8fCAgLy8gJCAoZG9sbGFyKSBhbmQgXyAodW5kZXJzY29yZSlcbiAgICAgICAgICAgIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEpIHx8ICAgICAgICAgLy8gQS4uWlxuICAgICAgICAgICAgKGNoID49IDB4NjEgJiYgY2ggPD0gMHg3QSkgfHwgICAgICAgICAvLyBhLi56XG4gICAgICAgICAgICAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB8fCAgICAgICAgIC8vIDAuLjlcbiAgICAgICAgICAgIChjaCA9PT0gMHg1QykgfHwgICAgICAgICAgICAgICAgICAgICAgLy8gXFwgKGJhY2tzbGFzaClcbiAgICAgICAgICAgICgoY2ggPj0gMHg4MCkgJiYgUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyUGFydC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKSk7XG4gICAgfVxuXG4gICAgLy8gNy42LjEuMiBGdXR1cmUgUmVzZXJ2ZWQgV29yZHNcblxuICAgIGZ1bmN0aW9uIGlzRnV0dXJlUmVzZXJ2ZWRXb3JkKGlkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgY2FzZSAnZXh0ZW5kcyc6XG4gICAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIGNhc2UgJ3N1cGVyJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKGlkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgY2FzZSAnaW1wbGVtZW50cyc6XG4gICAgICAgIGNhc2UgJ2ludGVyZmFjZSc6XG4gICAgICAgIGNhc2UgJ3BhY2thZ2UnOlxuICAgICAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgICAgY2FzZSAncHJvdGVjdGVkJzpcbiAgICAgICAgY2FzZSAncHVibGljJzpcbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgY2FzZSAneWllbGQnOlxuICAgICAgICBjYXNlICdsZXQnOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRXb3JkKGlkKSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ2V2YWwnIHx8IGlkID09PSAnYXJndW1lbnRzJztcbiAgICB9XG5cbiAgICAvLyA3LjYuMS4xIEtleXdvcmRzXG5cbiAgICBmdW5jdGlvbiBpc0tleXdvcmQoaWQpIHtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdjb25zdCcgaXMgc3BlY2lhbGl6ZWQgYXMgS2V5d29yZCBpbiBWOC5cbiAgICAgICAgLy8gJ3lpZWxkJyBhbmQgJ2xldCcgYXJlIGZvciBjb21wYXRpYmxpdHkgd2l0aCBTcGlkZXJNb25rZXkgYW5kIEVTLm5leHQuXG4gICAgICAgIC8vIFNvbWUgb3RoZXJzIGFyZSBmcm9tIGZ1dHVyZSByZXNlcnZlZCB3b3Jkcy5cblxuICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaWYnKSB8fCAoaWQgPT09ICdpbicpIHx8IChpZCA9PT0gJ2RvJyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3RyeScpIHx8IChpZCA9PT0gJ2xldCcpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA3LjQgQ29tbWVudHNcblxuICAgIGZ1bmN0aW9uIGFkZENvbW1lbnQodHlwZSwgdmFsdWUsIHN0YXJ0LCBlbmQsIGxvYykge1xuICAgICAgICB2YXIgY29tbWVudCwgYXR0YWNoZXI7XG5cbiAgICAgICAgYXNzZXJ0KHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicsICdDb21tZW50IG11c3QgaGF2ZSB2YWxpZCBwb3NpdGlvbicpO1xuXG4gICAgICAgIC8vIEJlY2F1c2UgdGhlIHdheSB0aGUgYWN0dWFsIHRva2VuIGlzIHNjYW5uZWQsIG9mdGVuIHRoZSBjb21tZW50c1xuICAgICAgICAvLyAoaWYgYW55KSBhcmUgc2tpcHBlZCB0d2ljZSBkdXJpbmcgdGhlIGxleGljYWwgYW5hbHlzaXMuXG4gICAgICAgIC8vIFRodXMsIHdlIG5lZWQgdG8gc2tpcCBhZGRpbmcgYSBjb21tZW50IGlmIHRoZSBjb21tZW50IGFycmF5IGFscmVhZHlcbiAgICAgICAgLy8gaGFuZGxlZCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmxhc3RDb21tZW50U3RhcnQgPj0gc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sYXN0Q29tbWVudFN0YXJ0ID0gc3RhcnQ7XG5cbiAgICAgICAgY29tbWVudCA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGV4dHJhLnJhbmdlKSB7XG4gICAgICAgICAgICBjb21tZW50LnJhbmdlID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHRyYS5sb2MpIHtcbiAgICAgICAgICAgIGNvbW1lbnQubG9jID0gbG9jO1xuICAgICAgICB9XG4gICAgICAgIGV4dHJhLmNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgIGlmIChleHRyYS5hdHRhY2hDb21tZW50KSB7XG4gICAgICAgICAgICBleHRyYS5sZWFkaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgIGV4dHJhLnRyYWlsaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNraXBTaW5nbGVMaW5lQ29tbWVudChvZmZzZXQpIHtcbiAgICAgICAgdmFyIHN0YXJ0LCBsb2MsIGNoLCBjb21tZW50O1xuXG4gICAgICAgIHN0YXJ0ID0gaW5kZXggLSBvZmZzZXQ7XG4gICAgICAgIGxvYyA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgbGluZTogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0IC0gb2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICBpZiAoaXNMaW5lVGVybWluYXRvcihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEuY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHNvdXJjZS5zbGljZShzdGFydCArIG9mZnNldCwgaW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jLmVuZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0IC0gMVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhZGRDb21tZW50KCdMaW5lJywgY29tbWVudCwgc3RhcnQsIGluZGV4IC0gMSwgbG9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAxMyAmJiBzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICsrbGluZU51bWJlcjtcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSBpbmRleDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXh0cmEuY29tbWVudHMpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQgKyBvZmZzZXQsIGluZGV4KTtcbiAgICAgICAgICAgIGxvYy5lbmQgPSB7XG4gICAgICAgICAgICAgICAgbGluZTogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkQ29tbWVudCgnTGluZScsIGNvbW1lbnQsIHN0YXJ0LCBpbmRleCwgbG9jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNraXBNdWx0aUxpbmVDb21tZW50KCkge1xuICAgICAgICB2YXIgc3RhcnQsIGxvYywgY2gsIGNvbW1lbnQ7XG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnRzKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4IC0gMjtcbiAgICAgICAgICAgIGxvYyA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0IC0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDBEICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4MEEpIHtcbiAgICAgICAgICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKytsaW5lTnVtYmVyO1xuICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4sICdJTExFR0FMJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyQSkge1xuICAgICAgICAgICAgICAgIC8vIEJsb2NrIGNvbW1lbnQgZW5kcyB3aXRoICcqLycuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4MkYpIHtcbiAgICAgICAgICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc291cmNlLnNsaWNlKHN0YXJ0ICsgMiwgaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYy5lbmQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ29tbWVudCgnQmxvY2snLCBjb21tZW50LCBzdGFydCwgaW5kZXgsIGxvYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNraXBDb21tZW50KCkge1xuICAgICAgICB2YXIgY2gsIHN0YXJ0O1xuXG4gICAgICAgIHN0YXJ0ID0gKGluZGV4ID09PSAwKTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGlzV2hpdGVTcGFjZShjaCkpIHtcbiAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xpbmVUZXJtaW5hdG9yKGNoKSkge1xuICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDBEICYmIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwQSkge1xuICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICArK2xpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyRikgeyAvLyBVKzAwMkYgaXMgJy8nXG4gICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgyRikge1xuICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBza2lwU2luZ2xlTGluZUNvbW1lbnQoMik7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJBKSB7ICAvLyBVKzAwMkEgaXMgJyonXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNraXBNdWx0aUxpbmVDb21tZW50KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCAmJiBjaCA9PT0gMHgyRCkgeyAvLyBVKzAwMkQgaXMgJy0nXG4gICAgICAgICAgICAgICAgLy8gVSswMDNFIGlzICc+J1xuICAgICAgICAgICAgICAgIGlmICgoc291cmNlLmNoYXJDb2RlQXQoaW5kZXggKyAxKSA9PT0gMHgyRCkgJiYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMikgPT09IDB4M0UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICctLVx4M2UnIGlzIGEgc2luZ2xlLWxpbmUgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzO1xuICAgICAgICAgICAgICAgICAgICBza2lwU2luZ2xlTGluZUNvbW1lbnQoMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzQykgeyAvLyBVKzAwM0MgaXMgJzwnXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5zbGljZShpbmRleCArIDEsIGluZGV4ICsgNCkgPT09ICchLS0nKSB7XG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7IC8vIGA8YFxuICAgICAgICAgICAgICAgICAgICArK2luZGV4OyAvLyBgIWBcbiAgICAgICAgICAgICAgICAgICAgKytpbmRleDsgLy8gYC1gXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7IC8vIGAtYFxuICAgICAgICAgICAgICAgICAgICBza2lwU2luZ2xlTGluZUNvbW1lbnQoNCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYW5IZXhFc2NhcGUocHJlZml4KSB7XG4gICAgICAgIHZhciBpLCBsZW4sIGNoLCBjb2RlID0gMDtcblxuICAgICAgICBsZW4gPSAocHJlZml4ID09PSAndScpID8gNCA6IDI7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGlzSGV4RGlnaXQoc291cmNlW2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZVtpbmRleCsrXTtcbiAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgJzAxMjM0NTY3ODlhYmNkZWYnLmluZGV4T2YoY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFc2NhcGVkSWRlbnRpZmllcigpIHtcbiAgICAgICAgdmFyIGNoLCBpZDtcblxuICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KyspO1xuICAgICAgICBpZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuXG4gICAgICAgIC8vICdcXHUnIChVKzAwNUMsIFUrMDA3NSkgZGVub3RlcyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICAgICAgaWYgKGNoID09PSAweDVDKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpICE9PSAweDc1KSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgIGNoID0gc2NhbkhleEVzY2FwZSgndScpO1xuICAgICAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJ1xcXFwnIHx8ICFpc0lkZW50aWZpZXJTdGFydChjaC5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkID0gY2g7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFpc0lkZW50aWZpZXJQYXJ0KGNoKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgIGlkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuXG4gICAgICAgICAgICAvLyAnXFx1JyAoVSswMDVDLCBVKzAwNzUpIGRlbm90ZXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAgICAgICAgICBpZiAoY2ggPT09IDB4NUMpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGlkLnN1YnN0cigwLCBpZC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpICE9PSAweDc1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgICAgICBjaCA9IHNjYW5IZXhFc2NhcGUoJ3UnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoIHx8IGNoID09PSAnXFxcXCcgfHwgIWlzSWRlbnRpZmllclBhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZCArPSBjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJZGVudGlmaWVyKCkge1xuICAgICAgICB2YXIgc3RhcnQsIGNoO1xuXG4gICAgICAgIHN0YXJ0ID0gaW5kZXgrKztcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gMHg1Qykge1xuICAgICAgICAgICAgICAgIC8vIEJsYWNrc2xhc2ggKFUrMDA1QykgbWFya3MgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UuXG4gICAgICAgICAgICAgICAgaW5kZXggPSBzdGFydDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RXNjYXBlZElkZW50aWZpZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0lkZW50aWZpZXJQYXJ0KGNoKSkge1xuICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZShzdGFydCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYW5JZGVudGlmaWVyKCkge1xuICAgICAgICB2YXIgc3RhcnQsIGlkLCB0eXBlO1xuXG4gICAgICAgIHN0YXJ0ID0gaW5kZXg7XG5cbiAgICAgICAgLy8gQmFja3NsYXNoIChVKzAwNUMpIHN0YXJ0cyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICAgICAgaWQgPSAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpID09PSAweDVDKSA/IGdldEVzY2FwZWRJZGVudGlmaWVyKCkgOiBnZXRJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgLy8gVGhlcmUgaXMgbm8ga2V5d29yZCBvciBsaXRlcmFsIHdpdGggb25seSBvbmUgY2hhcmFjdGVyLlxuICAgICAgICAvLyBUaHVzLCBpdCBtdXN0IGJlIGFuIGlkZW50aWZpZXIuXG4gICAgICAgIGlmIChpZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHR5cGUgPSBUb2tlbi5JZGVudGlmaWVyO1xuICAgICAgICB9IGVsc2UgaWYgKGlzS2V5d29yZChpZCkpIHtcbiAgICAgICAgICAgIHR5cGUgPSBUb2tlbi5LZXl3b3JkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHR5cGUgPSBUb2tlbi5OdWxsTGl0ZXJhbDtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB0eXBlID0gVG9rZW4uQm9vbGVhbkxpdGVyYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gVG9rZW4uSWRlbnRpZmllcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdmFsdWU6IGlkLFxuICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgLy8gNy43IFB1bmN0dWF0b3JzXG5cbiAgICBmdW5jdGlvbiBzY2FuUHVuY3R1YXRvcigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gaW5kZXgsXG4gICAgICAgICAgICBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpLFxuICAgICAgICAgICAgY29kZTIsXG4gICAgICAgICAgICBjaDEgPSBzb3VyY2VbaW5kZXhdLFxuICAgICAgICAgICAgY2gyLFxuICAgICAgICAgICAgY2gzLFxuICAgICAgICAgICAgY2g0O1xuXG4gICAgICAgIHN3aXRjaCAoY29kZSkge1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBtb3N0IGNvbW1vbiBzaW5nbGUtY2hhcmFjdGVyIHB1bmN0dWF0b3JzLlxuICAgICAgICBjYXNlIDB4MkU6ICAvLyAuIGRvdFxuICAgICAgICBjYXNlIDB4Mjg6ICAvLyAoIG9wZW4gYnJhY2tldFxuICAgICAgICBjYXNlIDB4Mjk6ICAvLyApIGNsb3NlIGJyYWNrZXRcbiAgICAgICAgY2FzZSAweDNCOiAgLy8gOyBzZW1pY29sb25cbiAgICAgICAgY2FzZSAweDJDOiAgLy8gLCBjb21tYVxuICAgICAgICBjYXNlIDB4N0I6ICAvLyB7IG9wZW4gY3VybHkgYnJhY2VcbiAgICAgICAgY2FzZSAweDdEOiAgLy8gfSBjbG9zZSBjdXJseSBicmFjZVxuICAgICAgICBjYXNlIDB4NUI6ICAvLyBbXG4gICAgICAgIGNhc2UgMHg1RDogIC8vIF1cbiAgICAgICAgY2FzZSAweDNBOiAgLy8gOlxuICAgICAgICBjYXNlIDB4M0Y6ICAvLyA/XG4gICAgICAgIGNhc2UgMHg3RTogIC8vIH5cbiAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICBpZiAoZXh0cmEudG9rZW5pemUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyOCkge1xuICAgICAgICAgICAgICAgICAgICBleHRyYS5vcGVuUGFyZW5Ub2tlbiA9IGV4dHJhLnRva2Vucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDdCKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLm9wZW5DdXJseVRva2VuID0gZXh0cmEudG9rZW5zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFRva2VuLlB1bmN0dWF0b3IsXG4gICAgICAgICAgICAgICAgdmFsdWU6IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSksXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICAgICAgfTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29kZTIgPSBzb3VyY2UuY2hhckNvZGVBdChpbmRleCArIDEpO1xuXG4gICAgICAgICAgICAvLyAnPScgKFUrMDAzRCkgbWFya3MgYW4gYXNzaWdubWVudCBvciBjb21wYXJpc29uIG9wZXJhdG9yLlxuICAgICAgICAgICAgaWYgKGNvZGUyID09PSAweDNEKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAweDJCOiAgLy8gK1xuICAgICAgICAgICAgICAgIGNhc2UgMHgyRDogIC8vIC1cbiAgICAgICAgICAgICAgICBjYXNlIDB4MkY6ICAvLyAvXG4gICAgICAgICAgICAgICAgY2FzZSAweDNDOiAgLy8gPFxuICAgICAgICAgICAgICAgIGNhc2UgMHgzRTogIC8vID5cbiAgICAgICAgICAgICAgICBjYXNlIDB4NUU6ICAvLyBeXG4gICAgICAgICAgICAgICAgY2FzZSAweDdDOiAgLy8gfFxuICAgICAgICAgICAgICAgIGNhc2UgMHgyNTogIC8vICVcbiAgICAgICAgICAgICAgICBjYXNlIDB4MjY6ICAvLyAmXG4gICAgICAgICAgICAgICAgY2FzZSAweDJBOiAgLy8gKlxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVG9rZW4uUHVuY3R1YXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlMiksXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGluZGV4XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjYXNlIDB4MjE6IC8vICFcbiAgICAgICAgICAgICAgICBjYXNlIDB4M0Q6IC8vID1cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcblxuICAgICAgICAgICAgICAgICAgICAvLyAhPT0gYW5kID09PVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpID09PSAweDNEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUb2tlbi5QdW5jdHVhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNvdXJjZS5zbGljZShzdGFydCwgaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQtY2hhcmFjdGVyIHB1bmN0dWF0b3I6ID4+Pj1cblxuICAgICAgICBjaDQgPSBzb3VyY2Uuc3Vic3RyKGluZGV4LCA0KTtcblxuICAgICAgICBpZiAoY2g0ID09PSAnPj4+PScpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IDQ7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFRva2VuLlB1bmN0dWF0b3IsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNoNCxcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IGluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy1jaGFyYWN0ZXIgcHVuY3R1YXRvcnM6ID09PSAhPT0gPj4+IDw8PSA+Pj1cblxuICAgICAgICBjaDMgPSBjaDQuc3Vic3RyKDAsIDMpO1xuXG4gICAgICAgIGlmIChjaDMgPT09ICc+Pj4nIHx8IGNoMyA9PT0gJzw8PScgfHwgY2gzID09PSAnPj49Jykge1xuICAgICAgICAgICAgaW5kZXggKz0gMztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogVG9rZW4uUHVuY3R1YXRvcixcbiAgICAgICAgICAgICAgICB2YWx1ZTogY2gzLFxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogaW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlciAyLWNoYXJhY3RlciBwdW5jdHVhdG9yczogKysgLS0gPDwgPj4gJiYgfHxcbiAgICAgICAgY2gyID0gY2gzLnN1YnN0cigwLCAyKTtcblxuICAgICAgICBpZiAoKGNoMSA9PT0gY2gyWzFdICYmICgnKy08PiZ8Jy5pbmRleE9mKGNoMSkgPj0gMCkpIHx8IGNoMiA9PT0gJz0+Jykge1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogVG9rZW4uUHVuY3R1YXRvcixcbiAgICAgICAgICAgICAgICB2YWx1ZTogY2gyLFxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogaW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAxLWNoYXJhY3RlciBwdW5jdHVhdG9yczogPCA+ID0gISArIC0gKiAlICYgfCBeIC9cbiAgICAgICAgaWYgKCc8Pj0hKy0qJSZ8Xi8nLmluZGV4T2YoY2gxKSA+PSAwKSB7XG4gICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBUb2tlbi5QdW5jdHVhdG9yLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjaDEsXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICB9XG5cbiAgICAvLyA3LjguMyBOdW1lcmljIExpdGVyYWxzXG5cbiAgICBmdW5jdGlvbiBzY2FuSGV4TGl0ZXJhbChzdGFydCkge1xuICAgICAgICB2YXIgbnVtYmVyID0gJyc7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoc291cmNlW2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bWJlciArPSBzb3VyY2VbaW5kZXgrK107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlbi5OdW1lcmljTGl0ZXJhbCxcbiAgICAgICAgICAgIHZhbHVlOiBwYXJzZUludCgnMHgnICsgbnVtYmVyLCAxNiksXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGluZGV4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nhbk9jdGFsTGl0ZXJhbChzdGFydCkge1xuICAgICAgICB2YXIgbnVtYmVyID0gJzAnICsgc291cmNlW2luZGV4KytdO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghaXNPY3RhbERpZ2l0KHNvdXJjZVtpbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudW1iZXIgKz0gc291cmNlW2luZGV4KytdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkgfHwgaXNEZWNpbWFsRGlnaXQoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuLk51bWVyaWNMaXRlcmFsLFxuICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KG51bWJlciwgOCksXG4gICAgICAgICAgICBvY3RhbDogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogaW5kZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2FuTnVtZXJpY0xpdGVyYWwoKSB7XG4gICAgICAgIHZhciBudW1iZXIsIHN0YXJ0LCBjaDtcblxuICAgICAgICBjaCA9IHNvdXJjZVtpbmRleF07XG4gICAgICAgIGFzc2VydChpc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSB8fCAoY2ggPT09ICcuJyksXG4gICAgICAgICAgICAnTnVtZXJpYyBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIGRlY2ltYWwgZGlnaXQgb3IgYSBkZWNpbWFsIHBvaW50Jyk7XG5cbiAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgbnVtYmVyID0gJyc7XG4gICAgICAgIGlmIChjaCAhPT0gJy4nKSB7XG4gICAgICAgICAgICBudW1iZXIgPSBzb3VyY2VbaW5kZXgrK107XG4gICAgICAgICAgICBjaCA9IHNvdXJjZVtpbmRleF07XG5cbiAgICAgICAgICAgIC8vIEhleCBudW1iZXIgc3RhcnRzIHdpdGggJzB4Jy5cbiAgICAgICAgICAgIC8vIE9jdGFsIG51bWJlciBzdGFydHMgd2l0aCAnMCcuXG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAnMCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd4JyB8fCBjaCA9PT0gJ1gnKSB7XG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FuSGV4TGl0ZXJhbChzdGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FuT2N0YWxMaXRlcmFsKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBkZWNpbWFsIG51bWJlciBzdGFydHMgd2l0aCAnMCcgc3VjaCBhcyAnMDknIGlzIGlsbGVnYWwuXG4gICAgICAgICAgICAgICAgaWYgKGNoICYmIGlzRGVjaW1hbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChpc0RlY2ltYWxEaWdpdChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyICs9IHNvdXJjZVtpbmRleCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoID0gc291cmNlW2luZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBudW1iZXIgKz0gc291cmNlW2luZGV4KytdO1xuICAgICAgICAgICAgd2hpbGUgKGlzRGVjaW1hbERpZ2l0KHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgKz0gc291cmNlW2luZGV4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2ggPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoID09PSAnZScgfHwgY2ggPT09ICdFJykge1xuICAgICAgICAgICAgbnVtYmVyICs9IHNvdXJjZVtpbmRleCsrXTtcblxuICAgICAgICAgICAgY2ggPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGNoID09PSAnKycgfHwgY2ggPT09ICctJykge1xuICAgICAgICAgICAgICAgIG51bWJlciArPSBzb3VyY2VbaW5kZXgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEZWNpbWFsRGlnaXQoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChpc0RlY2ltYWxEaWdpdChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlciArPSBzb3VyY2VbaW5kZXgrK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4sICdJTExFR0FMJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCAnSUxMRUdBTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuLk51bWVyaWNMaXRlcmFsLFxuICAgICAgICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKSxcbiAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogaW5kZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA3LjguNCBTdHJpbmcgTGl0ZXJhbHNcblxuICAgIGZ1bmN0aW9uIHNjYW5TdHJpbmdMaXRlcmFsKCkge1xuICAgICAgICB2YXIgc3RyID0gJycsIHF1b3RlLCBzdGFydCwgY2gsIGNvZGUsIHVuZXNjYXBlZCwgcmVzdG9yZSwgb2N0YWwgPSBmYWxzZSwgc3RhcnRMaW5lTnVtYmVyLCBzdGFydExpbmVTdGFydDtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyID0gbGluZU51bWJlcjtcbiAgICAgICAgc3RhcnRMaW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG5cbiAgICAgICAgcXVvdGUgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgICBhc3NlcnQoKHF1b3RlID09PSAnXFwnJyB8fCBxdW90ZSA9PT0gJ1wiJyksXG4gICAgICAgICAgICAnU3RyaW5nIGxpdGVyYWwgbXVzdCBzdGFydHMgd2l0aCBhIHF1b3RlJyk7XG5cbiAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgKytpbmRleDtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoID0gc291cmNlW2luZGV4KytdO1xuXG4gICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgICAgICAgICAgcXVvdGUgPSAnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgIGNoID0gc291cmNlW2luZGV4KytdO1xuICAgICAgICAgICAgICAgIGlmICghY2ggfHwgIWlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWQgPSBzY2FuSGV4RXNjYXBlKGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdW5lc2NhcGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHJlc3RvcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGYnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHgwQic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2N0YWxEaWdpdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJzAxMjM0NTY3Jy5pbmRleE9mKGNoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFxcMCBpcyBub3Qgb2N0YWwgZXNjYXBlIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCAmJiBpc09jdGFsRGlnaXQoc291cmNlW2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyAnMDEyMzQ1NjcnLmluZGV4T2Yoc291cmNlW2luZGV4KytdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIGRpZ2l0cyBhcmUgb25seSBhbGxvd2VkIHdoZW4gc3RyaW5nIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAsIDEsIDIsIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcwMTIzJy5pbmRleE9mKGNoKSA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09jdGFsRGlnaXQoc291cmNlW2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArICcwMTIzNDU2NycuaW5kZXhPZihzb3VyY2VbaW5kZXgrK10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrbGluZU51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAgJ1xccicgJiYgc291cmNlW2luZGV4XSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChxdW90ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlbi5TdHJpbmdMaXRlcmFsLFxuICAgICAgICAgICAgdmFsdWU6IHN0cixcbiAgICAgICAgICAgIG9jdGFsOiBvY3RhbCxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogc3RhcnRMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRMaW5lU3RhcnQ6IHN0YXJ0TGluZVN0YXJ0LFxuICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RSZWdFeHAocGF0dGVybiwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuSW52YWxpZFJlZ0V4cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYW5SZWdFeHBCb2R5KCkge1xuICAgICAgICB2YXIgY2gsIHN0ciwgY2xhc3NNYXJrZXIsIHRlcm1pbmF0ZWQsIGJvZHk7XG5cbiAgICAgICAgY2ggPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgICBhc3NlcnQoY2ggPT09ICcvJywgJ1JlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoJyk7XG4gICAgICAgIHN0ciA9IHNvdXJjZVtpbmRleCsrXTtcblxuICAgICAgICBjbGFzc01hcmtlciA9IGZhbHNlO1xuICAgICAgICB0ZXJtaW5hdGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2ggPSBzb3VyY2VbaW5kZXgrK107XG4gICAgICAgICAgICBzdHIgKz0gY2g7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgIGNoID0gc291cmNlW2luZGV4KytdO1xuICAgICAgICAgICAgICAgIC8vIEVDTUEtMjYyIDcuOC41XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW50ZXJtaW5hdGVkUmVnRXhwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuVW50ZXJtaW5hdGVkUmVnRXhwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhjbHVkZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgYm9keSA9IHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGJvZHksXG4gICAgICAgICAgICBsaXRlcmFsOiBzdHJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2FuUmVnRXhwRmxhZ3MoKSB7XG4gICAgICAgIHZhciBjaCwgc3RyLCBmbGFncywgcmVzdG9yZTtcblxuICAgICAgICBzdHIgPSAnJztcbiAgICAgICAgZmxhZ3MgPSAnJztcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaCA9IHNvdXJjZVtpbmRleF07XG4gICAgICAgICAgICBpZiAoIWlzSWRlbnRpZmllclBhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2ggPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7XG4gICAgICAgICAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmUgPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSBzY2FuSGV4RXNjYXBlKCd1Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHN0ciArPSAnXFxcXHUnOyByZXN0b3JlIDwgaW5kZXg7ICsrcmVzdG9yZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBzb3VyY2VbcmVzdG9yZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHJlc3RvcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyArPSAndSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx1JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgJ0lMTEVHQUwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsYWdzICs9IGNoO1xuICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogZmxhZ3MsXG4gICAgICAgICAgICBsaXRlcmFsOiBzdHJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2FuUmVnRXhwKCkge1xuICAgICAgICB2YXIgc3RhcnQsIGJvZHksIGZsYWdzLCBwYXR0ZXJuLCB2YWx1ZTtcblxuICAgICAgICBsb29rYWhlYWQgPSBudWxsO1xuICAgICAgICBza2lwQ29tbWVudCgpO1xuICAgICAgICBzdGFydCA9IGluZGV4O1xuXG4gICAgICAgIGJvZHkgPSBzY2FuUmVnRXhwQm9keSgpO1xuICAgICAgICBmbGFncyA9IHNjYW5SZWdFeHBGbGFncygpO1xuICAgICAgICB2YWx1ZSA9IHRlc3RSZWdFeHAoYm9keS52YWx1ZSwgZmxhZ3MudmFsdWUpO1xuXG4gICAgICAgIGlmIChleHRyYS50b2tlbml6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBUb2tlbi5SZWd1bGFyRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZU51bWJlcixcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaXRlcmFsOiBib2R5LmxpdGVyYWwgKyBmbGFncy5saXRlcmFsLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBpbmRleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbGxlY3RSZWdleCgpIHtcbiAgICAgICAgdmFyIHBvcywgbG9jLCByZWdleCwgdG9rZW47XG5cbiAgICAgICAgc2tpcENvbW1lbnQoKTtcblxuICAgICAgICBwb3MgPSBpbmRleDtcbiAgICAgICAgbG9jID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICBsaW5lOiBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogaW5kZXggLSBsaW5lU3RhcnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZWdleCA9IHNjYW5SZWdFeHAoKTtcbiAgICAgICAgbG9jLmVuZCA9IHtcbiAgICAgICAgICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICBjb2x1bW46IGluZGV4IC0gbGluZVN0YXJ0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgaWYgKCFleHRyYS50b2tlbml6ZSkge1xuICAgICAgICAgICAgLy8gUG9wIHRoZSBwcmV2aW91cyB0b2tlbiwgd2hpY2ggaXMgbGlrZWx5ICcvJyBvciAnLz0nXG4gICAgICAgICAgICBpZiAoZXh0cmEudG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGV4dHJhLnRva2Vuc1tleHRyYS50b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnJhbmdlWzBdID09PSBwb3MgJiYgdG9rZW4udHlwZSA9PT0gJ1B1bmN0dWF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJy8nIHx8IHRva2VuLnZhbHVlID09PSAnLz0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS50b2tlbnMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4dHJhLnRva2Vucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUmVndWxhckV4cHJlc3Npb24nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZWdleC5saXRlcmFsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBbcG9zLCBpbmRleF0sXG4gICAgICAgICAgICAgICAgbG9jOiBsb2NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllck5hbWUodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLnR5cGUgPT09IFRva2VuLklkZW50aWZpZXIgfHxcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuLktleXdvcmQgfHxcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuLkJvb2xlYW5MaXRlcmFsIHx8XG4gICAgICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlbi5OdWxsTGl0ZXJhbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZHZhbmNlU2xhc2goKSB7XG4gICAgICAgIHZhciBwcmV2VG9rZW4sXG4gICAgICAgICAgICBjaGVja1Rva2VuO1xuICAgICAgICAvLyBVc2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc3dlZXQuanMvd2lraS9kZXNpZ25cbiAgICAgICAgcHJldlRva2VuID0gZXh0cmEudG9rZW5zW2V4dHJhLnRva2Vucy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgYmVmb3JlIHRoYXQ6IGl0IGNhbm5vdCBiZSBhIGRpdmlzaW9uLlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RSZWdleCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2VG9rZW4udHlwZSA9PT0gJ1B1bmN0dWF0b3InKSB7XG4gICAgICAgICAgICBpZiAocHJldlRva2VuLnZhbHVlID09PSAnXScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NhblB1bmN0dWF0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2VG9rZW4udmFsdWUgPT09ICcpJykge1xuICAgICAgICAgICAgICAgIGNoZWNrVG9rZW4gPSBleHRyYS50b2tlbnNbZXh0cmEub3BlblBhcmVuVG9rZW4gLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tUb2tlbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUb2tlbi50eXBlID09PSAnS2V5d29yZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja1Rva2VuLnZhbHVlID09PSAnaWYnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUb2tlbi52YWx1ZSA9PT0gJ3doaWxlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVG9rZW4udmFsdWUgPT09ICdmb3InIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUb2tlbi52YWx1ZSA9PT0gJ3dpdGgnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdFJlZ2V4KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzY2FuUHVuY3R1YXRvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZUb2tlbi52YWx1ZSA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgLy8gRGl2aWRpbmcgYSBmdW5jdGlvbiBieSBhbnl0aGluZyBtYWtlcyBsaXR0bGUgc2Vuc2UsXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgdG8gY2hlY2sgZm9yIHRoYXQuXG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhLnRva2Vuc1tleHRyYS5vcGVuQ3VybHlUb2tlbiAtIDNdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS50b2tlbnNbZXh0cmEub3BlbkN1cmx5VG9rZW4gLSAzXS50eXBlID09PSAnS2V5d29yZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5vbnltb3VzIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBjaGVja1Rva2VuID0gZXh0cmEudG9rZW5zW2V4dHJhLm9wZW5DdXJseVRva2VuIC0gNF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjYW5QdW5jdHVhdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhLnRva2Vuc1tleHRyYS5vcGVuQ3VybHlUb2tlbiAtIDRdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS50b2tlbnNbZXh0cmEub3BlbkN1cmx5VG9rZW4gLSA0XS50eXBlID09PSAnS2V5d29yZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmFtZWQgZnVuY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVG9rZW4gPSBleHRyYS50b2tlbnNbZXh0cmEub3BlbkN1cmx5VG9rZW4gLSA1XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdFJlZ2V4KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NhblB1bmN0dWF0b3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2tUb2tlbiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzXG4gICAgICAgICAgICAgICAgLy8gYSBkZWNsYXJhdGlvbiBvciBhbiBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgIGlmIChGbkV4cHJUb2tlbnMuaW5kZXhPZihjaGVja1Rva2VuLnZhbHVlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGFuIGV4cHJlc3Npb24uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FuUHVuY3R1YXRvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGRlY2xhcmF0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0UmVnZXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0UmVnZXgoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldlRva2VuLnR5cGUgPT09ICdLZXl3b3JkJykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RSZWdleCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2FuUHVuY3R1YXRvcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICAgIHZhciBjaDtcblxuICAgICAgICBza2lwQ29tbWVudCgpO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogVG9rZW4uRU9GLFxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IGluZGV4LFxuICAgICAgICAgICAgICAgIGVuZDogaW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgICAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY2gpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NhbklkZW50aWZpZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcnkgY29tbW9uOiAoIGFuZCApIGFuZCA7XG4gICAgICAgIGlmIChjaCA9PT0gMHgyOCB8fCBjaCA9PT0gMHgyOSB8fCBjaCA9PT0gMHgzQikge1xuICAgICAgICAgICAgcmV0dXJuIHNjYW5QdW5jdHVhdG9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdHJpbmcgbGl0ZXJhbCBzdGFydHMgd2l0aCBzaW5nbGUgcXVvdGUgKFUrMDAyNykgb3IgZG91YmxlIHF1b3RlIChVKzAwMjIpLlxuICAgICAgICBpZiAoY2ggPT09IDB4MjcgfHwgY2ggPT09IDB4MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2FuU3RyaW5nTGl0ZXJhbCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBEb3QgKC4pIFUrMDAyRSBjYW4gYWxzbyBzdGFydCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciwgaGVuY2UgdGhlIG5lZWRcbiAgICAgICAgLy8gdG8gY2hlY2sgdGhlIG5leHQgY2hhcmFjdGVyLlxuICAgICAgICBpZiAoY2ggPT09IDB4MkUpIHtcbiAgICAgICAgICAgIGlmIChpc0RlY2ltYWxEaWdpdChzb3VyY2UuY2hhckNvZGVBdChpbmRleCArIDEpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2FuTnVtZXJpY0xpdGVyYWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzY2FuUHVuY3R1YXRvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVjaW1hbERpZ2l0KGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNjYW5OdW1lcmljTGl0ZXJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2xhc2ggKC8pIFUrMDAyRiBjYW4gYWxzbyBzdGFydCBhIHJlZ2V4LlxuICAgICAgICBpZiAoZXh0cmEudG9rZW5pemUgJiYgY2ggPT09IDB4MkYpIHtcbiAgICAgICAgICAgIHJldHVybiBhZHZhbmNlU2xhc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzY2FuUHVuY3R1YXRvcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbGxlY3RUb2tlbigpIHtcbiAgICAgICAgdmFyIGxvYywgdG9rZW4sIHJhbmdlLCB2YWx1ZTtcblxuICAgICAgICBza2lwQ29tbWVudCgpO1xuICAgICAgICBsb2MgPSB7XG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBpbmRleCAtIGxpbmVTdGFydFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRva2VuID0gYWR2YW5jZSgpO1xuICAgICAgICBsb2MuZW5kID0ge1xuICAgICAgICAgICAgbGluZTogbGluZU51bWJlcixcbiAgICAgICAgICAgIGNvbHVtbjogaW5kZXggLSBsaW5lU3RhcnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVG9rZW4uRU9GKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHNvdXJjZS5zbGljZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kKTtcbiAgICAgICAgICAgIGV4dHJhLnRva2Vucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBUb2tlbk5hbWVbdG9rZW4udHlwZV0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBbdG9rZW4uc3RhcnQsIHRva2VuLmVuZF0sXG4gICAgICAgICAgICAgICAgbG9jOiBsb2NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgdmFyIHRva2VuO1xuXG4gICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBpbmRleCA9IHRva2VuLmVuZDtcbiAgICAgICAgbGluZU51bWJlciA9IHRva2VuLmxpbmVOdW1iZXI7XG4gICAgICAgIGxpbmVTdGFydCA9IHRva2VuLmxpbmVTdGFydDtcblxuICAgICAgICBsb29rYWhlYWQgPSAodHlwZW9mIGV4dHJhLnRva2VucyAhPT0gJ3VuZGVmaW5lZCcpID8gY29sbGVjdFRva2VuKCkgOiBhZHZhbmNlKCk7XG5cbiAgICAgICAgaW5kZXggPSB0b2tlbi5lbmQ7XG4gICAgICAgIGxpbmVOdW1iZXIgPSB0b2tlbi5saW5lTnVtYmVyO1xuICAgICAgICBsaW5lU3RhcnQgPSB0b2tlbi5saW5lU3RhcnQ7XG5cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICAgIHZhciBwb3MsIGxpbmUsIHN0YXJ0O1xuXG4gICAgICAgIHBvcyA9IGluZGV4O1xuICAgICAgICBsaW5lID0gbGluZU51bWJlcjtcbiAgICAgICAgc3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIGxvb2thaGVhZCA9ICh0eXBlb2YgZXh0cmEudG9rZW5zICE9PSAndW5kZWZpbmVkJykgPyBjb2xsZWN0VG9rZW4oKSA6IGFkdmFuY2UoKTtcbiAgICAgICAgaW5kZXggPSBwb3M7XG4gICAgICAgIGxpbmVOdW1iZXIgPSBsaW5lO1xuICAgICAgICBsaW5lU3RhcnQgPSBzdGFydDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQb3NpdGlvbihsaW5lLCBjb2x1bW4pIHtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc3RhcnRMaW5lLCBzdGFydENvbHVtbiwgbGluZSwgY29sdW1uKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBuZXcgUG9zaXRpb24oc3RhcnRMaW5lLCBzdGFydENvbHVtbik7XG4gICAgICAgIHRoaXMuZW5kID0gbmV3IFBvc2l0aW9uKGxpbmUsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgU3ludGF4VHJlZURlbGVnYXRlID0ge1xuXG4gICAgICAgIG5hbWU6ICdTeW50YXhUcmVlJyxcblxuICAgICAgICBwcm9jZXNzQ29tbWVudDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBsYXN0Q2hpbGQsIHRyYWlsaW5nQ29tbWVudHM7XG5cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5Qcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHRyYS50cmFpbGluZ0NvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEudHJhaWxpbmdDb21tZW50c1swXS5yYW5nZVswXSA+PSBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSBleHRyYS50cmFpbGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBleHRyYS50cmFpbGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEudHJhaWxpbmdDb21tZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2subGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEuYm90dG9tUmlnaHRTdGFja1tleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCAtIDFdLnRyYWlsaW5nQ29tbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2tbZXh0cmEuYm90dG9tUmlnaHRTdGFjay5sZW5ndGggLSAxXS50cmFpbGluZ0NvbW1lbnRzWzBdLnJhbmdlWzBdID49IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdDb21tZW50cyA9IGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2tbZXh0cmEuYm90dG9tUmlnaHRTdGFjay5sZW5ndGggLSAxXS50cmFpbGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmEuYm90dG9tUmlnaHRTdGFja1tleHRyYS5ib3R0b21SaWdodFN0YWNrLmxlbmd0aCAtIDFdLnRyYWlsaW5nQ29tbWVudHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFYXRpbmcgdGhlIHN0YWNrLlxuICAgICAgICAgICAgd2hpbGUgKGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2subGVuZ3RoID4gMCAmJiBleHRyYS5ib3R0b21SaWdodFN0YWNrW2V4dHJhLmJvdHRvbVJpZ2h0U3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMF0gPj0gbm9kZS5yYW5nZVswXSkge1xuICAgICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGV4dHJhLmJvdHRvbVJpZ2h0U3RhY2sucG9wKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoaWxkLmxlYWRpbmdDb21tZW50cyAmJiBsYXN0Q2hpbGQubGVhZGluZ0NvbW1lbnRzW2xhc3RDaGlsZC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoIC0gMV0ucmFuZ2VbMV0gPD0gbm9kZS5yYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IGxhc3RDaGlsZC5sZWFkaW5nQ29tbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsYXN0Q2hpbGQubGVhZGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0cmEubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA+IDAgJiYgZXh0cmEubGVhZGluZ0NvbW1lbnRzW2V4dHJhLmxlYWRpbmdDb21tZW50cy5sZW5ndGggLSAxXS5yYW5nZVsxXSA8PSBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBleHRyYS5sZWFkaW5nQ29tbWVudHM7XG4gICAgICAgICAgICAgICAgZXh0cmEubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKHRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSB0cmFpbGluZ0NvbW1lbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleHRyYS5ib3R0b21SaWdodFN0YWNrLnB1c2gobm9kZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWFya0VuZDogZnVuY3Rpb24gKG5vZGUsIHN0YXJ0VG9rZW4pIHtcbiAgICAgICAgICAgIGlmIChleHRyYS5yYW5nZSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmFuZ2UgPSBbc3RhcnRUb2tlbi5zdGFydCwgaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhLmxvYykge1xuICAgICAgICAgICAgICAgIG5vZGUubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRva2VuLnN0YXJ0TGluZU51bWJlciA9PT0gdW5kZWZpbmVkID8gIHN0YXJ0VG9rZW4ubGluZU51bWJlciA6IHN0YXJ0VG9rZW4uc3RhcnRMaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRva2VuLnN0YXJ0IC0gKHN0YXJ0VG9rZW4uc3RhcnRMaW5lU3RhcnQgPT09IHVuZGVmaW5lZCA/ICBzdGFydFRva2VuLmxpbmVTdGFydCA6IHN0YXJ0VG9rZW4uc3RhcnRMaW5lU3RhcnQpLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBpbmRleCAtIGxpbmVTdGFydFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3N0UHJvY2Vzcyhub2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhLmF0dGFjaENvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb21tZW50KG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcG9zdFByb2Nlc3M6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmEuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5sb2Muc291cmNlID0gZXh0cmEuc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQXJyYXlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkFycmF5RXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICBlbGVtZW50czogZWxlbWVudHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb246IGZ1bmN0aW9uIChvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgICAgIHJpZ2h0OiByaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVCaW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IChvcGVyYXRvciA9PT0gJ3x8JyB8fCBvcGVyYXRvciA9PT0gJyYmJykgPyBTeW50YXguTG9naWNhbEV4cHJlc3Npb24gOlxuICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4LkJpbmFyeUV4cHJlc3Npb247XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguQmxvY2tTdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVCcmVha1N0YXRlbWVudDogZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5CcmVha1N0YXRlbWVudCxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIChjYWxsZWUsIGFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkNhbGxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGNhbGxlZTogY2FsbGVlLFxuICAgICAgICAgICAgICAgICdhcmd1bWVudHMnOiBhcmdzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUNhdGNoQ2xhdXNlOiBmdW5jdGlvbiAocGFyYW0sIGJvZHkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkNhdGNoQ2xhdXNlLFxuICAgICAgICAgICAgICAgIHBhcmFtOiBwYXJhbSxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gKHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIHRlc3Q6IHRlc3QsXG4gICAgICAgICAgICAgICAgY29uc2VxdWVudDogY29uc2VxdWVudCxcbiAgICAgICAgICAgICAgICBhbHRlcm5hdGU6IGFsdGVybmF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVDb250aW51ZVN0YXRlbWVudDogZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Db250aW51ZVN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRGVidWdnZXJTdGF0ZW1lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkRlYnVnZ2VyU3RhdGVtZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZURvV2hpbGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChib2R5LCB0ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Eb1doaWxlU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgdGVzdDogdGVzdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVFbXB0eVN0YXRlbWVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguRW1wdHlTdGF0ZW1lbnRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkV4cHJlc3Npb25TdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChpbml0LCB0ZXN0LCB1cGRhdGUsIGJvZHkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LkZvclN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICBpbml0OiBpbml0LFxuICAgICAgICAgICAgICAgIHRlc3Q6IHRlc3QsXG4gICAgICAgICAgICAgICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVGb3JJblN0YXRlbWVudDogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0LCBib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Gb3JJblN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIGVhY2g6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUZ1bmN0aW9uRGVjbGFyYXRpb246IGZ1bmN0aW9uIChpZCwgcGFyYW1zLCBkZWZhdWx0cywgYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgZGVmYXVsdHM6IGRlZmF1bHRzLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgcmVzdDogbnVsbCxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGlkLCBwYXJhbXMsIGRlZmF1bHRzLCBib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5GdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0cyxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIHJlc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVJZGVudGlmaWVyOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUlmU3RhdGVtZW50OiBmdW5jdGlvbiAodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5JZlN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICB0ZXN0OiB0ZXN0LFxuICAgICAgICAgICAgICAgIGNvbnNlcXVlbnQ6IGNvbnNlcXVlbnQsXG4gICAgICAgICAgICAgICAgYWx0ZXJuYXRlOiBhbHRlcm5hdGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTGFiZWxlZFN0YXRlbWVudDogZnVuY3Rpb24gKGxhYmVsLCBib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5MYWJlbGVkU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUxpdGVyYWw6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguTGl0ZXJhbCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG9rZW4udmFsdWUsXG4gICAgICAgICAgICAgICAgcmF3OiBzb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTWVtYmVyRXhwcmVzc2lvbjogZnVuY3Rpb24gKGFjY2Vzc29yLCBvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5NZW1iZXJFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkOiBhY2Nlc3NvciA9PT0gJ1snLFxuICAgICAgICAgICAgICAgIG9iamVjdDogb2JqZWN0LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVOZXdFeHByZXNzaW9uOiBmdW5jdGlvbiAoY2FsbGVlLCBhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5OZXdFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGNhbGxlZTogY2FsbGVlLFxuICAgICAgICAgICAgICAgICdhcmd1bWVudHMnOiBhcmdzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5PYmplY3RFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlUG9zdGZpeEV4cHJlc3Npb246IGZ1bmN0aW9uIChvcGVyYXRvciwgYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlVwZGF0ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50OiBhcmd1bWVudCxcbiAgICAgICAgICAgICAgICBwcmVmaXg6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVByb2dyYW06IGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Qcm9ncmFtLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChraW5kLCBrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFN5bnRheC5Qcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAga2luZDoga2luZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguUmV0dXJuU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50OiBhcmd1bWVudFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVTZXF1ZW5jZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByZXNzaW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguU2VxdWVuY2VFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zOiBleHByZXNzaW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVTd2l0Y2hDYXNlOiBmdW5jdGlvbiAodGVzdCwgY29uc2VxdWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguU3dpdGNoQ2FzZSxcbiAgICAgICAgICAgICAgICB0ZXN0OiB0ZXN0LFxuICAgICAgICAgICAgICAgIGNvbnNlcXVlbnQ6IGNvbnNlcXVlbnRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlU3dpdGNoU3RhdGVtZW50OiBmdW5jdGlvbiAoZGlzY3JpbWluYW50LCBjYXNlcykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguU3dpdGNoU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIGRpc2NyaW1pbmFudDogZGlzY3JpbWluYW50LFxuICAgICAgICAgICAgICAgIGNhc2VzOiBjYXNlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVUaGlzRXhwcmVzc2lvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVGhpc0V4cHJlc3Npb25cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlVGhyb3dTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVGhyb3dTdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgYXJndW1lbnQ6IGFyZ3VtZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVRyeVN0YXRlbWVudDogZnVuY3Rpb24gKGJsb2NrLCBndWFyZGVkSGFuZGxlcnMsIGhhbmRsZXJzLCBmaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlRyeVN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICBibG9jazogYmxvY2ssXG4gICAgICAgICAgICAgICAgZ3VhcmRlZEhhbmRsZXJzOiBndWFyZGVkSGFuZGxlcnMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplcjogZmluYWxpemVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVVuYXJ5RXhwcmVzc2lvbjogZnVuY3Rpb24gKG9wZXJhdG9yLCBhcmd1bWVudCkge1xuICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnKysnIHx8IG9wZXJhdG9yID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlVwZGF0ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQ6IGFyZ3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVW5hcnlFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICAgICAgICAgICAgICBhcmd1bWVudDogYXJndW1lbnQsXG4gICAgICAgICAgICAgICAgcHJlZml4OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uIChkZWNsYXJhdGlvbnMsIGtpbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24sXG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAga2luZDoga2luZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVWYXJpYWJsZURlY2xhcmF0b3I6IGZ1bmN0aW9uIChpZCwgaW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguVmFyaWFibGVEZWNsYXJhdG9yLFxuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVdoaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAodGVzdCwgYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTeW50YXguV2hpbGVTdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgdGVzdDogdGVzdCxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVdpdGhTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChvYmplY3QsIGJvZHkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3ludGF4LldpdGhTdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgb2JqZWN0OiBvYmplY3QsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIGxpbmUgdGVybWluYXRvciBiZWZvcmUgdGhlIG5leHQgdG9rZW4uXG5cbiAgICBmdW5jdGlvbiBwZWVrTGluZVRlcm1pbmF0b3IoKSB7XG4gICAgICAgIHZhciBwb3MsIGxpbmUsIHN0YXJ0LCBmb3VuZDtcblxuICAgICAgICBwb3MgPSBpbmRleDtcbiAgICAgICAgbGluZSA9IGxpbmVOdW1iZXI7XG4gICAgICAgIHN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgICAgICBza2lwQ29tbWVudCgpO1xuICAgICAgICBmb3VuZCA9IGxpbmVOdW1iZXIgIT09IGxpbmU7XG4gICAgICAgIGluZGV4ID0gcG9zO1xuICAgICAgICBsaW5lTnVtYmVyID0gbGluZTtcbiAgICAgICAgbGluZVN0YXJ0ID0gc3RhcnQ7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvblxuXG4gICAgZnVuY3Rpb24gdGhyb3dFcnJvcih0b2tlbiwgbWVzc2FnZUZvcm1hdCkge1xuICAgICAgICB2YXIgZXJyb3IsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgICAgICAgIG1zZyA9IG1lc3NhZ2VGb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAvJShcXGQpL2csXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKHdob2xlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaW5kZXggPCBhcmdzLmxlbmd0aCwgJ01lc3NhZ2UgcmVmZXJlbmNlIG11c3QgYmUgaW4gcmFuZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbi5saW5lTnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0xpbmUgJyArIHRva2VuLmxpbmVOdW1iZXIgKyAnOiAnICsgbXNnKTtcbiAgICAgICAgICAgIGVycm9yLmluZGV4ID0gdG9rZW4uc3RhcnQ7XG4gICAgICAgICAgICBlcnJvci5saW5lTnVtYmVyID0gdG9rZW4ubGluZU51bWJlcjtcbiAgICAgICAgICAgIGVycm9yLmNvbHVtbiA9IHRva2VuLnN0YXJ0IC0gbGluZVN0YXJ0ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdMaW5lICcgKyBsaW5lTnVtYmVyICsgJzogJyArIG1zZyk7XG4gICAgICAgICAgICBlcnJvci5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgZXJyb3IubGluZU51bWJlciA9IGxpbmVOdW1iZXI7XG4gICAgICAgICAgICBlcnJvci5jb2x1bW4gPSBpbmRleCAtIGxpbmVTdGFydCArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvci5kZXNjcmlwdGlvbiA9IG1zZztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGhyb3dFcnJvclRvbGVyYW50KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3dFcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmEuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgZXh0cmEuZXJyb3JzLnB1c2goZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIHRoZSB0b2tlbi5cblxuICAgIGZ1bmN0aW9uIHRocm93VW5leHBlY3RlZCh0b2tlbikge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uRU9GKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHRva2VuLCBNZXNzYWdlcy5VbmV4cGVjdGVkRU9TKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBUb2tlbi5OdW1lcmljTGl0ZXJhbCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih0b2tlbiwgTWVzc2FnZXMuVW5leHBlY3RlZE51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih0b2tlbiwgTWVzc2FnZXMuVW5leHBlY3RlZFN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uSWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih0b2tlbiwgTWVzc2FnZXMuVW5leHBlY3RlZElkZW50aWZpZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuLktleXdvcmQpIHtcbiAgICAgICAgICAgIGlmIChpc0Z1dHVyZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHRva2VuLCBNZXNzYWdlcy5VbmV4cGVjdGVkUmVzZXJ2ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh0b2tlbiwgTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHRva2VuLCBNZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4sIHRva2VuLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJvb2xlYW5MaXRlcmFsLCBOdWxsTGl0ZXJhbCwgb3IgUHVuY3R1YXRvci5cbiAgICAgICAgdGhyb3dFcnJvcih0b2tlbiwgTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLCB0b2tlbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRXhwZWN0IHRoZSBuZXh0IHRva2VuIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cbiAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblxuICAgIGZ1bmN0aW9uIGV4cGVjdCh2YWx1ZSkge1xuICAgICAgICB2YXIgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IFRva2VuLlB1bmN0dWF0b3IgfHwgdG9rZW4udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvd1VuZXhwZWN0ZWQodG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhwZWN0IHRoZSBuZXh0IHRva2VuIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQga2V5d29yZC5cbiAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblxuICAgIGZ1bmN0aW9uIGV4cGVjdEtleXdvcmQoa2V5d29yZCkge1xuICAgICAgICB2YXIgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IFRva2VuLktleXdvcmQgfHwgdG9rZW4udmFsdWUgIT09IGtleXdvcmQpIHtcbiAgICAgICAgICAgIHRocm93VW5leHBlY3RlZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblxuICAgIGZ1bmN0aW9uIG1hdGNoKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBsb29rYWhlYWQudHlwZSA9PT0gVG9rZW4uUHVuY3R1YXRvciAmJiBsb29rYWhlYWQudmFsdWUgPT09IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXl3b3JkXG5cbiAgICBmdW5jdGlvbiBtYXRjaEtleXdvcmQoa2V5d29yZCkge1xuICAgICAgICByZXR1cm4gbG9va2FoZWFkLnR5cGUgPT09IFRva2VuLktleXdvcmQgJiYgbG9va2FoZWFkLnZhbHVlID09PSBrZXl3b3JkO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGFzc2lnbm1lbnQgb3BlcmF0b3JcblxuICAgIGZ1bmN0aW9uIG1hdGNoQXNzaWduKCkge1xuICAgICAgICB2YXIgb3A7XG5cbiAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlICE9PSBUb2tlbi5QdW5jdHVhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb3AgPSBsb29rYWhlYWQudmFsdWU7XG4gICAgICAgIHJldHVybiBvcCA9PT0gJz0nIHx8XG4gICAgICAgICAgICBvcCA9PT0gJyo9JyB8fFxuICAgICAgICAgICAgb3AgPT09ICcvPScgfHxcbiAgICAgICAgICAgIG9wID09PSAnJT0nIHx8XG4gICAgICAgICAgICBvcCA9PT0gJys9JyB8fFxuICAgICAgICAgICAgb3AgPT09ICctPScgfHxcbiAgICAgICAgICAgIG9wID09PSAnPDw9JyB8fFxuICAgICAgICAgICAgb3AgPT09ICc+Pj0nIHx8XG4gICAgICAgICAgICBvcCA9PT0gJz4+Pj0nIHx8XG4gICAgICAgICAgICBvcCA9PT0gJyY9JyB8fFxuICAgICAgICAgICAgb3AgPT09ICdePScgfHxcbiAgICAgICAgICAgIG9wID09PSAnfD0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN1bWVTZW1pY29sb24oKSB7XG4gICAgICAgIHZhciBsaW5lO1xuXG4gICAgICAgIC8vIENhdGNoIHRoZSB2ZXJ5IGNvbW1vbiBjYXNlIGZpcnN0OiBpbW1lZGlhdGVseSBhIHNlbWljb2xvbiAoVSswMDNCKS5cbiAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgzQiB8fCBtYXRjaCgnOycpKSB7XG4gICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUgPSBsaW5lTnVtYmVyO1xuICAgICAgICBza2lwQ29tbWVudCgpO1xuICAgICAgICBpZiAobGluZU51bWJlciAhPT0gbGluZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlICE9PSBUb2tlbi5FT0YgJiYgIW1hdGNoKCd9JykpIHtcbiAgICAgICAgICAgIHRocm93VW5leHBlY3RlZChsb29rYWhlYWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgcHJvdmlkZWQgZXhwcmVzc2lvbiBpcyBMZWZ0SGFuZFNpZGVFeHByZXNzaW9uXG5cbiAgICBmdW5jdGlvbiBpc0xlZnRIYW5kU2lkZShleHByKSB7XG4gICAgICAgIHJldHVybiBleHByLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyIHx8IGV4cHIudHlwZSA9PT0gU3ludGF4Lk1lbWJlckV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgLy8gMTEuMS40IEFycmF5IEluaXRpYWxpc2VyXG5cbiAgICBmdW5jdGlvbiBwYXJzZUFycmF5SW5pdGlhbGlzZXIoKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IFtdLCBzdGFydFRva2VuO1xuXG4gICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgIGV4cGVjdCgnWycpO1xuXG4gICAgICAgIHdoaWxlICghbWF0Y2goJ10nKSkge1xuICAgICAgICAgICAgaWYgKG1hdGNoKCcsJykpIHtcbiAgICAgICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCcsJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV4KCk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlQXJyYXlFeHByZXNzaW9uKGVsZW1lbnRzKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTEuMS41IE9iamVjdCBJbml0aWFsaXNlclxuXG4gICAgZnVuY3Rpb24gcGFyc2VQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtLCBmaXJzdCkge1xuICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QsIGJvZHksIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgcHJldmlvdXNTdHJpY3QgPSBzdHJpY3Q7XG4gICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgIGJvZHkgPSBwYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHN0cmljdCAmJiBpc1Jlc3RyaWN0ZWRXb3JkKHBhcmFtWzBdLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoZmlyc3QsIE1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBwYXJhbSwgW10sIGJvZHkpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9iamVjdFByb3BlcnR5S2V5KCkge1xuICAgICAgICB2YXIgdG9rZW4sIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgdG9rZW4gPSBsZXgoKTtcblxuICAgICAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGZyb20gcGFyc2VPYmplY3RQcm9wZXJ0eSgpLCB3aGVyZVxuICAgICAgICAvLyBFT0YgYW5kIFB1bmN0dWF0b3IgdG9rZW5zIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG91dC5cblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uU3RyaW5nTGl0ZXJhbCB8fCB0b2tlbi50eXBlID09PSBUb2tlbi5OdW1lcmljTGl0ZXJhbCkge1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiB0b2tlbi5vY3RhbCkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh0b2tlbiwgTWVzc2FnZXMuU3RyaWN0T2N0YWxMaXRlcmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUxpdGVyYWwodG9rZW4pLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUlkZW50aWZpZXIodG9rZW4udmFsdWUpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9iamVjdFByb3BlcnR5KCkge1xuICAgICAgICB2YXIgdG9rZW4sIGtleSwgaWQsIHZhbHVlLCBwYXJhbSwgc3RhcnRUb2tlbjtcblxuICAgICAgICB0b2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uSWRlbnRpZmllcikge1xuXG4gICAgICAgICAgICBpZCA9IHBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblxuICAgICAgICAgICAgLy8gUHJvcGVydHkgQXNzaWdubWVudDogR2V0dGVyIGFuZCBTZXR0ZXIuXG5cbiAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2dldCcgJiYgIW1hdGNoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBwYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCcoJyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCcpJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZVByb3BlcnR5RnVuY3Rpb24oW10pO1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZVByb3BlcnR5KCdnZXQnLCBrZXksIHZhbHVlKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdzZXQnICYmICFtYXRjaCgnOicpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gcGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCgnKCcpO1xuICAgICAgICAgICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBUb2tlbi5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgnKScpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQodG9rZW4sIE1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgdG9rZW4udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlUHJvcGVydHlGdW5jdGlvbihbXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBbIHBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCkgXTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCcpJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VQcm9wZXJ0eUZ1bmN0aW9uKHBhcmFtLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZVByb3BlcnR5KCdzZXQnLCBrZXksIHZhbHVlKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHBlY3QoJzonKTtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlUHJvcGVydHkoJ2luaXQnLCBpZCwgdmFsdWUpLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW4uRU9GIHx8IHRva2VuLnR5cGUgPT09IFRva2VuLlB1bmN0dWF0b3IpIHtcbiAgICAgICAgICAgIHRocm93VW5leHBlY3RlZCh0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBwYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG4gICAgICAgICAgICBleHBlY3QoJzonKTtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlUHJvcGVydHkoJ2luaXQnLCBrZXksIHZhbHVlKSwgc3RhcnRUb2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9iamVjdEluaXRpYWxpc2VyKCkge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtdLCBwcm9wZXJ0eSwgbmFtZSwga2V5LCBraW5kLCBtYXAgPSB7fSwgdG9TdHJpbmcgPSBTdHJpbmcsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBleHBlY3QoJ3snKTtcblxuICAgICAgICB3aGlsZSAoIW1hdGNoKCd9JykpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcGFyc2VPYmplY3RQcm9wZXJ0eSgpO1xuXG4gICAgICAgICAgICBpZiAocHJvcGVydHkua2V5LnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IHByb3BlcnR5LmtleS5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gdG9TdHJpbmcocHJvcGVydHkua2V5LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtpbmQgPSAocHJvcGVydHkua2luZCA9PT0gJ2luaXQnKSA/IFByb3BlcnR5S2luZC5EYXRhIDogKHByb3BlcnR5LmtpbmQgPT09ICdnZXQnKSA/IFByb3BlcnR5S2luZC5HZXQgOiBQcm9wZXJ0eUtpbmQuU2V0O1xuXG4gICAgICAgICAgICBrZXkgPSAnJCcgKyBuYW1lO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFwW2tleV0gPT09IFByb3BlcnR5S2luZC5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJpY3QgJiYga2luZCA9PT0gUHJvcGVydHlLaW5kLkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuU3RyaWN0RHVwbGljYXRlUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgIT09IFByb3BlcnR5S2luZC5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLkFjY2Vzc29yRGF0YVByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSBQcm9wZXJ0eUtpbmQuRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KHt9LCBNZXNzYWdlcy5BY2Nlc3NvckRhdGFQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwW2tleV0gJiBraW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLkFjY2Vzc29yR2V0U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBba2V5XSB8PSBraW5kO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGtpbmQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgIGlmICghbWF0Y2goJ30nKSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCgnLCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0KCd9Jyk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTEuMS42IFRoZSBHcm91cGluZyBPcGVyYXRvclxuXG4gICAgZnVuY3Rpb24gcGFyc2VHcm91cEV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBleHByO1xuXG4gICAgICAgIGV4cGVjdCgnKCcpO1xuXG4gICAgICAgIGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cblxuICAgIC8vIDExLjEgUHJpbWFyeSBFeHByZXNzaW9uc1xuXG4gICAgZnVuY3Rpb24gcGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpIHtcbiAgICAgICAgdmFyIHR5cGUsIHRva2VuLCBleHByLCBzdGFydFRva2VuO1xuXG4gICAgICAgIGlmIChtYXRjaCgnKCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VHcm91cEV4cHJlc3Npb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaCgnWycpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VBcnJheUluaXRpYWxpc2VyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2goJ3snKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0SW5pdGlhbGlzZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBsb29rYWhlYWQudHlwZTtcbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBpZiAodHlwZSA9PT0gVG9rZW4uSWRlbnRpZmllcikge1xuICAgICAgICAgICAgZXhwciA9ICBkZWxlZ2F0ZS5jcmVhdGVJZGVudGlmaWVyKGxleCgpLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUb2tlbi5TdHJpbmdMaXRlcmFsIHx8IHR5cGUgPT09IFRva2VuLk51bWVyaWNMaXRlcmFsKSB7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmIGxvb2thaGVhZC5vY3RhbCkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudChsb29rYWhlYWQsIE1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHByID0gZGVsZWdhdGUuY3JlYXRlTGl0ZXJhbChsZXgoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9rZW4uS2V5d29yZCkge1xuICAgICAgICAgICAgaWYgKG1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoS2V5d29yZCgndGhpcycpKSB7XG4gICAgICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZVRoaXNFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93VW5leHBlY3RlZChsZXgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9rZW4uQm9vbGVhbkxpdGVyYWwpIHtcbiAgICAgICAgICAgIHRva2VuID0gbGV4KCk7XG4gICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICh0b2tlbi52YWx1ZSA9PT0gJ3RydWUnKTtcbiAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVMaXRlcmFsKHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUb2tlbi5OdWxsTGl0ZXJhbCkge1xuICAgICAgICAgICAgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVMaXRlcmFsKHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaCgnLycpIHx8IG1hdGNoKCcvPScpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhLnRva2VucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBleHByID0gZGVsZWdhdGUuY3JlYXRlTGl0ZXJhbChjb2xsZWN0UmVnZXgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVMaXRlcmFsKHNjYW5SZWdFeHAoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZWVrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvd1VuZXhwZWN0ZWQobGV4KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZXhwciwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTEuMiBMZWZ0LUhhbmQtU2lkZSBFeHByZXNzaW9uc1xuXG4gICAgZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgICAgZXhwZWN0KCcoJyk7XG5cbiAgICAgICAgaWYgKCFtYXRjaCgnKScpKSB7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2gocGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2goJyknKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwZWN0KCcsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICByZXR1cm4gYXJncztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU5vbkNvbXB1dGVkUHJvcGVydHkoKSB7XG4gICAgICAgIHZhciB0b2tlbiwgc3RhcnRUb2tlbjtcblxuICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICB0b2tlbiA9IGxleCgpO1xuXG4gICAgICAgIGlmICghaXNJZGVudGlmaWVyTmFtZSh0b2tlbikpIHtcbiAgICAgICAgICAgIHRocm93VW5leHBlY3RlZCh0b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVJZGVudGlmaWVyKHRva2VuLnZhbHVlKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VOb25Db21wdXRlZE1lbWJlcigpIHtcbiAgICAgICAgZXhwZWN0KCcuJyk7XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlTm9uQ29tcHV0ZWRQcm9wZXJ0eSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlQ29tcHV0ZWRNZW1iZXIoKSB7XG4gICAgICAgIHZhciBleHByO1xuXG4gICAgICAgIGV4cGVjdCgnWycpO1xuXG4gICAgICAgIGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBleHBlY3QoJ10nKTtcblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU5ld0V4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBjYWxsZWUsIGFyZ3MsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgZXhwZWN0S2V5d29yZCgnbmV3Jyk7XG4gICAgICAgIGNhbGxlZSA9IHBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbigpO1xuICAgICAgICBhcmdzID0gbWF0Y2goJygnKSA/IHBhcnNlQXJndW1lbnRzKCkgOiBbXTtcblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVOZXdFeHByZXNzaW9uKGNhbGxlZSwgYXJncyksIHN0YXJ0VG9rZW4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCgpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiwgZXhwciwgYXJncywgcHJvcGVydHksIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBwcmV2aW91c0FsbG93SW4gPSBzdGF0ZS5hbGxvd0luO1xuICAgICAgICBzdGF0ZS5hbGxvd0luID0gdHJ1ZTtcbiAgICAgICAgZXhwciA9IG1hdGNoS2V5d29yZCgnbmV3JykgPyBwYXJzZU5ld0V4cHJlc3Npb24oKSA6IHBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTtcbiAgICAgICAgc3RhdGUuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAobWF0Y2goJy4nKSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcGFyc2VOb25Db21wdXRlZE1lbWJlcigpO1xuICAgICAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVNZW1iZXJFeHByZXNzaW9uKCcuJywgZXhwciwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCgnKCcpKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IHBhcnNlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZUNhbGxFeHByZXNzaW9uKGV4cHIsIGFyZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCgnWycpKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBwYXJzZUNvbXB1dGVkTWVtYmVyKCk7XG4gICAgICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZU1lbWJlckV4cHJlc3Npb24oJ1snLCBleHByLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZWdhdGUubWFya0VuZChleHByLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbigpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiwgZXhwciwgcHJvcGVydHksIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBwcmV2aW91c0FsbG93SW4gPSBzdGF0ZS5hbGxvd0luO1xuICAgICAgICBleHByID0gbWF0Y2hLZXl3b3JkKCduZXcnKSA/IHBhcnNlTmV3RXhwcmVzc2lvbigpIDogcGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpO1xuICAgICAgICBzdGF0ZS5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXG4gICAgICAgIHdoaWxlIChtYXRjaCgnLicpIHx8IG1hdGNoKCdbJykpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaCgnWycpKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBwYXJzZUNvbXB1dGVkTWVtYmVyKCk7XG4gICAgICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZU1lbWJlckV4cHJlc3Npb24oJ1snLCBleHByLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcGFyc2VOb25Db21wdXRlZE1lbWJlcigpO1xuICAgICAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVNZW1iZXJFeHByZXNzaW9uKCcuJywgZXhwciwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZWdhdGUubWFya0VuZChleHByLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuICAgIC8vIDExLjMgUG9zdGZpeCBFeHByZXNzaW9uc1xuXG4gICAgZnVuY3Rpb24gcGFyc2VQb3N0Zml4RXhwcmVzc2lvbigpIHtcbiAgICAgICAgdmFyIGV4cHIsIHRva2VuLCBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuXG4gICAgICAgIGV4cHIgPSBwYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwoKTtcblxuICAgICAgICBpZiAobG9va2FoZWFkLnR5cGUgPT09IFRva2VuLlB1bmN0dWF0b3IpIHtcbiAgICAgICAgICAgIGlmICgobWF0Y2goJysrJykgfHwgbWF0Y2goJy0tJykpICYmICFwZWVrTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgICAgICAgICAgIC8vIDExLjMuMSwgMTEuMy4yXG4gICAgICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBleHByLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyICYmIGlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLlN0cmljdExIU1Bvc3RmaXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXNMZWZ0SGFuZFNpZGUoZXhwcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KHt9LCBNZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b2tlbiA9IGxleCgpO1xuICAgICAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZVBvc3RmaXhFeHByZXNzaW9uKHRva2VuLnZhbHVlLCBleHByKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICAvLyAxMS40IFVuYXJ5IE9wZXJhdG9yc1xuXG4gICAgZnVuY3Rpb24gcGFyc2VVbmFyeUV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciB0b2tlbiwgZXhwciwgc3RhcnRUb2tlbjtcblxuICAgICAgICBpZiAobG9va2FoZWFkLnR5cGUgIT09IFRva2VuLlB1bmN0dWF0b3IgJiYgbG9va2FoZWFkLnR5cGUgIT09IFRva2VuLktleXdvcmQpIHtcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZVBvc3RmaXhFeHByZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2goJysrJykgfHwgbWF0Y2goJy0tJykpIHtcbiAgICAgICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgICAgICB0b2tlbiA9IGxleCgpO1xuICAgICAgICAgICAgZXhwciA9IHBhcnNlVW5hcnlFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAvLyAxMS40LjQsIDExLjQuNVxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBleHByLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyICYmIGlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuU3RyaWN0TEhTUHJlZml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0xlZnRIYW5kU2lkZShleHByKSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuSW52YWxpZExIU0luQXNzaWdubWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVVbmFyeUV4cHJlc3Npb24odG9rZW4udmFsdWUsIGV4cHIpO1xuICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLm1hcmtFbmQoZXhwciwgc3RhcnRUb2tlbik7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2goJysnKSB8fCBtYXRjaCgnLScpIHx8IG1hdGNoKCd+JykgfHwgbWF0Y2goJyEnKSkge1xuICAgICAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgICAgIHRva2VuID0gbGV4KCk7XG4gICAgICAgICAgICBleHByID0gcGFyc2VVbmFyeUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVVbmFyeUV4cHJlc3Npb24odG9rZW4udmFsdWUsIGV4cHIpO1xuICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLm1hcmtFbmQoZXhwciwgc3RhcnRUb2tlbik7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hLZXl3b3JkKCdkZWxldGUnKSB8fCBtYXRjaEtleXdvcmQoJ3ZvaWQnKSB8fCBtYXRjaEtleXdvcmQoJ3R5cGVvZicpKSB7XG4gICAgICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICAgICAgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZVVuYXJ5RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZVVuYXJ5RXhwcmVzc2lvbih0b2tlbi52YWx1ZSwgZXhwcik7XG4gICAgICAgICAgICBleHByID0gZGVsZWdhdGUubWFya0VuZChleHByLCBzdGFydFRva2VuKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZXhwci5vcGVyYXRvciA9PT0gJ2RlbGV0ZScgJiYgZXhwci5hcmd1bWVudC50eXBlID09PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuU3RyaWN0RGVsZXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZVBvc3RmaXhFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaW5hcnlQcmVjZWRlbmNlKHRva2VuLCBhbGxvd0luKSB7XG4gICAgICAgIHZhciBwcmVjID0gMDtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVG9rZW4uUHVuY3R1YXRvciAmJiB0b2tlbi50eXBlICE9PSBUb2tlbi5LZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodG9rZW4udmFsdWUpIHtcbiAgICAgICAgY2FzZSAnfHwnOlxuICAgICAgICAgICAgcHJlYyA9IDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICBwcmVjID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICAgICAgcHJlYyA9IDM7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdeJzpcbiAgICAgICAgICAgIHByZWMgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICBwcmVjID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgcHJlYyA9IDY7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICBjYXNlICdpbnN0YW5jZW9mJzpcbiAgICAgICAgICAgIHByZWMgPSA3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgcHJlYyA9IGFsbG93SW4gPyA3IDogMDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJzw8JzpcbiAgICAgICAgY2FzZSAnPj4nOlxuICAgICAgICBjYXNlICc+Pj4nOlxuICAgICAgICAgICAgcHJlYyA9IDg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICBwcmVjID0gOTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICBwcmVjID0gMTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlYztcbiAgICB9XG5cbiAgICAvLyAxMS41IE11bHRpcGxpY2F0aXZlIE9wZXJhdG9yc1xuICAgIC8vIDExLjYgQWRkaXRpdmUgT3BlcmF0b3JzXG4gICAgLy8gMTEuNyBCaXR3aXNlIFNoaWZ0IE9wZXJhdG9yc1xuICAgIC8vIDExLjggUmVsYXRpb25hbCBPcGVyYXRvcnNcbiAgICAvLyAxMS45IEVxdWFsaXR5IE9wZXJhdG9yc1xuICAgIC8vIDExLjEwIEJpbmFyeSBCaXR3aXNlIE9wZXJhdG9yc1xuICAgIC8vIDExLjExIEJpbmFyeSBMb2dpY2FsIE9wZXJhdG9yc1xuXG4gICAgZnVuY3Rpb24gcGFyc2VCaW5hcnlFeHByZXNzaW9uKCkge1xuICAgICAgICB2YXIgbWFya2VyLCBtYXJrZXJzLCBleHByLCB0b2tlbiwgcHJlYywgc3RhY2ssIHJpZ2h0LCBvcGVyYXRvciwgbGVmdCwgaTtcblxuICAgICAgICBtYXJrZXIgPSBsb29rYWhlYWQ7XG4gICAgICAgIGxlZnQgPSBwYXJzZVVuYXJ5RXhwcmVzc2lvbigpO1xuXG4gICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBwcmVjID0gYmluYXJ5UHJlY2VkZW5jZSh0b2tlbiwgc3RhdGUuYWxsb3dJbik7XG4gICAgICAgIGlmIChwcmVjID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbi5wcmVjID0gcHJlYztcbiAgICAgICAgbGV4KCk7XG5cbiAgICAgICAgbWFya2VycyA9IFttYXJrZXIsIGxvb2thaGVhZF07XG4gICAgICAgIHJpZ2h0ID0gcGFyc2VVbmFyeUV4cHJlc3Npb24oKTtcblxuICAgICAgICBzdGFjayA9IFtsZWZ0LCB0b2tlbiwgcmlnaHRdO1xuXG4gICAgICAgIHdoaWxlICgocHJlYyA9IGJpbmFyeVByZWNlZGVuY2UobG9va2FoZWFkLCBzdGF0ZS5hbGxvd0luKSkgPiAwKSB7XG5cbiAgICAgICAgICAgIC8vIFJlZHVjZTogbWFrZSBhIGJpbmFyeSBleHByZXNzaW9uIGZyb20gdGhlIHRocmVlIHRvcG1vc3QgZW50cmllcy5cbiAgICAgICAgICAgIHdoaWxlICgoc3RhY2subGVuZ3RoID4gMikgJiYgKHByZWMgPD0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMl0ucHJlYykpIHtcbiAgICAgICAgICAgICAgICByaWdodCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIG9wZXJhdG9yID0gc3RhY2sucG9wKCkudmFsdWU7XG4gICAgICAgICAgICAgICAgbGVmdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVCaW5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICAgICAgbWFya2Vycy5wb3AoKTtcbiAgICAgICAgICAgICAgICBtYXJrZXIgPSBtYXJrZXJzW21hcmtlcnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgZGVsZWdhdGUubWFya0VuZChleHByLCBtYXJrZXIpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goZXhwcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNoaWZ0LlxuICAgICAgICAgICAgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgICAgIHRva2VuLnByZWMgPSBwcmVjO1xuICAgICAgICAgICAgc3RhY2sucHVzaCh0b2tlbik7XG4gICAgICAgICAgICBtYXJrZXJzLnB1c2gobG9va2FoZWFkKTtcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZVVuYXJ5RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsIHJlZHVjZSB0byBjbGVhbi11cCB0aGUgc3RhY2suXG4gICAgICAgIGkgPSBzdGFjay5sZW5ndGggLSAxO1xuICAgICAgICBleHByID0gc3RhY2tbaV07XG4gICAgICAgIG1hcmtlcnMucG9wKCk7XG4gICAgICAgIHdoaWxlIChpID4gMSkge1xuICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZUJpbmFyeUV4cHJlc3Npb24oc3RhY2tbaSAtIDFdLnZhbHVlLCBzdGFja1tpIC0gMl0sIGV4cHIpO1xuICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgICAgbWFya2VyID0gbWFya2Vycy5wb3AoKTtcbiAgICAgICAgICAgIGRlbGVnYXRlLm1hcmtFbmQoZXhwciwgbWFya2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuXG4gICAgLy8gMTEuMTIgQ29uZGl0aW9uYWwgT3BlcmF0b3JcblxuICAgIGZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkge1xuICAgICAgICB2YXIgZXhwciwgcHJldmlvdXNBbGxvd0luLCBjb25zZXF1ZW50LCBhbHRlcm5hdGUsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBleHByID0gcGFyc2VCaW5hcnlFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgaWYgKG1hdGNoKCc/JykpIHtcbiAgICAgICAgICAgIGxleCgpO1xuICAgICAgICAgICAgcHJldmlvdXNBbGxvd0luID0gc3RhdGUuYWxsb3dJbjtcbiAgICAgICAgICAgIHN0YXRlLmFsbG93SW4gPSB0cnVlO1xuICAgICAgICAgICAgY29uc2VxdWVudCA9IHBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIHN0YXRlLmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG4gICAgICAgICAgICBleHBlY3QoJzonKTtcbiAgICAgICAgICAgIGFsdGVybmF0ZSA9IHBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblxuICAgICAgICAgICAgZXhwciA9IGRlbGVnYXRlLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihleHByLCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpO1xuICAgICAgICAgICAgZGVsZWdhdGUubWFya0VuZChleHByLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cblxuICAgIC8vIDExLjEzIEFzc2lnbm1lbnQgT3BlcmF0b3JzXG5cbiAgICBmdW5jdGlvbiBwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCkge1xuICAgICAgICB2YXIgdG9rZW4sIGxlZnQsIHJpZ2h0LCBub2RlLCBzdGFydFRva2VuO1xuXG4gICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuXG4gICAgICAgIG5vZGUgPSBsZWZ0ID0gcGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb24oKTtcblxuICAgICAgICBpZiAobWF0Y2hBc3NpZ24oKSkge1xuICAgICAgICAgICAgLy8gTGVmdEhhbmRTaWRlRXhwcmVzc2lvblxuICAgICAgICAgICAgaWYgKCFpc0xlZnRIYW5kU2lkZShsZWZ0KSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuSW52YWxpZExIU0luQXNzaWdubWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDExLjEzLjFcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgbGVmdC50eXBlID09PSBTeW50YXguSWRlbnRpZmllciAmJiBpc1Jlc3RyaWN0ZWRXb3JkKGxlZnQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQodG9rZW4sIE1lc3NhZ2VzLlN0cmljdExIU0Fzc2lnbm1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b2tlbiA9IGxleCgpO1xuICAgICAgICAgICAgcmlnaHQgPSBwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICBub2RlID0gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbih0b2tlbi52YWx1ZSwgbGVmdCwgcmlnaHQpLCBzdGFydFRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIDExLjE0IENvbW1hIE9wZXJhdG9yXG5cbiAgICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciBleHByLCBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuXG4gICAgICAgIGV4cHIgPSBwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgaWYgKG1hdGNoKCcsJykpIHtcbiAgICAgICAgICAgIGV4cHIgPSBkZWxlZ2F0ZS5jcmVhdGVTZXF1ZW5jZUV4cHJlc3Npb24oWyBleHByIF0pO1xuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKCcsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxleCgpO1xuICAgICAgICAgICAgICAgIGV4cHIuZXhwcmVzc2lvbnMucHVzaChwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxlZ2F0ZS5tYXJrRW5kKGV4cHIsIHN0YXJ0VG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgLy8gMTIuMSBCbG9ja1xuXG4gICAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRMaXN0KCkge1xuICAgICAgICB2YXIgbGlzdCA9IFtdLFxuICAgICAgICAgICAgc3RhdGVtZW50O1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG1hdGNoKCd9JykpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlbWVudCA9IHBhcnNlU291cmNlRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0LnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKSB7XG4gICAgICAgIHZhciBibG9jaywgc3RhcnRUb2tlbjtcblxuICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBleHBlY3QoJ3snKTtcblxuICAgICAgICBibG9jayA9IHBhcnNlU3RhdGVtZW50TGlzdCgpO1xuXG4gICAgICAgIGV4cGVjdCgnfScpO1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUJsb2NrU3RhdGVtZW50KGJsb2NrKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTIuMiBWYXJpYWJsZSBTdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCkge1xuICAgICAgICB2YXIgdG9rZW4sIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgdG9rZW4gPSBsZXgoKTtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVG9rZW4uSWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhyb3dVbmV4cGVjdGVkKHRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUlkZW50aWZpZXIodG9rZW4udmFsdWUpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb24oa2luZCkge1xuICAgICAgICB2YXIgaW5pdCA9IG51bGwsIGlkLCBzdGFydFRva2VuO1xuXG4gICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgIGlkID0gcGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblxuICAgICAgICAvLyAxMi4yLjFcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLlN0cmljdFZhck5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtpbmQgPT09ICdjb25zdCcpIHtcbiAgICAgICAgICAgIGV4cGVjdCgnPScpO1xuICAgICAgICAgICAgaW5pdCA9IHBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaCgnPScpKSB7XG4gICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgIGluaXQgPSBwYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVWYXJpYWJsZURlY2xhcmF0b3IoaWQsIGluaXQpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KGtpbmQpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBsaXN0LnB1c2gocGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKGtpbmQpKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2goJywnKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgIH0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTtcblxuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVZhcmlhYmxlU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgZGVjbGFyYXRpb25zO1xuXG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ3ZhcicpO1xuXG4gICAgICAgIGRlY2xhcmF0aW9ucyA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTtcblxuICAgICAgICBjb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCAndmFyJyk7XG4gICAgfVxuXG4gICAgLy8ga2luZCBtYXkgYmUgYGNvbnN0YCBvciBgbGV0YFxuICAgIC8vIEJvdGggYXJlIGV4cGVyaW1lbnRhbCBhbmQgbm90IGluIHRoZSBzcGVjaWZpY2F0aW9uIHlldC5cbiAgICAvLyBzZWUgaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9aGFybW9ueTpjb25zdFxuICAgIC8vIGFuZCBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmxldFxuICAgIGZ1bmN0aW9uIHBhcnNlQ29uc3RMZXREZWNsYXJhdGlvbihraW5kKSB7XG4gICAgICAgIHZhciBkZWNsYXJhdGlvbnMsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBleHBlY3RLZXl3b3JkKGtpbmQpO1xuXG4gICAgICAgIGRlY2xhcmF0aW9ucyA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qoa2luZCk7XG5cbiAgICAgICAgY29uc3VtZVNlbWljb2xvbigpO1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTIuMyBFbXB0eSBTdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlRW1wdHlTdGF0ZW1lbnQoKSB7XG4gICAgICAgIGV4cGVjdCgnOycpO1xuICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRW1wdHlTdGF0ZW1lbnQoKTtcbiAgICB9XG5cbiAgICAvLyAxMi40IEV4cHJlc3Npb24gU3RhdGVtZW50XG5cbiAgICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKSB7XG4gICAgICAgIHZhciBleHByID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcik7XG4gICAgfVxuXG4gICAgLy8gMTIuNSBJZiBzdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlSWZTdGF0ZW1lbnQoKSB7XG4gICAgICAgIHZhciB0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGU7XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgnaWYnKTtcblxuICAgICAgICBleHBlY3QoJygnKTtcblxuICAgICAgICB0ZXN0ID0gcGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgZXhwZWN0KCcpJyk7XG5cbiAgICAgICAgY29uc2VxdWVudCA9IHBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICAgICAgaWYgKG1hdGNoS2V5d29yZCgnZWxzZScpKSB7XG4gICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgIGFsdGVybmF0ZSA9IHBhcnNlU3RhdGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUlmU3RhdGVtZW50KHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSk7XG4gICAgfVxuXG4gICAgLy8gMTIuNiBJdGVyYXRpb24gU3RhdGVtZW50c1xuXG4gICAgZnVuY3Rpb24gcGFyc2VEb1doaWxlU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgYm9keSwgdGVzdCwgb2xkSW5JdGVyYXRpb247XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgnZG8nKTtcblxuICAgICAgICBvbGRJbkl0ZXJhdGlvbiA9IHN0YXRlLmluSXRlcmF0aW9uO1xuICAgICAgICBzdGF0ZS5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICAgICAgc3RhdGUuaW5JdGVyYXRpb24gPSBvbGRJbkl0ZXJhdGlvbjtcblxuICAgICAgICBleHBlY3RLZXl3b3JkKCd3aGlsZScpO1xuXG4gICAgICAgIGV4cGVjdCgnKCcpO1xuXG4gICAgICAgIHRlc3QgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICBpZiAobWF0Y2goJzsnKSkge1xuICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRG9XaGlsZVN0YXRlbWVudChib2R5LCB0ZXN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVdoaWxlU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgdGVzdCwgYm9keSwgb2xkSW5JdGVyYXRpb247XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgnd2hpbGUnKTtcblxuICAgICAgICBleHBlY3QoJygnKTtcblxuICAgICAgICB0ZXN0ID0gcGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgZXhwZWN0KCcpJyk7XG5cbiAgICAgICAgb2xkSW5JdGVyYXRpb24gPSBzdGF0ZS5pbkl0ZXJhdGlvbjtcbiAgICAgICAgc3RhdGUuaW5JdGVyYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGJvZHkgPSBwYXJzZVN0YXRlbWVudCgpO1xuXG4gICAgICAgIHN0YXRlLmluSXRlcmF0aW9uID0gb2xkSW5JdGVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVdoaWxlU3RhdGVtZW50KHRlc3QsIGJvZHkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlRm9yVmFyaWFibGVEZWNsYXJhdGlvbigpIHtcbiAgICAgICAgdmFyIHRva2VuLCBkZWNsYXJhdGlvbnMsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgdG9rZW4gPSBsZXgoKTtcbiAgICAgICAgZGVjbGFyYXRpb25zID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpO1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCB0b2tlbi52YWx1ZSksIHN0YXJ0VG9rZW4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlRm9yU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgaW5pdCwgdGVzdCwgdXBkYXRlLCBsZWZ0LCByaWdodCwgYm9keSwgb2xkSW5JdGVyYXRpb247XG5cbiAgICAgICAgaW5pdCA9IHRlc3QgPSB1cGRhdGUgPSBudWxsO1xuXG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ2ZvcicpO1xuXG4gICAgICAgIGV4cGVjdCgnKCcpO1xuXG4gICAgICAgIGlmIChtYXRjaCgnOycpKSB7XG4gICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXRjaEtleXdvcmQoJ3ZhcicpIHx8IG1hdGNoS2V5d29yZCgnbGV0JykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5hbGxvd0luID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaW5pdCA9IHBhcnNlRm9yVmFyaWFibGVEZWNsYXJhdGlvbigpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmFsbG93SW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluaXQuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiBtYXRjaEtleXdvcmQoJ2luJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IHBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXRlLmFsbG93SW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbml0ID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgc3RhdGUuYWxsb3dJbiA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hLZXl3b3JkKCdpbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExlZnRIYW5kU2lkZUV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZnRIYW5kU2lkZShpbml0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KHt9LCBNZXNzYWdlcy5JbnZhbGlkTEhTSW5Gb3JJbik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4cGVjdCgnOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICBpZiAoIW1hdGNoKCc7JykpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHBlY3QoJzsnKTtcblxuICAgICAgICAgICAgaWYgKCFtYXRjaCgnKScpKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICBvbGRJbkl0ZXJhdGlvbiA9IHN0YXRlLmluSXRlcmF0aW9uO1xuICAgICAgICBzdGF0ZS5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICAgICAgc3RhdGUuaW5JdGVyYXRpb24gPSBvbGRJbkl0ZXJhdGlvbjtcblxuICAgICAgICByZXR1cm4gKHR5cGVvZiBsZWZ0ID09PSAndW5kZWZpbmVkJykgP1xuICAgICAgICAgICAgICAgIGRlbGVnYXRlLmNyZWF0ZUZvclN0YXRlbWVudChpbml0LCB0ZXN0LCB1cGRhdGUsIGJvZHkpIDpcbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5jcmVhdGVGb3JJblN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSk7XG4gICAgfVxuXG4gICAgLy8gMTIuNyBUaGUgY29udGludWUgc3RhdGVtZW50XG5cbiAgICBmdW5jdGlvbiBwYXJzZUNvbnRpbnVlU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgbGFiZWwgPSBudWxsLCBrZXk7XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgnY29udGludWUnKTtcblxuICAgICAgICAvLyBPcHRpbWl6ZSB0aGUgbW9zdCBjb21tb24gZm9ybTogJ2NvbnRpbnVlOycuXG4gICAgICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDB4M0IpIHtcbiAgICAgICAgICAgIGxleCgpO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlLmluSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuSWxsZWdhbENvbnRpbnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUNvbnRpbnVlU3RhdGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBlZWtMaW5lVGVybWluYXRvcigpKSB7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmluSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuSWxsZWdhbENvbnRpbnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUNvbnRpbnVlU3RhdGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlID09PSBUb2tlbi5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBsYWJlbCA9IHBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgICAgIGtleSA9ICckJyArIGxhYmVsLm5hbWU7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5sYWJlbFNldCwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlVua25vd25MYWJlbCwgbGFiZWwubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICAgICAgaWYgKGxhYmVsID09PSBudWxsICYmICFzdGF0ZS5pbkl0ZXJhdGlvbikge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuSWxsZWdhbENvbnRpbnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVDb250aW51ZVN0YXRlbWVudChsYWJlbCk7XG4gICAgfVxuXG4gICAgLy8gMTIuOCBUaGUgYnJlYWsgc3RhdGVtZW50XG5cbiAgICBmdW5jdGlvbiBwYXJzZUJyZWFrU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgbGFiZWwgPSBudWxsLCBrZXk7XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgnYnJlYWsnKTtcblxuICAgICAgICAvLyBDYXRjaCB0aGUgdmVyeSBjb21tb24gY2FzZSBmaXJzdDogaW1tZWRpYXRlbHkgYSBzZW1pY29sb24gKFUrMDAzQikuXG4gICAgICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDB4M0IpIHtcbiAgICAgICAgICAgIGxleCgpO1xuXG4gICAgICAgICAgICBpZiAoIShzdGF0ZS5pbkl0ZXJhdGlvbiB8fCBzdGF0ZS5pblN3aXRjaCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5JbGxlZ2FsQnJlYWspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQnJlYWtTdGF0ZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGVla0xpbmVUZXJtaW5hdG9yKCkpIHtcbiAgICAgICAgICAgIGlmICghKHN0YXRlLmluSXRlcmF0aW9uIHx8IHN0YXRlLmluU3dpdGNoKSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLklsbGVnYWxCcmVhayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVCcmVha1N0YXRlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb29rYWhlYWQudHlwZSA9PT0gVG9rZW4uSWRlbnRpZmllcikge1xuICAgICAgICAgICAgbGFiZWwgPSBwYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXG4gICAgICAgICAgICBrZXkgPSAnJCcgKyBsYWJlbC5uYW1lO1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdGUubGFiZWxTZXQsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5Vbmtub3duTGFiZWwsIGxhYmVsLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3VtZVNlbWljb2xvbigpO1xuXG4gICAgICAgIGlmIChsYWJlbCA9PT0gbnVsbCAmJiAhKHN0YXRlLmluSXRlcmF0aW9uIHx8IHN0YXRlLmluU3dpdGNoKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuSWxsZWdhbEJyZWFrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVCcmVha1N0YXRlbWVudChsYWJlbCk7XG4gICAgfVxuXG4gICAgLy8gMTIuOSBUaGUgcmV0dXJuIHN0YXRlbWVudFxuXG4gICAgZnVuY3Rpb24gcGFyc2VSZXR1cm5TdGF0ZW1lbnQoKSB7XG4gICAgICAgIHZhciBhcmd1bWVudCA9IG51bGw7XG5cbiAgICAgICAgZXhwZWN0S2V5d29yZCgncmV0dXJuJyk7XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5pbkZ1bmN0aW9uQm9keSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KHt9LCBNZXNzYWdlcy5JbGxlZ2FsUmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdyZXR1cm4nIGZvbGxvd2VkIGJ5IGEgc3BhY2UgYW5kIGFuIGlkZW50aWZpZXIgaXMgdmVyeSBjb21tb24uXG4gICAgICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdChpbmRleCkgPT09IDB4MjApIHtcbiAgICAgICAgICAgIGlmIChpc0lkZW50aWZpZXJTdGFydChzb3VyY2UuY2hhckNvZGVBdChpbmRleCArIDEpKSkge1xuICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgY29uc3VtZVNlbWljb2xvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVSZXR1cm5TdGF0ZW1lbnQoYXJndW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBlZWtMaW5lVGVybWluYXRvcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlUmV0dXJuU3RhdGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtYXRjaCgnOycpKSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKCd9JykgJiYgbG9va2FoZWFkLnR5cGUgIT09IFRva2VuLkVPRikge1xuICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVJldHVyblN0YXRlbWVudChhcmd1bWVudCk7XG4gICAgfVxuXG4gICAgLy8gMTIuMTAgVGhlIHdpdGggc3RhdGVtZW50XG5cbiAgICBmdW5jdGlvbiBwYXJzZVdpdGhTdGF0ZW1lbnQoKSB7XG4gICAgICAgIHZhciBvYmplY3QsIGJvZHk7XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgLy8gVE9ETyhpa2FyaWVuYXRvcik6IFNob3VsZCB3ZSB1cGRhdGUgdGhlIHRlc3QgY2FzZXMgaW5zdGVhZD9cbiAgICAgICAgICAgIHNraXBDb21tZW50KCk7XG4gICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoe30sIE1lc3NhZ2VzLlN0cmljdE1vZGVXaXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ3dpdGgnKTtcblxuICAgICAgICBleHBlY3QoJygnKTtcblxuICAgICAgICBvYmplY3QgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICBib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTtcblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlV2l0aFN0YXRlbWVudChvYmplY3QsIGJvZHkpO1xuICAgIH1cblxuICAgIC8vIDEyLjEwIFRoZSBzd2l0aCBzdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlU3dpdGNoQ2FzZSgpIHtcbiAgICAgICAgdmFyIHRlc3QsIGNvbnNlcXVlbnQgPSBbXSwgc3RhdGVtZW50LCBzdGFydFRva2VuO1xuXG4gICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgIGlmIChtYXRjaEtleXdvcmQoJ2RlZmF1bHQnKSkge1xuICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgICAgICB0ZXN0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cGVjdEtleXdvcmQoJ2Nhc2UnKTtcbiAgICAgICAgICAgIHRlc3QgPSBwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgfVxuICAgICAgICBleHBlY3QoJzonKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaCgnfScpIHx8IG1hdGNoS2V5d29yZCgnZGVmYXVsdCcpIHx8IG1hdGNoS2V5d29yZCgnY2FzZScpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpO1xuICAgICAgICAgICAgY29uc2VxdWVudC5wdXNoKHN0YXRlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVTd2l0Y2hDYXNlKHRlc3QsIGNvbnNlcXVlbnQpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVN3aXRjaFN0YXRlbWVudCgpIHtcbiAgICAgICAgdmFyIGRpc2NyaW1pbmFudCwgY2FzZXMsIGNsYXVzZSwgb2xkSW5Td2l0Y2gsIGRlZmF1bHRGb3VuZDtcblxuICAgICAgICBleHBlY3RLZXl3b3JkKCdzd2l0Y2gnKTtcblxuICAgICAgICBleHBlY3QoJygnKTtcblxuICAgICAgICBkaXNjcmltaW5hbnQgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBleHBlY3QoJyknKTtcblxuICAgICAgICBleHBlY3QoJ3snKTtcblxuICAgICAgICBjYXNlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtYXRjaCgnfScpKSB7XG4gICAgICAgICAgICBsZXgoKTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVTd2l0Y2hTdGF0ZW1lbnQoZGlzY3JpbWluYW50LCBjYXNlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBvbGRJblN3aXRjaCA9IHN0YXRlLmluU3dpdGNoO1xuICAgICAgICBzdGF0ZS5pblN3aXRjaCA9IHRydWU7XG4gICAgICAgIGRlZmF1bHRGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG1hdGNoKCd9JykpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsYXVzZSA9IHBhcnNlU3dpdGNoQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGNsYXVzZS50ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKHt9LCBNZXNzYWdlcy5NdWx0aXBsZURlZmF1bHRzSW5Td2l0Y2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZXMucHVzaChjbGF1c2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuaW5Td2l0Y2ggPSBvbGRJblN3aXRjaDtcblxuICAgICAgICBleHBlY3QoJ30nKTtcblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlU3dpdGNoU3RhdGVtZW50KGRpc2NyaW1pbmFudCwgY2FzZXMpO1xuICAgIH1cblxuICAgIC8vIDEyLjEzIFRoZSB0aHJvdyBzdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlVGhyb3dTdGF0ZW1lbnQoKSB7XG4gICAgICAgIHZhciBhcmd1bWVudDtcblxuICAgICAgICBleHBlY3RLZXl3b3JkKCd0aHJvdycpO1xuXG4gICAgICAgIGlmIChwZWVrTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcih7fSwgTWVzc2FnZXMuTmV3bGluZUFmdGVyVGhyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJndW1lbnQgPSBwYXJzZUV4cHJlc3Npb24oKTtcblxuICAgICAgICBjb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVRocm93U3RhdGVtZW50KGFyZ3VtZW50KTtcbiAgICB9XG5cbiAgICAvLyAxMi4xNCBUaGUgdHJ5IHN0YXRlbWVudFxuXG4gICAgZnVuY3Rpb24gcGFyc2VDYXRjaENsYXVzZSgpIHtcbiAgICAgICAgdmFyIHBhcmFtLCBib2R5LCBzdGFydFRva2VuO1xuXG4gICAgICAgIHN0YXJ0VG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ2NhdGNoJyk7XG5cbiAgICAgICAgZXhwZWN0KCcoJyk7XG4gICAgICAgIGlmIChtYXRjaCgnKScpKSB7XG4gICAgICAgICAgICB0aHJvd1VuZXhwZWN0ZWQobG9va2FoZWFkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtID0gcGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcbiAgICAgICAgLy8gMTIuMTQuMVxuICAgICAgICBpZiAoc3RyaWN0ICYmIGlzUmVzdHJpY3RlZFdvcmQocGFyYW0ubmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh7fSwgTWVzc2FnZXMuU3RyaWN0Q2F0Y2hWYXJpYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoJyknKTtcbiAgICAgICAgYm9keSA9IHBhcnNlQmxvY2soKTtcbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlQ2F0Y2hDbGF1c2UocGFyYW0sIGJvZHkpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVRyeVN0YXRlbWVudCgpIHtcbiAgICAgICAgdmFyIGJsb2NrLCBoYW5kbGVycyA9IFtdLCBmaW5hbGl6ZXIgPSBudWxsO1xuXG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ3RyeScpO1xuXG4gICAgICAgIGJsb2NrID0gcGFyc2VCbG9jaygpO1xuXG4gICAgICAgIGlmIChtYXRjaEtleXdvcmQoJ2NhdGNoJykpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzLnB1c2gocGFyc2VDYXRjaENsYXVzZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaEtleXdvcmQoJ2ZpbmFsbHknKSkge1xuICAgICAgICAgICAgbGV4KCk7XG4gICAgICAgICAgICBmaW5hbGl6ZXIgPSBwYXJzZUJsb2NrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwICYmICFmaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLk5vQ2F0Y2hPckZpbmFsbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVRyeVN0YXRlbWVudChibG9jaywgW10sIGhhbmRsZXJzLCBmaW5hbGl6ZXIpO1xuICAgIH1cblxuICAgIC8vIDEyLjE1IFRoZSBkZWJ1Z2dlciBzdGF0ZW1lbnRcblxuICAgIGZ1bmN0aW9uIHBhcnNlRGVidWdnZXJTdGF0ZW1lbnQoKSB7XG4gICAgICAgIGV4cGVjdEtleXdvcmQoJ2RlYnVnZ2VyJyk7XG5cbiAgICAgICAgY29uc3VtZVNlbWljb2xvbigpO1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVEZWJ1Z2dlclN0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIDEyIFN0YXRlbWVudHNcblxuICAgIGZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50KCkge1xuICAgICAgICB2YXIgdHlwZSA9IGxvb2thaGVhZC50eXBlLFxuICAgICAgICAgICAgZXhwcixcbiAgICAgICAgICAgIGxhYmVsZWRCb2R5LFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc3RhcnRUb2tlbjtcblxuICAgICAgICBpZiAodHlwZSA9PT0gVG9rZW4uRU9GKSB7XG4gICAgICAgICAgICB0aHJvd1VuZXhwZWN0ZWQobG9va2FoZWFkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSBUb2tlbi5QdW5jdHVhdG9yICYmIGxvb2thaGVhZC52YWx1ZSA9PT0gJ3snKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VCbG9jaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBpZiAodHlwZSA9PT0gVG9rZW4uUHVuY3R1YXRvcikge1xuICAgICAgICAgICAgc3dpdGNoIChsb29rYWhlYWQudmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgJzsnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlRW1wdHlTdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICcoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IFRva2VuLktleXdvcmQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobG9va2FoZWFkLnZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICdicmVhayc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQocGFyc2VCcmVha1N0YXRlbWVudCgpLCBzdGFydFRva2VuKTtcbiAgICAgICAgICAgIGNhc2UgJ2NvbnRpbnVlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZUNvbnRpbnVlU3RhdGVtZW50KCksIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgY2FzZSAnZGVidWdnZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlRGVidWdnZXJTdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICdkbyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQocGFyc2VEb1doaWxlU3RhdGVtZW50KCksIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgY2FzZSAnZm9yJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZUZvclN0YXRlbWVudCgpLCBzdGFydFRva2VuKTtcbiAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICdpZic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQocGFyc2VJZlN0YXRlbWVudCgpLCBzdGFydFRva2VuKTtcbiAgICAgICAgICAgIGNhc2UgJ3JldHVybic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQocGFyc2VSZXR1cm5TdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlU3dpdGNoU3RhdGVtZW50KCksIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgY2FzZSAndGhyb3cnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlVGhyb3dTdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICd0cnknOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlVHJ5U3RhdGVtZW50KCksIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgY2FzZSAndmFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZVZhcmlhYmxlU3RhdGVtZW50KCksIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgY2FzZSAnd2hpbGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKHBhcnNlV2hpbGVTdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBjYXNlICd3aXRoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChwYXJzZVdpdGhTdGF0ZW1lbnQoKSwgc3RhcnRUb2tlbik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXhwciA9IHBhcnNlRXhwcmVzc2lvbigpO1xuXG4gICAgICAgIC8vIDEyLjEyIExhYmVsbGVkIFN0YXRlbWVudHNcbiAgICAgICAgaWYgKChleHByLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSAmJiBtYXRjaCgnOicpKSB7XG4gICAgICAgICAgICBsZXgoKTtcblxuICAgICAgICAgICAga2V5ID0gJyQnICsgZXhwci5uYW1lO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5sYWJlbFNldCwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3Ioe30sIE1lc3NhZ2VzLlJlZGVjbGFyYXRpb24sICdMYWJlbCcsIGV4cHIubmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXRlLmxhYmVsU2V0W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgbGFiZWxlZEJvZHkgPSBwYXJzZVN0YXRlbWVudCgpO1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLmxhYmVsU2V0W2tleV07XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVMYWJlbGVkU3RhdGVtZW50KGV4cHIsIGxhYmVsZWRCb2R5KSwgc3RhcnRUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtFbmQoZGVsZWdhdGUuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChleHByKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgLy8gMTMgRnVuY3Rpb24gRGVmaW5pdGlvblxuXG4gICAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCkge1xuICAgICAgICB2YXIgc291cmNlRWxlbWVudCwgc291cmNlRWxlbWVudHMgPSBbXSwgdG9rZW4sIGRpcmVjdGl2ZSwgZmlyc3RSZXN0cmljdGVkLFxuICAgICAgICAgICAgb2xkTGFiZWxTZXQsIG9sZEluSXRlcmF0aW9uLCBvbGRJblN3aXRjaCwgb2xkSW5GdW5jdGlvbkJvZHksIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgZXhwZWN0KCd7Jyk7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobG9va2FoZWFkLnR5cGUgIT09IFRva2VuLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuXG4gICAgICAgICAgICBzb3VyY2VFbGVtZW50ID0gcGFyc2VTb3VyY2VFbGVtZW50KCk7XG4gICAgICAgICAgICBzb3VyY2VFbGVtZW50cy5wdXNoKHNvdXJjZUVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQuZXhwcmVzc2lvbi50eXBlICE9PSBTeW50YXguTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGRpcmVjdGl2ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlyZWN0aXZlID0gc291cmNlLnNsaWNlKHRva2VuLnN0YXJ0ICsgMSwgdG9rZW4uZW5kIC0gMSk7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aXZlID09PSAndXNlIHN0cmljdCcpIHtcbiAgICAgICAgICAgICAgICBzdHJpY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdFJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KGZpcnN0UmVzdHJpY3RlZCwgTWVzc2FnZXMuU3RyaWN0T2N0YWxMaXRlcmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZmlyc3RSZXN0cmljdGVkICYmIHRva2VuLm9jdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9sZExhYmVsU2V0ID0gc3RhdGUubGFiZWxTZXQ7XG4gICAgICAgIG9sZEluSXRlcmF0aW9uID0gc3RhdGUuaW5JdGVyYXRpb247XG4gICAgICAgIG9sZEluU3dpdGNoID0gc3RhdGUuaW5Td2l0Y2g7XG4gICAgICAgIG9sZEluRnVuY3Rpb25Cb2R5ID0gc3RhdGUuaW5GdW5jdGlvbkJvZHk7XG5cbiAgICAgICAgc3RhdGUubGFiZWxTZXQgPSB7fTtcbiAgICAgICAgc3RhdGUuaW5JdGVyYXRpb24gPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaW5Td2l0Y2ggPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaW5GdW5jdGlvbkJvZHkgPSB0cnVlO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG1hdGNoKCd9JykpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnQgPSBwYXJzZVNvdXJjZUVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnRzLnB1c2goc291cmNlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoJ30nKTtcblxuICAgICAgICBzdGF0ZS5sYWJlbFNldCA9IG9sZExhYmVsU2V0O1xuICAgICAgICBzdGF0ZS5pbkl0ZXJhdGlvbiA9IG9sZEluSXRlcmF0aW9uO1xuICAgICAgICBzdGF0ZS5pblN3aXRjaCA9IG9sZEluU3dpdGNoO1xuICAgICAgICBzdGF0ZS5pbkZ1bmN0aW9uQm9keSA9IG9sZEluRnVuY3Rpb25Cb2R5O1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUJsb2NrU3RhdGVtZW50KHNvdXJjZUVsZW1lbnRzKSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VQYXJhbXMoZmlyc3RSZXN0cmljdGVkKSB7XG4gICAgICAgIHZhciBwYXJhbSwgcGFyYW1zID0gW10sIHRva2VuLCBzdHJpY3RlZCwgcGFyYW1TZXQsIGtleSwgbWVzc2FnZTtcbiAgICAgICAgZXhwZWN0KCcoJyk7XG5cbiAgICAgICAgaWYgKCFtYXRjaCgnKScpKSB7XG4gICAgICAgICAgICBwYXJhbVNldCA9IHt9O1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuICAgICAgICAgICAgICAgIGtleSA9ICckJyArIHRva2VuLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RlZCA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtU2V0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RlZCA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLlN0cmljdFBhcmFtRHVwZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpcnN0UmVzdHJpY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtU2V0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zLnB1c2gocGFyYW0pO1xuICAgICAgICAgICAgICAgIHBhcmFtU2V0W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCgnKScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHBlY3QoJywnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdCgnKScpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIHN0cmljdGVkOiBzdHJpY3RlZCxcbiAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZDogZmlyc3RSZXN0cmljdGVkLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpIHtcbiAgICAgICAgdmFyIGlkLCBwYXJhbXMgPSBbXSwgYm9keSwgdG9rZW4sIHN0cmljdGVkLCB0bXAsIGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSwgcHJldmlvdXNTdHJpY3QsIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc3RhcnRUb2tlbiA9IGxvb2thaGVhZDtcblxuICAgICAgICBleHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuICAgICAgICB0b2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgaWQgPSBwYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQodG9rZW4sIE1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRtcCA9IHBhcnNlUGFyYW1zKGZpcnN0UmVzdHJpY3RlZCk7XG4gICAgICAgIHBhcmFtcyA9IHRtcC5wYXJhbXM7XG4gICAgICAgIHN0cmljdGVkID0gdG1wLnN0cmljdGVkO1xuICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0bXAuZmlyc3RSZXN0cmljdGVkO1xuICAgICAgICBpZiAodG1wLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSB0bXAubWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzU3RyaWN0ID0gc3RyaWN0O1xuICAgICAgICBib2R5ID0gcGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChzdHJpY3QgJiYgZmlyc3RSZXN0cmljdGVkKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmljdCAmJiBzdHJpY3RlZCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvclRvbGVyYW50KHN0cmljdGVkLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblxuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVGdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIFtdLCBib2R5KSwgc3RhcnRUb2tlbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKSB7XG4gICAgICAgIHZhciB0b2tlbiwgaWQgPSBudWxsLCBzdHJpY3RlZCwgZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlLCB0bXAsIHBhcmFtcyA9IFtdLCBib2R5LCBwcmV2aW91c1N0cmljdCwgc3RhcnRUb2tlbjtcblxuICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBleHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuXG4gICAgICAgIGlmICghbWF0Y2goJygnKSkge1xuICAgICAgICAgICAgdG9rZW4gPSBsb29rYWhlYWQ7XG4gICAgICAgICAgICBpZCA9IHBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3JUb2xlcmFudCh0b2tlbiwgTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1Jlc3RyaWN0ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG1wID0gcGFyc2VQYXJhbXMoZmlyc3RSZXN0cmljdGVkKTtcbiAgICAgICAgcGFyYW1zID0gdG1wLnBhcmFtcztcbiAgICAgICAgc3RyaWN0ZWQgPSB0bXAuc3RyaWN0ZWQ7XG4gICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRtcC5maXJzdFJlc3RyaWN0ZWQ7XG4gICAgICAgIGlmICh0bXAubWVzc2FnZSkge1xuICAgICAgICAgICAgbWVzc2FnZSA9IHRtcC5tZXNzYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNTdHJpY3QgPSBzdHJpY3Q7XG4gICAgICAgIGJvZHkgPSBwYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBmaXJzdFJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3IoZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyaWN0ICYmIHN0cmljdGVkKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrRW5kKGRlbGVnYXRlLmNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihpZCwgcGFyYW1zLCBbXSwgYm9keSksIHN0YXJ0VG9rZW4pO1xuICAgIH1cblxuICAgIC8vIDE0IFByb2dyYW1cblxuICAgIGZ1bmN0aW9uIHBhcnNlU291cmNlRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlID09PSBUb2tlbi5LZXl3b3JkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGxvb2thaGVhZC52YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnY29uc3QnOlxuICAgICAgICAgICAgY2FzZSAnbGV0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VDb25zdExldERlY2xhcmF0aW9uKGxvb2thaGVhZC52YWx1ZSk7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTdGF0ZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb29rYWhlYWQudHlwZSAhPT0gVG9rZW4uRU9GKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VTdGF0ZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlU291cmNlRWxlbWVudHMoKSB7XG4gICAgICAgIHZhciBzb3VyY2VFbGVtZW50LCBzb3VyY2VFbGVtZW50cyA9IFtdLCB0b2tlbiwgZGlyZWN0aXZlLCBmaXJzdFJlc3RyaWN0ZWQ7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICB0b2tlbiA9IGxvb2thaGVhZDtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBUb2tlbi5TdHJpbmdMaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnQgPSBwYXJzZVNvdXJjZUVsZW1lbnQoKTtcbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnRzLnB1c2goc291cmNlRWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoc291cmNlRWxlbWVudC5leHByZXNzaW9uLnR5cGUgIT09IFN5bnRheC5MaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgZGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXJlY3RpdmUgPSBzb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQgKyAxLCB0b2tlbi5lbmQgLSAxKTtcbiAgICAgICAgICAgIGlmIChkaXJlY3RpdmUgPT09ICd1c2Ugc3RyaWN0Jykge1xuICAgICAgICAgICAgICAgIHN0cmljdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0UmVzdHJpY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yVG9sZXJhbnQoZmlyc3RSZXN0cmljdGVkLCBNZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJlc3RyaWN0ZWQgJiYgdG9rZW4ub2N0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBzb3VyY2VFbGVtZW50ID0gcGFyc2VTb3VyY2VFbGVtZW50KCk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnRzLnB1c2goc291cmNlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZUVsZW1lbnRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlUHJvZ3JhbSgpIHtcbiAgICAgICAgdmFyIGJvZHksIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgc2tpcENvbW1lbnQoKTtcbiAgICAgICAgcGVlaygpO1xuICAgICAgICBzdGFydFRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICBzdHJpY3QgPSBmYWxzZTtcblxuICAgICAgICBib2R5ID0gcGFyc2VTb3VyY2VFbGVtZW50cygpO1xuICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya0VuZChkZWxlZ2F0ZS5jcmVhdGVQcm9ncmFtKGJvZHkpLCBzdGFydFRva2VuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWx0ZXJUb2tlbkxvY2F0aW9uKCkge1xuICAgICAgICB2YXIgaSwgZW50cnksIHRva2VuLCB0b2tlbnMgPSBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXh0cmEudG9rZW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBlbnRyeSA9IGV4dHJhLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIHRva2VuID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5LnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGV4dHJhLnJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdG9rZW4ucmFuZ2UgPSBlbnRyeS5yYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRyYS5sb2MpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi5sb2MgPSBlbnRyeS5sb2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBleHRyYS50b2tlbnMgPSB0b2tlbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9rZW5pemUoY29kZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdG9TdHJpbmcsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIHRva2VucztcblxuICAgICAgICB0b1N0cmluZyA9IFN0cmluZztcbiAgICAgICAgaWYgKHR5cGVvZiBjb2RlICE9PSAnc3RyaW5nJyAmJiAhKGNvZGUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICBjb2RlID0gdG9TdHJpbmcoY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxlZ2F0ZSA9IFN5bnRheFRyZWVEZWxlZ2F0ZTtcbiAgICAgICAgc291cmNlID0gY29kZTtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBsaW5lTnVtYmVyID0gKHNvdXJjZS5sZW5ndGggPiAwKSA/IDEgOiAwO1xuICAgICAgICBsaW5lU3RhcnQgPSAwO1xuICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICBsb29rYWhlYWQgPSBudWxsO1xuICAgICAgICBzdGF0ZSA9IHtcbiAgICAgICAgICAgIGFsbG93SW46IHRydWUsXG4gICAgICAgICAgICBsYWJlbFNldDoge30sXG4gICAgICAgICAgICBpbkZ1bmN0aW9uQm9keTogZmFsc2UsXG4gICAgICAgICAgICBpbkl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpblN3aXRjaDogZmFsc2UsXG4gICAgICAgICAgICBsYXN0Q29tbWVudFN0YXJ0OiAtMVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4dHJhID0ge307XG5cbiAgICAgICAgLy8gT3B0aW9ucyBtYXRjaGluZy5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLy8gT2YgY291cnNlIHdlIGNvbGxlY3QgdG9rZW5zIGhlcmUuXG4gICAgICAgIG9wdGlvbnMudG9rZW5zID0gdHJ1ZTtcbiAgICAgICAgZXh0cmEudG9rZW5zID0gW107XG4gICAgICAgIGV4dHJhLnRva2VuaXplID0gdHJ1ZTtcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBuZWNlc3NhcnkgdG8gY29tcHV0ZSB0aGUgUmVnZXggdG9rZW5zLlxuICAgICAgICBleHRyYS5vcGVuUGFyZW5Ub2tlbiA9IC0xO1xuICAgICAgICBleHRyYS5vcGVuQ3VybHlUb2tlbiA9IC0xO1xuXG4gICAgICAgIGV4dHJhLnJhbmdlID0gKHR5cGVvZiBvcHRpb25zLnJhbmdlID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMucmFuZ2U7XG4gICAgICAgIGV4dHJhLmxvYyA9ICh0eXBlb2Ygb3B0aW9ucy5sb2MgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy5sb2M7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbW1lbnQgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGV4dHJhLmNvbW1lbnRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRvbGVyYW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy50b2xlcmFudCkge1xuICAgICAgICAgICAgZXh0cmEuZXJyb3JzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGVlaygpO1xuICAgICAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlID09PSBUb2tlbi5FT0YpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmEudG9rZW5zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b2tlbiA9IGxleCgpO1xuICAgICAgICAgICAgd2hpbGUgKGxvb2thaGVhZC50eXBlICE9PSBUb2tlbi5FT0YpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxleCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGxleEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuID0gbG9va2FoZWFkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmEuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5lcnJvcnMucHVzaChsZXhFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGJyZWFrIG9uIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGxleEVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWx0ZXJUb2tlbkxvY2F0aW9uKCk7XG4gICAgICAgICAgICB0b2tlbnMgPSBleHRyYS50b2tlbnM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhLmNvbW1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRva2Vucy5jb21tZW50cyA9IGV4dHJhLmNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRyYS5lcnJvcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLmVycm9ycyA9IGV4dHJhLmVycm9ycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGV4dHJhID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZShjb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBwcm9ncmFtLCB0b1N0cmluZztcblxuICAgICAgICB0b1N0cmluZyA9IFN0cmluZztcbiAgICAgICAgaWYgKHR5cGVvZiBjb2RlICE9PSAnc3RyaW5nJyAmJiAhKGNvZGUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7XG4gICAgICAgICAgICBjb2RlID0gdG9TdHJpbmcoY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxlZ2F0ZSA9IFN5bnRheFRyZWVEZWxlZ2F0ZTtcbiAgICAgICAgc291cmNlID0gY29kZTtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBsaW5lTnVtYmVyID0gKHNvdXJjZS5sZW5ndGggPiAwKSA/IDEgOiAwO1xuICAgICAgICBsaW5lU3RhcnQgPSAwO1xuICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICBsb29rYWhlYWQgPSBudWxsO1xuICAgICAgICBzdGF0ZSA9IHtcbiAgICAgICAgICAgIGFsbG93SW46IHRydWUsXG4gICAgICAgICAgICBsYWJlbFNldDoge30sXG4gICAgICAgICAgICBpbkZ1bmN0aW9uQm9keTogZmFsc2UsXG4gICAgICAgICAgICBpbkl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpblN3aXRjaDogZmFsc2UsXG4gICAgICAgICAgICBsYXN0Q29tbWVudFN0YXJ0OiAtMVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4dHJhID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV4dHJhLnJhbmdlID0gKHR5cGVvZiBvcHRpb25zLnJhbmdlID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMucmFuZ2U7XG4gICAgICAgICAgICBleHRyYS5sb2MgPSAodHlwZW9mIG9wdGlvbnMubG9jID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMubG9jO1xuICAgICAgICAgICAgZXh0cmEuYXR0YWNoQ29tbWVudCA9ICh0eXBlb2Ygb3B0aW9ucy5hdHRhY2hDb21tZW50ID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMuYXR0YWNoQ29tbWVudDtcblxuICAgICAgICAgICAgaWYgKGV4dHJhLmxvYyAmJiBvcHRpb25zLnNvdXJjZSAhPT0gbnVsbCAmJiBvcHRpb25zLnNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZXh0cmEuc291cmNlID0gdG9TdHJpbmcob3B0aW9ucy5zb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudG9rZW5zID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy50b2tlbnMpIHtcbiAgICAgICAgICAgICAgICBleHRyYS50b2tlbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb21tZW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgZXh0cmEuY29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50b2xlcmFudCA9PT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMudG9sZXJhbnQpIHtcbiAgICAgICAgICAgICAgICBleHRyYS5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRyYS5hdHRhY2hDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgZXh0cmEucmFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV4dHJhLmNvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgZXh0cmEuYm90dG9tUmlnaHRTdGFjayA9IFtdO1xuICAgICAgICAgICAgICAgIGV4dHJhLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBleHRyYS5sZWFkaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gcGFyc2VQcm9ncmFtKCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4dHJhLmNvbW1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHByb2dyYW0uY29tbWVudHMgPSBleHRyYS5jb21tZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmEudG9rZW5zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGZpbHRlclRva2VuTG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnRva2VucyA9IGV4dHJhLnRva2VucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmEuZXJyb3JzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHByb2dyYW0uZXJyb3JzID0gZXh0cmEuZXJyb3JzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZXh0cmEgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIC8vIFN5bmMgd2l0aCAqLmpzb24gbWFuaWZlc3RzLlxuICAgIGV4cG9ydHMudmVyc2lvbiA9ICcxLjIuMic7XG5cbiAgICBleHBvcnRzLnRva2VuaXplID0gdG9rZW5pemU7XG5cbiAgICBleHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cbiAgICAvLyBEZWVwIGNvcHkuXG4gICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGV4cG9ydHMuU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5hbWUsIHR5cGVzID0ge307XG5cbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKG5hbWUgaW4gU3ludGF4KSB7XG4gICAgICAgICAgICBpZiAoU3ludGF4Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbbmFtZV0gPSBTeW50YXhbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5mcmVlemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIE9iamVjdC5mcmVlemUodHlwZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH0oKSk7XG5cbn0pKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG5cbn0se31dLDE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qIHBhcnNlciBnZW5lcmF0ZWQgYnkgamlzb24gMC40LjEzICovXG4vKlxuICBSZXR1cm5zIGEgUGFyc2VyIG9iamVjdCBvZiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcblxuICBQYXJzZXI6IHtcbiAgICB5eToge31cbiAgfVxuXG4gIFBhcnNlci5wcm90b3R5cGU6IHtcbiAgICB5eToge30sXG4gICAgdHJhY2U6IGZ1bmN0aW9uKCksXG4gICAgc3ltYm9sc186IHthc3NvY2lhdGl2ZSBsaXN0OiBuYW1lID09PiBudW1iZXJ9LFxuICAgIHRlcm1pbmFsc186IHthc3NvY2lhdGl2ZSBsaXN0OiBudW1iZXIgPT0+IG5hbWV9LFxuICAgIHByb2R1Y3Rpb25zXzogWy4uLl0sXG4gICAgcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24gYW5vbnltb3VzKHl5dGV4dCwgeXlsZW5nLCB5eWxpbmVubywgeXksIHl5c3RhdGUsICQkLCBfJCksXG4gICAgdGFibGU6IFsuLi5dLFxuICAgIGRlZmF1bHRBY3Rpb25zOiB7Li4ufSxcbiAgICBwYXJzZUVycm9yOiBmdW5jdGlvbihzdHIsIGhhc2gpLFxuICAgIHBhcnNlOiBmdW5jdGlvbihpbnB1dCksXG5cbiAgICBsZXhlcjoge1xuICAgICAgICBFT0Y6IDEsXG4gICAgICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uKHN0ciwgaGFzaCksXG4gICAgICAgIHNldElucHV0OiBmdW5jdGlvbihpbnB1dCksXG4gICAgICAgIGlucHV0OiBmdW5jdGlvbigpLFxuICAgICAgICB1bnB1dDogZnVuY3Rpb24oc3RyKSxcbiAgICAgICAgbW9yZTogZnVuY3Rpb24oKSxcbiAgICAgICAgbGVzczogZnVuY3Rpb24obiksXG4gICAgICAgIHBhc3RJbnB1dDogZnVuY3Rpb24oKSxcbiAgICAgICAgdXBjb21pbmdJbnB1dDogZnVuY3Rpb24oKSxcbiAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbigpLFxuICAgICAgICB0ZXN0X21hdGNoOiBmdW5jdGlvbihyZWdleF9tYXRjaF9hcnJheSwgcnVsZV9pbmRleCksXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uKCksXG4gICAgICAgIGxleDogZnVuY3Rpb24oKSxcbiAgICAgICAgYmVnaW46IGZ1bmN0aW9uKGNvbmRpdGlvbiksXG4gICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbigpLFxuICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbigpLFxuICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24oKSxcbiAgICAgICAgcHVzaFN0YXRlOiBmdW5jdGlvbihjb25kaXRpb24pLFxuXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHJhbmdlczogYm9vbGVhbiAgICAgICAgICAgKG9wdGlvbmFsOiB0cnVlID09PiB0b2tlbiBsb2NhdGlvbiBpbmZvIHdpbGwgaW5jbHVkZSBhIC5yYW5nZVtdIG1lbWJlcilcbiAgICAgICAgICAgIGZsZXg6IGJvb2xlYW4gICAgICAgICAgICAgKG9wdGlvbmFsOiB0cnVlID09PiBmbGV4LWxpa2UgbGV4aW5nIGJlaGF2aW91ciB3aGVyZSB0aGUgcnVsZXMgYXJlIHRlc3RlZCBleGhhdXN0aXZlbHkgdG8gZmluZCB0aGUgbG9uZ2VzdCBtYXRjaClcbiAgICAgICAgICAgIGJhY2t0cmFja19sZXhlcjogYm9vbGVhbiAgKG9wdGlvbmFsOiB0cnVlID09PiBsZXhlciByZWdleGVzIGFyZSB0ZXN0ZWQgaW4gb3JkZXIgYW5kIGZvciBlYWNoIG1hdGNoaW5nIHJlZ2V4IHRoZSBhY3Rpb24gY29kZSBpcyBpbnZva2VkOyB0aGUgbGV4ZXIgdGVybWluYXRlcyB0aGUgc2NhbiB3aGVuIGEgdG9rZW4gaXMgcmV0dXJuZWQgYnkgdGhlIGFjdGlvbiBjb2RlKVxuICAgICAgICB9LFxuXG4gICAgICAgIHBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUKSxcbiAgICAgICAgcnVsZXM6IFsuLi5dLFxuICAgICAgICBjb25kaXRpb25zOiB7YXNzb2NpYXRpdmUgbGlzdDogbmFtZSA9PT4gc2V0fSxcbiAgICB9XG4gIH1cblxuXG4gIHRva2VuIGxvY2F0aW9uIGluZm8gKEAkLCBfJCwgZXRjLik6IHtcbiAgICBmaXJzdF9saW5lOiBuLFxuICAgIGxhc3RfbGluZTogbixcbiAgICBmaXJzdF9jb2x1bW46IG4sXG4gICAgbGFzdF9jb2x1bW46IG4sXG4gICAgcmFuZ2U6IFtzdGFydF9udW1iZXIsIGVuZF9udW1iZXJdICAgICAgICh3aGVyZSB0aGUgbnVtYmVycyBhcmUgaW5kZXhlcyBpbnRvIHRoZSBpbnB1dCBzdHJpbmcsIHJlZ3VsYXIgemVyby1iYXNlZClcbiAgfVxuXG5cbiAgdGhlIHBhcnNlRXJyb3IgZnVuY3Rpb24gcmVjZWl2ZXMgYSAnaGFzaCcgb2JqZWN0IHdpdGggdGhlc2UgbWVtYmVycyBmb3IgbGV4ZXIgYW5kIHBhcnNlciBlcnJvcnM6IHtcbiAgICB0ZXh0OiAgICAgICAgKG1hdGNoZWQgdGV4dClcbiAgICB0b2tlbjogICAgICAgKHRoZSBwcm9kdWNlZCB0ZXJtaW5hbCB0b2tlbiwgaWYgYW55KVxuICAgIGxpbmU6ICAgICAgICAoeXlsaW5lbm8pXG4gIH1cbiAgd2hpbGUgcGFyc2VyIChncmFtbWFyKSBlcnJvcnMgd2lsbCBhbHNvIHByb3ZpZGUgdGhlc2UgbWVtYmVycywgaS5lLiBwYXJzZXIgZXJyb3JzIGRlbGl2ZXIgYSBzdXBlcnNldCBvZiBhdHRyaWJ1dGVzOiB7XG4gICAgbG9jOiAgICAgICAgICh5eWxsb2MpXG4gICAgZXhwZWN0ZWQ6ICAgIChzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2V0IG9mIGV4cGVjdGVkIHRva2VucylcbiAgICByZWNvdmVyYWJsZTogKGJvb2xlYW46IFRSVUUgd2hlbiB0aGUgcGFyc2VyIGhhcyBhIGVycm9yIHJlY292ZXJ5IHJ1bGUgYXZhaWxhYmxlIGZvciB0aGlzIHBhcnRpY3VsYXIgZXJyb3IpXG4gIH1cbiovXG52YXIgcGFyc2VyID0gKGZ1bmN0aW9uKCl7XG52YXIgcGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHsgfSxcbnl5OiB7fSxcbnN5bWJvbHNfOiB7XCJlcnJvclwiOjIsXCJKU09OX1BBVEhcIjozLFwiRE9MTEFSXCI6NCxcIlBBVEhfQ09NUE9ORU5UU1wiOjUsXCJMRUFESU5HX0NISUxEX01FTUJFUl9FWFBSRVNTSU9OXCI6NixcIlBBVEhfQ09NUE9ORU5UXCI6NyxcIk1FTUJFUl9DT01QT05FTlRcIjo4LFwiU1VCU0NSSVBUX0NPTVBPTkVOVFwiOjksXCJDSElMRF9NRU1CRVJfQ09NUE9ORU5UXCI6MTAsXCJERVNDRU5EQU5UX01FTUJFUl9DT01QT05FTlRcIjoxMSxcIkRPVFwiOjEyLFwiTUVNQkVSX0VYUFJFU1NJT05cIjoxMyxcIkRPVF9ET1RcIjoxNCxcIlNUQVJcIjoxNSxcIklERU5USUZJRVJcIjoxNixcIlNDUklQVF9FWFBSRVNTSU9OXCI6MTcsXCJJTlRFR0VSXCI6MTgsXCJFTkRcIjoxOSxcIkNISUxEX1NVQlNDUklQVF9DT01QT05FTlRcIjoyMCxcIkRFU0NFTkRBTlRfU1VCU0NSSVBUX0NPTVBPTkVOVFwiOjIxLFwiW1wiOjIyLFwiU1VCU0NSSVBUXCI6MjMsXCJdXCI6MjQsXCJTVUJTQ1JJUFRfRVhQUkVTU0lPTlwiOjI1LFwiU1VCU0NSSVBUX0VYUFJFU1NJT05fTElTVFwiOjI2LFwiU1VCU0NSSVBUX0VYUFJFU1NJT05fTElTVEFCTEVcIjoyNyxcIixcIjoyOCxcIlNUUklOR19MSVRFUkFMXCI6MjksXCJBUlJBWV9TTElDRVwiOjMwLFwiRklMVEVSX0VYUFJFU1NJT05cIjozMSxcIlFRX1NUUklOR1wiOjMyLFwiUV9TVFJJTkdcIjozMyxcIiRhY2NlcHRcIjowLFwiJGVuZFwiOjF9LFxudGVybWluYWxzXzogezI6XCJlcnJvclwiLDQ6XCJET0xMQVJcIiwxMjpcIkRPVFwiLDE0OlwiRE9UX0RPVFwiLDE1OlwiU1RBUlwiLDE2OlwiSURFTlRJRklFUlwiLDE3OlwiU0NSSVBUX0VYUFJFU1NJT05cIiwxODpcIklOVEVHRVJcIiwxOTpcIkVORFwiLDIyOlwiW1wiLDI0OlwiXVwiLDI4OlwiLFwiLDMwOlwiQVJSQVlfU0xJQ0VcIiwzMTpcIkZJTFRFUl9FWFBSRVNTSU9OXCIsMzI6XCJRUV9TVFJJTkdcIiwzMzpcIlFfU1RSSU5HXCJ9LFxucHJvZHVjdGlvbnNfOiBbMCxbMywxXSxbMywyXSxbMywxXSxbMywyXSxbNSwxXSxbNSwyXSxbNywxXSxbNywxXSxbOCwxXSxbOCwxXSxbMTAsMl0sWzYsMV0sWzExLDJdLFsxMywxXSxbMTMsMV0sWzEzLDFdLFsxMywxXSxbMTMsMV0sWzksMV0sWzksMV0sWzIwLDNdLFsyMSw0XSxbMjMsMV0sWzIzLDFdLFsyNiwxXSxbMjYsM10sWzI3LDFdLFsyNywxXSxbMjcsMV0sWzI1LDFdLFsyNSwxXSxbMjUsMV0sWzI5LDFdLFsyOSwxXV0sXG5wZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSAvKiBhY3Rpb25bMV0gKi8sICQkIC8qIHZzdGFjayAqLywgXyQgLyogbHN0YWNrICovXG4vKiovKSB7XG4vKiB0aGlzID09IHl5dmFsICovXG5pZiAoIXl5LmFzdCkge1xuICAgIHl5LmFzdCA9IF9hc3Q7XG4gICAgX2FzdC5pbml0aWFsaXplKCk7XG59XG5cbnZhciAkMCA9ICQkLmxlbmd0aCAtIDE7XG5zd2l0Y2ggKHl5c3RhdGUpIHtcbmNhc2UgMTp5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInJvb3RcIiwgdmFsdWU6ICQkWyQwXSB9IH0pOyB5eS5hc3QudW5zaGlmdCgpOyByZXR1cm4geXkuYXN0LnlpZWxkKClcbmJyZWFrO1xuY2FzZSAyOnl5LmFzdC5zZXQoeyBleHByZXNzaW9uOiB7IHR5cGU6IFwicm9vdFwiLCB2YWx1ZTogJCRbJDAtMV0gfSB9KTsgeXkuYXN0LnVuc2hpZnQoKTsgcmV0dXJuIHl5LmFzdC55aWVsZCgpXG5icmVhaztcbmNhc2UgMzp5eS5hc3QudW5zaGlmdCgpOyByZXR1cm4geXkuYXN0LnlpZWxkKClcbmJyZWFrO1xuY2FzZSA0Onl5LmFzdC5zZXQoeyBvcGVyYXRpb246IFwibWVtYmVyXCIsIHNjb3BlOiBcImNoaWxkXCIsIGV4cHJlc3Npb246IHsgdHlwZTogXCJpZGVudGlmaWVyXCIsIHZhbHVlOiAkJFskMC0xXSB9fSk7IHl5LmFzdC51bnNoaWZ0KCk7IHJldHVybiB5eS5hc3QueWllbGQoKVxuYnJlYWs7XG5jYXNlIDU6XG5icmVhaztcbmNhc2UgNjpcbmJyZWFrO1xuY2FzZSA3Onl5LmFzdC5zZXQoeyBvcGVyYXRpb246IFwibWVtYmVyXCIgfSk7IHl5LmFzdC5wdXNoKClcbmJyZWFrO1xuY2FzZSA4Onl5LmFzdC5zZXQoeyBvcGVyYXRpb246IFwic3Vic2NyaXB0XCIgfSk7IHl5LmFzdC5wdXNoKCkgXG5icmVhaztcbmNhc2UgOTp5eS5hc3Quc2V0KHsgc2NvcGU6IFwiY2hpbGRcIiB9KVxuYnJlYWs7XG5jYXNlIDEwOnl5LmFzdC5zZXQoeyBzY29wZTogXCJkZXNjZW5kYW50XCIgfSlcbmJyZWFrO1xuY2FzZSAxMTpcbmJyZWFrO1xuY2FzZSAxMjp5eS5hc3Quc2V0KHsgc2NvcGU6IFwiY2hpbGRcIiwgb3BlcmF0aW9uOiBcIm1lbWJlclwiIH0pXG5icmVhaztcbmNhc2UgMTM6XG5icmVhaztcbmNhc2UgMTQ6eXkuYXN0LnNldCh7IGV4cHJlc3Npb246IHsgdHlwZTogXCJ3aWxkY2FyZFwiLCB2YWx1ZTogJCRbJDBdIH0gfSlcbmJyZWFrO1xuY2FzZSAxNTp5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWU6ICQkWyQwXSB9IH0pXG5icmVhaztcbmNhc2UgMTY6eXkuYXN0LnNldCh7IGV4cHJlc3Npb246IHsgdHlwZTogXCJzY3JpcHRfZXhwcmVzc2lvblwiLCB2YWx1ZTogJCRbJDBdIH0gfSlcbmJyZWFrO1xuY2FzZSAxNzp5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcIm51bWVyaWNfbGl0ZXJhbFwiLCB2YWx1ZTogcGFyc2VJbnQoJCRbJDBdKSB9IH0pXG5icmVhaztcbmNhc2UgMTg6XG5icmVhaztcbmNhc2UgMTk6eXkuYXN0LnNldCh7IHNjb3BlOiBcImNoaWxkXCIgfSlcbmJyZWFrO1xuY2FzZSAyMDp5eS5hc3Quc2V0KHsgc2NvcGU6IFwiZGVzY2VuZGFudFwiIH0pXG5icmVhaztcbmNhc2UgMjE6XG5icmVhaztcbmNhc2UgMjI6XG5icmVhaztcbmNhc2UgMjM6XG5icmVhaztcbmNhc2UgMjQ6JCRbJDBdLmxlbmd0aCA+IDE/IHl5LmFzdC5zZXQoeyBleHByZXNzaW9uOiB7IHR5cGU6IFwidW5pb25cIiwgdmFsdWU6ICQkWyQwXSB9IH0pIDogdGhpcy4kID0gJCRbJDBdXG5icmVhaztcbmNhc2UgMjU6dGhpcy4kID0gWyQkWyQwXV1cbmJyZWFrO1xuY2FzZSAyNjp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKVxuYnJlYWs7XG5jYXNlIDI3OnRoaXMuJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcIm51bWVyaWNfbGl0ZXJhbFwiLCB2YWx1ZTogcGFyc2VJbnQoJCRbJDBdKSB9IH07IHl5LmFzdC5zZXQodGhpcy4kKVxuYnJlYWs7XG5jYXNlIDI4OnRoaXMuJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInN0cmluZ19saXRlcmFsXCIsIHZhbHVlOiAkJFskMF0gfSB9OyB5eS5hc3Quc2V0KHRoaXMuJClcbmJyZWFrO1xuY2FzZSAyOTp0aGlzLiQgPSB7IGV4cHJlc3Npb246IHsgdHlwZTogXCJzbGljZVwiLCB2YWx1ZTogJCRbJDBdIH0gfTsgeXkuYXN0LnNldCh0aGlzLiQpXG5icmVhaztcbmNhc2UgMzA6dGhpcy4kID0geyBleHByZXNzaW9uOiB7IHR5cGU6IFwid2lsZGNhcmRcIiwgdmFsdWU6ICQkWyQwXSB9IH07IHl5LmFzdC5zZXQodGhpcy4kKVxuYnJlYWs7XG5jYXNlIDMxOnRoaXMuJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInNjcmlwdF9leHByZXNzaW9uXCIsIHZhbHVlOiAkJFskMF0gfSB9OyB5eS5hc3Quc2V0KHRoaXMuJClcbmJyZWFrO1xuY2FzZSAzMjp0aGlzLiQgPSB7IGV4cHJlc3Npb246IHsgdHlwZTogXCJmaWx0ZXJfZXhwcmVzc2lvblwiLCB2YWx1ZTogJCRbJDBdIH0gfTsgeXkuYXN0LnNldCh0aGlzLiQpXG5icmVhaztcbmNhc2UgMzM6dGhpcy4kID0gJCRbJDBdXG5icmVhaztcbmNhc2UgMzQ6dGhpcy4kID0gJCRbJDBdXG5icmVhaztcbn1cbn0sXG50YWJsZTogW3szOjEsNDpbMSwyXSw2OjMsMTM6NCwxNTpbMSw1XSwxNjpbMSw2XSwxNzpbMSw3XSwxODpbMSw4XSwxOTpbMSw5XX0sezE6WzNdfSx7MTpbMiwxXSw1OjEwLDc6MTEsODoxMiw5OjEzLDEwOjE0LDExOjE1LDEyOlsxLDE4XSwxNDpbMSwxOV0sMjA6MTYsMjE6MTcsMjI6WzEsMjBdfSx7MTpbMiwzXSw1OjIxLDc6MTEsODoxMiw5OjEzLDEwOjE0LDExOjE1LDEyOlsxLDE4XSwxNDpbMSwxOV0sMjA6MTYsMjE6MTcsMjI6WzEsMjBdfSx7MTpbMiwxMl0sMTI6WzIsMTJdLDE0OlsyLDEyXSwyMjpbMiwxMl19LHsxOlsyLDE0XSwxMjpbMiwxNF0sMTQ6WzIsMTRdLDIyOlsyLDE0XX0sezE6WzIsMTVdLDEyOlsyLDE1XSwxNDpbMiwxNV0sMjI6WzIsMTVdfSx7MTpbMiwxNl0sMTI6WzIsMTZdLDE0OlsyLDE2XSwyMjpbMiwxNl19LHsxOlsyLDE3XSwxMjpbMiwxN10sMTQ6WzIsMTddLDIyOlsyLDE3XX0sezE6WzIsMThdLDEyOlsyLDE4XSwxNDpbMiwxOF0sMjI6WzIsMThdfSx7MTpbMiwyXSw3OjIyLDg6MTIsOToxMywxMDoxNCwxMToxNSwxMjpbMSwxOF0sMTQ6WzEsMTldLDIwOjE2LDIxOjE3LDIyOlsxLDIwXX0sezE6WzIsNV0sMTI6WzIsNV0sMTQ6WzIsNV0sMjI6WzIsNV19LHsxOlsyLDddLDEyOlsyLDddLDE0OlsyLDddLDIyOlsyLDddfSx7MTpbMiw4XSwxMjpbMiw4XSwxNDpbMiw4XSwyMjpbMiw4XX0sezE6WzIsOV0sMTI6WzIsOV0sMTQ6WzIsOV0sMjI6WzIsOV19LHsxOlsyLDEwXSwxMjpbMiwxMF0sMTQ6WzIsMTBdLDIyOlsyLDEwXX0sezE6WzIsMTldLDEyOlsyLDE5XSwxNDpbMiwxOV0sMjI6WzIsMTldfSx7MTpbMiwyMF0sMTI6WzIsMjBdLDE0OlsyLDIwXSwyMjpbMiwyMF19LHsxMzoyMywxNTpbMSw1XSwxNjpbMSw2XSwxNzpbMSw3XSwxODpbMSw4XSwxOTpbMSw5XX0sezEzOjI0LDE1OlsxLDVdLDE2OlsxLDZdLDE3OlsxLDddLDE4OlsxLDhdLDE5OlsxLDldLDIyOlsxLDI1XX0sezE1OlsxLDI5XSwxNzpbMSwzMF0sMTg6WzEsMzNdLDIzOjI2LDI1OjI3LDI2OjI4LDI3OjMyLDI5OjM0LDMwOlsxLDM1XSwzMTpbMSwzMV0sMzI6WzEsMzZdLDMzOlsxLDM3XX0sezE6WzIsNF0sNzoyMiw4OjEyLDk6MTMsMTA6MTQsMTE6MTUsMTI6WzEsMThdLDE0OlsxLDE5XSwyMDoxNiwyMToxNywyMjpbMSwyMF19LHsxOlsyLDZdLDEyOlsyLDZdLDE0OlsyLDZdLDIyOlsyLDZdfSx7MTpbMiwxMV0sMTI6WzIsMTFdLDE0OlsyLDExXSwyMjpbMiwxMV19LHsxOlsyLDEzXSwxMjpbMiwxM10sMTQ6WzIsMTNdLDIyOlsyLDEzXX0sezE1OlsxLDI5XSwxNzpbMSwzMF0sMTg6WzEsMzNdLDIzOjM4LDI1OjI3LDI2OjI4LDI3OjMyLDI5OjM0LDMwOlsxLDM1XSwzMTpbMSwzMV0sMzI6WzEsMzZdLDMzOlsxLDM3XX0sezI0OlsxLDM5XX0sezI0OlsyLDIzXX0sezI0OlsyLDI0XSwyODpbMSw0MF19LHsyNDpbMiwzMF19LHsyNDpbMiwzMV19LHsyNDpbMiwzMl19LHsyNDpbMiwyNV0sMjg6WzIsMjVdfSx7MjQ6WzIsMjddLDI4OlsyLDI3XX0sezI0OlsyLDI4XSwyODpbMiwyOF19LHsyNDpbMiwyOV0sMjg6WzIsMjldfSx7MjQ6WzIsMzNdLDI4OlsyLDMzXX0sezI0OlsyLDM0XSwyODpbMiwzNF19LHsyNDpbMSw0MV19LHsxOlsyLDIxXSwxMjpbMiwyMV0sMTQ6WzIsMjFdLDIyOlsyLDIxXX0sezE4OlsxLDMzXSwyNzo0MiwyOTozNCwzMDpbMSwzNV0sMzI6WzEsMzZdLDMzOlsxLDM3XX0sezE6WzIsMjJdLDEyOlsyLDIyXSwxNDpbMiwyMl0sMjI6WzIsMjJdfSx7MjQ6WzIsMjZdLDI4OlsyLDI2XX1dLFxuZGVmYXVsdEFjdGlvbnM6IHsyNzpbMiwyM10sMjk6WzIsMzBdLDMwOlsyLDMxXSwzMTpbMiwzMl19LFxucGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICBpZiAoaGFzaC5yZWNvdmVyYWJsZSkge1xuICAgICAgICB0aGlzLnRyYWNlKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7XG4gICAgfVxufSxcbnBhcnNlOiBmdW5jdGlvbiBwYXJzZShpbnB1dCkge1xuICAgIHZhciBzZWxmID0gdGhpcywgc3RhY2sgPSBbMF0sIHZzdGFjayA9IFtudWxsXSwgbHN0YWNrID0gW10sIHRhYmxlID0gdGhpcy50YWJsZSwgeXl0ZXh0ID0gJycsIHl5bGluZW5vID0gMCwgeXlsZW5nID0gMCwgcmVjb3ZlcmluZyA9IDAsIFRFUlJPUiA9IDIsIEVPRiA9IDE7XG4gICAgdmFyIGFyZ3MgPSBsc3RhY2suc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpO1xuICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5O1xuICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyO1xuICAgIHRoaXMueXkucGFyc2VyID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRoaXMubGV4ZXIueXlsbG9jID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubGV4ZXIueXlsbG9jID0ge307XG4gICAgfVxuICAgIHZhciB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jO1xuICAgIGxzdGFjay5wdXNoKHl5bG9jKTtcbiAgICB2YXIgcmFuZ2VzID0gdGhpcy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4ZXIub3B0aW9ucy5yYW5nZXM7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdGhpcy55eS5wYXJzZUVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5wYXJzZUVycm9yO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7XG4gICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIgKiBuO1xuICAgICAgICB2c3RhY2subGVuZ3RoID0gdnN0YWNrLmxlbmd0aCAtIG47XG4gICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGV4KCkge1xuICAgICAgICB2YXIgdG9rZW47XG4gICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCBFT0Y7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHNlbGYuc3ltYm9sc19bdG9rZW5dIHx8IHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkge1xuICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTtcbiAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkge1xuICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSAnJztcbiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVybWluYWxzX1twXSAmJiBwID4gVEVSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCdcXCcnICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgJ1xcJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxleGVyLnNob3dQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnICsgKHl5bGluZW5vICsgMSkgKyAnOlxcbicgKyB0aGlzLmxleGVyLnNob3dQb3NpdGlvbigpICsgJ1xcbkV4cGVjdGluZyAnICsgZXhwZWN0ZWQuam9pbignLCAnKSArICcsIGdvdCBcXCcnICsgKHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyAnXFwnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnICsgKHl5bGluZW5vICsgMSkgKyAnOiBVbmV4cGVjdGVkICcgKyAoc3ltYm9sID09IEVPRiA/ICdlbmQgb2YgaW5wdXQnIDogJ1xcJycgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICdcXCcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLFxuICAgICAgICAgICAgICAgICAgICBsb2M6IHl5bG9jLFxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiAnICsgc3RhdGUgKyAnLCB0b2tlbjogJyArIHN5bWJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhY3Rpb25bMF0pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgc3RhY2sucHVzaChzeW1ib2wpO1xuICAgICAgICAgICAgdnN0YWNrLnB1c2godGhpcy5sZXhlci55eXRleHQpO1xuICAgICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5sZXhlci55eWxsb2MpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChhY3Rpb25bMV0pO1xuICAgICAgICAgICAgc3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICB5eWxlbmcgPSB0aGlzLmxleGVyLnl5bGVuZztcbiAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDtcbiAgICAgICAgICAgICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXlsaW5lbm87XG4gICAgICAgICAgICAgICAgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYztcbiAgICAgICAgICAgICAgICBpZiAocmVjb3ZlcmluZyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3ZlcmluZy0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sID0gcHJlRXJyb3JTeW1ib2w7XG4gICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGxlbiA9IHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMV07XG4gICAgICAgICAgICB5eXZhbC4kID0gdnN0YWNrW3ZzdGFjay5sZW5ndGggLSBsZW5dO1xuICAgICAgICAgICAgeXl2YWwuXyQgPSB7XG4gICAgICAgICAgICAgICAgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLFxuICAgICAgICAgICAgICAgIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2xpbmUsXG4gICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwgMSldLmZpcnN0X2NvbHVtbixcbiAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB5eXZhbC5fJC5yYW5nZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5yYW5nZVswXSxcbiAgICAgICAgICAgICAgICAgICAgbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5yYW5nZVsxXVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByID0gdGhpcy5wZXJmb3JtQWN0aW9uLmFwcGx5KHl5dmFsLCBbXG4gICAgICAgICAgICAgICAgeXl0ZXh0LFxuICAgICAgICAgICAgICAgIHl5bGVuZyxcbiAgICAgICAgICAgICAgICB5eWxpbmVubyxcbiAgICAgICAgICAgICAgICB0aGlzLnl5LFxuICAgICAgICAgICAgICAgIGFjdGlvblsxXSxcbiAgICAgICAgICAgICAgICB2c3RhY2ssXG4gICAgICAgICAgICAgICAgbHN0YWNrXG4gICAgICAgICAgICBdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLCAtMSAqIGxlbiAqIDIpO1xuICAgICAgICAgICAgICAgIHZzdGFjayA9IHZzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7XG4gICAgICAgICAgICAgICAgbHN0YWNrID0gbHN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVswXSk7XG4gICAgICAgICAgICB2c3RhY2sucHVzaCh5eXZhbC4kKTtcbiAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTtcbiAgICAgICAgICAgIG5ld1N0YXRlID0gdGFibGVbc3RhY2tbc3RhY2subGVuZ3RoIC0gMl1dW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3U3RhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufX07XG52YXIgX2FzdCA9IHtcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9ub2RlcyA9IFtdO1xuICAgIHRoaXMuX25vZGUgPSB7fTtcbiAgICB0aGlzLl9zdGFzaCA9IFtdO1xuICB9LFxuXG4gIHNldDogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICBmb3IgKHZhciBrIGluIHByb3BzKSB0aGlzLl9ub2RlW2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHRoaXMuX25vZGU7XG4gIH0sXG5cbiAgbm9kZTogZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHRoaXMuX25vZGUgPSBvYmo7XG4gICAgcmV0dXJuIHRoaXMuX25vZGU7XG4gIH0sXG5cbiAgcHVzaDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbm9kZXMucHVzaCh0aGlzLl9ub2RlKTtcbiAgICB0aGlzLl9ub2RlID0ge307XG4gIH0sXG5cbiAgdW5zaGlmdDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbm9kZXMudW5zaGlmdCh0aGlzLl9ub2RlKTtcbiAgICB0aGlzLl9ub2RlID0ge307XG4gIH0sXG5cbiAgeWllbGQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfbm9kZXMgPSB0aGlzLl9ub2RlcztcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICByZXR1cm4gX25vZGVzO1xuICB9XG59O1xuLyogZ2VuZXJhdGVkIGJ5IGppc29uLWxleCAwLjIuMSAqL1xudmFyIGxleGVyID0gKGZ1bmN0aW9uKCl7XG52YXIgbGV4ZXIgPSB7XG5cbkVPRjoxLFxuXG5wYXJzZUVycm9yOmZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikge1xuICAgICAgICAgICAgdGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihzdHIsIGhhc2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyByZXNldHMgdGhlIGxleGVyLCBzZXRzIG5ldyBpbnB1dFxuc2V0SW5wdXQ6ZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX21vcmUgPSB0aGlzLl9iYWNrdHJhY2sgPSB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy55eWxpbmVubyA9IHRoaXMueXlsZW5nID0gMDtcbiAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTtcbiAgICAgICAgdGhpcy55eWxsb2MgPSB7XG4gICAgICAgICAgICBmaXJzdF9saW5lOiAxLFxuICAgICAgICAgICAgZmlyc3RfY29sdW1uOiAwLFxuICAgICAgICAgICAgbGFzdF9saW5lOiAxLFxuICAgICAgICAgICAgbGFzdF9jb2x1bW46IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4vLyBjb25zdW1lcyBhbmQgcmV0dXJucyBvbmUgY2hhciBmcm9tIHRoZSBpbnB1dFxuaW5wdXQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2ggPSB0aGlzLl9pbnB1dFswXTtcbiAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7XG4gICAgICAgIHRoaXMueXlsZW5nKys7XG4gICAgICAgIHRoaXMub2Zmc2V0Kys7XG4gICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7XG4gICAgICAgIHRoaXMubWF0Y2hlZCArPSBjaDtcbiAgICAgICAgdmFyIGxpbmVzID0gY2gubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsaW5lbm8rKztcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfbGluZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy55eWxsb2MubGFzdF9jb2x1bW4rKztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgdGhpcy55eWxsb2MucmFuZ2VbMV0rKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UoMSk7XG4gICAgICAgIHJldHVybiBjaDtcbiAgICB9LFxuXG4vLyB1bnNoaWZ0cyBvbmUgY2hhciAob3IgYSBzdHJpbmcpIGludG8gdGhlIGlucHV0XG51bnB1dDpmdW5jdGlvbiAoY2gpIHtcbiAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDtcbiAgICAgICAgdmFyIGxpbmVzID0gY2guc3BsaXQoLyg/Olxcclxcbj98XFxuKS9nKTtcblxuICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7XG4gICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aCAtIGxlbiAtIDEpO1xuICAgICAgICAvL3RoaXMueXlsZW5nIC09IGxlbjtcbiAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuO1xuICAgICAgICB2YXIgb2xkTGluZXMgPSB0aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLm1hdGNoLnN1YnN0cigwLCB0aGlzLm1hdGNoLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAobGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy55eWxpbmVubyAtPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7XG5cbiAgICAgICAgdGhpcy55eWxsb2MgPSB7XG4gICAgICAgICAgICBmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID9cbiAgICAgICAgICAgICAgICAobGluZXMubGVuZ3RoID09PSBvbGRMaW5lcy5sZW5ndGggPyB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gOiAwKVxuICAgICAgICAgICAgICAgICArIG9sZExpbmVzW29sZExpbmVzLmxlbmd0aCAtIGxpbmVzLmxlbmd0aF0ubGVuZ3RoIC0gbGluZXNbMF0ubGVuZ3RoIDpcbiAgICAgICAgICAgICAgdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3JbMF0sIHJbMF0gKyB0aGlzLnl5bGVuZyAtIGxlbl07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55eWxlbmcgPSB0aGlzLnl5dGV4dC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBjYWNoZXMgbWF0Y2hlZCB0ZXh0IGFuZCBhcHBlbmRzIGl0IG9uIG5leHQgYWN0aW9uXG5tb3JlOmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbW9yZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbi8vIFdoZW4gY2FsbGVkIGZyb20gYWN0aW9uLCBzaWduYWxzIHRoZSBsZXhlciB0aGF0IHRoaXMgcnVsZSBmYWlscyB0byBtYXRjaCB0aGUgaW5wdXQsIHNvIHRoZSBuZXh0IG1hdGNoaW5nIHJ1bGUgKHJlZ2V4KSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG5yZWplY3Q6ZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgdGhpcy5fYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnICsgKHRoaXMueXlsaW5lbm8gKyAxKSArICcuIFlvdSBjYW4gb25seSBpbnZva2UgcmVqZWN0KCkgaW4gdGhlIGxleGVyIHdoZW4gdGhlIGxleGVyIGlzIG9mIHRoZSBiYWNrdHJhY2tpbmcgcGVyc3Vhc2lvbiAob3B0aW9ucy5iYWNrdHJhY2tfbGV4ZXIgPSB0cnVlKS5cXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdG9rZW46IG51bGwsXG4gICAgICAgICAgICAgICAgbGluZTogdGhpcy55eWxpbmVub1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4vLyByZXRhaW4gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBtYXRjaFxubGVzczpmdW5jdGlvbiAobikge1xuICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2UobikpO1xuICAgIH0sXG5cbi8vIGRpc3BsYXlzIGFscmVhZHkgbWF0Y2hlZCBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnBhc3RJbnB1dDpmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gKHBhc3QubGVuZ3RoID4gMjAgPyAnLi4uJzonJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB1cGNvbWluZyBpbnB1dCwgaS5lLiBmb3IgZXJyb3IgbWVzc2FnZXNcbnVwY29taW5nSW5wdXQ6ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMubWF0Y2g7XG4gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMC1uZXh0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSArIChuZXh0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykpLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICB9LFxuXG4vLyBkaXNwbGF5cyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIHdoZXJlIHRoZSBsZXhpbmcgZXJyb3Igb2NjdXJyZWQsIGkuZS4gZm9yIGVycm9yIG1lc3NhZ2VzXG5zaG93UG9zaXRpb246ZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTtcbiAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oXCItXCIpO1xuICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyBcIlxcblwiICsgYyArIFwiXlwiO1xuICAgIH0sXG5cbi8vIHRlc3QgdGhlIGxleGVkIHRva2VuOiByZXR1cm4gRkFMU0Ugd2hlbiBub3QgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0b2tlblxudGVzdF9tYXRjaDpmdW5jdGlvbiAobWF0Y2gsIGluZGV4ZWRfcnVsZSkge1xuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIGJhY2t1cDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgLy8gc2F2ZSBjb250ZXh0XG4gICAgICAgICAgICBiYWNrdXAgPSB7XG4gICAgICAgICAgICAgICAgeXlsaW5lbm86IHRoaXMueXlsaW5lbm8sXG4gICAgICAgICAgICAgICAgeXlsbG9jOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy5sYXN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHl5dGV4dDogdGhpcy55eXRleHQsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICAgICAgICAgICAgbWF0Y2hlczogdGhpcy5tYXRjaGVzLFxuICAgICAgICAgICAgICAgIG1hdGNoZWQ6IHRoaXMubWF0Y2hlZCxcbiAgICAgICAgICAgICAgICB5eWxlbmc6IHRoaXMueXlsZW5nLFxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgX21vcmU6IHRoaXMuX21vcmUsXG4gICAgICAgICAgICAgICAgX2lucHV0OiB0aGlzLl9pbnB1dCxcbiAgICAgICAgICAgICAgICB5eTogdGhpcy55eSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25TdGFjazogdGhpcy5jb25kaXRpb25TdGFjay5zbGljZSgwKSxcbiAgICAgICAgICAgICAgICBkb25lOiB0aGlzLmRvbmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgICAgIGJhY2t1cC55eWxsb2MucmFuZ2UgPSB0aGlzLnl5bGxvYy5yYW5nZS5zbGljZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueXlsbG9jID0ge1xuICAgICAgICAgICAgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLFxuICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sXG4gICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCAtIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLm1hdGNoKC9cXHI/XFxuPy8pWzBdLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoO1xuICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9iYWNrdHJhY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICB0aGlzLm1hdGNoZWQgKz0gbWF0Y2hbMF07XG4gICAgICAgIHRva2VuID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwodGhpcywgdGhpcy55eSwgdGhpcywgaW5kZXhlZF9ydWxlLCB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pO1xuICAgICAgICBpZiAodGhpcy5kb25lICYmIHRoaXMuX2lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9iYWNrdHJhY2spIHtcbiAgICAgICAgICAgIC8vIHJlY292ZXIgY29udGV4dFxuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBiYWNrdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tdID0gYmFja3VwW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgdGhlIG5leHQgcnVsZSBzaG91bGQgYmUgdGVzdGVkIGluc3RlYWQuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbi8vIHJldHVybiBuZXh0IG1hdGNoIGluIGlucHV0XG5uZXh0OmZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG9rZW4sXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIHRlbXBNYXRjaCxcbiAgICAgICAgICAgIGluZGV4O1xuICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHtcbiAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTtcbiAgICAgICAgICAgIGlmICh0ZW1wTWF0Y2ggJiYgKCFtYXRjaCB8fCB0ZW1wTWF0Y2hbMF0ubGVuZ3RoID4gbWF0Y2hbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2t0cmFja19sZXhlcikge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudGVzdF9tYXRjaCh0ZW1wTWF0Y2gsIHJ1bGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JhY2t0cmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBydWxlIGFjdGlvbiBjYWxsZWQgcmVqZWN0KCkgaW1wbHlpbmcgYSBydWxlIE1JU21hdGNoLlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnRlc3RfbWF0Y2gobWF0Y2gsIHJ1bGVzW2luZGV4XSk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZTogdGhpcyBpcyBhIGxleGVyIHJ1bGUgd2hpY2ggY29uc3VtZXMgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYSB0b2tlbiAoZS5nLiB3aGl0ZXNwYWNlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXFxuJyArIHRoaXMuc2hvd1Bvc2l0aW9uKCksIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgICAgIHRva2VuOiBudWxsLFxuICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMueXlsaW5lbm9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIG5leHQgbWF0Y2ggdGhhdCBoYXMgYSB0b2tlblxubGV4OmZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV4KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhY3RpdmF0ZXMgYSBuZXcgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIChwdXNoZXMgdGhlIG5ldyBsZXhlciBjb25kaXRpb24gc3RhdGUgb250byB0aGUgY29uZGl0aW9uIHN0YWNrKVxuYmVnaW46ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHBvcCB0aGUgcHJldmlvdXNseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlIG9mZiB0aGUgY29uZGl0aW9uIHN0YWNrXG5wb3BTdGF0ZTpmdW5jdGlvbiBwb3BTdGF0ZSgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFja1swXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vIHByb2R1Y2UgdGhlIGxleGVyIHJ1bGUgc2V0IHdoaWNoIGlzIGFjdGl2ZSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgbGV4ZXIgY29uZGl0aW9uIHN0YXRlXG5fY3VycmVudFJ1bGVzOmZ1bmN0aW9uIF9jdXJyZW50UnVsZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAmJiB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbXCJJTklUSUFMXCJdLnJ1bGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuLy8gcmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxleGVyIGNvbmRpdGlvbiBzdGF0ZTsgd2hlbiBhbiBpbmRleCBhcmd1bWVudCBpcyBwcm92aWRlZCBpdCBwcm9kdWNlcyB0aGUgTi10aCBwcmV2aW91cyBjb25kaXRpb24gc3RhdGUsIGlmIGF2YWlsYWJsZVxudG9wU3RhdGU6ZnVuY3Rpb24gdG9wU3RhdGUobikge1xuICAgICAgICBuID0gdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxIC0gTWF0aC5hYnMobiB8fCAwKTtcbiAgICAgICAgaWYgKG4gPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbbl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJTklUSUFMXCI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4vLyBhbGlhcyBmb3IgYmVnaW4oY29uZGl0aW9uKVxucHVzaFN0YXRlOmZ1bmN0aW9uIHB1c2hTdGF0ZShjb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pO1xuICAgIH0sXG5cbi8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHN0YXRlcyBjdXJyZW50bHkgb24gdGhlIHN0YWNrXG5zdGF0ZVN0YWNrU2l6ZTpmdW5jdGlvbiBzdGF0ZVN0YWNrU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoO1xuICAgIH0sXG5vcHRpb25zOiB7fSxcbnBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eSx5eV8sJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucyxZWV9TVEFSVFxuLyoqLykge1xuXG52YXIgWVlTVEFURT1ZWV9TVEFSVDtcbnN3aXRjaCgkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zKSB7XG5jYXNlIDA6cmV0dXJuIDRcbmJyZWFrO1xuY2FzZSAxOnJldHVybiAxNFxuYnJlYWs7XG5jYXNlIDI6cmV0dXJuIDEyXG5icmVhaztcbmNhc2UgMzpyZXR1cm4gMTVcbmJyZWFrO1xuY2FzZSA0OnJldHVybiAxNlxuYnJlYWs7XG5jYXNlIDU6cmV0dXJuIDIyXG5icmVhaztcbmNhc2UgNjpyZXR1cm4gMjRcbmJyZWFrO1xuY2FzZSA3OnJldHVybiAyOFxuYnJlYWs7XG5jYXNlIDg6cmV0dXJuIDMwXG5icmVhaztcbmNhc2UgOTpyZXR1cm4gMThcbmJyZWFrO1xuY2FzZSAxMDp5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIoMSx5eV8ueXlsZW5nLTIpOyByZXR1cm4gMzI7XG5icmVhaztcbmNhc2UgMTE6eXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDEseXlfLnl5bGVuZy0yKTsgcmV0dXJuIDMzO1xuYnJlYWs7XG5jYXNlIDEyOnJldHVybiAxN1xuYnJlYWs7XG5jYXNlIDEzOnJldHVybiAzMVxuYnJlYWs7XG59XG59LFxucnVsZXM6IFsvXig/OlxcJCkvLC9eKD86XFwuXFwuKS8sL14oPzpcXC4pLywvXig/OlxcKikvLC9eKD86W2EtekEtWl9dK1thLXpBLVowLTlfXSopLywvXig/OlxcWykvLC9eKD86XFxdKS8sL14oPzosKS8sL14oPzooKC0/KD86MHxbMS05XVswLTldKikpKT9cXDooKC0/KD86MHxbMS05XVswLTldKikpKT8oXFw6KCgtPyg/OjB8WzEtOV1bMC05XSopKSk/KT8pLywvXig/OigtPyg/OjB8WzEtOV1bMC05XSopKSkvLC9eKD86XCIoPzpcXFxcW1wiYmZucnQvXFxcXF18XFxcXHVbYS1mQS1GMC05XXs0fXxbXlwiXFxcXF0pKlwiKS8sL14oPzonKD86XFxcXFsnYmZucnQvXFxcXF18XFxcXHVbYS1mQS1GMC05XXs0fXxbXidcXFxcXSkqJykvLC9eKD86XFwoLis/XFwpKD89XFxdKSkvLC9eKD86XFw/XFwoLis/XFwpKD89XFxdKSkvXSxcbmNvbmRpdGlvbnM6IHtcIklOSVRJQUxcIjp7XCJydWxlc1wiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzXSxcImluY2x1c2l2ZVwiOnRydWV9fVxufTtcbnJldHVybiBsZXhlcjtcbn0pKCk7XG5wYXJzZXIubGV4ZXIgPSBsZXhlcjtcbmZ1bmN0aW9uIFBhcnNlciAoKSB7XG4gIHRoaXMueXkgPSB7fTtcbn1cblBhcnNlci5wcm90b3R5cGUgPSBwYXJzZXI7cGFyc2VyLlBhcnNlciA9IFBhcnNlcjtcbnJldHVybiBuZXcgUGFyc2VyO1xufSkoKTtcblxuXG5pZiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuZXhwb3J0cy5wYXJzZXIgPSBwYXJzZXI7XG5leHBvcnRzLlBhcnNlciA9IHBhcnNlci5QYXJzZXI7XG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcGFyc2VyLnBhcnNlLmFwcGx5KHBhcnNlciwgYXJndW1lbnRzKTsgfTtcbmV4cG9ydHMubWFpbiA9IGZ1bmN0aW9uIGNvbW1vbmpzTWFpbihhcmdzKSB7XG4gICAgaWYgKCFhcmdzWzFdKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVc2FnZTogJythcmdzWzBdKycgRklMRScpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHZhciBzb3VyY2UgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYyhyZXF1aXJlKCdwYXRoJykubm9ybWFsaXplKGFyZ3NbMV0pLCBcInV0ZjhcIik7XG4gICAgcmV0dXJuIGV4cG9ydHMucGFyc2VyLnBhcnNlKHNvdXJjZSk7XG59O1xuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIGV4cG9ydHMubWFpbihwcm9jZXNzLmFyZ3Yuc2xpY2UoMSkpO1xufVxufVxuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbn0se1wiX3Byb2Nlc3NcIjoxNCxcImZzXCI6MTIsXCJwYXRoXCI6MTN9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBpZGVudGlmaWVyOiBcIlthLXpBLVpfXStbYS16QS1aMC05X10qXCIsXG4gIGludGVnZXI6IFwiLT8oPzowfFsxLTldWzAtOV0qKVwiLFxuICBxcV9zdHJpbmc6IFwiXFxcIig/OlxcXFxcXFxcW1xcXCJiZm5ydC9cXFxcXFxcXF18XFxcXFxcXFx1W2EtZkEtRjAtOV17NH18W15cXFwiXFxcXFxcXFxdKSpcXFwiXCIsXG4gIHFfc3RyaW5nOiBcIicoPzpcXFxcXFxcXFtcXCdiZm5ydC9cXFxcXFxcXF18XFxcXFxcXFx1W2EtZkEtRjAtOV17NH18W15cXCdcXFxcXFxcXF0pKidcIlxufTtcblxufSx7fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgZGljdCA9IHJlcXVpcmUoJy4vZGljdCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBncmFtbWFyID0ge1xuXG4gICAgbGV4OiB7XG5cbiAgICAgICAgbWFjcm9zOiB7XG4gICAgICAgICAgICBlc2M6IFwiXFxcXFxcXFxcIixcbiAgICAgICAgICAgIGludDogZGljdC5pbnRlZ2VyXG4gICAgICAgIH0sXG5cbiAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgIFtcIlxcXFwkXCIsIFwicmV0dXJuICdET0xMQVInXCJdLFxuICAgICAgICAgICAgW1wiXFxcXC5cXFxcLlwiLCBcInJldHVybiAnRE9UX0RPVCdcIl0sXG4gICAgICAgICAgICBbXCJcXFxcLlwiLCBcInJldHVybiAnRE9UJ1wiXSxcbiAgICAgICAgICAgIFtcIlxcXFwqXCIsIFwicmV0dXJuICdTVEFSJ1wiXSxcbiAgICAgICAgICAgIFtkaWN0LmlkZW50aWZpZXIsIFwicmV0dXJuICdJREVOVElGSUVSJ1wiXSxcbiAgICAgICAgICAgIFtcIlxcXFxbXCIsIFwicmV0dXJuICdbJ1wiXSxcbiAgICAgICAgICAgIFtcIlxcXFxdXCIsIFwicmV0dXJuICddJ1wiXSxcbiAgICAgICAgICAgIFtcIixcIiwgXCJyZXR1cm4gJywnXCJdLFxuICAgICAgICAgICAgW1wiKHtpbnR9KT9cXFxcOih7aW50fSk/KFxcXFw6KHtpbnR9KT8pP1wiLCBcInJldHVybiAnQVJSQVlfU0xJQ0UnXCJdLFxuICAgICAgICAgICAgW1wie2ludH1cIiwgXCJyZXR1cm4gJ0lOVEVHRVInXCJdLFxuICAgICAgICAgICAgW2RpY3QucXFfc3RyaW5nLCBcInl5dGV4dCA9IHl5dGV4dC5zdWJzdHIoMSx5eWxlbmctMik7IHJldHVybiAnUVFfU1RSSU5HJztcIl0sXG4gICAgICAgICAgICBbZGljdC5xX3N0cmluZywgXCJ5eXRleHQgPSB5eXRleHQuc3Vic3RyKDEseXlsZW5nLTIpOyByZXR1cm4gJ1FfU1RSSU5HJztcIl0sXG4gICAgICAgICAgICBbXCJcXFxcKC4rP1xcXFwpKD89XFxcXF0pXCIsIFwicmV0dXJuICdTQ1JJUFRfRVhQUkVTU0lPTidcIl0sXG4gICAgICAgICAgICBbXCJcXFxcP1xcXFwoLis/XFxcXCkoPz1cXFxcXSlcIiwgXCJyZXR1cm4gJ0ZJTFRFUl9FWFBSRVNTSU9OJ1wiXVxuICAgICAgICBdXG4gICAgfSxcblxuICAgIHN0YXJ0OiBcIkpTT05fUEFUSFwiLFxuXG4gICAgYm5mOiB7XG5cbiAgICAgICAgSlNPTl9QQVRIOiBbXG4gICAgICAgICAgICAgICAgWyAnRE9MTEFSJywgICAgICAgICAgICAgICAgICd5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInJvb3RcIiwgdmFsdWU6ICQxIH0gfSk7IHl5LmFzdC51bnNoaWZ0KCk7IHJldHVybiB5eS5hc3QueWllbGQoKScgXSxcbiAgICAgICAgICAgICAgICBbICdET0xMQVIgUEFUSF9DT01QT05FTlRTJywgJ3l5LmFzdC5zZXQoeyBleHByZXNzaW9uOiB7IHR5cGU6IFwicm9vdFwiLCB2YWx1ZTogJDEgfSB9KTsgeXkuYXN0LnVuc2hpZnQoKTsgcmV0dXJuIHl5LmFzdC55aWVsZCgpJyBdLFxuICAgICAgICAgICAgICAgIFsgJ0xFQURJTkdfQ0hJTERfTUVNQkVSX0VYUFJFU1NJT04nLCAgICAgICAgICAgICAgICAgJ3l5LmFzdC51bnNoaWZ0KCk7IHJldHVybiB5eS5hc3QueWllbGQoKScgXSxcbiAgICAgICAgICAgICAgICBbICdMRUFESU5HX0NISUxEX01FTUJFUl9FWFBSRVNTSU9OIFBBVEhfQ09NUE9ORU5UUycsICd5eS5hc3Quc2V0KHsgb3BlcmF0aW9uOiBcIm1lbWJlclwiLCBzY29wZTogXCJjaGlsZFwiLCBleHByZXNzaW9uOiB7IHR5cGU6IFwiaWRlbnRpZmllclwiLCB2YWx1ZTogJDEgfX0pOyB5eS5hc3QudW5zaGlmdCgpOyByZXR1cm4geXkuYXN0LnlpZWxkKCknIF0gXSxcblxuICAgICAgICBQQVRIX0NPTVBPTkVOVFM6IFtcbiAgICAgICAgICAgICAgICBbICdQQVRIX0NPTVBPTkVOVCcsICAgICAgICAgICAgICAgICAnJyBdLFxuICAgICAgICAgICAgICAgIFsgJ1BBVEhfQ09NUE9ORU5UUyBQQVRIX0NPTVBPTkVOVCcsICcnIF0gXSxcblxuICAgICAgICBQQVRIX0NPTVBPTkVOVDogW1xuICAgICAgICAgICAgICAgIFsgJ01FTUJFUl9DT01QT05FTlQnLCAgICAneXkuYXN0LnNldCh7IG9wZXJhdGlvbjogXCJtZW1iZXJcIiB9KTsgeXkuYXN0LnB1c2goKScgXSxcbiAgICAgICAgICAgICAgICBbICdTVUJTQ1JJUFRfQ09NUE9ORU5UJywgJ3l5LmFzdC5zZXQoeyBvcGVyYXRpb246IFwic3Vic2NyaXB0XCIgfSk7IHl5LmFzdC5wdXNoKCkgJyBdIF0sXG5cbiAgICAgICAgTUVNQkVSX0NPTVBPTkVOVDogW1xuICAgICAgICAgICAgICAgIFsgJ0NISUxEX01FTUJFUl9DT01QT05FTlQnLCAgICAgICd5eS5hc3Quc2V0KHsgc2NvcGU6IFwiY2hpbGRcIiB9KScgXSxcbiAgICAgICAgICAgICAgICBbICdERVNDRU5EQU5UX01FTUJFUl9DT01QT05FTlQnLCAneXkuYXN0LnNldCh7IHNjb3BlOiBcImRlc2NlbmRhbnRcIiB9KScgXSBdLFxuXG4gICAgICAgIENISUxEX01FTUJFUl9DT01QT05FTlQ6IFtcbiAgICAgICAgICAgICAgICBbICdET1QgTUVNQkVSX0VYUFJFU1NJT04nLCAnJyBdIF0sXG5cbiAgICAgICAgTEVBRElOR19DSElMRF9NRU1CRVJfRVhQUkVTU0lPTjogW1xuICAgICAgICAgICAgICAgIFsgJ01FTUJFUl9FWFBSRVNTSU9OJywgJ3l5LmFzdC5zZXQoeyBzY29wZTogXCJjaGlsZFwiLCBvcGVyYXRpb246IFwibWVtYmVyXCIgfSknIF0gXSxcblxuICAgICAgICBERVNDRU5EQU5UX01FTUJFUl9DT01QT05FTlQ6IFtcbiAgICAgICAgICAgICAgICBbICdET1RfRE9UIE1FTUJFUl9FWFBSRVNTSU9OJywgJycgXSBdLFxuXG4gICAgICAgIE1FTUJFUl9FWFBSRVNTSU9OOiBbXG4gICAgICAgICAgICAgICAgWyAnU1RBUicsICAgICAgICAgICAgICAneXkuYXN0LnNldCh7IGV4cHJlc3Npb246IHsgdHlwZTogXCJ3aWxkY2FyZFwiLCB2YWx1ZTogJDEgfSB9KScgXSxcbiAgICAgICAgICAgICAgICBbICdJREVOVElGSUVSJywgICAgICAgICd5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWU6ICQxIH0gfSknIF0sXG4gICAgICAgICAgICAgICAgWyAnU0NSSVBUX0VYUFJFU1NJT04nLCAneXkuYXN0LnNldCh7IGV4cHJlc3Npb246IHsgdHlwZTogXCJzY3JpcHRfZXhwcmVzc2lvblwiLCB2YWx1ZTogJDEgfSB9KScgXSxcbiAgICAgICAgICAgICAgICBbICdJTlRFR0VSJywgICAgICAgICAgICd5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcIm51bWVyaWNfbGl0ZXJhbFwiLCB2YWx1ZTogcGFyc2VJbnQoJDEpIH0gfSknIF0sXG4gICAgICAgICAgICAgICAgWyAnRU5EJywgICAgICAgICAgICAgICAnJyBdIF0sXG5cbiAgICAgICAgU1VCU0NSSVBUX0NPTVBPTkVOVDogW1xuICAgICAgICAgICAgICAgIFsgJ0NISUxEX1NVQlNDUklQVF9DT01QT05FTlQnLCAgICAgICd5eS5hc3Quc2V0KHsgc2NvcGU6IFwiY2hpbGRcIiB9KScgXSxcbiAgICAgICAgICAgICAgICBbICdERVNDRU5EQU5UX1NVQlNDUklQVF9DT01QT05FTlQnLCAneXkuYXN0LnNldCh7IHNjb3BlOiBcImRlc2NlbmRhbnRcIiB9KScgXSBdLFxuXG4gICAgICAgIENISUxEX1NVQlNDUklQVF9DT01QT05FTlQ6IFtcbiAgICAgICAgICAgICAgICBbICdbIFNVQlNDUklQVCBdJywgJycgXSBdLFxuXG4gICAgICAgIERFU0NFTkRBTlRfU1VCU0NSSVBUX0NPTVBPTkVOVDogW1xuICAgICAgICAgICAgICAgIFsgJ0RPVF9ET1QgWyBTVUJTQ1JJUFQgXScsICcnIF0gXSxcblxuICAgICAgICBTVUJTQ1JJUFQ6IFtcbiAgICAgICAgICAgICAgICBbICdTVUJTQ1JJUFRfRVhQUkVTU0lPTicsICcnIF0sXG4gICAgICAgICAgICAgICAgWyAnU1VCU0NSSVBUX0VYUFJFU1NJT05fTElTVCcsICckMS5sZW5ndGggPiAxPyB5eS5hc3Quc2V0KHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInVuaW9uXCIsIHZhbHVlOiAkMSB9IH0pIDogJCQgPSAkMScgXSBdLFxuXG4gICAgICAgIFNVQlNDUklQVF9FWFBSRVNTSU9OX0xJU1Q6IFtcbiAgICAgICAgICAgICAgICBbICdTVUJTQ1JJUFRfRVhQUkVTU0lPTl9MSVNUQUJMRScsICckJCA9IFskMV0nXSxcbiAgICAgICAgICAgICAgICBbICdTVUJTQ1JJUFRfRVhQUkVTU0lPTl9MSVNUICwgU1VCU0NSSVBUX0VYUFJFU1NJT05fTElTVEFCTEUnLCAnJCQgPSAkMS5jb25jYXQoJDMpJyBdIF0sXG5cbiAgICAgICAgU1VCU0NSSVBUX0VYUFJFU1NJT05fTElTVEFCTEU6IFtcbiAgICAgICAgICAgICAgICBbICdJTlRFR0VSJywgICAgICAgICAgICckJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcIm51bWVyaWNfbGl0ZXJhbFwiLCB2YWx1ZTogcGFyc2VJbnQoJDEpIH0gfTsgeXkuYXN0LnNldCgkJCknIF0sXG4gICAgICAgICAgICAgICAgWyAnU1RSSU5HX0xJVEVSQUwnLCAgICAnJCQgPSB7IGV4cHJlc3Npb246IHsgdHlwZTogXCJzdHJpbmdfbGl0ZXJhbFwiLCB2YWx1ZTogJDEgfSB9OyB5eS5hc3Quc2V0KCQkKScgXSxcbiAgICAgICAgICAgICAgICBbICdBUlJBWV9TTElDRScsICAgICAgICckJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcInNsaWNlXCIsIHZhbHVlOiAkMSB9IH07IHl5LmFzdC5zZXQoJCQpJyBdIF0sXG5cbiAgICAgICAgU1VCU0NSSVBUX0VYUFJFU1NJT046IFtcbiAgICAgICAgICAgICAgICBbICdTVEFSJywgICAgICAgICAgICAgICckJCA9IHsgZXhwcmVzc2lvbjogeyB0eXBlOiBcIndpbGRjYXJkXCIsIHZhbHVlOiAkMSB9IH07IHl5LmFzdC5zZXQoJCQpJyBdLFxuICAgICAgICAgICAgICAgIFsgJ1NDUklQVF9FWFBSRVNTSU9OJywgJyQkID0geyBleHByZXNzaW9uOiB7IHR5cGU6IFwic2NyaXB0X2V4cHJlc3Npb25cIiwgdmFsdWU6ICQxIH0gfTsgeXkuYXN0LnNldCgkJCknIF0sXG4gICAgICAgICAgICAgICAgWyAnRklMVEVSX0VYUFJFU1NJT04nLCAnJCQgPSB7IGV4cHJlc3Npb246IHsgdHlwZTogXCJmaWx0ZXJfZXhwcmVzc2lvblwiLCB2YWx1ZTogJDEgfSB9OyB5eS5hc3Quc2V0KCQkKScgXSBdLFxuXG4gICAgICAgIFNUUklOR19MSVRFUkFMOiBbXG4gICAgICAgICAgICAgICAgWyAnUVFfU1RSSU5HJywgXCIkJCA9ICQxXCIgXSxcbiAgICAgICAgICAgICAgICBbICdRX1NUUklORycsICBcIiQkID0gJDFcIiBdIF1cbiAgICB9XG59O1xuaWYgKGZzLnJlYWRGaWxlU3luYykge1xuICBncmFtbWFyLm1vZHVsZUluY2x1ZGUgPSBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKFwiLi4vaW5jbHVkZS9tb2R1bGUuanNcIikpO1xuICBncmFtbWFyLmFjdGlvbkluY2x1ZGUgPSBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKFwiLi4vaW5jbHVkZS9hY3Rpb24uanNcIikpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdyYW1tYXI7XG5cbn0se1wiLi9kaWN0XCI6MixcImZzXCI6MTJ9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBhZXNwcmltID0gcmVxdWlyZSgnLi9hZXNwcmltJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG52YXIgX2V2YWx1YXRlID0gcmVxdWlyZSgnc3RhdGljLWV2YWwnKTtcbnZhciBfdW5pcSA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKS51bmlxO1xuXG52YXIgSGFuZGxlcnMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5IYW5kbGVycy5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnRyYXZlcnNlID0gdHJhdmVyc2VyKHRydWUpO1xuICB0aGlzLmRlc2NlbmQgPSB0cmF2ZXJzZXIoKTtcbn1cblxuSGFuZGxlcnMucHJvdG90eXBlLmtleXMgPSBPYmplY3Qua2V5cztcblxuSGFuZGxlcnMucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihjb21wb25lbnQpIHtcblxuICB2YXIga2V5ID0gWyBjb21wb25lbnQub3BlcmF0aW9uLCBjb21wb25lbnQuc2NvcGUsIGNvbXBvbmVudC5leHByZXNzaW9uLnR5cGUgXS5qb2luKCctJyk7XG4gIHZhciBtZXRob2QgPSB0aGlzLl9mbnNba2V5XTtcblxuICBpZiAoIW1ldGhvZCkgdGhyb3cgbmV3IEVycm9yKFwiY291bGRuJ3QgcmVzb2x2ZSBrZXk6IFwiICsga2V5KTtcbiAgcmV0dXJuIG1ldGhvZC5iaW5kKHRoaXMpO1xufTtcblxuSGFuZGxlcnMucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24oa2V5LCBoYW5kbGVyKSB7XG5cbiAgaWYgKCFoYW5kbGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHRoaXMuX2Zuc1trZXldID0gaGFuZGxlcjtcbn07XG5cbkhhbmRsZXJzLnByb3RvdHlwZS5fZm5zID0ge1xuXG4gICdtZW1iZXItY2hpbGQtaWRlbnRpZmllcic6IGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCkge1xuICAgIHZhciBrZXkgPSBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZTtcbiAgICB2YXIgdmFsdWUgPSBwYXJ0aWFsLnZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiBbIHsgdmFsdWU6IHZhbHVlW2tleV0sIHBhdGg6IHBhcnRpYWwucGF0aC5jb25jYXQoa2V5KSB9IF1cbiAgICB9XG4gIH0sXG5cbiAgJ21lbWJlci1kZXNjZW5kYW50LWlkZW50aWZpZXInOlxuICAgIF90cmF2ZXJzZShmdW5jdGlvbihrZXksIHZhbHVlLCByZWYpIHsgcmV0dXJuIGtleSA9PSByZWYgfSksXG5cbiAgJ3N1YnNjcmlwdC1jaGlsZC1udW1lcmljX2xpdGVyYWwnOlxuICAgIF9kZXNjZW5kKGZ1bmN0aW9uKGtleSwgdmFsdWUsIHJlZikgeyByZXR1cm4ga2V5ID09PSByZWYgfSksXG5cbiAgJ21lbWJlci1jaGlsZC1udW1lcmljX2xpdGVyYWwnOlxuICAgIF9kZXNjZW5kKGZ1bmN0aW9uKGtleSwgdmFsdWUsIHJlZikgeyByZXR1cm4gU3RyaW5nKGtleSkgPT09IFN0cmluZyhyZWYpIH0pLFxuXG4gICdzdWJzY3JpcHQtZGVzY2VuZGFudC1udW1lcmljX2xpdGVyYWwnOlxuICAgIF90cmF2ZXJzZShmdW5jdGlvbihrZXksIHZhbHVlLCByZWYpIHsgcmV0dXJuIGtleSA9PT0gcmVmIH0pLFxuXG4gICdtZW1iZXItY2hpbGQtd2lsZGNhcmQnOlxuICAgIF9kZXNjZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KSxcblxuICAnbWVtYmVyLWRlc2NlbmRhbnQtd2lsZGNhcmQnOlxuICAgIF90cmF2ZXJzZShmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSksXG5cbiAgJ3N1YnNjcmlwdC1kZXNjZW5kYW50LXdpbGRjYXJkJzpcbiAgICBfdHJhdmVyc2UoZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pLFxuXG4gICdzdWJzY3JpcHQtY2hpbGQtd2lsZGNhcmQnOlxuICAgIF9kZXNjZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KSxcblxuICAnc3Vic2NyaXB0LWNoaWxkLXNsaWNlJzogZnVuY3Rpb24oY29tcG9uZW50LCBwYXJ0aWFsKSB7XG4gICAgaWYgKGlzX2FycmF5KHBhcnRpYWwudmFsdWUpKSB7XG4gICAgICB2YXIgYXJncyA9IGNvbXBvbmVudC5leHByZXNzaW9uLnZhbHVlLnNwbGl0KCc6JykubWFwKF9wYXJzZV9udWxsYWJsZV9pbnQpO1xuICAgICAgdmFyIHZhbHVlcyA9IHBhcnRpYWwudmFsdWUubWFwKGZ1bmN0aW9uKHYsIGkpIHsgcmV0dXJuIHsgdmFsdWU6IHYsIHBhdGg6IHBhcnRpYWwucGF0aC5jb25jYXQoaSkgfSB9KTtcbiAgICAgIHJldHVybiBzbGljZS5hcHBseShudWxsLCBbdmFsdWVzXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfSxcblxuICAnc3Vic2NyaXB0LWNoaWxkLXVuaW9uJzogZnVuY3Rpb24oY29tcG9uZW50LCBwYXJ0aWFsKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgdmFyIF9jb21wb25lbnQgPSB7IG9wZXJhdGlvbjogJ3N1YnNjcmlwdCcsIHNjb3BlOiAnY2hpbGQnLCBleHByZXNzaW9uOiBjb21wb25lbnQuZXhwcmVzc2lvbiB9O1xuICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLnJlc29sdmUoX2NvbXBvbmVudCk7XG4gICAgICB2YXIgX3Jlc3VsdHMgPSBoYW5kbGVyKF9jb21wb25lbnQsIHBhcnRpYWwpO1xuICAgICAgaWYgKF9yZXN1bHRzKSB7XG4gICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChfcmVzdWx0cyk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMpO1xuICB9LFxuXG4gICdzdWJzY3JpcHQtZGVzY2VuZGFudC11bmlvbic6IGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCwgY291bnQpIHtcblxuICAgIHZhciBqcCA9IHJlcXVpcmUoJy4uJyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgbm9kZXMgPSBqcC5ub2RlcyhwYXJ0aWFsLCAnJC4uKicpLnNsaWNlKDEpO1xuXG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gY291bnQpIHJldHVybjtcbiAgICAgIGNvbXBvbmVudC5leHByZXNzaW9uLnZhbHVlLmZvckVhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50ID0geyBvcGVyYXRpb246ICdzdWJzY3JpcHQnLCBzY29wZTogJ2NoaWxkJywgZXhwcmVzc2lvbjogY29tcG9uZW50LmV4cHJlc3Npb24gfTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnJlc29sdmUoX2NvbXBvbmVudCk7XG4gICAgICAgIHZhciBfcmVzdWx0cyA9IGhhbmRsZXIoX2NvbXBvbmVudCwgbm9kZSk7XG4gICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChfcmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cyk7XG4gIH0sXG5cbiAgJ3N1YnNjcmlwdC1jaGlsZC1maWx0ZXJfZXhwcmVzc2lvbic6IGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCwgY291bnQpIHtcblxuICAgIC8vIHNsaWNlIG91dCB0aGUgZXhwcmVzc2lvbiBmcm9tID8oZXhwcmVzc2lvbilcbiAgICB2YXIgc3JjID0gY29tcG9uZW50LmV4cHJlc3Npb24udmFsdWUuc2xpY2UoMiwgLTEpO1xuICAgIHZhciBhc3QgPSBhZXNwcmltLnBhcnNlKHNyYykuYm9keVswXS5leHByZXNzaW9uO1xuXG4gICAgdmFyIHBhc3NhYmxlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV2YWx1YXRlKGFzdCwgeyAnQCc6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlc2NlbmQocGFydGlhbCwgbnVsbCwgcGFzc2FibGUsIGNvdW50KTtcblxuICB9LFxuXG4gICdzdWJzY3JpcHQtZGVzY2VuZGFudC1maWx0ZXJfZXhwcmVzc2lvbic6IGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCwgY291bnQpIHtcblxuICAgIC8vIHNsaWNlIG91dCB0aGUgZXhwcmVzc2lvbiBmcm9tID8oZXhwcmVzc2lvbilcbiAgICB2YXIgc3JjID0gY29tcG9uZW50LmV4cHJlc3Npb24udmFsdWUuc2xpY2UoMiwgLTEpO1xuICAgIHZhciBhc3QgPSBhZXNwcmltLnBhcnNlKHNyYykuYm9keVswXS5leHByZXNzaW9uO1xuXG4gICAgdmFyIHBhc3NhYmxlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV2YWx1YXRlKGFzdCwgeyAnQCc6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlKHBhcnRpYWwsIG51bGwsIHBhc3NhYmxlLCBjb3VudCk7XG4gIH0sXG5cbiAgJ3N1YnNjcmlwdC1jaGlsZC1zY3JpcHRfZXhwcmVzc2lvbic6IGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCkge1xuICAgIHZhciBleHAgPSBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgcmV0dXJuIGV2YWxfcmVjdXJzZShwYXJ0aWFsLCBleHAsICckW3t7dmFsdWV9fV0nKTtcbiAgfSxcblxuICAnbWVtYmVyLWNoaWxkLXNjcmlwdF9leHByZXNzaW9uJzogZnVuY3Rpb24oY29tcG9uZW50LCBwYXJ0aWFsKSB7XG4gICAgdmFyIGV4cCA9IGNvbXBvbmVudC5leHByZXNzaW9uLnZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICByZXR1cm4gZXZhbF9yZWN1cnNlKHBhcnRpYWwsIGV4cCwgJyQue3t2YWx1ZX19Jyk7XG4gIH0sXG5cbiAgJ21lbWJlci1kZXNjZW5kYW50LXNjcmlwdF9leHByZXNzaW9uJzogZnVuY3Rpb24oY29tcG9uZW50LCBwYXJ0aWFsKSB7XG4gICAgdmFyIGV4cCA9IGNvbXBvbmVudC5leHByZXNzaW9uLnZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICByZXR1cm4gZXZhbF9yZWN1cnNlKHBhcnRpYWwsIGV4cCwgJyQuLnZhbHVlJyk7XG4gIH1cbn07XG5cbkhhbmRsZXJzLnByb3RvdHlwZS5fZm5zWydzdWJzY3JpcHQtY2hpbGQtc3RyaW5nX2xpdGVyYWwnXSA9XG5cdEhhbmRsZXJzLnByb3RvdHlwZS5fZm5zWydtZW1iZXItY2hpbGQtaWRlbnRpZmllciddO1xuXG5IYW5kbGVycy5wcm90b3R5cGUuX2Zuc1snbWVtYmVyLWRlc2NlbmRhbnQtbnVtZXJpY19saXRlcmFsJ10gPVxuICAgIEhhbmRsZXJzLnByb3RvdHlwZS5fZm5zWydzdWJzY3JpcHQtZGVzY2VuZGFudC1zdHJpbmdfbGl0ZXJhbCddID1cbiAgICBIYW5kbGVycy5wcm90b3R5cGUuX2Zuc1snbWVtYmVyLWRlc2NlbmRhbnQtaWRlbnRpZmllciddO1xuXG5mdW5jdGlvbiBldmFsX3JlY3Vyc2UocGFydGlhbCwgc3JjLCB0ZW1wbGF0ZSkge1xuXG4gIHZhciBqcCA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbiAgdmFyIGFzdCA9IGFlc3ByaW0ucGFyc2Uoc3JjKS5ib2R5WzBdLmV4cHJlc3Npb247XG4gIHZhciB2YWx1ZSA9IGV2YWx1YXRlKGFzdCwgeyAnQCc6IHBhcnRpYWwudmFsdWUgfSk7XG4gIHZhciBwYXRoID0gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFx7XFxzKnZhbHVlXFxzKlxcfVxcfS9nLCB2YWx1ZSk7XG5cbiAgdmFyIHJlc3VsdHMgPSBqcC5ub2RlcyhwYXJ0aWFsLnZhbHVlLCBwYXRoKTtcbiAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uKHIpIHtcbiAgICByLnBhdGggPSBwYXJ0aWFsLnBhdGguY29uY2F0KHIucGF0aC5zbGljZSgxKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBpc19hcnJheSh2YWwpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKTtcbn1cblxuZnVuY3Rpb24gaXNfb2JqZWN0KHZhbCkge1xuICAvLyBpcyB0aGlzIGEgbm9uLWFycmF5LCBub24tbnVsbCBvYmplY3Q/XG4gIHJldHVybiB2YWwgJiYgISh2YWwgaW5zdGFuY2VvZiBBcnJheSkgJiYgdmFsIGluc3RhbmNlb2YgT2JqZWN0O1xufVxuXG5mdW5jdGlvbiB0cmF2ZXJzZXIocmVjdXJzZSkge1xuXG4gIHJldHVybiBmdW5jdGlvbihwYXJ0aWFsLCByZWYsIHBhc3NhYmxlLCBjb3VudCkge1xuXG4gICAgdmFyIHZhbHVlID0gcGFydGlhbC52YWx1ZTtcbiAgICB2YXIgcGF0aCA9IHBhcnRpYWwucGF0aDtcblxuICAgIHZhciByZXN1bHRzID0gW107XG5cbiAgICB2YXIgZGVzY2VuZCA9IGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG5cbiAgICAgIGlmIChpc19hcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+PSBjb3VudCkgeyByZXR1cm4gfVxuICAgICAgICAgIGlmIChwYXNzYWJsZShpbmRleCwgZWxlbWVudCwgcmVmKSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgcGF0aDogcGF0aC5jb25jYXQoaW5kZXgpLCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IGNvdW50KSB7IHJldHVybiB9XG4gICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgIGRlc2NlbmQoZWxlbWVudCwgcGF0aC5jb25jYXQoaW5kZXgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc19vYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMua2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IGNvdW50KSB7IHJldHVybiB9XG4gICAgICAgICAgaWYgKHBhc3NhYmxlKGssIHZhbHVlW2tdLCByZWYpKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyBwYXRoOiBwYXRoLmNvbmNhdChrKSwgdmFsdWU6IHZhbHVlW2tdIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gY291bnQpIHsgcmV0dXJuIH1cbiAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgZGVzY2VuZCh2YWx1ZVtrXSwgcGF0aC5jb25jYXQoaykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpO1xuICAgIGRlc2NlbmQodmFsdWUsIHBhdGgpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZXNjZW5kKHBhc3NhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb21wb25lbnQsIHBhcnRpYWwsIGNvdW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZGVzY2VuZChwYXJ0aWFsLCBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZSwgcGFzc2FibGUsIGNvdW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdHJhdmVyc2UocGFzc2FibGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBvbmVudCwgcGFydGlhbCwgY291bnQpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZShwYXJ0aWFsLCBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZSwgcGFzc2FibGUsIGNvdW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmFsdWF0ZSgpIHtcbiAgdHJ5IHsgcmV0dXJuIF9ldmFsdWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgY2F0Y2ggKGUpIHsgfVxufVxuXG5mdW5jdGlvbiB1bmlxdWUocmVzdWx0cykge1xuICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZCB9KVxuICByZXR1cm4gX3VuaXEoXG4gICAgcmVzdWx0cyxcbiAgICBmdW5jdGlvbihyKSB7IHJldHVybiByLnBhdGgubWFwKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIFN0cmluZyhjKS5yZXBsYWNlKCctJywgJy0tJykgfSkuam9pbignLScpIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gX3BhcnNlX251bGxhYmxlX2ludCh2YWwpIHtcbiAgdmFyIHN2YWwgPSBTdHJpbmcodmFsKTtcbiAgcmV0dXJuIHN2YWwubWF0Y2goL14tP1swLTldKyQvKSA/IHBhcnNlSW50KHN2YWwpIDogbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIYW5kbGVycztcblxufSx7XCIuLlwiOlwianNvbnBhdGhcIixcIi4vYWVzcHJpbVwiOlwiLi9hZXNwcmltXCIsXCIuL2luZGV4XCI6NSxcIi4vc2xpY2VcIjo3LFwic3RhdGljLWV2YWxcIjoxNSxcInVuZGVyc2NvcmVcIjoxMn1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIGRpY3QgPSByZXF1aXJlKCcuL2RpY3QnKTtcbnZhciBQYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xudmFyIEhhbmRsZXJzID0gcmVxdWlyZSgnLi9oYW5kbGVycycpO1xuXG52YXIgSlNPTlBhdGggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5KU09OUGF0aC5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgdGhpcy5oYW5kbGVycyA9IG5ldyBIYW5kbGVycygpO1xufTtcblxuSlNPTlBhdGgucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gIGFzc2VydC5vayhfaXNfc3RyaW5nKHN0cmluZyksIFwid2UgbmVlZCBhIHBhdGhcIik7XG4gIHJldHVybiB0aGlzLnBhcnNlci5wYXJzZShzdHJpbmcpO1xufTtcblxuSlNPTlBhdGgucHJvdG90eXBlLnBhcmVudCA9IGZ1bmN0aW9uKG9iaiwgc3RyaW5nKSB7XG5cbiAgYXNzZXJ0Lm9rKG9iaiBpbnN0YW5jZW9mIE9iamVjdCwgXCJvYmogbmVlZHMgdG8gYmUgYW4gb2JqZWN0XCIpO1xuICBhc3NlcnQub2soc3RyaW5nLCBcIndlIG5lZWQgYSBwYXRoXCIpO1xuXG4gIHZhciBub2RlID0gdGhpcy5ub2RlcyhvYmosIHN0cmluZylbMF07XG4gIHZhciBrZXkgPSBub2RlLnBhdGgucG9wKCk7IC8qIGpzaGludCB1bnVzZWQ6ZmFsc2UgKi9cbiAgcmV0dXJuIHRoaXMudmFsdWUob2JqLCBub2RlLnBhdGgpO1xufVxuXG5KU09OUGF0aC5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbihvYmosIHN0cmluZywgZm4pIHtcblxuICBhc3NlcnQub2sob2JqIGluc3RhbmNlb2YgT2JqZWN0LCBcIm9iaiBuZWVkcyB0byBiZSBhbiBvYmplY3RcIik7XG4gIGFzc2VydC5vayhzdHJpbmcsIFwid2UgbmVlZCBhIHBhdGhcIik7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgZm4sIFwiZnVuY3Rpb25cIiwgXCJmbiBuZWVkcyB0byBiZSBmdW5jdGlvblwiKVxuXG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMob2JqLCBzdHJpbmcpLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIC8vIHNvcnQgbm9kZXMgc28gd2UgYXBwbHkgZnJvbSB0aGUgYm90dG9tIHVwXG4gICAgcmV0dXJuIGIucGF0aC5sZW5ndGggLSBhLnBhdGgubGVuZ3RoO1xuICB9KTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIga2V5ID0gbm9kZS5wYXRoLnBvcCgpO1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnZhbHVlKG9iaiwgdGhpcy5zdHJpbmdpZnkobm9kZS5wYXRoKSk7XG4gICAgdmFyIHZhbCA9IG5vZGUudmFsdWUgPSBmbi5jYWxsKG9iaiwgcGFyZW50W2tleV0pO1xuICAgIHBhcmVudFtrZXldID0gdmFsO1xuICB9LCB0aGlzKTtcblxuICByZXR1cm4gbm9kZXM7XG59XG5cbkpTT05QYXRoLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uKG9iaiwgcGF0aCwgdmFsdWUpIHtcblxuICBhc3NlcnQub2sob2JqIGluc3RhbmNlb2YgT2JqZWN0LCBcIm9iaiBuZWVkcyB0byBiZSBhbiBvYmplY3RcIik7XG4gIGFzc2VydC5vayhwYXRoLCBcIndlIG5lZWQgYSBwYXRoXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZXMob2JqLCBwYXRoKS5zaGlmdCgpO1xuICAgIGlmICghbm9kZSkgcmV0dXJuIHRoaXMuX3ZpdmlmeShvYmosIHBhdGgsIHZhbHVlKTtcbiAgICB2YXIga2V5ID0gbm9kZS5wYXRoLnNsaWNlKC0xKS5zaGlmdCgpO1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudChvYmosIHRoaXMuc3RyaW5naWZ5KG5vZGUucGF0aCkpO1xuICAgIHBhcmVudFtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXMucXVlcnkob2JqLCB0aGlzLnN0cmluZ2lmeShwYXRoKSwgMSkuc2hpZnQoKTtcbn1cblxuSlNPTlBhdGgucHJvdG90eXBlLl92aXZpZnkgPSBmdW5jdGlvbihvYmosIHN0cmluZywgdmFsdWUpIHtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgYXNzZXJ0Lm9rKG9iaiBpbnN0YW5jZW9mIE9iamVjdCwgXCJvYmogbmVlZHMgdG8gYmUgYW4gb2JqZWN0XCIpO1xuICBhc3NlcnQub2soc3RyaW5nLCBcIndlIG5lZWQgYSBwYXRoXCIpO1xuXG4gIHZhciBwYXRoID0gdGhpcy5wYXJzZXIucGFyc2Uoc3RyaW5nKVxuICAgIC5tYXAoZnVuY3Rpb24oY29tcG9uZW50KSB7IHJldHVybiBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZSB9KTtcblxuICB2YXIgc2V0VmFsdWUgPSBmdW5jdGlvbihwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBrZXkgPSBwYXRoLnBvcCgpO1xuICAgIHZhciBub2RlID0gc2VsZi52YWx1ZShvYmosIHBhdGgpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgc2V0VmFsdWUocGF0aC5jb25jYXQoKSwgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyB7fSA6IFtdKTtcbiAgICAgIG5vZGUgPSBzZWxmLnZhbHVlKG9iaiwgcGF0aCk7XG4gICAgfVxuICAgIG5vZGVba2V5XSA9IHZhbHVlO1xuICB9XG4gIHNldFZhbHVlKHBhdGgsIHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMucXVlcnkob2JqLCBzdHJpbmcpWzBdO1xufVxuXG5KU09OUGF0aC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbihvYmosIHN0cmluZywgY291bnQpIHtcblxuICBhc3NlcnQub2sob2JqIGluc3RhbmNlb2YgT2JqZWN0LCBcIm9iaiBuZWVkcyB0byBiZSBhbiBvYmplY3RcIik7XG4gIGFzc2VydC5vayhfaXNfc3RyaW5nKHN0cmluZyksIFwid2UgbmVlZCBhIHBhdGhcIik7XG5cbiAgdmFyIHJlc3VsdHMgPSB0aGlzLm5vZGVzKG9iaiwgc3RyaW5nLCBjb3VudClcbiAgICAubWFwKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIHIudmFsdWUgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG5KU09OUGF0aC5wcm90b3R5cGUucGF0aHMgPSBmdW5jdGlvbihvYmosIHN0cmluZywgY291bnQpIHtcblxuICBhc3NlcnQub2sob2JqIGluc3RhbmNlb2YgT2JqZWN0LCBcIm9iaiBuZWVkcyB0byBiZSBhbiBvYmplY3RcIik7XG4gIGFzc2VydC5vayhzdHJpbmcsIFwid2UgbmVlZCBhIHBhdGhcIik7XG5cbiAgdmFyIHJlc3VsdHMgPSB0aGlzLm5vZGVzKG9iaiwgc3RyaW5nLCBjb3VudClcbiAgICAubWFwKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIHIucGF0aCB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn07XG5cbkpTT05QYXRoLnByb3RvdHlwZS5ub2RlcyA9IGZ1bmN0aW9uKG9iaiwgc3RyaW5nLCBjb3VudCkge1xuXG4gIGFzc2VydC5vayhvYmogaW5zdGFuY2VvZiBPYmplY3QsIFwib2JqIG5lZWRzIHRvIGJlIGFuIG9iamVjdFwiKTtcbiAgYXNzZXJ0Lm9rKHN0cmluZywgXCJ3ZSBuZWVkIGEgcGF0aFwiKTtcblxuICBpZiAoY291bnQgPT09IDApIHJldHVybiBbXTtcblxuICB2YXIgcGF0aCA9IHRoaXMucGFyc2VyLnBhcnNlKHN0cmluZyk7XG4gIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cbiAgdmFyIHBhcnRpYWxzID0gWyB7IHBhdGg6IFsnJCddLCB2YWx1ZTogb2JqIH0gXTtcbiAgdmFyIG1hdGNoZXMgPSBbXTtcblxuICBpZiAocGF0aC5sZW5ndGggJiYgcGF0aFswXS5leHByZXNzaW9uLnR5cGUgPT0gJ3Jvb3QnKSBwYXRoLnNoaWZ0KCk7XG5cbiAgaWYgKCFwYXRoLmxlbmd0aCkgcmV0dXJuIHBhcnRpYWxzO1xuXG4gIHBhdGguZm9yRWFjaChmdW5jdGlvbihjb21wb25lbnQsIGluZGV4KSB7XG5cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPj0gY291bnQpIHJldHVybjtcbiAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzLnJlc29sdmUoY29tcG9uZW50KTtcbiAgICB2YXIgX3BhcnRpYWxzID0gW107XG5cbiAgICBwYXJ0aWFscy5mb3JFYWNoKGZ1bmN0aW9uKHApIHtcblxuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID49IGNvdW50KSByZXR1cm47XG4gICAgICB2YXIgcmVzdWx0cyA9IGhhbmRsZXIoY29tcG9uZW50LCBwLCBjb3VudCk7XG5cbiAgICAgIGlmIChpbmRleCA9PSBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8gaWYgd2UncmUgdGhyb3VnaCB0aGUgY29tcG9uZW50cyB3ZSdyZSBkb25lXG4gICAgICAgIG1hdGNoZXMgPSBtYXRjaGVzLmNvbmNhdChyZXN1bHRzIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSBhY2N1bXVsYXRlIGFuZCBjYXJyeSBvbiB0aHJvdWdoXG4gICAgICAgIF9wYXJ0aWFscyA9IF9wYXJ0aWFscy5jb25jYXQocmVzdWx0cyB8fCBbXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXJ0aWFscyA9IF9wYXJ0aWFscztcblxuICB9KTtcblxuICByZXR1cm4gY291bnQgPyBtYXRjaGVzLnNsaWNlKDAsIGNvdW50KSA6IG1hdGNoZXM7XG59O1xuXG5KU09OUGF0aC5wcm90b3R5cGUuc3RyaW5naWZ5ID0gZnVuY3Rpb24ocGF0aCkge1xuXG4gIGFzc2VydC5vayhwYXRoLCBcIndlIG5lZWQgYSBwYXRoXCIpO1xuXG4gIHZhciBzdHJpbmcgPSAnJCc7XG5cbiAgdmFyIHRlbXBsYXRlcyA9IHtcbiAgICAnZGVzY2VuZGFudC1tZW1iZXInOiAnLi57e3ZhbHVlfX0nLFxuICAgICdjaGlsZC1tZW1iZXInOiAnLnt7dmFsdWV9fScsXG4gICAgJ2Rlc2NlbmRhbnQtc3Vic2NyaXB0JzogJy4uW3t7dmFsdWV9fV0nLFxuICAgICdjaGlsZC1zdWJzY3JpcHQnOiAnW3t7dmFsdWV9fV0nXG4gIH07XG5cbiAgcGF0aCA9IHRoaXMuX25vcm1hbGl6ZShwYXRoKTtcblxuICBwYXRoLmZvckVhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG5cbiAgICBpZiAoY29tcG9uZW50LmV4cHJlc3Npb24udHlwZSA9PSAncm9vdCcpIHJldHVybjtcblxuICAgIHZhciBrZXkgPSBbY29tcG9uZW50LnNjb3BlLCBjb21wb25lbnQub3BlcmF0aW9uXS5qb2luKCctJyk7XG4gICAgdmFyIHRlbXBsYXRlID0gdGVtcGxhdGVzW2tleV07XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgaWYgKGNvbXBvbmVudC5leHByZXNzaW9uLnR5cGUgPT0gJ3N0cmluZ19saXRlcmFsJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBjb21wb25lbnQuZXhwcmVzc2lvbi52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRlbXBsYXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZG4ndCBmaW5kIHRlbXBsYXRlIFwiICsga2V5KTtcblxuICAgIHN0cmluZyArPSB0ZW1wbGF0ZS5yZXBsYWNlKC97e3ZhbHVlfX0vLCB2YWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBzdHJpbmc7XG59XG5cbkpTT05QYXRoLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuXG4gIGFzc2VydC5vayhwYXRoLCBcIndlIG5lZWQgYSBwYXRoXCIpO1xuXG4gIGlmICh0eXBlb2YgcGF0aCA9PSBcInN0cmluZ1wiKSB7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucGFyc2UocGF0aCk7XG5cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGgpICYmIHR5cGVvZiBwYXRoWzBdID09IFwic3RyaW5nXCIpIHtcblxuICAgIHZhciBfcGF0aCA9IFsgeyBleHByZXNzaW9uOiB7IHR5cGU6IFwicm9vdFwiLCB2YWx1ZTogXCIkXCIgfSB9IF07XG5cbiAgICBwYXRoLmZvckVhY2goZnVuY3Rpb24oY29tcG9uZW50LCBpbmRleCkge1xuXG4gICAgICBpZiAoY29tcG9uZW50ID09ICckJyAmJiBpbmRleCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PSBcInN0cmluZ1wiICYmIGNvbXBvbmVudC5tYXRjaChcIl5cIiArIGRpY3QuaWRlbnRpZmllciArIFwiJFwiKSkge1xuXG4gICAgICAgIF9wYXRoLnB1c2goe1xuICAgICAgICAgIG9wZXJhdGlvbjogJ21lbWJlcicsXG4gICAgICAgICAgc2NvcGU6ICdjaGlsZCcsXG4gICAgICAgICAgZXhwcmVzc2lvbjogeyB2YWx1ZTogY29tcG9uZW50LCB0eXBlOiAnaWRlbnRpZmllcicgfVxuICAgICAgICB9KTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBjb21wb25lbnQgPT0gXCJudW1iZXJcIiA/XG4gICAgICAgICAgJ251bWVyaWNfbGl0ZXJhbCcgOiAnc3RyaW5nX2xpdGVyYWwnO1xuXG4gICAgICAgIF9wYXRoLnB1c2goe1xuICAgICAgICAgIG9wZXJhdGlvbjogJ3N1YnNjcmlwdCcsXG4gICAgICAgICAgc2NvcGU6ICdjaGlsZCcsXG4gICAgICAgICAgZXhwcmVzc2lvbjogeyB2YWx1ZTogY29tcG9uZW50LCB0eXBlOiB0eXBlIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3BhdGg7XG5cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGgpICYmIHR5cGVvZiBwYXRoWzBdID09IFwib2JqZWN0XCIpIHtcblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZG4ndCB1bmRlcnN0YW5kIHBhdGggXCIgKyBwYXRoKTtcbn1cblxuZnVuY3Rpb24gX2lzX3N0cmluZyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09ICdbb2JqZWN0IFN0cmluZ10nO1xufVxuXG5KU09OUGF0aC5IYW5kbGVycyA9IEhhbmRsZXJzO1xuSlNPTlBhdGguUGFyc2VyID0gUGFyc2VyO1xuXG52YXIgaW5zdGFuY2UgPSBuZXcgSlNPTlBhdGg7XG5pbnN0YW5jZS5KU09OUGF0aCA9IEpTT05QYXRoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3RhbmNlO1xuXG59LHtcIi4vZGljdFwiOjIsXCIuL2hhbmRsZXJzXCI6NCxcIi4vcGFyc2VyXCI6NixcImFzc2VydFwiOjh9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbnZhciBncmFtbWFyID0gcmVxdWlyZSgnLi9ncmFtbWFyJyk7XG52YXIgZ3BhcnNlciA9IHJlcXVpcmUoJy4uL2dlbmVyYXRlZC9wYXJzZXInKTtcblxudmFyIFBhcnNlciA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBwYXJzZXIgPSBuZXcgZ3BhcnNlci5QYXJzZXIoKTtcblxuICB2YXIgX3BhcnNlRXJyb3IgPSBwYXJzZXIucGFyc2VFcnJvcjtcbiAgcGFyc2VyLnl5LnBhcnNlRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocGFyc2VyLnl5LmFzdCkge1xuICAgICAgcGFyc2VyLnl5LmFzdC5pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIF9wYXJzZUVycm9yLmFwcGx5KHBhcnNlciwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZXI7XG5cbn07XG5cblBhcnNlci5ncmFtbWFyID0gZ3JhbW1hcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuXG59LHtcIi4uL2dlbmVyYXRlZC9wYXJzZXJcIjoxLFwiLi9ncmFtbWFyXCI6M31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhcnIsIHN0YXJ0LCBlbmQsIHN0ZXApIHtcblxuICBpZiAodHlwZW9mIHN0YXJ0ID09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydCBjYW5ub3QgYmUgYSBzdHJpbmdcIik7XG4gIGlmICh0eXBlb2YgZW5kID09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJlbmQgY2Fubm90IGJlIGEgc3RyaW5nXCIpO1xuICBpZiAodHlwZW9mIHN0ZXAgPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcihcInN0ZXAgY2Fubm90IGJlIGEgc3RyaW5nXCIpO1xuXG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGlmIChzdGVwID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJzdGVwIGNhbm5vdCBiZSB6ZXJvXCIpO1xuICBzdGVwID0gc3RlcCA/IGludGVnZXIoc3RlcCkgOiAxO1xuXG4gIC8vIG5vcm1hbGl6ZSBuZWdhdGl2ZSB2YWx1ZXNcbiAgc3RhcnQgPSBzdGFydCA8IDAgPyBsZW4gKyBzdGFydCA6IHN0YXJ0O1xuICBlbmQgPSBlbmQgPCAwID8gbGVuICsgZW5kIDogZW5kO1xuXG4gIC8vIGRlZmF1bHQgZXh0ZW50cyB0byBleHRlbnRzXG4gIHN0YXJ0ID0gaW50ZWdlcihzdGFydCA9PT0gMCA/IDAgOiAhc3RhcnQgPyAoc3RlcCA+IDAgPyAwIDogbGVuIC0gMSkgOiBzdGFydCk7XG4gIGVuZCA9IGludGVnZXIoZW5kID09PSAwID8gMCA6ICFlbmQgPyAoc3RlcCA+IDAgPyBsZW4gOiAtMSkgOiBlbmQpO1xuXG4gIC8vIGNsYW1wIGV4dGVudHNcbiAgc3RhcnQgPSBzdGVwID4gMCA/IE1hdGgubWF4KDAsIHN0YXJ0KSA6IE1hdGgubWluKGxlbiwgc3RhcnQpO1xuICBlbmQgPSBzdGVwID4gMCA/IE1hdGgubWluKGVuZCwgbGVuKSA6IE1hdGgubWF4KC0xLCBlbmQpO1xuXG4gIC8vIHJldHVybiBlbXB0eSBpZiBleHRlbnRzIGFyZSBiYWNrd2FyZHNcbiAgaWYgKHN0ZXAgPiAwICYmIGVuZCA8PSBzdGFydCkgcmV0dXJuIFtdO1xuICBpZiAoc3RlcCA8IDAgJiYgc3RhcnQgPD0gZW5kKSByZXR1cm4gW107XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSAhPSBlbmQ7IGkgKz0gc3RlcCkge1xuICAgIGlmICgoc3RlcCA8IDAgJiYgaSA8PSBlbmQpIHx8IChzdGVwID4gMCAmJiBpID49IGVuZCkpIGJyZWFrO1xuICAgIHJlc3VsdC5wdXNoKGFycltpXSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbnRlZ2VyKHZhbCkge1xuICByZXR1cm4gU3RyaW5nKHZhbCkubWF0Y2goL15bMC05XSskLykgPyBwYXJzZUludCh2YWwpIDpcbiAgICBOdW1iZXIuaXNGaW5pdGUodmFsKSA/IHBhcnNlSW50KHZhbCwgMTApIDogMDtcbn1cblxufSx7fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gd2hlbiB1c2VkIGluIG5vZGUsIHRoaXMgd2lsbCBhY3R1YWxseSBsb2FkIHRoZSB1dGlsIG1vZHVsZSB3ZSBkZXBlbmQgb25cbi8vIHZlcnN1cyBsb2FkaW5nIHRoZSBidWlsdGluIHV0aWwgbW9kdWxlIGFzIGhhcHBlbnMgb3RoZXJ3aXNlXG4vLyB0aGlzIGlzIGEgYnVnIGluIG5vZGUgbW9kdWxlIGxvYWRpbmcgYXMgZmFyIGFzIEkgYW0gY29uY2VybmVkXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwvJyk7XG5cbnZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbnZhciBhc3NlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IG9rO1xuXG4vLyAyLiBUaGUgQXNzZXJ0aW9uRXJyb3IgaXMgZGVmaW5lZCBpbiBhc3NlcnQuXG4vLyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQgfSlcblxuYXNzZXJ0LkFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3Iob3B0aW9ucykge1xuICB0aGlzLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsO1xuICB0aGlzLmV4cGVjdGVkID0gb3B0aW9ucy5leHBlY3RlZDtcbiAgdGhpcy5vcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3I7XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tZXNzYWdlID0gZ2V0TWVzc2FnZSh0aGlzKTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFja1N0YXJ0RnVuY3Rpb24gPSBvcHRpb25zLnN0YWNrU3RhcnRGdW5jdGlvbiB8fCBmYWlsO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gc3RhY2tTdGFydEZ1bmN0aW9uLm5hbWU7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiAnJyArIHZhbHVlO1xuICB9XG4gIGlmICh1dGlsLmlzTnVtYmVyKHZhbHVlKSAmJiAhaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHV0aWwuaXNGdW5jdGlvbih2YWx1ZSkgfHwgdXRpbC5pc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHtcbiAgaWYgKHV0aWwuaXNTdHJpbmcocykpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShKU09OLnN0cmluZ2lmeShzZWxmLmFjdHVhbCwgcmVwbGFjZXIpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoc2VsZi5leHBlY3RlZCwgcmVwbGFjZXIpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGFzc2VydC5kZWVwRXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGFjdHVhbCkgJiYgdXRpbC5pc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICBpZiAoYWN0dWFsLmxlbmd0aCAhPSBleHBlY3RlZC5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYWN0dWFsW2ldICE9PSBleHBlY3RlZFtpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIDcuMi4gSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgRGF0ZSBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgdGltZS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzRGF0ZShhY3R1YWwpICYmIHV0aWwuaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzUmVnRXhwKGFjdHVhbCkgJiYgdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmXG4gICAgICAgICAgIGFjdHVhbC5nbG9iYWwgPT09IGV4cGVjdGVkLmdsb2JhbCAmJlxuICAgICAgICAgICBhY3R1YWwubXVsdGlsaW5lID09PSBleHBlY3RlZC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgYWN0dWFsLmxhc3RJbmRleCA9PT0gZXhwZWN0ZWQubGFzdEluZGV4ICYmXG4gICAgICAgICAgIGFjdHVhbC5pZ25vcmVDYXNlID09PSBleHBlY3RlZC5pZ25vcmVDYXNlO1xuXG4gIC8vIDcuNC4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICghdXRpbC5pc09iamVjdChhY3R1YWwpICYmICF1dGlsLmlzT2JqZWN0KGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gNy41IEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYikge1xuICBpZiAodXRpbC5pc051bGxPclVuZGVmaW5lZChhKSB8fCB1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH1cbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKSxcbiAgICAgIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYik7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKSxcbiAgICAgIGtiID0gb2JqZWN0S2V5cyhiKSxcbiAgICAgIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghX2RlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDkuIFRoZSBzdHJpY3QgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHN0cmljdCBlcXVhbGl0eSwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09JywgYXNzZXJ0LnN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gMTAuIFRoZSBzdHJpY3Qgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igc3RyaWN0IGluZXF1YWxpdHksIGFzXG4vLyBkZXRlcm1pbmVkIGJ5ICE9PS4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIG5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPT0nLCBhc3NlcnQubm90U3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHV0aWwuaXNTdHJpbmcoZXhwZWN0ZWQpKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGFjdHVhbCA9IGU7XG4gIH1cblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICghc2hvdWxkVGhyb3cgJiYgZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdHb3QgdW53YW50ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKChzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgZXhwZWN0ZWQgJiZcbiAgICAgICFleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHwgKCFzaG91bGRUaHJvdyAmJiBhY3R1YWwpKSB7XG4gICAgdGhyb3cgYWN0dWFsO1xuICB9XG59XG5cbi8vIDExLiBFeHBlY3RlZCB0byB0aHJvdyBhbiBlcnJvcjpcbi8vIGFzc2VydC50aHJvd3MoYmxvY2ssIEVycm9yX29wdCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MuYXBwbHkodGhpcywgW3RydWVdLmNvbmNhdChwU2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzLmFwcGx5KHRoaXMsIFtmYWxzZV0uY29uY2F0KHBTbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHt0aHJvdyBlcnI7fX07XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuXG59LHtcInV0aWwvXCI6MTF9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuXG59LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59XG59LHt9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18uZyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19yZXF1aXJlX18uZyA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbn0se1wiLi9zdXBwb3J0L2lzQnVmZmVyXCI6MTAsXCJfcHJvY2Vzc1wiOjE0LFwiaW5oZXJpdHNcIjo5fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuXG59LHt9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLy8gLmRpcm5hbWUsIC5iYXNlbmFtZSwgYW5kIC5leHRuYW1lIG1ldGhvZHMgYXJlIGV4dHJhY3RlZCBmcm9tIE5vZGUuanMgdjguMTEuMSxcbi8vIGJhY2twb3J0ZWQgYW5kIHRyYW5zcGxpdGVkIHdpdGggQmFiZWwsIHdpdGggYmFja3dhcmRzLWNvbXBhdCBmaXhlc1xuXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbiAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG4gIHZhciBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApO1xuICB2YXIgaGFzUm9vdCA9IGNvZGUgPT09IDQ3IC8qLyovO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDE7IC0taSkge1xuICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yXG4gICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIGhhc1Jvb3QgPyAnLycgOiAnLic7XG4gIGlmIChoYXNSb290ICYmIGVuZCA9PT0gMSkge1xuICAgIC8vIHJldHVybiAnLy8nO1xuICAgIC8vIEJhY2t3YXJkcy1jb21wYXQgZml4OlxuICAgIHJldHVybiAnLyc7XG4gIH1cbiAgcmV0dXJuIHBhdGguc2xpY2UoMCwgZW5kKTtcbn07XG5cbmZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykgcGF0aCA9IHBhdGggKyAnJztcblxuICB2YXIgc3RhcnQgPSAwO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAvLyBwYXRoIGNvbXBvbmVudFxuICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICBlbmQgPSBpICsgMTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW5kID09PSAtMSkgcmV0dXJuICcnO1xuICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuLy8gVXNlcyBhIG1peGVkIGFwcHJvYWNoIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgYXMgZXh0IGJlaGF2aW9yIGNoYW5nZWRcbi8vIGluIG5ldyBOb2RlLmpzIHZlcnNpb25zLCBzbyBvbmx5IGJhc2VuYW1lKCkgYWJvdmUgaXMgYmFja3BvcnRlZCBoZXJlXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24gKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IGJhc2VuYW1lKHBhdGgpO1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykgcGF0aCA9IHBhdGggKyAnJztcbiAgdmFyIHN0YXJ0RG90ID0gLTE7XG4gIHZhciBzdGFydFBhcnQgPSAwO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kXG4gIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kXG4gIHZhciBwcmVEb3RTdGF0ZSA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAvLyBleHRlbnNpb25cbiAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgZW5kID0gaSArIDE7XG4gICAgfVxuICAgIGlmIChjb2RlID09PSA0NiAvKi4qLykge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb25cbiAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSlcbiAgICAgICAgICBzdGFydERvdCA9IGk7XG4gICAgICAgIGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKVxuICAgICAgICAgIHByZURvdFN0YXRlID0gMTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RG90ICE9PSAtMSkge1xuICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGRcbiAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICBwcmVEb3RTdGF0ZSA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydERvdCA9PT0gLTEgfHwgZW5kID09PSAtMSB8fFxuICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgICAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSAnLi4nXG4gICAgICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICB0cnVlXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IDBcbjtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG59LHtcIl9wcm9jZXNzXCI6MTR9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG59LHt9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG52YXIgdW5wYXJzZSA9IHJlcXVpcmUoJ2VzY29kZWdlbicpLmdlbmVyYXRlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhc3QsIHZhcnMpIHtcbiAgICBpZiAoIXZhcnMpIHZhcnMgPSB7fTtcbiAgICB2YXIgRkFJTCA9IHt9O1xuICAgIFxuICAgIHZhciByZXN1bHQgPSAoZnVuY3Rpb24gd2FsayAobm9kZSwgc2NvcGVWYXJzKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdMaXRlcmFsJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnVW5hcnlFeHByZXNzaW9uJyl7XG4gICAgICAgICAgICB2YXIgdmFsID0gd2Fsayhub2RlLmFyZ3VtZW50KVxuICAgICAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICcrJykgcmV0dXJuICt2YWxcbiAgICAgICAgICAgIGlmIChub2RlLm9wZXJhdG9yID09PSAnLScpIHJldHVybiAtdmFsXG4gICAgICAgICAgICBpZiAobm9kZS5vcGVyYXRvciA9PT0gJ34nKSByZXR1cm4gfnZhbFxuICAgICAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICchJykgcmV0dXJuICF2YWxcbiAgICAgICAgICAgIHJldHVybiBGQUlMXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQXJyYXlFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgdmFyIHhzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuZWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHggPSB3YWxrKG5vZGUuZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBGQUlMKSByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHhzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gbm9kZS5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3AudmFsdWUgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogd2Fsayhwcm9wLnZhbHVlKVxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IEZBSUwpIHJldHVybiBGQUlMO1xuICAgICAgICAgICAgICAgIG9ialtwcm9wLmtleS52YWx1ZSB8fCBwcm9wLmtleS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJyB8fFxuICAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09ICdMb2dpY2FsRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgIHZhciBsID0gd2Fsayhub2RlLmxlZnQpO1xuICAgICAgICAgICAgaWYgKGwgPT09IEZBSUwpIHJldHVybiBGQUlMO1xuICAgICAgICAgICAgdmFyIHIgPSB3YWxrKG5vZGUucmlnaHQpO1xuICAgICAgICAgICAgaWYgKHIgPT09IEZBSUwpIHJldHVybiBGQUlMO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgb3AgPSBub2RlLm9wZXJhdG9yO1xuICAgICAgICAgICAgaWYgKG9wID09PSAnPT0nKSByZXR1cm4gbCA9PSByO1xuICAgICAgICAgICAgaWYgKG9wID09PSAnPT09JykgcmV0dXJuIGwgPT09IHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICchPScpIHJldHVybiBsICE9IHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICchPT0nKSByZXR1cm4gbCAhPT0gcjtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gJysnKSByZXR1cm4gbCArIHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICctJykgcmV0dXJuIGwgLSByO1xuICAgICAgICAgICAgaWYgKG9wID09PSAnKicpIHJldHVybiBsICogcjtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gJy8nKSByZXR1cm4gbCAvIHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICclJykgcmV0dXJuIGwgJSByO1xuICAgICAgICAgICAgaWYgKG9wID09PSAnPCcpIHJldHVybiBsIDwgcjtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gJzw9JykgcmV0dXJuIGwgPD0gcjtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gJz4nKSByZXR1cm4gbCA+IHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICc+PScpIHJldHVybiBsID49IHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICd8JykgcmV0dXJuIGwgfCByO1xuICAgICAgICAgICAgaWYgKG9wID09PSAnJicpIHJldHVybiBsICYgcjtcbiAgICAgICAgICAgIGlmIChvcCA9PT0gJ14nKSByZXR1cm4gbCBeIHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICcmJicpIHJldHVybiBsICYmIHI7XG4gICAgICAgICAgICBpZiAob3AgPT09ICd8fCcpIHJldHVybiBsIHx8IHI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBGQUlMO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbCh2YXJzLCBub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhcnNbbm9kZS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIEZBSUw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnVGhpc0V4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbCh2YXJzLCAndGhpcycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhcnNbJ3RoaXMnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIEZBSUw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGVlID0gd2Fsayhub2RlLmNhbGxlZSk7XG4gICAgICAgICAgICBpZiAoY2FsbGVlID09PSBGQUlMKSByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGVlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGN0eCA9IG5vZGUuY2FsbGVlLm9iamVjdCA/IHdhbGsobm9kZS5jYWxsZWUub2JqZWN0KSA6IEZBSUw7XG4gICAgICAgICAgICBpZiAoY3R4ID09PSBGQUlMKSBjdHggPSBudWxsO1xuXG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgeCA9IHdhbGsobm9kZS5hcmd1bWVudHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBGQUlMKSByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbGVlLmFwcGx5KGN0eCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSB3YWxrKG5vZGUub2JqZWN0KTtcbiAgICAgICAgICAgIC8vIGRvIG5vdCBhbGxvdyBhY2Nlc3MgdG8gbWV0aG9kcyBvbiBGdW5jdGlvbiBcbiAgICAgICAgICAgIGlmKChvYmogPT09IEZBSUwpIHx8ICh0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbm9kZS5wcm9wZXJ0eS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwcm9wID0gd2Fsayhub2RlLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSBGQUlMKSByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgIHJldHVybiBvYmpbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHdhbGsobm9kZS50ZXN0KVxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gRkFJTCkgcmV0dXJuIEZBSUw7XG4gICAgICAgICAgICByZXR1cm4gdmFsID8gd2Fsayhub2RlLmNvbnNlcXVlbnQpIDogd2Fsayhub2RlLmFsdGVybmF0ZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHdhbGsobm9kZS5leHByZXNzaW9uKVxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gRkFJTCkgcmV0dXJuIEZBSUw7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1JldHVyblN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrKG5vZGUuYXJndW1lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgYm9kaWVzID0gbm9kZS5ib2R5LmJvZHk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFwic2NvcGVcIiBmb3Igb3VyIGFyZ3VtZW50c1xuICAgICAgICAgICAgdmFyIG9sZFZhcnMgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhcnMpLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCl7XG4gICAgICAgICAgICAgICAgb2xkVmFyc1tlbGVtZW50XSA9IHZhcnNbZWxlbWVudF07XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBmb3IodmFyIGk9MDsgaTxub2RlLnBhcmFtcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG5vZGUucGFyYW1zW2ldO1xuICAgICAgICAgICAgICAgIGlmKGtleS50eXBlID09ICdJZGVudGlmaWVyJyl7XG4gICAgICAgICAgICAgICAgICB2YXJzW2tleS5uYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIEZBSUw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gYm9kaWVzKXtcbiAgICAgICAgICAgICAgICBpZih3YWxrKGJvZGllc1tpXSkgPT09IEZBSUwpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFJTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSB2YXJzIGFuZCBzY29wZSBhZnRlciB3ZSB3YWxrXG4gICAgICAgICAgICB2YXJzID0gb2xkVmFycztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YXJzKTtcbiAgICAgICAgICAgIHZhciB2YWxzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhcnNba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGtleXMuam9pbignLCAnKSwgJ3JldHVybiAnICsgdW5wYXJzZShub2RlKSkuYXBwbHkobnVsbCwgdmFscyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJykge1xuICAgICAgICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IHdhbGsobm9kZS5xdWFzaXNbaV0pO1xuICAgICAgICAgICAgICAgIHN0ciArPSB3YWxrKG5vZGUuZXhwcmVzc2lvbnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IHdhbGsobm9kZS5xdWFzaXNbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICB2YXIgdGFnID0gd2Fsayhub2RlLnRhZyk7XG4gICAgICAgICAgICB2YXIgcXVhc2kgPSBub2RlLnF1YXNpO1xuICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBxdWFzaS5xdWFzaXMubWFwKHdhbGspO1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHF1YXNpLmV4cHJlc3Npb25zLm1hcCh3YWxrKTtcbiAgICAgICAgICAgIHJldHVybiB0YWcuYXBwbHkobnVsbCwgW3N0cmluZ3NdLmNvbmNhdCh2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdUZW1wbGF0ZUVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZS5jb29rZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSByZXR1cm4gRkFJTDtcbiAgICB9KShhc3QpO1xuICAgIFxuICAgIHJldHVybiByZXN1bHQgPT09IEZBSUwgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG59O1xuXG59LHtcImVzY29kZWdlblwiOjEyfV0sXCJqc29ucGF0aFwiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaW5kZXgnKTtcblxufSx7XCIuL2xpYi9pbmRleFwiOjV9XX0se30sW1wianNvbnBhdGhcIl0pKFwianNvbnBhdGhcIilcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9qc29ucGF0aC9qc29ucGF0aC5qcz8iKTt9LDYzMToobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2NTQpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5zcGVjdF8ob2JqLCBvcHRpb25zLCBkZXB0aCwgc2Vlbikge1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSAmJiAob3B0cy5xdW90ZVN0eWxlICE9PSAnc2luZ2xlJyAmJiBvcHRzLnF1b3RlU3R5bGUgIT09ICdkb3VibGUnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJxdW90ZVN0eWxlXCIgbXVzdCBiZSBcInNpbmdsZVwiIG9yIFwiZG91YmxlXCInKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ21heFN0cmluZ0xlbmd0aCcpICYmICh0eXBlb2Ygb3B0cy5tYXhTdHJpbmdMZW5ndGggPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IG9wdHMubWF4U3RyaW5nTGVuZ3RoIDwgMCAmJiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gSW5maW5pdHlcbiAgICAgICAgICAgIDogb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IG51bGxcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJtYXhTdHJpbmdMZW5ndGhcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBJbmZpbml0eSwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIHZhciBjdXN0b21JbnNwZWN0ID0gaGFzKG9wdHMsICdjdXN0b21JbnNwZWN0JykgPyBvcHRzLmN1c3RvbUluc3BlY3QgOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tSW5zcGVjdCAhPT0gJ2Jvb2xlYW4nICYmIGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImN1c3RvbUluc3BlY3RcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgLCBgZmFsc2VgLCBvciBgXFwnc3ltYm9sXFwnYCcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdpbmRlbnQnKVxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gbnVsbFxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gJ1xcdCdcbiAgICAgICAgJiYgIShwYXJzZUludChvcHRzLmluZGVudCwgMTApID09PSBvcHRzLmluZGVudCAmJiBvcHRzLmluZGVudCA+IDApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImluZGVudFwiIG11c3QgYmUgXCJcXFxcdFwiLCBhbiBpbnRlZ2VyID4gMCwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIGlmIChoYXMob3B0cywgJ251bWVyaWNTZXBhcmF0b3InKSAmJiB0eXBlb2Ygb3B0cy5udW1lcmljU2VwYXJhdG9yICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibnVtZXJpY1NlcGFyYXRvclwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCcpO1xuICAgIH1cbiAgICB2YXIgbnVtZXJpY1NlcGFyYXRvciA9IG9wdHMubnVtZXJpY1NlcGFyYXRvcjtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gb2JqID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcob2JqLCBvcHRzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChvYmogPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eSAvIG9iaiA+IDAgPyAnMCcgOiAnLTAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdHIgPSBTdHJpbmcob2JqKTtcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhciBiaWdJbnRTdHIgPSBTdHJpbmcob2JqKSArICduJztcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgYmlnSW50U3RyKSA6IGJpZ0ludFN0cjtcbiAgICB9XG5cbiAgICB2YXIgbWF4RGVwdGggPSB0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyA1IDogb3B0cy5kZXB0aDtcbiAgICBpZiAodHlwZW9mIGRlcHRoID09PSAndW5kZWZpbmVkJykgeyBkZXB0aCA9IDA7IH1cbiAgICBpZiAoZGVwdGggPj0gbWF4RGVwdGggJiYgbWF4RGVwdGggPiAwICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KG9iaikgPyAnW0FycmF5XScgOiAnW09iamVjdF0nO1xuICAgIH1cblxuICAgIHZhciBpbmRlbnQgPSBnZXRJbmRlbnQob3B0cywgZGVwdGgpO1xuXG4gICAgaWYgKHR5cGVvZiBzZWVuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWVuID0gW107XG4gICAgfSBlbHNlIGlmIChpbmRleE9mKHNlZW4sIG9iaikgPj0gMCkge1xuICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3QodmFsdWUsIGZyb20sIG5vSW5kZW50KSB7XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICBzZWVuID0gJGFyclNsaWNlLmNhbGwoc2Vlbik7XG4gICAgICAgICAgICBzZWVuLnB1c2goZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vSW5kZW50KSB7XG4gICAgICAgICAgICB2YXIgbmV3T3B0cyA9IHtcbiAgICAgICAgICAgICAgICBkZXB0aDogb3B0cy5kZXB0aFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSkge1xuICAgICAgICAgICAgICAgIG5ld09wdHMucXVvdGVTdHlsZSA9IG9wdHMucXVvdGVTdHlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgbmV3T3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG9wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgJiYgIWlzUmVnRXhwKG9iaikpIHsgLy8gaW4gb2xkZXIgZW5naW5lcywgcmVnZXhlcyBhcmUgY2FsbGFibGVcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lT2Yob2JqKTtcbiAgICAgICAgdmFyIGtleXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHJldHVybiAnW0Z1bmN0aW9uJyArIChuYW1lID8gJzogJyArIG5hbWUgOiAnIChhbm9ueW1vdXMpJykgKyAnXScgKyAoa2V5cy5sZW5ndGggPiAwID8gJyB7ICcgKyAkam9pbi5jYWxsKGtleXMsICcsICcpICsgJyB9JyA6ICcnKTtcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKG9iaikpIHtcbiAgICAgICAgdmFyIHN5bVN0cmluZyA9IGhhc1NoYW1tZWRTeW1ib2xzID8gJHJlcGxhY2UuY2FsbChTdHJpbmcob2JqKSwgL14oU3ltYm9sXFwoLipcXCkpX1teKV0qJC8sICckMScpIDogc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIWhhc1NoYW1tZWRTeW1ib2xzID8gbWFya0JveGVkKHN5bVN0cmluZykgOiBzeW1TdHJpbmc7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQob2JqKSkge1xuICAgICAgICB2YXIgcyA9ICc8JyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKTtcbiAgICAgICAgdmFyIGF0dHJzID0gb2JqLmF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHMgKz0gJyAnICsgYXR0cnNbaV0ubmFtZSArICc9JyArIHdyYXBRdW90ZXMocXVvdGUoYXR0cnNbaV0udmFsdWUpLCAnZG91YmxlJywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSAnPic7XG4gICAgICAgIGlmIChvYmouY2hpbGROb2RlcyAmJiBvYmouY2hpbGROb2Rlcy5sZW5ndGgpIHsgcyArPSAnLi4uJzsgfVxuICAgICAgICBzICs9ICc8LycgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSkgKyAnPic7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChvYmoubGVuZ3RoID09PSAwKSB7IHJldHVybiAnW10nOyB9XG4gICAgICAgIHZhciB4cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKGluZGVudCAmJiAhc2luZ2xlTGluZVZhbHVlcyh4cykpIHtcbiAgICAgICAgICAgIHJldHVybiAnWycgKyBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdbICcgKyAkam9pbi5jYWxsKHhzLCAnLCAnKSArICcgXSc7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoISgnY2F1c2UnIGluIEVycm9yLnByb3RvdHlwZSkgJiYgJ2NhdXNlJyBpbiBvYmogJiYgIWlzRW51bWVyYWJsZS5jYWxsKG9iaiwgJ2NhdXNlJykpIHtcbiAgICAgICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKCdbY2F1c2VdOiAnICsgaW5zcGVjdChvYmouY2F1c2UpLCBwYXJ0cyksICcsICcpICsgJyB9JztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnWycgKyBTdHJpbmcob2JqKSArICddJzsgfVxuICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKHBhcnRzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBjdXN0b21JbnNwZWN0KSB7XG4gICAgICAgIGlmIChpbnNwZWN0U3ltYm9sICYmIHR5cGVvZiBvYmpbaW5zcGVjdFN5bWJvbF0gPT09ICdmdW5jdGlvbicgJiYgdXRpbEluc3BlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsSW5zcGVjdChvYmosIHsgZGVwdGg6IG1heERlcHRoIC0gZGVwdGggfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcgJiYgdHlwZW9mIG9iai5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmluc3BlY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNYXAob2JqKSkge1xuICAgICAgICB2YXIgbWFwUGFydHMgPSBbXTtcbiAgICAgICAgaWYgKG1hcEZvckVhY2gpIHtcbiAgICAgICAgICAgIG1hcEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgbWFwUGFydHMucHVzaChpbnNwZWN0KGtleSwgb2JqLCB0cnVlKSArICcgPT4gJyArIGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignTWFwJywgbWFwU2l6ZS5jYWxsKG9iaiksIG1hcFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNTZXQob2JqKSkge1xuICAgICAgICB2YXIgc2V0UGFydHMgPSBbXTtcbiAgICAgICAgaWYgKHNldEZvckVhY2gpIHtcbiAgICAgICAgICAgIHNldEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHNldFBhcnRzLnB1c2goaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdTZXQnLCBzZXRTaXplLmNhbGwob2JqKSwgc2V0UGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtNYXAob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha01hcCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrU2V0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtTZXQnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrUmVmJyk7XG4gICAgfVxuICAgIGlmIChpc051bWJlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChOdW1iZXIob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdJbnQob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoYmlnSW50VmFsdWVPZi5jYWxsKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQm9vbGVhbihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KFN0cmluZyhvYmopKSk7XG4gICAgfVxuICAgIC8vIG5vdGU6IGluIElFIDgsIHNvbWV0aW1lcyBgZ2xvYmFsICE9PSB3aW5kb3dgIGJ1dCBib3RoIGFyZSB0aGUgcHJvdG90eXBlcyBvZiBlYWNoIG90aGVyXG4gICAgLyogZXNsaW50LWVudiBicm93c2VyICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gd2luZG93KSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IFdpbmRvd10gfSc7XG4gICAgfVxuICAgIGlmIChvYmogPT09IF9fd2VicGFja19yZXF1aXJlX18uZykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBnbG9iYWxUaGlzXSB9JztcbiAgICB9XG4gICAgaWYgKCFpc0RhdGUob2JqKSAmJiAhaXNSZWdFeHAob2JqKSkge1xuICAgICAgICB2YXIgeXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHZhciBpc1BsYWluT2JqZWN0ID0gZ1BPID8gZ1BPKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGUgOiBvYmogaW5zdGFuY2VvZiBPYmplY3QgfHwgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG4gICAgICAgIHZhciBwcm90b1RhZyA9IG9iaiBpbnN0YW5jZW9mIE9iamVjdCA/ICcnIDogJ251bGwgcHJvdG90eXBlJztcbiAgICAgICAgdmFyIHN0cmluZ1RhZyA9ICFpc1BsYWluT2JqZWN0ICYmIHRvU3RyaW5nVGFnICYmIE9iamVjdChvYmopID09PSBvYmogJiYgdG9TdHJpbmdUYWcgaW4gb2JqID8gJHNsaWNlLmNhbGwodG9TdHIob2JqKSwgOCwgLTEpIDogcHJvdG9UYWcgPyAnT2JqZWN0JyA6ICcnO1xuICAgICAgICB2YXIgY29uc3RydWN0b3JUYWcgPSBpc1BsYWluT2JqZWN0IHx8IHR5cGVvZiBvYmouY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicgPyAnJyA6IG9iai5jb25zdHJ1Y3Rvci5uYW1lID8gb2JqLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgOiAnJztcbiAgICAgICAgdmFyIHRhZyA9IGNvbnN0cnVjdG9yVGFnICsgKHN0cmluZ1RhZyB8fCBwcm90b1RhZyA/ICdbJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKFtdLCBzdHJpbmdUYWcgfHwgW10sIHByb3RvVGFnIHx8IFtdKSwgJzogJykgKyAnXSAnIDogJycpO1xuICAgICAgICBpZiAoeXMubGVuZ3RoID09PSAwKSB7IHJldHVybiB0YWcgKyAne30nOyB9XG4gICAgICAgIGlmIChpbmRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcgKyAneycgKyBpbmRlbnRlZEpvaW4oeXMsIGluZGVudCkgKyAnfSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZyArICd7ICcgKyAkam9pbi5jYWxsKHlzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBRdW90ZXMocywgZGVmYXVsdFN0eWxlLCBvcHRzKSB7XG4gICAgdmFyIHF1b3RlQ2hhciA9IChvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlKSA9PT0gJ2RvdWJsZScgPyAnXCInIDogXCInXCI7XG4gICAgcmV0dXJuIHF1b3RlQ2hhciArIHMgKyBxdW90ZUNoYXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHMpIHtcbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChTdHJpbmcocyksIC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBBcnJheV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNEYXRlKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBFcnJvcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBTdHJpbmddJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzTnVtYmVyKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBCb29sZWFuXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5cbi8vIFN5bWJvbCBhbmQgQmlnSW50IGRvIGhhdmUgU3ltYm9sLnRvU3RyaW5nVGFnIGJ5IHNwZWMsIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCB0byBlbGltaW5hdGUgZmFsc2UgcG9zaXRpdmVzXG5mdW5jdGlvbiBpc1N5bWJvbChvYmopIHtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBTeW1ib2w7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIXN5bVRvU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIWJpZ0ludFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5IHx8IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiB0aGlzOyB9O1xuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn1cblxuZnVuY3Rpb24gdG9TdHIob2JqKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxuZnVuY3Rpb24gbmFtZU9mKGYpIHtcbiAgICBpZiAoZi5uYW1lKSB7IHJldHVybiBmLm5hbWU7IH1cbiAgICB2YXIgbSA9ICRtYXRjaC5jYWxsKGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChmKSwgL15mdW5jdGlvblxccyooW1xcdyRdKykvKTtcbiAgICBpZiAobSkgeyByZXR1cm4gbVsxXTsgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gICAgaWYgKHhzLmluZGV4T2YpIHsgcmV0dXJuIHhzLmluZGV4T2YoeCk7IH1cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoeHNbaV0gPT09IHgpIHsgcmV0dXJuIGk7IH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc01hcCh4KSB7XG4gICAgaWYgKCFtYXBTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuICAgIGlmICghd2Vha01hcEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha01hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1JlZih4KSB7XG4gICAgaWYgKCF3ZWFrUmVmRGVyZWYgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1JlZkRlcmVmLmNhbGwoeCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1NldCh4KSB7XG4gICAgaWYgKCFzZXRTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuICAgIGlmICghd2Vha1NldEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCh4KSB7XG4gICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgeC5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHguZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0ciwgb3B0cykge1xuICAgIGlmIChzdHIubGVuZ3RoID4gb3B0cy5tYXhTdHJpbmdMZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHN0ci5sZW5ndGggLSBvcHRzLm1heFN0cmluZ0xlbmd0aDtcbiAgICAgICAgdmFyIHRyYWlsZXIgPSAnLi4uICcgKyByZW1haW5pbmcgKyAnIG1vcmUgY2hhcmFjdGVyJyArIChyZW1haW5pbmcgPiAxID8gJ3MnIDogJycpO1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZygkc2xpY2UuY2FsbChzdHIsIDAsIG9wdHMubWF4U3RyaW5nTGVuZ3RoKSwgb3B0cykgKyB0cmFpbGVyO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHZhciBzID0gJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKHN0ciwgLyhbJ1xcXFxdKS9nLCAnXFxcXCQxJyksIC9bXFx4MDAtXFx4MWZdL2csIGxvd2J5dGUpO1xuICAgIHJldHVybiB3cmFwUXVvdGVzKHMsICdzaW5nbGUnLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gbG93Ynl0ZShjKSB7XG4gICAgdmFyIG4gPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHggPSB7XG4gICAgICAgIDg6ICdiJyxcbiAgICAgICAgOTogJ3QnLFxuICAgICAgICAxMDogJ24nLFxuICAgICAgICAxMjogJ2YnLFxuICAgICAgICAxMzogJ3InXG4gICAgfVtuXTtcbiAgICBpZiAoeCkgeyByZXR1cm4gJ1xcXFwnICsgeDsgfVxuICAgIHJldHVybiAnXFxcXHgnICsgKG4gPCAweDEwID8gJzAnIDogJycpICsgJHRvVXBwZXJDYXNlLmNhbGwobi50b1N0cmluZygxNikpO1xufVxuXG5mdW5jdGlvbiBtYXJrQm94ZWQoc3RyKSB7XG4gICAgcmV0dXJuICdPYmplY3QoJyArIHN0ciArICcpJztcbn1cblxuZnVuY3Rpb24gd2Vha0NvbGxlY3Rpb25PZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgKyAnIHsgPyB9Jztcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbk9mKHR5cGUsIHNpemUsIGVudHJpZXMsIGluZGVudCkge1xuICAgIHZhciBqb2luZWRFbnRyaWVzID0gaW5kZW50ID8gaW5kZW50ZWRKb2luKGVudHJpZXMsIGluZGVudCkgOiAkam9pbi5jYWxsKGVudHJpZXMsICcsICcpO1xuICAgIHJldHVybiB0eXBlICsgJyAoJyArIHNpemUgKyAnKSB7JyArIGpvaW5lZEVudHJpZXMgKyAnfSc7XG59XG5cbmZ1bmN0aW9uIHNpbmdsZUxpbmVWYWx1ZXMoeHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbmRleE9mKHhzW2ldLCAnXFxuJykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRlbnQob3B0cywgZGVwdGgpIHtcbiAgICB2YXIgYmFzZUluZGVudDtcbiAgICBpZiAob3B0cy5pbmRlbnQgPT09ICdcXHQnKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAnXFx0JztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmluZGVudCA9PT0gJ251bWJlcicgJiYgb3B0cy5pbmRlbnQgPiAwKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAkam9pbi5jYWxsKEFycmF5KG9wdHMuaW5kZW50ICsgMSksICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGJhc2VJbmRlbnQsXG4gICAgICAgIHByZXY6ICRqb2luLmNhbGwoQXJyYXkoZGVwdGggKyAxKSwgYmFzZUluZGVudClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkge1xuICAgIGlmICh4cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gICAgdmFyIGxpbmVKb2luZXIgPSAnXFxuJyArIGluZGVudC5wcmV2ICsgaW5kZW50LmJhc2U7XG4gICAgcmV0dXJuIGxpbmVKb2luZXIgKyAkam9pbi5jYWxsKHhzLCAnLCcgKyBsaW5lSm9pbmVyKSArICdcXG4nICsgaW5kZW50LnByZXY7XG59XG5cbmZ1bmN0aW9uIGFyck9iaktleXMob2JqLCBpbnNwZWN0KSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmopO1xuICAgIHZhciB4cyA9IFtdO1xuICAgIGlmIChpc0Fycikge1xuICAgICAgICB4cy5sZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeHNbaV0gPSBoYXMob2JqLCBpKSA/IGluc3BlY3Qob2JqW2ldLCBvYmopIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN5bXMgPSB0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJyA/IGdPUFMob2JqKSA6IFtdO1xuICAgIHZhciBzeW1NYXA7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHN5bU1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHN5bXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHN5bU1hcFsnJCcgKyBzeW1zW2tdXSA9IHN5bXNba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgaWYgKCFoYXMob2JqLCBrZXkpKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChpc0FyciAmJiBTdHJpbmcoTnVtYmVyKGtleSkpID09PSBrZXkgJiYga2V5IDwgb2JqLmxlbmd0aCkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMgJiYgc3ltTWFwWyckJyArIGtleV0gaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBzaGFtbWVkIFN5bWJvbHMsIHdoaWNoIGFyZSBzdG9yZWQgYXMgc3RyaW5ncywgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGtleSBzZWN0aW9uXG4gICAgICAgICAgICBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmICgkdGVzdC5jYWxsKC9bXlxcdyRdLywga2V5KSkge1xuICAgICAgICAgICAgeHMucHVzaChpbnNwZWN0KGtleSwgb2JqKSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhzLnB1c2goa2V5ICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN5bXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VudW1lcmFibGUuY2FsbChvYmosIHN5bXNbal0pKSB7XG4gICAgICAgICAgICAgICAgeHMucHVzaCgnWycgKyBpbnNwZWN0KHN5bXNbal0pICsgJ106ICcgKyBpbnNwZWN0KG9ialtzeW1zW2pdXSwgb2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHhzO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC9pbmRleC5qcz8iKTt9LDU3OTg6bW9kdWxlPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanM/Iik7fSwxMjk6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBzdHJpbmdpZnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyNjEpO1xudmFyIHBhcnNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MjM1KTtcbnZhciBmb3JtYXRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nzk4KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcz8iKTt9LDUyMzU6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciB1dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oMjc2OSk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93U3BhcnNlOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBpbnRlcnByZXROdW1lcmljRW50aXRpZXMgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcXGQrKTsvZywgZnVuY3Rpb24gKCQwLCBudW1iZXJTdHIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtYmVyU3RyLCAxMCkpO1xuICAgIH0pO1xufTtcblxudmFyIHBhcnNlQXJyYXlWYWx1ZSA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIG9wdGlvbnMuY29tbWEgJiYgdmFsLmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB2YWwuc3BsaXQoJywnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gVGhpcyBpcyB3aGF0IGJyb3dzZXJzIHdpbGwgc3VibWl0IHdoZW4gdGhlIOKckyBjaGFyYWN0ZXIgb2NjdXJzIGluIGFuXG4vLyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSBhbmQgdGhlIGVuY29kaW5nIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmdcbi8vIHRoZSBmb3JtIGlzIGlzby04ODU5LTEsIG9yIHdoZW4gdGhlIHN1Ym1pdHRlZCBmb3JtIGhhcyBhbiBhY2NlcHQtY2hhcnNldFxuLy8gYXR0cmlidXRlIG9mIGlzby04ODU5LTEuIFByZXN1bWFibHkgYWxzbyB3aXRoIG90aGVyIGNoYXJzZXRzIHRoYXQgZG8gbm90IGNvbnRhaW5cbi8vIHRoZSDinJMgY2hhcmFjdGVyLCBzdWNoIGFzIHVzLWFzY2lpLlxudmFyIGlzb1NlbnRpbmVsID0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0InOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JylcblxuLy8gVGhlc2UgYXJlIHRoZSBwZXJjZW50LWVuY29kZWQgdXRmLTggb2N0ZXRzIHJlcHJlc2VudGluZyBhIGNoZWNrbWFyaywgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGlzIHV0Zi04IGVuY29kZWQuXG52YXIgY2hhcnNldFNlbnRpbmVsID0gJ3V0Zjg9JUUyJTlDJTkzJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuXG52YXIgcGFyc2VWYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nVmFsdWVzKHN0ciwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShwYXJ0LnNsaWNlKHBvcyArIDEpLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydC5pbmRleE9mKCdbXT0nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSBpc0FycmF5KHZhbCkgPyBbdmFsXSA6IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICB2YXIgbGVhZiA9IHZhbHVlc1BhcnNlZCA/IHZhbCA6IHBhcnNlQXJyYXlWYWx1ZSh2YWwsIG9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBvYmo7XG4gICAgICAgIHZhciByb290ID0gY2hhaW5baV07XG5cbiAgICAgICAgaWYgKHJvb3QgPT09ICdbXScgJiYgb3B0aW9ucy5wYXJzZUFycmF5cykge1xuICAgICAgICAgICAgb2JqID0gW10uY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChjbGVhblJvb3QsIDEwKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wYXJzZUFycmF5cyAmJiBjbGVhblJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMucGFyc2VBcnJheXMgJiYgaW5kZXggPD0gb3B0aW9ucy5hcnJheUxpbWl0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICAgICAgb2JqW2luZGV4XSA9IGxlYWY7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNsZWFuUm9vdCAhPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICBvYmpbY2xlYW5Sb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGp1c3QgYWRkIHdoYXRldmVyIGlzIGxlZnRcblxuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgIGtleXMucHVzaCgnWycgKyBrZXkuc2xpY2Uoc2VnbWVudC5pbmRleCkgKyAnXScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZU9iamVjdChrZXlzLCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCk7XG59O1xuXG52YXIgbm9ybWFsaXplUGFyc2VPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlY29kZXIgIT09IG51bGwgJiYgb3B0cy5kZWNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdHMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFsbG93U3BhcnNlOiB0eXBlb2Ygb3B0cy5hbGxvd1NwYXJzZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1NwYXJzZSA6IGRlZmF1bHRzLmFsbG93U3BhcnNlLFxuICAgICAgICBhcnJheUxpbWl0OiB0eXBlb2Ygb3B0cy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWE6IHR5cGVvZiBvcHRzLmNvbW1hID09PSAnYm9vbGVhbicgPyBvcHRzLmNvbW1hIDogZGVmYXVsdHMuY29tbWEsXG4gICAgICAgIGRlY29kZXI6IHR5cGVvZiBvcHRzLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0cy5kZWxpbWl0ZXIpID8gb3B0cy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXIsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvbiwgbm8tZXh0cmEtcGFyZW5zXG4gICAgICAgIGRlcHRoOiAodHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInIHx8IG9wdHMuZGVwdGggPT09IGZhbHNlKSA/ICtvcHRzLmRlcHRoIDogZGVmYXVsdHMuZGVwdGgsXG4gICAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBvcHRzLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlLFxuICAgICAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IHR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgOiBkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMsXG4gICAgICAgIHBhcmFtZXRlckxpbWl0OiB0eXBlb2Ygb3B0cy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQsXG4gICAgICAgIHBhcnNlQXJyYXlzOiBvcHRzLnBhcnNlQXJyYXlzICE9PSBmYWxzZSxcbiAgICAgICAgcGxhaW5PYmplY3RzOiB0eXBlb2Ygb3B0cy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdHMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyLCBvcHRzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cyk7XG5cbiAgICBpZiAoc3RyID09PSAnJyB8fCBzdHIgPT09IG51bGwgfHwgdHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIH1cblxuICAgIHZhciB0ZW1wT2JqID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIDogc3RyO1xuICAgIHZhciBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBhbmQgc2V0dXAgdGhlIG5ldyBvYmplY3RcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGVtcE9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICB2YXIgbmV3T2JqID0gcGFyc2VLZXlzKGtleSwgdGVtcE9ialtrZXldLCBvcHRpb25zLCB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd1NwYXJzZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5jb21wYWN0KG9iaik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanM/Iik7fSw4MjYxOihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgZ2V0U2lkZUNoYW5uZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NzgpO1xudmFyIHV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzY5KTtcbnZhciBmb3JtYXRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nzk4KTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBjb21tYTogJ2NvbW1hJyxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBpZiAoZW5jb2RlVmFsdWVzT25seSAmJiBlbmNvZGVyKSB7XG4gICAgICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGVuY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIG9iaktleXMgPSBbeyB2YWx1ZTogb2JqLmxlbmd0aCA+IDAgPyBvYmouam9pbignLCcpIHx8IG51bGwgOiB2b2lkIHVuZGVmaW5lZCB9XTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIHZhciBhZGp1c3RlZFByZWZpeCA9IGNvbW1hUm91bmRUcmlwICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAxID8gcHJlZml4ICsgJ1tdJyA6IHByZWZpeDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBrZXkudmFsdWUgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBrZXlQcmVmaXggPSBpc0FycmF5KG9iailcbiAgICAgICAgICAgID8gdHlwZW9mIGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdmdW5jdGlvbicgPyBnZW5lcmF0ZUFycmF5UHJlZml4KGFkanVzdGVkUHJlZml4LCBrZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKTtcblxuICAgICAgICBzaWRlQ2hhbm5lbC5zZXQob2JqZWN0LCBzdGVwKTtcbiAgICAgICAgdmFyIHZhbHVlU2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgICAgICB2YWx1ZVNpZGVDaGFubmVsLnNldChzZW50aW5lbCwgc2lkZUNoYW5uZWwpO1xuICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5UHJlZml4LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5ICYmIGlzQXJyYXkob2JqKSA/IG51bGwgOiBlbmNvZGVyLFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgY2hhcnNldCxcbiAgICAgICAgICAgIHZhbHVlU2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZFF1ZXJ5UHJlZml4OiB0eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hZGRRdWVyeVByZWZpeCA6IGRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LFxuICAgICAgICBhbGxvd0RvdHM6IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzLFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZXI6IHR5cGVvZiBvcHRzLmVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmVuY29kZXIgOiBkZWZhdWx0cy5lbmNvZGVyLFxuICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5OiB0eXBlb2Ygb3B0cy5lbmNvZGVWYWx1ZXNPbmx5ID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZVZhbHVlc09ubHkgOiBkZWZhdWx0cy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAob3B0cyAmJiAnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gJ2luZGljZXMnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW2FycmF5Rm9ybWF0XTtcbiAgICBpZiAob3B0cyAmJiAnY29tbWFSb3VuZFRyaXAnIGluIG9wdHMgJiYgdHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXAgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY29tbWFSb3VuZFRyaXBgIG11c3QgYmUgYSBib29sZWFuLCBvciBhYnNlbnQnKTtcbiAgICB9XG4gICAgdmFyIGNvbW1hUm91bmRUcmlwID0gZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBvcHRzICYmIG9wdHMuY29tbWFSb3VuZFRyaXA7XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgICAgICBvYmpLZXlzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgICB9XG5cbiAgICB2YXIgc2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlID8gb3B0aW9ucy5lbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5zb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0RvdHMsXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0dGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgb3B0aW9ucy5jaGFyc2V0LFxuICAgICAgICAgICAgc2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKSwgdGhlIFwibnVtZXJpYyBlbnRpdHlcIiByZXByZXNlbnRhdGlvbiBvZiBhIGNoZWNrbWFya1xuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JUUyJTlDJTkzJic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi9zdHJpbmdpZnkuanM/Iik7fSwyNzY5Oihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgZm9ybWF0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTc5OCk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIC8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCwga2luZCwgZm9ybWF0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSBzdHI7XG4gICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyaW5nID0gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIC8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuICAgICAgICBvdXQgKz0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbnZhciBtYXliZU1hcCA9IGZ1bmN0aW9uIG1heWJlTWFwKHZhbCwgZm4pIHtcbiAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZuKHZhbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICAgIHJldHVybiBmbih2YWwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtYXliZU1hcDogbWF5YmVNYXAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanM/Iik7fSw3NzcxOihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuXG52YXIgR2V0SW50cmluc2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTApO1xudmFyIGRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjI5Nik7XG52YXIgaGFzRGVzY3JpcHRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNDQpKCk7XG52YXIgZ09QRCA9IF9fd2VicGFja19yZXF1aXJlX18oNzI5Nik7XG5cbnZhciAkVHlwZUVycm9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDUzKTtcbnZhciAkZmxvb3IgPSBHZXRJbnRyaW5zaWMoJyVNYXRoLmZsb29yJScpO1xuXG4vKiogQHR5cGVkZWYgeyguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd259IEZ1bmMgKi9cblxuLyoqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmMgPSBGdW5jPihmbjogVCwgbGVuZ3RoOiBudW1iZXIsIGxvb3NlPzogYm9vbGVhbikgPT4gVH0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2V0RnVuY3Rpb25MZW5ndGgoZm4sIGxlbmd0aCkge1xuXHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BmbmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fVxuXHRpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ251bWJlcicgfHwgbGVuZ3RoIDwgMCB8fCBsZW5ndGggPiAweEZGRkZGRkZGIHx8ICRmbG9vcihsZW5ndGgpICE9PSBsZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyJyk7XG5cdH1cblxuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAhIWFyZ3VtZW50c1syXTtcblxuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdHZhciBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSB0cnVlO1xuXHRpZiAoJ2xlbmd0aCcgaW4gZm4gJiYgZ09QRCkge1xuXHRcdHZhciBkZXNjID0gZ09QRChmbiwgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoZGVzYyAmJiAhZGVzYy53cml0YWJsZSkge1xuXHRcdFx0ZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgfHwgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlIHx8ICFsb29zZSkge1xuXHRcdGlmIChoYXNEZXNjcmlwdG9ycykge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoLCB0cnVlLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVmaW5lKC8qKiBAdHlwZSB7UGFyYW1ldGVyczxkZWZpbmU+WzBdfSAqLyAoZm4pLCAnbGVuZ3RoJywgbGVuZ3RoKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZuO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvc2V0LWZ1bmN0aW9uLWxlbmd0aC9pbmRleC5qcz8iKTt9LDc0Nzg6KG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbnZhciBHZXRJbnRyaW5zaWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMCk7XG52YXIgY2FsbEJvdW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTI0KTtcbnZhciBpbnNwZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MzEpO1xuXG52YXIgJFR5cGVFcnJvciA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ1Myk7XG52YXIgJFdlYWtNYXAgPSBHZXRJbnRyaW5zaWMoJyVXZWFrTWFwJScsIHRydWUpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuLypcbiogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleS5cbipcbiogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZCBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIHRyYXZlcnNlIHRoZSB3aG9sZSBsaXN0LiBCeSBkb2luZyBzbywgYWxsIHRoZSByZWNlbnRseSB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4qL1xudmFyIGxpc3RHZXROb2RlID0gZnVuY3Rpb24gKGxpc3QsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdGZvciAodmFyIHByZXYgPSBsaXN0LCBjdXJyOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdGN1cnIubmV4dCA9IGxpc3QubmV4dDtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG59O1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHR2YXIgJHdtO1xuXHR2YXIgJG07XG5cdHZhciAkbztcblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBub2RlOiB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzPyIpO30sNzAyNjptb2R1bGU9PnsidXNlIHN0cmljdCI7ZXZhbCgiXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy93cy9icm93c2VyLmpzPyIpO30sNDY1NDooKT0+e2V2YWwoIi8qIChpZ25vcmVkKSAqL1xuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi91dGlsLmluc3BlY3RfKGlnbm9yZWQpPyIpO30sNDgzNjptb2R1bGU9PntldmFsKCdmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgICJkZWZhdWx0Ijogb2JqXG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcz8nKTt9LDg2OTg6bW9kdWxlPT57ZXZhbCgnZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7XG5cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cztcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vQGd1ZGh1Yi9jb3JlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzPycpO30sMjUzODooX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pPT57InVzZSBzdHJpY3QiO2V2YWwoIlxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL2NvbmZpZy5qc1xuY29uc3Qgc2VydmVyX3VybCA9IFwiaHR0cHM6Ly9ndWRodWIuY29tL0d1ZEh1Yl9UZXN0XCI7XG4vL2V4cG9ydCBjb25zdCBzZXJ2ZXJfdXJsID0gXCJodHRwczovL2d1ZGh1Yi5jb20vR3VkSHViX1RlbXBcIjtcbi8vZXhwb3J0IGNvbnN0IHNlcnZlcl91cmwgPSBcImh0dHBzOi8vaW50ZWdyYXRpb24uZ3VkaHViLmNvbS9HdWRIdWJfVGVzdFwiO1xuLy9leHBvcnQgY29uc3Qgc2VydmVyX3VybCA9IFwiaHR0cDovL2xvY2FsaG9zdDo5MDAwXCI7XG5jb25zdCB3c3NfdXJsID0gXCJ3c3M6Ly9ndWRodWIuY29tL0d1ZEh1Yi93cy9hcHAvXCI7XG5jb25zdCBub2RlX3NlcnZlcl91cmwgPSBcImh0dHBzOi8vZ3VkaHViLmNvbS9hcGkvc2VydmljZXMvcHJvZFwiO1xuY29uc3QgYXN5bmNfbW9kdWxlc19wYXRoID0gJ2J1aWxkL2xhdGVzdC9hc3luY19tb2R1bGVzX25vZGUvJztcbmNvbnN0IGF1dG9tYXRpb25fbW9kdWxlc19wYXRoID0gJ2J1aWxkL2xhdGVzdC9hdXRvbWF0aW9uX21vZHVsZXMvJztcbmNvbnN0IGZpbGVfc2VydmVyX3VybCA9ICdodHRwczovL2d1ZGh1Yi5jb20nO1xuY29uc3QgY2FjaGVfY2h1bmtfcmVxdWVzdHMgPSB0cnVlO1xuY29uc3QgY2FjaGVfYXBwX3JlcXVlc3RzID0gdHJ1ZTtcblxuLy8gRk9SIFRFU1RTXG5jb25zdCBwb3J0ID0gOTAwMDtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9HVURIVUIvY29uc3RzLmpzXG52YXIgY29uc3RzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzgpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0RhdGFTZXJ2aWNlLmpzXG5jbGFzcyBEYXRhU2VydmljZSB7fVxuO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0FwcERhdGFTZXJ2aWNlLmpzXG5cblxuXG4vL1RPRE8gcHJvY2Vzc1JlcXVlc3RlZEFwcCBzaG91bGQgYmUgY2hlY2tlZCB0aGF0IGFsbCBjb2RlIGlzIG9rICEhISEhISEhISEhISEhISEgSXZlIG5vdCBlbmRlZCBjaGVja2luZ1xuXG5jbGFzcyBBcHBEYXRhU2VydmljZSBleHRlbmRzIERhdGFTZXJ2aWNlIHtcbiAgLy9pbnRlcmZhY2UgZm9yIGluZGV4ZWRkYiBhbmQgaHR0cCBzZXJ2aWNlc1xuXG4gIGNvbnN0cnVjdG9yKHJlcSwgY29uZiwgZ3VkaHViKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNodW5rRGF0YVNlcnZpY2UgPSBuZXcgZXhwb3J0X0NodW5rRGF0YVNlcnZpY2UocmVxLCBjaHVua0RhdGFTZXJ2aWNlQ29uZiwgZ3VkaHViKTtcbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgfVxuICBpc1dpdGhDYWNoZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvL2hlcmVcbiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3RlZEFwcChpZCwgc2VudERhdGEpIHtcbiAgICAvLyBsZXQgXG5cbiAgICAvLyBsZXQgY2h1bmtzSGFzaGVzVG9Mb2FkID0gc2VudERhdGEuY2h1bmtzO1xuXG4gICAgLy8gbGV0IGNodW5rcyA9IFtdO1xuXG4gICAgLy8gaWYgKFxuICAgIC8vICAgICB0aGlzLmNodW5rRGF0YVNlcnZpY2UuaXNXaXRoQ2FjaGUoKVxuICAgIC8vICkge1xuXG4gICAgLy8gICAgIGxldCBjYWNoZWRNZXJnZWRDaHVua0RhdGEgPSB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkKGlkKTtcblxuICAgIC8vIH1cblxuICAgIC8vIGFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHdpdGhvdXQgY2FjaGUgZm9yIG5vd1xuICAgIGlmICghdGhpcy5pc1dpdGhDYWNoZSgpKSB7XG4gICAgICAvLyBsZXQgcmVzdWx0ZWRNZXJnZWRDaHVua3MgPSB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0TWVyZ2VkQ2h1bmsoaWQsIHNlbnREYXRhLmNodW5rcyk7XG5cbiAgICAgIC8vL1RPRE8gaGVyZSBjaHVua3MgY291bGQgYmUgd2l0aCBjYWNoZSB0b29cblxuICAgICAgLy8gICBhc3luYyBnZXRDaHVua3MoYXBwX2lkLCBjaHVua19pZHMpIHtcbiAgICAgIC8vICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAvLyAgICAgaWYoY2h1bmtfaWRzKXtcbiAgICAgIC8vICAgICAgIGNodW5rcyA9IGF3YWl0IFByb21pc2UuYWxsKGNodW5rX2lkcy5tYXAoKGNodW5rX2lkKSA9PiB0aGlzLmdldENodW5rKGFwcF9pZCwgY2h1bmtfaWQpKSk7XG4gICAgICAvLyAgICAgfVxuICAgICAgLy8gICAgIHJldHVybiBjaHVua3M7XG4gICAgICAvLyAgIH1cblxuICAgICAgLy8gbGV0IHJlcyA9IGF3YWl0IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDaHVua3MoaWQsIHNlbnREYXRhLmNodW5rcyk7XG4gICAgICAvLyBsZXQgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoc2VudERhdGEuY2h1bmtzLm1hcCgoY2h1bmtfaWQpID0+IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDaHVuayhpZCwgY2h1bmtfaWQpKSk7XG5cbiAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0TWVyZ2VkQ2h1bmtGb3JJRExpc3QoaWQsIHNlbnREYXRhLmNodW5rcyk7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHNlbnREYXRhLml0ZW1zX2xpc3QgPSBhd2FpdCB0aGlzLmd1ZGh1Yi51dGlsLm1lcmdlQ2h1bmtzKFtyZXMsIHNlbnREYXRhXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmICghcmVzKSByZXMgPSBbXTtcblxuICAgICAgLy9UT0RPIHNob3VsZCBiZSBpbiBuZXcgdGhyZWFkIHRvbyBldmVuIGZvciBOb2RlLmpzIGJlY2F1c2VzIHRoaXMgd2lsbCBibG9jayBsb29wXG5cbiAgICAgIC8vIHNlbnREYXRhLml0ZW1zX2xpc3QgPSBhd2FpdCB0aGlzLmd1ZGh1Yi51dGlsLm1lcmdlQ2h1bmtzKFtcbiAgICAgIC8vICAgICAuLi5yZXMsXG4gICAgICAvLyAgICAgc2VudERhdGEsXG4gICAgICAvLyBdKTtcblxuICAgICAgcmV0dXJuIHNlbnREYXRhO1xuXG4gICAgICAvLyAgIHRoaXMuZGF0YVNlcnZpY2UucHV0QXBwKGlkLCBuZXh0VmVyc2lvbik7XG5cbiAgICAgIC8vIHJldHVybiB0aGlzLm1lcmdlQW5kUmV0dXJuU3RyYXRlZ3kuaGFuZGxlKHNlbnREYXRhLCBjaHVua3MpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIHRyeSB7XG4gICAgICAvLyDRjyDRgtCw0Lwg0YHQvtCx0LjRgNCw0Y7RgdGMINGB0LrQu9C10LjQstCw0YLRjCDQstGB0LUg0LTQsNC90L3Ri9C1INCyINGN0YLQvtC8INC80LXRgtC+0LTQtSwg0L3QsNC00L4g0L/QvtGB0LzQvtGC0YDQtdGC0Ywg0L3QtSDQsdGD0LTQtdGCINC70Lgg0L/RgNC+0LHQu9C10Lwg0LTQu9GPINC90L7QtNGLINC40YLQvyDRgtCw0Lwg0YLQvtC20LUgcHJvY2VzcyDQstGL0LfRi9Cy0LDQtdGC0YHRj1xuICAgICAgbGV0IGNhY2hlZEFwcCA9IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkKGlkKTsgLy8gdGhpcyBzaG91bGQgYmUgbWVyZ2VkIGNodW5rICsgYXBwIGZyb20gZGJcblxuICAgICAgLy8gaWYgKFxuICAgICAgLy8gICAgIHRoaXMuY2h1bmtEYXRhU2VydmljZS5pc1dpdGhDYWNoZSgpXG4gICAgICAvLyApIHtcbiAgICAgIC8vICAgICBsZXQgY2FjaGVkTWVyZ2VkQ2h1bmsgPSB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkKCk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIGxldCByZXMgPSBhd2FpdCB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0TWVyZ2VkQ2h1bmtGb3JJRExpc3QoaWQsIHNlbnREYXRhLmNodW5rcyk7XG5cbiAgICAgIC8vIGxldCBjYWNoZWRNZXJnZWRDaHVuayA9IGF3YWl0IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDYWNoZWRNZXJnZWRDaHVuayhpZCwgY2FjaGVkQXBwLmNodW5rcyk7XG5cbiAgICAgIGlmICghY2FjaGVkQXBwXG4gICAgICAvLyBjYWNoZWRNZXJnZWRDaHVuayA/XG4gICAgICApIHtcbiAgICAgICAgLy9UT0RPIG1heWJlIGRvbnQgd2FpdCBmb3IgY2h1bmtzIGF0IGZpcnN0IGxvYWRcblxuICAgICAgICAvLyBsZXQgcmVzID0gYXdhaXQgdGhpcy5jaHVua0RhdGFTZXJ2aWNlLmdldENodW5rcyhpZCwgc2VudERhdGEuY2h1bmtzKTtcbiAgICAgICAgLy8gbGV0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHNlbnREYXRhLmNodW5rcy5tYXAoKGNodW5rX2lkKSA9PiB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0Q2h1bmsoaWQsIGNodW5rX2lkKSkpO1xuICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5jaHVua0RhdGFTZXJ2aWNlLmdldE1lcmdlZENodW5rRm9ySURMaXN0KGlkLCBzZW50RGF0YS5jaHVua3MpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgc2VudERhdGEuaXRlbXNfbGlzdCA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW3Jlcywgc2VudERhdGFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMucHV0SW5DYWNoZShpZCwgc2VudERhdGEpO1xuXG4gICAgICAgIHJldHVybiBzZW50RGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gbGV0IG5ld0hhc2hlc0xpc3QgPSBzZW50RGF0YS5jaHVua3MuZmlsdGVyKGMgPT4gIWNhY2hlZEFwcC5jaHVua3MuaW5jbHVkZXMoYykpO1xuXG4gICAgICAvLyBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIGxldCByZXMgPSBhd2FpdCB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0Q2h1bmtzKGlkLCBuZXdIYXNoZXNMaXN0KTtcbiAgICAgIC8vIGxldCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChuZXdIYXNoZXNMaXN0Lm1hcCgoY2h1bmtfaWQpID0+IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDaHVuayhpZCwgY2h1bmtfaWQpKSk7XG5cbiAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkTWVyZ2VkQ2h1bmsoaWQsIGNhY2hlZEFwcC5jaHVua3MpO1xuXG4gICAgICAvLyBpZiAoIXJlcykgcmVzID0gW107XG5cbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgc2VudERhdGEuaXRlbXNfbGlzdCA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW2NhY2hlZEFwcCwgcmVzLCBzZW50RGF0YV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VudERhdGEuaXRlbXNfbGlzdCA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW2NhY2hlZEFwcCwgc2VudERhdGFdKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhpcy5jaHVua0RhdGFTZXJ2aWNlLmdldENodW5rcyhpZCwgbmV3SGFzaGVzTGlzdCkudGhlbigocmVzKSA9PiB7XG5cbiAgICAgIC8vVE9ETyBjaGVjayB0aGlzIGZvciBBcHBIdHRwU2VydmljZSwgc2VlbXMgaXNudCBuZWNlc3NhcnlcbiAgICAgIC8vIHRoaXMuZ3VkaHViLnRyaWdnZXJBcHBDaGFuZ2UoaWQsIGNhY2hlZFZlcnNpb24sIHNlbnREYXRhKTtcblxuICAgICAgLy8gc2VsZi5wdXRJbkNhY2hlKGlkLCBzZW50RGF0YSk7XG4gICAgICAvLyB9KTtcblxuICAgICAgcmV0dXJuIHNlbnREYXRhO1xuXG4gICAgICAvLyByZXR1cm4gY2FjaGVkVmVyc2lvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gc2VlbXMgdHJ5IGNhdGNoIGhlcmUgaXNudCBoYW5kbGluZyBhbG1vc3QgYW55dGhpbmcsIGFsbW9zdCBpZGVudGljYWwgY29kZSBoZXJlXG5cbiAgICAgIC8vIHJlcyA9IGF3YWl0IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDaHVua3MoaWQsIHNlbnREYXRhLmNodW5rcyk7XG4gICAgICAvLyBsZXQgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoc2VudERhdGEuY2h1bmtzLm1hcCgoY2h1bmtfaWQpID0+IHRoaXMuY2h1bmtEYXRhU2VydmljZS5nZXRDaHVuayhpZCwgY2h1bmtfaWQpKSk7XG4gICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5jaHVua0RhdGFTZXJ2aWNlLmdldE1lcmdlZENodW5rRm9ySURMaXN0KHNlbnREYXRhLmNodW5rcyk7XG5cbiAgICAgIC8vIGlmICghcmVzKSByZXMgPSBbXTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICBzZW50RGF0YS5pdGVtc19saXN0ID0gYXdhaXQgdGhpcy5ndWRodWIudXRpbC5tZXJnZUNodW5rcyhbcmVzLCBzZW50RGF0YV0pO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGlzLnB1dEluQ2FjaGUoaWQsIHNlbnREYXRhKTtcblxuICAgICAgcmV0dXJuIHNlbnREYXRhO1xuICAgIH1cbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL2FwaS9BcHBBcGkuanNcbmNsYXNzIEFwcEFQSSB7XG4gIGNvbnN0cnVjdG9yKHJlcSkge1xuICAgIHRoaXMucmVxID0gcmVxO1xuICB9XG4gIGFzeW5jIGdldEFwcChhcHBfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuZ2V0KHtcbiAgICAgIHVybDogYC9hcGkvYXBwL2dldGAsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgYXBwX2lkOiBhcHBfaWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL3V0aWxzLmpzXG5sZXQgb2JqZWN0QXNzaWduV2l0aG91dE92ZXJyaWRlID0gKHRhcmdldCwgLi4uc291cmNlTGlzdCkgPT4ge1xuICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlTGlzdCkge1xuICAgIGlmICghc291cmNlKSBjb250aW51ZTtcbiAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgLy90aGlzIGRvZXNudCBpdGVyYXRlIG92ZXIgY2xhc3MgbGlrZSBzb3VyY2UgcHJvcGVydGllc1xuICAgICAgaWYgKCEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgLy9jaGVja3Mgb3duIGFuZCBpbmhlcml0ZWQga2V5cywgd29ya3MgZmluZSBhbHNvIGZvciBjbGFzcyBwcm90b3R5cGVzIGFuZCBpbnN0YW5jZXNcbiAgICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpO1xuICAgICAgICBpZiAoZGVzYy5lbnVtZXJhYmxlKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmxldCBvYmplY3RBc3NpZ25XaXRoT3ZlcnJpZGUgPSAodGFyZ2V0LCAuLi5zb3VyY2VMaXN0KSA9PiB7XG4gIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VMaXN0KSB7XG4gICAgaWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICAvL3RoaXMgZG9lc250IGl0ZXJhdGUgb3ZlciBjbGFzcyBsaWtlIHNvdXJjZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSk7XG4gICAgICBpZiAoZGVzYy5lbnVtZXJhYmxlKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgfVxufTtcbmxldCBjaGVja0luc3RhbmNlTW9kaWZpZXIgPSAodGFyZ2V0LCAuLi5zb3VyY2VMaXN0KSA9PiB7XG4gIGZvciAobGV0IHNvdXJjZSBvZiBzb3VyY2VMaXN0KSB7XG4gICAgaWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICAvL3RoaXMgZG9lc250IGl0ZXJhdGUgb3ZlciBjbGFzcyBsaWtlIHNvdXJjZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSk7XG4gICAgICBpZiAoZGVzYy5lbnVtZXJhYmxlKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gICAvLyBCYXNlIGNsYXNzZXNcbi8vIGNsYXNzIEluZGV4ZWREQk1peGluIHtcbi8vICAgY29uc3RydWN0b3IoZGJOYW1lLCB2ZXJzaW9uKSB7XG4vLyAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcbi8vICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4vLyAgICAgICB0aGlzLmRiUHJvbWlzZSA9IHRoaXMub3BlbkNvbm5lY3Rpb24oKTtcbi8vICAgfVxuXG4vLyAgIG9wZW5Db25uZWN0aW9uKCkge1xuLy8gICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbi8vICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMudmVyc2lvbik7XG5cbi8vICAgICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuLy8gICAgICAgICAgICAgICBjb25zdCBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4vLyAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygnc3RvcmVOYW1lJykpIHtcbi8vICAgICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdzdG9yZU5hbWUnLCB7IGtleVBhdGg6ICdpZCcgfSk7XG4vLyAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICB9O1xuXG4vLyAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQpID0+IHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4vLyAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50KSA9PiByZWplY3QoZXZlbnQudGFyZ2V0LmVycm9yKTtcbi8vICAgICAgIH0pO1xuLy8gICB9XG5cbi8vICAgYXN5bmMgZ2V0REIoKSB7XG4vLyAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kYlByb21pc2U7XG4vLyAgIH1cblxuLy8gICBhc3luYyBhZGRSZWNvcmQoc3RvcmVOYW1lLCByZWNvcmQpIHtcbi8vICAgICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5nZXREQigpO1xuLy8gICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbi8vICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgJ3JlYWR3cml0ZScpO1xuLy8gICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbi8vICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuYWRkKHJlY29yZCk7XG5cbi8vICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuLy8gICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbi8vICAgICAgIH0pO1xuLy8gICB9XG5cbi8vICAgYXN5bmMgZ2V0UmVjb3JkKHN0b3JlTmFtZSwga2V5KSB7XG4vLyAgICAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZ2V0REIoKTtcbi8vICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4vLyAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsICdyZWFkb25seScpO1xuLy8gICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbi8vICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG5cbi8vICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuLy8gICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbi8vICAgICAgIH0pO1xuLy8gICB9XG4vLyB9XG5cbi8vIGNsYXNzIExvZ2dpbmdNaXhpbiB7XG4vLyAgIGxvZyhtZXNzYWdlKSB7XG4vLyAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbi8vICAgfVxuXG4vLyAgIGVycm9yKG1lc3NhZ2UpIHtcbi8vICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4vLyAgIH1cbi8vIH1cblxuLy8gLy8gTWl4aW4gZnVuY3Rpb25cbi8vIGZ1bmN0aW9uIGFwcGx5TWl4aW5zKHRhcmdldENsYXNzLCBiYXNlQ2xhc3Nlcykge1xuLy8gICBiYXNlQ2xhc3Nlcy5mb3JFYWNoKGJhc2VDbGFzcyA9PiB7XG4vLyAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhiYXNlQ2xhc3MucHJvdG90eXBlKS5mb3JFYWNoKGRlc2NyaXB0b3IgPT4ge1xuLy8gICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRDbGFzcy5wcm90b3R5cGUsIGRlc2NyaXB0b3JbMF0sIGRlc2NyaXB0b3JbMV0pO1xuLy8gICAgICAgfSk7XG4vLyAgIH0pO1xuLy8gfVxuXG4vLyAvLyBDb21iaW5lZCBjbGFzc1xuLy8gY2xhc3MgRW5oYW5jZWRJbmRleGVkREIgZXh0ZW5kcyBJbmRleGVkREJNaXhpbiB7XG4vLyAgIGNvbnN0cnVjdG9yKGRiTmFtZSwgdmVyc2lvbikge1xuLy8gICAgICAgc3VwZXIoZGJOYW1lLCB2ZXJzaW9uKTtcbi8vICAgfVxuLy8gfVxuXG4vLyAvLyBBcHBseSBtaXhpbnNcbi8vIGFwcGx5TWl4aW5zKEVuaGFuY2VkSW5kZXhlZERCLCBbTG9nZ2luZ01peGluXSk7XG5cbi8vIC8vIFVzYWdlIGV4YW1wbGVcbi8vIGNvbnN0IGRiRmFjYWRlID0gbmV3IEVuaGFuY2VkSW5kZXhlZERCKCdteURhdGFiYXNlJywgMSk7XG5cbi8vIGRiRmFjYWRlLmFkZFJlY29yZCgnc3RvcmVOYW1lJywgeyBpZDogMSwgbmFtZTogJ1NhbXBsZScgfSlcbi8vICAgLnRoZW4oKGlkKSA9PiB7XG4vLyAgICAgICBkYkZhY2FkZS5sb2coJ1JlY29yZCBhZGRlZCB3aXRoIGlkOiAnICsgaWQpO1xuLy8gICB9KVxuLy8gICAuY2F0Y2goKGVycm9yKSA9PiB7XG4vLyAgICAgICBkYkZhY2FkZS5lcnJvcignRXJyb3IgYWRkaW5nIHJlY29yZDogJyArIGVycm9yKTtcbi8vICAgfSk7XG5cbi8vIGRiRmFjYWRlLmdldFJlY29yZCgnc3RvcmVOYW1lJywgMSlcbi8vICAgLnRoZW4oKHJlY29yZCkgPT4ge1xuLy8gICAgICAgZGJGYWNhZGUubG9nKCdSZWNvcmQgcmV0cmlldmVkOiAnICsgSlNPTi5zdHJpbmdpZnkocmVjb3JkKSk7XG4vLyAgIH0pXG4vLyAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbi8vICAgICAgIGRiRmFjYWRlLmVycm9yKCdFcnJvciByZXRyaWV2aW5nIHJlY29yZDogJyArIGVycm9yKTtcbi8vICAgfSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvRGF0YVNlcnZpY2UvaHR0cFNlcnZpY2UvSHR0cFNlcnZpY2UuanNcbmNsYXNzIEh0dHBTZXJ2aWNlIHt9XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvRGF0YVNlcnZpY2UvaHR0cFNlcnZpY2UvQXBwSHR0cFNlcnZpY2UuanNcblxuXG5cblxuXG5jbGFzcyBBcHBIdHRwU2VydmljZSBleHRlbmRzIEFwcERhdGFTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocmVxLCBjb25mLCBndWRodWIpIHtcbiAgICBzdXBlcihyZXEsIGNvbmYsIGd1ZGh1Yik7XG4gICAgdGhpcy5hcHBBcGkgPSBuZXcgQXBwQVBJKHJlcSk7XG4gICAgbGV0IGluZGV4REJTZXJ2aWNlID0gbmV3IEh0dHBTZXJ2aWNlKGNvbmYpO1xuXG4gICAgLy8gICB0aGlzLmNodW5rRGF0YVNlcnZpY2UgPSBuZXcgQ2h1bmtEYXRhU2VydmljZTsgLy9UT0RPIG1vdmUgdG8gXG5cbiAgICBvYmplY3RBc3NpZ25XaXRoT3ZlcnJpZGUodGhpcywgaW5kZXhEQlNlcnZpY2UpO1xuICB9XG4gIGFzeW5jIGdldEFwcChpZCkge1xuICAgIGxldCBzZW50RGF0YSA9IGF3YWl0IHRoaXMuYXBwQXBpLmdldEFwcChpZCk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RlZEFwcChpZCwgc2VudERhdGEpOyAvL1RPRE8gY2hlY2sgaXMgaXQgb2sgdG8gdHJpZ2dlciBjaGFuZ2UgaXNuaWRlIG1ldGhvZCBmb3IgQXBwSHR0cFNlcnZpY2VcbiAgfVxuXG4gIC8vVE9ETyBzaG91bGQgYmUgZ2V0QXBwIGFuZCBnZXRBcHBBbmRQcm9jZXNzRGF0YSAtIHJlZmFjdG9yIHdob2xlIGNvZGUgdG8gdXNlIHRoZW1cblxuICAvL1RPRE8g0LDQvdC00YDQtdC5INCz0L7QstC+0YDQuNC7INC/0YDQviDRgtC+INGH0YLQviDRgtCw0Lwg0L3QsNC00L4g0YTQuNC70YzRgtGA0L7QstCw0YLRjCDQsNC50YLQtdC80Ysg0YPQtNCw0LvQtdC90L3Ri9C1LCDRjyDRgtCw0Log0Lgg0L3QtSDQtNC+0LTQtdC70LDQu1xuXG4gIGFzeW5jIGdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwQXBpLmdldEFwcChpZCk7XG4gIH1cbiAgYXN5bmMgcHV0QXBwKGlkLCBhcHApIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEFwcEh0dHBTZXJ2aWNlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEh0dHBTZXJ2aWNlKSByZXR1cm4gdHJ1ZTsgLy9UT0RPIHJlcXVpcmVzIG11bHRpcGxlIGluaGVyaXRhbmNlLCB0aGhpbmsgaG93IHRvIG92ZXJjb21lIGl0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbjtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvYXBwRGF0YUNvbmYuanNcbi8vIGltcG9ydCB7IGRiTmFtZSB9IGZyb20gXCIuL2NvbnN0cy5qc1wiO1xuXG4vLyBtb3ZlIHRvIGZvbGRlciBhbHNvIHJlbW92ZSBjaHVua3NDb25mXG5cbmNvbnN0IGFwcHNDb25mID0ge1xuICAvLyBkYk5hbWUsXG4gIC8vIGRiVmVyc2lvbixcbiAgc3RvcmU6ICdhcHBzJ1xufTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvY2h1bmtEYXRhQ29uZi5qc1xuLy8gaW1wb3J0IHsgZGJOYW1lLCBkYlZlcnNpb24gfSBmcm9tIFwiLi9jb25zdHMuanNcIjtcblxuY29uc3QgY2h1bmtEYXRhQ29uZl9jaHVua3NDb25mID0ge1xuICAvLyBkYk5hbWUsXG4gIC8vIGRiVmVyc2lvbixcbiAgc3RvcmU6ICdjaHVua3MnXG59O1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0luZGV4ZWREQi9jb25zdHMuanNcbmNvbnN0IGRiTmFtZSA9IFwiZ3VkaHViXCI7XG4vLyBleHBvcnQgY29uc3QgZGJWZXJzaW9uID0gNztcblxuLy90b2RvIGR5bmFtaWMgdmVyc2lvbiBjaGFuZ2UgY2hhdGdwdCB1c2VkLCBtYXliZSBpc250IGdvb2QgdG8gdXNlIHN0YXRpYyAgdmVyc2lvblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0luZGV4ZWREQi9zdG9yZU1hbmFnZXJDb25mL2NodW5rQ2FjaGVTdG9yZU1hbmFnZXJDb25mLmpzXG4vLyBpbXBvcnQgeyBkYk5hbWUsIGRiVmVyc2lvbiB9IGZyb20gXCIuL2NvbnN0cy5qc1wiO1xuXG5jb25zdCBjaHVua3NNZXJnZUNvbmYgPSB7XG4gIC8vIGRiTmFtZSxcbiAgLy8gZGJWZXJzaW9uLFxuICBzdG9yZTogJ2NodW5rc01lcmdlQ2FjaGUnXG59O1xuXG4vL3NlZW1zIGRibmFtZSBhbmQgZGJ2ZXJzaW9uIGFyZW50IHJlcXVpcmVkIGhlcmVcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvSW5kZXhlZERCU2VydmljZS5qc1xuXG5cblxuXG5cbi8vINGN0YLQvtGCINC60LvQsNGB0YEg0LTQu9GPINC90LDRgdC70LXQtNC+0LLQsNC90LjRjyDQsdGL0Lsg0YHQvtC30LTQsNC9LCDRgi7QtS4g0L3QsNC00L4g0L/QvtC00YPQvNCw0YLRjCDQutCw0Log0LXQs9C+INGB0LrQvtC80L/QvtC90L7QstCw0YLRjCDRgSBJbmRleGVkREJNYW5hZ2VyXG5jbGFzcyBJbmRleGVkREJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoY29uZikge1xuICAgIHRoaXMuc3RvcmUgPSBjb25mLnN0b3JlO1xuICAgIHRoaXMuZGJOYW1lID0gY29uZi5kYk5hbWU7XG4gICAgdGhpcy5kYlZlcnNpb24gPSBjb25mLmRiVmVyc2lvbjtcbiAgICB0aGlzLnJlcXVlc3RDYWNoZSA9IG5ldyBNYXAoKTsgLy8gaWQgLT4gcHJvbWlzZSAvLy9UT0RPIHNlZW1zIGlycmVsZXZhbnQgdG8gY2xhc3MgSW5kZXhlZERCTWFuYWdlciAoY291bGQgYmUgcmVuYW1lZCB0byBGYWNhZGUgYWxyZWFkeSlcbiAgfVxufVxuXG4vL01heWJlIHJlbmFtZSB0byBGYWNhZGVcbmNsYXNzIEluZGV4ZWREQk1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcihkYk5hbWUsXG4gIC8vIGRiVmVyc2lvbiwgXG4gIHN0b3JlTmFtZUxpc3QpIHtcbiAgICBpZiAoIUluZGV4ZWREQk1hbmFnZXIuZGJOYW1lVG9JbnN0YW5jZU1hcCkge1xuICAgICAgSW5kZXhlZERCTWFuYWdlci5kYk5hbWVUb0luc3RhbmNlTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBpZiAoSW5kZXhlZERCTWFuYWdlci5kYk5hbWVUb0luc3RhbmNlTWFwLmhhcyhkYk5hbWUpKSByZXR1cm4gSW5kZXhlZERCTWFuYWdlci5kYk5hbWVUb0luc3RhbmNlTWFwLmdldChkYk5hbWUpO1xuICAgIHRoaXMuZGIgPSBudWxsO1xuICAgIC8vIHRoaXMucXVldWUgPSBbXTtcbiAgICAvLyB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7XG4gICAgLy8gdGhpcy5kYlZlcnNpb24gPSBkYlZlcnNpb247XG4gICAgdGhpcy5zdG9yZU5hbWVMaXN0ID0gc3RvcmVOYW1lTGlzdDtcbiAgICAvLyB0aGlzLnN0b3JlTmFtZUxpc3QgPSBbXTtcblxuICAgIEluZGV4ZWREQk1hbmFnZXIuZGJOYW1lVG9JbnN0YW5jZU1hcC5zZXQoZGJOYW1lLCB0aGlzKTtcblxuICAgIC8vIHRoaXMuZGIgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAvLyB9KTtcblxuICAgIC8vIHRoaXMuZGJQcm1zID0gdGhpcy5vcGVuREIoKTtcblxuICAgIHRoaXMuZGIgPSBudWxsO1xuXG4gICAgLy8gdGhpcy5kYiA9IHRoaXMub3BlbkRCKCk7XG5cbiAgICAvLyB0aGlzIFxuXG4gICAgLy8gdGhpcy5vcGVuREIoKTtcbiAgfVxuXG4gIC8vIFRPRE8gYWxzbyByZW1vdmUgb3V0ZGF0ZWQgc3RvcmVzXG4gIGFzeW5jIGNoZWNrQW5kQ3JlYXRlU3RvcmUoc3RvcmVOYW1lKSB7XG4gICAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgaW5kZXhlZERCLmRhdGFiYXNlcygpO1xuICAgIGNvbnN0IGRiSW5mbyA9IGRhdGFiYXNlcy5maW5kKGRiID0+IGRiLm5hbWUgPT09IHRoaXMuZGJOYW1lKTtcbiAgICBsZXQgc3RvcmVFeGlzdHMgPSBmYWxzZTtcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGRiSW5mbykge1xuICAgICAgc3RvcmVFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihzZWxmLmRiTmFtZSk7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKTtcbiAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgIHJlc29sdmUoZXhpc3RzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy9UT0RPIHRyeSBjYXRjaCBmb3IgcHJvbWlzZSByZWplY3RcbiAgICB9XG5cbiAgICBpZiAoIXN0b3JlRXhpc3RzKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oc2VsZi5kYk5hbWUsIGRiSW5mbyA/IGRiSW5mby52ZXJzaW9uICsgMSA6IDEpO1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnN0IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKSkge1xuICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICB9KTtcblxuICAgICAgLy9UT0RPIHRyeSBjYXRjaCBmb3IgcmVqZWN0XG4gICAgfVxuXG4gICAgLy9UT0RPIG1heWJlIG5vdCByZXR1cm4gYW55dGhpbmcgaXQgd2lsbCBiZSBvayBmb3IgcHJvbWlzZSByZXNvbHZlXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAvLyBVc2FnZSBleGFtcGxlXG4gIC8vIGNoZWNrQW5kQ3JlYXRlU3RvcmUoJ215RGF0YWJhc2UnLCAnbXlPYmplY3RTdG9yZScpLnRoZW4oKCkgPT4ge1xuICAvLyAgIGNvbnNvbGUubG9nKCdDaGVjayBhbmQgY3JlYXRpb24gKGlmIG5lY2Vzc2FyeSkgY29tcGxldGUuJyk7XG4gIC8vIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgLy8gICBjb25zb2xlLmVycm9yKCdFcnJvciBjaGVja2luZyBhbmQgY3JlYXRpbmcgb2JqZWN0IHN0b3JlOicsIGVycm9yKTtcbiAgLy8gfSk7XG5cbiAgYXN5bmMgb3BlbkRCKCkge1xuICAgIC8vIFRPRE8gcmVtb3ZlIG91dGRhdGVkIHN0b3JlcyBiZWZvcmUgYWxzb1xuXG4gICAgaWYgKHRoaXMuZGIpIHJldHVybiB0aGlzLmRiO1xuICAgIGxldCByZXNvbHZlciwgcmVqZWN0ZXI7XG4gICAgbGV0IGRiUHJtcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmVyID0gcmVzb2x2ZTtcbiAgICAgIHJlamVjdGVyID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIGZvciAobGV0IHN0b3JlTmFtZSBvZiB0aGlzLnN0b3JlTmFtZUxpc3QpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBbmRDcmVhdGVTdG9yZShzdG9yZU5hbWUpO1xuICAgIH1cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3Blbih0aGlzLmRiTmFtZSwgdGhpcy5kYlZlcnNpb24pO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3Blbih0aGlzLmRiTmFtZSk7XG5cbiAgICAvLyByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgIC8vICAgY29uc3QgZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuXG4gICAgLy8gICB0aGlzLnN0b3JlTmFtZUxpc3QuZm9yRWFjaChzdG9yZU5hbWUgPT4ge1xuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKVxuICAgIC8vICAgICApIHtcbiAgICAvLyAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuXG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiB7XG4gICAgICBzZWxmLmRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgLy8gbGV0IHZlcnNpb24gPSB0aGlzLmRiLnZlcnNpb247XG5cbiAgICAgIHJlc29sdmVyKHRoaXMuZGIpO1xuICAgIH07XG4gICAgcmVxdWVzdC5vbmVycm9yID0gcmVqZWN0ZXI7XG4gICAgcmV0dXJuIGRiUHJtcztcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb24oc3RvcmVOYW1lLCBvcGVyYXRpb24pIHtcbiAgICAvL3RoaXMgZ2V0IGV4ZWN1dGVkIG1vcmUgdGhhbiAxIHRpbWVcbiAgICBsZXQgZGIgPSBhd2FpdCB0aGlzLm9wZW5EQigpO1xuXG4gICAgLy8gaWYgKFxuICAgIC8vICAgIXRoaXMuZGJcbiAgICAvLyApIHtcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFiYXNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBvcGVuREIgZmlyc3QuXCIpO1xuICAgIC8vIH1cblxuICAgIC8vIGF3YWl0IHRoaXMuZGI7XG5cbiAgICAvLyBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBhd2FpdCB0aGlzLmRiO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCAncmVhZHdyaXRlJyk7IC8vVE9ETyBub3QgYWxsIG9wZXJhdGlvbnMgcmVhZHdyaXRlXG4gICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgdHJhbnNhY3Rpb24ub25lcnJvciA9IGV2ZW50ID0+IHJlamVjdChgVHJhbnNhY3Rpb24gZmFpbGVkOiAke2V2ZW50LnRhcmdldC5lcnJvcn1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wZXJhdGlvbihzdG9yZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoYE9wZXJhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vINCyINC40L3QtdGC0LUg0L/QuNGI0YPRgiDRh9GC0L4g0LjQvdC00LXQutGB0LTQsSDRgdCw0Lwg0YXQtdC90LTQu9C40YIg0YLRgNCw0L3Qt9Cw0LrRhtC40LgsINC80L7QttC10YIg0L3QtSDQvdGD0LbQvdC+INCy0L7QvtCx0YnQtSDQs9C+0YDQvtC00LjRgtGMINGN0YLQuCDQutC+0L3RgdGC0YDRg9C60YbQuNC4XG5cbiAgLy8gYXN5bmMgZW5xdWV1ZU9wZXJhdGlvbihzdG9yZU5hbWUsIHR5cGUsIG9wZXJhdGlvbikge1xuICAvLyAgIGF3YWl0IHRoaXMuZW5zdXJlU3RvcmVFeGlzdHMoc3RvcmVOYW1lKTsgLy8gRW5zdXJlIHRoZSBzdG9yZSBleGlzdHMgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vICAgY29uc3QgZGIgPSBhd2FpdCB0aGlzLmRiUHJvbWlzZTtcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIHR5cGUpO1xuICAvLyAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAvLyAgICAgY29uc3QgcmVxdWVzdCA9IG9wZXJhdGlvbihzdG9yZSk7XG5cbiAgLy8gICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gIC8vICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gIC8vICAgICB9O1xuXG4gIC8vICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgLy8gICAgICAgcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gIC8vICAgICB9O1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgYXN5bmMgZW5xdWV1ZU9wZXJhdGlvbihzdG9yZU5hbWUsIG9wZXJhdGlvbikge1xuICAgIHRoaXMucXVldWUucHVzaCh7XG4gICAgICBzdG9yZU5hbWUsXG4gICAgICBvcGVyYXRpb25cbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nKSB7XG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdG9yZU5hbWUsXG4gICAgICAgICAgb3BlcmF0aW9uXG4gICAgICAgIH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9uKHN0b3JlTmFtZSwgb3BlcmF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDQtdC00LjQvdGB0YLQstC10L3QvdC+0LUg0YfRgtC+INGC0YPRgiDQvdC1INC90YDQsNCy0LjRgtGB0Y8gLSDQstC10YDRgdC40Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQuCDQvNC10L3Rj9C10YLRgdGPXG4gIGFzeW5jIGVuc3VyZVN0b3JlRXhpc3RzKHN0b3JlTmFtZSkge31cblxuICAvLyBhc3luYyBlbnN1cmVTdG9yZUV4aXN0cyhzdG9yZU5hbWUpIHtcbiAgLy8gICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZGJQcm9taXNlO1xuICAvLyAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzdG9yZU5hbWUpKSB7XG4gIC8vICAgICB0aGlzLmRiLmNsb3NlKCk7XG4gIC8vICAgICBjb25zdCB2ZXJzaW9uID0gZGIudmVyc2lvbiArIDE7XG4gIC8vICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHZlcnNpb24pO1xuXG4gIC8vICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAvLyAgICAgICBjb25zdCB1cGdyYWRlZERiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgLy8gICAgICAgaWYgKCF1cGdyYWRlZERiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKSkge1xuICAvLyAgICAgICAgIHVwZ3JhZGVkRGIuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lLCB7IGtleVBhdGg6ICdpZCcsIGF1dG9JbmNyZW1lbnQ6IHRydWUgfSk7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH07XG5cbiAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIC8vICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5kYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gIC8vICAgICAgICAgdGhpcy5kYlByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcy5kYik7IC8vIFVwZGF0ZSB0aGUgZGJQcm9taXNlXG4gIC8vICAgICAgICAgcmVzb2x2ZSh0aGlzLmRiKTtcbiAgLy8gICAgICAgfTtcblxuICAvLyAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgLy8gICAgICAgICByZWplY3QoZXZlbnQudGFyZ2V0LmVycm9yKTtcbiAgLy8gICAgICAgfTtcbiAgLy8gICAgIH0pO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRiKTtcbiAgLy8gfVxuXG4gIGFzeW5jIGNyZWF0ZU9iamVjdFN0b3JlKHN0b3JlTmFtZSkge1xuXG4gICAgLy8gYXN5bmMgY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lKSB7XG4gICAgLy8gICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZGJQcm9taXNlO1xuICAgIC8vICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHN0b3JlTmFtZSkpIHtcbiAgICAvLyAgICAgZGIuY2xvc2UoKTtcbiAgICAvLyAgICAgY29uc3QgdmVyc2lvbiA9IGRiLnZlcnNpb24gKyAxO1xuICAgIC8vICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHZlcnNpb24pO1xuXG4gICAgLy8gICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50KSA9PiB7XG4gICAgLy8gICAgICAgY29uc3QgdXBncmFkZWREYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgLy8gICAgICAgaWYgKCF1cGdyYWRlZERiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKSkge1xuICAgIC8vICAgICAgICAgdXBncmFkZWREYi5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUsIHsga2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogdHJ1ZSB9KTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH07XG5cbiAgICAvLyAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldmVudCkgPT4ge1xuICAgIC8vICAgICAgICAgdGhpcy5kYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgLy8gICAgICAgICByZXNvbHZlKHRoaXMuZGIpO1xuICAgIC8vICAgICAgIH07XG5cbiAgICAvLyAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAvLyAgICAgICAgIHJlamVjdChldmVudC50YXJnZXQuZXJyb3IpO1xuICAgIC8vICAgICAgIH07XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYik7XG4gICAgLy8gfVxuICB9XG59XG5jb25zdCBJbmRleGVkREJTZXJ2aWNlX2d1ZGh1YkluZGV4ZWREQk1hbmFnZXIgPSBuZXcgSW5kZXhlZERCTWFuYWdlcihkYk5hbWUsXG4vLyBkYlZlcnNpb24sIFxuW2FwcHNDb25mLnN0b3JlLCBjaHVua0RhdGFDb25mX2NodW5rc0NvbmYuc3RvcmUsIGNodW5rc01lcmdlQ29uZi5zdG9yZV0pO1xuXG4vLyBleHBvcnQgZGVmYXVsdCBkYk1hbmFnZXI7ICBcblxuLy8g0L/QvtGB0LvQtdC00L3QuNC5INC+0YLQstC10YIg0L/QvtGB0LzQvtGC0YDQuCwg0YLQsNC8INGPINGB0L/RgNCw0YjQuNCy0LDQuyDQvNC+0LbQvdC+INC70Lgg0L3QtSDQt9Cw0LrRgNGL0LLQsNGC0Ywg0Lgg0L7RgtC60YDRi9Cy0LDRgtGMINC00LEg0LjQtyDQutCw0LbQtNC+0LPQviDRgdGC0L7RgNC80LXQvdC10LTQttC10YDQsFxuXG4vLyBhd2FpdCB0aGlzLmVuc3VyZVN0b3JlRXhpc3RzKHN0b3JlTmFtZSk7IC8vIEVuc3VyZSB0aGUgc3RvcmUgZXhpc3RzIC0g0LLQvtGCINGN0YLQvtGCINC60L7QtCDQstGA0L7QtNC1INC+0LosINGCLtC1LiDQv9C10YDQtdC0INCy0YvQv9C+0LvQvdC10L3QuNC10Lwg0YHQu9C10LQg0L7Qv9C10YDQsNGG0LjQuCDQv9GA0L7QstC10YDQutCwXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvRGF0YVNlcnZpY2UvQ2h1bmtEYXRhU2VydmljZS5qc1xuXG5jbGFzcyBDaHVua0RhdGFTZXJ2aWNlIGV4dGVuZHMgRGF0YVNlcnZpY2Uge1xuICAvL2ludGVyZmFjZSBmb3IgaW5kZXhlZGRiIGFuZCBodHRwIHNlcnZpY2VzXG5cbiAgLy9oZXJlXG4gIGdldE1lcmdlZENodW5rRm9ySURMaXN0KGlkTGlzdCkge31cbiAgaXNXaXRoQ2FjaGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvYXBpL0NodW5rQXBpLmpzXG5jbGFzcyBDaHVua0FQSSB7XG4gIGNvbnN0cnVjdG9yKHJlcSkge1xuICAgIHRoaXMucmVxID0gcmVxO1xuICB9XG4gIGFzeW5jIGdldENodW5rKGFwcF9pZCwgY2h1bmtfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuZ2V0KHtcbiAgICAgIHVybDogYCR7dGhpcy5yZXEucm9vdH0vYXBpL2dldC1pdGVtcy1jaHVuay8ke2FwcF9pZH0vJHtjaHVua19pZH1gLFxuICAgICAgbWV0aG9kOiAnR0VUJ1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGdldExhc3RDaHVuayhhcHBfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuYXhpb3NSZXF1ZXN0KHtcbiAgICAgIHVybDogYCR7dGhpcy5yZXEucm9vdH0vYXBpL2dldC1sYXN0LWl0ZW1zLWNodW5rLyR7YXBwX2lkfWAsXG4gICAgICBtZXRob2Q6ICdHRVQnXG4gICAgfSk7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9odHRwU2VydmljZS9DaHVua0h0dHBTZXJ2aWNlLmpzXG5cblxuXG5cbmNsYXNzIENodW5rSHR0cFNlcnZpY2UgZXh0ZW5kcyBDaHVua0RhdGFTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocmVxLCBjb25mKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNodW5rQXBpID0gbmV3IENodW5rQVBJKHJlcSk7XG4gICAgbGV0IGh0dHBTZXJ2aWNlID0gbmV3IEh0dHBTZXJ2aWNlKGNvbmYpO1xuICAgIG9iamVjdEFzc2lnbldpdGhPdmVycmlkZSh0aGlzLCBodHRwU2VydmljZSk7XG4gIH1cbiAgYXN5bmMgZ2V0Q2h1bmsoYXBwX2lkLCBpZCkge1xuICAgIHJldHVybiB0aGlzLmNodW5rQXBpLmdldENodW5rKGFwcF9pZCwgaWQpO1xuICB9XG4gIGFzeW5jIGdldENodW5rc0ZvcklkKGFwcF9pZCkge1xuICAgIC8vIG1heWJlIHVzZSBhcHAgZ2V0IGFwaSBmb3Igbm93IGFuZCByZXR1cm4gYXBwLmNodW5rcyBmcm9tIHRoZXJlXG5cbiAgICByZXR1cm4gW107IC8vIGxpc3Qgb2YgY2h1bmtzXG4gIH1cblxuICBnZXRDYWNoZWRNZXJnZWRDaHVuayhpZCwgY2h1bmtIYXNoZXNMaXN0KSB7fVxuXG4gIC8vaGVyZVxuICBnZXRNZXJnZWRDaHVua0ZvcklETGlzdChpZCwgY2h1bmtIYXNoZXNMaXN0KSB7fVxuICBwdXRDaHVuaygpIHtcbiAgICAvL2RvIG5vdGhpbmdcbiAgfVxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0oaW5zdGFuY2UpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgQ2h1bmtIdHRwU2VydmljZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBIdHRwU2VydmljZSkgcmV0dXJuIHRydWU7IC8vVE9ETyByZXF1aXJlcyBtdWx0aXBsZSBpbmhlcml0YW5jZSwgdGhoaW5rIGhvdyB0byBvdmVyY29tZSBpdFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvRGF0YVNlcnZpY2UvSW5kZXhlZERCL1N0b3JlTWFuYWdlci9CYXNlU3RvcmVNYW5hZ2VyLmpzXG5jbGFzcyBCYXNlU3RvcmVNYW5hZ2VyX0Jhc2VTdG9yZU1hbmFnZXIge1xuICAvLyBjb25zdHJ1Y3RvcihkYk1hbmFnZXIsIGRiTmFtZSwgc3RvcmVOYW1lKSB7XG4gIGNvbnN0cnVjdG9yKGRiTWFuYWdlciwgc3RvcmVOYW1lKSB7XG4gICAgdGhpcy5kYk1hbmFnZXIgPSBkYk1hbmFnZXI7XG4gICAgLy8gdGhpcy5kYk5hbWUgPSBkYk5hbWU7XG4gICAgdGhpcy5zdG9yZU5hbWUgPSBzdG9yZU5hbWU7XG4gICAgLy8gdGhpcy5kYk1hbmFnZXIub3BlbkRCKHRoaXMuZGJOYW1lLCBbdGhpcy5zdG9yZU5hbWVdKTtcbiAgICAvLyB0aGlzLmRiTWFuYWdlci5lbnN1cmVTdG9yZUV4aXN0cyh0aGlzLnN0b3JlTmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGRJdGVtKGlkLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJNYW5hZ2VyLmV4ZWN1dGVPcGVyYXRpb24odGhpcy5zdG9yZU5hbWUsIHN0b3JlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmFkZChkYXRhLCBpZCk7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gcmVzb2x2ZTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgcHV0SXRlbShpZCwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiTWFuYWdlci5leGVjdXRlT3BlcmF0aW9uKHRoaXMuc3RvcmVOYW1lLCBzdG9yZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoZGF0YSwgaWQpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IHJlc29sdmU7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IHJlamVjdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGhhc0l0ZW0oaWQpIHtcbiAgICAvLyBkZWJ1Z2dlclxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBpdGVtID0gYXdhaXQgdGhpcy5nZXRJdGVtKGlkKTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy90b2RvIGNoZWNrIGVycm9yIHR5cGUgYW5kIHRoZW4gcmV0aHJvdyBtYXliZSBoZXJlXG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJNYW5hZ2VyLmV4ZWN1dGVPcGVyYXRpb24odGhpcy5zdG9yZU5hbWUsIHN0b3JlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChpZCk7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBhc3luYyBnZXRJdGVtKGlkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJNYW5hZ2VyLmV4ZWN1dGVPcGVyYXRpb24odGhpcy5zdG9yZU5hbWUsIHN0b3JlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChpZCk7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBhc3luYyB1cGRhdGVJdGVtKGlkLCB1cGRhdGVkSXRlbSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiTWFuYWdlci5leGVjdXRlT3BlcmF0aW9uKHRoaXMuc3RvcmVOYW1lLCBzdG9yZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhLCB1cGRhdGVkSXRlbSk7XG4gICAgICAgICAgc3RvcmUucHV0KGRhdGEsIGlkKTtcblxuICAgICAgICAgIC8vVE9ETyB3YWl0IHB1dCBvcGVyYXRpb24gYmVmb3JlIHJlc29sdmVcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IHJlamVjdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGRlbGV0ZUl0ZW0oaWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYk1hbmFnZXIuZXhlY3V0ZU9wZXJhdGlvbih0aGlzLnN0b3JlTmFtZSwgc3RvcmUgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSByZXNvbHZlO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vL1RPRE8gbW92ZSB0byBiYXNlIGNsYXNzIGhlcmVcbi8vIHRoaXMucmVxdWVzdENhY2hlID0gbmV3IE1hcDsgLy8gaWQgLT4gcHJvbWlzZSAvLy9UT0RPIHNlZW1zIGlycmVsZXZhbnQgdG8gY2xhc3MgSW5kZXhlZERCTWFuYWdlciAoY291bGQgYmUgcmVuYW1lZCB0byBGYWNhZGUgYWxyZWFkeSlcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvU3RvcmVNYW5hZ2VyL21hbmFnZXJzLmpzXG5cblxuLy8gaW1wb3J0IHsgZGJOYW1lIH0gZnJvbSBcIi4uL2NvbnN0c1wiO1xuXG5cblxuY2xhc3MgQXBwU3RvcmVNYW5hZ2VyIGV4dGVuZHMgQmFzZVN0b3JlTWFuYWdlcl9CYXNlU3RvcmVNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoSW5kZXhlZERCU2VydmljZV9ndWRodWJJbmRleGVkREJNYW5hZ2VyLCBhcHBzQ29uZi5zdG9yZSk7XG4gIH1cbiAgYXN5bmMgZ2V0QXBwKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbShpZCk7XG5cbiAgICAvLyByZXR1cm4gZGJNYW5hZ2VyLmVucXVldWVPcGVyYXRpb24oJ2FwcHMnLCAncmVhZG9ubHknLCAoc3RvcmUpID0+IHN0b3JlLmdldChpZCkpO1xuICB9XG5cbiAgYXN5bmMgYWRkQXBwKGlkLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpZCwgZGF0YSk7XG5cbiAgICAvLyByZXR1cm4gZGJNYW5hZ2VyLmVucXVldWVPcGVyYXRpb24oJ2FwcHMnLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5hZGQoYXBwKSk7XG4gIH1cblxuICBhc3luYyBwdXRBcHAoaWQsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wdXRJdGVtKGlkLCBkYXRhKTtcblxuICAgIC8vIHJldHVybiBkYk1hbmFnZXIuZW5xdWV1ZU9wZXJhdGlvbignYXBwcycsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmFkZChhcHApKTtcbiAgfVxuXG4gIGFzeW5jIGhhc0FwcChpZCkge1xuICAgIHJldHVybiB0aGlzLmhhc0l0ZW0oaWQpO1xuICB9XG4gIGFzeW5jIGRlbGV0ZUFwcChpZCkge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUl0ZW0oaWQpO1xuXG4gICAgLy8gcmV0dXJuIGRiTWFuYWdlci5lbnF1ZXVlT3BlcmF0aW9uKCdhcHBzJywgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuZGVsZXRlKGlkKSk7XG4gIH1cblxuICAvLyBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWMgdG8gQXBwU3RvcmVNYW5hZ2VyIGlmIG5lY2Vzc2FyeVxufVxuXG5jbGFzcyBDaHVua3NTdG9yZU1hbmFnZXIgZXh0ZW5kcyAoLyogdW51c2VkIHB1cmUgZXhwcmVzc2lvbiBvciBzdXBlciAqLyBudWxsICYmIChCYXNlU3RvcmVNYW5hZ2VyKSkge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihndWRodWJJbmRleGVkREJNYW5hZ2VyLCBjaHVua3NDb25mLnN0b3JlKTtcbiAgfVxuICBhc3luYyBnZXRDaHVuayhpZCkge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW0oaWQpO1xuXG4gICAgLy8gcmV0dXJuIGRiTWFuYWdlci5lbnF1ZXVlT3BlcmF0aW9uKCdhcHBzJywgJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiBzdG9yZS5nZXQoaWQpKTtcbiAgfVxuXG4gIGFzeW5jIGFkZENodW5rKGlkLCBjaHVuaykge1xuICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaWQsIGNodW5rKTtcblxuICAgIC8vIHJldHVybiBkYk1hbmFnZXIuZW5xdWV1ZU9wZXJhdGlvbignYXBwcycsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmFkZChhcHApKTtcbiAgfVxuXG4gIGFzeW5jIHB1dENodW5rKGlkLCBjaHVuaykge1xuICAgIHJldHVybiB0aGlzLnB1dEl0ZW0oaWQsIGNodW5rKTtcblxuICAgIC8vIHJldHVybiBkYk1hbmFnZXIuZW5xdWV1ZU9wZXJhdGlvbignYXBwcycsICdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmFkZChhcHApKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUNodW5rKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlSXRlbShpZCk7XG5cbiAgICAvLyByZXR1cm4gZGJNYW5hZ2VyLmVucXVldWVPcGVyYXRpb24oJ2FwcHMnLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoaWQpKTtcbiAgfVxuXG4gIC8vdXNlIGl0ZW0gbWV0aG9kcyBmcm9tIEJhc2VTdG9yZU1hbmFnZXIgISEhISEhIVxuXG4gIC8vIEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpYyB0byBDaHVua3NTdG9yZU1hbmFnZXIgaWYgbmVjZXNzYXJ5XG59XG5cbmNsYXNzIE1lcmdlZENodW5rc1N0b3JlTWFuYWdlciBleHRlbmRzIEJhc2VTdG9yZU1hbmFnZXJfQmFzZVN0b3JlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEluZGV4ZWREQlNlcnZpY2VfZ3VkaHViSW5kZXhlZERCTWFuYWdlciwgY2h1bmtzTWVyZ2VDb25mLnN0b3JlKTtcbiAgfVxuICBhc3luYyBnZXQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtKGlkKTtcblxuICAgIC8vIHJldHVybiBkYk1hbmFnZXIuZW5xdWV1ZU9wZXJhdGlvbignYXBwcycsICdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGlkKSk7XG4gIH1cblxuICBhc3luYyBhZGQoaWQsIGNodW5rKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpZCwgY2h1bmspO1xuXG4gICAgLy8gcmV0dXJuIGRiTWFuYWdlci5lbnF1ZXVlT3BlcmF0aW9uKCdhcHBzJywgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuYWRkKGFwcCkpO1xuICB9XG5cbiAgLy9UT0RPIHVwZGF0ZSBoZXJlIG9rP1xuICBhc3luYyBwdXQoaWQsIGNodW5rKSB7XG4gICAgcmV0dXJuIHRoaXMucHV0SXRlbShpZCwgY2h1bmspO1xuXG4gICAgLy8gcmV0dXJuIGRiTWFuYWdlci5lbnF1ZXVlT3BlcmF0aW9uKCdhcHBzJywgJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuYWRkKGFwcCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlSXRlbShpZCk7XG5cbiAgICAvLyByZXR1cm4gZGJNYW5hZ2VyLmVucXVldWVPcGVyYXRpb24oJ2FwcHMnLCAncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoaWQpKTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0luZGV4ZWREQi9JbmRleGVkREJDaHVua1NlcnZpY2UuanNcbiAvLyByZW1vdmVkIFwiQ2h1bmtDYWNoZURhdGFTZXJ2aWNlXCIgZnJvbSBpbXBvcnRlZCBiZWNhdXNlIGl0IHdhcyBjYXVzaW5nIGFuIGVycm9yIFwieyBDaHVua0NhY2hlRGF0YVNlcnZpY2UgfSBub3QgZm91bmQgaW4gZXhwb3J0ZWQgbmFtZXNcIiBpbiBcImd1ZGh1Yi1ub2RlLXNlcnZlclwiXG5cblxuXG5cblxuLy90aGlzIHNob3VsZCBiZSBnbG9iYWwgaW4gcHJvamVjdFxuLy8gY2xhc3MgSW5kZXhlZERCRmFjYWRlIGV4dGVuZHMgQ2FjaGVTZXJ2aWNlIHtcblxuLy8gfVxuXG4vLyBjbGFzcyBDaHVua0NhY2hlZERhdGFTZXJ2aWNlIGV4dGVuZHMgQ2h1bmtEYXRhU2VydmljZSB7XG4vLyAgICAgZGF0YVNlcnZpY2U7XG4vLyB9XG5cbmNsYXNzIEluZGV4ZWREQkNodW5rU2VydmljZSBleHRlbmRzIENodW5rRGF0YVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihyZXEsIGNvbmYsIGd1ZGh1Yikge1xuICAgIHN1cGVyKHJlcSwgY29uZik7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBDaHVua0h0dHBTZXJ2aWNlKHJlcSk7XG5cbiAgICAvLyBsZXQgaW5kZXhEQlNlcnZpY2UgPSBuZXcgSW5kZXhlZERCU2VydmljZShjb25mKTtcblxuICAgIHRoaXMucmVxdWVzdENhY2hlID0gbmV3IE1hcCgpOyAvLyBpZCAtPiBwcm9taXNlIC8vL1RPRE8gc2VlbXMgaXJyZWxldmFudCB0byBjbGFzcyBJbmRleGVkREJNYW5hZ2VyIChjb3VsZCBiZSByZW5hbWVkIHRvIEZhY2FkZSBhbHJlYWR5KVxuXG4gICAgdGhpcy5ndWRodWIgPSBndWRodWI7XG5cbiAgICAvLyB0aGlzLnN0b3JlTWFuYWdlciA9IG5ldyBDaHVua3NTdG9yZU1hbmFnZXI7XG4gICAgdGhpcy5zdG9yZU1hbmFnZXIgPSBuZXcgTWVyZ2VkQ2h1bmtzU3RvcmVNYW5hZ2VyKCk7XG5cbiAgICAvLyB0aGlzLnN0b3JlTWFuYWdlciA9IG5ldyBDaHVua3NTdG9yZU1hbmFnZXI7XG5cbiAgICAvLyBvYmplY3RBc3NpZ25XaXRoT3ZlcnJpZGUodGhpcywgaW5kZXhEQlNlcnZpY2UpO1xuICAgIC8vIG9iamVjdEFzc2lnbldpdGhPdmVycmlkZSh0aGlzLCBuZXcgQ2h1bmtzU3RvcmVNYW5hZ2VyKTtcbiAgfVxuXG4gIC8vVE9ETyB1c2UgSW5kZXhlZERCRmFjYWRlIGhlcmVcbiAgLy8gaW5kZXhEQkFjY2VzcyA9IG5ldyBJbmRleGVkREJGYWNhZGU7XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEluZGV4ZWREQkNodW5rU2VydmljZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBJbmRleGVkREJTZXJ2aWNlKSByZXR1cm4gdHJ1ZTsgLy9UT0RPIHJlcXVpcmVzIG11bHRpcGxlIGluaGVyaXRhbmNlLCB0aGhpbmsgaG93IHRvIG92ZXJjb21lIGl0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZ2V0Q2FjaGVkTWVyZ2VkQ2h1bmsoaWQsIGNodW5rSGFzaGVzTGlzdCkge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY2FjaGVkRGF0YSA9IGF3YWl0IHRoaXMuc3RvcmVNYW5hZ2VyLmdldChpZCk7XG4gICAgICByZXR1cm4gY2FjaGVkRGF0YS5tZXJnZWREYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBsZXQgbmV3SGFzaGVzID0gY2h1bmtIYXNoZXNMaXN0LmZpbHRlcihjID0+ICFjYWNoZWREYXRhLmhhc2hlcy5pbmNsdWRlcyhjKSk7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gY2h1bmtIYXNoZXNMaXN0Lm1hcChoYXNoID0+IHRoaXMuZGF0YVNlcnZpY2UuZ2V0Q2h1bmsoaWQsIGhhc2gpKTtcbiAgICAgIGNvbnN0IG5ld0NodW5rcyA9IGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcbiAgICAgIGxldCBtZXJnZWREYXRhID0gYXdhaXQgdGhpcy5ndWRodWIudXRpbC5tZXJnZUNodW5rcyhuZXdDaHVua3MpO1xuICAgICAgdGhpcy5wdXRNZXJnZWRDaHVua3MoaWQsIHtcbiAgICAgICAgaGFzaGVzOiBjaHVua0hhc2hlc0xpc3QsXG4gICAgICAgIG1lcmdlZERhdGE6IHtcbiAgICAgICAgICBpdGVtc19saXN0OiBtZXJnZWREYXRhXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXNfbGlzdDogbWVyZ2VkRGF0YVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaXNXaXRoQ2FjaGUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXN5bmMgZ2V0TWVyZ2VkQ2h1bmtGb3JBcHAoaWQpIHtcbiAgICAvLyBoZXJlIHJlcXVlc3QgYXBpIGFuZCBnZXQgY2h1bmtzIGxpc3RcblxuICAgIC8vdGhlbiBwZXJmb3JtIGFsbCByZXF1aXJlZCBjaGVja3MgZm9yIGNhY2hlZCBjaHVuayBhbmQgaGFzaGVzIGFuZCBuZXcgaGFzaGVzXG4gIH1cblxuICAvL2hlcmUgLy8gVE9ETyByZXBsYWNlIHRoaXMgd2l0aCBnZXRNZXJnZWRDaHVua0ZvckFwcCBpbiBmdXR1cmVcbiAgYXN5bmMgZ2V0TWVyZ2VkQ2h1bmtGb3JJRExpc3QoaWQsIGNodW5rSGFzaGVzTGlzdCkge1xuICAgIC8vVE9ETyBwcm9taXNlIGNhY2hlXG5cbiAgICAvLyBUT0RPIGFsc28gdHJ5IGNhdGNoIG1heWJlXG5cbiAgICB0cnkge1xuICAgICAgbGV0IGlzQ2FjaGVkVmFsaWQgPSB0cnVlO1xuICAgICAgbGV0IGNhY2hlZERhdGEgPSBhd2FpdCB0aGlzLnN0b3JlTWFuYWdlci5nZXQoaWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGNodW5rSGFzaGVzTGlzdC5sZW5ndGggPCBjYWNoZWREYXRhLmhhc2hlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICBmb3IgKGxldCBoYXNoIG9mIGNhY2hlZERhdGEuaGFzaGVzKSB7XG4gICAgICAgICAgaWYgKGNodW5rSGFzaGVzTGlzdC5pbmRleE9mKGhhc2gpICE9IGNhY2hlZERhdGEuaGFzaGVzLmluZGV4T2YoaGFzaCkpIGlzQ2FjaGVkVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaXNDYWNoZWRWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0NhY2hlZFZhbGlkKSB7XG4gICAgICAgIC8vIHRvZG8gcmVsb2FkIGFsbCBkYXRhXG4gICAgICB9XG4gICAgICBsZXQgbmV3Q2h1bmtIYXNoZXMgPSBbXTtcbiAgICAgIGxldCBuZXdDaHVua3MgPSBbXTtcbiAgICAgIGlmIChjaHVua0hhc2hlc0xpc3QubGVuZ3RoID4gY2FjaGVkRGF0YS5oYXNoZXMubGVuZ3RoKSB7XG4gICAgICAgIG5ld0NodW5rSGFzaGVzID0gY2h1bmtIYXNoZXNMaXN0LnNsaWNlKGNhY2hlZERhdGEuaGFzaGVzLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQ2FjaGVkVmFsaWQpIHtcbiAgICAgICAgbmV3Q2h1bmtIYXNoZXMgPSBjaHVua0hhc2hlc0xpc3Q7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q2h1bmtIYXNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0cyA9IG5ld0NodW5rSGFzaGVzLm1hcChoYXNoID0+IHRoaXMuZGF0YVNlcnZpY2UuZ2V0Q2h1bmsoaWQsIGhhc2gpKTtcbiAgICAgICAgbmV3Q2h1bmtzID0gYXdhaXQgUHJvbWlzZS5hbGwocmVxdWVzdHMpO1xuICAgICAgfVxuICAgICAgbGV0IG1lcmdlZERhdGE7XG4gICAgICBpZiAoIWlzQ2FjaGVkVmFsaWQpIHtcbiAgICAgICAgbWVyZ2VkRGF0YSA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW1xuICAgICAgICAvLyBjYWNoZWREYXRhLm1lcmdlZERhdGEsXG4gICAgICAgIC4uLm5ld0NodW5rc10pO1xuICAgICAgfVxuICAgICAgaWYgKGlzQ2FjaGVkVmFsaWQpIHtcbiAgICAgICAgbWVyZ2VkRGF0YSA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW2NhY2hlZERhdGEubWVyZ2VkRGF0YSwgLi4ubmV3Q2h1bmtzXSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q2h1bmtIYXNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnB1dE1lcmdlZENodW5rcyhpZCwge1xuICAgICAgICAgIGhhc2hlczogY2h1bmtIYXNoZXNMaXN0LFxuICAgICAgICAgIG1lcmdlZERhdGE6IHtcbiAgICAgICAgICAgIGl0ZW1zX2xpc3Q6IG1lcmdlZERhdGFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXNfbGlzdDogbWVyZ2VkRGF0YVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gbGV0IG5ld0hhc2hlcyA9IGNodW5rSGFzaGVzTGlzdC5maWx0ZXIoYyA9PiAhY2FjaGVkRGF0YS5oYXNoZXMuaW5jbHVkZXMoYykpO1xuXG4gICAgICBjb25zdCByZXF1ZXN0cyA9IGNodW5rSGFzaGVzTGlzdC5tYXAoaGFzaCA9PiB0aGlzLmRhdGFTZXJ2aWNlLmdldENodW5rKGlkLCBoYXNoKSk7XG4gICAgICBjb25zdCBuZXdDaHVua3MgPSBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG4gICAgICBsZXQgbWVyZ2VkRGF0YSA9IGF3YWl0IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MobmV3Q2h1bmtzKTtcbiAgICAgIHRoaXMucHV0TWVyZ2VkQ2h1bmtzKGlkLCB7XG4gICAgICAgIGhhc2hlczogY2h1bmtIYXNoZXNMaXN0LFxuICAgICAgICBtZXJnZWREYXRhOiB7XG4gICAgICAgICAgaXRlbXNfbGlzdDogbWVyZ2VkRGF0YVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zX2xpc3Q6IG1lcmdlZERhdGFcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmRNZXJnZUFycmF5cyh1cmxzKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBmZXRjaCBwcm9taXNlc1xuICAvLyAgICAgY29uc3QgcmVxdWVzdHMgPSB1cmxzLm1hcCh1cmwgPT4gZmV0Y2godXJsKS50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkpO1xuXG4gIC8vICAgICAvLyBXYWl0IGZvciBhbGwgcmVxdWVzdHMgdG8gY29tcGxldGVcbiAgLy8gICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG5cbiAgLy8gICAgIC8vIE1lcmdlIGFsbCBhcnJheXNcbiAgLy8gICAgIGNvbnN0IG1lcmdlZEFycmF5ID0gcmVzdWx0cy5mbGF0KCk7IC8vIG9yIHVzZSByZWR1Y2U6IHJlc3VsdHMucmVkdWNlKChhY2MsIGFycikgPT4gYWNjLmNvbmNhdChhcnIpLCBbXSk7XG5cbiAgLy8gICAgIHJldHVybiBtZXJnZWRBcnJheTtcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZGF0YTonLCBlcnJvcik7XG4gIC8vICAgICB0aHJvdyBlcnJvcjtcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyAvLyBFeGFtcGxlIHVzYWdlOlxuICAvLyBjb25zdCB1cmxzID0gWydodHRwczovL2FwaS5leGFtcGxlLmNvbS9kYXRhMScsICdodHRwczovL2FwaS5leGFtcGxlLmNvbS9kYXRhMiddO1xuICAvLyBmZXRjaEFuZE1lcmdlQXJyYXlzKHVybHMpXG4gIC8vICAgLnRoZW4obWVyZ2VkQXJyYXkgPT4gY29uc29sZS5sb2cobWVyZ2VkQXJyYXkpKVxuICAvLyAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcikpO1xuXG4gIC8vdG9kbyBhbHNvIG9wdGltaXplIGNodW5rcyB0cmFuc2FjdGlvbnMgZXRjXG5cbiAgYXN5bmMgcHV0TWVyZ2VkQ2h1bmtzKGlkLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVNYW5hZ2VyLnB1dChpZCwgZGF0YSk7XG4gIH1cblxuICAvLyBhc3luYyBnZXRNZXJnZWRDaHVua3MoaWQsIGRhdGEpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5zdG9yZU1hbmFnZXIuZ2V0KGlkLCBkYXRhKTtcbiAgLy8gfVxuXG4gIGFzeW5jIHB1dENodW5rKGlkLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVNYW5hZ2VyLnB1dENodW5rKGlkLCBkYXRhKTtcblxuICAgIC8vIHRyeSB7ICAgICAgICBcbiAgICAvLyAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuRGF0YWJhc2UoKTsgLy9oZXJlXG5cbiAgICAvLyAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24odGhpcy5zdG9yZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgLy8gICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuc3RvcmUpO1xuXG4gICAgLy8gICBzdG9yZS5wdXQoZGF0YSwgaWQpO1xuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAvLyB9XG4gIH1cblxuICAvLyBhc3luYyBnZXRBcHAoaWQpIHtcbiAgLy8gICBpZiAodGhpcy5yZXF1ZXN0Q2FjaGUuaGFzKGlkKSkgcmV0dXJuIHRoaXMucmVxdWVzdENhY2hlLmdldChpZCk7XG5cbiAgLy8gICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgLy8gICBsZXQgZGF0YVNlcnZpY2VSZXF1ZXN0ID0gdGhpcy5kYXRhU2VydmljZS5nZXRBcHAoaWQpO1xuXG4gIC8vICAgbGV0IHByID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgdHJ5IHtcbiAgLy8gICAgICAgY29uc3QgZGIgPSBhd2FpdCBzZWxmLm9wZW5EYXRhYmFzZSgpO1xuICAvLyAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKHNlbGYuc3RvcmUsIFwicmVhZG9ubHlcIik7XG4gIC8vICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5zdG9yZSk7XG5cbiAgLy8gICAgICAgY29uc3Qgc3RvcmVSZXF1ZXN0ID0gc3RvcmUuZ2V0KGlkKTtcblxuICAvLyAgICAgICBzdG9yZVJlcXVlc3Qub25zdWNjZXNzID0gKGUpID0+IHtcblxuICAvLyAgICAgICAgIGxldCBjYWNoZWREYXRhID0gZS50YXJnZXQucmVzdWx0O1xuXG4gIC8vICAgICAgICAgaWYgKFxuICAvLyAgICAgICAgICAgIWNhY2hlZERhdGFcbiAgLy8gICAgICAgICApIHtcbiAgLy8gICAgICAgICAgIGRhdGFTZXJ2aWNlUmVxdWVzdC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIC8vICAgICAgICAgICBkYXRhU2VydmljZVJlcXVlc3QudGhlbihkYXRhID0+IHNlbGYucHV0QXBwKGlkLCBkYXRhKSk7XG4gIC8vICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgaWYgKFxuICAvLyAgICAgICAgICAgY2FjaGVkRGF0YVxuICAvLyAgICAgICAgICkge1xuICAvLyAgICAgICAgICAgcmVzb2x2ZShjYWNoZWREYXRhKTtcblxuICAvLyAgICAgICAgICAgZGF0YVNlcnZpY2VSZXF1ZXN0LnRoZW4oYXN5bmMgKGRhdGEpID0+IHtcbiAgLy8gICAgICAgICAgICAgLy8gc2VsZi5ndWRodWIucHJvY2Vzc0FwcFVwZChkYXRhLCBjYWNoZWREYXRhKTsvL1xuICAvLyAgICAgICAgICAgICBhd2FpdCBzZWxmLnB1dEFwcChpZCwgZGF0YSk7XG4gIC8vICAgICAgICAgICAgIHNlbGYuZ3VkaHViLnRyaWdnZXJBcHBVcGRhdGUoaWQsIHByZXZWZXJzaW9uLCBuZXdWZXJzaW9uKTtcbiAgLy8gICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfTtcblxuICAvLyAgICAgICBzdG9yZVJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgLy8gICAgICAgICBkYXRhU2VydmljZVJlcXVlc3QudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAvLyAgICAgICAgIGRhdGFTZXJ2aWNlUmVxdWVzdC50aGVuKGRhdGEgPT4gc2VsZi5wdXRBcHAoaWQsIGRhdGEpKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICAgICAgZGF0YVNlcnZpY2VSZXF1ZXN0LnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgLy8gICAgICAgZGF0YVNlcnZpY2VSZXF1ZXN0LnRoZW4oZGF0YSA9PiBzZWxmLnB1dEFwcChpZCwgZGF0YSkpO1xuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuXG4gIC8vICAgc2VsZi5yZXF1ZXN0Q2FjaGUuc2V0KGlkLCBwcik7XG5cbiAgLy8gICByZXR1cm4gcHI7XG4gIC8vIH1cblxuICBhc3luYyBnZXRDaHVuayhhcHBfaWQsIGlkKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdENhY2hlLmhhcyhpZCkpIHJldHVybiB0aGlzLnJlcXVlc3RDYWNoZS5nZXQoaWQpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcHIgPSB0aGlzLnN0b3JlTWFuYWdlci5nZXRDaHVuayhpZCk7XG5cbiAgICAgIC8vIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgLy8gbGV0IHByID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gICB0cnkge1xuICAgICAgLy8gICAgIGNvbnN0IGRiID0gYXdhaXQgc2VsZi5vcGVuRGF0YWJhc2UoKTtcbiAgICAgIC8vICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKHNlbGYuc3RvcmUsIFwicmVhZG9ubHlcIik7XG4gICAgICAvLyAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLnN0b3JlKTtcblxuICAgICAgLy8gICAgIGNvbnN0IHN0b3JlUmVxdWVzdCA9IHN0b3JlLmdldChpZCk7XG5cbiAgICAgIC8vICAgICBzdG9yZVJlcXVlc3Qub25zdWNjZXNzID0gKGUpID0+IHtcblxuICAgICAgLy8gICAgICAgbGV0IGNhY2hlZERhdGEgPSBlLnRhcmdldC5yZXN1bHQ7XG5cbiAgICAgIC8vICAgICAgIGlmIChcbiAgICAgIC8vICAgICAgICAgIWNhY2hlZERhdGFcbiAgICAgIC8vICAgICAgICkge1xuICAgICAgLy8gICAgICAgICByZWplY3QoKTtcbiAgICAgIC8vICAgICAgIH1cblxuICAgICAgLy8gICAgICAgaWYgKFxuICAgICAgLy8gICAgICAgICBjYWNoZWREYXRhXG4gICAgICAvLyAgICAgICApIHtcblxuICAgICAgLy8gICAgICAgICByZXNvbHZlKGNhY2hlZERhdGEpO1xuICAgICAgLy8gICAgICAgfVxuICAgICAgLy8gICAgIH07XG5cbiAgICAgIC8vICAgICBzdG9yZVJlcXVlc3Qub25lcnJvciA9IHJlamVjdFxuICAgICAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gICAgIHJlamVjdCgpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9KTtcblxuICAgICAgc2VsZi5yZXF1ZXN0Q2FjaGUuc2V0KGlkLCBwcik7XG4gICAgICBhd2FpdCBwcjtcbiAgICAgIHJldHVybiBwcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsZXQgcmVxUHJtcyA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0Q2h1bmsoYXBwX2lkLCBpZCk7XG4gICAgICB0aGlzLnJlcXVlc3RDYWNoZS5zZXQoaWQsIHJlcVBybXMpO1xuICAgICAgbGV0IHJlcyA9IGF3YWl0IHJlcVBybXM7XG4gICAgICB0aGlzLnB1dENodW5rKGlkLCByZXMpO1xuICAgICAgLy8gcHV0UHJtcy50aGVuKCgpID0+IHNlbGYuZ3VkaHViLnRyaWdnZXJBcHBVcGRhdGUoaWQpKTtcblxuICAgICAgcmV0dXJuIHJlcVBybXM7XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgb3BlbkRhdGFiYXNlKCkge1xuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIC8vICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMuZGJWZXJzaW9uKTtcblxuICAvLyAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiB7XG4gIC8vICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gIC8vICAgICB9O1xuICAvLyAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4ge1xuICAvLyAgICAgICByZWplY3QoZXZlbnQudGFyZ2V0LmVycm9yKTtcbiAgLy8gICAgIH07XG4gIC8vICAgfSk7XG4gIC8vIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvSW5kZXhlZERCQXBwU2VydmljZS5qc1xuXG4gLy8gcmVtb3ZlZCBcIkNodW5rQ2FjaGVEYXRhU2VydmljZVwiIGZyb20gaW1wb3J0ZWQgYmVjYXVzZSBpdCB3YXMgY2F1c2luZyBhbiBlcnJvciBcInsgQ2h1bmtDYWNoZURhdGFTZXJ2aWNlIH0gbm90IGZvdW5kIGluIGV4cG9ydGVkIG5hbWVzXCIgaW4gXCJndWRodWItbm9kZS1zZXJ2ZXJcIlxuXG5cblxuXG5cblxuXG5cblxuXG4vL3RoaXMgc2hvdWxkIGJlIGdsb2JhbCBpbiBwcm9qZWN0XG4vLyBjbGFzcyBJbmRleGVkREJGYWNhZGUgZXh0ZW5kcyBDYWNoZVNlcnZpY2Uge1xuXG4vLyB9XG5cbmNsYXNzIEluZGV4ZWREQk1hbmFnZXIxIHtcbiAgY29uc3RydWN0b3IoZGJOYW1lLCBzdG9yZU5hbWUpIHtcbiAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcbiAgICB0aGlzLnN0b3JlTmFtZSA9IHN0b3JlTmFtZTtcbiAgICB0aGlzLmRiID0gbnVsbDtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgfVxuICBhc3luYyBvcGVuREIoKSB7XG4gICAgaWYgKHRoaXMuZGIpIHJldHVybiB0aGlzLmRiO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIDEpO1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuc3RvcmVOYW1lKSkge1xuICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiAnaWQnLFxuICAgICAgICAgICAgYXV0b0luY3JlbWVudDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICByZXNvbHZlKHRoaXMuZGIpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IHtcbiAgICAgICAgcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5vcGVuREIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCAncmVhZHdyaXRlJyk7XG4gICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmVycm9yID0gZXZlbnQgPT4gcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gICAgICBvcGVyYXRpb24oc3RvcmUpO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGVucXVldWVPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKG9wZXJhdGlvbik7XG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50T3BlcmF0aW9uID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjdXJyZW50T3BlcmF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEluZGV4ZWREQk1hbmFnZXIyIHtcbiAgY29uc3RydWN0b3IoZGJOYW1lLCBzdG9yZU5hbWUpIHtcbiAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcbiAgICB0aGlzLnN0b3JlTmFtZSA9IHN0b3JlTmFtZTtcbiAgICB0aGlzLmRiID0gbnVsbDtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgfVxuICBhc3luYyBvcGVuREIoKSB7XG4gICAgaWYgKHRoaXMuZGIpIHJldHVybiB0aGlzLmRiO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIDEpO1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuc3RvcmVOYW1lKSkge1xuICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiAnaWQnLFxuICAgICAgICAgICAgYXV0b0luY3JlbWVudDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICByZXNvbHZlKHRoaXMuZGIpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IHtcbiAgICAgICAgcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5vcGVuREIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCAncmVhZHdyaXRlJyk7XG4gICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmVycm9yID0gZXZlbnQgPT4gcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG4gICAgICBvcGVyYXRpb24oc3RvcmUpO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGVucXVldWVPcGVyYXRpb24ob3BlcmF0aW9uKSB7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKG9wZXJhdGlvbik7XG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50T3BlcmF0aW9uID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjdXJyZW50T3BlcmF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLy90b2RvINCw0L3QtNGA0LXQuSDRgdC60LDQt9Cw0Lsg0YfQsNC90LrQuCDQtNCy0LAg0YDQsNC30LAg0LPRgNGD0LfRj9GC0YHRj1xuLy/Qv9GA0Lgg0L/QtdGA0LLQvtC5INC30LDQs9GA0YPQt9C60LUg0LrQvtCz0LTQsCDQvdC10YIg0LHQtCDQvdC40YfQtdCz0L4g0L3QtSDQvtGC0L7QsdGA0LDQttCw0LXRgtGB0Y9cbi8v0LDQvdC00YDQtdC5INC/0YDQtdC00LvQsNCz0LDQtdGCINCz0YDQvtGF0LDRgtGMINCx0LQg0LXRgdC70Lgg0L/RgNC+0LHQu9C10LzRiyDRgdC+INGB0YLQvtGA0LDQvNC4XG5cbi8vINC80L7QttC10YIg0L/QvtC80LXQvdGP0YLRjCDQuNC80Y8g0L3QsCBTdG9yZUFwcFNlcnZpY2U/Pz8/INC/0L7RgtC+0LzRgyDRh9GC0L4g0Y8g0YPQttC1INGB0LTQtdC70LDQuyDQsNCx0YHRgtGA0LDQutGG0LjRjlxuXG5jbGFzcyBJbmRleGVkREJBcHBTZXJ2aWNlRm9yV29ya2VyIGV4dGVuZHMgQXBwRGF0YVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihyZXEsIGNvbmYsIGd1ZGh1Yikge1xuICAgIHN1cGVyKHJlcSwgY29uZiwgZ3VkaHViKTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gbmV3IEFwcEh0dHBTZXJ2aWNlKHJlcSwgY29uZiwgZ3VkaHViKTtcblxuICAgIC8vIGxldCBpbmRleERCU2VydmljZSA9IG5ldyBJbmRleGVkREJTZXJ2aWNlKGNvbmYpO1xuICAgIC8vIGxldCBpbmRleERCQXBwU3RvcmVNYW5hZ2VyID0gbmV3IEFwcFN0b3JlTWFuYWdlcjtcblxuICAgIHRoaXMucmVxdWVzdENhY2hlID0gbmV3IE1hcCgpOyAvLyBpZCAtPiBwcm9taXNlIC8vL1RPRE8gc2VlbXMgaXJyZWxldmFudCB0byBjbGFzcyBJbmRleGVkREJNYW5hZ2VyIChjb3VsZCBiZSByZW5hbWVkIHRvIEZhY2FkZSBhbHJlYWR5KVxuXG4gICAgdGhpcy5ndWRodWIgPSBndWRodWI7XG4gICAgdGhpcy5jaHVua0RhdGFTZXJ2aWNlID0gbmV3IEluZGV4ZWREQkNodW5rU2VydmljZShyZXEsIGNodW5rc01lcmdlQ29uZiwgZ3VkaHViKTtcblxuICAgIC8vIGxldCByZXMgPSBhd2FpdCB0aGlzLmNodW5rRGF0YVNlcnZpY2UuZ2V0TWVyZ2VkQ2h1bmtGb3JJRExpc3QoaWQsIHNlbnREYXRhLmNodW5rcyk7XG5cbiAgICAvL1RPRE8gb2JqZWN0QXNzaWduV2l0aE92ZXJyaWRlIGhlcmUgdG9vP1xuICAgIC8vIHRoaXMuZGJNYW5hZ2VyID0gbmV3IEluZGV4ZWREQk1hbmFnZXIoJ215RGF0YWJhc2UnLCAnYXBwc1N0b3JlJyk7XG5cbiAgICAvL1RPRE8gYWxzbyB0aGluayBob3cgdG8gdXNlIEFwcERhdGFTZXJ2aWNlIHdpdGhvdXQgb3ZlcnJpZGluZyBjaHVua0RhdGFTZXJ2aWNlIGhlcmUuIHNlZW1zIGl0IGdldHMgaHR0cCBjaHVuayBzZXJ2aWNlIGZvciB3b3JrZXIgc29tZWhvd1xuICAgIC8vIG1heWJlIElTX1dFQiBpcyB3cm9uZyBpbnNpZGUgd29ya2VyXG5cbiAgICAvLyB0aGlzLmRiID0gbnVsbDtcbiAgICAvLyB0aGlzLnF1ZXVlID0gW107XG4gICAgLy8gdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAgIC8vdG9kbyB3b3JrZXIgcG9vbD9cblxuICAgIHRoaXMuc3RvcmVNYW5hZ2VyID0gbmV3IEFwcFN0b3JlTWFuYWdlcigpO1xuXG4gICAgLy8gb2JqZWN0QXNzaWduV2l0aE92ZXJyaWRlKHRoaXMsIGluZGV4REJTZXJ2aWNlKTtcbiAgICAvLyBvYmplY3RBc3NpZ25XaXRoT3ZlcnJpZGUodGhpcywgbmV3IEFwcFN0b3JlTWFuYWdlcik7XG4gIH1cblxuICBzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0oaW5zdGFuY2UpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgSW5kZXhlZERCQXBwU2VydmljZUZvcldvcmtlcikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBJbmRleGVkREJTZXJ2aWNlKSByZXR1cm4gdHJ1ZTsgLy9UT0RPIHJlcXVpcmVzIG11bHRpcGxlIGluaGVyaXRhbmNlLCB0aGhpbmsgaG93IHRvIG92ZXJjb21lIGl0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvL1RPRE8gdXNlIEluZGV4ZWREQkZhY2FkZSBoZXJlXG4gIC8vIGluZGV4REJBY2Nlc3MgPSBuZXcgSW5kZXhlZERCRmFjYWRlO1xuXG4gIGlzV2l0aENhY2hlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGdldEFwcChpZCkge1xuICAvLyAgIGxldCB3b3JrZXIgPSBuZXcgV29ya2VyKCcuLi8uLi9hcHBSZXF1ZXN0V29ya2VyLmpzJyk7XG5cbiAgLy8gICB3b3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiAnaW5pdCcsIGd1ZGh1YlNlcmlhbGl6ZWQ6IHRoaXMuZ3VkaHViLnNlcmlhbGl6ZWQgfSk7XG5cbiAgLy8gICAvLyBTZW5kIHRoZSBtYWluIGRhdGEgdG8gYmUgcHJvY2Vzc2VkXG4gIC8vICAgY29uc3QgbWFpbkRhdGEgPSB7IC8qIHlvdXIgZGF0YSBoZXJlICovIH07XG4gIC8vICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgdHlwZTogJ3Byb2Nlc3NEYXRhJywgZGF0YTogbWFpbkRhdGEgfSk7XG5cbiAgLy8gICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkge1xuICAvLyAgICAgY29uc29sZS5sb2coJ0RhdGEgcHJvY2Vzc2VkIGJ5IHdvcmtlcjonLCBlLmRhdGEpO1xuICAvLyAgIH07XG5cbiAgLy8gICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHdvcmtlcjonLCBlKTtcbiAgLy8gICB9O1xuXG4gIC8vICAgd29ya2VyLm9ubWVzc2FnZSA9IChtc2dFdikgPT4ge1xuXG4gIC8vICAgfVxuXG4gIC8vIH1cblxuICAvL1RPRE8g0LTQu9GPINGH0LDQvdC60L7QsiDRgSDQuNC90LTQtdC60YHQtNC00LEg0LHRg9C00LXRgiDRgtC+0YfQvdC+INGC0LDQutC+0Lkg0LrQvtC0INC/0L7RlNGC0L7QvNGDINC80L7QttC10YIg0LLRi9C90LXRgdGC0Lgg0LXQs9C+INCyINC60LDQutC+0LUt0YLQviDQvNC10YHRgtC+PyDQvdCw0L/RgNC40LzQtdGAINCyINC+0YLQtNC10LvRjNC90YvQuSDQutC70LDRgdGBXG5cbiAgLy8gYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgLy8gICBhd2FpdCB0aGlzLm9wZW5EQigpO1xuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIC8vICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGIudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsICdyZWFkd3JpdGUnKTtcbiAgLy8gICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpO1xuXG4gIC8vICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAvLyAgICAgdHJhbnNhY3Rpb24ub25lcnJvciA9IChldmVudCkgPT4gcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7XG5cbiAgLy8gICAgIG9wZXJhdGlvbihzdG9yZSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvLyBhc3luYyBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbikge1xuICAvLyAgIHRoaXMucXVldWUucHVzaChvcGVyYXRpb24pO1xuXG4gIC8vICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xuICAvLyAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAvLyAgICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAvLyAgICAgICBjb25zdCBjdXJyZW50T3BlcmF0aW9uID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAvLyAgICAgICB0cnkge1xuICAvLyAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjdXJyZW50T3BlcmF0aW9uKTtcbiAgLy8gICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBhc3luYyBhZGREYXRhKGRhdGEpIHtcbiAgLy8gICBhd2FpdCB0aGlzLmVucXVldWVPcGVyYXRpb24oKHN0b3JlKSA9PiB7XG4gIC8vICAgICBzdG9yZS5hZGQoZGF0YSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvLyBhc3luYyB1cGRhdGVEYXRhKGlkLCB1cGRhdGVkRGF0YSkge1xuICAvLyAgIGF3YWl0IHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoc3RvcmUpID0+IHtcbiAgLy8gICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoaWQpO1xuICAvLyAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gIC8vICAgICAgIGNvbnN0IGRhdGEgPSByZXF1ZXN0LnJlc3VsdDtcbiAgLy8gICAgICAgT2JqZWN0LmFzc2lnbihkYXRhLCB1cGRhdGVkRGF0YSk7XG4gIC8vICAgICAgIHN0b3JlLnB1dChkYXRhKTtcbiAgLy8gICAgIH07XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvLyBhc3luYyBkZWxldGVEYXRhKGlkKSB7XG4gIC8vICAgYXdhaXQgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKChzdG9yZSkgPT4ge1xuICAvLyAgICAgc3RvcmUuZGVsZXRlKGlkKTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIGFzeW5jIGdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGlkKSB7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGlkKTtcbiAgICBhd2FpdCB0aGlzLnB1dEFwcChpZCwgZGF0YSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvLyB0aGlzIHJldHVybnMgZGF0YSBmb3Igc3BlY2lmaWMgY2h1bmtzICsgYXBwIHJlcXVlc3QgZGF0YVxuICAvLyBhc3luYyBnZXRBcHBXaXRoU3BlY2lmaWNDaHVua3NMaXN0KGlkLCBsaXN0KSB7XG4gIC8vICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGlkKTtcblxuICAvLyAgIGF3YWl0IHNlbGYucHV0QXBwKGlkLCBkYXRhKTtcblxuICAvLyAgIGxldCBwcm9jZXNzZWREYXRhID0gYXdhaXQgc2VsZi5wcm9jZXNzUmVxdWVzdGVkQXBwKGlkLCBkYXRhKTsvL2hlcmUg0L3Rg9C20L3QviDQv9C10YDQtdGB0LzQvtGC0YDQtdGC0YxcblxuICAvLyAgIHJldHVybiBwcm9jZXNzZWREYXRhO1xuICAvLyB9XG5cbiAgYXN5bmMgZ2V0QXBwKGlkKSB7XG4gICAgLy8gaWYgKHRoaXMucmVxdWVzdENhY2hlLmhhcyhpZCkpIHJldHVybiB0aGlzLnJlcXVlc3RDYWNoZS5nZXQoaWQpO1xuXG4gICAgLy8gcmV0dXJuIGF0IGZpcnN0IHRpbWUgY2FjaGVkIGFwcCByZXF1ZXN0Pz8/Pz8/IG5vIHNlZW1zIGZvciB3b3JrZXIgaXRzIG9rXG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBsZXQgZGF0YVNlcnZpY2VSZXF1ZXN0ID0gdGhpcy5kYXRhU2VydmljZS5nZXRBcHBXaXRob3V0UHJvY2Vzc2luZyhpZCk7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGlkKTtcblxuICAgIC8vIGF3YWl0IHNlbGYucHV0QXBwKGlkLCBkYXRhKTtcblxuICAgIGxldCBwcm9jZXNzZWREYXRhID0gYXdhaXQgc2VsZi5wcm9jZXNzUmVxdWVzdGVkQXBwKGlkLCBkYXRhKTsgLy9oZXJlINC90YPQttC90L4g0L/QtdGA0LXRgdC80L7RgtGA0LXRgtGMXG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkRGF0YTtcbiAgICBsZXQgcHIgPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWxmLm9wZW5EYXRhYmFzZSgpO1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHNlbGYuZGIudHJhbnNhY3Rpb24oc2VsZi5zdG9yZSwgXCJyZWFkb25seVwiKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLnN0b3JlKTtcbiAgICAgICAgY29uc3Qgc3RvcmVSZXF1ZXN0ID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgc3RvcmVSZXF1ZXN0Lm9uc3VjY2VzcyA9IGUgPT4ge1xuICAgICAgICAgIGxldCBjYWNoZWREYXRhID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGlmICghY2FjaGVkRGF0YSkge1xuICAgICAgICAgICAgZGF0YVNlcnZpY2VSZXF1ZXN0LnRoZW4oYXN5bmMgZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGxldCBwcm9jZXNzZWREYXRhID0gYXdhaXQgc2VsZi5wcm9jZXNzUmVxdWVzdGVkQXBwKGlkLCBkYXRhKTsgLy9oZXJlXG5cbiAgICAgICAgICAgICAgLy8gbGV0IGNvbXBhcmlzb24gPSB0aGlzLmd1ZGh1Yi51dGlsLmNvbXBhcmVJdGVtcyhbXSwgcHJvY2Vzc2VkRGF0YS5pdGVtc19saXN0KTtcblxuICAgICAgICAgICAgICAvLyBsZXQgY2FjaGVkXG5cbiAgICAgICAgICAgICAgcmVzb2x2ZShwcm9jZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgc2VsZi5wdXRBcHAoaWQsIHByb2Nlc3NlZERhdGEpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhY2hlZERhdGEpIHtcbiAgICAgICAgICAgIC8vIHJlc29sdmUoY2FjaGVkRGF0YSk7XG5cbiAgICAgICAgICAgIGRhdGFTZXJ2aWNlUmVxdWVzdC50aGVuKGFzeW5jIGRhdGEgPT4ge1xuICAgICAgICAgICAgICBsZXQgcHJvY2Vzc2VkRGF0YSA9IGF3YWl0IHNlbGYucHJvY2Vzc1JlcXVlc3RlZEFwcChpZCwgZGF0YSk7IC8vaGVyZVxuXG4gICAgICAgICAgICAgIC8vIGxldCBjb21wYXJpc29uID0gdGhpcy5ndWRodWIudXRpbC5jb21wYXJlSXRlbXMoY2FjaGVkRGF0YS5pdGVtc19saXN0LCBwcm9jZXNzZWREYXRhLml0ZW1zX2xpc3QpO1xuXG4gICAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgICAgIHNlbGYucHV0QXBwKGlkLCBwcm9jZXNzZWREYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc3RvcmVSZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgZGF0YVNlcnZpY2VSZXF1ZXN0LnRoZW4oYXN5bmMgZGF0YSA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc2VkRGF0YSA9IGF3YWl0IHNlbGYucHJvY2Vzc1JlcXVlc3RlZEFwcChpZCwgZGF0YSk7IC8vaGVyZVxuXG4gICAgICAgICAgICAvLyBsZXQgY29tcGFyaXNvbiA9IHRoaXMuZ3VkaHViLnV0aWwuY29tcGFyZUl0ZW1zKFtdLCBwcm9jZXNzZWREYXRhLml0ZW1zX2xpc3QpO1xuXG4gICAgICAgICAgICAvLyBsZXQgY2FjaGVkXG5cbiAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgICBzZWxmLnB1dEFwcChpZCwgcHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRhdGFTZXJ2aWNlUmVxdWVzdC50aGVuKGFzeW5jIGRhdGEgPT4ge1xuICAgICAgICAgIGxldCBwcm9jZXNzZWREYXRhID0gYXdhaXQgc2VsZi5wcm9jZXNzUmVxdWVzdGVkQXBwKGlkLCBkYXRhKTsgLy9oZXJlXG5cbiAgICAgICAgICAvLyBsZXQgY29tcGFyaXNvbiA9IHRoaXMuZ3VkaHViLnV0aWwuY29tcGFyZUl0ZW1zKFtdLCBwcm9jZXNzZWREYXRhLml0ZW1zX2xpc3QpO1xuXG4gICAgICAgICAgLy8gbGV0IGNhY2hlZFxuXG4gICAgICAgICAgcmVzb2x2ZShwcm9jZXNzZWREYXRhKTtcbiAgICAgICAgICBzZWxmLnB1dEFwcChpZCwgcHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBzZWxmLnJlcXVlc3RDYWNoZS5zZXQoaWQsIHByKTtcblxuICAgIHJldHVybiBwcjtcbiAgfVxuICBhc3luYyBnZXRDYWNoZWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZU1hbmFnZXIuZ2V0QXBwKGlkKTsgLy9UT0RPIGludmVzdGlnYXRlIG1ldGhvZCBuYW1lXG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgbGV0IHByID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VsZi5vcGVuRGF0YWJhc2UoKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzZWxmLmRiLnRyYW5zYWN0aW9uKHNlbGYuc3RvcmUsIFwicmVhZG9ubHlcIik7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5zdG9yZSk7XG4gICAgICAgIGNvbnN0IHN0b3JlUmVxdWVzdCA9IHN0b3JlLmdldChpZCk7XG4gICAgICAgIHN0b3JlUmVxdWVzdC5vbnN1Y2Nlc3MgPSBlID0+IHtcbiAgICAgICAgICBsZXQgY2FjaGVkRGF0YSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICBpZiAoIWNhY2hlZERhdGEpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FjaGVkRGF0YSkge1xuICAgICAgICAgICAgcmVzb2x2ZShjYWNoZWREYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHN0b3JlUmVxdWVzdC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByO1xuICB9XG4gIGFzeW5jIHB1dEFwcChpZCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlTWFuYWdlci5wdXRBcHAoaWQsIGRhdGEpO1xuXG4gICAgLy8gdHJ5IHsgICAgICAgIFxuICAgIC8vICAgYXdhaXQgdGhpcy5vcGVuRGF0YWJhc2UoKTtcblxuICAgIC8vICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmUsIFwicmVhZHdyaXRlXCIpO1xuICAgIC8vICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLnN0b3JlKTtcblxuICAgIC8vICAgc3RvcmUucHV0KGRhdGEsIGlkKTtcbiAgICAvLyB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgLy8gfVxuICB9XG5cbiAgLy8gZHVwbGljYXRlZCBjb2RlIDIgdGltZXMgaW4gMiBjbGFzc2VzIG9wZW5EYXRhYmFzZVxuXG4gIC8vIGFzeW5jIG9wZW5EYXRhYmFzZSgpIHtcbiAgLy8gICBpZiAodGhpcy5kYikgcmV0dXJuIHRoaXMuZGI7XG5cbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lLCB0aGlzLmRiVmVyc2lvbik7XG5cbiAgLy8gICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4ge1xuICAvLyAgICAgICB0aGlzLmRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLmRiKTtcbiAgLy8gICAgIH07XG4gIC8vICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiB7XG4gIC8vICAgICAgIHJlamVjdChldmVudC50YXJnZXQuZXJyb3IpO1xuICAvLyAgICAgfTtcbiAgLy8gICB9KTtcbiAgLy8gfVxufVxuXG5jbGFzcyBJbmRleGVkREJBcHBTZXJ2aWNlIGV4dGVuZHMgQXBwRGF0YVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihyZXEsIGNvbmYsIGd1ZGh1Yikge1xuICAgIHN1cGVyKHJlcSwgY29uZiwgZ3VkaHViKTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gbmV3IEFwcEh0dHBTZXJ2aWNlKHJlcSwgY29uZiwgZ3VkaHViKTsgLy8gVE9ETyBpc250IHVzZWQgaW4gY2xhc3MuIFdoeT9cblxuICAgIC8vIGxldCBpbmRleERCU2VydmljZSA9IG5ldyBJbmRleGVkREJTZXJ2aWNlKGNvbmYpO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q2FjaGUgPSBuZXcgTWFwKCk7IC8vIGlkIC0+IHByb21pc2UgLy8vVE9ETyBzZWVtcyBpcnJlbGV2YW50IHRvIGNsYXNzIEluZGV4ZWREQk1hbmFnZXIgKGNvdWxkIGJlIHJlbmFtZWQgdG8gRmFjYWRlIGFscmVhZHkpXG5cbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgICB0aGlzLnJlc29sdmVGbk1hcCA9IG5ldyBNYXAoKTsgLy8gaWQgLT4gcmVzb2x2ZVxuXG4gICAgLy8gdGhpcy5hcHBSZXF1ZXN0QW5kUHJvY2Vzc1dvcmtlciA9IG5ldyBXb3JrZXIoJy4vYXBwUmVxdWVzdFdvcmtlci5qcycpO1xuICAgIC8vIHRoaXMuYXBwUmVxdWVzdEFuZFByb2Nlc3NXb3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJy4vYXBwUmVxdWVzdFdvcmtlci5qcycsIGltcG9ydC5tZXRhLnVybCkpO1xuICAgIC8vIHRoaXMuYXBwUmVxdWVzdEFuZFByb2Nlc3NXb3JrZXIgPSBuZXcgV29ya2VyKCdub2RlX21vZHVsZXMvQGd1ZGh1Yi9jb3JlL3VtZC9hcHBSZXF1ZXN0V29ya2VyLmpzJyk7XG4gICAgLy8gdGhpcy5hcHBSZXF1ZXN0QW5kUHJvY2Vzc1dvcmtlciA9IG5ldyBXb3JrZXIoJ292ZXJyaWRlX25wbS9ndWRodWIvdW1kL2FwcFJlcXVlc3RXb3JrZXIuanMnKTsvL1xuXG4gICAgdGhpcy5hcHBSZXF1ZXN0QW5kUHJvY2Vzc1dvcmtlciA9IG5ldyBXb3JrZXIobmV3IFVSTCgvKiB3b3JrZXIgaW1wb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18ucCArIF9fd2VicGFja19yZXF1aXJlX18udSgyODcpLCBfX3dlYnBhY2tfcmVxdWlyZV9fLmIpKTtcbiAgICAvLyB0aGlzLmFwcFJlcXVlc3RBbmRQcm9jZXNzV29ya2VyID0gbmV3IEFwcFJlcXVlc3RXb3JrZXIoKTtcblxuICAgIC8vIG5ldyBXb3JrZXIobmV3IFVSTCgnLi93b3JrZXIuanMnLCBpbXBvcnQubWV0YS51cmwpKTtcblxuICAgIHRoaXMuYXBwUmVxdWVzdEFuZFByb2Nlc3NXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogJ2luaXQnLFxuICAgICAgZ3VkaHViU2VyaWFsaXplZDogdGhpcy5ndWRodWIuc2VyaWFsaXplZFxuICAgIH0pO1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmFwcFJlcXVlc3RBbmRQcm9jZXNzV29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gc2VsZi5hcHBSZXF1ZXN0QW5kUHJvY2Vzc1dvcmtlci50ZXJtaW5hdGUoKTtcblxuICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgaW4gd29ya2VyOicsIGUpO1xuICAgIH07XG5cbiAgICAvLyBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLmFwcFJlcXVlc3RBbmRQcm9jZXNzV29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5kYXRhLnR5cGUgPT0gJ3JlcXVlc3RBcHAnKSB7XG4gICAgICAgIGlmIChzZWxmLnJlc29sdmVGbk1hcC5oYXMoZS5kYXRhLmlkKSkge1xuICAgICAgICAgIGxldCByZXNvbHZlciA9IHNlbGYucmVzb2x2ZUZuTWFwLmdldChlLmRhdGEuaWQpO1xuICAgICAgICAgIHJlc29sdmVyKGUuZGF0YS5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlbGYucmVxdWVzdENhY2hlLnNldChpZCwgbmV3IFByb21pc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyB0b2RvIGNoZWNrIHRoaXMgZm9yIG5ldyBjb2RlXG4gICAgICAvLyB0b2RvIG91dGRhdGVkIGNvZGUsIHRvIHJlbW92ZVxuICAgICAgaWYgKGUuZGF0YS50eXBlID09ICdwcm9jZXNzRGF0YScpIHtcbiAgICAgICAgLy8gaWYgKGlkID09IGUuZGF0YS5pZCkge1xuICAgICAgICBzZWxmLmd1ZGh1Yi5pdGVtUHJvY2Vzc29yLmhhbmRsZURpZmYoZS5kYXRhLmlkLCBlLmRhdGEuY29tcGFyZVJlcyk7XG4gICAgICAgIGlmIChlLmRhdGEudmlld0xpc3RDaGFuZ2VkIHx8IGUuZGF0YS5maWVsZExpc3RDaGFuZ2VkKSB7XG4gICAgICAgICAgc2VsZi5ndWRodWIuYXBwUHJvY2Vzc29yLnVwZGF0ZUFwcEZpZWxkc0FuZFZpZXdzKGUuZGF0YS5uZXdWZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaGVyZVxuXG4gICAgICAgIC8vIH1cbiAgICAgIH1cblxuICAgICAgLy8gd29ya2VyLnRlcm1pbmF0ZSgpO1xuXG4gICAgICAvLyB0aGlzLnBvc3RNZXNzYWdlKHtpZDogZS5kYXRhLmlkLCBjb21wYXJlUmVzOiBjb21wYXJpc29ufSk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdEYXRhIHByb2Nlc3NlZCBieSB3b3JrZXI6JywgZS5kYXRhKTtcbiAgICB9O1xuXG4gICAgLy8gd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgLy8gICAvLyB3b3JrZXIudGVybWluYXRlKCk7XG5cbiAgICAvLyAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHdvcmtlcjonLCBlKTtcbiAgICAvLyB9O1xuXG4gICAgLy90b2RvIHdvcmtlciBwb29sP1xuXG4gICAgdGhpcy5zdG9yZU1hbmFnZXIgPSBuZXcgQXBwU3RvcmVNYW5hZ2VyKCk7XG5cbiAgICAvLyBvYmplY3RBc3NpZ25XaXRoT3ZlcnJpZGUodGhpcywgaW5kZXhEQlNlcnZpY2UpO1xuICAgIC8vIG9iamVjdEFzc2lnbldpdGhPdmVycmlkZSh0aGlzLCBuZXcgQXBwU3RvcmVNYW5hZ2VyKCkpO1xuICB9XG5cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEluZGV4ZWREQkFwcFNlcnZpY2UpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgSW5kZXhlZERCU2VydmljZSkgcmV0dXJuIHRydWU7IC8vVE9ETyByZXF1aXJlcyBtdWx0aXBsZSBpbmhlcml0YW5jZSwgdGhoaW5rIGhvdyB0byBvdmVyY29tZSBpdFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy9UT0RPIHVzZSBJbmRleGVkREJGYWNhZGUgaGVyZVxuICAvLyBpbmRleERCQWNjZXNzID0gbmV3IEluZGV4ZWREQkZhY2FkZTtcblxuICBpc1dpdGhDYWNoZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vZG9lc250IHVzZSBpbmRleGVkZGJcbiAgfVxuXG4gIGFzeW5jIGdldEFwcChpZCkge1xuICAgIC8vVE9ETyAtPiBnZXQ/XG4gICAgaWYgKHRoaXMucmVxdWVzdENhY2hlLmhhcyhpZCkpIHJldHVybiB0aGlzLnJlcXVlc3RDYWNoZS5nZXQoaWQpOyAvLyDQv9C+INGN0YLQvtC80YMg0LrQvtC00YMg0LXRgdGC0Ywg0LLQvtC/0YDQvtGBIC0g0LLRi9C30L7QstGLIGdldEFwcCAg0LrQtdGI0LjRgNGD0Y7RgtGB0Y8g0LLRi9GI0LUg0Lgg0YLQvtCz0LTQsCDQstGL0YXQvtC00LjRgiDQstC+0LfQstGA0LDRidCw0LXRgtGB0Y8g0YHRgtCw0YDQsNGPINCy0LXRgNGB0LjRjz9cblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBsZXQgaGFzSWQgPSBhd2FpdCB0aGlzLmhhcyhpZCk7XG4gICAgaWYgKGZhbHNlKSB7fSBlbHNlIHtcbiAgICAgIC8vIHRoaXMucmVxdWVzdENhY2hlLnNldChpZCwgbmV3IFByb21pc2UpO1xuXG4gICAgICBsZXQgcHJtcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgc2VsZi5yZXNvbHZlRm5NYXAuc2V0KGlkLCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q2FjaGUuc2V0KGlkLCBwcm1zKTtcblxuICAgICAgLy90b2RvIGRlZmluZSB0eXBlcyBhcyBjb25zdGFudHNcbiAgICAgIHRoaXMuYXBwUmVxdWVzdEFuZFByb2Nlc3NXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiAncmVxdWVzdEFwcCcsXG4gICAgICAgIGlkOiBpZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJtcztcblxuICAgICAgLy90b2RvIHNvbWVob3cgaGFuZGxlIGFuc3dlciBmcm9tIHdvcmtlclxuXG4gICAgICAvL21heWJlIHVzZSBtZXNhZ2UgbGlicmFyeSB0byBjb21tdW5pY2F0ZSB3aXRoIHdvcmtlclxuICAgIH1cblxuICAgIC8vIGxldCB3b3JrZXIgPSBuZXcgV29ya2VyKCcuL2FwcFJlcXVlc3RXb3JrZXIuanMnKTtcblxuICAgIC8vIHdvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6ICdpbml0JywgZ3VkaHViU2VyaWFsaXplZDogdGhpcy5ndWRodWIuc2VyaWFsaXplZCB9KTtcblxuICAgIC8vIFNlbmQgdGhlIG1haW4gZGF0YSB0byBiZSBwcm9jZXNzZWRcbiAgICAvLyBjb25zdCBtYWluRGF0YSA9IHsgLyogeW91ciBkYXRhIGhlcmUgKi8gfTtcbiAgICAvLyB0aGlzLmFwcFJlcXVlc3RBbmRQcm9jZXNzV29ya2VyLnBvc3RNZXNzYWdlKHsgdHlwZTogJ3Byb2Nlc3NEYXRhJywgaWQ6IGlkIH0pO1xuXG4gICAgLy8gbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcblxuICAgIC8vICAgaWYgKGlkID09IGUuZGF0YS5pZCkge1xuICAgIC8vICAgICBzZWxmLmd1ZGh1Yi5pdGVtUHJvY2Vzc29yLmhhbmRsZURpZmYoZS5kYXRhLmlkLCBlLmRhdGEuY29tcGFyZVJlcyk7XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIC8vIHdvcmtlci50ZXJtaW5hdGUoKTtcblxuICAgIC8vICAgLy8gdGhpcy5wb3N0TWVzc2FnZSh7aWQ6IGUuZGF0YS5pZCwgY29tcGFyZVJlczogY29tcGFyaXNvbn0pO1xuXG4gICAgLy8gICAvLyBjb25zb2xlLmxvZygnRGF0YSBwcm9jZXNzZWQgYnkgd29ya2VyOicsIGUuZGF0YSk7XG4gICAgLy8gfTtcblxuICAgIC8vIHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgIC8vICAgLy8gd29ya2VyLnRlcm1pbmF0ZSgpO1xuXG4gICAgLy8gICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB3b3JrZXI6JywgZSk7XG4gICAgLy8gfTtcblxuICAgIC8vIHJldHVybiBnZXRGcm9tREJQcm1zO1xuICB9XG5cbiAgLy9UT0RPIHBhZ2UgaXNudCBsb2FkZWQgd2hlbiBpbmRleGVkZGIgZW1wdHkuIEludmVzdGlnYXRlIGdldEFwcCBpbiBJbmRleGVkREJBcHBTZXJ2aWNlIGhlcmVcblxuICBhc3luYyBnZXRDYWNoZWQoaWQpIHtcbiAgICAvL1RPRE8gLT4gZ2V0RnJvbVN0b3JlP1xuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVNYW5hZ2VyLmdldEFwcChpZCk7IC8vVE9ETyBpbnZlc3RpZ2F0ZSBtZXRob2QgbmFtZVxuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBwciA9IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlbGYub3BlbkRhdGFiYXNlKCk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gc2VsZi5kYi50cmFuc2FjdGlvbihzZWxmLnN0b3JlLCBcInJlYWRvbmx5XCIpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuc3RvcmUpO1xuICAgICAgICBjb25zdCBzdG9yZVJlcXVlc3QgPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICBzdG9yZVJlcXVlc3Qub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgbGV0IGNhY2hlZERhdGEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgaWYgKCFjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhY2hlZERhdGEpIHtcbiAgICAgICAgICAgIHJlc29sdmUoY2FjaGVkRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzdG9yZVJlcXVlc3Qub25lcnJvciA9IHJlamVjdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcjtcbiAgfVxuICBhc3luYyBoYXMoaWQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmVNYW5hZ2VyLmhhc0FwcChpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vIHRyeSB7XG4gICAgLy8gICBsZXQgY2FjaGVkID0gYXdhaXQgdGhpcy5nZXRDYWNoZWQoaWQpO1xuXG4gICAgLy8gICBpZiAoIWNhY2hlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9IGNhdGNoKGUpIHtcbiAgICAvLyAgIC8vdG9kbyBjaGVjayBlcnJvciB0eXBlIGFuZCB0aGVuIHJldGhyb3cgbWF5YmUgaGVyZVxuXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuICB9XG5cbiAgYXN5bmMgcHV0QXBwKGlkLCBkYXRhKSB7XG4gICAgLy9UT0RPIC0+IHB1dD9cbiAgICByZXR1cm4gdGhpcy5zdG9yZU1hbmFnZXIucHV0QXBwKGlkLCBkYXRhKTtcblxuICAgIC8vIHRyeSB7ICAgICAgICBcbiAgICAvLyAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5vcGVuRGF0YWJhc2UoKTtcblxuICAgIC8vICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbih0aGlzLnN0b3JlLCBcInJlYWR3cml0ZVwiKTtcbiAgICAvLyAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5zdG9yZSk7XG5cbiAgICAvLyAgIHN0b3JlLnB1dChkYXRhLCBpZCk7XG4gICAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgIC8vIH1cbiAgfVxuXG4gIC8vdG9kbyBvcGVuRGF0YWJhc2Ugb25seSBvbmNlIGFuZCB0aGVuIHByZXNlcnZlIGl0IGZvciBmdXJ0aGVyIHVzYWdlXG4gIC8vIGFzeW5jIG9wZW5EYXRhYmFzZSgpIHtcbiAgLy8gICBpZiAodGhpcy5kYikgcmV0dXJuIHRoaXMuZGI7XG5cbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lLCB0aGlzLmRiVmVyc2lvbik7XG5cbiAgLy8gICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4ge1xuICAvLyAgICAgICB0aGlzLmRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLmRiKTtcbiAgLy8gICAgIH07XG4gIC8vICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiB7XG4gIC8vICAgICAgIHJlamVjdChldmVudC50YXJnZXQuZXJyb3IpO1xuICAvLyAgICAgfTtcbiAgLy8gICB9KTtcbiAgLy8gfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0luZGV4ZWREQi9pbml0LmpzXG5cblxuXG5cblxuLy8gLy9UT0RPIG1vdmUgdG8gaW5kZXhlZGRibWFuYWdlclxuLy8gaWYgKFxuLy8gICAgIElTX0JST1dTRVJcbi8vICkge1xuLy8gICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIGRiVmVyc2lvbik7XG5cbi8vICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGV2ZW50ID0+IHtcbi8vICAgICAgICAgY29uc3QgZGIgPSBldmVudC50YXJnZXQucmVzdWx0O1xuXG4vLyAgICAgICAgIGZvciAobGV0IHN0b3JlIG9mIFthcHBzQ29uZi5zdG9yZSwgY2h1bmtzQ29uZi5zdG9yZV0pIHtcbi8vICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzdG9yZSkpIHtcbi8vICAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShzdG9yZSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9O1xuLy8gfVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL2V4cG9ydC5qc1xuXG5cblxuXG5cblxuXG5cblxuXG4vL1RPRE8gY29uZnMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgYXBwcm9wcmlhdGUgY2xhc3NlcyB0aGVyZWZvcmUgaXQgZG9lc250IG1ha2Ugc2Vuc2UgdG8gZXhwb3J0IHRoZW0gaGVyZVxuXG5sZXQgZXhwb3J0X0FwcERhdGFTZXJ2aWNlO1xubGV0IGV4cG9ydF9DaHVua0RhdGFTZXJ2aWNlO1xubGV0IGFwcERhdGFTZXJ2aWNlQ29uZjtcbmxldCBjaHVua0RhdGFTZXJ2aWNlQ29uZjtcbmlmIChjb25zdHMvKiBJU19CUk9XU0VSICovLlFnICYmIGNhY2hlX2NodW5rX3JlcXVlc3RzKSB7XG4gIGV4cG9ydF9DaHVua0RhdGFTZXJ2aWNlID0gSW5kZXhlZERCQ2h1bmtTZXJ2aWNlO1xuICBjaHVua0RhdGFTZXJ2aWNlQ29uZiA9IGNodW5rRGF0YUNvbmZfY2h1bmtzQ29uZjtcbn0gZWxzZSB7XG4gIGV4cG9ydF9DaHVua0RhdGFTZXJ2aWNlID0gQ2h1bmtIdHRwU2VydmljZTtcbn1cbmlmIChjb25zdHMvKiBJU19CUk9XU0VSICovLlFnICYmIGNhY2hlX2FwcF9yZXF1ZXN0cyAvLyB0b2RvIGhlcmUgb3V0ZGF0ZWQgYXBwcm9hY2hcbikge1xuICBleHBvcnRfQXBwRGF0YVNlcnZpY2UgPSBJbmRleGVkREJBcHBTZXJ2aWNlOyAvLyBoZXJlIHdpbGwgYmUgQXBwSHR0cFNlcnZpY2UgZm9yIGJyb3dzZXIgdG9vLCBjaGVjayBjb21wYXRhYmlsaXR5LiBDaGVja2VkLiBzZWVtcyBkaWZmZXJlbnQgY29kZS4gSW5kZXhlZERCQXBwU2VydmljZSB1c2VzIHdvcmtlclxuICBhcHBEYXRhU2VydmljZUNvbmYgPSBhcHBzQ29uZjtcbn0gZWxzZSB7XG4gIGV4cG9ydF9BcHBEYXRhU2VydmljZSA9IEFwcEh0dHBTZXJ2aWNlO1xufVxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzXG52YXIgYXhpb3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NjkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL3V0aWxzLmpzXG5mdW5jdGlvbiByZXBsYWNlU3BlY2lhbENoYXJhY3RlcnMob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopLnJlcGxhY2UoL1xcK3wmfCUvZywgbWF0Y2ggPT4ge1xuICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgIGNhc2UgXCIrXCI6XG4gICAgICAgIHJldHVybiBcIiUyQlwiO1xuICAgICAgY2FzZSBcIiZcIjpcbiAgICAgICAgcmV0dXJuIFwiJTI2XCI7XG4gICAgICBjYXNlIFwiJVwiOlxuICAgICAgICByZXR1cm4gXCIlMjVcIjtcbiAgICB9XG4gIH0pO1xufVxuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTFRFUklORyBJVEVNJ3MgRklFTERTIEJFRk9SRSBTRU5ESU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKi0tIENoZWNraW5nIGlmIHNvbWUgZmllbGRzIGhhcyBudWxsIGluIGZpZWxkX3ZhbHVlICggd2UgZG9uJ3Qgc2VuZCBzdWNoIGZpZWxkcyApKi9cbmZ1bmN0aW9uIGZpbHRlckZpZWxkcyhmaWVsZHNUb0ZpbHRlciA9IFtdKSB7XG4gIHJldHVybiBmaWVsZHNUb0ZpbHRlci5maWx0ZXIoZmllbGQgPT4gZmllbGQuZmllbGRfdmFsdWUgIT0gbnVsbCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0T2JqVG9VcmxQYXJhbXMob2JqID0ge30pIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiBcIlwiO1xuICByZXR1cm4gYCYke2VudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKFwiJlwiKX1gO1xufVxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanNcbnZhciBsaWIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvZ3VkaHViLWh0dHBzLXNlcnZpY2UuanNcbi8vKioqKioqKioqKioqKioqKioqIEdVREhVQiBIVFRQUyBTRVJWSUNFICoqKioqKioqKioqKioqKioqKioqKioqLy9cbi8vLS0gVGhpcyBTZXJ2aWNlIGRlY29yYXRlcyBlYWNoIFBPU1QgYW5kIEdFVCByZXF1ZXN0IHdpdGggVG9rZW5cbi8vLS0gVGhpcyBTZXJ2aWNlIHRha2UgY2FyZSBvZiB0b2tpbmcgYmVlaW5nIGFsd2F5cyB2YWxpZFxuXG5cblxuXG5jbGFzcyBHdWRIdWJIdHRwc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihzZXJ2ZXJfdXJsKSB7XG4gICAgdGhpcy5yb290ID0gc2VydmVyX3VybDtcbiAgICB0aGlzLnJlcXVlc3RQcm9taXNlcyA9IFtdO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKiogSU5JVElBTElTQVRJT04gKioqKioqKioqKioqKiovL1xuICAvLyBIZXJlIHdlIHNldCBhIGZ1bmN0aW9uIHRvIGdldCB0b2tlblxuICBpbml0KGdldFRva2VuKSB7XG4gICAgdGhpcy5nZXRUb2tlbiA9IGdldFRva2VuO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogR0VUICoqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgYXN5bmMgZ2V0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICBjb25zdCBoZXNoID0gdGhpcy5nZXRIYXNoQ29kZShyZXF1ZXN0KTtcbiAgICBpZiAodGhpcy5yZXF1ZXN0UHJvbWlzZXNbaGVzaF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RQcm9taXNlc1toZXNoXS5wcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHVybDtcbiAgICAgIGlmIChyZXF1ZXN0LmV4dGVybmFsUmVzb3VyY2UpIHtcbiAgICAgICAgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgPSB0aGlzLnJvb3QgKyByZXF1ZXN0LnVybDtcbiAgICAgICAgdXJsID0gYCR7dXJsfSR7L1xcPy8udGVzdCh1cmwpID8gXCImXCIgOiBcIj9cIn10b2tlbj0ke2FjY2Vzc1Rva2VufSR7Y29udmVydE9ialRvVXJsUGFyYW1zKHJlcXVlc3QucGFyYW1zKX1gO1xuICAgICAgfVxuICAgICAgYXhpb3MuZ2V0KHVybCwge1xuICAgICAgICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgIHJldHVybiBzdGF0dXMgPCA0MDA7IC8vIFJlc29sdmUgb25seSBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgbGVzcyB0aGFuIDQwMFxuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9IDIwMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEdVREhVQiBIVFRQIFNFUlZJQ0U6IEdFVCBFUlJPUjogJHtyZXNwb25zZS5zdGF0dXN9YCwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBzdWNjZXNzXG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEdVREhVQiBIVFRQIFNFUlZJQ0U6IEdFVCBFUlJPUjogJHtlcnIucmVzcG9uc2Uuc3RhdHVzfVxcbmAsIGVycik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdCBtZXNzYWdlOiBcIiwgcmVxdWVzdCk7XG4gICAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgcmVzcG9uc2UgZGF0YTogJywgZXJyLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5wdXNoUHJvbWlzZShwcm9taXNlLCBoZXNoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIFBPU1QgKioqKioqKioqKioqKioqKioqKioqKiovL1xuICBhc3luYyBwb3N0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBoZXNoID0gdGhpcy5nZXRIYXNoQ29kZShyZXF1ZXN0KTtcbiAgICByZXF1ZXN0LmZvcm1bXCJ0b2tlblwiXSA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICBpZiAodGhpcy5yZXF1ZXN0UHJvbWlzZXNbaGVzaF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RQcm9taXNlc1toZXNoXS5wcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3MucG9zdCh0aGlzLnJvb3QgKyByZXF1ZXN0LnVybCwgbGliLnN0cmluZ2lmeShyZXF1ZXN0LmZvcm0pLCB7XG4gICAgICAgIG1heEJvZHlMZW5ndGg6IEluZmluaXR5LFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfHwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzIDwgNDAwOyAvLyBSZXNvbHZlIG9ubHkgaWYgdGhlIHN0YXR1cyBjb2RlIGlzIGxlc3MgdGhhbiA0MDBcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSAyMDApIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBHVURIVUIgSFRUUCBTRVJWSUNFOiBQT1NUIEVSUk9SOiAke3Jlc3BvbnNlLnN0YXR1c31gLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBHVURIVUIgSFRUUCBTRVJWSUNFOiBQT1NUIEVSUk9SOiAke2Vycm9yLnJlc3BvbnNlLnN0YXR1c31cXG5gLCBlcnJvcik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdCBtZXNzYWdlOiBcIiwgcmVxdWVzdCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnB1c2hQcm9taXNlKHByb21pc2UsIGhlc2gpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBWElPUyBSRVFVRVNUICoqKioqKioqKioqKioqKi9cbiAgLy8gSXQncyB1c2luZyB0byBzZW5kIHNpbXBsZSByZXF1ZXN0cyB0byBjdXN0b20gdXJscyB3aXRob3V0IHRva2VuXG4gIC8vIElmIHlvdSB3YW50IHRvIHNlbmQgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkLCBwYXNzIGRhdGEgaW4gJ2Zvcm0nIHByb3BlcnR5IG9mIHJlcXVlc3RcbiAgLy8gSWYgeW91IHdudCB0byBzZW5kIGFueSBvdGhlciB0eXBlIG9mIGRhdGEsIGp1c3QgcGFzcyBpdCB0byAnYm9keScgcHJvcGVydHkgb2YgcmVxdWVzdFxuXG4gIGF4aW9zUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgaGVzaCA9IHRoaXMuZ2V0SGFzaENvZGUocmVxdWVzdCk7XG4gICAgaWYgKHRoaXMucmVxdWVzdFByb21pc2VzW2hlc2hdKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UHJvbWlzZXNbaGVzaF0ucHJvbWlzZTtcbiAgICB9XG4gICAgbGV0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kID8gcmVxdWVzdC5tZXRob2QudG9Mb3dlckNhc2UoKSA6ICdnZXQnO1xuICAgIGxldCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICBsZXQgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycyB8fCB7fTtcbiAgICBpZiAocmVxdWVzdC5mb3JtKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSA9IGF3YWl0IGF4aW9zW21ldGhvZF0odXJsLCBtZXRob2QgPT09ICdwb3N0JyA/IGxpYi5zdHJpbmdpZnkocmVxdWVzdC5mb3JtKSB8fCByZXF1ZXN0LmJvZHkgOiB7XG4gICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9LCBtZXRob2QgPT09ICdwb3N0JyA/IHtcbiAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH0gOiB7fSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVSUk9SIC0+IEdVREhVQiBIVFRQIFNFUlZJQ0UgLT4gU0lNUExFIFBPU1QgOlwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJSZXF1ZXN0IG1lc3NhZ2U6IFwiLCByZXF1ZXN0KTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnB1c2hQcm9taXNlKHByb21pc2UsIGhlc2gpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBQVVNIIFBST01JU0UgKioqKioqKioqKioqKioqL1xuICAvLyBJdCBwdXNoIHByb21pc2Ugb2JqZWN0IGJ5IGhhc2ggdG8gdGhpcy5yZXF1ZXN0UHJvbWlzZXNcblxuICBwdXNoUHJvbWlzZShwcm9taXNlLCBoZXNoKSB7XG4gICAgdGhpcy5yZXF1ZXN0UHJvbWlzZXNbaGVzaF0gPSB7XG4gICAgICBwcm9taXNlLFxuICAgICAgaGVzaCxcbiAgICAgIGNhbGxiYWNrOiBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lQcm9taXNlKGhlc2gpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95UHJvbWlzZShoZXNoKTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKiogREVMRVRFIFBST01JU0UgKioqKioqKioqKioqKioqL1xuICAvLyBJdCBkZWxldGVzIHByb21pc2UgZnJvbSB0aGlzLnJlcXVlc3RQcm9taXNlcyBieSBoYXNoIGFmdGVyIHByb21pc2UgcmVzb2x2ZVxuXG4gIGRlc3Ryb3lQcm9taXNlKGhlc2gpIHtcbiAgICB0aGlzLnJlcXVlc3RQcm9taXNlcyA9IHRoaXMucmVxdWVzdFByb21pc2VzLmZpbHRlcihyZXF1ZXN0ID0+IHJlcXVlc3QuaGVzaCAhPT0gaGVzaCk7XG4gIH1cblxuICAvLyoqKioqKioqKioqKioqKioqKioqKiBHRVQgSEFTSCBDT0RFICoqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgLy8gaXQgZ2VuZXJhdGVzIG51bWVyaWMgaWRlbnRpZmljYXRvciB3aGlzaCBpcyB0aGUgc2FtZSBmb3Igc2ltaWxhciByZXF1ZXN0c1xuICAvLyBIQVNIIENPREUgaXMgZ2VuZXJhdGVkIGJhc2VkIG9uOiByZXF1ZXN0LnBhcmFtcywgcmVxdWVzdC51cmwsIHJlcXVlc3QuZm9ybVxuICBnZXRIYXNoQ29kZShyZXF1ZXN0KSB7XG4gICAgbGV0IGhhc2ggPSAwO1xuICAgIGxldCBzdHIgPSBsaWIuc3RyaW5naWZ5KHJlcXVlc3QpO1xuICAgIGlmIChzdHIubGVuZ3RoID09IDApIHJldHVybiBoYXNoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7XG4gICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICAgIH1cblxuICAgIHJldHVybiBcImhcIiArIGhhc2g7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9QaXBlU2VydmljZS91dGlscy5qc1xuZnVuY3Rpb24gY3JlYXRlSWQob2JqKSB7XG4gIGxldCBzdHJpbmdJZCA9IFwiXCI7XG4gIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0pIHtcbiAgICAgIHN0cmluZ0lkICs9IFwiLlwiICsgb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmdJZCA/IHN0cmluZ0lkLnN1YnN0cmluZygxKSA6IFwiYW55XCI7XG59XG5mdW5jdGlvbiBjaGVja1BhcmFtcyh0eXBlLCBkZXN0aW5hdGlvbiwgZm4pIHtcbiAgaWYgKHR5cGUgPT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc29sZS5sb2coXCJMaXN0ZW5lciB0eXBlIGlzIFxcXCJ1bmRlZmluZWRcXFwiIG9yIG5vdCBoYXZlIGFjdHVhbCAndHlwZScgZm9yIHN1YnNjcmliZVwiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRlc3RpbmF0aW9uID09IHVuZGVmaW5lZCB8fCB0eXBlb2YgZGVzdGluYXRpb24gIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zb2xlLmxvZyhcIkxpc3RlbmVyIGRlc3RpbmF0aW9uIGlzIFxcXCJ1bmRlZmluZWRcXFwiIG9yIG5vdCBoYXZlIGFjdHVhbCAndHlwZScgZm9yIHN1YnNjcmliZVwiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS5sb2coXCJMaXN0ZW5lciBpcyBub3QgYSBmdW5jdGlvbiBmb3Igc3Vic2NyaWJlIVwiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvUGlwZVNlcnZpY2UvUGlwZVNlcnZpY2UuanNcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKj09PT09PT09PT09PT09PT09PT09PT09PSAgICAgUElQRSBNT0RVTEUgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuLypcbnwgICAgPT09PT09PT09PT09PT09PT09PT09PT09IFBJUEUgRVZFTlRTIFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxufFxufFxufCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQUCBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnwgICAgJ2doX2FwcCcgLSBzZW5kIGV2ZW50IHdoZW4gZWxlbWVudCBpbml0aWFsaXNlZFxufCAgICAnZ2hfYXBwX2luZm9fZ2V0JyAtIFJldHVybiBhcHBfbmFtZSwgYXBwX2lkLCBhcHBfaWNvblxufCAgICAnZ2hfYXBwX2dldCcgLVxufCAgICAnZ2hfYXBwX3VwZGF0ZScgLVxufCAgICAnZ2hfYXBwc19saXN0X2dldCcgLVxufCAgICAnZ2hfZGVsZXRlX2FwcCcgLVxufCAgICAnZ2hfYXBwc19saXN0X3VwZGF0ZScgLVxufFxufCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZJRVcgRVZFTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG58ICAgICdnaF9hcHBfdmlld3NfdXBkYXRlJyAtXG58ICAgICdnaF9hcHBfdmlld19nZXQnIC1cbnwgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVRFTSBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG58XG58ICAgICdnaF9pdGVtc19nZXQnIC0gZ2V0IGl0ZW1zX2xpc3RcbnwgICAgJ2doX2l0ZW1zX2NodW5rc19nZXQnIC0gZ2V0IGl0ZW1zIHNwbGl0dGVkIHRvIGNodW5rcyB3aXRoIHNwZWNpZmllZCBjaHVuayBzaXplXG58ICAgICdnaF9pdGVtc191cGRhdGUnIC0gdXBkYXRlIGl0ZW1zX2xpc3RcbnxcbnwgICAgJ2doX2l0ZW1fdXBkYXRlJyAtIGl0ZW0ncyBhbnkgZmllbGQgdmFsdWUgdXBkYXRlXG58ICAgICdnaF9pdGVtX2dldCcgLSBpdGVtIGZpZWxkcyB2YWx1ZSBnZXRcbnxcbnwgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklFTEQgRVZFTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG58XG58ICAgICdnaF9tb2RlbF9nZXQnIC0gZ2V0IGZpZWxkIG1vZGVsIGluIGZpZWxkX2xpc3QuXG58ICAgICdnaF9tb2RlbF91cGRhdGUnIC0gdXBkYXRlIGZpZWxkIG1vZGVsIGluIGZpZWxkX2xpc3RcbnwgICAgJ2doX21vZGVsX2RlbGV0ZScgLSBkZWxldGUgZmllbGQgbW9kZWwgZnJvbSBmaWVsZF9saXN0IGFuZCBmcm9tIGl0ZW1zXG58XG58XG58XG58ICAgICdnaF9tb2RlbHNfZWRpdCcgLSB1c2UgaW4gJ2VkaXRfdGVtcGxhdGUnLCdlZGl0X2ZpZWxkJyBhbmQgJ2VkaXRfaW50ZXJwcmV0YXRpb24nXG58ICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNcbnwgICAgJ2doX21vZGVsc19nZXQnIC0gZ2V0IGZpZWxkX21vZGVsIGxpc3QuXG58XG58XG58XG58ICAgICdnaF92YWx1ZV91cGRhdGUnIC0gdXBkYXRlIGZpZWxkIHZhbHVlIGluIGl0ZW1cbnwgICAgJ2doX3ZhbHVlX2dldCcgLSBnZXQgZmllbGQgdmFsdWVcbnwgICAgJ2doX2ludGVycHJldGVkX3ZhbHVlX2dldCcgLSBnZXQgZmllbGQgaW50ZXJwcmV0YXRpb25cbnwgICAgJ2doX3ZhbHVlX3NldCcgLSBzZXR0ZXIgb2YgZmllbGQgdmFsdWVcbnxcbiovXG5cblxuY2xhc3MgUGlwZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1YnNjcmliZXJzID0ge307XG4gICAgdGhpcy5tZXNzYWdlQm94ID0ge307XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPTiBQSVBFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIHwgIFBhcmFtczpcbiAgICAgICB8ICAgICd0eXBlJyAtIFN0cmluZyAocmVxdWlyZSkuIHR5cGUgb2YgZXZlbnQgKCdnaF9maWVsZF91cGRhdGUnLCAuLi4uLi4uLilcbiAgICAgICB8ICAgICAgICAgIGZyb20gZXZlbnQgbGlzdCBvciBtYXliZSAnZ2hfZmllbGRfdXBkYXRlIGdoX2ZpZWxkX3ZhbHVlX3VwZGF0ZSdcbiAgICAgICB8ICAgICdkZXN0aW5hdGlvbicgLSBPYmplY3QgKHJlcXVpcmUpLlxuICAgICAgIHwgICAgICB7XG4gICAgICAgfCAgICAgICAgYXBwX2lkOiAnJyxcbiAgICAgICB8ICAgICAgICBpdGVtX2lkOiAnJ1xuICAgICAgIHwgICAgICAgIGZpZWxkX2lkOiAnJ1xuICAgICAgIHwgICAgICB9XG4gICAgICAgfCAgICAnZm4nIC0gRnVuY3Rpb24gKHJlcXVpcmUpLiBjYWxsYmFjayBmdW5jdGlvblxuICAgICAgIHwgICAgJ3Njb3BlJyAtIFNjb3BlXG4gICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgb24odHlwZXMsIGRlc3RpbmF0aW9uLCBmbikge1xuICAgIGlmIChjaGVja1BhcmFtcyh0eXBlcywgZGVzdGluYXRpb24sIGZuKSkge1xuICAgICAgdHlwZXMuc3BsaXQoXCIgXCIpLm1hcCh0eXBlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGUgKyBcIjpcIiArIGNyZWF0ZUlkKGRlc3RpbmF0aW9uKTtcbiAgICAgIH0pLmZvckVhY2godHlwZVdpdGhJZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpYmVyc1t0eXBlV2l0aElkXSkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnNbdHlwZVdpdGhJZF0gPSBuZXcgU2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1t0eXBlV2l0aElkXS5hZGQoZm4pO1xuXG4gICAgICAgIC8vY2hlY2tpbmcgZm9yIG1lc3NlZ2VzIHRob3NlIHdlcmUgc2VudCBiZWZvcmUgc3Vic2NyaXB0aW9uIGNyZWF0ZWRcbiAgICAgICAgdGhpcy5jaGVja01lc3NhZ2VCb3godHlwZVdpdGhJZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFTUlUIFBJUEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICB8ICBQYXJhbXM6XG4gICAgICAgfCAgICAndHlwZScgLSBTdHJpbmcgKHJlcXVpcmUpLiB0eXBlIG9mIGV2ZW50ICgnZ2hfZmllbGRfdXBkYXRlJywgLi4uLi4uLi4pXG4gICAgICAgfCAgICAgICAgICAgIGZyb20gZXZlbnRsaXN0XG4gICAgICAgfCAgICAnZGVzdGluYXRpb24nIC0gT2JqZWN0IChyZXF1aXJlKS5cbiAgICAgICB8ICAgICAgICB7XG4gICAgICAgfCAgICAgICAgICBhcHBfaWQ6ICcnLFxuICAgICAgIHwgICAgICAgICAgaXRlbV9pZDogJydcbiAgICAgICB8ICAgICAgICAgIGZpZWxkX2lkOiAnJ1xuICAgICAgIHwgICAgICAgIH1cbiAgICAgICB8ICAgICd2YWx1ZScgLSBBbnkgKHJlcXVpcmUpLiBFbWl0ZXIgdmFsdWUgdG8gIHN1YnNjcmliZXJzXG4gICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIGVtaXQodHlwZXMsIGRlc3RpbmF0aW9uLCB2YWx1ZSwgcGFyYW1zKSB7XG4gICAgdHlwZXMuc3BsaXQoXCIgXCIpLmZvckVhY2godHlwZSA9PiB7XG4gICAgICBjb25zdCBsaXN0ZW5lck5hbWUgPSB0eXBlICsgXCI6XCIgKyBjcmVhdGVJZChkZXN0aW5hdGlvbik7XG4gICAgICBsZXQgdG9CZVJlbW92ZWRTdGF0ZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnNbbGlzdGVuZXJOYW1lXSkge1xuICAgICAgICAvLyBpZiBzdWJzY3JpYmVycyBsaXN0IGlzIGVtcHR5IHdlIHB1dCBtZXNzYWdlIHRvIG1lc3NhZ2VCb3hcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnNbbGlzdGVuZXJOYW1lXS5zaXplID09IDApIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VCb3hbbGlzdGVuZXJOYW1lXSA9IFt0eXBlcywgZGVzdGluYXRpb24sIHZhbHVlLCBwYXJhbXMsIHRvQmVSZW1vdmVkU3RhdGVdO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VuZGluZyBtZXNzZWdlIHRvIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnNbbGlzdGVuZXJOYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIGZuKG51bGwsIHZhbHVlLCBwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIG5vIHN1YnNjcmliZXJzIGxpc3Qgd2UgcHV0IG1lc3NhZ2UgdG8gbWVzc2FnZUJveFxuICAgICAgICB0aGlzLm1lc3NhZ2VCb3hbbGlzdGVuZXJOYW1lXSA9IFt0eXBlcywgZGVzdGluYXRpb24sIHZhbHVlLCBwYXJhbXMsIHRvQmVSZW1vdmVkU3RhdGVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT04gUk9PVCBQSVBFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgfCAgUGFyYW1zOlxuICAgICAgIHwgICAgJ3R5cGUnIC0gU3RyaW5nIChyZXF1aXJlKS4gdHlwZSBvZiBldmVudCAoJ2doX2ZpZWxkX3VwZGF0ZScsIC4uLi4uLi4uKVxuICAgICAgIHwgICAgICAgICAgZnJvbSBldmVudCBsaXN0IG9yIG1heWJlICdnaF9maWVsZF91cGRhdGUgZ2hfZmllbGRfdmFsdWVfdXBkYXRlJ1xuICAgICAgIHwgICAgJ2Rlc3RpbmF0aW9uJyAtIE9iamVjdCAocmVxdWlyZSkuXG4gICAgICAgfCAgICAgIHtcbiAgICAgICB8ICAgICAgICBhcHBfaWQ6ICcnLFxuICAgICAgIHwgICAgICAgIGl0ZW1faWQ6ICcnXG4gICAgICAgfCAgICAgICAgZmllbGRfaWQ6ICcnXG4gICAgICAgfCAgICAgIH1cbiAgICAgICB8ICAgICdmbicgLSBGdW5jdGlvbiAocmVxdWlyZSkuIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgb25Sb290KHR5cGUsIGRlc3RpbmF0aW9uLCBmbikge1xuICAgIHJldHVybiB0aGlzLm9uKHR5cGUsIGRlc3RpbmF0aW9uLCBmbik7XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PSBERUxFVEUgTElTVEVORVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgfCAgUGFyYW1zOlxuICAgICAgIHwgICAgJ3R5cGUnIC0gU3RyaW5nIChyZXF1aXJlKS4gdHlwZSBvZiBldmVudCAoJ2doX2ZpZWxkX3VwZGF0ZScsIC4uLi4uLi4uKVxuICAgICAgIHwgICAgICAgICAgICBmcm9tIGV2ZW50bGlzdFxuICAgICAgIHwgICAgJ2Rlc3RpbmF0aW9uJyAtIE9iamVjdCAocmVxdWlyZSkuXG4gICAgICAgfCAgICAgICAge1xuICAgICAgIHwgICAgICAgICAgYXBwX2lkOiAnJyxcbiAgICAgICB8ICAgICAgICAgIGl0ZW1faWQ6ICcnXG4gICAgICAgfCAgICAgICAgICBmaWVsZF9pZDogJydcbiAgICAgICB8ICAgICAgICB9XG4gICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBkZXN0cm95KHR5cGVzLCBkZXN0aW5hdGlvbiwgZnVuYykge1xuICAgIHR5cGVzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXJOYW1lID0gdHlwZSArIFwiOlwiICsgY3JlYXRlSWQoZGVzdGluYXRpb24pO1xuXG4gICAgICAvL2lmIHdlIHBhc3MgYSBmdW5jdGlvbiB0aGVuIHdlIHJlbW92ZSBqdXN0IGZ1bmN0aW9uIGluIHN1YnNjcmliZXIgcHJvcGVydHlcbiAgICAgIGlmICh0aGlzLnN1YnNjcmliZXJzW2xpc3RlbmVyTmFtZV0gJiYgZnVuYykge1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2xpc3RlbmVyTmFtZV0uZGVsZXRlKGZ1bmMpO1xuICAgICAgfVxuXG4gICAgICAvL2lmIHdlIGFyZSBub3QgcGFzc2luZyBhIGZ1bmN0aW9uIHRoZW4gd2UgcmVtb3ZlIGEgc3Vic2NyaWJlciBwcm9wZXJ0eVxuICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnNbbGlzdGVuZXJOYW1lXSAmJiAhZnVuYykge1xuICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tsaXN0ZW5lck5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVTU0FHRSBCT1ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICB8ICBJZiBlbWl0dGluZyBldmVudCBzdGFydGVkIGVybGllciB0aGVuIHN1YnNjcmliZXIgYXBlYXJzIHRoZW4gd2Ugc2F2ZSBpdCB0byB0aGUgTWVzc2FnZUJveFxuICAgICAgIHwgIEFmdGVyIHN1YnNjcmliZXIgaXMgY3JlYXRlZCB3ZSB1cGRhdGUgY2hlY2sgTWVzc2FnZUJveCBmb3IgZW5jb21taW5nIG1lc3NlbmRnZXNcbiAgICAgICB8XG4gICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgY2hlY2tNZXNzYWdlQm94KGxpc3RlbmVyTmFtZSkge1xuICAgIC8vSGVyZSB3ZSBkZWxldGUgYWxsIG1lc3NhZ2VzIHRob3NlIGFyZSBtYXJrZWQgYXMgXCJ0byBiZSByZW1vdmVkXCJcbiAgICB0aGlzLmNsZWFuTWVzc3NhZ2VCb3goKTtcbiAgICBpZiAodGhpcy5tZXNzYWdlQm94W2xpc3RlbmVyTmFtZV0pIHtcbiAgICAgIC8vLS0gRW1pdGluZyBtZXNzYWdlcyBmcm9tIHRoZSBNZXNzYWdlQm94XG4gICAgICAvL1dlIHVzZSB0aW1lb3V0IHRvIGVtaXQgbWVzc2FnZSBhZnRlciBzdWJzY3JpYmVyIGlzIGNyZWF0ZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQm94W2xpc3RlbmVyTmFtZV0pIHtcbiAgICAgICAgICB0aGlzLmVtaXQoLi4udGhpcy5tZXNzYWdlQm94W2xpc3RlbmVyTmFtZV0pO1xuXG4gICAgICAgICAgLy93ZSBtYXJrIG1lc3NhZ2UgYWZ0ZXIgaXQgd2FzIHJlYWRlZCBhcyBcInRvIGJlIHJlbW92ZWRcIiB0byByZW1vdmUgaXQgaW4gbmV4dCBpdHJhdGlvbiBcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VCb3hbbGlzdGVuZXJOYW1lXVs0XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qLS0tLS0tLS0gQ0xFQU4gTUVTU0FHRSBCT1ggLS0tLS0tLS0tLS0qL1xuICAvLyBUaGlzIG1ldGhvZCBkZWxldGUgYWxsIG1lc3NhZ2VzIHRob3NlIGFyZSBtYXJrZWQgYXMgXCJ0byBiZSBkZWxldGVkXCJcbiAgLy8gVGhlIHRoaW5nIGlzIHRoYXQgd2UgY2FuJ3QgcmVtb3ZlIG1lc3NhZ2UgaW4gdGhlIHNhbWUgaXRlcmF0aW9uIHRoYXQgaXMgd3kgd2UgbWFyayB0aGVtIGFzIFwidG8gYmUgcmVtb3ZlZFxuICAvLyBhbmQgdGhlbiB3aWxsIHJlbW92ZSB0aGVtIGluIHRoZSBzZWNvbmQgaXRlcmF0aW9uIGp1c3QgYmVmb3JlIGNoZWNraW5nIHRoZSBNZXNzYWdlQm94XG4gIGNsZWFuTWVzc3NhZ2VCb3goKSB7XG4gICAgZm9yIChsZXQgbGlzdGVuZXJOYW1lIGluIHRoaXMubWVzc2FnZUJveCkge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZUJveFtsaXN0ZW5lck5hbWVdWzRdKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VCb3hbbGlzdGVuZXJOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9TdG9yYWdlL01vZHVsZXNMaXN0LmpzXG5mdW5jdGlvbiBnZW5lcmF0ZU1vZHVsZXNMaXN0KGFzeW5jX21vZHVsZXNfcGF0aCwgZmlsZV9zZXJ2ZXJfdXJsLCBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCkge1xuICByZXR1cm4gWy8qIEdIIEVMRU1FTlRTICovXG4gIHtcbiAgICBkYXRhX3R5cGU6IFwidGV4dFwiLFxuICAgIG5hbWU6IFwiVGV4dFwiLFxuICAgIGljb246IFwidGV4dF9pY29uXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInRleHRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ0ZXh0X29wdFwiLFxuICAgIG5hbWU6IFwiT3B0aW9uc1wiLFxuICAgIGljb246IFwib3B0aW9uX2doX2VsZW1lbnRcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidGV4dF9vcHRpb25zX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwibnVtYmVyXCIsXG4gICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICBpY29uOiBcIm51bWJlclwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJudW1iZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ0YXNrX2JvYXJkXCIsXG4gICAgbmFtZTogXCJUYXNrIEJvYXJkXCIsXG4gICAgaWNvbjogXCJ0YXNrX2JvYXJkXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInRhc2tfYm9hcmRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ2aXN1YWxpemVyXCIsXG4gICAgbmFtZTogXCJ2aXN1YWxpemVyXCIsXG4gICAgaWNvbjogJ3Zpc3VhbGl6ZXInLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ2aXN1YWxpemVyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZW50ZXJwcmljZV92aXN1YWxpemVyXCIsXG4gICAgbmFtZTogXCJFbnRlcnByaWNlIFZpc3VhbGl6ZXJcIixcbiAgICBpY29uOiBcInZpc3VhbGl6ZXJcIixcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJlbnRlcnByaWNlX3Zpc3VhbGl6ZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJlbWFpbFwiLFxuICAgIG5hbWU6IFwiRW1haWxcIixcbiAgICBpY29uOiBcImVtYWlsXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImVtYWlsX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdkYXRlJyxcbiAgICBuYW1lOiBcIkRhdGVcIixcbiAgICBpY29uOiBcImRhdGVfZ2hfZWxlbWVudFwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJkYXRlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdyYWRpb19idXR0b24nLFxuICAgIG5hbWU6IFwiUmFkaW8gQnV0dG9uXCIsXG4gICAgaWNvbjogXCJyYWRpb19idXR0b25fZ2hfZWxlbWVudFwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJyYWRpb19idXR0b25fZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ3JhZGlvX2ljb24nLFxuICAgIG5hbWU6IFwiUmFkaW8gaWNvblwiLFxuICAgIGljb246IFwicmFkaW9faWNvbl9naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInJhZGlvX2ljb25fZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ3R3aWxpb19waG9uZScsXG4gICAgbmFtZTogXCJUd2lsaW8gUGhvbmVcIixcbiAgICBpY29uOiBcInBob25lX3R3aWxpb19naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInR3aWxpb19waG9uZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInR3aWxpb19hdXRvZGlhbGVyXCIsXG4gICAgbmFtZTogXCJUd2lsaW8gQXV0byBEaWFsZXJcIixcbiAgICBpY29uOiBcInR3aWxpb19kaWFsZXJcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidHdpbGxpb19hdXRvZGlhbGVyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiY29sb3JcIixcbiAgICBuYW1lOiBcIkNvbG9yXCIsXG4gICAgaWNvbjogXCJwYWludF9naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImNvbG9yX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiY2hhcnRzXCIsXG4gICAgbmFtZTogXCJDaGFydHNcIixcbiAgICBpY29uOiBcImdyYXBoX2doX2VsZW1lbnRcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiY2hhcnRzX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdmdW5uZWxfY2hhcnQnLFxuICAgIG5hbWU6IFwiRnVubmVsIGNoYXJ0XCIsXG4gICAgaWNvbjogXCJmdW5uZWxfY2hhcnRfZ2hfZWxlbWVudFwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJmdW5uZWxfY2hhcnRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJhZGRfaXRlbXNfZnJvbV90ZW1wbGF0ZVwiLFxuICAgIG5hbWU6IFwiQWRkIGl0ZW1zIGZyb20gdGVtcGxhdGVcIixcbiAgICBpY29uOiBcImNvbnRhY3Rfc2Vjb25kXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImFkZF9pdGVtc19mcm9tX3RlbXBsYXRlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiaXRlbV9yZWZcIixcbiAgICBuYW1lOiBcIlJlZmVyZW5jZVwiLFxuICAgIGljb246IFwicmVmZXJlbmNlXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcIml0ZW1SZWZfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJjYWxlbmRhclwiLFxuICAgIG5hbWU6ICdDYWxlbmRhcicsXG4gICAgaWNvbjogJ2NhbGVuZGFyJyxcbiAgICBqczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL0Z1bGxDYWxlbmRhci1HaC1FbGVtZW50L2Rpc3QvbWFpbi5qcz90PTQnLFxuICAgIGNzczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL0Z1bGxDYWxlbmRhci1HaC1FbGVtZW50L2Rpc3Qvc3R5bGUuY3NzP3Q9MScsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6IFwiY2xhc3NcIlxuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImRhdGFfcmVmXCIsXG4gICAgbmFtZTogJ0RhdGEgUmVmZXJlbmNlJyxcbiAgICBpY29uOiAnZGF0YV9yZWZlcmVuY2UnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJkYXRhX3JlZl9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInRhYmxlXCIsXG4gICAgbmFtZTogJ1RhYmxlJyxcbiAgICBpY29uOiAndGFibGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ0YWJsZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInRpbGVcIixcbiAgICBuYW1lOiAnVGlsZSB0YWJsZScsXG4gICAgaWNvbjogJ3RpbGVfdGFibGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ0aWxlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZmlsZVwiLFxuICAgIG5hbWU6ICdGaWxlJyxcbiAgICBpY29uOiAnYm94JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZmlsZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImltYWdlXCIsXG4gICAgbmFtZTogJ0ltYWdlJyxcbiAgICBpY29uOiAnaW1hZ2UnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJpbWFnZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInRleHRfZWRpdG9yXCIsXG4gICAgbmFtZTogJ1RleHQgRWRpdG9yJyxcbiAgICBpY29uOiAnc3F1YXJlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidGV4dF9lZGl0b3JfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ0aW55bXNlXCIsXG4gICAgbmFtZTogJ1RleHQgZWRpdG9yIE1TRScsXG4gICAgaWNvbjogJ3RhZycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInRpbnltc2VfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJkdXJhdGlvblwiLFxuICAgIG5hbWU6ICdEdXJhdGlvbicsXG4gICAgaWNvbjogJ251bWJlcl9naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZHVyYXRpb25fZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ1c2VyXCIsXG4gICAgbmFtZTogJ1VzZXInLFxuICAgIGljb246ICd1c2VyX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ1c2VyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYXBwXCIsXG4gICAgbmFtZTogJ0FwcCcsXG4gICAgaWNvbjogJ2FwcCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImFwcGxpY2F0aW9uX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZmllbGRcIixcbiAgICBuYW1lOiAnRmllbGQnLFxuICAgIGljb246ICdmaWVsZF9naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZmllbGRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJhdmFpbGFibGVcIixcbiAgICBuYW1lOiAnQXZhaWxhYmxlJyxcbiAgICBpY29uOiAnYXZhaWxpYmxlX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJhdmFpbGFibGVfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ2aWV3X2xpc3RcIixcbiAgICBuYW1lOiAnVmlldyBMaXN0JyxcbiAgICBpY29uOiAndmlld19saXN0JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidmlld19saXN0X2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiY2FsY3VsYXRvclwiLFxuICAgIG5hbWU6ICdDYWxjdWxhdG9yJyxcbiAgICBpY29uOiAnY2FsY3VsYXRvcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImNhbGN1bGF0b3JfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJzdHJpbmdfam9pblwiLFxuICAgIG5hbWU6ICdTdHJpbmcgSm9pbmVyJyxcbiAgICBpY29uOiAnc3RyaW5nX2pvaW5fZ2hfZWxlbWVudCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInN0cmluZ19qb2luZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJzaWduYXR1cmVcIixcbiAgICBuYW1lOiAnU2lnbmF0dXJlJyxcbiAgICBpY29uOiAnc2lnbmF0dXJlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwic2lnbmF0dXJlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwic2VuZEVtYWlsXCIsXG4gICAgbmFtZTogJ1NlbmQgRW1haWwnLFxuICAgIGljb246ICdzZW5kX2VtYWlsX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJzZW5kX2VtYWlsX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYm9vbGVhblwiLFxuICAgIG5hbWU6ICdZZXMvTm8nLFxuICAgIGljb246ICdib29sZW5fZ2hfZWxlbWVudCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImJvb2xlYW5fZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJwcm9kdWN0X2dhbGxlcnlcIixcbiAgICBuYW1lOiAnUHJvZHVjdCBnYWxsZXJ5JyxcbiAgICBpY29uOiAncHJvZHVjdF9nYWxsZXJ5JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwicHJvZHVjdF9nYWxsZXJ5X2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwib25saW5lX2ludmVudG9yeVwiLFxuICAgIG5hbWU6ICdPbmxpbmUgaW52ZW50b3J5JyxcbiAgICBpY29uOiAnc2xhYicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcIm9ubGluZV9pbnZlbnRvcnlfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCIzZF9lZGdlc1wiLFxuICAgIG5hbWU6ICczRCBFZGdlcycsXG4gICAgaWNvbjogJzNkX2VkZ2VzX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCIzZF9lZGdlc19kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImNvbG9yX2xpc3RcIixcbiAgICBuYW1lOiAnQ29sb3IgbGlzdCcsXG4gICAgaWNvbjogJ2NpcmN1bGFyX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJjb2xvcl9saXN0X2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZ29fdG9fbGlua1wiLFxuICAgIG5hbWU6ICdHbyB0byBMaW5rJyxcbiAgICBpY29uOiAnZ29fdG9fbGluaycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImdvX3RvX2xpbmtfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJnb190b192aWV3XCIsXG4gICAgbmFtZTogJ0dvIHRvIFZpZXcnLFxuICAgIGljb246ICdnb190b192aWV3JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZ29fdG9fdmlld19kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInJhbmdlXCIsXG4gICAgbmFtZTogJ1JhbmdlJyxcbiAgICBpY29uOiAncmFuZ2VfZ2hfZWxlbWVudCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInJhbmdlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYmFyY29kZVwiLFxuICAgIG5hbWU6ICdCYXJjb2RlJyxcbiAgICBpY29uOiAnYmFyY29kZV9naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiYmFyY29kZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcIml0ZW1fcmVtb3RlX2FkZFwiLFxuICAgIG5hbWU6ICdJdGVtIHJlbW90ZSBhZGQnLFxuICAgIGljb246ICdyZW1vdGVfYWRkX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJpdGVtX3JlbW90ZV9hZGRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJpdGVtX3JlbW90ZV91cGRhdGVcIixcbiAgICBuYW1lOiAnSXRlbSByZW1vdGUgdXBkYXRlJyxcbiAgICBpY29uOiAncmVtb3RlX3VwZGF0ZV9naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiaXRlbV9yZW1vdGVfdXBkYXRlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwidGltZWxpbmVcIixcbiAgICBuYW1lOiAnVGltZWxpbmUnLFxuICAgIGljb246ICd0aW1lbGluZScsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInRpbWVsaW5lX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZGVsZXRlX2l0ZW1cIixcbiAgICBuYW1lOiAnRGVsZXRlIEl0ZW0nLFxuICAgIGljb246ICdydWJiaXNoJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZGVsZXRlX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJwcmludF9kb2NcIixcbiAgICBuYW1lOiAnUHJpbnQgZG9jdW1lbnQnLFxuICAgIGljb246ICdwcmludCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInByaW50X2RvY19hY3Rpb24uanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwib3Blbl9pdGVtXCIsXG4gICAgbmFtZTogJ09wZW4gSXRlbScsXG4gICAgaWNvbjogJ2RlbGV0ZScsXG4gICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwib3Blbl9pdGVtX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJlZGl0X3RlbXBsYXRlXCIsXG4gICAgbmFtZTogXCJFZGl0IHRlbXBsYXRlXCIsXG4gICAgaWNvbjogXCJkZWxldGVcIixcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJlZGl0X3RlbXBsYXRlX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJvcGVuX2FwcFwiLFxuICAgIHByaXZhdGU6IHRydWUsXG4gICAgbmFtZTogJ09wZW4gQXBwJyxcbiAgICBpY29uOiAnZGVsZXRlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwib3Blbl9hcHBfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInVzZXJfc2V0dGluZ3NcIixcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIG5hbWU6ICdVc2VyIFNldHRpbmdzJyxcbiAgICBpY29uOiAnZGVsZXRlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidXNlcl9zZXR0aW5nc19hY3Rpb24uanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYXBwX3NoYXJpbmdcIixcbiAgICBuYW1lOiAnU2hhcmluZycsXG4gICAgaWNvbjogJ3NoYXJpbmcnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJzaGFyaW5nX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJhcHBfY29uc3RydWN0b3JcIixcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIG5hbWU6ICdBcHAgY29uc3RydWN0b3InLFxuICAgIGljb246ICdhcHBfY29uc3RydWN0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJhcHBfY29uc3RydWN0b3JfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImFwcF9zZXR0aW5nc1wiLFxuICAgIG5hbWU6ICdBcHAgU2V0dGluZ3MnLFxuICAgIGljb246ICdjb25maWd1cmF0aW9uJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiYXBwX3NldHRpbmdzX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJleHBvcnRfY3N2XCIsXG4gICAgbmFtZTogJ0V4cG9ydCBDU1YnLFxuICAgIGljb246ICdleHBvcnRfY3N2JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZXhwb3J0X2Nzdi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJpbXBvcnRfY3N2XCIsXG4gICAgbmFtZTogXCJJbXBvcnQgQ1NWXCIsXG4gICAgaWNvbjogXCJpbXBvcnRfY3N2XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImltcG9ydF9jc3YuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYWRkX2l0ZW1zXCIsXG4gICAgbmFtZTogJ0FkZCBJdGVtcycsXG4gICAgaWNvbjogJ3BsdXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJhZGRfaXRlbXNfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInVwZGF0ZV9pdGVtc1wiLFxuICAgIG5hbWU6ICdVcGRhdGUgSXRlbXMnLFxuICAgIGljb246ICd1cGRhdGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ1cGRhdGVfaXRlbXNfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImluc3RhbGxfYXBwXCIsXG4gICAgbmFtZTogJ0luc3RhbGwnLFxuICAgIGljb246ICdpbnN0YWxsJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiaW5zdGFsbF9hcHBfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInNlYXJjaF9hY3Rpb25cIixcbiAgICBuYW1lOiAnU2VhcmNoJyxcbiAgICBpY29uOiAnc2VhcmNoJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwic2VhcmNoX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJmaWx0ZXJfdGFibGVcIixcbiAgICBuYW1lOiAnVGFibGUgZmlsdGVyJyxcbiAgICBpY29uOiAnZmlsdGVyJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZmlsdGVyX3RhYmxlX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJzbGlkZXJcIixcbiAgICBuYW1lOiAnU2xpZGVyJyxcbiAgICBpY29uOiAnc2xpZGVyJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwic2xpZGVyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiY2xvbmVfaXRlbVwiLFxuICAgIG5hbWU6ICdDbG9uZSBJdGVtJyxcbiAgICBpY29uOiAnZG91YmxlX3BsdXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJjbG9uZV9pdGVtX2FjdGlvbi5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJjbG9zZVwiLFxuICAgIG5hbWU6ICdDbG9zZScsXG4gICAgaWNvbjogJ2Nyb3NzJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiY2xvc2VfYWN0aW9uLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInBob25lXCIsXG4gICAgbmFtZTogJ1Bob25lJyxcbiAgICBpY29uOiAncGhvbmVfdGhpbicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInBob25lX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwibGlua1wiLFxuICAgIG5hbWU6ICdMaW5rJyxcbiAgICBpY29uOiAnbGlua19naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwibGlua19kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInNoZWR1bGluZ1wiLFxuICAgIG5hbWU6ICdTaGVkdWxpbmcnLFxuICAgIGljb246ICdzY2hlZHVsaW5nJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwic2hlZHVsaW5nX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwicXJjb2RlXCIsXG4gICAgbmFtZTogJ1FSIENvZGUnLFxuICAgIGljb246ICdxcl9jb2RlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwicXJjb2RlX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZ3JhcGgyZFwiLFxuICAgIG5hbWU6ICdHcmFwaCcsXG4gICAgaWNvbjogJ2dyYXBoJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZ3JhcGgyZF9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInF1b3RlX3Rvb2xcIixcbiAgICBuYW1lOiAnUXVvdGUgdG9vbCcsXG4gICAgaWNvbjogJ3F1b3RlcnMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJxdW90ZV90b29sX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiY2FyZHNcIixcbiAgICBuYW1lOiAnQ2FyZHMnLFxuICAgIGljb246ICdjYXJkcycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImNhcmRzX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwianNvbkNvbnN0cnVjdG9yXCIsXG4gICAgbmFtZTogJ0pzb24gQ29uc3RydWN0b3InLFxuICAgIGljb246ICdidXR0b24nLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJqc29uX2NvbnN0cnVjdG9yX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYnV0dG9uXCIsXG4gICAgbmFtZTogJ0J1dHRvbicsXG4gICAgaWNvbjogJ2J1dHRvbicsXG4gICAganM6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvYnV0dG9uX2FjdGlvbi9idXR0b25fYWN0aW9uLmpzP3Q9MVwiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZWRpdG9yanNcIixcbiAgICBuYW1lOiAnRWRpdG9ySlMnLFxuICAgIGljb246ICdjb2RlX2VkaXRvcicsXG4gICAganM6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvRWRpdG9yLUpzL2Rpc3QvbWFpbi5qcz90PTJcIixcbiAgICBjc3M6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvRWRpdG9yLUpzL2Rpc3Qvc3R5bGUuY3NzP3Q9MlwiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZmlsdGVyX2FkdmFuY2VkXCIsXG4gICAgbmFtZTogJ0ZpbHRlciBBZHZhbmNlZCcsXG4gICAgaWNvbjogJ2ZpbHRlcl9hZHZhbmNlZCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImZpbHRlcl9hZHZhbmNlZF9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImNvZGVfZWRpdG9yXCIsXG4gICAgbmFtZTogJ0NvZGUgRWRpdG9yJyxcbiAgICBpY29uOiAnY29kZV9lZGl0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJjb2RlX2VkaXRvcl9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImljb25cIixcbiAgICBuYW1lOiAnSWNvbicsXG4gICAgaWNvbjogJ2ljb25fZ2hfZWxlbWVudCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImljb25fZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJxdW90ZVJlcXVlc3RcIixcbiAgICBuYW1lOiAnUXVvdGUgUmVxdWVzdCcsXG4gICAgaWNvbjogJ2ludm9pY2VzJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwicXVvdGVfcmVxdWVzdF9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInZpZXdfY29udGFpbmVyXCIsXG4gICAgbmFtZTogJ1ZpZXcgQ29udGFpbmVyJyxcbiAgICBpY29uOiAncGVuY2lsJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidmlld19jb250YWluZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJlbGVtZW50X3JlZlwiLFxuICAgIG5hbWU6IFwiRWxlbWVudCBSZWZlcmVuY2VcIixcbiAgICBpY29uOiBcImNsb3VkU3luY19naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImVsZW1lbnRfcmVmX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwicXVvdGVfdG9vbF9vYmplY3RzX3JlbmRlcmVyXCIsXG4gICAgbmFtZTogJ1F1b3RlIFRvb2wgUmVuZGVyZXInLFxuICAgIGljb246ICdsX2NvdW50ZXInLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJxdW90ZV90b29sX29iamVjdHNfcmVuZGVyZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJxdW90ZV90b29sX29iamVjdHNfcmVuZGVyZXJfZ2VuZXJhdG9yXCIsXG4gICAgbmFtZTogJ1F1b3RlIFRvb2wgUGFydHMgR2VuZXJhdG9yJyxcbiAgICBpY29uOiAnbF9jb3VudGVyX2Fycm93JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwicXVvdGVfdG9vbF9vYmplY3RzX3JlbmRlcmVyX2dlbmVyYXRvcl9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiAnVHJpZ2dlcicsXG4gICAgaWNvbjogJ2pvYicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInRyaWdnZXJfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ2b3RpbmdcIixcbiAgICBuYW1lOiAnVm90aW5nJyxcbiAgICBpY29uOiAnbGlrZV9naF9lbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwidm90aW5nX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwidmlld190YWJzXCIsXG4gICAgbmFtZTogXCJWaWV3IFRhYlwiLFxuICAgIGljb246IFwidGFic1wiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJ2aWV3X3RhYnMuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiZmlsdGVyX3RhYnNcIixcbiAgICBuYW1lOiBcIkZpbHRlciBUYWJzXCIsXG4gICAgaWNvbjogXCJmaWx0ZXJfdGFic19naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImZpbHRlcl90YWJzLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImdwc19jb29yZHNcIixcbiAgICBuYW1lOiAnR1BTIENvb3JkcycsXG4gICAgaWNvbjogJ2xvY2F0aW9uX2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJncHNfY29vcmRzLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImdvb2dsZV9tYXBcIixcbiAgICBuYW1lOiAnR29vZ2xlIE1hcCcsXG4gICAgaWNvbjogJ2xvY2F0aW9uJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZ29vZ2xlX21hcF9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImRhdGFfbWlncmF0aW9uc1wiLFxuICAgIG5hbWU6IFwiRGF0YSBtaWdyYXRpb25zXCIsXG4gICAgaWNvbjogXCJ2aWV3X2xpc3RfZ2hfZWxlbWVudFwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJkYXRhX21pZ3JhdGlvbnMuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwiYWRkaXRpb25hbF9zZXR0aW5nc1wiLFxuICAgIG5hbWU6IFwiQWRkaXRpb25hbCBTZXR0aW5nc1wiLFxuICAgIGljb246IFwiXCIsXG4gICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZ2hfYWRkaXRpb25hbF9zZXR0aW5nc19kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInNlbmRfcmVxdWVzdFwiLFxuICAgIG5hbWU6IFwiU2VuZCBSZXF1ZXN0XCIsXG4gICAgaWNvbjogXCJzZW5kX3JlcXVlc3RfZ2hfZWxlbWVudFwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJzZW5kX3JlcXVlc3RfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ3ZWJjYW1cIixcbiAgICBuYW1lOiBcIldlYiBjYW1lcmFcIixcbiAgICBpY29uOiBcIndlYmNhbV9naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcIndlYmNhbV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImpzb25fdmlld2VyXCIsXG4gICAgbmFtZTogXCJKU09OIHZpZXdlclwiLFxuICAgIGljb246IFwianNvbl9naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImpzb25fdmlld2VyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwibm90aWZpY2F0aW9uc1wiLFxuICAgIG5hbWU6IFwiTm90aWZpY2F0aW9uc1wiLFxuICAgIGljb246IFwiZnVsbF9naF9lbGVtZW50XCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcIm5vdGlmaWNhdGlvbnNfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJhcGlcIixcbiAgICBuYW1lOiBcIkFQSVwiLFxuICAgIGljb246IFwiam9iXCIsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcImFwaV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcInNtYXJ0X2lucHV0XCIsXG4gICAgbmFtZTogXCJTbWFydCBJbnB1dFwiLFxuICAgIGljb246IFwicm9rZXRcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwic21hcnRfaW5wdXRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJqc29uX2VkaXRvclwiLFxuICAgIG5hbWU6IFwiSlNPTiBFZGl0b3JcIixcbiAgICBpY29uOiBcImNvZGVcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwianNvbl9lZGl0b3JfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJncmFwZXNfaHRtbF9lZGl0b3JcIixcbiAgICBuYW1lOiAnR3JhcGVzIEh0bWwgRWRpdG9yJyxcbiAgICBpY29uOiAnY29kZV9lZGl0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJncmFwZXNfaHRtbF9lZGl0b3JfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJxdWl6XCIsXG4gICAgbmFtZTogJ1F1aXonLFxuICAgIGljb246ICdxdWl6X2doX2VsZW1lbnQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJxdWl6X2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6IFwicGFzc3dvcmRfaW5wdXRcIixcbiAgICBuYW1lOiBcIlBhc3N3b3JkXCIsXG4gICAgaWNvbjogXCJsb2NrX2doX2VsZW1lbnRcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwicGFzc3dvcmRfaW5wdXRfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ2c19jb2RlXCIsXG4gICAgbmFtZTogJ1ZTIENvZGUnLFxuICAgIGljb246ICdjb2RlX2VkaXRvcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhc3luY19tb2R1bGVzX3BhdGggKyBcInZzX2NvZGVfZGF0YS5qc1wiLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJuZXN0ZWRfbGlzdFwiLFxuICAgIG5hbWU6ICdOZXN0ZWQgTGlzdCcsXG4gICAgaWNvbjogJ3NjaGVkdWxpbmcnLFxuICAgIGpzOiBcImh0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL05lc3RlZC1MaXN0L2Rpc3QvbWFpbi5qcz90PTJcIixcbiAgICBjc3M6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvTmVzdGVkLUxpc3QvZGlzdC9zdHlsZS5jc3M/dD0yXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdjbGFzcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJjb3VudGVydG9wX3NtYXJ0X3F1b3RlXCIsXG4gICAgbmFtZTogJ0NvdW50ZXJ0b3AgU21hcnQgUXVvdGUnLFxuICAgIGljb246ICdxdW90ZXJzJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiY291bnRlcnRvcF9zbWFydF9xdW90ZV9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcIm1hcmtkb3duX3ZpZXdlclwiLFxuICAgIG5hbWU6ICdNYXJrZG93biB2aWV3ZXInLFxuICAgIGljb246ICdjb2RlX2VkaXRvcicsXG4gICAganM6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvbWFya2Rvd24taXQtZ2gtZWxlbWVudC9kaXN0L21haW4uanM/dD0xXCIsXG4gICAgY3NzOiBcImh0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL21hcmtkb3duLWl0LWdoLWVsZW1lbnQvZGlzdC9zdHlsZS5jc3M/dD0xXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6IFwiY2xhc3NcIlxuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImh0bWxfdmlld2VyXCIsXG4gICAgbmFtZTogJ0hUTUwgVmlld2VyJyxcbiAgICBpY29uOiAnY29kZV9lZGl0b3InLFxuICAgIGpzOiBcImh0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL0hUTUwtVmlld2VyL2Rpc3QvbWFpbi5qcz90PTFcIixcbiAgICBjc3M6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvSFRNTC1WaWV3ZXIvZGlzdC9zdHlsZS5jc3M/dD0xXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6IFwiY2xhc3NcIlxuICB9LCB7XG4gICAgZGF0YV90eXBlOiBcImVsZW1lbnRfY3VzdG9taXplclwiLFxuICAgIG5hbWU6IFwiRWxlbWVudCBDdXN0b21pemVyXCIsXG4gICAgaWNvbjogXCJwZW5jaWxcIixcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArIFwiZWxlbWVudF9jdXN0b21pemVyX2RhdGEuanNcIixcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2FuZ3VsYXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICd0YXNrJyxcbiAgICBuYW1lOiAnVGFzaycsXG4gICAgaWNvbjogJ3RhYmxlJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGFzeW5jX21vZHVsZXNfcGF0aCArICd0YXNrX2RhdGEuanMnLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnYW5ndWxhcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ2Nyb25fcGlja2VyJyxcbiAgICBuYW1lOiAnQ3JvbiBQaWNrZXInLFxuICAgIGljb246ICd0YWJsZScsXG4gICAganM6ICdodHRwczovL2d1ZGh1Yi5jb20vbW9kdWxlcy9Dcm9uLVBpY2tlci9kaXN0L21haW4uanM/dD0yJyxcbiAgICBjc3M6ICdodHRwczovL2d1ZGh1Yi5jb20vbW9kdWxlcy9Dcm9uLVBpY2tlci9kaXN0L3N0eWxlLmNzcz90PTInLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdiYWxhbmNlX3NoZWV0JyxcbiAgICBuYW1lOiAnQmFsYW5jZSBTaGVldCcsXG4gICAgaWNvbjogJ3RhYmxlJyxcbiAgICBqczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL2JhbGFuY2Utc2hlZXQvZGlzdC9tYWluLmpzP3Q9MicsXG4gICAgY3NzOiAnaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvYmFsYW5jZS1zaGVldC9kaXN0L3N0eWxlLmNzcz90PTInLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdxdW90ZV9mb3JtJyxcbiAgICBuYW1lOiAnUXVvdGUgRm9ybScsXG4gICAgaWNvbjogJ3RhYmxlJyxcbiAgICBqczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL2NvdW50ZXJ0b3AtcXVvdGUtZm9ybS9kaXN0L21haW4uanMnLFxuICAgIGNzczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL2NvdW50ZXJ0b3AtcXVvdGUtZm9ybS9kaXN0L3N0eWxlLmNzcycsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdjbGFzcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ3N0YXRpY19uZXN0ZWRfbGlzdCcsXG4gICAgbmFtZTogJ05lc3RlZCBGaWx0ZXInLFxuICAgIGljb246ICdzY2hlZHVsaW5nJyxcbiAgICBqczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL25lc3RlZC1maWx0ZXIvZGlzdC9tYWluLmpzP3Q9MScsXG4gICAgY3NzOiAnaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvbmVzdGVkLWZpbHRlci9kaXN0L3N0eWxlLmNzcz90PTEnLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdjb252ZXJzYXRpb25zJyxcbiAgICBuYW1lOiAnQ29udmVyc2F0aW9ucycsXG4gICAgaWNvbjogJ3RpbWVsaW5lJyxcbiAgICBqczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL2NvbnZlcnNhdGlvbi9kaXN0L21haW4uanM/dD0xJyxcbiAgICBjc3M6ICdodHRwczovL2d1ZGh1Yi5jb20vbW9kdWxlcy9jb252ZXJzYXRpb24vZGlzdC9zdHlsZS5jc3M/dD0xJyxcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2NsYXNzJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnc3R1ZHlfam91cm5hbCcsXG4gICAgbmFtZTogJ1N0dWR5IEpvdXJuYWwnLFxuICAgIGljb246ICd0aW1lbGluZScsXG4gICAganM6ICdodHRwczovL2d1ZGh1Yi5jb20vbW9kdWxlcy9TdHVkeS1Kb3VybmFsL2Rpc3QvbWFpbi5qcz90PTEnLFxuICAgIGNzczogJ2h0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL1N0dWR5LUpvdXJuYWwvZGlzdC9zdHlsZS5jc3MnLFxuICAgIHR5cGU6ICdnaF9lbGVtZW50JyxcbiAgICB0ZWNobm9sb2d5OiAnY2xhc3MnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdzdHVkeV9zY2hlZHVsZScsXG4gICAgbmFtZTogJ1N0dWR5IFNjaGVkdWxlJyxcbiAgICBpY29uOiAndGltZWxpbmUnLFxuICAgIGpzOiAnaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvU3R1ZHktU2NoZWR1bGUvZGlzdC9tYWluLmpzP3Q9MScsXG4gICAgY3NzOiAnaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvU3R1ZHktU2NoZWR1bGUvZGlzdC9zdHlsZS5jc3M/dD0xJyxcbiAgICB0eXBlOiAnZ2hfZWxlbWVudCcsXG4gICAgdGVjaG5vbG9neTogJ2NsYXNzJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnYXZhdGFyJyxcbiAgICBuYW1lOiAnQXZhdGFyJyxcbiAgICBpY29uOiAndXNlcicsXG4gICAganM6ICdodHRwczovL2d1ZGh1Yi5jb20vbW9kdWxlcy9HaC1BdmF0YXIvZGlzdC9tYWluLmpzP3Q9MScsXG4gICAgY3NzOiAnaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvR2gtQXZhdGFyL2Rpc3Qvc3R5bGUuY3NzP3Q9MScsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdjbGFzcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJ0ZXh0X2FyZWFcIixcbiAgICBuYW1lOiBcIlRleHQgQXJlYVwiLFxuICAgIGljb246IFwidGV4dF9pY29uXCIsXG4gICAganM6IFwiaHR0cHM6Ly9ndWRodWIuY29tL21vZHVsZXMvdGV4dC1hcmVhLWdoZS9kaXN0L21haW4uanM/dD0zXCIsXG4gICAgY3NzOiBcImh0dHBzOi8vZ3VkaHViLmNvbS9tb2R1bGVzL3RleHQtYXJlYS1naGUvZGlzdC9zdHlsZS5jc3NcIixcbiAgICB0eXBlOiBcImdoX2VsZW1lbnRcIixcbiAgICB0ZWNobm9sb2d5OiBcImNsYXNzXCJcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogXCJyZXNvdXJjZV9jYWxlbmRhclwiLFxuICAgIG5hbWU6IFwiUmVzb3VyY2Ug0KFhbGVuZGFyXCIsXG4gICAgaWNvbjogXCJjYWxlbmRhclwiLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXN5bmNfbW9kdWxlc19wYXRoICsgXCJyZXNvdXJjZV9jYWxlbmRhcl9kYXRhLmpzXCIsXG4gICAgdHlwZTogJ2doX2VsZW1lbnQnLFxuICAgIHRlY2hub2xvZ3k6ICdhbmd1bGFyJ1xuICB9LCAvKiBBVVRPTUFUSU9OIE1PRFVMRVMgKi9cbiAgLypcbiAgICAgIFdlIGhhdmUgbmV4dCB0eXBlcyBmb3IgYXV0b21hdGlvbnM6XG4gICAgICAtIEFQSVxuICAgICAgLSBHaEVsZW1lbnRcbiAgICAgIC0gUXVpelxuICAgICAgLSBTbWFydElucHV0XG4gICAgICAtIFRyaWdnZXJcbiAgICAgIC0gVGFza1xuICAgICAgLSBJdGVyYXRvclxuICAqL1xuICB7XG4gICAgZGF0YV90eXBlOiAnQVBJJyxcbiAgICBuYW1lOiAnQVBJJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2FwaV9ub2RlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fYXBpJyxcbiAgICBwcml2YXRlOiB0cnVlXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdDYWxjdWxhdG9yJyxcbiAgICBuYW1lOiAnQ2FsY3VsYXRvcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdjYWxjdWxhdG9yLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fY2FsY3VsYXRvcidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0NvbXBhcmVJdGVtcycsXG4gICAgbmFtZTogJ0NvbXBhcmUgSXRlbXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnY29tcGFyZV9pdGVtcy5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX2NvbXBhcmVfaXRlbXMnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdDb25zdGFudHMnLFxuICAgIG5hbWU6ICdDb25zdGFudHMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnY29uc3RhbnRzLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fY29uc3RhbnRzJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnQ3JlYXRlRmlsZXMnLFxuICAgIG5hbWU6ICdDcmVhdGUgRmlsZXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnY3JlYXRlX2ZpbGVzLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fY3JlYXRlX2ZpbGVzJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnQ3JlYXRlSXRlbXNBcGknLFxuICAgIG5hbWU6ICdDcmVhdGUgSXRlbXMgQXBpJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2NyZWF0ZV9pdGVtX2FwaS5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX2NyZWF0ZV9pdGVtc19hcGknXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdGaWxlRHVwbGljYXRlJyxcbiAgICBuYW1lOiAnRmlsZSBEdXBsaWNhdGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnZmlsZV9kdXBsaWNhdGUuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9maWxlX2R1cGxpY2F0ZSdcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0ZpbHRlcicsXG4gICAgbmFtZTogJ0ZpbHRlcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdmaWx0ZXJfbm9kZS5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdmaWx0ZXInXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdHZXRJdGVtQnlJdGVtUmVmJyxcbiAgICBuYW1lOiAnR2V0IEl0ZW0gQnkgSXRlbSBSZWYnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnZ2V0X2l0ZW1fYnlfaXRlbV9yZWYuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9nZXRfaXRlbV9ieV9pdGVtX3JlZidcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0dldEl0ZW1zJyxcbiAgICBuYW1lOiAnR2V0IEl0ZW1zJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2dldF9pdGVtcy5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX2dldF9pdGVtcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0doRWxlbWVudE5vZGUnLFxuICAgIG5hbWU6ICdHaCBFbGVtZW50IE5vZGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnZ2hfZWxlbWVudF9ub2RlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fZ2hfZWxlbWVudF9ub2RlJyxcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGNyZWF0ZWRfZm9yOiBbJ0doRWxlbWVudCddXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdJZkNvbmRpdGlvbicsXG4gICAgbmFtZTogJ0lmIENvbmRpdGlvbicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdpZl9jb25kaXRpb24uanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9pZl9jb25kaXRpb24nXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdJdGVtQ29uc3RydWN0b3InLFxuICAgIG5hbWU6ICdJdGVtIENvbnN0cnVjdG9yJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2l0ZW1fY29uc3RydWN0b3IuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9pdGVtX2NvbnN0cnVjdG9yJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnSXRlbURlc3RydWN0b3InLFxuICAgIG5hbWU6ICdJdGVtIERlc3RydWN0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnaXRlbV9kZXN0cnVjdG9yLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25faXRlbV9kZXN0cnVjdG9yJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnSlNPTlNjaGVtZScsXG4gICAgbmFtZTogJ0pTT04gU2NoZW1lJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2pzb25fc2NoZW1lLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fanNvbl9zY2hlbWUnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdNZXJnZUl0ZW1zJyxcbiAgICBuYW1lOiAnTWVyZ2UgSXRlbXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnbWVyZ2VfaXRlbXMuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9tZXJnZV9pdGVtcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ01lc3NhZ2VDb25zdHJ1Y3RvcicsXG4gICAgbmFtZTogJ01lc3NhZ2UgQ29uc3RydWN0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnbWVzc2FnZV9jb25zdHJ1Y3Rvci5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX21lc3NhZ2VfY29uc3RydWN0b3InXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdPYmplY3RUb0l0ZW0nLFxuICAgIG5hbWU6ICdPYmplY3QgVG8gSXRlbScsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdvYmpfdG9faXRlbS5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX29iamVjdF90b19pdGVtJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnT2JqZWN0Q29uc3RydWN0b3InLFxuICAgIG5hbWU6ICdPYmplY3QgQ29uc3RydWN0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnb2JqZWN0X2NvbnN0cnVjdG9yLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fb2JqZWN0X2NvbnN0cnVjdG9yJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnT2JqZWN0RGVzdHJ1Y3RvcicsXG4gICAgbmFtZTogJ09iamVjdCBEZXN0cnVjdG9yJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ29iamVjdF9kZXN0cnVjdG9yLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fb2JqZWN0X2Rlc3RydWN0b3InXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdQb3B1bGF0ZUVsZW1lbnQnLFxuICAgIC8vIEF2YWlsYWJsZSBmb3IgR0ggRWxlbWVudHMgb25seVxuICAgIG5hbWU6ICdQb3B1bGF0ZSBFbGVtZW50JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ3BvcHVsYXRlX2VsZW1lbnQuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9wb3B1bGF0ZV9lbGVtZW50JyxcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGNyZWF0ZWRfZm9yOiBbJ0doRWxlbWVudCddXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdQb3B1bGF0ZUl0ZW1zJyxcbiAgICBuYW1lOiAnUG9wdWxhdGUgSXRlbXMnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncG9wdWxhdGVfaXRlbXMuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9wb3B1bGF0ZV9pdGVtcydcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ1BvcHVsYXRlV2l0aERhdGUnLFxuICAgIG5hbWU6ICdQb3B1bGF0ZSBXaXRoIERhdGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncG9wdWxhdGVfd2l0aF9kYXRlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fcG9wdWxhdGVfd2l0aF9kYXRlJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnUG9wdWxhdGVXaXRoSXRlbVJlZicsXG4gICAgbmFtZTogJ1BvcHVsYXRlIHdpdGggSXRlbSBSZWYnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncG9wdWxhdGVfd2l0aF9pdGVtX3JlZi5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX3BvcHVsYXRlX3dpdGhfaXRlbV9yZWYnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdQb3BVcEZvcm0nLFxuICAgIC8vIEF2YWlsYWJsZSBmb3IgUXVpeiBOb2RlLCBHSCBFbGVtZW50LCBTbWFydCBJbnB1dFxuICAgIG5hbWU6ICdQb3AgVXAgRm9ybScsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdwb3B1cF9mb3JtLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fcG9wX3VwX2Zvcm0nLFxuICAgIHByaXZhdGU6IHRydWUsXG4gICAgY3JlYXRlZF9mb3I6IFsnUXVpeicsICdHaEVsZW1lbnQnLCAnU21hcnRJbnB1dCcsICdJdGVyYXRvciddXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdRdWl6Rm9ybScsXG4gICAgLy8gQXZhaWxhYmxlIGZvciBRdWl6IE5vZGUgb25seVxuICAgIG5hbWU6ICdRdWl6IEZvcm0nLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncXVpel9mb3JtLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fcXVpel9mb3JtJyxcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGNyZWF0ZWRfZm9yOiBbJ1F1aXonXVxuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnUXVpek5vZGUnLFxuICAgIG5hbWU6ICdRdWl6IE5vZGUnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncXVpel9ub2RlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fcXVpel9ub2RlJyxcbiAgICBwcml2YXRlOiB0cnVlXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdSZXF1ZXN0JyxcbiAgICBuYW1lOiAnUmVxdWVzdCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdyZXF1ZXN0X25vZGUuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9yZXF1ZXN0J1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnUmVzcG9uc2UnLFxuICAgIC8vIEF2YWlsYWJsZSBmb3IgQVBJIG9ubHlcbiAgICBuYW1lOiAnUmVzcG9uc2UnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAncmVzcG9uc2Vfbm9kZS5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX3Jlc3BvbnNlJyxcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGNyZWF0ZWRfZm9yOiBbJ0FQSSddXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdTbWFydElucHV0JyxcbiAgICBuYW1lOiAnU21hcnQgSW5wdXQnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnc21hcnRfaW5wdXQuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9zbWFydF9pbnB1dCcsXG4gICAgcHJpdmF0ZTogdHJ1ZVxuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVHJpZ2dlcicsXG4gICAgbmFtZTogJ1RyaWdnZXInLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAndHJpZ2dlcl9ub2RlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fdHJpZ2dlcicsXG4gICAgcHJpdmF0ZTogdHJ1ZVxuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVHdpbGlvU01TJyxcbiAgICBuYW1lOiAnVHdpbGlvIFNNUycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICd0d2lsaW9fc21zLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2F1dG9tYXRpb25fdHdpbGlvJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVHdpbGlvQXV0aCcsXG4gICAgbmFtZTogJ1R3aWxpbyBBdXRoJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ3R3aWxpb19hdXRoLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ3RhYmxlJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVHdpbGlvRGV2aWNlJyxcbiAgICBuYW1lOiAnVHdpbGlvIERldmljZScsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICd0d2lsaW9fZGV2aWNlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ3RhYmxlJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVXBkYXRlSXRlbXNBcGknLFxuICAgIG5hbWU6ICdVcGRhdGUgSXRlbXMgQXBpJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ3VwZGF0ZV9pdGVtc19hcGkuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl91cGRhdGVfaXRlbXNfYXBpJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnR29vZ2xlQ2FsZW5kYXInLFxuICAgIG5hbWU6ICdHb29nbGUgQ2FsZW5kYXInLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnZ29vZ2xlX2NhbGVuZGFyLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2NhbGVuZGFyJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVmVyaWZ5RW1haWwnLFxuICAgIG5hbWU6ICdWZXJpZnkgZW1haWwnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAndmVyaWZ5X2VtYWlsLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2NoZWNrX2luX2NpcmNsZSdcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0l0ZXJhdG9yJyxcbiAgICBuYW1lOiAnSXRlcmF0b3InLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnaXRlcmF0b3IuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAndXBkYXRlJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnSXRlcmF0b3JJbnB1dCcsXG4gICAgbmFtZTogJ0l0ZXJhdG9yIElucHV0JyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2l0ZXJhdG9yX2lucHV0LmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ2Fycm93X3JpZ2h0JyxcbiAgICBwcml2YXRlOiB0cnVlXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdJdGVyYXRvck91dHB1dCcsXG4gICAgbmFtZTogJ0l0ZXJhdG9yIE91dHB1dCcsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdpdGVyYXRvcl9vdXRwdXQuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXJyb3dfcmlnaHQnLFxuICAgIHByaXZhdGU6IHRydWVcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ1NlbmRFbWFpbCcsXG4gICAgbmFtZTogJ1NlbmQgZW1haWwnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnc2VuZF9lbWFpbC5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdlbWFpbCdcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0ZpbGVSZWFkZXInLFxuICAgIG5hbWU6ICdGaWxlIFJlYWRlcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdmaWxlX3JlYWRlci5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdmaWxlJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnV2Vic2l0ZXNDaGVja2VyJyxcbiAgICBuYW1lOiAnV2Vic2l0ZXMgQ2hlY2tlcicsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICd3ZWJzaXRlc19jaGVja2VyLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ3dvcmxkJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVm9pY2VNYWNoaW5lRGV0ZWN0aW9uJyxcbiAgICBuYW1lOiAnVm9pY2UgTWFjaGluZSBEZXRlY3Rpb24nLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAndm9pY2VfbWFjaGluZV9kZXRlY3Rpb24uanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnYXV0b21hdGlvbl9jYWxjdWxhdG9yJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnVGFzaycsXG4gICAgbmFtZTogJ1Rhc2snLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAndGFzay5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdhdXRvbWF0aW9uX2NhbGN1bGF0b3InLFxuICAgIHByaXZhdGU6IHRydWVcbiAgfSwge1xuICAgIGRhdGFfdHlwZTogJ0RlbGV0ZUl0ZW1zJyxcbiAgICBuYW1lOiAnRGVsZXRlIEl0ZW1zJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2RlbGV0ZV9pdGVtcy5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICdydWJiaXNoJ1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnR29Ub0l0ZW0nLFxuICAgIG5hbWU6ICdHbyBUbyBJdGVtJyxcbiAgICB1cmw6IGZpbGVfc2VydmVyX3VybCArICcvJyArIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoICsgJ2dvX3RvX2l0ZW0uanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnY3Vyc29yX3BvaW50J1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnRmlyZVdvcmtzJyxcbiAgICBuYW1lOiAnRmlyZSBXb3JrcycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICdmaXJld29ya3Nfbm9kZS5qcycsXG4gICAgdHlwZTogJ2F1dG9tYXRpb24nLFxuICAgIGljb246ICd3ZWVkaW5nX3BhcnR5J1xuICB9LCB7XG4gICAgZGF0YV90eXBlOiAnU2VuZE1lc3NhZ2UnLFxuICAgIG5hbWU6ICdTZW5kIE1lc3NhZ2UnLFxuICAgIHVybDogZmlsZV9zZXJ2ZXJfdXJsICsgJy8nICsgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGggKyAnc2VuZF9tZXNzYWdlLmpzJyxcbiAgICB0eXBlOiAnYXV0b21hdGlvbicsXG4gICAgaWNvbjogJ3NwZWVjaF9idWJibGUnXG4gIH0sIHtcbiAgICBkYXRhX3R5cGU6ICdUdXJib1NNUycsXG4gICAgbmFtZTogJ1R1cmJvIFNNUycsXG4gICAgdXJsOiBmaWxlX3NlcnZlcl91cmwgKyAnLycgKyBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCArICd0dXJib19zbXMuanMnLFxuICAgIHR5cGU6ICdhdXRvbWF0aW9uJyxcbiAgICBpY29uOiAnZW1haWwnXG4gIH1dO1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1N0b3JhZ2UvU3RvcmFnZS5qc1xuXG5jbGFzcyBTdG9yYWdlIHtcbiAgY29uc3RydWN0b3IoYXN5bmNfbW9kdWxlc19wYXRoLCBmaWxlX3NlcnZlcl91cmwsIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoKSB7XG4gICAgdGhpcy5hcHBzX2xpc3QgPSBbXTtcbiAgICB0aGlzLnVzZXJzX2xpc3QgPSBbXTtcbiAgICB0aGlzLnVzZXIgPSB7fTtcbiAgICB0aGlzLm1vZHVsZXNMaXN0ID0gZ2VuZXJhdGVNb2R1bGVzTGlzdChhc3luY19tb2R1bGVzX3BhdGgsIGZpbGVfc2VydmVyX3VybCwgYXV0b21hdGlvbl9tb2R1bGVzX3BhdGgpO1xuICAgIHRoaXMuZ2hDb21wb25lbnRzUHJvbWlzZXMgPSBbXTtcbiAgfVxuICBnZXRNYWluU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRBcHBzTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBzX2xpc3Q7XG4gIH1cbiAgZ2V0VXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy51c2VyO1xuICB9XG4gIGdldFVzZXJzTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy51c2Vyc19saXN0O1xuICB9XG4gIGdldE1vZHVsZXNMaXN0KHR5cGUsIGlzUHJpdmF0ZSwgY3JlYXRlZEZvcikge1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZHVsZXNMaXN0O1xuICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlID09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb2R1bGVzTGlzdC5maWx0ZXIobW9kdWxlID0+IHtcbiAgICAgICAgaWYgKG1vZHVsZS5jcmVhdGVkX2Zvcikge1xuICAgICAgICAgIHJldHVybiBtb2R1bGUudHlwZSA9PT0gdHlwZSAmJiBtb2R1bGUucHJpdmF0ZSAmJiBtb2R1bGUuY3JlYXRlZF9mb3IuaW5jbHVkZXMoY3JlYXRlZEZvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZS50eXBlID09PSB0eXBlICYmICFtb2R1bGUucHJpdmF0ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tb2R1bGVzTGlzdC5maWx0ZXIobW9kdWxlID0+IHtcbiAgICAgICAgcmV0dXJuIG1vZHVsZS50eXBlID09PSB0eXBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldE1vZHVsZVVybChtb2R1bGVfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVzTGlzdC5maW5kKG1vZHVsZSA9PiBtb2R1bGUuZGF0YV90eXBlID09IG1vZHVsZV9pZCk7XG4gIH1cblxuICAvLyEhISEhISEhISEhISEhKioqKioqKiogQWxsIE1ldGhvZHMgYmVsb3cgc2hvdWxkIGJlIG1vdmVkIHRvIEFwcFByb2Nlc29yIGFuZCBBdXRoICAqKioqKioqKioqISEhISEhISEhISEhISEhIS8vXG4gIHNldFVzZXIodXNlcikge1xuICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgdGhpcy51c2Vyc19saXN0LnB1c2godXNlcik7XG4gIH1cbiAgdXBkYXRlVXNlcih1c2VyID0ge30pIHtcbiAgICBpZiAodXNlci5hdmF0YXJfMTI4KSB7XG4gICAgICB1c2VyLmF2YXRhcl8xMjggPSB1c2VyLmF2YXRhcl8xMjggKyBcIj9cIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBpZiAodXNlci5hdmF0YXJfNTEyKSB7XG4gICAgICB1c2VyLmF2YXRhcl81MTIgPSB1c2VyLmF2YXRhcl81MTIgKyBcIj9cIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLnVzZXIgPSB7XG4gICAgICAuLi50aGlzLnVzZXIsXG4gICAgICAuLi51c2VyXG4gICAgfTtcbiAgICB0aGlzLnVzZXJzX2xpc3QgPSB0aGlzLnVzZXJzX2xpc3QuZmlsdGVyKG9sZFVzZXIgPT4gb2xkVXNlci51c2VyX2lkICE9IHVzZXIudXNlcl9pZCk7XG4gICAgdGhpcy51c2Vyc19saXN0LnB1c2godGhpcy51c2VyKTtcbiAgfVxuICB1bnNldFVzZXIoKSB7XG4gICAgdGhpcy51c2VyID0ge307XG4gIH1cbiAgZ2V0QXBwKGFwcF9pZCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hcHBzX2xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmFwcHNfbGlzdFtpXS5hcHBfaWQgPT0gYXBwX2lkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcHNfbGlzdFtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdW5zZXRBcHBzKCkge1xuICAgIHRoaXMuYXBwc19saXN0ID0gW107XG4gIH1cblxuICAvLyBhZGRBcHAoYXBwKSB7XG4gIC8vICAgdGhpcy5hcHBzX2xpc3QucHVzaChhcHApO1xuICAvLyAgIHJldHVybiB0aGlzLmFwcHNfbGlzdDtcbiAgLy8gfVxuXG4gIHVwZGF0ZUFwcChuZXdBcHApIHtcbiAgICB0aGlzLmFwcHNfbGlzdCA9IHRoaXMuYXBwc19saXN0Lm1hcChhcHAgPT4gYXBwLmFwcF9pZCA9PSBuZXdBcHAuYXBwX2lkID8gbmV3QXBwIDogYXBwKTtcbiAgICByZXR1cm4gdGhpcy5hcHBzX2xpc3Q7XG4gIH1cbiAgZGVsZXRlQXBwKGFwcF9pZCkge1xuICAgIHRoaXMuYXBwc19saXN0ID0gdGhpcy5hcHBzX2xpc3QuZmlsdGVyKGFwcCA9PiBhcHAuYXBwX2lkICE9IGFwcF9pZCk7XG4gICAgcmV0dXJuIHRoaXMuYXBwc19saXN0O1xuICB9XG4gIGFzeW5jIHVwZGF0ZUl0ZW1zSW5BcHAoaXRlbXNUb1VwZGF0ZSwgYXBwX2lkKSB7XG4gICAgY29uc3QgYXBwVG9VcGRhdGUgPSBhd2FpdCB0aGlzLmdldEFwcChhcHBfaWQpO1xuICAgIGlmIChhcHBUb1VwZGF0ZSkge1xuICAgICAgYXBwVG9VcGRhdGUuaXRlbXNfbGlzdCA9IHVwZGF0ZUl0ZW1zKGl0ZW1zVG9VcGRhdGUsIGFwcFRvVXBkYXRlLml0ZW1zX2xpc3QsIHRoaXMucGlwZVNlcnZpY2UuZW1pdC5iaW5kKHRoaXMucGlwZVNlcnZpY2UpLCBhcHBfaWQpO1xuICAgICAgdGhpcy51cGRhdGVBcHAoYXBwVG9VcGRhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwVG9VcGRhdGU7XG4gIH1cbiAgYXN5bmMgYWRkSXRlbXNUb0FwcChpdGVtcywgYXBwX2lkKSB7XG4gICAgY29uc3QgYXBwVG9VcGRhdGUgPSBhd2FpdCB0aGlzLmdldEFwcChhcHBfaWQpO1xuICAgIGlmIChhcHBUb1VwZGF0ZSkge1xuICAgICAgYXBwVG9VcGRhdGUuaXRlbXNfbGlzdC5wdXNoKC4uLml0ZW1zKTtcbiAgICAgIHRoaXMudXBkYXRlQXBwKGFwcFRvVXBkYXRlKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1zX3VwZGF0ZVwiLCB7XG4gICAgICAgIGFwcF9pZFxuICAgICAgfSwgaXRlbXMpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwVG9VcGRhdGU7XG4gIH1cbiAgYXN5bmMgZGVsZXRlSXRlbXNJbkFwcChpdGVtc1RvRGVsZXRlLCBhcHBfaWQpIHtcbiAgICBjb25zdCBhcHBUb1VwZGF0ZSA9IGF3YWl0IHRoaXMuZ2V0QXBwKGFwcF9pZCk7XG4gICAgaWYgKGFwcFRvVXBkYXRlKSB7XG4gICAgICBhcHBUb1VwZGF0ZS5pdGVtc19saXN0ID0gYXBwVG9VcGRhdGUuaXRlbXNfbGlzdC5maWx0ZXIoaXRlbSA9PiAhaXRlbXNUb0RlbGV0ZS5maW5kKGl0ZW1Ub0RlbGV0ZSA9PiBpdGVtVG9EZWxldGUuaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpKTtcbiAgICAgIHRoaXMudXBkYXRlQXBwKGFwcFRvVXBkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcFRvVXBkYXRlO1xuICB9XG59XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3dzL2Jyb3dzZXIuanNcbnZhciBicm93c2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDI2KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9XZWJTb2NrZXQvV2ViU29ja2V0LmpzXG5cblxuY2xhc3MgV2ViU29ja2V0QXBpIHtcbiAgY29uc3RydWN0b3IodXJsLCBhdXRoKSB7XG4gICAgdGhpcy53ZWJzb2NrZXQgPSBudWxsO1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgdGhpcy5oZWFydEJlYXRUaW1lU3RlbXAgPSAxMDAwMDAwMDAwMDAwMDtcbiAgICB0aGlzLkFMTE9XRURfSEVBUlRfQkVBVF9ERUxFWSA9IDEyMDAwO1xuICAgIHRoaXMuZmlyc3RIZWFydEJlYXQgPSB0cnVlO1xuICAgIHRoaXMucmVsb2FkID0gdHJ1ZTtcbiAgICB0aGlzLmlzQnJvd3NlciA9IGNvbnN0cy8qIElTX0JST1dTRVIgKi8uUWc7XG4gIH1cbiAgYXN5bmMgYWRkU3Vic2NyaXB0aW9uKGFwcF9pZCkge1xuICAgIC8vY29uc29sZS5sb2coXCJBZGRlZCBuZXcgc3Vic2NyaXB0aW9uOiBhcHBfaWQgLSBcIiwgYXBwX2lkKTtcblxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hdXRoLmdldFRva2VuKCk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYHRva2VuPSR7dG9rZW59L34vYXBwX2lkPSR7YXBwX2lkfWA7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLndlYnNvY2tldC5zZW5kKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHRoaXMucXVldWUucHVzaChhcHBfaWQpO1xuICB9XG4gIGFzeW5jIG9uT3BlbigpIHtcbiAgICB0aGlzLnJlbG9hZCA9IHRydWU7XG4gICAgY29uc29sZS5sb2coXCJ3ZWJzb2NrZXQgb3BlbmVkXCIpO1xuICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aC5nZXRUb2tlbigpO1xuICAgIHRoaXMucXVldWUuZm9yRWFjaChxdWV1ZSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBgdG9rZW49JHt0b2tlbn0vfi9hcHBfaWQ9JHtxdWV1ZX1gO1xuICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChzdWJzY3JpcHRpb24pO1xuICAgIH0pO1xuICB9XG4gIG9uRXJyb3IoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhcIndlYnNvY2tldCBlcnJvcjogXCIsIGVycm9yKTtcbiAgICB0aGlzLndlYnNvY2tldC5jbG9zZSgpO1xuICB9XG4gIG9uQ2xvc2UoKSB7XG4gICAgY29uc29sZS5sb2coXCJ3ZWJzb2NrZXQgY2xvc2VcIik7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbml0V2ViU29ja2V0KHRoaXMub25NYXNzYWdlSGFuZGxlciwgdGhpcy5yZWZyZXNoQXBwc0hhbmRsZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG4gIGFzeW5jIG9uTWVzc2FnZShldmVudCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmlzQnJvd3NlciA/IGV2ZW50LmRhdGEgOiBldmVudDtcbiAgICBpZiAobWVzc2FnZS5tYXRjaCgvSGVhcnRCZWF0LykpIHtcbiAgICAgIGNvbnN0IGhhcnRCZWF0RGVsYXkgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuaGVhcnRCZWF0VGltZVN0ZW1wO1xuICAgICAgaWYgKHRoaXMuQUxMT1dFRF9IRUFSVF9CRUFUX0RFTEVZIDwgaGFydEJlYXREZWxheSkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQ29ubmVjdGlvbkxvc3QoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoXCJIZWFydEJlYXRcIik7XG4gICAgICAgIHRoaXMuaGVhcnRCZWF0VGltZVN0ZW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmZpcnN0SGVhcnRCZWF0KSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25DaGVja2VyKCk7XG4gICAgICB0aGlzLmZpcnN0SGVhcnRCZWF0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLm1hdGNoKC9be31dLykpIHtcbiAgICAgIGxldCBpbmNvbWVNZXNzYWdlID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hdXRoLmdldFRva2VuKCk7XG5cbiAgICAgIC8vLS0gV2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgc3RvcmFnZSBvZiB1c2VyIHdobyBpbml0aWV0ZWQgdGhlIHVwZGF0ZS4gVGhhdCBpcyB3aHkgd2UgY2hlY2sgaWYgdG9rZW4gZnJvbSB3ZWJzb2NrZXQgaXMgbm90IHRoZSBzYW1lIGFzIHVzZXJzIHRva2VuLlxuICAgICAgaWYgKGluY29tZU1lc3NhZ2UudG9rZW4gIT0gdG9rZW4pIHtcbiAgICAgICAgdGhpcy5vbk1hc3NhZ2VIYW5kbGVyKGluY29tZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbml0V2ViU29ja2V0KG9uTWFzc2FnZUhhbmRsZXIsIHJlZnJlc2hBcHBzSGFuZGxlcikge1xuICAgIHRoaXMub25NYXNzYWdlSGFuZGxlciA9IG9uTWFzc2FnZUhhbmRsZXI7XG4gICAgdGhpcy5yZWZyZXNoQXBwc0hhbmRsZXIgPSByZWZyZXNoQXBwc0hhbmRsZXI7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLndlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpO1xuICAgICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gdGhpcy5vbk9wZW4uYmluZCh0aGlzKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9uZXJyb3IgPSB0aGlzLm9uRXJyb3IuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9uY2xvc2UgPSB0aGlzLm9uQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlLmJpbmQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2Vic29ja2V0ID0gbmV3IGJyb3dzZXIodGhpcy51cmwpO1xuICAgICAgdGhpcy53ZWJzb2NrZXQub24oXCJvcGVuXCIsIHRoaXMub25PcGVuKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5vbkVycm9yKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9uKFwiY2xvc2VcIiwgdGhpcy5vbkNsb3NlKTtcbiAgICAgIHRoaXMud2Vic29ja2V0Lm9uKFwibWVzc2FnZVwiLCB0aGlzLm9uTWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwid2Vic29ja2V0IGluaXRpYWxpemVkXCIpO1xuICB9XG4gIGNvbm5lY3Rpb25DaGVja2VyKCkge1xuICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBoYXJ0QmVhdERlbGF5ID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLmhlYXJ0QmVhdFRpbWVTdGVtcDtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGhhcnRCZWF0RGVsYXksIHRoaXMuQUxMT1dFRF9IRUFSVF9CRUFUX0RFTEVZLCBcImludGVydmFsXCIpO1xuICAgICAgaWYgKHRoaXMuQUxMT1dFRF9IRUFSVF9CRUFUX0RFTEVZIDwgaGFydEJlYXREZWxheSkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQ29ubmVjdGlvbkxvc3QoKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuICBhc3luYyBvbkNvbm5lY3Rpb25Mb3N0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGguZ2V0VmVyc2lvbigpO1xuICAgICAgaWYgKHRoaXMucmVsb2FkKSB7XG4gICAgICAgIHRoaXMucmVsb2FkID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGVkXCIpO1xuICAgICAgICB0aGlzLmhlYXJ0QmVhdFRpbWVTdGVtcCA9IDEwMDAwMDAwMDAwMDAwO1xuICAgICAgICB0aGlzLndlYnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAvLyBTaG91bGQgYmUgdW5jb21tZW50ZWQgYWZ0ZXIgd2Vic29ja2V0IGlzIGZpeGVkXG4gICAgICAgIC8vIHRoaXMucmVmcmVzaEFwcHNIYW5kbGVyKHRoaXMucXVldWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvZmlsdGVyL2ZpbHRlclByZXBhcmF0aW9uLmpzXG5hc3luYyBmdW5jdGlvbiBmaWx0ZXJQcmVwYXJhdGlvbihmaWx0ZXJzX2xpc3QsIHN0b3JhZ2UsIHBpcGVTZXJ2aWNlLCB2YXJpYWJsZXMgPSB7fSkge1xuICBjb25zdCBmaWx0ZXJBcnJheSA9IFtdO1xuICBjb25zdCBvYmplY3RNZXRob2QgPSB7XG4gICAgdmFyaWFibGVNZXRob2RjdXJyZW50X2FwcCgpIHtcbiAgICAgIHJldHVybiBbdmFyaWFibGVzLmN1cnJlbnRfYXBwX2lkIHx8IHZhcmlhYmxlcy5hcHBfaWRdO1xuICAgIH0sXG4gICAgdmFyaWFibGVNZXRob2RlbGVtZW50X2FwcCgpIHtcbiAgICAgIHJldHVybiBbdmFyaWFibGVzLmVsZW1lbnRfYXBwX2lkXTtcbiAgICB9LFxuICAgIHZhcmlhYmxlTWV0aG9kY3VycmVudF9pdGVtKCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gYCR7dmFyaWFibGVzLmN1cnJlbnRfYXBwX2lkIHx8IHZhcmlhYmxlcy5hcHBfaWR9LiR7dmFyaWFibGVzLml0ZW1faWR9YDtcbiAgICAgIHJldHVybiBbY3VycmVudFZhbHVlXTtcbiAgICB9LFxuICAgIHZhcmlhYmxlTWV0aG9kdXNlcl9pZCgpIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VfdXNlciA9IHN0b3JhZ2UuZ2V0VXNlcigpO1xuICAgICAgcmV0dXJuIFtzdG9yYWdlX3VzZXIudXNlcl9pZF07XG4gICAgfSxcbiAgICB2YXJpYWJsZU1ldGhvZHVzZXJfZW1haWwoZmlsdGVyKSB7XG4gICAgICBjb25zdCBzdG9yYWdlX3VzZXIgPSBzdG9yYWdlLmdldFVzZXIoKTtcbiAgICAgIHJldHVybiBbc3RvcmFnZV91c2VyLnVzZXJuYW1lXTtcbiAgICB9LFxuICAgIHZhcmlhYmxlTWV0aG9kdG9kYXkoZmlsdGVyKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgY29uc3QgZW5kX2RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkgKyAxKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXJ0X2RhdGUudmFsdWVPZigpLnRvU3RyaW5nKCkgKyBcIjpcIiArIGVuZF9kYXRlLnZhbHVlT2YoKS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIFtyZXN1bHRdO1xuICAgIH0sXG4gICAgdmFyaWFibGVNZXRob2R2YXJpYWJsZShwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIFt2YXJpYWJsZXNbcHJvcGVydHldXTtcbiAgICB9XG4gIH07XG4gIGlmIChmaWx0ZXJzX2xpc3QpIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzX2xpc3QpIHtcbiAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXQVJOSU5HICEhISAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFNob3VsZCBiZSBmaXhlZDogbW9kaWZpY2F0aW9uIG9mIGZpbHRlcnNfbGlzdCB2YWx1ZXNBcnJheVxuICAgICAgICBzd2l0Y2ggKGZpbHRlci5pbnB1dF90eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInZhcmlhYmxlXCI6XG4gICAgICAgICAgICBmaWx0ZXIudmFsdWVzQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyVmFsdWUgb2YgZmlsdGVyPy5pbnB1dF92YWx1ZS5zcGxpdCgnLCcpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGZpbHRlci5pbnB1dF90eXBlICsgXCJNZXRob2RcIiArIGZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICBjb25zdCBmdW5jID0gb2JqZWN0TWV0aG9kW2Z1bmN0aW9uTmFtZV07XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIudmFsdWVzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZXNBcnJheSA9IGZ1bmMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlc0FycmF5LnB1c2goLi4uZnVuYygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIudmFsdWVzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZXNBcnJheSA9IG9iamVjdE1ldGhvZC52YXJpYWJsZU1ldGhvZHZhcmlhYmxlKGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlc0FycmF5LnB1c2goLi4ub2JqZWN0TWV0aG9kLnZhcmlhYmxlTWV0aG9kdmFyaWFibGUoZmlsdGVyVmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbHRlckFycmF5LnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaWVsZFwiOlxuICAgICAgICAgICAgY29uc3QgZmllbGRfdmFsdWUgPSBhd2FpdCBmaWVsZE1ldGhvZCh7XG4gICAgICAgICAgICAgIGFwcF9pZDogdmFyaWFibGVzLmN1cnJlbnRfYXBwX2lkIHx8IHZhcmlhYmxlcy5hcHBfaWQsXG4gICAgICAgICAgICAgIGl0ZW1faWQ6IHZhcmlhYmxlcy5pdGVtX2lkLFxuICAgICAgICAgICAgICBmaWVsZF9pZDogZmlsdGVyLmlucHV0X3ZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmaWVsZF92YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZpbHRlci52YWx1ZXNBcnJheS5wdXNoKGZpZWxkX3ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbHRlckFycmF5LnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBmaWx0ZXJBcnJheS5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyQXJyYXkucHVzaChmaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmaWVsZE1ldGhvZChhZGRyZXNzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgcGlwZVNlcnZpY2Uub24oXCJnaF92YWx1ZV9nZXRcIiwgYWRkcmVzcywgZnVuY3Rpb24gZ2hWYWx1ZUdldChldmVudCwgZmllbGRfdmFsdWUpIHtcbiAgICAgICAgcGlwZVNlcnZpY2UuZGVzdHJveShcImdoX3ZhbHVlX2dldFwiLCBhZGRyZXNzLCBnaFZhbHVlR2V0KTtcbiAgICAgICAgcmVzb2x2ZShmaWVsZF92YWx1ZSk7XG4gICAgICB9KS5lbWl0KFwiZ2hfdmFsdWVfZ2V0XCIsIHt9LCBhZGRyZXNzKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmlsdGVyQXJyYXk7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvZnVzZS5qcy9kaXN0L2Z1c2UuZXNtLmpzXG4vKipcbiAqIEZ1c2UuanMgdjYuNi4yIC0gTGlnaHR3ZWlnaHQgZnV6enktc2VhcmNoIChodHRwOi8vZnVzZWpzLmlvKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBLaXJvIFJpc2sgKGh0dHA6Ly9raXJvLm1lKVxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wXG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKi9cblxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXlcbiAgICA/IGdldFRhZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICA6IEFycmF5LmlzQXJyYXkodmFsdWUpXG59XG5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2Jhc2VUb1N0cmluZy5qc1xuY29uc3QgSU5GSU5JVFkgPSAxIC8gMDtcbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgbGV0IHJlc3VsdCA9IHZhbHVlICsgJyc7XG4gIHJldHVybiByZXN1bHQgPT0gJzAnICYmIDEgLyB2YWx1ZSA9PSAtSU5GSU5JVFkgPyAnLTAnIDogcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGZ1c2VfZXNtX3RvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG59XG5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvaXNCb29sZWFuLmpzXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gdHJ1ZSB8fFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gJ1tvYmplY3QgQm9vbGVhbl0nKVxuICApXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbi8vIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLlxuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzQmxhbmsodmFsdWUpIHtcbiAgcmV0dXJuICF2YWx1ZS50cmltKCkubGVuZ3RoXG59XG5cbi8vIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbi8vIEFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2dldFRhZy5qc1xuZnVuY3Rpb24gZ2V0VGFnKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsXG4gICAgPyB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/ICdbb2JqZWN0IFVuZGVmaW5lZF0nXG4gICAgICA6ICdbb2JqZWN0IE51bGxdJ1xuICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKVxufVxuXG5jb25zdCBFWFRFTkRFRF9TRUFSQ0hfVU5BVkFJTEFCTEUgPSAnRXh0ZW5kZWQgc2VhcmNoIGlzIG5vdCBhdmFpbGFibGUnO1xuXG5jb25zdCBJTkNPUlJFQ1RfSU5ERVhfVFlQRSA9IFwiSW5jb3JyZWN0ICdpbmRleCcgdHlwZVwiO1xuXG5jb25zdCBMT0dJQ0FMX1NFQVJDSF9JTlZBTElEX1FVRVJZX0ZPUl9LRVkgPSAoa2V5KSA9PlxuICBgSW52YWxpZCB2YWx1ZSBmb3Iga2V5ICR7a2V5fWA7XG5cbmNvbnN0IFBBVFRFUk5fTEVOR1RIX1RPT19MQVJHRSA9IChtYXgpID0+XG4gIGBQYXR0ZXJuIGxlbmd0aCBleGNlZWRzIG1heCBvZiAke21heH0uYDtcblxuY29uc3QgTUlTU0lOR19LRVlfUFJPUEVSVFkgPSAobmFtZSkgPT4gYE1pc3NpbmcgJHtuYW1lfSBwcm9wZXJ0eSBpbiBrZXlgO1xuXG5jb25zdCBJTlZBTElEX0tFWV9XRUlHSFRfVkFMVUUgPSAoa2V5KSA9PlxuICBgUHJvcGVydHkgJ3dlaWdodCcgaW4ga2V5ICcke2tleX0nIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYDtcblxuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuY2xhc3MgS2V5U3RvcmUge1xuICBjb25zdHJ1Y3RvcihrZXlzKSB7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX2tleU1hcCA9IHt9O1xuXG4gICAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgb2JqID0gY3JlYXRlS2V5KGtleSk7XG5cbiAgICAgIHRvdGFsV2VpZ2h0ICs9IG9iai53ZWlnaHQ7XG5cbiAgICAgIHRoaXMuX2tleXMucHVzaChvYmopO1xuICAgICAgdGhpcy5fa2V5TWFwW29iai5pZF0gPSBvYmo7XG5cbiAgICAgIHRvdGFsV2VpZ2h0ICs9IG9iai53ZWlnaHQ7XG4gICAgfSk7XG5cbiAgICAvLyBOb3JtYWxpemUgd2VpZ2h0cyBzbyB0aGF0IHRoZWlyIHN1bSBpcyBlcXVhbCB0byAxXG4gICAgdGhpcy5fa2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGtleS53ZWlnaHQgLz0gdG90YWxXZWlnaHQ7XG4gICAgfSk7XG4gIH1cbiAgZ2V0KGtleUlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleU1hcFtrZXlJZF1cbiAgfVxuICBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLl9rZXlzXG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLl9rZXlzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleShrZXkpIHtcbiAgbGV0IHBhdGggPSBudWxsO1xuICBsZXQgaWQgPSBudWxsO1xuICBsZXQgc3JjID0gbnVsbDtcbiAgbGV0IHdlaWdodCA9IDE7XG4gIGxldCBnZXRGbiA9IG51bGw7XG5cbiAgaWYgKGlzU3RyaW5nKGtleSkgfHwgaXNBcnJheShrZXkpKSB7XG4gICAgc3JjID0ga2V5O1xuICAgIHBhdGggPSBjcmVhdGVLZXlQYXRoKGtleSk7XG4gICAgaWQgPSBjcmVhdGVLZXlJZChrZXkpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaGFzT3duLmNhbGwoa2V5LCAnbmFtZScpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoTUlTU0lOR19LRVlfUFJPUEVSVFkoJ25hbWUnKSlcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0ga2V5Lm5hbWU7XG4gICAgc3JjID0gbmFtZTtcblxuICAgIGlmIChoYXNPd24uY2FsbChrZXksICd3ZWlnaHQnKSkge1xuICAgICAgd2VpZ2h0ID0ga2V5LndlaWdodDtcblxuICAgICAgaWYgKHdlaWdodCA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX0tFWV9XRUlHSFRfVkFMVUUobmFtZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGF0aCA9IGNyZWF0ZUtleVBhdGgobmFtZSk7XG4gICAgaWQgPSBjcmVhdGVLZXlJZChuYW1lKTtcbiAgICBnZXRGbiA9IGtleS5nZXRGbjtcbiAgfVxuXG4gIHJldHVybiB7IHBhdGgsIGlkLCB3ZWlnaHQsIHNyYywgZ2V0Rm4gfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlQYXRoKGtleSkge1xuICByZXR1cm4gaXNBcnJheShrZXkpID8ga2V5IDoga2V5LnNwbGl0KCcuJylcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5SWQoa2V5KSB7XG4gIHJldHVybiBpc0FycmF5KGtleSkgPyBrZXkuam9pbignLicpIDoga2V5XG59XG5cbmZ1bmN0aW9uIGdldChvYmosIHBhdGgpIHtcbiAgbGV0IGxpc3QgPSBbXTtcbiAgbGV0IGFyciA9IGZhbHNlO1xuXG4gIGNvbnN0IGRlZXBHZXQgPSAob2JqLCBwYXRoLCBpbmRleCkgPT4ge1xuICAgIGlmICghaXNEZWZpbmVkKG9iaikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXBhdGhbaW5kZXhdKSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIHBhdGggbGVmdCwgd2UndmUgYXJyaXZlZCBhdCB0aGUgb2JqZWN0IHdlIGNhcmUgYWJvdXQuXG4gICAgICBsaXN0LnB1c2gob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGtleSA9IHBhdGhbaW5kZXhdO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICBpZiAoIWlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IHZhbHVlIGluIHRoZSBwYXRoLCBhbmQgaWYgaXQncyBhIHN0cmluZy9udW1iZXIvYm9vbCxcbiAgICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgaWYgKFxuICAgICAgICBpbmRleCA9PT0gcGF0aC5sZW5ndGggLSAxICYmXG4gICAgICAgIChpc1N0cmluZyh2YWx1ZSkgfHwgaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgICApIHtcbiAgICAgICAgbGlzdC5wdXNoKGZ1c2VfZXNtX3RvU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGFyciA9IHRydWU7XG4gICAgICAgIC8vIFNlYXJjaCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBkZWVwR2V0KHZhbHVlW2ldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFuIG9iamVjdC4gUmVjdXJzZSBmdXJ0aGVyLlxuICAgICAgICBkZWVwR2V0KHZhbHVlLCBwYXRoLCBpbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoc2luY2UgcGF0aCB1c2VkIHRvIGJlIGEgc3RyaW5nKVxuICBkZWVwR2V0KG9iaiwgaXNTdHJpbmcocGF0aCkgPyBwYXRoLnNwbGl0KCcuJykgOiBwYXRoLCAwKTtcblxuICByZXR1cm4gYXJyID8gbGlzdCA6IGxpc3RbMF1cbn1cblxuY29uc3QgTWF0Y2hPcHRpb25zID0ge1xuICAvLyBXaGV0aGVyIHRoZSBtYXRjaGVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IHNldC4gV2hlbiBgdHJ1ZWAsIGVhY2ggcmVjb3JkIGluIHRoZSByZXN1bHRcbiAgLy8gc2V0IHdpbGwgaW5jbHVkZSB0aGUgaW5kaWNlcyBvZiB0aGUgbWF0Y2hlZCBjaGFyYWN0ZXJzLlxuICAvLyBUaGVzZSBjYW4gY29uc2VxdWVudGx5IGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZyBwdXJwb3Nlcy5cbiAgaW5jbHVkZU1hdGNoZXM6IGZhbHNlLFxuICAvLyBXaGVuIGB0cnVlYCwgdGhlIG1hdGNoaW5nIGZ1bmN0aW9uIHdpbGwgY29udGludWUgdG8gdGhlIGVuZCBvZiBhIHNlYXJjaCBwYXR0ZXJuIGV2ZW4gaWZcbiAgLy8gYSBwZXJmZWN0IG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gbG9jYXRlZCBpbiB0aGUgc3RyaW5nLlxuICBmaW5kQWxsTWF0Y2hlczogZmFsc2UsXG4gIC8vIE1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYmVmb3JlIGEgcmVzdWx0IGlzIGNvbnNpZGVyZWQgYSBtYXRjaFxuICBtaW5NYXRjaENoYXJMZW5ndGg6IDFcbn07XG5cbmNvbnN0IEJhc2ljT3B0aW9ucyA9IHtcbiAgLy8gV2hlbiBgdHJ1ZWAsIHRoZSBhbGdvcml0aG0gY29udGludWVzIHNlYXJjaGluZyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBldmVuIGlmIGEgcGVyZmVjdFxuICAvLyBtYXRjaCBpcyBmb3VuZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc2FtZSBpbnB1dC5cbiAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgLy8gV2hlbiB0cnVlLCB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGEgc2VhcmNoIHBhdHRlcm4gZXZlbiBpZlxuICBpbmNsdWRlU2NvcmU6IGZhbHNlLFxuICAvLyBMaXN0IG9mIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBUaGlzIGFsc28gc3VwcG9ydHMgbmVzdGVkIHByb3BlcnRpZXMuXG4gIGtleXM6IFtdLFxuICAvLyBXaGV0aGVyIHRvIHNvcnQgdGhlIHJlc3VsdCBsaXN0LCBieSBzY29yZVxuICBzaG91bGRTb3J0OiB0cnVlLFxuICAvLyBEZWZhdWx0IHNvcnQgZnVuY3Rpb246IHNvcnQgYnkgYXNjZW5kaW5nIHNjb3JlLCBhc2NlbmRpbmcgaW5kZXhcbiAgc29ydEZuOiAoYSwgYikgPT5cbiAgICBhLnNjb3JlID09PSBiLnNjb3JlID8gKGEuaWR4IDwgYi5pZHggPyAtMSA6IDEpIDogYS5zY29yZSA8IGIuc2NvcmUgPyAtMSA6IDFcbn07XG5cbmNvbnN0IEZ1enp5T3B0aW9ucyA9IHtcbiAgLy8gQXBwcm94aW1hdGVseSB3aGVyZSBpbiB0aGUgdGV4dCBpcyB0aGUgcGF0dGVybiBleHBlY3RlZCB0byBiZSBmb3VuZD9cbiAgbG9jYXRpb246IDAsXG4gIC8vIEF0IHdoYXQgcG9pbnQgZG9lcyB0aGUgbWF0Y2ggYWxnb3JpdGhtIGdpdmUgdXAuIEEgdGhyZXNob2xkIG9mICcwLjAnIHJlcXVpcmVzIGEgcGVyZmVjdCBtYXRjaFxuICAvLyAob2YgYm90aCBsZXR0ZXJzIGFuZCBsb2NhdGlvbiksIGEgdGhyZXNob2xkIG9mICcxLjAnIHdvdWxkIG1hdGNoIGFueXRoaW5nLlxuICB0aHJlc2hvbGQ6IDAuNixcbiAgLy8gRGV0ZXJtaW5lcyBob3cgY2xvc2UgdGhlIG1hdGNoIG11c3QgYmUgdG8gdGhlIGZ1enp5IGxvY2F0aW9uIChzcGVjaWZpZWQgYWJvdmUpLlxuICAvLyBBbiBleGFjdCBsZXR0ZXIgbWF0Y2ggd2hpY2ggaXMgJ2Rpc3RhbmNlJyBjaGFyYWN0ZXJzIGF3YXkgZnJvbSB0aGUgZnV6enkgbG9jYXRpb25cbiAgLy8gd291bGQgc2NvcmUgYXMgYSBjb21wbGV0ZSBtaXNtYXRjaC4gQSBkaXN0YW5jZSBvZiAnMCcgcmVxdWlyZXMgdGhlIG1hdGNoIGJlIGF0XG4gIC8vIHRoZSBleGFjdCBsb2NhdGlvbiBzcGVjaWZpZWQsIGEgdGhyZXNob2xkIG9mICcxMDAwJyB3b3VsZCByZXF1aXJlIGEgcGVyZmVjdCBtYXRjaFxuICAvLyB0byBiZSB3aXRoaW4gODAwIGNoYXJhY3RlcnMgb2YgdGhlIGZ1enp5IGxvY2F0aW9uIHRvIGJlIGZvdW5kIHVzaW5nIGEgMC44IHRocmVzaG9sZC5cbiAgZGlzdGFuY2U6IDEwMFxufTtcblxuY29uc3QgQWR2YW5jZWRPcHRpb25zID0ge1xuICAvLyBXaGVuIGB0cnVlYCwgaXQgZW5hYmxlcyB0aGUgdXNlIG9mIHVuaXgtbGlrZSBzZWFyY2ggY29tbWFuZHNcbiAgdXNlRXh0ZW5kZWRTZWFyY2g6IGZhbHNlLFxuICAvLyBUaGUgZ2V0IGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGZldGNoaW5nIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIC8vIFRoZSBkZWZhdWx0IHdpbGwgc2VhcmNoIG5lc3RlZCBwYXRocyAqaWUgZm9vLmJhci5iYXoqXG4gIGdldEZuOiBnZXQsXG4gIC8vIFdoZW4gYHRydWVgLCBzZWFyY2ggd2lsbCBpZ25vcmUgYGxvY2F0aW9uYCBhbmQgYGRpc3RhbmNlYCwgc28gaXQgd29uJ3QgbWF0dGVyXG4gIC8vIHdoZXJlIGluIHRoZSBzdHJpbmcgdGhlIHBhdHRlcm4gYXBwZWFycy5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2Z1enppbmVzcy1zY29yZVxuICBpZ25vcmVMb2NhdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gYHRydWVgLCB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSByZWxldmFuY2Ugc2NvcmUgKHVzZWQgZm9yIHNvcnRpbmcpIHdpbGxcbiAgLy8gaWdub3JlIHRoZSBmaWVsZC1sZW5ndGggbm9ybS5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2ZpZWxkLWxlbmd0aC1ub3JtXG4gIGlnbm9yZUZpZWxkTm9ybTogZmFsc2UsXG4gIC8vIFRoZSB3ZWlnaHQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGZpZWxkIGxlbmd0aCBub3JtIGVmZmVjdHMgc2NvcmluZy5cbiAgZmllbGROb3JtV2VpZ2h0OiAxXG59O1xuXG52YXIgQ29uZmlnID0ge1xuICAuLi5CYXNpY09wdGlvbnMsXG4gIC4uLk1hdGNoT3B0aW9ucyxcbiAgLi4uRnV6enlPcHRpb25zLFxuICAuLi5BZHZhbmNlZE9wdGlvbnNcbn07XG5cbmNvbnN0IFNQQUNFID0gL1teIF0rL2c7XG5cbi8vIEZpZWxkLWxlbmd0aCBub3JtOiB0aGUgc2hvcnRlciB0aGUgZmllbGQsIHRoZSBoaWdoZXIgdGhlIHdlaWdodC5cbi8vIFNldCB0byAzIGRlY2ltYWxzIHRvIHJlZHVjZSBpbmRleCBzaXplLlxuZnVuY3Rpb24gbm9ybSh3ZWlnaHQgPSAxLCBtYW50aXNzYSA9IDMpIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG0gPSBNYXRoLnBvdygxMCwgbWFudGlzc2EpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0KHZhbHVlKSB7XG4gICAgICBjb25zdCBudW1Ub2tlbnMgPSB2YWx1ZS5tYXRjaChTUEFDRSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2FjaGUuaGFzKG51bVRva2VucykpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChudW1Ub2tlbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gaXMgMS9zcXJ0KHgpLCB3ZWlnaHQgbWFrZXMgdGhhdCB2YXJpYWJsZVxuICAgICAgY29uc3Qgbm9ybSA9IDEgLyBNYXRoLnBvdyhudW1Ub2tlbnMsIDAuNSAqIHdlaWdodCk7XG5cbiAgICAgIC8vIEluIHBsYWNlIG9mIGB0b0ZpeGVkKG1hbnRpc3NhKWAsIGZvciBmYXN0ZXIgY29tcHV0YXRpb25cbiAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KE1hdGgucm91bmQobm9ybSAqIG0pIC8gbSk7XG5cbiAgICAgIGNhY2hlLnNldChudW1Ub2tlbnMsIG4pO1xuXG4gICAgICByZXR1cm4gblxuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXNlSW5kZXgge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sXG4gICAgZmllbGROb3JtV2VpZ2h0ID0gQ29uZmlnLmZpZWxkTm9ybVdlaWdodFxuICB9ID0ge30pIHtcbiAgICB0aGlzLm5vcm0gPSBub3JtKGZpZWxkTm9ybVdlaWdodCwgMyk7XG4gICAgdGhpcy5nZXRGbiA9IGdldEZuO1xuICAgIHRoaXMuaXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNldEluZGV4UmVjb3JkcygpO1xuICB9XG4gIHNldFNvdXJjZXMoZG9jcyA9IFtdKSB7XG4gICAgdGhpcy5kb2NzID0gZG9jcztcbiAgfVxuICBzZXRJbmRleFJlY29yZHMocmVjb3JkcyA9IFtdKSB7XG4gICAgdGhpcy5yZWNvcmRzID0gcmVjb3JkcztcbiAgfVxuICBzZXRLZXlzKGtleXMgPSBbXSkge1xuICAgIHRoaXMua2V5cyA9IGtleXM7XG4gICAgdGhpcy5fa2V5c01hcCA9IHt9O1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpZHgpID0+IHtcbiAgICAgIHRoaXMuX2tleXNNYXBba2V5LmlkXSA9IGlkeDtcbiAgICB9KTtcbiAgfVxuICBjcmVhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGVkIHx8ICF0aGlzLmRvY3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmlzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAvLyBMaXN0IGlzIEFycmF5PFN0cmluZz5cbiAgICBpZiAoaXNTdHJpbmcodGhpcy5kb2NzWzBdKSkge1xuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3QgaXMgQXJyYXk8T2JqZWN0PlxuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3JtLmNsZWFyKCk7XG4gIH1cbiAgLy8gQWRkcyBhIGRvYyB0byB0aGUgZW5kIG9mIHRoZSBpbmRleFxuICBhZGQoZG9jKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5zaXplKCk7XG5cbiAgICBpZiAoaXNTdHJpbmcoZG9jKSkge1xuICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgaWR4KTtcbiAgICB9XG4gIH1cbiAgLy8gUmVtb3ZlcyB0aGUgZG9jIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIGluZGV4XG4gIHJlbW92ZUF0KGlkeCkge1xuICAgIHRoaXMucmVjb3Jkcy5zcGxpY2UoaWR4LCAxKTtcblxuICAgIC8vIENoYW5nZSByZWYgaW5kZXggb2YgZXZlcnkgc3Vic3F1ZW50IGRvY1xuICAgIGZvciAobGV0IGkgPSBpZHgsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHRoaXMucmVjb3Jkc1tpXS5pIC09IDE7XG4gICAgfVxuICB9XG4gIGdldFZhbHVlRm9ySXRlbUF0S2V5SWQoaXRlbSwga2V5SWQpIHtcbiAgICByZXR1cm4gaXRlbVt0aGlzLl9rZXlzTWFwW2tleUlkXV1cbiAgfVxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZHMubGVuZ3RoXG4gIH1cbiAgX2FkZFN0cmluZyhkb2MsIGRvY0luZGV4KSB7XG4gICAgaWYgKCFpc0RlZmluZWQoZG9jKSB8fCBpc0JsYW5rKGRvYykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSB7XG4gICAgICB2OiBkb2MsXG4gICAgICBpOiBkb2NJbmRleCxcbiAgICAgIG46IHRoaXMubm9ybS5nZXQoZG9jKVxuICAgIH07XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIF9hZGRPYmplY3QoZG9jLCBkb2NJbmRleCkge1xuICAgIGxldCByZWNvcmQgPSB7IGk6IGRvY0luZGV4LCAkOiB7fSB9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGV2ZXJ5IGtleSAoaS5lLCBwYXRoKSwgYW5kIGZldGNoIHRoZSB2YWx1ZSBhdCB0aGF0IGtleVxuICAgIHRoaXMua2V5cy5mb3JFYWNoKChrZXksIGtleUluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBrZXkuZ2V0Rm4gPyBrZXkuZ2V0Rm4oZG9jKSA6IHRoaXMuZ2V0Rm4oZG9jLCBrZXkucGF0aCk7XG5cbiAgICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmRzID0gW107XG4gICAgICAgIGNvbnN0IHN0YWNrID0gW3sgbmVzdGVkQXJySW5kZXg6IC0xLCB2YWx1ZSB9XTtcblxuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgeyBuZXN0ZWRBcnJJbmRleCwgdmFsdWUgfSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgaWYgKCFpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViUmVjb3JkID0ge1xuICAgICAgICAgICAgICB2OiB2YWx1ZSxcbiAgICAgICAgICAgICAgaTogbmVzdGVkQXJySW5kZXgsXG4gICAgICAgICAgICAgIG46IHRoaXMubm9ybS5nZXQodmFsdWUpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdWJSZWNvcmRzLnB1c2goc3ViUmVjb3JkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtLCBrKSA9PiB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIG5lc3RlZEFyckluZGV4OiBrLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIDtcbiAgICAgICAgfVxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmRzO1xuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmQgPSB7XG4gICAgICAgICAgdjogdmFsdWUsXG4gICAgICAgICAgbjogdGhpcy5ub3JtLmdldCh2YWx1ZSlcbiAgICAgICAgfTtcblxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogdGhpcy5rZXlzLFxuICAgICAgcmVjb3JkczogdGhpcy5yZWNvcmRzXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUluZGV4KFxuICBrZXlzLFxuICBkb2NzLFxuICB7IGdldEZuID0gQ29uZmlnLmdldEZuLCBmaWVsZE5vcm1XZWlnaHQgPSBDb25maWcuZmllbGROb3JtV2VpZ2h0IH0gPSB7fVxuKSB7XG4gIGNvbnN0IG15SW5kZXggPSBuZXcgRnVzZUluZGV4KHsgZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCB9KTtcbiAgbXlJbmRleC5zZXRLZXlzKGtleXMubWFwKGNyZWF0ZUtleSkpO1xuICBteUluZGV4LnNldFNvdXJjZXMoZG9jcyk7XG4gIG15SW5kZXguY3JlYXRlKCk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXgoXG4gIGRhdGEsXG4gIHsgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCA9IENvbmZpZy5maWVsZE5vcm1XZWlnaHQgfSA9IHt9XG4pIHtcbiAgY29uc3QgeyBrZXlzLCByZWNvcmRzIH0gPSBkYXRhO1xuICBjb25zdCBteUluZGV4ID0gbmV3IEZ1c2VJbmRleCh7IGdldEZuLCBmaWVsZE5vcm1XZWlnaHQgfSk7XG4gIG15SW5kZXguc2V0S2V5cyhrZXlzKTtcbiAgbXlJbmRleC5zZXRJbmRleFJlY29yZHMocmVjb3Jkcyk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTY29yZSQxKFxuICBwYXR0ZXJuLFxuICB7XG4gICAgZXJyb3JzID0gMCxcbiAgICBjdXJyZW50TG9jYXRpb24gPSAwLFxuICAgIGV4cGVjdGVkTG9jYXRpb24gPSAwLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gIH0gPSB7fVxuKSB7XG4gIGNvbnN0IGFjY3VyYWN5ID0gZXJyb3JzIC8gcGF0dGVybi5sZW5ndGg7XG5cbiAgaWYgKGlnbm9yZUxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIGFjY3VyYWN5XG4gIH1cblxuICBjb25zdCBwcm94aW1pdHkgPSBNYXRoLmFicyhleHBlY3RlZExvY2F0aW9uIC0gY3VycmVudExvY2F0aW9uKTtcblxuICBpZiAoIWRpc3RhbmNlKSB7XG4gICAgLy8gRG9kZ2UgZGl2aWRlIGJ5IHplcm8gZXJyb3IuXG4gICAgcmV0dXJuIHByb3hpbWl0eSA/IDEuMCA6IGFjY3VyYWN5XG4gIH1cblxuICByZXR1cm4gYWNjdXJhY3kgKyBwcm94aW1pdHkgLyBkaXN0YW5jZVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0TWFza1RvSW5kaWNlcyhcbiAgbWF0Y2htYXNrID0gW10sXG4gIG1pbk1hdGNoQ2hhckxlbmd0aCA9IENvbmZpZy5taW5NYXRjaENoYXJMZW5ndGhcbikge1xuICBsZXQgaW5kaWNlcyA9IFtdO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBsZXQgaSA9IDA7XG5cbiAgZm9yIChsZXQgbGVuID0gbWF0Y2htYXNrLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgbGV0IG1hdGNoID0gbWF0Y2htYXNrW2ldO1xuICAgIGlmIChtYXRjaCAmJiBzdGFydCA9PT0gLTEpIHtcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaCAmJiBzdGFydCAhPT0gLTEpIHtcbiAgICAgIGVuZCA9IGkgLSAxO1xuICAgICAgaWYgKGVuZCAtIHN0YXJ0ICsgMSA+PSBtaW5NYXRjaENoYXJMZW5ndGgpIHtcbiAgICAgICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgZW5kXSk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8vIChpLTEgLSBzdGFydCkgKyAxID0+IGkgLSBzdGFydFxuICBpZiAobWF0Y2htYXNrW2kgLSAxXSAmJiBpIC0gc3RhcnQgPj0gbWluTWF0Y2hDaGFyTGVuZ3RoKSB7XG4gICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgaSAtIDFdKTtcbiAgfVxuXG4gIHJldHVybiBpbmRpY2VzXG59XG5cbi8vIE1hY2hpbmUgd29yZCBzaXplXG5jb25zdCBNQVhfQklUUyA9IDMyO1xuXG5mdW5jdGlvbiBzZWFyY2goXG4gIHRleHQsXG4gIHBhdHRlcm4sXG4gIHBhdHRlcm5BbHBoYWJldCxcbiAge1xuICAgIGxvY2F0aW9uID0gQ29uZmlnLmxvY2F0aW9uLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgbWluTWF0Y2hDaGFyTGVuZ3RoID0gQ29uZmlnLm1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICBpbmNsdWRlTWF0Y2hlcyA9IENvbmZpZy5pbmNsdWRlTWF0Y2hlcyxcbiAgICBpZ25vcmVMb2NhdGlvbiA9IENvbmZpZy5pZ25vcmVMb2NhdGlvblxuICB9ID0ge31cbikge1xuICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfQklUUykge1xuICAgIHRocm93IG5ldyBFcnJvcihQQVRURVJOX0xFTkdUSF9UT09fTEFSR0UoTUFYX0JJVFMpKVxuICB9XG5cbiAgY29uc3QgcGF0dGVybkxlbiA9IHBhdHRlcm4ubGVuZ3RoO1xuICAvLyBTZXQgc3RhcnRpbmcgbG9jYXRpb24gYXQgYmVnaW5uaW5nIHRleHQgYW5kIGluaXRpYWxpemUgdGhlIGFscGhhYmV0LlxuICBjb25zdCB0ZXh0TGVuID0gdGV4dC5sZW5ndGg7XG4gIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIGxvY2F0aW9uID4gdGV4dC5sZW5ndGhcbiAgY29uc3QgZXhwZWN0ZWRMb2NhdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxvY2F0aW9uLCB0ZXh0TGVuKSk7XG4gIC8vIEhpZ2hlc3Qgc2NvcmUgYmV5b25kIHdoaWNoIHdlIGdpdmUgdXAuXG4gIGxldCBjdXJyZW50VGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAvLyBJcyB0aGVyZSBhIG5lYXJieSBleGFjdCBtYXRjaD8gKHNwZWVkdXApXG4gIGxldCBiZXN0TG9jYXRpb24gPSBleHBlY3RlZExvY2F0aW9uO1xuXG4gIC8vIFBlcmZvcm1hbmNlOiBvbmx5IGNvbXB1dGVyIG1hdGNoZXMgd2hlbiB0aGUgbWluTWF0Y2hDaGFyTGVuZ3RoID4gMVxuICAvLyBPUiBpZiBgaW5jbHVkZU1hdGNoZXNgIGlzIHRydWUuXG4gIGNvbnN0IGNvbXB1dGVNYXRjaGVzID0gbWluTWF0Y2hDaGFyTGVuZ3RoID4gMSB8fCBpbmNsdWRlTWF0Y2hlcztcbiAgLy8gQSBtYXNrIG9mIHRoZSBtYXRjaGVzLCB1c2VkIGZvciBidWlsZGluZyB0aGUgaW5kaWNlc1xuICBjb25zdCBtYXRjaE1hc2sgPSBjb21wdXRlTWF0Y2hlcyA/IEFycmF5KHRleHRMZW4pIDogW107XG5cbiAgbGV0IGluZGV4O1xuXG4gIC8vIEdldCBhbGwgZXhhY3QgbWF0Y2hlcywgaGVyZSBmb3Igc3BlZWQgdXBcbiAgd2hpbGUgKChpbmRleCA9IHRleHQuaW5kZXhPZihwYXR0ZXJuLCBiZXN0TG9jYXRpb24pKSA+IC0xKSB7XG4gICAgbGV0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgY3VycmVudExvY2F0aW9uOiBpbmRleCxcbiAgICAgIGV4cGVjdGVkTG9jYXRpb24sXG4gICAgICBkaXN0YW5jZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgfSk7XG5cbiAgICBjdXJyZW50VGhyZXNob2xkID0gTWF0aC5taW4oc2NvcmUsIGN1cnJlbnRUaHJlc2hvbGQpO1xuICAgIGJlc3RMb2NhdGlvbiA9IGluZGV4ICsgcGF0dGVybkxlbjtcblxuICAgIGlmIChjb21wdXRlTWF0Y2hlcykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCBwYXR0ZXJuTGVuKSB7XG4gICAgICAgIG1hdGNoTWFza1tpbmRleCArIGldID0gMTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSBiZXN0IGxvY2F0aW9uXG4gIGJlc3RMb2NhdGlvbiA9IC0xO1xuXG4gIGxldCBsYXN0Qml0QXJyID0gW107XG4gIGxldCBmaW5hbFNjb3JlID0gMTtcbiAgbGV0IGJpbk1heCA9IHBhdHRlcm5MZW4gKyB0ZXh0TGVuO1xuXG4gIGNvbnN0IG1hc2sgPSAxIDw8IChwYXR0ZXJuTGVuIC0gMSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuTGVuOyBpICs9IDEpIHtcbiAgICAvLyBTY2FuIGZvciB0aGUgYmVzdCBtYXRjaDsgZWFjaCBpdGVyYXRpb24gYWxsb3dzIGZvciBvbmUgbW9yZSBlcnJvci5cbiAgICAvLyBSdW4gYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSBob3cgZmFyIGZyb20gdGhlIG1hdGNoIGxvY2F0aW9uIHdlIGNhbiBzdHJheVxuICAgIC8vIGF0IHRoaXMgZXJyb3IgbGV2ZWwuXG4gICAgbGV0IGJpbk1pbiA9IDA7XG4gICAgbGV0IGJpbk1pZCA9IGJpbk1heDtcblxuICAgIHdoaWxlIChiaW5NaW4gPCBiaW5NaWQpIHtcbiAgICAgIGNvbnN0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICBlcnJvcnM6IGksXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogZXhwZWN0ZWRMb2NhdGlvbiArIGJpbk1pZCxcbiAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgYmluTWluID0gYmluTWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluTWF4ID0gYmluTWlkO1xuICAgICAgfVxuXG4gICAgICBiaW5NaWQgPSBNYXRoLmZsb29yKChiaW5NYXggLSBiaW5NaW4pIC8gMiArIGJpbk1pbik7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSByZXN1bHQgZnJvbSB0aGlzIGl0ZXJhdGlvbiBhcyB0aGUgbWF4aW11bSBmb3IgdGhlIG5leHQuXG4gICAgYmluTWF4ID0gYmluTWlkO1xuXG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoMSwgZXhwZWN0ZWRMb2NhdGlvbiAtIGJpbk1pZCArIDEpO1xuICAgIGxldCBmaW5pc2ggPSBmaW5kQWxsTWF0Y2hlc1xuICAgICAgPyB0ZXh0TGVuXG4gICAgICA6IE1hdGgubWluKGV4cGVjdGVkTG9jYXRpb24gKyBiaW5NaWQsIHRleHRMZW4pICsgcGF0dGVybkxlbjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGJpdCBhcnJheVxuICAgIGxldCBiaXRBcnIgPSBBcnJheShmaW5pc2ggKyAyKTtcblxuICAgIGJpdEFycltmaW5pc2ggKyAxXSA9ICgxIDw8IGkpIC0gMTtcblxuICAgIGZvciAobGV0IGogPSBmaW5pc2g7IGogPj0gc3RhcnQ7IGogLT0gMSkge1xuICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGogLSAxO1xuICAgICAgbGV0IGNoYXJNYXRjaCA9IHBhdHRlcm5BbHBoYWJldFt0ZXh0LmNoYXJBdChjdXJyZW50TG9jYXRpb24pXTtcblxuICAgICAgaWYgKGNvbXB1dGVNYXRjaGVzKSB7XG4gICAgICAgIC8vIFNwZWVkIHVwOiBxdWljayBib29sIHRvIGludCBjb252ZXJzaW9uIChpLmUsIGBjaGFyTWF0Y2ggPyAxIDogMGApXG4gICAgICAgIG1hdGNoTWFza1tjdXJyZW50TG9jYXRpb25dID0gKyEhY2hhck1hdGNoO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBleGFjdCBtYXRjaFxuICAgICAgYml0QXJyW2pdID0gKChiaXRBcnJbaiArIDFdIDw8IDEpIHwgMSkgJiBjaGFyTWF0Y2g7XG5cbiAgICAgIC8vIFN1YnNlcXVlbnQgcGFzc2VzOiBmdXp6eSBtYXRjaFxuICAgICAgaWYgKGkpIHtcbiAgICAgICAgYml0QXJyW2pdIHw9XG4gICAgICAgICAgKChsYXN0Qml0QXJyW2ogKyAxXSB8IGxhc3RCaXRBcnJbal0pIDw8IDEpIHwgMSB8IGxhc3RCaXRBcnJbaiArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoYml0QXJyW2pdICYgbWFzaykge1xuICAgICAgICBmaW5hbFNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICAgIGVycm9yczogaSxcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgICBkaXN0YW5jZSxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGlzIG1hdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBiZXR0ZXIgdGhhbiBhbnkgZXhpc3RpbmcgbWF0Y2guXG4gICAgICAgIC8vIEJ1dCBjaGVjayBhbnl3YXkuXG4gICAgICAgIGlmIChmaW5hbFNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBJbmRlZWQgaXQgaXNcbiAgICAgICAgICBjdXJyZW50VGhyZXNob2xkID0gZmluYWxTY29yZTtcbiAgICAgICAgICBiZXN0TG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb247XG5cbiAgICAgICAgICAvLyBBbHJlYWR5IHBhc3NlZCBgbG9jYCwgZG93bmhpbGwgZnJvbSBoZXJlIG9uIGluLlxuICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPD0gZXhwZWN0ZWRMb2NhdGlvbikge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBXaGVuIHBhc3NpbmcgYGJlc3RMb2NhdGlvbmAsIGRvbid0IGV4Y2VlZCBvdXIgY3VycmVudCBkaXN0YW5jZSBmcm9tIGBleHBlY3RlZExvY2F0aW9uYC5cbiAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDEsIDIgKiBleHBlY3RlZExvY2F0aW9uIC0gYmVzdExvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGhvcGUgZm9yIGEgKGJldHRlcikgbWF0Y2ggYXQgZ3JlYXRlciBlcnJvciBsZXZlbHMuXG4gICAgY29uc3Qgc2NvcmUgPSBjb21wdXRlU2NvcmUkMShwYXR0ZXJuLCB7XG4gICAgICBlcnJvcnM6IGkgKyAxLFxuICAgICAgY3VycmVudExvY2F0aW9uOiBleHBlY3RlZExvY2F0aW9uLFxuICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9KTtcblxuICAgIGlmIChzY29yZSA+IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgbGFzdEJpdEFyciA9IGJpdEFycjtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpc01hdGNoOiBiZXN0TG9jYXRpb24gPj0gMCxcbiAgICAvLyBDb3VudCBleGFjdCBtYXRjaGVzICh0aG9zZSB3aXRoIGEgc2NvcmUgb2YgMCkgdG8gYmUgXCJhbG1vc3RcIiBleGFjdFxuICAgIHNjb3JlOiBNYXRoLm1heCgwLjAwMSwgZmluYWxTY29yZSlcbiAgfTtcblxuICBpZiAoY29tcHV0ZU1hdGNoZXMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gY29udmVydE1hc2tUb0luZGljZXMobWF0Y2hNYXNrLCBtaW5NYXRjaENoYXJMZW5ndGgpO1xuICAgIGlmICghaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBpbmRpY2VzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pIHtcbiAgbGV0IG1hc2sgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGF0dGVybi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgIGNvbnN0IGNoYXIgPSBwYXR0ZXJuLmNoYXJBdChpKTtcbiAgICBtYXNrW2NoYXJdID0gKG1hc2tbY2hhcl0gfHwgMCkgfCAoMSA8PCAobGVuIC0gaSAtIDEpKTtcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG5cbmNsYXNzIEJpdGFwU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9O1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcblxuICAgIHRoaXMuY2h1bmtzID0gW107XG5cbiAgICBpZiAoIXRoaXMucGF0dGVybi5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFkZENodW5rID0gKHBhdHRlcm4sIHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIHRoaXMuY2h1bmtzLnB1c2goe1xuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBhbHBoYWJldDogY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pLFxuICAgICAgICBzdGFydEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgbGVuID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPiBNQVhfQklUUykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gbGVuICUgTUFYX0JJVFM7XG4gICAgICBjb25zdCBlbmQgPSBsZW4gLSByZW1haW5kZXI7XG5cbiAgICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoaSwgTUFYX0JJVFMpLCBpKTtcbiAgICAgICAgaSArPSBNQVhfQklUUztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbWFpbmRlcikge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbGVuIC0gTUFYX0JJVFM7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoc3RhcnRJbmRleCksIHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDaHVuayh0aGlzLnBhdHRlcm4sIDApO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaEluKHRleHQpIHtcbiAgICBjb25zdCB7IGlzQ2FzZVNlbnNpdGl2ZSwgaW5jbHVkZU1hdGNoZXMgfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlKSB7XG4gICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIEV4YWN0IG1hdGNoXG4gICAgaWYgKHRoaXMucGF0dGVybiA9PT0gdGV4dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgaXNNYXRjaDogdHJ1ZSxcbiAgICAgICAgc2NvcmU6IDBcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgICByZXN1bHQuaW5kaWNlcyA9IFtbMCwgdGV4dC5sZW5ndGggLSAxXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSBCaXRhcCBhbGdvcml0aG1cbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGgsXG4gICAgICBpZ25vcmVMb2NhdGlvblxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBsZXQgYWxsSW5kaWNlcyA9IFtdO1xuICAgIGxldCB0b3RhbFNjb3JlID0gMDtcbiAgICBsZXQgaGFzTWF0Y2hlcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5jaHVua3MuZm9yRWFjaCgoeyBwYXR0ZXJuLCBhbHBoYWJldCwgc3RhcnRJbmRleCB9KSA9PiB7XG4gICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2godGV4dCwgcGF0dGVybiwgYWxwaGFiZXQsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uICsgc3RhcnRJbmRleCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICAgIG1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgaGFzTWF0Y2hlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRvdGFsU2NvcmUgKz0gc2NvcmU7XG5cbiAgICAgIGlmIChpc01hdGNoICYmIGluZGljZXMpIHtcbiAgICAgICAgYWxsSW5kaWNlcyA9IFsuLi5hbGxJbmRpY2VzLCAuLi5pbmRpY2VzXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBpc01hdGNoOiBoYXNNYXRjaGVzLFxuICAgICAgc2NvcmU6IGhhc01hdGNoZXMgPyB0b3RhbFNjb3JlIC8gdGhpcy5jaHVua3MubGVuZ3RoIDogMVxuICAgIH07XG5cbiAgICBpZiAoaGFzTWF0Y2hlcyAmJiBpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBhbGxJbmRpY2VzO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5jbGFzcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuICBzdGF0aWMgaXNNdWx0aU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5tdWx0aVJlZ2V4KVxuICB9XG4gIHN0YXRpYyBpc1NpbmdsZU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5zaW5nbGVSZWdleClcbiAgfVxuICBzZWFyY2goLyp0ZXh0Ki8pIHt9XG59XG5cbmZ1bmN0aW9uIGdldE1hdGNoKHBhdHRlcm4sIGV4cCkge1xuICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5tYXRjaChleHApO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiBudWxsXG59XG5cbi8vIFRva2VuOiAnZmlsZVxuXG5jbGFzcyBFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2V4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL149XCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9ePSguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQgPT09IHRoaXMucGF0dGVybjtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0aGlzLnBhdHRlcm4ubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICFmaXJlXG5cbmNsYXNzIEludmVyc2VFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIiQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRleHQuaW5kZXhPZih0aGlzLnBhdHRlcm4pO1xuICAgIGNvbnN0IGlzTWF0Y2ggPSBpbmRleCA9PT0gLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogXmZpbGVcblxuY2xhc3MgUHJlZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdwcmVmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXlwiKC4qKVwiJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuc3RhcnRzV2l0aCh0aGlzLnBhdHRlcm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTWF0Y2gsXG4gICAgICBzY29yZTogaXNNYXRjaCA/IDAgOiAxLFxuICAgICAgaW5kaWNlczogWzAsIHRoaXMucGF0dGVybi5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogIV5maXJlXG5cbmNsYXNzIEludmVyc2VQcmVmaXhFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtcHJlZml4LWV4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL14hXFxeXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eIVxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9ICF0ZXh0LnN0YXJ0c1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0ZXh0Lmxlbmd0aCAtIDFdXG4gICAgfVxuICB9XG59XG5cbi8vIFRva2VuOiAuZmlsZSRcblxuY2xhc3MgU3VmZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdzdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlwiKC4qKVwiXFwkJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiguKilcXCQkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFt0ZXh0Lmxlbmd0aCAtIHRoaXMucGF0dGVybi5sZW5ndGgsIHRleHQubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICEuZmlsZSRcblxuY2xhc3MgSW52ZXJzZVN1ZmZpeEV4YWN0TWF0Y2ggZXh0ZW5kcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgc3VwZXIocGF0dGVybik7XG4gIH1cbiAgc3RhdGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnaW52ZXJzZS1zdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIlxcJCQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKVxcJCQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpc01hdGNoID0gIXRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXp6eU1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICAgIHRoaXMuX2JpdGFwU2VhcmNoID0gbmV3IEJpdGFwU2VhcmNoKHBhdHRlcm4sIHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdmdXp6eSdcbiAgfVxuICBzdGF0aWMgZ2V0IG11bHRpUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYml0YXBTZWFyY2guc2VhcmNoSW4odGV4dClcbiAgfVxufVxuXG4vLyBUb2tlbjogJ2ZpbGVcblxuY2xhc3MgSW5jbHVkZU1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2luY2x1ZGUnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXidcIiguKilcIiQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14nKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBsZXQgbG9jYXRpb24gPSAwO1xuICAgIGxldCBpbmRleDtcblxuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuTGVuID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDtcblxuICAgIC8vIEdldCBhbGwgZXhhY3QgbWF0Y2hlc1xuICAgIHdoaWxlICgoaW5kZXggPSB0ZXh0LmluZGV4T2YodGhpcy5wYXR0ZXJuLCBsb2NhdGlvbikpID4gLTEpIHtcbiAgICAgIGxvY2F0aW9uID0gaW5kZXggKyBwYXR0ZXJuTGVuO1xuICAgICAgaW5kaWNlcy5wdXNoKFtpbmRleCwgbG9jYXRpb24gLSAxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9ICEhaW5kaWNlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzXG4gICAgfVxuICB9XG59XG5cbi8vIOKdl09yZGVyIGlzIGltcG9ydGFudC4gRE8gTk9UIENIQU5HRS5cbmNvbnN0IHNlYXJjaGVycyA9IFtcbiAgRXhhY3RNYXRjaCxcbiAgSW5jbHVkZU1hdGNoLFxuICBQcmVmaXhFeGFjdE1hdGNoLFxuICBJbnZlcnNlUHJlZml4RXhhY3RNYXRjaCxcbiAgSW52ZXJzZVN1ZmZpeEV4YWN0TWF0Y2gsXG4gIFN1ZmZpeEV4YWN0TWF0Y2gsXG4gIEludmVyc2VFeGFjdE1hdGNoLFxuICBGdXp6eU1hdGNoXG5dO1xuXG5jb25zdCBzZWFyY2hlcnNMZW4gPSBzZWFyY2hlcnMubGVuZ3RoO1xuXG4vLyBSZWdleCB0byBzcGxpdCBieSBzcGFjZXMsIGJ1dCBrZWVwIGFueXRoaW5nIGluIHF1b3RlcyB0b2dldGhlclxuY29uc3QgU1BBQ0VfUkUgPSAvICsoPz0oPzpbXlxcXCJdKlxcXCJbXlxcXCJdKlxcXCIpKlteXFxcIl0qJCkvO1xuY29uc3QgT1JfVE9LRU4gPSAnfCc7XG5cbi8vIFJldHVybiBhIDJEIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeSwgZm9yIHNpbXBsZXIgcGFyc2luZy5cbi8vIEV4YW1wbGU6XG4vLyBcIl5jb3JlIGdvJCB8IHJiJCB8IHB5JCB4eSRcIiA9PiBbW1wiXmNvcmVcIiwgXCJnbyRcIl0sIFtcInJiJFwiXSwgW1wicHkkXCIsIFwieHkkXCJdXVxuZnVuY3Rpb24gcGFyc2VRdWVyeShwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoT1JfVE9LRU4pLm1hcCgoaXRlbSkgPT4ge1xuICAgIGxldCBxdWVyeSA9IGl0ZW1cbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdChTUEFDRV9SRSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gJiYgISFpdGVtLnRyaW0oKSk7XG5cbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBxdWVyeS5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgY29uc3QgcXVlcnlJdGVtID0gcXVlcnlbaV07XG5cbiAgICAgIC8vIDEuIEhhbmRsZSBtdWx0aXBsZSBxdWVyeSBtYXRjaCAoaS5lLCBvbmNlIHRoYXQgYXJlIHF1b3RlZCwgbGlrZSBgXCJoZWxsbyB3b3JsZFwiYClcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgbGV0IGlkeCA9IC0xO1xuICAgICAgd2hpbGUgKCFmb3VuZCAmJiArK2lkeCA8IHNlYXJjaGVyc0xlbikge1xuICAgICAgICBjb25zdCBzZWFyY2hlciA9IHNlYXJjaGVyc1tpZHhdO1xuICAgICAgICBsZXQgdG9rZW4gPSBzZWFyY2hlci5pc011bHRpTWF0Y2gocXVlcnlJdGVtKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBzZWFyY2hlcih0b2tlbiwgb3B0aW9ucykpO1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSGFuZGxlIHNpbmdsZSBxdWVyeSBtYXRjaGVzIChpLmUsIG9uY2UgdGhhdCBhcmUgKm5vdCogcXVvdGVkKVxuICAgICAgaWR4ID0gLTE7XG4gICAgICB3aGlsZSAoKytpZHggPCBzZWFyY2hlcnNMZW4pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBzZWFyY2hlcnNbaWR4XTtcbiAgICAgICAgbGV0IHRva2VuID0gc2VhcmNoZXIuaXNTaW5nbGVNYXRjaChxdWVyeUl0ZW0pO1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IHNlYXJjaGVyKHRva2VuLCBvcHRpb25zKSk7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzXG4gIH0pXG59XG5cbi8vIFRoZXNlIGV4dGVuZGVkIG1hdGNoZXJzIGNhbiByZXR1cm4gYW4gYXJyYXkgb2YgbWF0Y2hlcywgYXMgb3Bwb3NlZFxuLy8gdG8gYSBzaW5nbCBtYXRjaFxuY29uc3QgTXVsdGlNYXRjaFNldCA9IG5ldyBTZXQoW0Z1enp5TWF0Y2gudHlwZSwgSW5jbHVkZU1hdGNoLnR5cGVdKTtcblxuLyoqXG4gKiBDb21tYW5kLWxpa2Ugc2VhcmNoaW5nXG4gKiA9PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogR2l2ZW4gbXVsdGlwbGUgc2VhcmNoIHRlcm1zIGRlbGltaXRlZCBieSBzcGFjZXMuZS5nLiBgXmpzY3JpcHQgLnB5dGhvbiQgcnVieSAhamF2YWAsXG4gKiBzZWFyY2ggaW4gYSBnaXZlbiB0ZXh0LlxuICpcbiAqIFNlYXJjaCBzeW50YXg6XG4gKlxuICogfCBUb2tlbiAgICAgICB8IE1hdGNoIHR5cGUgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICogfCBganNjcmlwdGAgICB8IGZ1enp5LW1hdGNoICAgICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBmdXp6eSBtYXRjaCBganNjcmlwdGAgICAgICAgfFxuICogfCBgPXNjaGVtZWAgICB8IGV4YWN0LW1hdGNoICAgICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBhcmUgYHNjaGVtZWAgICAgICAgICAgICAgICAgfFxuICogfCBgJ3B5dGhvbmAgICB8IGluY2x1ZGUtbWF0Y2ggICAgICAgICAgICAgIHwgSXRlbXMgdGhhdCBpbmNsdWRlIGBweXRob25gICAgICAgICAgICAgfFxuICogfCBgIXJ1YnlgICAgICB8IGludmVyc2UtZXhhY3QtbWF0Y2ggICAgICAgIHwgSXRlbXMgdGhhdCBkbyBub3QgaW5jbHVkZSBgcnVieWAgICAgICAgfFxuICogfCBgXmphdmFgICAgICB8IHByZWZpeC1leGFjdC1tYXRjaCAgICAgICAgIHwgSXRlbXMgdGhhdCBzdGFydCB3aXRoIGBqYXZhYCAgICAgICAgICAgfFxuICogfCBgIV5lYXJsYW5nYCB8IGludmVyc2UtcHJlZml4LWV4YWN0LW1hdGNoIHwgSXRlbXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgZWFybGFuZ2AgfFxuICogfCBgLmpzJGAgICAgICB8IHN1ZmZpeC1leGFjdC1tYXRjaCAgICAgICAgIHwgSXRlbXMgdGhhdCBlbmQgd2l0aCBgLmpzYCAgICAgICAgICAgICAgfFxuICogfCBgIS5nbyRgICAgICB8IGludmVyc2Utc3VmZml4LWV4YWN0LW1hdGNoIHwgSXRlbXMgdGhhdCBkbyBub3QgZW5kIHdpdGggYC5nb2AgICAgICAgfFxuICpcbiAqIEEgc2luZ2xlIHBpcGUgY2hhcmFjdGVyIGFjdHMgYXMgYW4gT1Igb3BlcmF0b3IuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nXG4gKiBxdWVyeSBtYXRjaGVzIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIGBjb3JlYCBhbmQgZW5kIHdpdGggZWl0aGVyYGdvYCwgYHJiYCxcbiAqIG9yYHB5YC5cbiAqXG4gKiBgYGBcbiAqIF5jb3JlIGdvJCB8IHJiJCB8IHB5JFxuICogYGBgXG4gKi9cbmNsYXNzIEV4dGVuZGVkU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBpc0Nhc2VTZW5zaXRpdmUgPSBDb25maWcuaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaW5jbHVkZU1hdGNoZXMgPSBDb25maWcuaW5jbHVkZU1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaWdub3JlTG9jYXRpb24gPSBDb25maWcuaWdub3JlTG9jYXRpb24sXG4gICAgICBmaW5kQWxsTWF0Y2hlcyA9IENvbmZpZy5maW5kQWxsTWF0Y2hlcyxcbiAgICAgIGxvY2F0aW9uID0gQ29uZmlnLmxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkID0gQ29uZmlnLnRocmVzaG9sZCxcbiAgICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMucXVlcnkgPSBudWxsO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICBpZ25vcmVMb2NhdGlvbixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2VcbiAgICB9O1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcGFyc2VRdWVyeSh0aGlzLnBhdHRlcm4sIHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgY29uZGl0aW9uKF8sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy51c2VFeHRlbmRlZFNlYXJjaFxuICB9XG5cbiAgc2VhcmNoSW4odGV4dCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcblxuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTWF0Y2g6IGZhbHNlLFxuICAgICAgICBzY29yZTogMVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgaW5jbHVkZU1hdGNoZXMsIGlzQ2FzZVNlbnNpdGl2ZSB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdGV4dCA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHRleHQgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICBsZXQgbnVtTWF0Y2hlcyA9IDA7XG4gICAgbGV0IGFsbEluZGljZXMgPSBbXTtcbiAgICBsZXQgdG90YWxTY29yZSA9IDA7XG5cbiAgICAvLyBPUnNcbiAgICBmb3IgKGxldCBpID0gMCwgcUxlbiA9IHF1ZXJ5Lmxlbmd0aDsgaSA8IHFMZW47IGkgKz0gMSkge1xuICAgICAgY29uc3Qgc2VhcmNoZXJzID0gcXVlcnlbaV07XG5cbiAgICAgIC8vIFJlc2V0IGluZGljZXNcbiAgICAgIGFsbEluZGljZXMubGVuZ3RoID0gMDtcbiAgICAgIG51bU1hdGNoZXMgPSAwO1xuXG4gICAgICAvLyBBTkRzXG4gICAgICBmb3IgKGxldCBqID0gMCwgcExlbiA9IHNlYXJjaGVycy5sZW5ndGg7IGogPCBwTGVuOyBqICs9IDEpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBzZWFyY2hlcnNbal07XG4gICAgICAgIGNvbnN0IHsgaXNNYXRjaCwgaW5kaWNlcywgc2NvcmUgfSA9IHNlYXJjaGVyLnNlYXJjaCh0ZXh0KTtcblxuICAgICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICAgIG51bU1hdGNoZXMgKz0gMTtcbiAgICAgICAgICB0b3RhbFNjb3JlICs9IHNjb3JlO1xuICAgICAgICAgIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHNlYXJjaGVyLmNvbnN0cnVjdG9yLnR5cGU7XG4gICAgICAgICAgICBpZiAoTXVsdGlNYXRjaFNldC5oYXModHlwZSkpIHtcbiAgICAgICAgICAgICAgYWxsSW5kaWNlcyA9IFsuLi5hbGxJbmRpY2VzLCAuLi5pbmRpY2VzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFsbEluZGljZXMucHVzaChpbmRpY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG90YWxTY29yZSA9IDA7XG4gICAgICAgICAgbnVtTWF0Y2hlcyA9IDA7XG4gICAgICAgICAgYWxsSW5kaWNlcy5sZW5ndGggPSAwO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT1IgY29uZGl0aW9uLCBzbyBpZiBUUlVFLCByZXR1cm5cbiAgICAgIGlmIChudW1NYXRjaGVzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgaXNNYXRjaDogdHJ1ZSxcbiAgICAgICAgICBzY29yZTogdG90YWxTY29yZSAvIG51bU1hdGNoZXNcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaW5jbHVkZU1hdGNoZXMpIHtcbiAgICAgICAgICByZXN1bHQuaW5kaWNlcyA9IGFsbEluZGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm90aGluZyB3YXMgbWF0Y2hlZFxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoOiBmYWxzZSxcbiAgICAgIHNjb3JlOiAxXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHJlZ2lzdGVyZWRTZWFyY2hlcnMgPSBbXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXIoLi4uYXJncykge1xuICByZWdpc3RlcmVkU2VhcmNoZXJzLnB1c2goLi4uYXJncyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlYXJjaGVyKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlZ2lzdGVyZWRTZWFyY2hlcnMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICBsZXQgc2VhcmNoZXJDbGFzcyA9IHJlZ2lzdGVyZWRTZWFyY2hlcnNbaV07XG4gICAgaWYgKHNlYXJjaGVyQ2xhc3MuY29uZGl0aW9uKHBhdHRlcm4sIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbmV3IHNlYXJjaGVyQ2xhc3MocGF0dGVybiwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IEJpdGFwU2VhcmNoKHBhdHRlcm4sIG9wdGlvbnMpXG59XG5cbmNvbnN0IExvZ2ljYWxPcGVyYXRvciA9IHtcbiAgQU5EOiAnJGFuZCcsXG4gIE9SOiAnJG9yJ1xufTtcblxuY29uc3QgS2V5VHlwZSA9IHtcbiAgUEFUSDogJyRwYXRoJyxcbiAgUEFUVEVSTjogJyR2YWwnXG59O1xuXG5jb25zdCBpc0V4cHJlc3Npb24gPSAocXVlcnkpID0+XG4gICEhKHF1ZXJ5W0xvZ2ljYWxPcGVyYXRvci5BTkRdIHx8IHF1ZXJ5W0xvZ2ljYWxPcGVyYXRvci5PUl0pO1xuXG5jb25zdCBpc1BhdGggPSAocXVlcnkpID0+ICEhcXVlcnlbS2V5VHlwZS5QQVRIXTtcblxuY29uc3QgaXNMZWFmID0gKHF1ZXJ5KSA9PlxuICAhaXNBcnJheShxdWVyeSkgJiYgaXNPYmplY3QocXVlcnkpICYmICFpc0V4cHJlc3Npb24ocXVlcnkpO1xuXG5jb25zdCBjb252ZXJ0VG9FeHBsaWNpdCA9IChxdWVyeSkgPT4gKHtcbiAgW0xvZ2ljYWxPcGVyYXRvci5BTkRdOiBPYmplY3Qua2V5cyhxdWVyeSkubWFwKChrZXkpID0+ICh7XG4gICAgW2tleV06IHF1ZXJ5W2tleV1cbiAgfSkpXG59KTtcblxuLy8gV2hlbiBgYXV0b2AgaXMgYHRydWVgLCB0aGUgcGFyc2UgZnVuY3Rpb24gd2lsbCBpbmZlciBhbmQgaW5pdGlhbGl6ZSBhbmQgYWRkXG4vLyB0aGUgYXBwcm9wcmlhdGUgYFNlYXJjaGVyYCBpbnN0YW5jZVxuZnVuY3Rpb24gcGFyc2UocXVlcnksIG9wdGlvbnMsIHsgYXV0byA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IG5leHQgPSAocXVlcnkpID0+IHtcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5KTtcblxuICAgIGNvbnN0IGlzUXVlcnlQYXRoID0gaXNQYXRoKHF1ZXJ5KTtcblxuICAgIGlmICghaXNRdWVyeVBhdGggJiYga2V5cy5sZW5ndGggPiAxICYmICFpc0V4cHJlc3Npb24ocXVlcnkpKSB7XG4gICAgICByZXR1cm4gbmV4dChjb252ZXJ0VG9FeHBsaWNpdChxdWVyeSkpXG4gICAgfVxuXG4gICAgaWYgKGlzTGVhZihxdWVyeSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGlzUXVlcnlQYXRoID8gcXVlcnlbS2V5VHlwZS5QQVRIXSA6IGtleXNbMF07XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc1F1ZXJ5UGF0aCA/IHF1ZXJ5W0tleVR5cGUuUEFUVEVSTl0gOiBxdWVyeVtrZXldO1xuXG4gICAgICBpZiAoIWlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihMT0dJQ0FMX1NFQVJDSF9JTlZBTElEX1FVRVJZX0ZPUl9LRVkoa2V5KSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBrZXlJZDogY3JlYXRlS2V5SWQoa2V5KSxcbiAgICAgICAgcGF0dGVyblxuICAgICAgfTtcblxuICAgICAgaWYgKGF1dG8pIHtcbiAgICAgICAgb2JqLnNlYXJjaGVyID0gY3JlYXRlU2VhcmNoZXIocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBsZXQgbm9kZSA9IHtcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIG9wZXJhdG9yOiBrZXlzWzBdXG4gICAgfTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHF1ZXJ5W2tleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKG5leHQoaXRlbSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgaWYgKCFpc0V4cHJlc3Npb24ocXVlcnkpKSB7XG4gICAgcXVlcnkgPSBjb252ZXJ0VG9FeHBsaWNpdChxdWVyeSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChxdWVyeSlcbn1cblxuLy8gUHJhY3RpY2FsIHNjb3JpbmcgZnVuY3Rpb25cbmZ1bmN0aW9uIGNvbXB1dGVTY29yZShcbiAgcmVzdWx0cyxcbiAgeyBpZ25vcmVGaWVsZE5vcm0gPSBDb25maWcuaWdub3JlRmllbGROb3JtIH1cbikge1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGxldCB0b3RhbFNjb3JlID0gMTtcblxuICAgIHJlc3VsdC5tYXRjaGVzLmZvckVhY2goKHsga2V5LCBub3JtLCBzY29yZSB9KSA9PiB7XG4gICAgICBjb25zdCB3ZWlnaHQgPSBrZXkgPyBrZXkud2VpZ2h0IDogbnVsbDtcblxuICAgICAgdG90YWxTY29yZSAqPSBNYXRoLnBvdyhcbiAgICAgICAgc2NvcmUgPT09IDAgJiYgd2VpZ2h0ID8gTnVtYmVyLkVQU0lMT04gOiBzY29yZSxcbiAgICAgICAgKHdlaWdodCB8fCAxKSAqIChpZ25vcmVGaWVsZE5vcm0gPyAxIDogbm9ybSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuc2NvcmUgPSB0b3RhbFNjb3JlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTWF0Y2hlcyhyZXN1bHQsIGRhdGEpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHJlc3VsdC5tYXRjaGVzO1xuICBkYXRhLm1hdGNoZXMgPSBbXTtcblxuICBpZiAoIWlzRGVmaW5lZChtYXRjaGVzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgIGlmICghaXNEZWZpbmVkKG1hdGNoLmluZGljZXMpIHx8ICFtYXRjaC5pbmRpY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBpbmRpY2VzLCB2YWx1ZSB9ID0gbWF0Y2g7XG5cbiAgICBsZXQgb2JqID0ge1xuICAgICAgaW5kaWNlcyxcbiAgICAgIHZhbHVlXG4gICAgfTtcblxuICAgIGlmIChtYXRjaC5rZXkpIHtcbiAgICAgIG9iai5rZXkgPSBtYXRjaC5rZXkuc3JjO1xuICAgIH1cblxuICAgIGlmIChtYXRjaC5pZHggPiAtMSkge1xuICAgICAgb2JqLnJlZkluZGV4ID0gbWF0Y2guaWR4O1xuICAgIH1cblxuICAgIGRhdGEubWF0Y2hlcy5wdXNoKG9iaik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TY29yZShyZXN1bHQsIGRhdGEpIHtcbiAgZGF0YS5zY29yZSA9IHJlc3VsdC5zY29yZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0KFxuICByZXN1bHRzLFxuICBkb2NzLFxuICB7XG4gICAgaW5jbHVkZU1hdGNoZXMgPSBDb25maWcuaW5jbHVkZU1hdGNoZXMsXG4gICAgaW5jbHVkZVNjb3JlID0gQ29uZmlnLmluY2x1ZGVTY29yZVxuICB9ID0ge31cbikge1xuICBjb25zdCB0cmFuc2Zvcm1lcnMgPSBbXTtcblxuICBpZiAoaW5jbHVkZU1hdGNoZXMpIHRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybU1hdGNoZXMpO1xuICBpZiAoaW5jbHVkZVNjb3JlKSB0cmFuc2Zvcm1lcnMucHVzaCh0cmFuc2Zvcm1TY29yZSk7XG5cbiAgcmV0dXJuIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHtcbiAgICBjb25zdCB7IGlkeCB9ID0gcmVzdWx0O1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGl0ZW06IGRvY3NbaWR4XSxcbiAgICAgIHJlZkluZGV4OiBpZHhcbiAgICB9O1xuXG4gICAgaWYgKHRyYW5zZm9ybWVycy5sZW5ndGgpIHtcbiAgICAgIHRyYW5zZm9ybWVycy5mb3JFYWNoKCh0cmFuc2Zvcm1lcikgPT4ge1xuICAgICAgICB0cmFuc2Zvcm1lcihyZXN1bHQsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfSlcbn1cblxuY2xhc3MgRnVzZSB7XG4gIGNvbnN0cnVjdG9yKGRvY3MsIG9wdGlvbnMgPSB7fSwgaW5kZXgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLkNvbmZpZywgLi4ub3B0aW9ucyB9O1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLnVzZUV4dGVuZGVkU2VhcmNoICYmXG4gICAgICAhdHJ1ZVxuICAgICkge31cblxuICAgIHRoaXMuX2tleVN0b3JlID0gbmV3IEtleVN0b3JlKHRoaXMub3B0aW9ucy5rZXlzKTtcblxuICAgIHRoaXMuc2V0Q29sbGVjdGlvbihkb2NzLCBpbmRleCk7XG4gIH1cblxuICBzZXRDb2xsZWN0aW9uKGRvY3MsIGluZGV4KSB7XG4gICAgdGhpcy5fZG9jcyA9IGRvY3M7XG5cbiAgICBpZiAoaW5kZXggJiYgIShpbmRleCBpbnN0YW5jZW9mIEZ1c2VJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihJTkNPUlJFQ1RfSU5ERVhfVFlQRSlcbiAgICB9XG5cbiAgICB0aGlzLl9teUluZGV4ID1cbiAgICAgIGluZGV4IHx8XG4gICAgICBjcmVhdGVJbmRleCh0aGlzLm9wdGlvbnMua2V5cywgdGhpcy5fZG9jcywge1xuICAgICAgICBnZXRGbjogdGhpcy5vcHRpb25zLmdldEZuLFxuICAgICAgICBmaWVsZE5vcm1XZWlnaHQ6IHRoaXMub3B0aW9ucy5maWVsZE5vcm1XZWlnaHRcbiAgICAgIH0pO1xuICB9XG5cbiAgYWRkKGRvYykge1xuICAgIGlmICghaXNEZWZpbmVkKGRvYykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2RvY3MucHVzaChkb2MpO1xuICAgIHRoaXMuX215SW5kZXguYWRkKGRvYyk7XG4gIH1cblxuICByZW1vdmUocHJlZGljYXRlID0gKC8qIGRvYywgaWR4ICovKSA9PiBmYWxzZSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9kb2NzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBjb25zdCBkb2MgPSB0aGlzLl9kb2NzW2ldO1xuICAgICAgaWYgKHByZWRpY2F0ZShkb2MsIGkpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXQoaSk7XG4gICAgICAgIGkgLT0gMTtcbiAgICAgICAgbGVuIC09IDE7XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKGRvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIHJlbW92ZUF0KGlkeCkge1xuICAgIHRoaXMuX2RvY3Muc3BsaWNlKGlkeCwgMSk7XG4gICAgdGhpcy5fbXlJbmRleC5yZW1vdmVBdChpZHgpO1xuICB9XG5cbiAgZ2V0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX215SW5kZXhcbiAgfVxuXG4gIHNlYXJjaChxdWVyeSwgeyBsaW1pdCA9IC0xIH0gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGluY2x1ZGVNYXRjaGVzLFxuICAgICAgaW5jbHVkZVNjb3JlLFxuICAgICAgc2hvdWxkU29ydCxcbiAgICAgIHNvcnRGbixcbiAgICAgIGlnbm9yZUZpZWxkTm9ybVxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBsZXQgcmVzdWx0cyA9IGlzU3RyaW5nKHF1ZXJ5KVxuICAgICAgPyBpc1N0cmluZyh0aGlzLl9kb2NzWzBdKVxuICAgICAgICA/IHRoaXMuX3NlYXJjaFN0cmluZ0xpc3QocXVlcnkpXG4gICAgICAgIDogdGhpcy5fc2VhcmNoT2JqZWN0TGlzdChxdWVyeSlcbiAgICAgIDogdGhpcy5fc2VhcmNoTG9naWNhbChxdWVyeSk7XG5cbiAgICBjb21wdXRlU2NvcmUocmVzdWx0cywgeyBpZ25vcmVGaWVsZE5vcm0gfSk7XG5cbiAgICBpZiAoc2hvdWxkU29ydCkge1xuICAgICAgcmVzdWx0cy5zb3J0KHNvcnRGbik7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKGxpbWl0KSAmJiBsaW1pdCA+IC0xKSB7XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdChyZXN1bHRzLCB0aGlzLl9kb2NzLCB7XG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGluY2x1ZGVTY29yZVxuICAgIH0pXG4gIH1cblxuICBfc2VhcmNoU3RyaW5nTGlzdChxdWVyeSkge1xuICAgIGNvbnN0IHNlYXJjaGVyID0gY3JlYXRlU2VhcmNoZXIocXVlcnksIHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgeyByZWNvcmRzIH0gPSB0aGlzLl9teUluZGV4O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBldmVyeSBzdHJpbmcgaW4gdGhlIGluZGV4XG4gICAgcmVjb3Jkcy5mb3JFYWNoKCh7IHY6IHRleHQsIGk6IGlkeCwgbjogbm9ybSB9KSA9PiB7XG4gICAgICBpZiAoIWlzRGVmaW5lZCh0ZXh0KSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBpc01hdGNoLCBzY29yZSwgaW5kaWNlcyB9ID0gc2VhcmNoZXIuc2VhcmNoSW4odGV4dCk7XG5cbiAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgaXRlbTogdGV4dCxcbiAgICAgICAgICBpZHgsXG4gICAgICAgICAgbWF0Y2hlczogW3sgc2NvcmUsIHZhbHVlOiB0ZXh0LCBub3JtLCBpbmRpY2VzIH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIF9zZWFyY2hMb2dpY2FsKHF1ZXJ5KSB7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gcGFyc2UocXVlcnksIHRoaXMub3B0aW9ucyk7XG5cbiAgICBjb25zdCBldmFsdWF0ZSA9IChub2RlLCBpdGVtLCBpZHgpID0+IHtcbiAgICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCB7IGtleUlkLCBzZWFyY2hlciB9ID0gbm9kZTtcblxuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5fZmluZE1hdGNoZXMoe1xuICAgICAgICAgIGtleTogdGhpcy5fa2V5U3RvcmUuZ2V0KGtleUlkKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fbXlJbmRleC5nZXRWYWx1ZUZvckl0ZW1BdEtleUlkKGl0ZW0sIGtleUlkKSxcbiAgICAgICAgICBzZWFyY2hlclxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXZhbHVhdGUoY2hpbGQsIGl0ZW0sIGlkeCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzLnB1c2goLi4ucmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm9wZXJhdG9yID09PSBMb2dpY2FsT3BlcmF0b3IuQU5EKSB7XG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9O1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IHRoaXMuX215SW5kZXgucmVjb3JkcztcbiAgICBjb25zdCByZXN1bHRNYXAgPSB7fTtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICByZWNvcmRzLmZvckVhY2goKHsgJDogaXRlbSwgaTogaWR4IH0pID0+IHtcbiAgICAgIGlmIChpc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgICAgbGV0IGV4cFJlc3VsdHMgPSBldmFsdWF0ZShleHByZXNzaW9uLCBpdGVtLCBpZHgpO1xuXG4gICAgICAgIGlmIChleHBSZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIERlZHVwZSB3aGVuIGFkZGluZ1xuICAgICAgICAgIGlmICghcmVzdWx0TWFwW2lkeF0pIHtcbiAgICAgICAgICAgIHJlc3VsdE1hcFtpZHhdID0geyBpZHgsIGl0ZW0sIG1hdGNoZXM6IFtdIH07XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0TWFwW2lkeF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleHBSZXN1bHRzLmZvckVhY2goKHsgbWF0Y2hlcyB9KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRNYXBbaWR4XS5tYXRjaGVzLnB1c2goLi4ubWF0Y2hlcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICBfc2VhcmNoT2JqZWN0TGlzdChxdWVyeSkge1xuICAgIGNvbnN0IHNlYXJjaGVyID0gY3JlYXRlU2VhcmNoZXIocXVlcnksIHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgeyBrZXlzLCByZWNvcmRzIH0gPSB0aGlzLl9teUluZGV4O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgIC8vIExpc3QgaXMgQXJyYXk8T2JqZWN0PlxuICAgIHJlY29yZHMuZm9yRWFjaCgoeyAkOiBpdGVtLCBpOiBpZHggfSkgPT4ge1xuICAgICAgaWYgKCFpc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBtYXRjaGVzID0gW107XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBldmVyeSBrZXkgKGkuZSwgcGF0aCksIGFuZCBmZXRjaCB0aGUgdmFsdWUgYXQgdGhhdCBrZXlcbiAgICAgIGtleXMuZm9yRWFjaCgoa2V5LCBrZXlJbmRleCkgPT4ge1xuICAgICAgICBtYXRjaGVzLnB1c2goXG4gICAgICAgICAgLi4udGhpcy5fZmluZE1hdGNoZXMoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW1ba2V5SW5kZXhdLFxuICAgICAgICAgICAgc2VhcmNoZXJcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGlkeCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIF9maW5kTWF0Y2hlcyh7IGtleSwgdmFsdWUsIHNlYXJjaGVyIH0pIHtcbiAgICBpZiAoIWlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGxldCBtYXRjaGVzID0gW107XG5cbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goKHsgdjogdGV4dCwgaTogaWR4LCBuOiBub3JtIH0pID0+IHtcbiAgICAgICAgaWYgKCFpc0RlZmluZWQodGV4dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgaXNNYXRjaCwgc2NvcmUsIGluZGljZXMgfSA9IHNlYXJjaGVyLnNlYXJjaEluKHRleHQpO1xuXG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3JlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRleHQsXG4gICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICBub3JtLFxuICAgICAgICAgICAgaW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyB2OiB0ZXh0LCBuOiBub3JtIH0gPSB2YWx1ZTtcblxuICAgICAgY29uc3QgeyBpc01hdGNoLCBzY29yZSwgaW5kaWNlcyB9ID0gc2VhcmNoZXIuc2VhcmNoSW4odGV4dCk7XG5cbiAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgIG1hdGNoZXMucHVzaCh7IHNjb3JlLCBrZXksIHZhbHVlOiB0ZXh0LCBub3JtLCBpbmRpY2VzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzXG4gIH1cbn1cblxuRnVzZS52ZXJzaW9uID0gJzYuNi4yJztcbkZ1c2UuY3JlYXRlSW5kZXggPSBjcmVhdGVJbmRleDtcbkZ1c2UucGFyc2VJbmRleCA9IHBhcnNlSW5kZXg7XG5GdXNlLmNvbmZpZyA9IENvbmZpZztcblxue1xuICBGdXNlLnBhcnNlUXVlcnkgPSBwYXJzZTtcbn1cblxue1xuICByZWdpc3RlcihFeHRlbmRlZFNlYXJjaCk7XG59XG5cblxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvZmlsdGVyL3V0aWxzLmpzXG5cbmZ1bmN0aW9uIGdldERpc3RhbmNlRnJvbUxhdExvbkluS20oY29vcmRzRnJvbSwgY29vcmRzVG8pIHtcbiAgY29uc3QgW2xhdDEsIGxvbjEsIGRpc3RhbmNlXSA9IGNvb3Jkc0Zyb20uc3BsaXQoJzonKTtcbiAgY29uc3QgW2xhdDIsIGxvbjJdID0gY29vcmRzVG8uc3BsaXQoJzonKTtcbiAgY29uc3QgUiA9IDYzNzE7IC8vIFJhZGl1cyBvZiB0aGUgZWFydGggaW4ga21cbiAgY29uc3QgZExhdCA9IGRlZzJyYWQobGF0MiAtIGxhdDEpOyAvLyBkZWcycmFkIGJlbG93XG4gIGNvbnN0IGRMb24gPSBkZWcycmFkKGxvbjIgLSBsb24xKTtcbiAgY29uc3QgYSA9IE1hdGguc2luKGRMYXQgLyAyKSAqIE1hdGguc2luKGRMYXQgLyAyKSArIE1hdGguY29zKGRlZzJyYWQobGF0MSkpICogTWF0aC5jb3MoZGVnMnJhZChsYXQyKSkgKiBNYXRoLnNpbihkTG9uIC8gMikgKiBNYXRoLnNpbihkTG9uIC8gMik7XG4gIGNvbnN0IGMgPSAyICogTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksIE1hdGguc3FydCgxIC0gYSkpO1xuICBjb25zdCBkaXN0YW5jZUJldHdlZW4gPSBSICogYzsgLy8gRGlzdGFuY2UgaW4ga21cblxuICByZXR1cm4gTnVtYmVyKGRpc3RhbmNlKSA+PSBkaXN0YW5jZUJldHdlZW47XG59XG5mdW5jdGlvbiBkZWcycmFkKGRlZykge1xuICByZXR1cm4gZGVnICogKE1hdGguUEkgLyAxODApO1xufVxuZnVuY3Rpb24gZ2V0RGF0ZSh7XG4gIHR5cGUsXG4gIGRhdGUgPSAwLFxuICBtYXRjaCA9IHRydWVcbn0gPSB7fSwgaXRlbVRpbWUpIHtcbiAgaWYgKCFpdGVtVGltZSAmJiB0eXBlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSgpO1xuICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImRheVwiOlxuICAgICAgY29uc3QgZmlsdGVyRGF5U3RhcnQgPSBnZXREYXRlSW5NcyhkYXRlKTtcbiAgICAgIGNvbnN0IGZpbHRlckRheUVuZCA9IGdldERhdGVJbk1zKGRhdGUgKyAxKTtcbiAgICAgIHJlc3VsdCA9IGZpbHRlckRheVN0YXJ0IDw9IGl0ZW1UaW1lICYmIGl0ZW1UaW1lIDwgZmlsdGVyRGF5RW5kO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRheXNcIjpcbiAgICAgIGlmIChkYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF5RW5kID0gZ2V0RGF0ZUluTXMoMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFzdDdEYXlzID0gZ2V0RGF0ZUluTXMoLTYpO1xuICAgICAgICByZXN1bHQgPSBzdGFydFBhc3Q3RGF5cyA8PSBpdGVtVGltZSAmJiBpdGVtVGltZSA8IGN1cnJlbnREYXlFbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF5ID0gZ2V0RGF0ZUluTXMoKTtcbiAgICAgICAgY29uc3Qgc3RhcnROZXh0N0RheXMgPSBnZXREYXRlSW5Ncyg3KTtcbiAgICAgICAgcmVzdWx0ID0gY3VycmVudERheSA8PSBpdGVtVGltZSAmJiBpdGVtVGltZSA8IHN0YXJ0TmV4dDdEYXlzO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRheV93ZWVrXCI6XG4gICAgICByZXN1bHQgPSBkYXRlID09PSBuZXcgRGF0ZShpdGVtVGltZSkuZ2V0RGF5KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vla1wiOlxuICAgICAgY29uc3Qgd2Vla1N0YXJ0ID0gbmV3RGF0ZS5nZXREYXRlKCkgLSBuZXdEYXRlLmdldERheSgpO1xuICAgICAgY29uc3QgZGF5c1RvRW5kID0gZGF0ZSA9PSAtMiA/IDEzIDogNjtcbiAgICAgIGNvbnN0IHdlZWtFbmQgPSB3ZWVrU3RhcnQgKyBkYXlzVG9FbmQ7XG4gICAgICBjb25zdCB3ZWVrRGF5U3RhcnQgPSBuZXdEYXRlLnNldERhdGUod2Vla1N0YXJ0ICsgZGF0ZSAqIDcpO1xuICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3Qgd2Vla0RheUVuZCA9IGN1cnJlbnREYXRlLnNldERhdGUod2Vla0VuZCArIGRhdGUgKiA3KTtcbiAgICAgIGNvbnN0IFtzdW5kYXksIHNhdHVyZGF5XSA9IGdldFdlZWsod2Vla0RheVN0YXJ0LCB3ZWVrRGF5RW5kKTtcbiAgICAgIHJlc3VsdCA9IHN1bmRheSA8PSBpdGVtVGltZSAmJiBpdGVtVGltZSA8PSBzYXR1cmRheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgaWYgKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSAhPT0gbmV3IERhdGUoaXRlbVRpbWUpLmdldEZ1bGxZZWFyKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpICsgZGF0ZTtcbiAgICAgIHJlc3VsdCA9IG1vbnRoID09PSBuZXcgRGF0ZShpdGVtVGltZSkuZ2V0TW9udGgoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ5ZWFyXCI6XG4gICAgICBjb25zdCB5ZWFyID0gbmV3RGF0ZS5nZXRGdWxsWWVhcigpICsgZGF0ZTtcbiAgICAgIHJlc3VsdCA9IHllYXIgPT09IG5ldyBEYXRlKGl0ZW1UaW1lKS5nZXRGdWxsWWVhcigpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBtYXRjaCA/IHJlc3VsdCA6ICFyZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRXZWVrKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIFtuZXcgRGF0ZShzdGFydCksIG5ldyBEYXRlKGVuZCldO1xufVxuZnVuY3Rpb24gZ2V0RGF0ZUluTXMoZGF0ZSA9IDApIHtcbiAgY29uc3QgY3VycmVudERheSA9IG5ldyBEYXRlKCk7XG4gIHJldHVybiBuZXcgRGF0ZShjdXJyZW50RGF5LmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXkuZ2V0TW9udGgoKSwgY3VycmVudERheS5nZXREYXRlKCkgKyBkYXRlKS52YWx1ZU9mKCk7XG59XG5mdW5jdGlvbiBzZWFyY2hWYWx1ZShpdGVtcywgZmlsdGVyKSB7XG4gIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkgcmV0dXJuO1xuICBpZiAoZmlsdGVyKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQuaW5kZXhfdmFsdWUgJiYgZmllbGQuaW5kZXhfdmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlci50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpKTtcbiAgfVxuICByZXR1cm4gaXRlbXM7XG59XG5jb25zdCBmdXNlID0gbmV3IEZ1c2UoW10pO1xuZnVuY3Rpb24gaXNTaW1pbGFyU3RyaW5ncyhzdHIxLCBzdHJBcnJheSkge1xuICBmdXNlLnNldENvbGxlY3Rpb24oc3RyQXJyYXkpO1xuICByZXR1cm4gQm9vbGVhbihmdXNlLnNlYXJjaChzdHIxKS5sZW5ndGgpO1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL2ZpbHRlci9maWx0ZXIuanNcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBmdW5jdGlvbiBmaWx0ZXIoaXRlbXMsIGZpbHRlcnMpIHtcbiAgY29uc3QgaXRlbXNGaWx0ZXIgPSBuZXcgSXRlbXNGaWx0ZXIoKTtcbiAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBpdGVtc0ZpbHRlci5maWx0ZXIoZmlsdGVycywgaXRlbXMpO1xufVxuY2xhc3MgQ2hlY2tlciB7XG4gIGNoYW5nZUJlaGF2aW9yKGNoZWNrT3B0aW9uKSB7XG4gICAgc3dpdGNoIChjaGVja09wdGlvbikge1xuICAgICAgY2FzZSBcImNvbnRhaW5fb3JcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuc29tZShfZGF0YUl0ZW0gPT4gX2RhdGFJdGVtLmluZGV4T2YoX2ZpbHRlcikgIT09IC0xKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImNvbnRhaW5fYW5kXCI6XG4gICAgICAgIHRoaXMuX2NoZWNrRm4gPSBmdW5jdGlvbiAoZGF0YSwgZmlsdGVyc1ZhbHVlcykge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJzVmFsdWVzLmV2ZXJ5KF9maWx0ZXIgPT4gZGF0YS5zb21lKF9kYXRhSXRlbSA9PiBfZGF0YUl0ZW0uaW5kZXhPZihfZmlsdGVyKSAhPT0gLTEpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibm90X2NvbnRhaW5fb3JcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuZXZlcnkoX2RhdGFJdGVtID0+IF9kYXRhSXRlbS5pbmRleE9mKF9maWx0ZXIpID09PSAtMSkpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJub3RfY29udGFpbl9hbmRcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuZXZlcnkoX2ZpbHRlciA9PiBkYXRhLmV2ZXJ5KF9kYXRhSXRlbSA9PiBfZGF0YUl0ZW0uaW5kZXhPZihfZmlsdGVyKSA9PT0gLTEpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZXF1YWxfb3JcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBkYXRhLnNvbWUoX2RhdGFJdGVtID0+IGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IF9kYXRhSXRlbSA9PSBfZmlsdGVyKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImVxdWFsX2FuZFwiOlxuICAgICAgICB0aGlzLl9jaGVja0ZuID0gZnVuY3Rpb24gKGRhdGEsIGZpbHRlcnNWYWx1ZXMpIHtcbiAgICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgbGV0IGZpbHRlcnNWYWx1ZXNTZXQgPSBuZXcgU2V0KGZpbHRlcnNWYWx1ZXMpO1xuICAgICAgICAgIHdoaWxlIChkYXRhLmxlbmd0aCAmJiBmaWx0ZXJzVmFsdWVzU2V0LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBkYXRhVmFsdWUgPSBkYXRhLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGZpbHRlcnNWYWx1ZXNTZXQuaGFzKGRhdGFWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVyc1ZhbHVlc1NldC5kZWxldGUoZGF0YVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICFmaWx0ZXJzVmFsdWVzU2V0LnNpemU7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm5vdF9lcXVhbF9vclwiOlxuICAgICAgICB0aGlzLl9jaGVja0ZuID0gZnVuY3Rpb24gKGRhdGEsIGZpbHRlcnNWYWx1ZXMpIHtcbiAgICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBsZXQgZmlsdGVyc1ZhbHVlc1NldCA9IG5ldyBTZXQoZmlsdGVyc1ZhbHVlcyk7XG4gICAgICAgICAgd2hpbGUgKGRhdGEubGVuZ3RoICYmIGZpbHRlcnNWYWx1ZXNTZXQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZSA9IGRhdGEucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlcnNWYWx1ZXNTZXQuaGFzKGRhdGFWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibm90X2VxdWFsX2FuZFwiOlxuICAgICAgICB0aGlzLl9jaGVja0ZuID0gZnVuY3Rpb24gKGRhdGEsIGZpbHRlcnNWYWx1ZXMpIHtcbiAgICAgICAgICBsZXQgZmlsdGVyc1ZhbHVlc1NldCA9IG5ldyBTZXQoZmlsdGVyc1ZhbHVlcyk7XG4gICAgICAgICAgd2hpbGUgKGRhdGEubGVuZ3RoICYmIGZpbHRlcnNWYWx1ZXNTZXQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZSA9IGRhdGEucG9wKCk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyc1ZhbHVlc1NldC5oYXMoZGF0YVZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJiaWdnZXJcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuZXZlcnkoX2RhdGFJdGVtID0+IF9kYXRhSXRlbSA+IF9maWx0ZXIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibG93ZXJcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuZXZlcnkoX2RhdGFJdGVtID0+IF9kYXRhSXRlbSA8IF9maWx0ZXIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmFuZ2VcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuZXZlcnkoX2RhdGFJdGVtID0+IF9maWx0ZXIuc3RhcnQgPD0gX2RhdGFJdGVtICYmIF9kYXRhSXRlbSA8IF9maWx0ZXIuZW5kKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgIHRoaXMuX2NoZWNrRm4gPSBmdW5jdGlvbiAoZGF0YSwgZmlsdGVyc1ZhbHVlcykge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJzVmFsdWVzLnNvbWUoX2ZpbHRlciA9PiBkYXRhLnNvbWUoX2RhdGFJdGVtID0+IF9kYXRhSXRlbSA9PSBfZmlsdGVyKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGlzU2ltaWxhclN0cmluZ3MoX2ZpbHRlciwgZGF0YSkpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwaG9uZV9lcXVhbF9vclwiOlxuICAgICAgICB0aGlzLl9jaGVja0ZuID0gZnVuY3Rpb24gKGRhdGEsIGZpbHRlcnNWYWx1ZXMpIHtcbiAgICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuc29tZShfZGF0YUl0ZW0gPT4gX2RhdGFJdGVtLnJlcGxhY2UoL1teMC05XS9nLCBcIlwiKS5pbmRleE9mKF9maWx0ZXIucmVwbGFjZSgvW14wLTldL2csIFwiXCIpKSAhPT0gLTEpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkaXN0YW5jZSc6XG4gICAgICAgIHRoaXMuX2NoZWNrRm4gPSBmdW5jdGlvbiAoZGF0YSwgZmlsdGVyc1ZhbHVlcykge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJzVmFsdWVzLnNvbWUoX2ZpbHRlciA9PiBkYXRhLnNvbWUoX2RhdGFJdGVtID0+IGdldERpc3RhbmNlRnJvbUxhdExvbkluS20oX2ZpbHRlciwgX2RhdGFJdGVtKSkpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkYXRlX2luXCI6XG4gICAgICBjYXNlIFwiZGF0ZV9vdXRcIjpcbiAgICAgICAgdGhpcy5fY2hlY2tGbiA9IGZ1bmN0aW9uIChkYXRhLCBmaWx0ZXJzVmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcnNWYWx1ZXMuc29tZShfZmlsdGVyID0+IGRhdGEuc29tZShfZGF0YUl0ZW0gPT4gZ2V0RGF0ZShfZmlsdGVyLCBfZGF0YUl0ZW0pKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlY3VycmluZ19kYXRlXCI6XG4gICAgICAgIHRoaXMuX2NoZWNrRm4gPSBmdW5jdGlvbiAoZGF0YSwgZmlsdGVyc1ZhbHVlcykge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJzVmFsdWVzLnNvbWUoX2ZpbHRlciA9PiBkYXRhLnNvbWUoX2RhdGFJdGVtID0+IGd1ZGh1Yi5jaGVja1JlY3VycmluZ0RhdGUoX2RhdGFJdGVtLCBfZmlsdGVyKSkpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY2hlY2soYWdncmVnYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlQmVoYXZpb3IoYWdncmVnYXRlLmdldENoZWNrT3B0aW9uKCkpLl9jaGVja0ZuKGFnZ3JlZ2F0ZS5nZXRFbnRpdHkoKSwgYWdncmVnYXRlLmdldEZpbHRlclZhbHVlcygpKTtcbiAgfVxufVxuY2xhc3MgTnVtYmVyRmV0Y2hTdHJhdGVneSB7XG4gIGNvbnZlcnQodmFsKSB7XG4gICAgcmV0dXJuIFtOdW1iZXIodmFsKV07XG4gIH1cbiAgY29udmVydEZpbHRlclZhbHVlKHZhbCkge1xuICAgIHJldHVybiBOdW1iZXIodmFsKTtcbiAgfVxufVxuY2xhc3MgUmFuZ2VGZXRjaFN0cmF0ZWd5IGV4dGVuZHMgTnVtYmVyRmV0Y2hTdHJhdGVneSB7XG4gIGNvbnZlcnRGaWx0ZXJWYWx1ZSh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IE51bWJlcih2YWwuc3BsaXQoXCI6XCIpWzBdKSxcbiAgICAgIGVuZDogTnVtYmVyKHZhbC5zcGxpdChcIjpcIilbMV0pXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgU3RyaW5nRmV0Y2hTdHJhdGVneSB7XG4gIGNvbnZlcnQodmFsKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwgIT0gbnVsbCA/IHZhbCA6IFwiXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIsXCIpO1xuICB9XG4gIGNvbnZlcnRGaWx0ZXJWYWx1ZSh2YWwpIHtcbiAgICBpZiAodmFsID09PSAwKSByZXR1cm4gXCIwXCI7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgfVxufVxuY2xhc3MgZGF0ZUZldGNoU3RyYXRlZ3kgZXh0ZW5kcyBOdW1iZXJGZXRjaFN0cmF0ZWd5IHtcbiAgY29udmVydEZpbHRlclZhbHVlKHZhbCkge1xuICAgIGNvbnN0IFt0eXBlLCBkYXRlLCBtYXRjaF0gPSB2YWwuc3BsaXQoXCI6XCIpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlLFxuICAgICAgZGF0ZTogTnVtYmVyKGRhdGUpLFxuICAgICAgbWF0Y2g6ICEhTnVtYmVyKG1hdGNoKVxuICAgIH07XG4gIH1cbn1cbmNsYXNzIEJvb2xlYW5GZXRjaFN0cmF0ZWd5IHtcbiAgY29udmVydCh2YWwpIHtcbiAgICByZXR1cm4gW1N0cmluZyhCb29sZWFuKHZhbCkpXTtcbiAgfVxuICBjb252ZXJ0RmlsdGVyVmFsdWUodmFsKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9XG59XG5jbGFzcyBSZWN1cnJpbmdEYXRlU3RyYXRlZ3kge1xuICBjb252ZXJ0KHZhbCkge1xuICAgIHJldHVybiBbTnVtYmVyKHZhbCldO1xuICB9XG4gIGNvbnZlcnRGaWx0ZXJWYWx1ZSh2YWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gIH1cbn1cbmNsYXNzIEFnZ3JlZ2F0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3N0cmF0ZWdpZXMgPSB7XG4gICAgICBzdHJpbmdTdHJhdGVneTogbmV3IFN0cmluZ0ZldGNoU3RyYXRlZ3koKSxcbiAgICAgIG51bWJlclN0cmF0ZWd5OiBuZXcgTnVtYmVyRmV0Y2hTdHJhdGVneSgpLFxuICAgICAgYm9vbGVhblN0cmF0ZWd5OiBuZXcgQm9vbGVhbkZldGNoU3RyYXRlZ3koKSxcbiAgICAgIHJhbmdlU3RyYXRlZ3k6IG5ldyBSYW5nZUZldGNoU3RyYXRlZ3koKSxcbiAgICAgIGRhdGVTdHJhdGVneTogbmV3IGRhdGVGZXRjaFN0cmF0ZWd5KCksXG4gICAgICByZWN1cnJpbmdEYXRlU3RyYXRlZ3k6IG5ldyBSZWN1cnJpbmdEYXRlU3RyYXRlZ3koKVxuICAgIH07XG4gIH1cbiAgc2V0U3RyYXRlZ3koY2hlY2tPcHRpb24pIHtcbiAgICB0aGlzLl9jaGVja09wdGlvbiA9IGNoZWNrT3B0aW9uO1xuICAgIHN3aXRjaCAoY2hlY2tPcHRpb24pIHtcbiAgICAgIGNhc2UgXCJjb250YWluX29yXCI6XG4gICAgICBjYXNlIFwiY29udGFpbl9hbmRcIjpcbiAgICAgIGNhc2UgXCJub3RfY29udGFpbl9vclwiOlxuICAgICAgY2FzZSBcIm5vdF9jb250YWluX2FuZFwiOlxuICAgICAgY2FzZSBcImVxdWFsX29yXCI6XG4gICAgICBjYXNlIFwiZXF1YWxfYW5kXCI6XG4gICAgICBjYXNlIFwibm90X2VxdWFsX29yXCI6XG4gICAgICBjYXNlIFwibm90X2VxdWFsX2FuZFwiOlxuICAgICAgY2FzZSBcInBob25lX2VxdWFsX29yXCI6XG4gICAgICBjYXNlICdkaXN0YW5jZSc6XG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICB0aGlzLl9jdXJyZW50U3RyYXRlZ3kgPSB0aGlzLl9zdHJhdGVnaWVzLnN0cmluZ1N0cmF0ZWd5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJiaWdnZXJcIjpcbiAgICAgIGNhc2UgXCJsb3dlclwiOlxuICAgICAgICB0aGlzLl9jdXJyZW50U3RyYXRlZ3kgPSB0aGlzLl9zdHJhdGVnaWVzLm51bWJlclN0cmF0ZWd5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyYW5nZVwiOlxuICAgICAgICB0aGlzLl9jdXJyZW50U3RyYXRlZ3kgPSB0aGlzLl9zdHJhdGVnaWVzLnJhbmdlU3RyYXRlZ3k7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRhdGVfaW5cIjpcbiAgICAgIGNhc2UgXCJkYXRlX291dFwiOlxuICAgICAgICB0aGlzLl9jdXJyZW50U3RyYXRlZ3kgPSB0aGlzLl9zdHJhdGVnaWVzLmRhdGVTdHJhdGVneTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgdGhpcy5fY3VycmVudFN0cmF0ZWd5ID0gdGhpcy5fc3RyYXRlZ2llcy5ib29sZWFuU3RyYXRlZ3k7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlY3VycmluZ19kYXRlXCI6XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTdHJhdGVneSA9IHRoaXMuX3N0cmF0ZWdpZXMucmVjdXJyaW5nRGF0ZVN0cmF0ZWd5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBzZXRFbnRpdHkodmFsKSB7XG4gICAgdGhpcy5fZW50aXR5ID0gdGhpcy5fY3VycmVudFN0cmF0ZWd5LmNvbnZlcnQodmFsKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRFbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eTtcbiAgfVxuICBzZXRGaWx0ZXJWYWx1ZXModmFsKSB7XG4gICAgbGV0IHRlbXAgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbiAgICB0aGlzLl9maWx0ZXJWYWx1ZXMgPSB0ZW1wLm1hcChjdXJGaWx0ZXJWYWwgPT4gdGhpcy5fY3VycmVudFN0cmF0ZWd5LmNvbnZlcnRGaWx0ZXJWYWx1ZShjdXJGaWx0ZXJWYWwpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRGaWx0ZXJWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclZhbHVlcztcbiAgfVxuICBnZXRDaGVja09wdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tPcHRpb247XG4gIH1cbn1cbmNsYXNzIEl0ZW1zRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBmaWx0ZXIoZmlsdGVycywgaXRlbXMpIHtcbiAgICBjb25zdCBhbGxGaWx0ZXJzQW5kU3RyYXRlZ3kgPSB0aGlzLmNoZWNrSWZBbGxGaWx0ZXJzSGF2ZUFuZFN0cmF0ZWd5KGZpbHRlcnMpO1xuICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgICBjb25zdCBhY3RpdmVGaWx0ZXJzID0gZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24gKGZpbHRlcikge1xuICAgICAgcmV0dXJuIGZpbHRlci52YWx1ZXNBcnJheS5sZW5ndGg7XG4gICAgfSk7XG4gICAgZm9yIChsZXQgaXRlbSBvZiBpdGVtcykge1xuICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZUZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gYWN0aXZlRmlsdGVyc1tpXTtcbiAgICAgICAgY29uc3QgY3VyckZpZWxkID0gaXRlbS5maWVsZHMuZmluZChmdW5jdGlvbiAoaXRlbUZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlci5maWVsZF9pZCA9PSBpdGVtRmllbGQuZmllbGRfaWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaWx0ZXJBZ2dyZWdhdGUgPSBuZXcgQWdncmVnYXRlKCk7XG4gICAgICAgIGNvbnN0IGZpbHRlckNoZWNrZXIgPSBuZXcgQ2hlY2tlcigpO1xuICAgICAgICBmaWx0ZXJBZ2dyZWdhdGUuc2V0U3RyYXRlZ3koZmlsdGVyLnNlYXJjaF90eXBlKS5zZXRFbnRpdHkoY3VyckZpZWxkICYmIGN1cnJGaWVsZC5maWVsZF92YWx1ZSAhPSB1bmRlZmluZWQgPyBjdXJyRmllbGQuZmllbGRfdmFsdWUgOiBudWxsKS5zZXRGaWx0ZXJWYWx1ZXMoZmlsdGVyLnZhbHVlc0FycmF5KTtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIuYm9vbGVhbl9zdHJhdGVneSkge1xuICAgICAgICAgIGNhc2UgJ2FuZCc6XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgZmlsdGVyQ2hlY2tlci5jaGVjayhmaWx0ZXJBZ2dyZWdhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnb3InOlxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IGZpbHRlckNoZWNrZXIuY2hlY2soZmlsdGVyQWdncmVnYXRlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgZmlsdGVyQ2hlY2tlci5jaGVjayhmaWx0ZXJBZ2dyZWdhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVlZGVkIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBvdGhlciBmaWx0ZXJzIGlmIHdlIGFscmVhZHkga25vdyB0aGF0IHJlc3VsdCBpcyBmYWxzZSBpbiBjYXNlIG9mICdhbmQnIHN0cmF0ZWd5XG4gICAgICAgIGlmICghcmVzdWx0ICYmIGFsbEZpbHRlcnNBbmRTdHJhdGVneSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGZpbHRlcmVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbHRlcmVkSXRlbXMubGVuZ3RoIHx8IGZpbHRlcnMubGVuZ3RoICYmICFmaWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkSXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gIH1cbiAgY2hlY2tJZkFsbEZpbHRlcnNIYXZlQW5kU3RyYXRlZ3koZmlsdGVycykge1xuICAgIHJldHVybiBmaWx0ZXJzLmV2ZXJ5KGZpbHRlciA9PiB7XG4gICAgICBpZiAoIWZpbHRlci5ib29sZWFuX3N0cmF0ZWd5IHx8IGZpbHRlci5ib29sZWFuX3N0cmF0ZWd5ID09ICdhbmQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvZmlsdGVyL21lcmdlRmlsdGVycy5qc1xuZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzKHNyY0ZpbHRlcnMsIGRlc3RGaWx0ZXJzKSB7XG4gIGNvbnN0IG1lcmdlZEZpZWxkSWRzID0gW107XG4gIGxldCBmaWx0ZXJzID0gW107XG4gIGlmIChzcmNGaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICBzcmNGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpbHRlcnMgPSBkZXN0RmlsdGVycztcbiAgfVxuICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3RGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmaWx0ZXIuZmllbGRfaWQgPT0gZGVzdEZpbHRlcnNbaV0uZmllbGRfaWQpIHtcbiAgICAgICAgICBtZXJnZWRGaWVsZElkcy5wdXNoKGZpbHRlci5maWVsZF9pZCk7XG4gICAgICAgICAgZmlsdGVyc1tpbmRleF0gPSBndWRodWIubWVyZ2VPYmplY3RzKGRlc3RGaWx0ZXJzW2ldLCBmaWx0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBkZXN0RmlsdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgaWYgKCFtZXJnZWRGaWVsZElkcy5pbmNsdWRlcyhkZXN0RmlsdGVyc1trXS5maWVsZF9pZCkpIHtcbiAgICAgICAgZmlsdGVycy5wdXNoKGRlc3RGaWx0ZXJzW2tdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbHRlcnM7XG59XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2pzb25wYXRoL2pzb25wYXRoLmpzXG52YXIganNvbnBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4MzIpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL2pzb25fdG9faXRlbXMvanNvbl90b19pdGVtcy5qc1xuXG5cbi8qXG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEpTT04gVE8gSVRFTVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbnw9PT09PT09PT09PT09PT09PT09PT09ICAgICAganNvblRvSXRlbXMgKGpzb24sIGZpZWxkc01hcCkgICAgICAgICAgID09PT09PT09PT09PT09PT09fFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG58ICAgQXJndW1lbnRzOlxufCAgICAgICAtIGpzb24gLSBpcyBhbiBvYmplY3QgdGhhdCBpcyBnb2luZyB0byBiZSBjb252ZXJ0ZWQgdG8gaXRlbXNcbnxcbnxcbnwgICAgICAgLSBmaWVsZHNNYXAgLSB0aGlzIG1hcCBpcyBhbiBvYmplY3QgYXJyYXkgdGhhdCBjb250YWlucyBmaWVsZF9pZCBhbmQganNvblBhdGggdG8gZ2V0IGRhdGEgZnJvbSAgXG58ICAgICAgIFtcbnwgICAgICAgICAgIHtcbnwgICAgICAgICAgICAgICBmaWVsZF9pZDogNDMxLFxufCAgICAgICAgICAgICAgIGpzb25fcGF0aCA6IFwiJC4uaXRlbV9pZFwiXG58ICAgICAgICAgICB9XG58ICAgICAgIF1cbnxcbnxcbnwgICAgICAgLSBSZXR1cm5zIGl0ZW1zX2xpc3Q6XG58ICAgICAgW1xufCAgICAgICAgICBmaWVsZHM6IHtcbnwgICAgICAgICAgICBmaWVsZF9pZDogMTIzNTYsXG58ICAgICAgICAgICAgZmllbGRfdmFsdWU6IFwidGVzdCB2YWx1ZVwiXG58ICAgICAgICAgIH1cbnwgICAgICAgXVxufFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG4qL1xuXG5mdW5jdGlvbiBqc29uVG9JdGVtcyhqc29uLCBmaWVsZHNNYXApIHtcbiAgbGV0IHByb2NjZXNzZWRNYXAgPSBbXTtcbiAgbGV0IGl0ZW1zUGF0aCA9IFtdO1xuXG4gIC8vLS0gU3RlcCAxIC0tLy8gXG4gIC8vIGl0ZXJhdGluZyB0aHJvdWdoIG1hcCBhbmQgZ2VuZXJhdGluZyBsaXN0IG9mIHBhdGhzIGZvciBlYWNoIGZpZWxkX2lkXG4gIGZpZWxkc01hcC5mb3JFYWNoKGZpZWxkTWFwID0+IHtcbiAgICBsZXQganNvbl9wYXRocyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBqc29uX3BhdGhzID0ganNvbnBhdGgucGF0aHMoanNvbiwgZmllbGRNYXAuanNvbl9wYXRoKTtcbiAgICAgIHByb2NjZXNzZWRNYXAucHVzaCh7XG4gICAgICAgIGZpZWxkX2lkOiBmaWVsZE1hcC5maWVsZF9pZCxcbiAgICAgICAganNvbl9wYXRoczoganNvbl9wYXRocyxcbiAgICAgICAganNvbl9wYXRoc19sZW5ndGg6IGpzb25fcGF0aHMubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgfVxuICB9KTtcblxuICAvLy0tIFN0ZXAgMiAtLS8vXG4gIC8vIHdlIGFyZSBzb3JydGluZyBieSBqc29uX3BhdGhzX2xlbmd0aCB0byBmaW5kIGEgZmllbGQgd2l0aCBiaWdnZXN0IG51bWJlciBvZiBqc29uX3BhdGhzXG4gIC8vIHdlIGFyZSBnb2luZyB0byB1c2UgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHByb2NjZXNzZWRNYXAgYXJyYXkgYXMgYSBtYWluIGl0ZXJhdG9yXG4gIHByb2NjZXNzZWRNYXAuc29ydCgoYiwgYSkgPT4ge1xuICAgIHJldHVybiBhLmpzb25fcGF0aHNfbGVuZ3RoIC0gYi5qc29uX3BhdGhzX2xlbmd0aDtcbiAgfSk7XG5cbiAgLy8tLSBTdGVwIDMgLS0vL1xuICAvLyBjcmVhdGluZyBpdGVtcyBhcnJheSBiYXNlZCBvbiBwcm9jY2Vzc2VkTWFwXG4gIGxldCBpdGVtcyA9IGdldFBhdGhGb3JJdGVtcyhwcm9jY2Vzc2VkTWFwKS5tYXAoaXRlbVBhdGggPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IGl0ZW1QYXRoLmZpZWxkcy5tYXAoZmllbGQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZC5maWVsZF9pZCxcbiAgICAgICAgICBmaWVsZF92YWx1ZToganNvbnBhdGgudmFsdWUoanNvbiwgZmllbGQuanNvbl9wYXRoKVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vLyoqKioqKioqKioqKioqKiogQkVTVCBNQVRDSCAqKioqKioqKioqKioqKioqLy9cbi8vIGl0IGxvb2tzIGZvciBqc29uUGF0aCBpbiB0aGUgcGF0aHNUb0NvbXBhcmUgdGhhdCBpcyBtdXRjaGluZyB0aGUgYmVzdFxuZnVuY3Rpb24gYmVzdE1hdGNoKHRhcmdldFBhdGgsIHBhdGhzVG9Db21wYXJlKSB7XG4gIGxldCBtYXRjaGVkUGF0aHMgPSBbXTtcblxuICAvLy0tIENyZWF0aW5nIG1hdGNoZWRQYXRocyBmb3IgY29tcGVhcmluZyB0YXJnZXRQYXRoIHdpdGggcGF0aHNUb0NvbXBhcmVcbiAgcGF0aHNUb0NvbXBhcmUuZm9yRWFjaChwYXRoID0+IHtcbiAgICBtYXRjaGVkUGF0aHMucHVzaCh7XG4gICAgICBwYXRoX3RvX2NvbXBhcmU6IHBhdGgsXG4gICAgICBtYXRjaF9jb2VmZmljaWVudDogMFxuICAgIH0pO1xuICB9KTtcblxuICAvLy0tIEFzc2lnbmluZyBtYXRjaF9jb2VmZmljaWVudCB0byBlYWNoIHBhdGggZnJvbSBtYXRjaGVkUGF0aHMgYXJyZXkgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhdGggbWF0Y2ggdGhlIGJlc3RcbiAgLy8gQmlnZ2VyIGNvZWZmaWNpZW50IG1lYW5zIGJldHRlciBtdW5jaCAgXG4gIHRhcmdldFBhdGguZm9yRWFjaCgodHJnRWxlbSwga2V5KSA9PiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGVkUGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVkUGF0aHNbaV0ucGF0aF90b19jb21wYXJlW2tleV0gPT0gdHJnRWxlbSkge1xuICAgICAgICBtYXRjaGVkUGF0aHNbaV0ubWF0Y2hfY29lZmZpY2llbnQgKz0gMSAvIChrZXkgKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vLS0gU29ydGluZyBtYXRjaGVkUGF0aHMgYnkgbWF0Y2hfY29lZmZpY2llbnQgaW4gb3JkZXIgdG8gcmV0dXJuIHB1dGggdGhhdCBtYXRjaCB0aGUgYmVzdFxuICBtYXRjaGVkUGF0aHMuc29ydCgoYiwgYSkgPT4ge1xuICAgIHJldHVybiBhLm1hdGNoX2NvZWZmaWNpZW50IC0gYi5tYXRjaF9jb2VmZmljaWVudDtcbiAgfSk7XG5cbiAgLy8tLSBSZXR1cm5pbmcgZmlyc3QgZWxlbWVudCBvZiBtYXRjaGVkUGF0aHNbXSB3aXRoIGJpZ2dlc3QgbWF0Y2hfY29lZmZpY2llbnQgd2l0aCBpcyBhIGJlc3QgbWF0Y2ggcmVzdWx0XG4gIHJldHVybiBtYXRjaGVkUGF0aHNbMF0ucGF0aF90b19jb21wYXJlO1xufVxuXG4vLyoqKioqKioqKioqKioqKiBHRVQgUEFUSCBGT1IgSVRFTVMgKioqKioqKioqKioqKioqKi8vXG4vKiBIZXJlIHdlIGNyZWF0ZSBhcnJheSBvZiBpdGVtcyB0aG9zZSBhcmUgY29udGFpbnMganNvbmVQYXRocyBcbi8qIGF0IHRoZSBuZXh0IHN0ZXAgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBmaWVsZF92YWx1ZSBmcm9tIGpzb25fcGF0aFxufCAgICAgIFtcbnwgICAgICAgICAgICBmaWVsZHM6XG58ICAgICAgICAgICAge1xufCAgICAgICAgICAgICAgICBmaWVsZF9pZCA6IDEyMyxcbnwgICAgICAgICAgICAgICAganNvbl9wYXRoIDogJC4udGVzdF9wYXRoXG58ICAgICAgICAgICAgfVxufCAgICAgICAgXVxufCovXG5mdW5jdGlvbiBnZXRQYXRoRm9ySXRlbXMocHJvY2Nlc3NlZE1hcCkge1xuICBsZXQgaXRlbXNQYXRoID0gW107XG4gIHByb2NjZXNzZWRNYXAubGVuZ3RoICYmIHByb2NjZXNzZWRNYXBbMF0uanNvbl9wYXRocy5mb3JFYWNoKGpzb25QYXRoID0+IHtcbiAgICBsZXQgaXRlbVBhdGggPSB7XG4gICAgICBmaWVsZHM6IFtdXG4gICAgfTtcbiAgICBwcm9jY2Vzc2VkTWFwLmZvckVhY2gocE1hcCA9PiB7XG4gICAgICBpdGVtUGF0aC5maWVsZHMucHVzaCh7XG4gICAgICAgIGZpZWxkX2lkOiBwTWFwLmZpZWxkX2lkLFxuICAgICAgICBqc29uX3BhdGg6IGJlc3RNYXRjaChqc29uUGF0aCwgcE1hcC5qc29uX3BhdGhzKVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXRlbXNQYXRoLnB1c2goaXRlbVBhdGgpO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zUGF0aDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9tZXJnZV9jb21wYXJlX2l0ZW1zL21lcmdlX2NvbXBhcmVfaXRlbXMuanNcbi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xuLy8qKioqKioqKioqKioqKioqKioqIElURU1TICoqKioqKioqKioqKioqKioqKi8vXG4vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cblxuLypcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBPUFVMQVRFIFdJVEggSVRFTSBSRUZGRVJFTkNFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG58PT09PT0gIHBvcHVsYXRlV2l0aEl0ZW1SZWYgKHNvcmNlSXRlbXNSZWYsIHNyY0ZpZWxkSWRUb0NvbXBhcmUsIGRlc3RpbmF0aW9uSXRlbXMsIGRlc3RGaWVsZElkVG9Db21wYXJlLCBkZXN0RmllbGRGb3JSZWYsIGFwcF9pZCkgID09PT09fFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbnwgV2UgdXBkYXRlIGRlc3RpbmF0aW9uIEl0ZW1zICB3aXRoIGl0ZW1fcmVmIG9mICBzb3JjZSBJdGVtcy4gQ29ubmVjdGlvbnRpb24gYmV0d2VlbiBzb3JjZUl0ZW1zUmVmICYgc3JjRmllbGRJZFRvQ29tcGFyZSB3ZSBhcmUgY2hlY2tpbmcgd2l0aCBcbnwgaGVscCBvZiBzcmNGaWVsZElkVG9Db21wYXJlICYgZGVzdEZpZWxkSWRUb0NvbXBhcmUuIEFmdGVyIGNvbm5lY3Rpb24gaXMgZGV0ZWN0ZWQgd2Ugc2F2ZSB0aGUgaXRlbV9yZWYgaW50byBkZXN0RmllbGRGb3JSZWYuXG58XG58ICAgQXJndW1lbnRzOlxufCAgICAtIHNvcmNlSXRlbXNSZWYgLSBpdGVtcyB0aG9zZSBhcmUgd2lsbCBiZSB1c2VkIGFzIHJlZmVyZW5zZSBmb3IgaXRlbV9yZWZcbnwgICAgLSBkZXN0aW5hdGlvbkl0ZW1zIC0gaXRlbXMgdGhvc2UgYXJlIHdpbGwgYmUgdXNlZCB0byBzYXZlIGl0ZW1fcmVmIHRvIHNvcmNlSXRlbXNSZWYgXG58ICAgIC0gc3JjRmllbGRJZFRvQ29tcGFyZSAtIHdlIHVzZSB2YWx1ZSBmcm9tIHRoaXMgZmllbGQgdG8gZmluZCB0aGUgc2ltaWxhciBpdGVtcyBpbiBzb3VyY2UgYW5kIGRlc3RpbWF0aW9uIGl0ZW1zIGFycmF5XG58ICAgIC0gZGVzdEZpZWxkSWRUb0NvbXBhcmUgLSB3ZSB1c2UgdmFsdWUgZnJvbSB0aGlzIGZpZWxkIHRvIGZpbmQgdGhlIHNpbWlsYXIgaXRlbXMgaW4gc291cmNlIGFuZCBkZXN0aW1hdGlvbiBpdGVtcyBhcnJheVxufCAgICAtIGRlc3RGaWVsZEZvclJlZiAtIGZpZWxkIHdoZXJlIHZhbHVlIG9mIGl0ZW1fcmVmXG58ICAgIC0gYXBwX2lkIC0gd2UgdXNlIGFwbGljYXRpb24gaWQgdG8gZ2VuZXJhdGUgdmFsdWUgZm9yIGl0ZW1fcmVmXG58XG58ICAgUmV0dXJuOlxufCAgIFt7fSx7fS4uLl0gLSByZXR1cm5zIGFyZXkgb2YgdXBkYXRlZCBpdGVtc1xufCAgIFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG4qL1xuXG4vLyoqKioqKioqKioqKioqKioqKioqKiogUE9QVUxBVEUgV0lUSCBJVEVNIFJFRkZFUkVOQ0UgKioqKioqKioqKioqKioqKioqKioqKioqL1xuZnVuY3Rpb24gcG9wdWxhdGVXaXRoSXRlbVJlZihzb3JjZUl0ZW1zUmVmLCBzcmNGaWVsZElkVG9Db21wYXJlLCBkZXN0aW5hdGlvbkl0ZW1zLCBkZXN0RmllbGRJZFRvQ29tcGFyZSwgZGVzdEZpZWxkRm9yUmVmLCBhcHBfaWQpIHtcbiAgbGV0IHJlc3VsdGVkSXRlbXMgPSBbXTtcbiAgY29uc3QgdGhlU2FtZUlkVmFsdWVGbiA9IGZ1bmN0aW9uIChzcmNDb21wckl0ZW0sIGRzdENvbXBySXRlbSkge1xuICAgIGxldCBmaWVsZEZvclJlZiA9IGdldEZpZWxkQnlJZChkc3RDb21wckl0ZW0sIGRlc3RGaWVsZEZvclJlZik7XG4gICAgaWYgKGZpZWxkRm9yUmVmKSB7XG4gICAgICBmaWVsZEZvclJlZi5maWVsZF92YWx1ZSA9IGFwcF9pZCArIFwiLlwiICsgc3JjQ29tcHJJdGVtLml0ZW1faWQ7XG4gICAgICByZXN1bHRlZEl0ZW1zLnB1c2goZHN0Q29tcHJJdGVtKTtcbiAgICB9XG4gIH07XG4gIGRlc3RpbmF0aW9uSXRlbXMuZm9yRWFjaChkc3RJdGVtID0+IHtcbiAgICBzb3JjZUl0ZW1zUmVmLmZvckVhY2goc3JjSXRlbSA9PiB7XG4gICAgICBjb21wYXJlVHdvSXRlbXNCeUZpZWxkSWQoc3JjSXRlbSwgZHN0SXRlbSwgc3JjRmllbGRJZFRvQ29tcGFyZSwgZGVzdEZpZWxkSWRUb0NvbXBhcmUsIHRoZVNhbWVJZFZhbHVlRm4pO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdGVkSXRlbXM7XG59XG5cbi8qXG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVSR0UgSVRFTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fFxufD09PT09PT09PT09PT09ICAgICAgbWVyZ2VJdGVtcyAoc29yY2VJdGVtcywgZGVzdGluYXRpb25JdGVtcykgICAgICAgICAgID09PT09PT09PT09PXxcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG58IFdlIHJlcGxhY2UgYWxsIGZpZWxkcyB3aXRoIHZhbHVlcyBpbiBkZXN0aW5hdGlvbkl0ZW1zIGJ5IHZhbHVlcyBmcm9tIHNvcmNlSXRlbXMuXG58IElmIGRlc3RpbmF0aW9uSXRlbXMgZG9lc24ndCBoYXZlIGZpZWxkcyB0aGF0IHNvcmNlSXRlbXMgdGhlbiB3ZSBjcmVhdGUgdGhlbSBpbiBkZXN0aW5hdGlvbkl0ZW1zXG58XG58ICAgTk9URTogaXRlbXMgZnJvbSBjaGFua3MgaGFzZSBhIGhpc3RvcnkgcHJvcGVydGkgaW4gYSBmaWVsZCAgIFxufFxufCAgIEFyZ3VtZW50czpcbnwgICAgLSBzb3JjZUl0ZW1zIC0gYXJyYXkgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIGl0ZW1zIGZyb20gZGVzdGluYXRpb25JdGVtcyBpdGVtcyBhcnJheVxufCAgICAtIGRlc3RpbmF0aW9uSXRlbXMgLSBhcnJheSBvZiBpdGVtcyB0aGF0IGlzIGdvbmcgdG8gYmUgdXBkYXRlZFxufFxufCAgIFJldHVybjpcbnwgICBbe30se30uLi5dIC0gcmV0dXJucyBhcmV5IG9mIHVwZGF0ZWQgaXRlbXNcbnwgICBcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fFxuKi9cblxuLy8qKioqKioqKioqKioqKioqKioqKioqIE1FUkdFIElURU1TICoqKioqKioqKioqKioqKioqKioqKioqKi9cbmZ1bmN0aW9uIG1lcmdlSXRlbXMoc29yY2VJdGVtcywgZGVzdGluYXRpb25JdGVtcywgbWVyZ2VCeUZpZWxkSWQpIHtcbiAgbGV0IHNyYyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc29yY2VJdGVtcykpO1xuICBsZXQgZHN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZXN0aW5hdGlvbkl0ZW1zKSk7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICAvLy0tIFRoZSBTb3VyY2UgYW5kIGluIHRoZSBEZXN0aW5hdGlvbiBoYXMgdGhlIHNhbWUgaXRlbSBpZHMgYnV0IGRpZmZlcmVudCBmaWVsZCB2YWx1ZXNcbiAgY29uc3QgZGlmZmVyZW50U3JjSXRlbUZuID0gZnVuY3Rpb24gKHNyY0l0ZW0sIGRzdEl0ZW0pIHtcbiAgICByZXN1bHQucHVzaChtZXJnZVR3b0l0ZW1zKHNyY0l0ZW0sIGRzdEl0ZW0pKTtcbiAgfTtcblxuICAvLy0tIFRoZSBTb3VyY2UgYW5kIGluIHRoZSBEZXN0aW5hdGlvbiBoYXMgdGhlIHNhbWUgaXRlbSBpZHMgYW5kIGZpZWxkIHZhbHVlc1xuICBjb25zdCB0aGVTYW1lU3JjSXRlbUZuID0gZnVuY3Rpb24gKHNyY0l0ZW0pIHtcbiAgICByZXN1bHQucHVzaChzcmNJdGVtKTtcbiAgfTtcblxuICAvLy0tIEl0ZW1zIHRob2FzZSBleGlzdCBpbiB0aGUgU291cmNlIGJ1dCB0aGV5IGFyZSBub3QgZXhpc3QgaW4gdGhlIERlc3RpbmF0aW9uIGxpc3QgXG4gIGNvbnN0IG5ld1NyY0l0ZW1GbiA9IGZ1bmN0aW9uIChzcmNJdGVtKSB7XG4gICAgcmVzdWx0LnB1c2goc3JjSXRlbSk7XG4gIH07XG5cbiAgLy8tLSBJdGVtcyB0aG9hc2UgZXhpc3QgaW4gdGhlIERlc3RpbmF0aW9uIGxpc3QgYnV0IHRoZXkgYXJlIG5vdCBleGlzdCBpbiB0aGUgU291cmNlIGxpc3RcbiAgY29uc3QgdW5pcURlc3RJdGVtRm4gPSBmdW5jdGlvbiAoZHN0SXRlbSkge1xuICAgIHJlc3VsdC5wdXNoKGRzdEl0ZW0pO1xuICB9O1xuXG4gIC8vLS0tLS0tLS0tICBDb21wZWFyaW5nIFNyYyAmIERzdCBJdGVtcyBieSBpdGVtX2lkICAtLS0tLS0tLS0vL1xuICBpZiAobWVyZ2VCeUZpZWxkSWQpIHtcbiAgICBjb21wYXJlSXRlbXNCeUZpZWxkSWQoc3JjLCBkc3QsIG1lcmdlQnlGaWVsZElkLCBkaWZmZXJlbnRTcmNJdGVtRm4sIHRoZVNhbWVTcmNJdGVtRm4sIG5ld1NyY0l0ZW1Gbik7XG4gIH0gZWxzZSBjb21wYXJlSXRlbXNCeUl0ZW1JZChzcmMsIGRzdCwgZGlmZmVyZW50U3JjSXRlbUZuLCB0aGVTYW1lU3JjSXRlbUZuLCBuZXdTcmNJdGVtRm4sIHVuaXFEZXN0SXRlbUZuKTtcblxuICAvLy0tLS0tLS0tLSBGaW5hbCBSZXBvcnQgLS0tLS0tLS0tLy9cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ09NUEFSRSBJVEVNID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fFxufD09PT09PT09PT09ICAgICAgY29tcGFyZUl0ZW1zIChzb3JjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBmaWVsZFRvQ29tcGFyZSkgICAgICAgICAgID09PT09PT09PT09PT18XG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbnwgV2UgY29tcGFyZSBmaWVsZHMgb2Ygc29yY2VJdGVtcyB3aXRoIGZpZWxkcyBvZiBkZXN0aW5hdGlvbkl0ZW1zLiBJdCBtZWFucyB0aGF0IGlmIHNvcmNlSXRlbXMgXG58IGhhdmUgdGhlIHNhbWUgZmllbGRzIHdpdGggdGhlIHNhbWUgdmFsdWVzIGFzIGRlc3RpbmF0aW9uSXRlbXMgdGhheSB3aWxsIGJlIGRlc2NyaWJlZCBhcyAnc2FtZV9pdGVtcydcbnwgZXZlbiBpZiBkZXN0aW5hdGlvbkl0ZW1zIGhhdmUgYWRkaXRpb25hbCBmaWVsZHMgdGhvc2Ugc29yY2VJdGVtcyBkb2Vzbid0IGhhdmVcbnxcbnwgVGhlcmUgdG8gd2F5cyBob3cgaXQgd29ya3M6XG58ICAgMSBjb21wZXJpbmcgaXRlbXMgYnkgaXRlbV9pZCAoaWYgZmllbGRUb0NvbXBhcmUgaXMgdW5kZWZpbmVkKVxufCAgIDIgY29tcGVyaW5nIGl0ZW1zIGJ5IHZhbHVlIG9mIHNwZWNpZmljIGZpZWxkX2lkIChpZiBmaWVsZFRvQ29tcGFyZSBpcyBkZWZpbmVkKVxufFxufCAgIEFyZ3VtZW50czpcbnwgICAgLSBzb3JjZUl0ZW1zIC0gYXJyYXkgb2YgaXRlbXMgdGhhdCBpcyBnb2luZyB0byBiZSB1c2VkIGFzIGEgc29yY2UgZm9yIGNvbXBlcmlzb25cbnwgICAgLSBkZXN0aW5hdGlvbkl0ZW1zIC0gYXJyYXkgb2YgaXRlbXMgdGhhdCBpcyBnb25nIHRvIGJlIGNvbXBhcmVkIHdpdGggc29yY2VJdGVtc1xufCAgICAtIGZpZWxkVG9Db21wYXJlIC0gZmllbGQgdGhhdCB3ZSB1c2UgdG8gY29tcGFyZSBzb3JjZSBpdGVtcyB3aXRoIGRlc3RpbmF0aW9uIGl0ZW1zLCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB3ZSBjb21wYXJlIGl0ZW1zIGJ5IGl0ZW1faWRcbnxcbnwgICBSZXR1cm46XG58ICAgIHtcbnwgICAgICAgIGlzX2l0ZW1zX2RpZmY6IGZhbHNlLFxufCAgICAgICAgbmV3X3NyY19pdGVtczpbXSxcbnwgICAgICAgIGRpZmZfc3JjX2l0ZW1zOltdLFxufCAgICAgICAgc2FtZV9pdGVtczpbXVxufCAgICB9XG58XG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbiovXG5cbi8vKioqKioqKioqKioqKioqKioqKioqKiBDT01QQVJFIElURU1TICoqKioqKioqKioqKioqKioqKioqKioqKi9cbmZ1bmN0aW9uIGNvbXBhcmVJdGVtcyhzb3JjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBmaWVsZFRvQ29tcGFyZSkge1xuICBjb25zdCBzcmMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNvcmNlSXRlbXMpKTtcbiAgY29uc3QgZHN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZXN0aW5hdGlvbkl0ZW1zKSk7XG4gIGxldCByZXN1bHQgPSB7XG4gICAgaXNfaXRlbXNfZGlmZjogZmFsc2UsXG4gICAgbmV3X3NyY19pdGVtczogW10sXG4gICAgZGlmZl9zcmNfaXRlbXM6IFtdLFxuICAgIHNhbWVfaXRlbXM6IFtdLFxuICAgIHRyYXNoX3NyY19pdGVtczogW11cbiAgfTtcbiAgY29uc3QgZGlmZmVyZW50U3JjSXRlbUZuID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXN1bHQuZGlmZl9zcmNfaXRlbXMucHVzaChpdGVtKTtcbiAgfTtcbiAgY29uc3QgdGhlU2FtZVNyY0l0ZW1GbiA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmVzdWx0LnNhbWVfaXRlbXMucHVzaChpdGVtKTtcbiAgfTtcbiAgY29uc3QgbmV3U3JjSXRlbUZuID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXN1bHQubmV3X3NyY19pdGVtcy5wdXNoKGl0ZW0pO1xuICB9O1xuICBjb25zdCB0cmFzaFNyY0l0ZW1GbiA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmVzdWx0LnRyYXNoX3NyY19pdGVtcy5wdXNoKGl0ZW0pO1xuICB9O1xuXG4gIC8vLS0tLS0tLS0tICBDb21wZWFyaW5nIFNyYyAmIERzdCBJdGVtcyBieSBpdGVtX2lkICAtLS0tLS0tLS0vL1xuICBpZiAoZmllbGRUb0NvbXBhcmUpIHtcbiAgICAvL1RPRE8gdHJhc2hTcmNJdGVtRm5cbiAgICBjb21wYXJlSXRlbXNCeUZpZWxkSWQoc3JjLCBkc3QsIGZpZWxkVG9Db21wYXJlLCBkaWZmZXJlbnRTcmNJdGVtRm4sIHRoZVNhbWVTcmNJdGVtRm4sIG5ld1NyY0l0ZW1Gbik7XG4gIH1cbiAgaWYgKCFmaWVsZFRvQ29tcGFyZSkge1xuICAgIGNvbXBhcmVJdGVtc0J5SXRlbUlkKHNyYywgZHN0LCBkaWZmZXJlbnRTcmNJdGVtRm4sIHRoZVNhbWVTcmNJdGVtRm4sIG5ld1NyY0l0ZW1GbiwgbnVsbCwgdHJhc2hTcmNJdGVtRm4pO1xuICB9XG5cbiAgLy8tLS0tLS0tLS0gRmluYWwgUmVwb3J0IC0tLS0tLS0tLS8vXG4gIHJlc3VsdC5pc19pdGVtc19kaWZmID0gcmVzdWx0Lm5ld19zcmNfaXRlbXMubGVuZ3RoID4gMCB8fCByZXN1bHQuZGlmZl9zcmNfaXRlbXMubGVuZ3RoID4gMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1lcmdlVHdvSXRlbXMoc3JjLCBkc3QpIHtcbiAgc3JjLmZpZWxkcy5mb3JFYWNoKHNyY0ZpZWxkID0+IHtcbiAgICBsZXQgZGVzdEZpZWxkID0gZ2V0RmllbGRCeUlkKGRzdCwgc3JjRmllbGQuZmllbGRfaWQpO1xuICAgIGlmIChkZXN0RmllbGQpIHtcbiAgICAgIGRlc3RGaWVsZC5maWVsZF92YWx1ZSA9IHNyY0ZpZWxkLmZpZWxkX3ZhbHVlO1xuXG4gICAgICAvLyBpZiB3ZSB3b3JrIHdpdGggY2hhbmtlZCBpdGVtcyB0aGVuIHdlIG1lcmdlIGhpc3RvcnkgXG4gICAgICBpZiAoc3JjRmllbGQuaGlzdG9yeSAmJiBkZXN0RmllbGQuaGlzdG9yeSkge1xuICAgICAgICBkZXN0RmllbGQuaGlzdG9yeSA9IHNyY0ZpZWxkLmhpc3RvcnkuY29uY2F0KGRlc3RGaWVsZC5oaXN0b3J5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8tLSBpZiB3ZSBkaWRuJ3QgZmluZCBmaWVsZCB3aXRoIGl0ZW0gdGhlbiB3ZSBhZGQgaXRcbiAgICAgIGRzdC5maWVsZHMucHVzaChzcmNGaWVsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRzdDtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVJdGVtc0J5RmllbGRJZChzcmMsIGRzdCwgZmllbGRUb0NvbXBhcmUsIGRpZmZlcmVudFNyY0l0ZW1GbiwgdGhlU2FtZVNyY0l0ZW1GbiwgbmV3U3JjSXRlbUZuKSB7XG4gIHNyYy5mb3JFYWNoKHNyY0l0ZW0gPT4ge1xuICAgIGxldCBub3RGb3VuZERlc3RJdGVtZm9yU3JjID0gdHJ1ZTtcbiAgICBsZXQgc3JjVmFsID0gZ2V0RmllbGRCeUlkKHNyY0l0ZW0sIGZpZWxkVG9Db21wYXJlKS5maWVsZF92YWx1ZTtcbiAgICBkc3QuZm9yRWFjaChkc3RJdGVtID0+IHtcbiAgICAgIGxldCBkc3RWYWwgPSBnZXRGaWVsZEJ5SWQoZHN0SXRlbSwgZmllbGRUb0NvbXBhcmUpLmZpZWxkX3ZhbHVlO1xuICAgICAgaWYgKHNyY1ZhbCA9PSBkc3RWYWwpIHtcbiAgICAgICAgbm90Rm91bmREZXN0SXRlbWZvclNyYyA9IGZhbHNlO1xuICAgICAgICBjb21wYXJlVHdvSXRlbXMoc3JjSXRlbSwgZHN0SXRlbSwgZGlmZmVyZW50U3JjSXRlbUZuLCB0aGVTYW1lU3JjSXRlbUZuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vLS0gSWYgdGhlcmUgbm8gZGVzdGluYXRpb24gaXRlbSB3aXRoIHRoZSBzYW1lIGl0ZW1faWQgdGhlbiBpdCBtZWFucyB0aGF0IGl0ZW0gaXMgbmV3XG4gICAgaWYgKG5vdEZvdW5kRGVzdEl0ZW1mb3JTcmMpIHtcbiAgICAgIG5ld1NyY0l0ZW1GbihzcmNJdGVtKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY29tcGFyZUl0ZW1zQnlJdGVtSWQoc3JjLCBkc3QsIGRpZmZlcmVudFNyY0l0ZW1GbiwgdGhlU2FtZVNyY0l0ZW1GbiwgbmV3U3JjSXRlbUZuLCB1bmlxRGVzdEl0ZW1GbiwgdHJhc2hTcmNJdGVtRm4pIHtcbiAgbGV0IGRzdEl0ZW1zTWFwID0gbmV3IEl0ZW1zTWFwcGVyKGRzdCk7XG4gIHNyYy5mb3JFYWNoKHNyY0l0ZW0gPT4ge1xuICAgIGxldCBkZXN0SW5kZXggPSBkc3RJdGVtc01hcC5wdWxsSXRlbUluZGV4KHNyY0l0ZW0uaXRlbV9pZCk7XG4gICAgaWYgKGRlc3RJbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbXBhcmVUd29JdGVtcyhzcmNJdGVtLCBkc3RbZGVzdEluZGV4XSwgZGlmZmVyZW50U3JjSXRlbUZuLCB0aGVTYW1lU3JjSXRlbUZuLCB0cmFzaFNyY0l0ZW1Gbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzcmNJdGVtLnRyYXNoKSB0cmFzaFNyY0l0ZW1GbihzcmNJdGVtKTtcbiAgICAgIGlmICghc3JjSXRlbS50cmFzaCkgbmV3U3JjSXRlbUZuKHNyY0l0ZW0pO1xuICAgIH1cbiAgICA7XG4gIH0pO1xuXG4gIC8vLS0gSW4gY2FzZSBpZiB3ZSBoYXZlIGRlc3RpbmF0aW9uIGl0ZW1zIHdoaWNoIGFyZSBuZXcgdGhlbiB3ZSBcbiAgaWYgKHVuaXFEZXN0SXRlbUZuKSBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkc3RJdGVtc01hcC5pdGVtc01hcCkpIHtcbiAgICB1bmlxRGVzdEl0ZW1Gbihkc3RbdmFsdWVdKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tcGFyZVR3b0l0ZW1zKHNyYywgZHN0LCBkaWZmZXJlbnRTcmNJdGVtRm4sIHRoZVNhbWVTcmNJdGVtRm4sIHRyYXNoU3JjSXRlbUZuKSB7XG4gIGxldCBzYW1lSXRlbSA9IHRydWU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBkZXN0RmllbGQgPSBnZXRGaWVsZEJ5SWQoZHN0LCBzcmMuZmllbGRzW2ldLmZpZWxkX2lkKTtcbiAgICBpZiAoZGVzdEZpZWxkKSB7XG4gICAgICAvLy0tIGlmIHZhbHVlIG9mIHNvbWUgZmllbGQgb2YgdGhlIGl0ZW0gaXMgZGlmZmVyZW50IHRoZW4gaXRlbSBpcyBkaWZmZXJlbnQgdG9vXG4gICAgICBpZiAoZGVzdEZpZWxkLmZpZWxkX3ZhbHVlICE9IHNyYy5maWVsZHNbaV0uZmllbGRfdmFsdWUpIHtcbiAgICAgICAgc2FtZUl0ZW0gPSBzYW1lSXRlbSAmJiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8tLSBpZiB3ZSBkaWRuJ3QgZmluZCBmaWVsZCB3aXRoIGl0ZW0gdGhlbiBpdGVtIGlzIGRpZmZlcmVudFxuICAgICAgc2FtZUl0ZW0gPSBzYW1lSXRlbSAmJiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLy0tIFNlbmRpbmcgQ29tcGVhcmluZyBSZXN1bHRcbiAgaWYgKHNhbWVJdGVtKSB7XG4gICAgaWYgKHNyYy50cmFzaCkgdHJhc2hTcmNJdGVtRm4oc3JjLCBkc3QpO1xuICAgIGlmICghc3JjLnRyYXNoKSB0aGVTYW1lU3JjSXRlbUZuKHNyYywgZHN0KTtcbiAgfVxuICBpZiAoIXNhbWVJdGVtKSB7XG4gICAgaWYgKHNyYy50cmFzaCkgdHJhc2hTcmNJdGVtRm4oc3JjLCBkc3QpO1xuICAgIGlmICghc3JjLnRyYXNoKSBkaWZmZXJlbnRTcmNJdGVtRm4oc3JjLCBkc3QpO1xuICB9XG59XG5mdW5jdGlvbiBjb21wYXJlVHdvSXRlbXNCeUZpZWxkSWQoc3JjSXRlbSwgZHN0SXRlbSwgc3JjRmllbGRJZCwgZHN0RmllbGRJZCwgdGhlU2FtZVNyY0l0ZW1Gbikge1xuICBsZXQgc3JjRmllbGRWYWwgPSBnZXRGaWVsZEJ5SWQoc3JjSXRlbSwgc3JjRmllbGRJZCkuZmllbGRfdmFsdWU7XG4gIGxldCBkc3RGaWVsZElkVmFsID0gZ2V0RmllbGRCeUlkKGRzdEl0ZW0sIGRzdEZpZWxkSWQpLmZpZWxkX3ZhbHVlO1xuICBpZiAoc3JjRmllbGRWYWwgPT0gZHN0RmllbGRJZFZhbCkge1xuICAgIHRoZVNhbWVTcmNJdGVtRm4oc3JjSXRlbSwgZHN0SXRlbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZpZWxkQnlJZChpdGVtLCBmaWVsZF9pZCkge1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmaWVsZF9pZCA9PSBpdGVtLmZpZWxkc1tpXS5maWVsZF9pZCkge1xuICAgICAgcmVzdWx0ID0gaXRlbS5maWVsZHNbaV07XG4gICAgfVxuICB9XG4gIDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIEl0ZW1zTWFwcGVyIHtcbiAgY29uc3RydWN0b3IoaXRlbXMpIHtcbiAgICB0aGlzLl9pdGVtc01hcCA9IHt9O1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xuICAgICAgdGhpcy5faXRlbXNNYXBbaXRlbS5pdGVtX2lkXSA9IGtleTtcbiAgICB9KTtcbiAgfVxuICBwdWxsSXRlbUluZGV4KGl0ZW1faWQpIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLl9pdGVtc01hcFtpdGVtX2lkXTtcbiAgICBkZWxldGUgdGhpcy5faXRlbXNNYXBbaXRlbV9pZF07XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIGdldEl0ZW1JbmRleChpdGVtX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zTWFwW2l0ZW1faWRdO1xuICB9XG4gIGdldCBpdGVtc01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNNYXA7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9maWx0ZXIvZ3JvdXAuanNcbmZ1bmN0aW9uIGdyb3VwKGZpZWxkR3JvdXAsIGl0ZW1zKSB7XG4gIGxldCBncm91cEl0ZW1MaXN0ID0gW107XG4gIGxldCBhcnJheUdyb3VwRmllbGQ7XG4gIGlmICghZmllbGRHcm91cCkge1xuICAgIGdyb3VwSXRlbUxpc3QgPSBpdGVtcztcbiAgfSBlbHNlIHtcbiAgICBhcnJheUdyb3VwRmllbGQgPSBmaWVsZEdyb3VwLnNwbGl0KFwiLFwiKTtcbiAgfVxuICBsZXQgYXJyYXlWYWx1ZSA9IG5ldyBTZXQoKTtcbiAgaWYgKGZpZWxkR3JvdXApIHtcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IHZhbHVlRmllbGQgPSBcIlwiO1xuICAgICAgYXJyYXlHcm91cEZpZWxkLmZvckVhY2goKGZpZWxkVG9Hcm91cCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZmluZEZpZWxkID0gaXRlbS5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5maWVsZF9pZCA9PSBmaWVsZFRvR3JvdXApO1xuICAgICAgICBpZiAoZmluZEZpZWxkKSB7XG4gICAgICAgICAgdmFsdWVGaWVsZCArPSBmaW5kRmllbGQuZmllbGRfdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5R3JvdXBGaWVsZC5sZW5ndGggLSAxID09IGluZGV4KSB7XG4gICAgICAgICAgbGV0IGl0ZW1VbmljcyA9IGZpbmRVbmlxSXRlbSh2YWx1ZUZpZWxkKTtcbiAgICAgICAgICBpZiAoaXRlbVVuaWNzKSB7XG4gICAgICAgICAgICBncm91cEl0ZW1MaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNlbmQgZmllbGQgdmFsdWUgYW5kIGNoZWNrIGlmIGl0J3MgdW5pcXVlXG4gIGZ1bmN0aW9uIGZpbmRVbmlxSXRlbSh2YWx1ZSkge1xuICAgIGNvbnN0IHVuaXFWYWx1ZSA9ICFhcnJheVZhbHVlLmhhcyh2YWx1ZSk7XG4gICAgaWYgKHVuaXFWYWx1ZSkge1xuICAgICAgYXJyYXlWYWx1ZS5hZGQodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5pcVZhbHVlO1xuICB9XG4gIHJldHVybiBncm91cEl0ZW1MaXN0O1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL3BvcHVsYXRlX2l0ZW1zL3BvcHVsYXRlX2l0ZW1zLmpzXG4vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbi8vKioqKioqKioqKioqKioqKioqKiBJVEVNUyAqKioqKioqKioqKioqKioqKiovL1xuLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vXG5cbi8qXG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSVRFTVMgVVBEQVRFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fFxufD09PT09PT09PT09ICAgICAgdXBkYXRlSXRlbXMgKGl0ZW1zLCBtb2RlbCwgZXJhc2VPdGhlclZhbHVlcykgICAgICAgICAgID09PT09PT09PT09PXxcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG58XG58ICAgaXRlbXMgLSBHdWRIdWIgaXRlbXMgdGhvc2Ugd2UgYXJlIGdvaW5nIHRvIGJlIHVwZGF0ZWRcbnwgICBlcmFzZU90aGVyVmFsdWVzIC0gaWYgaXMgJ3RydWUnIHRoZW4gd2UgZXJhc2UgZmllbGRzIHRob3NlIGFyZSBub3QgZ29pbmcgdG8gYmUgdXBkYXRlZFxufCAgIG1vZGVsIC0gYnkgdGhpcyBtb2RlbCB3ZSB1cGRhdGUgdmFsdWVzLiBUaGUgbW9kZWwgZm9ybWF0IHNob3VsZCBoYXZlIGZvbG93aW5nIGZvcm1hdDpcbnxcbnwgICBcbnwgICBtb2RlbCA9IFtcbnwgICAge1xufCAgICAgICBcImVsZW1lbnRfaWRcIiA6IDIyODQ2NCxcbnwgICAgICAgXCJmaWVsZF92YWx1ZVwiIDogNzc3XG58ICAgIH1dXG58XG58PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbiovXG5cbi8vKioqKioqKioqKioqKioqKioqKioqKiBVUERBVEUgSVRFTVMgKioqKioqKioqKioqKioqKioqKioqKioqL1xuZnVuY3Rpb24gcG9wdWxhdGVJdGVtcyhpdGVtcywgbW9kZWwsIGtlZXBfZGF0YSkge1xuICB2YXIgaXRlbXNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtcykpO1xuICBpZiAoa2VlcF9kYXRhKSB7XG4gICAgcmV0dXJuIHBvcHVsYXRlSXRlbXNBbmRLZWVwT3RoZXJWYWx1ZXMoaXRlbXNDb3B5LCBtb2RlbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvcHVsYXRlSXRlbXNBbmRFcmFzZU90aGVyVmFsdWVzKGl0ZW1zQ29weSwgbW9kZWwpO1xuICB9XG59XG5cbi8vLS0tLSBVcGRhdGUgSXRlbXMgQW5kIEtFRVAgT3RoZXIgVmFsdWVzIC0tLS0vL1xuZnVuY3Rpb24gcG9wdWxhdGVJdGVtc0FuZEtlZXBPdGhlclZhbHVlcyhpdGVtcywgbW9kZWwpIHtcbiAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICBtb2RlbC5mb3JFYWNoKG1vZGVsRmllbGQgPT4ge1xuICAgICAgbGV0IGZpZWxkID0gaXRlbS5maWVsZHMuZmluZChzb3VyY2VGaWVsZCA9PiBzb3VyY2VGaWVsZC5lbGVtZW50X2lkID09IG1vZGVsRmllbGQuZWxlbWVudF9pZCk7XG4gICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgZmllbGQuZmllbGRfdmFsdWUgPSBtb2RlbEZpZWxkLmZpZWxkX3ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8tLSBpZiB3ZSBkaWRuJ3QgZmluZCBmaWVsZCB3aXRoIGl0ZW0gdGhlbiB3ZSBhZGQgaXRcbiAgICAgICAgbW9kZWxGaWVsZC5maWVsZF9pZCA9IG1vZGVsRmllbGQuZWxlbWVudF9pZDsgLy9iYWNrZW5kIHNlbmQgRVJST1IgaWYgZG9uJ3Qgc2VuZCBmaWVsZF9pZFxuICAgICAgICBpdGVtLmZpZWxkcy5wdXNoKG1vZGVsRmllbGQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vLy0tLS0gVXBkYXRlIEl0ZW1zIEFuZCBFUkFTRSBPdGhlciBWYWx1ZXMgLS0tLS8vXG5mdW5jdGlvbiBwb3B1bGF0ZUl0ZW1zQW5kRXJhc2VPdGhlclZhbHVlcyhpdGVtcywgbW9kZWwpIHtcbiAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICBpdGVtLmZpZWxkcyA9IFtdLmNvbmNhdChtb2RlbCk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZC9pbmRleC5qc1xudmFyIGFkZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTQzMCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERheS9pbmRleC5qc1xudmFyIHNldERheSA9IF9fd2VicGFja19yZXF1aXJlX18oODkzMyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsvaW5kZXguanNcbnZhciBpc1NhbWVXZWVrID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mjc2KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9nZXRfZGF0ZS9nZXRfZGF0ZS5qc1xuLypcbnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHRVRUSU5HIERBVEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG58PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgZ2V0RGF0ZSAocXVlcnlLZXkpICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09fFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXxcbnwgICBBcmd1bWVudHM6XG58ICAgIC0gcXVlcnlLZXkgLSBhY2NvcmRpbmcgdG8gJ3F1ZXJ5S2V5JyB3ZSBkZWNpZGUgd2l0aCBkYXRlIHNob3VsZCBiZSByZXR1cm5lZCB0byB1c2VyXG58XG58ICAgUmV0dXJuOlxufCAgIC0gZGF0ZSBpbiBtaWxpc2Vjb25kc1xufCAgIFxufD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18XG4qL1xuXG5cblxuXG4vLyoqKioqKioqKioqKioqKioqKioqKiogUE9QVUxBVEUgV0lUSCBEQVRFICoqKioqKioqKioqKioqKioqKioqKioqKi8vXG5mdW5jdGlvbiBwb3B1bGF0ZVdpdGhEYXRlKGl0ZW1zLCBtb2RlbCkge1xuICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIG1vZGVsLmZvckVhY2gobW9kZWxGaWVsZCA9PiB7XG4gICAgICBsZXQgZmllbGQgPSBpdGVtLmZpZWxkcy5maW5kKHNvdXJjZUZpZWxkID0+IHNvdXJjZUZpZWxkLmVsZW1lbnRfaWQgPT0gbW9kZWxGaWVsZC5lbGVtZW50X2lkKTtcbiAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICBpZiAobW9kZWxGaWVsZC5kYXRhX3JhbmdlKSB7XG4gICAgICAgICAgaWYgKG1vZGVsRmllbGQuZGF0ZV90eXBlLmluY2x1ZGVzKCdjYWxlbmRhcicpKSB7XG4gICAgICAgICAgICBmaWVsZC5maWVsZF92YWx1ZSA9IGAke2dldFN0YXJ0RGF0ZShtb2RlbEZpZWxkLmRhdGVfdHlwZSl9OiR7Z2V0X2RhdGVfZ2V0RGF0ZShtb2RlbEZpZWxkLmRhdGVfdHlwZSl9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGQuZmllbGRfdmFsdWUgPSBgJHtnZXRTdGFydERhdGUobW9kZWxGaWVsZC5kYXRlX3R5cGUpfToke2dldF9kYXRlX2dldERhdGUobW9kZWxGaWVsZC5kYXRlX3R5cGUpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkLmZpZWxkX3ZhbHVlID0gZ2V0X2RhdGVfZ2V0RGF0ZShtb2RlbEZpZWxkLmRhdGVfdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vLS0gaWYgd2UgZGlkbid0IGZpbmQgZmllbGQgaW4gaXRlbSB0aGVuIHdlIGFkZCBpdFxuICAgICAgICBpdGVtLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBmaWVsZF9pZDogbW9kZWxGaWVsZC5lbGVtZW50X2lkLFxuICAgICAgICAgIGVsZW1lbnRfaWQ6IG1vZGVsRmllbGQuZWxlbWVudF9pZCxcbiAgICAgICAgICBmaWVsZF92YWx1ZTogZ2V0X2RhdGVfZ2V0RGF0ZShtb2RlbEZpZWxkLmRhdGVfdHlwZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8vKioqKioqKioqKioqKioqKioqKiBHRVQgU1RBUlQgREFURSAqKioqKioqKioqKioqKioqKioqKiovL1xuZnVuY3Rpb24gZ2V0U3RhcnREYXRlKGRhdGVUeXBlKSB7XG4gIGxldCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGZ1bmN0aW9uIHdlZWtUaW1lKGN1cnJlbnREYXRlKSB7XG4gICAgdmFyIGRheSA9IGN1cnJlbnREYXRlLmdldERheSgpO1xuICAgIGxldCBudW1iZXJPZkRheXM7XG4gICAgaWYgKGRhdGVUeXBlLmluY2x1ZGVzKFwid2Vla19jdXJyZW50LGN1cnJlbnRcIikpIHtcbiAgICAgIG51bWJlck9mRGF5cyA9IDA7XG4gICAgfVxuICAgIGlmIChkYXRlVHlwZS5pbmNsdWRlcyhcIndlZWtfbmV4dCxmdXR1cmVcIikpIHtcbiAgICAgIG51bWJlck9mRGF5cyA9IDc7XG4gICAgfVxuICAgIGlmIChkYXRlVHlwZS5pbmNsdWRlcyhcIndlZWtfcGFzdCxwYXN0XCIpKSB7XG4gICAgICBudW1iZXJPZkRheXMgPSAtNztcbiAgICB9XG4gICAgbGV0IGRpZmYgPSBjdXJyZW50RGF0ZS5nZXREYXRlKCkgLSBkYXkgKyBudW1iZXJPZkRheXMgKyAoZGF5ID09IDAgPyAtNiA6IDEpO1xuICAgIHJldHVybiBuZXcgRGF0ZShjdXJyZW50RGF0ZS5zZXREYXRlKGRpZmYpKTtcbiAgfVxuICBmdW5jdGlvbiBxdWFydGVyVGltZShjdXJyZW50RGF0ZSkge1xuICAgIGxldCBudW1iZXJNb250aHM7XG4gICAgbGV0IG51bWJlckRheXM7XG4gICAgbGV0IGN1cnJlbnRRdWFydGVyID0gTWF0aC5mbG9vcihjdXJyZW50RGF0ZS5nZXRNb250aCgpIC8gMyk7XG4gICAgbGV0IHllYXIgPSBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGlmIChkYXRlVHlwZS5pbmNsdWRlcyhcInF1YXJ0ZXJfY3VycmVudCxjdXJyZW50XCIpKSB7XG4gICAgICBudW1iZXJNb250aHMgPSAwO1xuICAgICAgbnVtYmVyRGF5cyA9IDA7XG4gICAgfVxuICAgIGlmIChkYXRlVHlwZS5pbmNsdWRlcyhcInF1YXJ0ZXJfbmV4dCxmdXR1cmVcIikpIHtcbiAgICAgIG51bWJlck1vbnRocyA9IDM7XG4gICAgICBudW1iZXJEYXlzID0gMDtcbiAgICB9XG4gICAgaWYgKGRhdGVUeXBlLmluY2x1ZGVzKFwicXVhcnRlcl9wYXN0LHBhc3RcIikpIHtcbiAgICAgIG51bWJlck1vbnRocyA9IC0zO1xuICAgICAgbnVtYmVyRGF5cyA9IDA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBjdXJyZW50UXVhcnRlciAqIDMgKyBudW1iZXJNb250aHMsIDEgKyBudW1iZXJEYXlzKTtcbiAgfVxuICBzd2l0Y2ggKGRhdGVUeXBlKSB7XG4gICAgY2FzZSBcIndlZWtfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gd2Vla1RpbWUobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJtb250aF9jdXJyZW50LGN1cnJlbnRcIjpcbiAgICAgIHJldHVybiBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aCgpLCAxKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInF1YXJ0ZXJfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gcXVhcnRlclRpbWUobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ5ZWFyX2N1cnJlbnQsY3VycmVudFwiOlxuICAgICAgcmV0dXJuIGFkZChuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKSwge1xuICAgICAgICB5ZWFyczogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ3ZWVrX25leHQsZnV0dXJlXCI6XG4gICAgICByZXR1cm4gd2Vla1RpbWUobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJtb250aF9uZXh0LGZ1dHVyZVwiOlxuICAgICAgcmV0dXJuIG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLCAxKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInF1YXJ0ZXJfbmV4dCxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBxdWFydGVyVGltZShuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfbmV4dCxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoY3VycmVudERhdGUsIHtcbiAgICAgICAgZGF5czogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ3ZWVrX3Bhc3QscGFzdFwiOlxuICAgICAgcmV0dXJuIHdlZWtUaW1lKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICBjYXNlIFwibW9udGhfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgY3VycmVudERhdGUuZ2V0TW9udGgoKSAtIDEsIDEpLmdldFRpbWUoKTtcbiAgICBjYXNlIFwicXVhcnRlcl9wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBxdWFydGVyVGltZShuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gYWRkKGN1cnJlbnREYXRlLCB7XG4gICAgICAgIHllYXJzOiAtMVxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ5ZWFyX3Bhc3QscGFzdCxjYWxlbmRhclwiOlxuICAgICAgcmV0dXJuIGFkZChuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKSwge1xuICAgICAgICB5ZWFyczogLTFcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwieWVhcl9mdXR1cmUsZnV0dXJlLGNhbGVuZGFyXCI6XG4gICAgICByZXR1cm4gYWRkKG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCkgKyAxLCAwLCAxKSwge1xuICAgICAgICB5ZWFyczogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ0b2RheV9jdXJyZW50LGN1cnJlbnRcIjpcbiAgICAgIHJldHVybiBhZGQoY3VycmVudERhdGUsIHtcbiAgICAgICAgZGF5czogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ0b21vcnJvdyxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoY3VycmVudERhdGUsIHtcbiAgICAgICAgZGF5czogMVxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCI3X2RheXNfZnV0dXJlLGZ1dHVyZVwiOlxuICAgICAgcmV0dXJuIGFkZChjdXJyZW50RGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjEwX2RheXNfZnV0dXJlLGZ1dHVyZVwiOlxuICAgICAgcmV0dXJuIGFkZChjdXJyZW50RGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjE0X2RheXNfZnV0dXJlLGZ1dHVyZVwiOlxuICAgICAgcmV0dXJuIGFkZChjdXJyZW50RGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjMwX2RheXNfZnV0dXJlLGZ1dHVyZVwiOlxuICAgICAgcmV0dXJuIGFkZChjdXJyZW50RGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllc3RlcmRheSxwYXN0XCI6XG4gICAgICByZXR1cm4gYWRkKGN1cnJlbnREYXRlLCB7XG4gICAgICAgIGRheXM6IC0xXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjdfZGF5c19wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBhZGQoY3VycmVudERhdGUsIHtcbiAgICAgICAgZGF5czogLTdcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwiMTBfZGF5c19wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBhZGQoY3VycmVudERhdGUsIHtcbiAgICAgICAgZGF5czogLTEwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjE0X2RheXNfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gYWRkKGN1cnJlbnREYXRlLCB7XG4gICAgICAgIGRheXM6IC0xNFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCIzMF9kYXlzX3Bhc3QscGFzdFwiOlxuICAgICAgcmV0dXJuIGFkZChjdXJyZW50RGF0ZSwge1xuICAgICAgICBkYXlzOiAtMzBcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgfVxufVxuLy8qKioqKioqKioqKioqKioqKioqKioqIEdFVCBEQVRFICoqKioqKioqKioqKioqKioqKioqKioqKi8vXG5mdW5jdGlvbiBnZXRfZGF0ZV9nZXREYXRlKHF1ZXJ5S2V5KSB7XG4gIHZhciBkYXRlID0gbmV3IERhdGUoKTtcbiAgZnVuY3Rpb24gZ2V0TW9uZGF5KGQpIHtcbiAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgdmFyIGRheSA9IGQuZ2V0RGF5KCksXG4gICAgICBkaWZmID0gZC5nZXREYXRlKCkgLSBkYXkgKyA2ICsgKGRheSA9PSAwID8gKzYgOiAxKTtcbiAgICByZXR1cm4gbmV3IERhdGUoZC5zZXREYXRlKGRpZmYpKTtcbiAgfVxuICBmdW5jdGlvbiBnZXROZXh0V2VlayhkKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIHZhciBkYXkgPSBkLmdldERheSgpLFxuICAgICAgZGlmZiA9IGQuZ2V0RGF0ZSgpIC0gZGF5ICsgMTMgKyAoZGF5ID09IDAgPyAtNiA6IDEpO1xuICAgIHJldHVybiBuZXcgRGF0ZShkLnNldERhdGUoZGlmZikpO1xuICB9XG4gIGZ1bmN0aW9uIGdldFBhc3RXZWVrKGQpIHtcbiAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgdmFyIGRheSA9IGQuZ2V0RGF5KCksXG4gICAgICBkaWZmID0gZC5nZXREYXRlKCkgLSBkYXkgLSAxICsgKGRheSA9PSAwID8gLTYgOiAxKTtcbiAgICByZXR1cm4gbmV3IERhdGUoZC5zZXREYXRlKGRpZmYpKTtcbiAgfVxuICBsZXQgY3VycmVudFF1YXJ0ZXIgPSBNYXRoLmZsb29yKGRhdGUuZ2V0TW9udGgoKSAvIDMpO1xuICBsZXQgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgc3dpdGNoIChxdWVyeUtleSkge1xuICAgIGNhc2UgXCJuZXh0X2RheVwiOlxuICAgICAgcmV0dXJuIGFkZChkYXRlLCB7XG4gICAgICAgIGRheXM6IDFcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwidHdvX2RheXNfYWZ0ZXJcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAyXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInRocmVlX2RheXNfYWZ0ZXJcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAzXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcImZvdXJfZGF5c19hZnRlclwiOlxuICAgICAgcmV0dXJuIGFkZChkYXRlLCB7XG4gICAgICAgIGRheXM6IDRcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwibmV4dF93ZWVrXCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgd2Vla3M6IDFcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwidHdvX3dlZWtzX2FmdGVyXCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgd2Vla3M6IDJcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwidGhyZWVfd2Vla3NfYWZ0ZXJcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICB3ZWVrczogM1xuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ0aGlzX3N1bmRheVwiOlxuICAgICAgcmV0dXJuIHNldERheShkYXRlLCAwLCB7XG4gICAgICAgIHdlZWtTdGFydHNPbjogMVxuICAgICAgfSk7XG4gICAgY2FzZSBcInRoaXNfbW9uZGF5XCI6XG4gICAgICByZXR1cm4gc2V0RGF5KGRhdGUsIDEsIHtcbiAgICAgICAgd2Vla1N0YXJ0c09uOiAxXG4gICAgICB9KTtcbiAgICBjYXNlIFwidGhpc190dWVzZGF5XCI6XG4gICAgICByZXR1cm4gc2V0RGF5KGRhdGUsIDIsIHtcbiAgICAgICAgd2Vla1N0YXJ0c09uOiAxXG4gICAgICB9KTtcbiAgICBjYXNlIFwidGhpc193ZWRuZXNkYXlcIjpcbiAgICAgIHJldHVybiBzZXREYXkoZGF0ZSwgMywge1xuICAgICAgICB3ZWVrU3RhcnRzT246IDFcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJ0aGlzX3RodXJzZGF5XCI6XG4gICAgICByZXR1cm4gc2V0RGF5KGRhdGUsIDQsIHtcbiAgICAgICAgd2Vla1N0YXJ0c09uOiAxXG4gICAgICB9KTtcbiAgICBjYXNlIFwidGhpc19mcmlkYXlcIjpcbiAgICAgIHJldHVybiBzZXREYXkoZGF0ZSwgNSwge1xuICAgICAgICB3ZWVrU3RhcnRzT246IDFcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJ0aGlzX3NhdHVyZGF5XCI6XG4gICAgICByZXR1cm4gc2V0RGF5KGRhdGUsIDYsIHtcbiAgICAgICAgd2Vla1N0YXJ0c09uOiAxXG4gICAgICB9KTtcbiAgICBjYXNlIFwidG9kYXlfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgZGF5czogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ0b21vcnJvdyxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAxXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjdfZGF5c19mdXR1cmUsZnV0dXJlXCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgZGF5czogN1xuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCIxMF9kYXlzX2Z1dHVyZSxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAxMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCIxNF9kYXlzX2Z1dHVyZSxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAxNFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCIzMF9kYXlzX2Z1dHVyZSxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAzMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ5ZXN0ZXJkYXkscGFzdFwiOlxuICAgICAgcmV0dXJuIGFkZChkYXRlLCB7XG4gICAgICAgIGRheXM6IC0xXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjdfZGF5c19wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIjEwX2RheXNfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgZGF5czogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCIxNF9kYXlzX3Bhc3QscGFzdFwiOlxuICAgICAgcmV0dXJuIGFkZChkYXRlLCB7XG4gICAgICAgIGRheXM6IDBcbiAgICAgIH0pLmdldFRpbWUoKTtcbiAgICBjYXNlIFwiMzBfZGF5c19wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICBkYXlzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfZnV0dXJlLGZ1dHVyZSxjYWxlbmRhclwiOlxuICAgICAgcmV0dXJuIGFkZChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCkgKyAxLCAwLCAwKSwge1xuICAgICAgICB5ZWFyczogMVxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ5ZWFyX3Bhc3QscGFzdCxjYWxlbmRhclwiOlxuICAgICAgcmV0dXJuIGFkZChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDApLCB7XG4gICAgICAgIHllYXJzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIndlZWtfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gZ2V0TW9uZGF5KG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICBjYXNlIFwibW9udGhfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAwKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInF1YXJ0ZXJfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgKGN1cnJlbnRRdWFydGVyICsgMSkgKiAzLCAwKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfY3VycmVudCxjdXJyZW50XCI6XG4gICAgICByZXR1cm4gYWRkKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDApLCB7XG4gICAgICAgIHllYXJzOiAwXG4gICAgICB9KS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIndlZWtfbmV4dCxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBnZXROZXh0V2VlayhuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcIm1vbnRoX25leHQsZnV0dXJlXCI6XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAyLCAwKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInF1YXJ0ZXJfbmV4dCxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAoY3VycmVudFF1YXJ0ZXIgKyAxKSAqIDMgKyAzLCAwKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfbmV4dCxmdXR1cmVcIjpcbiAgICAgIHJldHVybiBhZGQoZGF0ZSwge1xuICAgICAgICB5ZWFyczogMVxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJ3ZWVrX3Bhc3QscGFzdFwiOlxuICAgICAgcmV0dXJuIGdldFBhc3RXZWVrKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICBjYXNlIFwibW9udGhfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDAsIDApLmdldFRpbWUoKTtcbiAgICBjYXNlIFwicXVhcnRlcl9wYXN0LHBhc3RcIjpcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAoY3VycmVudFF1YXJ0ZXIgKyAxKSAqIDMgLSAzLCAwKS5nZXRUaW1lKCk7XG4gICAgY2FzZSBcInllYXJfcGFzdCxwYXN0XCI6XG4gICAgICByZXR1cm4gYWRkKGRhdGUsIHtcbiAgICAgICAgZGF5czogMFxuICAgICAgfSkuZ2V0VGltZSgpO1xuICAgIGNhc2UgXCJub3dcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xuICB9XG59XG5cbi8vKioqKioqKioqKioqKioqKioqKioqKiBDSEVDSyBSRUNVUlJJTkcgREFURSAqKioqKioqKioqKioqKioqKioqKioqKiovL1xuXG5mdW5jdGlvbiBjaGVja1JlY3VycmluZ0RhdGUoZGF0ZSwgb3B0aW9uKSB7XG4gIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgc3dpdGNoIChvcHRpb24pIHtcbiAgICBjYXNlICdkYXknOlxuICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpICsgJy4nICsgZGF0ZS5nZXRNb250aCgpID09PSBjdXJyZW50RGF0ZS5nZXREYXRlKCkgKyAnLicgKyBjdXJyZW50RGF0ZS5nZXRNb250aCgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgbGV0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgICAgbGV0IHNoaWZ0ZWRZZWFyRGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgIHJldHVybiBpc1NhbWVXZWVrKHNoaWZ0ZWRZZWFyRGF0ZSwgY3VycmVudERhdGUpO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGlmIChkYXRlLmdldE1vbnRoKCkgPT09IGN1cnJlbnREYXRlLmdldE1vbnRoKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvbWVyZ2Vfb2JqZWN0cy9tZXJnZV9vYmplY3RzLmpzXG4vLyBWYWx1ZSBvZiBwcm9wZXJ0aWVzIGZvciBzb3VyY2Ugb2JqZWN0IHdvdW4ndCBiZSBjaGFuZ2VkIGJ5IHRhcmdldCBvYmplY3Rcbi8vIElmIHNvdXJjZSBvZiB0YXJnZXQgaGFzZSB1bmlxdWUgcHJvcGVydGllcyB0aGV5IGFyZSBnb2luZyB0byBiZSBjcmVhdGVkIGluIHJlc3VsdGVkIG9iamVjdFxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdHModGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICByZXR1cm4gZGVlcG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpO1xufVxuXG4vKiBEZWVwbWVyZ2UgLSBTdGFydCAqL1xuLy8gdGhpcyBjb2RlIHdhcyBjb3BpZWQgZnJvbSAgaHR0cHM6Ly9jb2RlcGVuLmlvL3B1c2hwYW5hdGhhbmsvcGVuL293akpHR1xuLy8gQmFzaWNhbHkgSSBuZWVkIGl0IHRvIG1hcmdlIGZpZWxkIG1vZGVsc1xuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsKSB7XG4gIHZhciBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xuICByZXR1cm4gbm9uTnVsbE9iamVjdCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fTtcbn1cbmZ1bmN0aW9uIGNsb25lSWZOZWNlc3NhcnkodmFsdWUsIG9wdGlvbnNBcmd1bWVudCkge1xuICB2YXIgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlO1xuICByZXR1cm4gY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdGlvbnNBcmd1bWVudCkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKCk7XG4gIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcG1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5pbmRleE9mKGUpID09PSAtMSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChjbG9uZUlmTmVjZXNzYXJ5KGUsIG9wdGlvbnNBcmd1bWVudCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0ge307XG4gIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXQpKSB7XG4gICAgT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVjZXNzYXJ5KHRhcmdldFtrZXldLCBvcHRpb25zQXJndW1lbnQpO1xuICAgIH0pO1xuICB9XG4gIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFpc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkgfHwgIXRhcmdldFtrZXldKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBtZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuZnVuY3Rpb24gZGVlcG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0ICE9PSB1bmRlZmluZWQgPyB0YXJnZXQgOiB7fTtcbiAgc291cmNlID0gc291cmNlICE9PSB1bmRlZmluZWQgPyBzb3VyY2UgOiB7fTtcbiAgdmFyIGFycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpO1xuICB2YXIgb3B0aW9ucyA9IG9wdGlvbnNBcmd1bWVudCB8fCB7XG4gICAgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2VcbiAgfTtcbiAgdmFyIGFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2U7XG4gIGlmIChhcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIDogY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpO1xuICB9XG59XG5kZWVwbWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zQXJndW1lbnQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKTtcbiAgfVxuXG4gIC8vIHdlIGFyZSBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCAyIHZhbHVlcywgc28gaXQgaXMgc2FmZSB0byBoYXZlIG5vIGluaXRpYWwgdmFsdWVcbiAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBkZWVwbWVyZ2UocHJldiwgbmV4dCwgb3B0aW9uc0FyZ3VtZW50KTtcbiAgfSk7XG59O1xuLyogRGVlcG1lcmdlIC0gRW5kcyAqL1xuXG4vLyAvLyBTYW1wbGVcbi8vIGNvbnN0IGRlZmF1bHRQZXJzb24gPSB7XG4vLyAgIG5hbWU6ICdQdXNoJyxcbi8vICAgZ2VuZGVyOiAnTWFsZScsXG4vLyAgIGhhaXI6IHtcbi8vICAgICBjb2xvcjogJ0JsYWNrJyxcbi8vICAgICBjdXQ6ICdTaG9ydCdcbi8vICAgfSxcbi8vICAgZXllczogJ2JsdWUnLFxuLy8gICBmYW1pbHk6IFsnbW9tJywgJ2RhZCddXG4vLyB9O1xuXG4vLyBjb25zdCBtZSA9IHtcbi8vICAgbmFtZTogJ05hdGhhbicsXG4vLyAgIGdlbmRlcjogJ01hbGUnLFxuLy8gICBoYWlyOiB7XG4vLyAgICAgY3V0OiAnTG9uZydcbi8vICAgfSxcbi8vICAgZmFtaWx5OiBbJ3dpZmUnLCAna2lkcycsICdkb2cnXVxuLy8gfTtcblxuLy8gY29uc3QgcmVzdWx0MSA9IGRlZXBtZXJnZShkZWZhdWx0UGVyc29uLCBtZSk7XG4vLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0MScpLmlubmVySFRNTCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdDEsIG51bGwsIFwiXFx0XCIpO1xuXG4vLyBjb25zdCByZXN1bHQyID0gZGVlcG1lcmdlLmFsbChbLFxuLy8gICB7IGxldmVsMTogeyBsZXZlbDI6IHsgbmFtZTogJ1B1c2gnLCBwYXJ0czogWydoZWFkJywgJ3Nob3VsZGVycyddIH0gfSB9LFxuLy8gICB7IGxldmVsMTogeyBsZXZlbDI6IHsgZmFjZTogJ1JvdW5kJywgcGFydHM6IFsna25lZXMnLCAndG9lcyddIH0gfSB9LFxuLy8gICB7IGxldmVsMTogeyBsZXZlbDI6IHsgZXllczogJ0JsYWNrJywgcGFydHM6IFsnZXllcyddIH0gfSB9LFxuLy8gXSk7XG5cbi8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQyJykuaW5uZXJIVE1MID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0MiwgbnVsbCwgXCJcXHRcIik7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvbWVyZ2VfY2h1bmtzL21lcmdlX2NodW5rcy53b3JrZXIuanNcbmZ1bmN0aW9uIG1lcmdlQ2h1bmtzKGNodW5rcykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY2h1bmtzLmZvckVhY2goY2h1bmsgPT4ge1xuICAgIGNodW5rLml0ZW1zX2xpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGRzdEl0ZW0gPSByZXN1bHRbaXRlbS5pdGVtX2lkXTtcbiAgICAgIGlmIChkc3RJdGVtKSB7XG4gICAgICAgIGRzdEl0ZW0udHJhc2ggPSBpdGVtLnRyYXNoO1xuICAgICAgICByZXR1cm4gaXRlbS5maWVsZHMuZm9yRWFjaChzcmNGaWVsZCA9PiB7XG4gICAgICAgICAgbGV0IGlzRmllbGROb25FeGlzdCA9IHRydWU7XG4gICAgICAgICAgZHN0SXRlbS5maWVsZHMgPSBkc3RJdGVtLmZpZWxkcy5tYXAoZHN0RmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKE51bWJlcihkc3RGaWVsZC5maWVsZF9pZCkgPT09IE51bWJlcihzcmNGaWVsZC5maWVsZF9pZCkpIHtcbiAgICAgICAgICAgICAgaXNGaWVsZE5vbkV4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgIGlmIChkc3RGaWVsZC5maWVsZF92YWx1ZSAhPSBzcmNGaWVsZC5maWVsZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAuLi5zcmNGaWVsZCxcbiAgICAgICAgICAgICAgICAgIGhpc3Rvcnk6IHNyY0ZpZWxkLmhpc3RvcnkuY29uY2F0KGRzdEZpZWxkLmhpc3RvcnkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZHN0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZHN0RmllbGQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzRmllbGROb25FeGlzdCkgZHN0SXRlbS5maWVsZHMucHVzaChzcmNGaWVsZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdFtpdGVtLml0ZW1faWRdID0gaXRlbTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdCk7XG59XG5zZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gIGNvbnN0IG1lcmdlZENodW5rcyA9IG1lcmdlQ2h1bmtzKGUuZGF0YSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UobWVyZ2VkQ2h1bmtzKTtcbn07XG5mdW5jdGlvbiBtZXJnZUNodW5rc1dvcmtlcigpIHtcbiAgcmV0dXJuIGBmdW5jdGlvbiBtZXJnZUNodW5rcyhjaHVua3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgXG4gICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XG4gICAgICBjaHVuay5pdGVtc19saXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgZHN0SXRlbSA9IHJlc3VsdFtpdGVtLml0ZW1faWRdO1xuICAgICAgICBpZiAoZHN0SXRlbSkge1xuICAgICAgICAgIGRzdEl0ZW0udHJhc2ggPSBpdGVtLnRyYXNoO1xuICAgICAgICAgIHJldHVybiBpdGVtLmZpZWxkcy5mb3JFYWNoKChzcmNGaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlzRmllbGROb25FeGlzdCA9IHRydWU7XG4gICAgICAgICAgICBkc3RJdGVtLmZpZWxkcyA9IGRzdEl0ZW0uZmllbGRzLm1hcCgoZHN0RmllbGQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKE51bWJlcihkc3RGaWVsZC5maWVsZF9pZCkgPT09IE51bWJlcihzcmNGaWVsZC5maWVsZF9pZCkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpZWxkTm9uRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZHN0RmllbGQuZmllbGRfdmFsdWUgIT0gc3JjRmllbGQuZmllbGRfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNyY0ZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBoaXN0b3J5OiBzcmNGaWVsZC5oaXN0b3J5LmNvbmNhdChkc3RGaWVsZC5oaXN0b3J5KSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkc3RGaWVsZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZHN0RmllbGQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc0ZpZWxkTm9uRXhpc3QpIGRzdEl0ZW0uZmllbGRzLnB1c2goc3JjRmllbGQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAocmVzdWx0W2l0ZW0uaXRlbV9pZF0gPSBpdGVtKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdCk7XG4gIH1cblxuXG4gIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgeyAgICAgIFxuICAgIGNvbnN0IG1lcmdlZENodW5rcyA9IG1lcmdlQ2h1bmtzKGUuZGF0YSk7XG4gICAgc2VsZi5wb3N0TWVzc2FnZShtZXJnZWRDaHVua3MpO1xuICB9YDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9tZXJnZV9jaHVua3MvbWVyZ2VfY2h1bmtzLmpzXG5cblxuLy8gY29uc3QgbWVyZ2VDaHVua3NXb3JrZXJTaW5nbGV0b25lID0gbmV3IFdvcmtlcignbWVyZ2VXb3JrZXIuanMnKTsgLy9UT0RPXG5cbmZ1bmN0aW9uIG1lcmdlX2NodW5rc19tZXJnZUNodW5rcyhjaHVua3MpIHtcbiAgLy9kb250IGxhdW5jaCBuZXcgdGhyZWFkIGJlY2F1c2UgYWxyZWFkeSB1c2VkIGluIHdvcmtlci5cbiAgLy8gTWFpbiByZWFzb24gaXMgdGhhdCByZW5kZXJlciBwcm9jZXNzIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHN0cnVjdHVyZWQgY2xvbmVzIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdHJoZWFkc1xuICByZXR1cm4gbWVyZ2VDaHVua3MoY2h1bmtzKTtcbiAgaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rV29ya2VyQmxvYiA9IG5ldyBCbG9iKFttZXJnZUNodW5rc1dvcmtlcigpXSwge1xuICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIlxuICAgICAgfSk7XG4gICAgICBsZXQgd29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGNodW5rV29ya2VyQmxvYikpO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGNodW5rcyk7XG4gICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmVzb2x2ZShlLmRhdGEpO1xuICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB9O1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZWplY3QoKTtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgfTtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShjaHVua3MpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtZXJnZUNodW5rcyhjaHVua3MpO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvbmVzdGVkX2xpc3QvbmVzdGVkX2xpc3QuanNcbmZ1bmN0aW9uIG1ha2VOZXN0ZWRMaXN0KGFyciwgaWQsIHBhcmVudF9pZCwgY2hpbGRyZW5fcHJvcGVydHksIHByaW9yaXR5X3Byb3BlcnR5KSB7XG4gIGxldCBhcnJheSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG4gIGxldCBjaGlsZHJlbiA9IEJvb2xlYW4oY2hpbGRyZW5fcHJvcGVydHkpID8gY2hpbGRyZW5fcHJvcGVydHkgOiAnY2hpbGRyZW4nO1xuICBsZXQgcHJpb3JpdHkgPSBCb29sZWFuKHByaW9yaXR5X3Byb3BlcnR5KSA/IHByaW9yaXR5X3Byb3BlcnR5IDogZmFsc2U7XG4gIGxldCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyYXlbaV1bcGFyZW50X2lkXSAmJiBhcnJheVtpXVtwYXJlbnRfaWRdICE9PSAwKSB7XG4gICAgICBhcnJheS5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICAgIGlmIChhcnJheVtpXVtwYXJlbnRfaWRdID09IHBhcmVudFtpZF0pIHtcbiAgICAgICAgICBpZiAoIXBhcmVudFtjaGlsZHJlbl0pIHtcbiAgICAgICAgICAgIHBhcmVudFtjaGlsZHJlbl0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50W2NoaWxkcmVuXS5wdXNoKGFycmF5W2ldKTtcbiAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgaSA9PSAwID8gaSA9IDAgOiBpLS07XG4gICAgICAgIH0gZWxzZSBpZiAocGFyZW50W2NoaWxkcmVuXSkge1xuICAgICAgICAgIGZpbmRJZHNPZkNoaWxkcmVuKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmaW5kSWRzT2ZDaGlsZHJlbihwYXJlbnQpIHtcbiAgICBwYXJlbnRbY2hpbGRyZW5dLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkW2lkXSA9PSBhcnJheVtpXVtwYXJlbnRfaWRdKSB7XG4gICAgICAgIGlmICghY2hpbGRbY2hpbGRyZW5dKSB7XG4gICAgICAgICAgY2hpbGRbY2hpbGRyZW5dID0gW107XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRbY2hpbGRyZW5dLnB1c2goYXJyYXlbaV0pO1xuICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGkgPT0gMCA/IGkgPSAwIDogaS0tO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZFtjaGlsZHJlbl0pIHtcbiAgICAgICAgZmluZElkc09mQ2hpbGRyZW4oY2hpbGQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHNvcnRDaGlsZHJlbnNCeVByaW9yaXR5KHVuc29ydGVkX2FycmF5KSB7XG4gICAgdW5zb3J0ZWRfYXJyYXkuc29ydCgoYSwgYikgPT4gYVtwcmlvcml0eV0gLSBiW3ByaW9yaXR5XSk7XG4gICAgdW5zb3J0ZWRfYXJyYXkuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50W2NoaWxkcmVuXSkge1xuICAgICAgICBzb3J0Q2hpbGRyZW5zQnlQcmlvcml0eShlbGVtZW50W2NoaWxkcmVuXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKHByaW9yaXR5KSB7XG4gICAgc29ydENoaWxkcmVuc0J5UHJpb3JpdHkoYXJyYXkpO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9NZXJnZUZpZWxkcy9NZXJnZUZpZWxkcy5qc1xuY2xhc3MgRmllbGRzT3BlcmF0b3Ige1xuICBjb25zdHJ1Y3RvcihndWRodWIpIHtcbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgfVxuICBtZXJnZUZpZWxkTGlzdHMoZmllbGRzVG9WaWV3LCBmaWVsZExpc3QpIHtcbiAgICBsZXQgZmllbGRzVG9WaWV3Q29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmllbGRzVG9WaWV3KSk7XG4gICAgbGV0IGZpZWxkTGlzdENvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZpZWxkTGlzdCkpO1xuICAgIGxldCBleGlzdGluZ0ZpZWxkc0lkcyA9IGZpZWxkTGlzdENvcHkubWFwKGZpZWxkID0+IGZpZWxkLmZpZWxkX2lkKTtcbiAgICBpZiAoIWZpZWxkTGlzdENvcHkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBmaWVsZExpc3RDb3B5LnJlZHVjZSgodmlld0FycmF5LCBjdXJyZW50RmllbGQpID0+IHtcbiAgICAgIGxldCBwb3NpdGlvbkluVmlld0FycmF5ID0gbnVsbDtcbiAgICAgIGxldCBwcm9wcyA9IHZpZXdBcnJheS5maW5kKCh2aWV3LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY3VycmVudEZpZWxkLmZpZWxkX2lkID09IHZpZXcuZmllbGRfaWQpIHtcbiAgICAgICAgICBwb3NpdGlvbkluVmlld0FycmF5ID0gaW5kZXg7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIGxldCBkZWZhdWx0SW50cnByID0gY3VycmVudEZpZWxkLmRhdGFfbW9kZWwgJiYgY3VycmVudEZpZWxkLmRhdGFfbW9kZWwuaW50ZXJwcmV0YXRpb24gPyBjdXJyZW50RmllbGQuZGF0YV9tb2RlbC5pbnRlcnByZXRhdGlvbi5maW5kKGludHJwciA9PiB7XG4gICAgICAgICAgcmV0dXJuIGludHJwci5zcmMgPT0gJ3RhYmxlJztcbiAgICAgICAgfSkgfHwge1xuICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBzaG93X2ZpZWxkOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9IDoge1xuICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBzaG93X2ZpZWxkOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVmYXVsdEludHJwci5zZXR0aW5ncy5zaG93X2ZpZWxkKSB7XG4gICAgICAgICAgbGV0IGZpcnN0TWVyZ2UgPSB0aGlzLmd1ZGh1Yi51dGlsLm1lcmdlT2JqZWN0cyh7XG4gICAgICAgICAgICBzaG93OiAxXG4gICAgICAgICAgfSwgZGVmYXVsdEludHJwcik7XG4gICAgICAgICAgbGV0IHNlY29uZE1lcmdlID0gdGhpcy5ndWRodWIudXRpbC5tZXJnZU9iamVjdHMoZmlyc3RNZXJnZSwgY3VycmVudEZpZWxkKTtcbiAgICAgICAgICB2aWV3QXJyYXkucHVzaChzZWNvbmRNZXJnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdBcnJheVtwb3NpdGlvbkluVmlld0FycmF5XSA9IHRoaXMuZ3VkaHViLnV0aWwubWVyZ2VPYmplY3RzKHZpZXdBcnJheVtwb3NpdGlvbkluVmlld0FycmF5XSwgY3VycmVudEZpZWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3QXJyYXk7XG4gICAgfSwgZmllbGRzVG9WaWV3Q29weSkuZmlsdGVyKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgcmV0dXJuIGZpZWxkLnNob3cgJiYgZXhpc3RpbmdGaWVsZHNJZHMuaW5kZXhPZihmaWVsZC5maWVsZF9pZCkgIT0gLTE7XG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlRmllbGRzTGlzdFRvVmlldyhhcHBJZCwgdGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgIGxldCBmaWVsZExpc3QgPSBhd2FpdCB0aGlzLmd1ZGh1Yi5nZXRGaWVsZE1vZGVscyhhcHBJZCk7XG4gICAgICBpZiAodGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGV0IGNvcnJlY3RGaWVsZExpc3QgPSBbXTtcbiAgICAgICAgdGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldy5mb3JFYWNoKChlbGVtZW50RnJvbVRhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGxldCBmaWVsZE9uUGlwZSA9IGZpZWxkTGlzdC5maW5kKGVsZW1lbnQgPT4gZWxlbWVudEZyb21UYWJsZS5maWVsZF9pZCA9PSBlbGVtZW50LmZpZWxkX2lkKTtcbiAgICAgICAgICBpZiAoZmllbGRPblBpcGUpIHtcbiAgICAgICAgICAgIGxldCBzaG93X2ZpZWxkID0gZmllbGRPblBpcGUuZGF0YV9tb2RlbC5pbnRlcnByZXRhdGlvbi5maW5kKGludHJwciA9PiBpbnRycHIuc3JjID09ICd0YWJsZScpO1xuICAgICAgICAgICAgaWYgKCFzaG93X2ZpZWxkKSB7XG4gICAgICAgICAgICAgIHNob3dfZmllbGQgPSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgIHNob3dfZmllbGQ6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3JyZWN0RmllbGRMaXN0LnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZF9pZDogZmllbGRPblBpcGUuZmllbGRfaWQsXG4gICAgICAgICAgICAgIHNob3c6IGVsZW1lbnRGcm9tVGFibGUuc2hvdyxcbiAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnRGcm9tVGFibGUud2lkdGggPyBlbGVtZW50RnJvbVRhYmxlLndpZHRoIDogXCIxNTBweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluZGV4ICsgMSA9PSB0YWJsZVNldHRpbmdzRmllbGRMaXN0VG9WaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2hlY2tGaWxlZEZyb21QaXBlKGNvcnJlY3RGaWVsZExpc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0ZpbGVkRnJvbVBpcGUodGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldyk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjaGVja0ZpbGVkRnJvbVBpcGUoY29ycmVjdEZpZWxkTGlzdCkge1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZpZWxkTGlzdC5mb3JFYWNoKChlbGVtZXRGcm9tUGlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgY29ycmVjdEZpZWwgPSBjb3JyZWN0RmllbGRMaXN0LmZpbmQoZWxlbWV0ID0+IGVsZW1ldEZyb21QaXBlLmZpZWxkX2lkID09IGVsZW1ldC5maWVsZF9pZCk7XG4gICAgICAgICAgaWYgKCFjb3JyZWN0RmllbCkge1xuICAgICAgICAgICAgc2VsZi5ndWRodWIuZ2hjb25zdHJ1Y3Rvci5nZXRJbnN0YW5jZShlbGVtZXRGcm9tUGlwZS5kYXRhX3R5cGUpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlID0gZGF0YS5nZXRUZW1wbGF0ZSgpO1xuICAgICAgICAgICAgICAgIGxldCBzaG93X2ZpZWxkID0gdGVtcGxhdGUubW9kZWwuZGF0YV9tb2RlbC5pbnRlcnByZXRhdGlvbi5maW5kKGludHJwciA9PiBpbnRycHIuc3JjID09ICd0YWJsZScpO1xuICAgICAgICAgICAgICAgIGlmICghc2hvd19maWVsZCkge1xuICAgICAgICAgICAgICAgICAgc2hvd19maWVsZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzaG93X2ZpZWxkOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvcnJlY3RGaWVsZExpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICBmaWVsZF9pZDogZWxlbWV0RnJvbVBpcGUuZmllbGRfaWQsXG4gICAgICAgICAgICAgICAgICBzaG93OiBzaG93X2ZpZWxkLnNldHRpbmdzLnNob3dfZmllbGRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlciA9PSBmaWVsZExpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb3JyZWN0RmllbGRMaXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gZXJyb3JDYWxsYmFjayhyZXN1bHQpIHtcbiAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID09IGZpZWxkTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoY29ycmVjdEZpZWxkTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjcmVhdGVGaWVsZHNMaXN0VG9WaWV3V2l0aERhdGFUeXBlKGFwcElkLCB0YWJsZVNldHRpbmdzRmllbGRMaXN0VG9WaWV3KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgbGV0IGNvbHVtbnNUb1ZpZXcgPSBbXTtcbiAgICAgIGxldCBmaWVsZExpc3QgPSBhd2FpdCB0aGlzLmd1ZGh1Yi5nZXRGaWVsZE1vZGVscyhhcHBJZCk7XG4gICAgICBsZXQgYWN0dWFsRmllbGRJZHMgPSBmaWVsZExpc3QubWFwKGZpZWxkID0+ICtmaWVsZC5maWVsZF9pZCk7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgY29sdW1uc1RvVmlldyA9IGZpZWxkTGlzdC5yZWR1Y2UoKHZpZXdDb2x1bXNMaXN0LCBjdXJyZW50RmllbGQpID0+IHtcbiAgICAgICAgbGV0IGZpZWxkID0gdmlld0NvbHVtc0xpc3QuZmluZCgodmlldywgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmZpZWxkX2lkID09IHZpZXcuZmllbGRfaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgdmlld0NvbHVtc0xpc3QucHVzaCh7XG4gICAgICAgICAgICBmaWVsZF9pZDogY3VycmVudEZpZWxkLmZpZWxkX2lkLFxuICAgICAgICAgICAgZGF0YV90eXBlOiBjdXJyZW50RmllbGQuZGF0YV90eXBlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5ndWRodWIuZ2hjb25zdHJ1Y3Rvci5nZXRJbnN0YW5jZShjdXJyZW50RmllbGQuZGF0YV90eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gaW5zdGFuY2UuZ2V0VGVtcGxhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRJbnRlcHJldGF0aW9uID0gdGVtcGxhdGUubW9kZWwuZGF0YV9tb2RlbC5pbnRlcnByZXRhdGlvbi5maW5kKGludHJwciA9PiBpbnRycHIuc3JjID09ICd0YWJsZScpIHx8IHtcbiAgICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICBzaG93X2ZpZWxkOiAxXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWV3Q29sdW1zTGlzdC5maW5kKHZpZXcgPT4gdmlldy5maWVsZF9pZCA9PSBjdXJyZW50RmllbGQuZmllbGRfaWQpLnNob3cgPSBkZWZhdWx0SW50ZXByZXRhdGlvbi5zZXR0aW5ncy5zaG93X2ZpZWxkO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdDb2x1bXNMaXN0O1xuICAgICAgfSwgdGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldyk7XG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbHVtbnNUb1ZpZXcgPSBjb2x1bW5zVG9WaWV3LmZpbHRlcihmaWVsZCA9PiBhY3R1YWxGaWVsZElkcy5pbmRleE9mKGZpZWxkLmZpZWxkX2lkKSAhPSAtMSk7XG4gICAgICAgIHJlc29sdmUoY29sdW1uc1RvVmlldyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL0l0ZW1zU2VsZWN0aW9uL0l0ZW1zU2VsZWN0aW9uLmpzXG5jbGFzcyBJdGVtc1NlbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1Yikge1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHt9O1xuICB9XG4gIGFzeW5jIHNlbGVjdEl0ZW1zKGFwcElkLCBpdGVtcykge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGFwcElkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zW2FwcElkXSA9IHtcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBhcHA6IFtdXG4gICAgICB9O1xuICAgICAgbGV0IGFwcCA9IGF3YWl0IHRoaXMuZ3VkaHViLmdldEFwcChhcHBJZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNbYXBwSWRdLmFwcCA9IGFwcDtcbiAgICB9XG4gICAgbGV0IGl0ZW1PYmplY3QgPSB0aGlzLnNlbGVjdGVkSXRlbXNbYXBwSWRdO1xuICAgIGxldCBzZWxlY3RlZEl0ZW1zSWRzID0gaXRlbU9iamVjdC5pdGVtcy5tYXAob2JqID0+IG9iai5pdGVtX2lkKTtcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlbXNJZHMuaW5kZXhPZihpdGVtLml0ZW1faWQpICE9IC0xKSB7XG4gICAgICAgIGl0ZW1PYmplY3QuaXRlbXMuc3BsaWNlKHNlbGVjdGVkSXRlbXNJZHMuaW5kZXhPZihpdGVtLml0ZW1faWQpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1PYmplY3QuaXRlbXNbaXRlbU9iamVjdC5pdGVtcy5sZW5ndGhdID0gaXRlbTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRTZWxlY3RlZEl0ZW1zKGFwcElkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtc1thcHBJZF0gPyB0aGlzLnNlbGVjdGVkSXRlbXNbYXBwSWRdIDoge1xuICAgICAgaXRlbXM6IFtdLFxuICAgICAgYXBwOiBbXVxuICAgIH07XG4gIH1cbiAgY2xlYXJTZWxlY3RlZEl0ZW1zKGFwcElkKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtc1thcHBJZF0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc1thcHBJZF0uaXRlbXMgPSBbXTtcbiAgICB9XG4gIH1cbiAgaXNJdGVtU2VsZWN0ZWQoYXBwSWQsIGl0ZW1JZCkge1xuICAgIGxldCBhcnJheSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcyhhcHBJZCk7XG4gICAgaWYgKGFycmF5ICE9PSBudWxsKSB7XG4gICAgICBhcnJheSA9IGFycmF5Lml0ZW1zLm1hcChvYmogPT4gb2JqLml0ZW1faWQpO1xuICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbUlkKSAhPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL2NvbXBhcmVfaXRlbXNfbGlzdHNfd29ya2VyL2NvbXBhcmVfaXRlbXNfbGlzdHMud29ya2VyLmpzXG5mdW5jdGlvbiBjb21wYXJlX2l0ZW1zX2xpc3RzX1dvcmtlcigpIHtcbiAgcmV0dXJuIGBmdW5jdGlvbiBjcmVhdGVMaXN0KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShcbiAgICAgIChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgYWNjLmxpc3RbaXRlbS5pdGVtX2lkXSA9IGl0ZW07XG4gICAgICAgIGFjYy5pZHMucHVzaChpdGVtLml0ZW1faWQpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHsgaWRzOiBbXSwgbGlzdDoge30gfVxuICAgICk7XG4gIH07XG4gIGZ1bmN0aW9uIGNvbXBhcmVJdGVtc0xpc3RzKG9sZEl0ZW1zLCBuZXdJdGVtcykge1xuICAgIGNvbnN0IHsgaWRzOiBvbGRJZHMsIGxpc3Q6IG9sZExpc3QgfSA9IGNyZWF0ZUxpc3Qob2xkSXRlbXMpO1xuICAgIGNvbnN0IHsgaWRzOiBuZXdJZHMsIGxpc3Q6IG5ld0xpc3QgfSA9IGNyZWF0ZUxpc3QobmV3SXRlbXMpO1xuXG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zSWRzID0gb2xkSWRzLmZpbHRlcigoaWQpID0+ICFuZXdJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICBjb25zdCByZWNlbnRJdGVtc0lkcyA9IG9sZElkcy5maWx0ZXIoKGlkKSA9PiAhZGVsZXRlZEl0ZW1zSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgY29uc3QgbmV3SXRlbXNJZHMgPSBuZXdJZHMuZmlsdGVyKChpZCkgPT4gIW9sZElkcy5pbmNsdWRlcyhpZCkpO1xuXG4gICAgY29uc3QgZGlmZl9maWVsZHNfaXRlbXMgPSB7fTtcbiAgICBjb25zdCBkaWZmX2ZpZWxkc19pdGVtc19JZHMgPSBbXTtcbiAgICBcbiAgICByZWNlbnRJdGVtc0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgbmV3SXRlbSA9IG5ld0xpc3RbaWRdO1xuICAgICAgY29uc3Qgb2xkSXRlbSA9IG9sZExpc3RbaWRdO1xuXG4gICAgICBvbGRJdGVtLmZpZWxkcy5mb3JFYWNoKChmaWVsZDEpID0+IHtcbiAgICAgICAgY29uc3Qgc2FtZUZpZWxkID0gbmV3SXRlbS5maWVsZHMuZmluZChcbiAgICAgICAgICAoZmllbGQyKSA9PiBOdW1iZXIoZmllbGQyLmZpZWxkX2lkKSA9PT0gTnVtYmVyKGZpZWxkMS5maWVsZF9pZClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXNhbWVGaWVsZCkge1xuICAgICAgICAgIGlmICghZGlmZl9maWVsZHNfaXRlbXNbbmV3SXRlbS5pdGVtX2lkXSkge1xuICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXNbbmV3SXRlbS5pdGVtX2lkXSA9IFtdO1xuICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXNfSWRzLnB1c2gobmV3SXRlbS5pdGVtX2lkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGlmZl9maWVsZHNfaXRlbXNbbmV3SXRlbS5pdGVtX2lkXS5wdXNoKGZpZWxkMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQxLmZpZWxkX3ZhbHVlICE9IHNhbWVGaWVsZC5maWVsZF92YWx1ZSkge1xuICAgICAgICAgIGlmICghZGlmZl9maWVsZHNfaXRlbXNbbmV3SXRlbS5pdGVtX2lkXSkge1xuICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXNbbmV3SXRlbS5pdGVtX2lkXSA9IFtdO1xuICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXNfSWRzLnB1c2gobmV3SXRlbS5pdGVtX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpZmZfZmllbGRzX2l0ZW1zW25ld0l0ZW0uaXRlbV9pZF0ucHVzaChmaWVsZDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuZXdJdGVtczogbmV3SXRlbXNJZHMucmVkdWNlKChhY2MsIGlkKSA9PiB7XG4gICAgICAgIGFjYy5wdXNoKG5ld0xpc3RbaWRdKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKSxcbiAgICAgIGRlbGV0ZWRJdGVtczogZGVsZXRlZEl0ZW1zSWRzLnJlZHVjZSgoYWNjLCBpZCkgPT4ge1xuICAgICAgICBhY2MucHVzaChvbGRMaXN0W2lkXSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSksXG4gICAgICBkaWZmX2ZpZWxkc19pdGVtc19JZHMsXG4gICAgICBkaWZmX2ZpZWxkc19pdGVtcyxcbiAgICAgIGRpZmZfaXRlbXM6IGRpZmZfZmllbGRzX2l0ZW1zX0lkcy5yZWR1Y2UoKGFjYywgaWQpID0+IHtcbiAgICAgICAgYWNjLnB1c2gob2xkTGlzdFtpZF0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10pLFxuICAgIH07XG4gIH1cblxuICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgaXRlbXNfbGlzdDEsIGl0ZW1zX2xpc3QyIH0gPSBldmVudC5kYXRhO1xuXG4gICAgY29uc3QgZGlmZiA9IGNvbXBhcmVJdGVtc0xpc3RzKGl0ZW1zX2xpc3QxLCBpdGVtc19saXN0Mik7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGRpZmYgfSk7XG4gIH0pO2A7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvanNvbl9jb25zdHJ1Y3Rvci9qc29uX2NvbnN0cnVjdG9yLmpzXG5mdW5jdGlvbiBjb21waWxlcihzY2hlbWUsIGl0ZW0sIHV0aWwsIHZhcmlhYmxlcywgYXBwSWQpIHtcbiAgYXN5bmMgZnVuY3Rpb24gc2NoZW1lQ29tcGlsZXIoc2NoZW1lLCBpdGVtLCBhcHBJZCkge1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgaWYgKHNjaGVtZS50eXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgIC8vIGdldCBwcm9wZXJ0aWVzIHZhbHVlIGZvciBhcnJheSBjaGlsZHMgZm9yIGVhY2ggYXBwbGljYXRpb24gaXRlbVxuICAgICAgaWYgKE51bWJlcihzY2hlbWUuaXNfc3RhdGljKSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheShhd2FpdCBnZXRDaGlsZHNQcm9wZXJ0aWVzT2JqZWN0KHNjaGVtZS5jaGlsZHMsIGl0ZW0sIGFwcElkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGF3YWl0IGdldEFycmF5T2ZJdGVtc1dpdGhQcm9wZXJ0aWVzKHNjaGVtZSwgaXRlbSwgYXBwSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2NoZW1lLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8vIGdldCBwcm9wZXJ0aWVzIHZhbHVlIGZvciBvYmplY3QgY2hpbGRzXG4gICAgICBpZiAoTnVtYmVyKHNjaGVtZS5jdXJyZW50X2l0ZW0pKSB7XG4gICAgICAgIHZhbHVlID0gYXdhaXQgZ2V0SXRlbVdpdGhQcm9wZXJ0aWVzKHNjaGVtZSwgaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGF3YWl0IGdldENoaWxkc1Byb3BlcnRpZXNPYmplY3Qoc2NoZW1lLmNoaWxkcywgaXRlbSwgYXBwSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2NoZW1lLnR5cGUgPT09IFwicHJvcGVydHlcIikge1xuICAgICAgLy8gZ2V0IHByb3BlcnRpZXMgdmFsdWVcbiAgICAgIHZhbHVlID0gYXdhaXQgZ2V0RmllbGRWYWx1ZShzY2hlbWUsIGl0ZW0sIGFwcElkKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHNjaGVtZS50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWUpIHtcbiAgICAgICAgaWYgKHNjaGVtZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNjaGVtZVtrZXldO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNjaGVtZUNvbXBpbGVyKGVsZW1lbnQsIGl0ZW0sIGFwcElkKTtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHJlc1tlbGVtZW50LnByb3BlcnR5X25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgW3NjaGVtZS5wcm9wZXJ0eV9uYW1lXTogdmFsdWVcbiAgICB9O1xuICB9XG5cbiAgLyogR2V0IHByb3BlcnRpZXMgdmFsdWUgZm9yIGFycmF5IGNoaWxkcyBpbiBzY2hlbWUsIGZvciBlYWNoIGFwcGxpY2F0aW9uIGZpbHRlcmVkIGl0ZW0uICovXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFycmF5T2ZJdGVtc1dpdGhQcm9wZXJ0aWVzKHNjaGVtZSwgaXRlbSwgcmVjaWV2ZWRBcHApIHtcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB1dGlsLmd1ZGh1Yi5nZXRBcHAoTnVtYmVyKHNjaGVtZS5hcHBfaWQpKTtcbiAgICBsZXQgZmlsdGVyZWRJdGVtcyA9IGF3YWl0IGZpbHRlckl0ZW1zKHNjaGVtZS5maWx0ZXIsIGFwcC5pdGVtc19saXN0LCByZWNpZXZlZEFwcCwgaXRlbSk7XG4gICAgaWYgKHNjaGVtZS5pc1NvcnRhYmxlICYmIHNjaGVtZS5maWVsZF9pZF90b19zb3J0ICYmIHNjaGVtZS5maWVsZF9pZF90b19zb3J0ICE9PSAnJykge1xuICAgICAgbGV0IGl0ZW1zV2l0aFZhbHVlID0gZmlsdGVyZWRJdGVtcy5mbGF0TWFwKGl0ZW0gPT4ge1xuICAgICAgICBsZXQgZmllbGRUb1NvcnQgPSBpdGVtLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkX2lkID09IHNjaGVtZS5maWVsZF9pZF90b19zb3J0KTtcbiAgICAgICAgaWYgKCFmaWVsZFRvU29ydCB8fCBmaWVsZFRvU29ydC5maWVsZF92YWx1ZSA9PSAnJykge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgaXRlbXNXaXRob3V0VmFsdWUgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgaWYgKCFpdGVtc1dpdGhWYWx1ZS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGl0ZW1zV2l0aFZhbHVlID0gaXRlbXNXaXRoVmFsdWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoc2NoZW1lLnNvcnRUeXBlID09ICdkZXNjJykge1xuICAgICAgICAgIHJldHVybiBiLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkX2lkID09IHNjaGVtZS5maWVsZF9pZF90b19zb3J0KS5maWVsZF92YWx1ZSAtIGEuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQuZmllbGRfaWQgPT0gc2NoZW1lLmZpZWxkX2lkX3RvX3NvcnQpLmZpZWxkX3ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBhLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkX2lkID09IHNjaGVtZS5maWVsZF9pZF90b19zb3J0KS5maWVsZF92YWx1ZSAtIGIuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQuZmllbGRfaWQgPT0gc2NoZW1lLmZpZWxkX2lkX3RvX3NvcnQpLmZpZWxkX3ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBbLi4uaXRlbXNXaXRoVmFsdWUsIC4uLml0ZW1zV2l0aG91dFZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHNjaGVtZS5vZmZzZXQpIHtcbiAgICAgIGxldCBvZmZzZXQ7XG4gICAgICBpZiAoc2NoZW1lLnVzZV92YXJpYWJsZXNfZm9yX2xpbWl0X2FuZF9vZmZzZXQgJiYgdmFyaWFibGVzKSB7XG4gICAgICAgIG9mZnNldCA9IHZhcmlhYmxlc1tzY2hlbWUub2Zmc2V0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldCA9IC9eWzAtOV0rJC8udGVzdChzY2hlbWUub2Zmc2V0KSA/IHNjaGVtZS5vZmZzZXQgOiAwO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuc2xpY2Uob2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKHNjaGVtZS5saW1pdCkge1xuICAgICAgbGV0IGxpbWl0O1xuICAgICAgaWYgKHNjaGVtZS51c2VfdmFyaWFibGVzX2Zvcl9saW1pdF9hbmRfb2Zmc2V0ICYmIHZhcmlhYmxlcykge1xuICAgICAgICBsaW1pdCA9IHZhcmlhYmxlc1tzY2hlbWUubGltaXRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGltaXQgPSAvXlswLTldKyQvLnRlc3Qoc2NoZW1lLmxpbWl0KSB8fCAwO1xuICAgICAgfVxuICAgICAgaWYgKGxpbWl0ICE9PSAwKSB7XG4gICAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLnNsaWNlKDAsIGxpbWl0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJyYXlPZkl0ZW1zV2l0aFByb3BlcnRpZXMgPSBmaWx0ZXJlZEl0ZW1zLm1hcChhc3luYyBpdGVtID0+IHtcbiAgICAgIHJldHVybiBnZXRDaGlsZHNQcm9wZXJ0aWVzT2JqZWN0KHNjaGVtZS5jaGlsZHMsIGl0ZW0sIGFwcC5hcHBfaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChhcnJheU9mSXRlbXNXaXRoUHJvcGVydGllcyk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0SXRlbVdpdGhQcm9wZXJ0aWVzKHNjaGVtZSwgaXRlbSkge1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHV0aWwuZ3VkaHViLmdldEFwcChzY2hlbWUuYXBwX2lkKTtcbiAgICBjb25zdCBpdGVtcyA9IGFwcC5pdGVtc19saXN0IHx8IFtdO1xuICAgIHJldHVybiBnZXRDaGlsZHNQcm9wZXJ0aWVzT2JqZWN0KHNjaGVtZS5jaGlsZHMsIGl0ZW0gfHwgaXRlbXNbMF0sIGFwcC5hcHBfaWQpO1xuICB9XG5cbiAgLyogR2V0IHByb3BlcnRpZXMgdmFsdWUgZm9yIG9iamVjdCBjaGlsZHMgaW4gc2NoZW1lLiAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRDaGlsZHNQcm9wZXJ0aWVzT2JqZWN0KHByb3BlcnRpZXMsIGl0ZW0sIGFwcElkKSB7XG4gICAgY29uc3QgcHJvcGVydGllc0FycmF5ID0gYXdhaXQgcHJvcGVydGllcy5tYXAoYXN5bmMgY2hpbGQgPT4ge1xuICAgICAgcmV0dXJuIHNjaGVtZUNvbXBpbGVyKGNoaWxkLCBpdGVtLCBhcHBJZCk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzb2x2ZWRQcm9wZXJ0aWVzQXJyYXkgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9wZXJ0aWVzQXJyYXkpO1xuICAgIHJldHVybiByZXNvbHZlZFByb3BlcnRpZXNBcnJheS5yZWR1Y2UoKGFjYywgb2JqZWN0KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIC4uLm9iamVjdFxuICAgICAgfTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKiBHZXQgcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gaW50ZXJwcmV0YXRpb24gdmFsdWUgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShzY2hlbWUsIGl0ZW0sIGFwcElkKSB7XG4gICAgc3dpdGNoIChzY2hlbWUucHJvcGVydHlfdHlwZSkge1xuICAgICAgY2FzZSBcInN0YXRpY1wiOlxuICAgICAgICByZXR1cm4gc2NoZW1lLnN0YXRpY19maWVsZF92YWx1ZTtcbiAgICAgIGNhc2UgXCJ2YXJpYWJsZVwiOlxuICAgICAgICBzd2l0Y2ggKHNjaGVtZS52YXJpYWJsZV90eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFwcF9pZFwiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcElkO1xuICAgICAgICAgIC8vIGNhc2UgXCJ1c2VyX2lkXCI6XG4gICAgICAgICAgLy8gICByZXNvbHZlKHN0b3JhZ2UuZ2V0VXNlcigpLnVzZXJfaWQpO1xuICAgICAgICAgIC8vICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImN1cnJlbnRfaXRlbVwiOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYCR7YXBwSWR9LiR7aXRlbS5pdGVtX2lkfWA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJmaWVsZF9pZFwiOlxuICAgICAgICByZXR1cm4gc2NoZW1lLmZpZWxkX2lkO1xuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1lLmZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtZS5mdW5jdGlvbihpdGVtLCBhcHBJZCwgdXRpbC5ndWRodWIsIC4uLnNjaGVtZS5hcmdzKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2l0ZW0sIGFwcElkLCBndWRodWInLCAncmV0dXJuIChhc3luYyAnICsgc2NoZW1lLmZ1bmN0aW9uICsgJykoaXRlbSwgYXBwSWQsIGd1ZGh1YiknKTtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZnVuYyhpdGVtLCBhcHBJZCwgdXRpbC5ndWRodWIpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJmaWVsZF92YWx1ZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKCFzY2hlbWUuZmllbGRfaWQgJiYgc2NoZW1lLm5hbWVfc3BhY2UpIHtcbiAgICAgICAgICBzY2hlbWUuZmllbGRfaWQgPSBhd2FpdCB1dGlsLmd1ZGh1Yi5nZXRGaWVsZElkQnlOYW1lU3BhY2UoYXBwSWQsIHNjaGVtZS5uYW1lX3NwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQm9vbGVhbihOdW1iZXIoc2NoZW1lLmludGVycHJldGF0aW9uKSkpIHtcbiAgICAgICAgICBsZXQgaW50ZXJwcmV0YXRlZFZhbHVlID0gYXdhaXQgdXRpbC5ndWRodWIuZ2V0SW50ZXJwcmV0YXRpb25CeUlkKE51bWJlcihhcHBJZCksIE51bWJlcihpdGVtLml0ZW1faWQpLCBOdW1iZXIoc2NoZW1lLmZpZWxkX2lkKSwgJ3ZhbHVlJyk7XG4gICAgICAgICAgcmV0dXJuIGludGVycHJldGF0ZWRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCB1dGlsLmd1ZGh1Yi5nZXRGaWVsZFZhbHVlKE51bWJlcihhcHBJZCksIE51bWJlcihpdGVtLml0ZW1faWQpLCBOdW1iZXIoc2NoZW1lLmZpZWxkX2lkKSk7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGdldEZpbHRlcmVkSXRlbXMoZmlsdGVyc0xpc3QsIGVsZW1lbnRfYXBwX2lkLCBhcHBfaWQsIGl0ZW1faWQsIGl0ZW1zTGlzdCkge1xuICAgIGNvbnN0IG1vZGlmaWVkX2ZpbHRlcnNfbGlzdCA9IGF3YWl0IHV0aWwuZ3VkaHViLnByZWZpbHRlcihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZpbHRlcnNMaXN0KSksIHtcbiAgICAgIGVsZW1lbnRfYXBwX2lkLFxuICAgICAgYXBwX2lkLFxuICAgICAgaXRlbV9pZCxcbiAgICAgIC4uLnZhcmlhYmxlc1xuICAgIH0pO1xuICAgIHJldHVybiB1dGlsLmd1ZGh1Yi5maWx0ZXIoaXRlbXNMaXN0LCBbLi4ubW9kaWZpZWRfZmlsdGVyc19saXN0LCAuLi5maWx0ZXJzTGlzdF0pO1xuICB9XG5cbiAgLyogRmlsdGVyIGl0ZW1zIGJ5IHNjaGVtZSBmaWx0ZXIgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZmlsdGVySXRlbXMoZmlsdGVyc0xpc3QgPSBbXSwgaXRlbXNMaXN0ID0gW10sIGFwcElkID0gJycsIGl0ZW0gPSB7fSkge1xuICAgIHJldHVybiBmaWx0ZXJzTGlzdC5sZW5ndGggPyBnZXRGaWx0ZXJlZEl0ZW1zKGZpbHRlcnNMaXN0LCBhcHBJZCwgYXBwSWQsIGl0ZW0uaXRlbV9pZCwgaXRlbXNMaXN0KSA6IFsuLi5pdGVtc0xpc3RdO1xuICB9XG4gIHJldHVybiBzY2hlbWVDb21waWxlcihzY2hlbWUsIGl0ZW0sIGFwcElkLCB2YXJpYWJsZXMpO1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL0FwcHNUZW1wbGF0ZVNlcnZpY2UvQXBwc1RlbXBsYXRlU2VydmljZS5qc1xuY2xhc3MgQXBwc1RlbXBsYXRlU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1Yikge1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICAgIHRoaXMuYXBwc0Nvbm5lY3RpbmdNYXAgPSB7XG4gICAgICBhcHBzOiBbXSxcbiAgICAgIGZpZWxkczogW10sXG4gICAgICBpdGVtczogW10sXG4gICAgICB2aWV3czogW11cbiAgICB9O1xuICB9XG4gIGNyZWF0ZUFwcHNGcm9tVGVtcGxhdGUocGFjaywgbWF4TnVtYmVyT2ZJbnNzdGFsbGVkSXRlbXMsIHByb2dyZXNzQ2FsbGJhY2ssIGluc3RhbGxGcm9tTWFzdGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3Qgc3RlcHNDb3VudCA9IHBhY2suYXBwcy5sZW5ndGggKiA2O1xuICAgICAgY29uc3Qgc3RlcFBlcmNlbnRzID0gMTAwIC8gc3RlcHNDb3VudDtcbiAgICAgIGxldCBjdXJyZW50U3RlcCA9IDA7XG4gICAgICBzZWxmLmNyZWF0ZUFwcHMocGFjaywgc3RhdHVzID0+IHtcbiAgICAgICAgY3VycmVudFN0ZXAgKz0gMTtcbiAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjayA/IHByb2dyZXNzQ2FsbGJhY2suY2FsbCh0aGlzLCB7XG4gICAgICAgICAgcGVyY2VudDogY3VycmVudFN0ZXAgKiBzdGVwUGVyY2VudHMsXG4gICAgICAgICAgc3RhdHVzXG4gICAgICAgIH0pIDogbnVsbDtcbiAgICAgIH0sIGluc3RhbGxGcm9tTWFzdGVyKS50aGVuKHN1Y2Nlc3MgPT4ge1xuICAgICAgICBzZWxmLmNyZWF0ZUl0ZW1zKHN1Y2Nlc3MsIG1heE51bWJlck9mSW5zc3RhbGxlZEl0ZW1zLCBzdGF0dXMgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY3VycmVudFN0ZXAgKz0gMTtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2sgPyBwcm9ncmVzc0NhbGxiYWNrLmNhbGwodGhpcywge1xuICAgICAgICAgICAgICBwZXJjZW50OiBjdXJyZW50U3RlcCAqIHN0ZXBQZXJjZW50cyxcbiAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICB9KSA6IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjayA/IHByb2dyZXNzQ2FsbGJhY2suY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIHN0YXR1czogJ0RvbmUnLFxuICAgICAgICAgICAgICBhcHBzOiBzdGF0dXNcbiAgICAgICAgICAgIH0pIDogbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGluc3RhbGxGcm9tTWFzdGVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUl0ZW1zKGNyZWF0ZV9hcHBzLCBtYXhOdW1iZXJPZkluc3N0YWxsZWRJdGVtcywgY2FsbGJhY2ssIGluc3RhbGxGcm9tTWFzdGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgTUFYX05VTUJFUl9PRl9JTlNUQUxMRURfSVRFTVMgPSBtYXhOdW1iZXJPZkluc3N0YWxsZWRJdGVtcyA/IG1heE51bWJlck9mSW5zc3RhbGxlZEl0ZW1zIDogMTAwMDAwO1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBsZXQgY3JlYXRlc0l0ZW1zID0gW107XG4gICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjZXNzdG9rZW5cbiAgICAgIH0gPSBhd2FpdCBzZWxmLmd1ZGh1Yi5yZXEuYXhpb3NSZXF1ZXN0KHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ3VkaHViLmNvbS9HdWRIdWJfVGVzdC9hdXRoL2xvZ2luJyxcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGF1dGhfa2V5OiAnM0hNT3RDYkMwTS8xLzFlNHk0VXhvL0toL2FGTjRWNUxHMi8vNWl4eDdUWnlpVWZNYjdJSEFBSENqOVBzTHJPU0RyWnV1V2tiWDRCSVgyM2Y1MUgrZUE9PSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjcmVhdGVfYXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoYXN5bmMgYXBwX3Jlc29sdmUgPT4ge1xuICAgICAgICAgIGxldCByZXN1bHRfYXBwO1xuICAgICAgICAgIGlmIChpbnN0YWxsRnJvbU1hc3Rlcikge1xuICAgICAgICAgICAgcmVzdWx0X2FwcCA9IGF3YWl0IHNlbGYuZ3VkaHViLnJlcS5heGlvc1JlcXVlc3Qoe1xuICAgICAgICAgICAgICB1cmw6IGBodHRwczovL2d1ZGh1Yi5jb20vR3VkSHViX1Rlc3QvYXBpL2FwcC9nZXQ/dG9rZW49JHthY2Nlc3N0b2tlbn0mYXBwX2lkPSR7c2VsZi5fc2VhcmNoT2xkQXBwSWQoYXBwLmFwcF9pZCwgc2VsZi5hcHBzQ29ubmVjdGluZ01hcC5hcHBzKX1gLFxuICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0X2FwcCA9IGF3YWl0IHNlbGYuZ3VkaHViLmdldEFwcChzZWxmLl9zZWFyY2hPbGRBcHBJZChhcHAuYXBwX2lkLCBzZWxmLmFwcHNDb25uZWN0aW5nTWFwLmFwcHMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2sgPyBjYWxsYmFjay5jYWxsKHRoaXMsIGBHRVQgQVBQOiAke3Jlc3VsdF9hcHAuYXBwX25hbWV9IChJdGVtcyBzdGVwcylgKSA6IG51bGw7XG4gICAgICAgICAgbGV0IHNvdXJjZV9hcHAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdF9hcHApKTtcbiAgICAgICAgICBsZXQgaXRlbXMgPSBzb3VyY2VfYXBwLml0ZW1zX2xpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaW5kZXhfbnVtYmVyOiBpdGVtLmluZGV4X251bWJlcixcbiAgICAgICAgICAgICAgaXRlbV9pZDogMCxcbiAgICAgICAgICAgICAgZmllbGRzOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KS5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiBpbmRleCA8PSBNQVhfTlVNQkVSX09GX0lOU1RBTExFRF9JVEVNUyk7XG4gICAgICAgICAgc2VsZi5ndWRodWIuYWRkTmV3SXRlbXMoYXBwLmFwcF9pZCwgaXRlbXMpLnRoZW4oaXRlbXMgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sgPyBjYWxsYmFjay5jYWxsKHRoaXMsIGBBREQgTkVXIElURU1TOiAke3Jlc3VsdF9hcHAuYXBwX25hbWV9IChJdGVtcyBzdGVwcylgKSA6IG51bGw7XG4gICAgICAgICAgICBhcHAuaXRlbXNfbGlzdCA9IGl0ZW1zO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlTWFwKGFwcC5pdGVtc19saXN0LCBzb3VyY2VfYXBwLml0ZW1zX2xpc3QpO1xuICAgICAgICAgICAgc2VsZi5fYWRkRmllbGRWYWx1ZShzb3VyY2VfYXBwLml0ZW1zX2xpc3QsIGFwcC5pdGVtc19saXN0LCBzZWxmLmFwcHNDb25uZWN0aW5nTWFwKTtcbiAgICAgICAgICAgIGNyZWF0ZXNJdGVtcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICBhcHBfcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgY3JlYXRlc0l0ZW1zLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICBhcHAuaXRlbXNfbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5maWVsZHMuZm9yRWFjaChmaWVsZF9pdGVtID0+IHtcbiAgICAgICAgICAgICAgc2VsZi5hcHBzQ29ubmVjdGluZ01hcC5maWVsZHMuZm9yRWFjaChmaWVsZF9tYXAgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZF9pdGVtLmZpZWxkX2lkID09PSBmaWVsZF9tYXAub2xkX2ZpZWxkX2lkKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZF9pdGVtLmZpZWxkX2lkID0gZmllbGRfbWFwLm5ld19maWVsZF9pZDtcbiAgICAgICAgICAgICAgICAgIGZpZWxkX2l0ZW0uZWxlbWVudF9pZCA9IGZpZWxkX21hcC5uZXdfZmllbGRfaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5kZWxldGVGaWVsZChjcmVhdGVzSXRlbXMpO1xuICAgICAgICBzZWxmLnJlcGxhY2VWYWx1ZShjcmVhdGVzSXRlbXMsIHNlbGYuYXBwc0Nvbm5lY3RpbmdNYXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgY3JlYXRlc0l0ZW1zLmZvckVhY2goY3JlYXRlZF9hcHAgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgbGV0IG5ld0l0ZW1zID0gY3JlYXRlZF9hcHAuaXRlbXNfbGlzdC5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgZmllbGQuZGF0YV9pZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHNlbGYuZ3VkaHViLnVwZGF0ZUl0ZW1zKGNyZWF0ZWRfYXBwLmFwcF9pZCwgbmV3SXRlbXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2suY2FsbCh0aGlzLCBgUkVQTEFDRSBWQUxVRTogJHtjcmVhdGVkX2FwcC5hcHBfbmFtZX0gKEl0ZW1zIHN0ZXBzKWApIDogbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgY3JlYXRlc0l0ZW1zKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBkZWxldGVGaWVsZChhcHBzKSB7XG4gICAgYXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICBhcHAuaXRlbXNfbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtLmZpZWxkcyA9IGl0ZW0uZmllbGRzLmZpbHRlcihmaWVsZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFwcC5maWVsZF9saXN0LmZpbmRJbmRleChmID0+IGYuZmllbGRfaWQgPT0gZmllbGQuZmllbGRfaWQpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmVwbGFjZVZhbHVlKGFwcHMsIG1hcCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBhcHAuZmllbGRfbGlzdC5mb3JFYWNoKGZpZWxkX29mX2xpc3QgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZF9vZl9saXN0LmRhdGFfdHlwZSA9PT0gJ2l0ZW1fcmVmJykge1xuICAgICAgICAgICAgc2VsZi5fcmVwbGFjZVZhbHVlSXRlbVJlZihhcHAsIGZpZWxkX29mX2xpc3QsIG1hcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsbFByb21pc2VzLnB1c2gobmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBzZWxmLmd1ZGh1Yi5naGNvbnN0cnVjdG9yLmdldEluc3RhbmNlKGZpZWxkX29mX2xpc3QuZGF0YV90eXBlKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SIFdISUxFIEdFVFRJTkcgSU5TVEFOQ0UgT0YgJywgZmllbGRfb2ZfbGlzdC5kYXRhX3R5cGUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogZmllbGRfb2ZfbGlzdC5kYXRhX3R5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhdGEuZ2V0VGVtcGxhdGUoKS5jb25zdHJ1Y3RvciA9PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ndWRodWIudXRpbC5maWxlSW5zdGFsbGVySGVscGVyKGFwcC5hcHBfaWQsIGFwcC5pdGVtc19saXN0LCBmaWVsZF9vZl9saXN0LmZpZWxkX2lkKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5nZXRUZW1wbGF0ZSgpLmNvbnN0cnVjdG9yID09ICdkb2N1bWVudCcpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50SW5zdGFsbGVySGVscGVyKGFwcC5hcHBfaWQsIGFwcC5pdGVtc19saXN0LCBmaWVsZF9vZl9saXN0LmZpZWxkX2lkKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIFByb21pc2UuYWxsKGFsbFByb21pc2VzKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBkb2N1bWVudEluc3RhbGxlckhlbHBlcihhcHBJZCwgaXRlbXMsIGVsZW1lbnRJZCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGl0ZW1zV2l0aENsb25lZERvY3VtZW50ID0gW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaXRlbV9pZDtcbiAgICAgICAgY29uc3QgZmllbGQgPSBpdGVtLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmVsZW1lbnRfaWQgPT09IGVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5maWVsZF92YWx1ZSAmJiBmaWVsZC5maWVsZF92YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCBzZWxmLmd1ZGh1Yi5nZXREb2N1bWVudCh7XG4gICAgICAgICAgICBfaWQ6IGZpZWxkLmZpZWxkX3ZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RvY3VtZW50ID0gYXdhaXQgc2VsZi5ndWRodWIuY3JlYXRlRG9jdW1lbnQoe1xuICAgICAgICAgICAgICBhcHBfaWQ6IGFwcElkLFxuICAgICAgICAgICAgICBpdGVtX2lkOiBpdGVtSWQsXG4gICAgICAgICAgICAgIGVsZW1lbnRfaWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICAgICAgZGF0YTogZG9jdW1lbnQuZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWVsZC5maWVsZF92YWx1ZSA9IG5ld0RvY3VtZW50Ll9pZDtcbiAgICAgICAgICAgIGl0ZW1zV2l0aENsb25lZERvY3VtZW50LnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXNvbHZlKGl0ZW1zV2l0aENsb25lZERvY3VtZW50KTtcbiAgICB9KTtcbiAgfVxuICBfcmVwbGFjZVZhbHVlSXRlbVJlZihhcHAsIGZpZWxkX29mX2xpc3QsIG1hcCkge1xuICAgIGFwcC5pdGVtc19saXN0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLmZpZWxkcy5mb3JFYWNoKGZpZWxkX29mX2l0ZW0gPT4ge1xuICAgICAgICBpZiAoZmllbGRfb2ZfaXRlbS5maWVsZF9pZCA9PT0gZmllbGRfb2ZfbGlzdC5maWVsZF9pZCAmJiBmaWVsZF9vZl9pdGVtLmZpZWxkX3ZhbHVlKSB7XG4gICAgICAgICAgbGV0IGFycl92YWx1ZXMgPSBmaWVsZF9vZl9pdGVtLmZpZWxkX3ZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgYXJyX3ZhbHVlcy5mb3JFYWNoKChvbmVfdmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gb25lX3ZhbHVlLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBtYXAuYXBwcy5mb3JFYWNoKGFwcF9pZHMgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWVbMF0gPT0gYXBwX2lkcy5vbGRfYXBwX2lkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbMF0gPSBhcHBfaWRzLm5ld19hcHBfaWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFwLml0ZW1zLmZvckVhY2goaXRlbV9pZHMgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWVbMV0gPT0gaXRlbV9pZHMub2xkX2l0ZW1faWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVsxXSA9IGl0ZW1faWRzLm5ld19pdGVtX2lkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFycl92YWx1ZXNba2V5XSA9IHZhbHVlLmpvaW4oJy4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWVsZF9vZl9pdGVtLmZpZWxkX3ZhbHVlID0gYXJyX3ZhbHVlcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9hZGRGaWVsZFZhbHVlKHNvdXJjZV9hcHBfaXRlbXMsIGNyZWF0ZV9pdGVtcywgYXBwc0Nvbm5lY3RpbmdNYXApIHtcbiAgICBjcmVhdGVfaXRlbXMuZm9yRWFjaChuZXdfaXRlbSA9PiB7XG4gICAgICBhcHBzQ29ubmVjdGluZ01hcC5pdGVtcy5mb3JFYWNoKGl0ZW1fb2ZfbWFwID0+IHtcbiAgICAgICAgaWYgKG5ld19pdGVtLml0ZW1faWQgPT09IGl0ZW1fb2ZfbWFwLm5ld19pdGVtX2lkKSB7XG4gICAgICAgICAgc291cmNlX2FwcF9pdGVtcy5mb3JFYWNoKG9sZF9pdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtX29mX21hcC5vbGRfaXRlbV9pZCA9PT0gb2xkX2l0ZW0uaXRlbV9pZCkge1xuICAgICAgICAgICAgICBuZXdfaXRlbS5maWVsZHMgPSBvbGRfaXRlbS5maWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF91cGRhdGVNYXAobmV3X2l0ZW1zLCBvbGRfaXRlbXMpIHtcbiAgICBvbGRfaXRlbXMuZm9yRWFjaChvbGRfaXRlbSA9PiB7XG4gICAgICBuZXdfaXRlbXMuZm9yRWFjaChuZXdfaXRlbSA9PiB7XG4gICAgICAgIGlmIChvbGRfaXRlbS5pbmRleF9udW1iZXIgPT09IG5ld19pdGVtLmluZGV4X251bWJlcikge1xuICAgICAgICAgIHRoaXMuYXBwc0Nvbm5lY3RpbmdNYXAuaXRlbXMucHVzaCh7XG4gICAgICAgICAgICBvbGRfaXRlbV9pZDogb2xkX2l0ZW0uaXRlbV9pZCxcbiAgICAgICAgICAgIG5ld19pdGVtX2lkOiBuZXdfaXRlbS5pdGVtX2lkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9zZWFyY2hPbGRBcHBJZChhcHBfaWQsIGFwcHMpIHtcbiAgICBsZXQgZmluZElkID0gMDtcbiAgICBhcHBzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlLm5ld19hcHBfaWQgPT09IGFwcF9pZCkge1xuICAgICAgICBmaW5kSWQgPSB2YWx1ZS5vbGRfYXBwX2lkO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5kSWQ7XG4gIH1cbiAgY3JlYXRlQXBwcyhwYWNrLCBjYWxsYmFjaywgaW5zdGFsbEZyb21NYXN0ZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICBzdGVwX3NpemU6IDEwMCAvIChwYWNrLmFwcHMubGVuZ3RoICogMyksXG4gICAgICBhcHBzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgbGV0IHNvdXJjZV9hcHBzID0ge307XG4gICAgICBsZXQgY3JlYXRlZF9hcHBzID0gW107XG4gICAgICBsZXQgdXBkYXRlZF9hcHBzID0gW107XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc3Rva2VuXG4gICAgICB9ID0gYXdhaXQgc2VsZi5ndWRodWIucmVxLmF4aW9zUmVxdWVzdCh7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmw6ICdodHRwczovL2d1ZGh1Yi5jb20vR3VkSHViX1Rlc3QvYXV0aC9sb2dpbicsXG4gICAgICAgIGZvcm06IHtcbiAgICAgICAgICBhdXRoX2tleTogJzNITU90Q2JDME0vMS8xZTR5NFV4by9LaC9hRk40VjVMRzIvLzVpeHg3VFp5aVVmTWI3SUhBQUhDajlQc0xyT1NEclp1dVdrYlg0QklYMjNmNTFIK2VBPT0nXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBhcHBfaWQgb2YgcGFjay5hcHBzKSB7XG4gICAgICAgIGxldCByZXN1bHRfYXBwO1xuICAgICAgICBpZiAoaW5zdGFsbEZyb21NYXN0ZXIpIHtcbiAgICAgICAgICByZXN1bHRfYXBwID0gYXdhaXQgc2VsZi5ndWRodWIucmVxLmF4aW9zUmVxdWVzdCh7XG4gICAgICAgICAgICB1cmw6IGBodHRwczovL2d1ZGh1Yi5jb20vR3VkSHViX1Rlc3QvYXBpL2FwcC9nZXQ/dG9rZW49JHthY2Nlc3N0b2tlbn0mYXBwX2lkPSR7YXBwX2lkfWAsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0X2FwcCA9IGF3YWl0IHNlbGYuZ3VkaHViLmdldEFwcChhcHBfaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2suY2FsbCh0aGlzLCBgR0VUIEFQUDogJHtyZXN1bHRfYXBwLmFwcF9uYW1lfSAoQXBwIHN0ZXBzKWApIDogbnVsbDtcbiAgICAgICAgbGV0IHNvdXJjZV9hcHAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdF9hcHApKTtcbiAgICAgICAgc291cmNlX2FwcHNbc291cmNlX2FwcC5hcHBfaWRdID0gc291cmNlX2FwcDtcbiAgICAgICAgcHJvZ3Jlc3MuYXBwcy5wdXNoKHNvdXJjZV9hcHAuaWNvbik7XG4gICAgICAgIGxldCBhcHBUZW1wbGF0ZSA9IHNlbGYucHJlcGFyZUFwcFRlbXBsYXRlKHNvdXJjZV9hcHApO1xuICAgICAgICBhcHBUZW1wbGF0ZS5hcHBfbmFtZSA9IGFwcFRlbXBsYXRlLmFwcF9uYW1lICsgJyBOZXcnO1xuICAgICAgICBhcHBUZW1wbGF0ZS5wcml2YWN5ID0gMTtcbiAgICAgICAgaWYgKHBhY2suZGF0YV90b19jaGFuZ2UpIHtcbiAgICAgICAgICBpZiAocGFjay5kYXRhX3RvX2NoYW5nZS5uYW1lKSB7XG4gICAgICAgICAgICBhcHBUZW1wbGF0ZS5hcHBfbmFtZSA9IHBhY2suZGF0YV90b19jaGFuZ2UubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBhY2suZGF0YV90b19jaGFuZ2UuaWNvbikge1xuICAgICAgICAgICAgYXBwVGVtcGxhdGUuaWNvbiA9IHBhY2suZGF0YV90b19jaGFuZ2UuaWNvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5yZXNldFZpZXdzSWRzKGFwcFRlbXBsYXRlKTtcbiAgICAgICAgc2VsZi5ndWRodWIuY3JlYXRlTmV3QXBwKGFwcFRlbXBsYXRlKS50aGVuKGNyZWF0ZWRfYXBwID0+IHtcbiAgICAgICAgICBjYWxsYmFjayA/IGNhbGxiYWNrLmNhbGwodGhpcywgYENSRUFURSBORVcgQVBQOiAke3Jlc3VsdF9hcHAuYXBwX25hbWV9IChBcHAgc3RlcHMpYCkgOiBudWxsO1xuICAgICAgICAgIGNyZWF0ZWRfYXBwcy5wdXNoKGNyZWF0ZWRfYXBwKTtcbiAgICAgICAgICBzZWxmLm1hcEFwcChzb3VyY2VfYXBwLCBjcmVhdGVkX2FwcCwgc2VsZi5hcHBzQ29ubmVjdGluZ01hcCk7XG4gICAgICAgICAgaWYgKHBhY2suYXBwcy5sZW5ndGggPT0gY3JlYXRlZF9hcHBzLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZi5jb25uZWN0QXBwcyhjcmVhdGVkX2FwcHMsIHNlbGYuYXBwc0Nvbm5lY3RpbmdNYXAsIHNvdXJjZV9hcHBzKTtcbiAgICAgICAgICAgIGNyZWF0ZWRfYXBwcy5mb3JFYWNoKGNyZWF0ZWRfYXBwID0+IHtcbiAgICAgICAgICAgICAgc2VsZi5ndWRodWIudXBkYXRlQXBwKGNyZWF0ZWRfYXBwKS50aGVuKHVwZGF0ZWRfYXBwID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA/IGNhbGxiYWNrLmNhbGwodGhpcywgYFVQREFURSBBUFA6ICR7cmVzdWx0X2FwcC5hcHBfbmFtZX0gKEFwcCBzdGVwcylgKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgdXBkYXRlZF9hcHBzLnB1c2godXBkYXRlZF9hcHApO1xuICAgICAgICAgICAgICAgIGlmIChwYWNrLmFwcHMubGVuZ3RoID09IHVwZGF0ZWRfYXBwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodXBkYXRlZF9hcHBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBtYXBBcHAoYmFzZV9hcHAsIG5ld19hcHAsIGFwcHNDb25uZWN0aW5nTWFwKSB7XG4gICAgYXBwc0Nvbm5lY3RpbmdNYXAuYXBwcy5wdXNoKHtcbiAgICAgIG9sZF9hcHBfaWQ6IGJhc2VfYXBwLmFwcF9pZCxcbiAgICAgIG5ld19hcHBfaWQ6IG5ld19hcHAuYXBwX2lkLFxuICAgICAgb2xkX3ZpZXdfaW5pdDogYmFzZV9hcHAudmlld19pbml0LFxuICAgICAgbmV3X3ZpZXdfaW5pdDogbmV3X2FwcC52aWV3X2luaXRcbiAgICB9KTtcbiAgICBiYXNlX2FwcC5maWVsZF9saXN0LmZvckVhY2gob2xkX2ZpZWxkID0+IHtcbiAgICAgIG5ld19hcHAuZmllbGRfbGlzdC5mb3JFYWNoKG5ld19maWVsZCA9PiB7XG4gICAgICAgIGlmIChvbGRfZmllbGQubmFtZV9zcGFjZSA9PSBuZXdfZmllbGQubmFtZV9zcGFjZSkge1xuICAgICAgICAgIGFwcHNDb25uZWN0aW5nTWFwLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWVfc3BhY2U6IG9sZF9maWVsZC5uYW1lX3NwYWNlLFxuICAgICAgICAgICAgb2xkX2ZpZWxkX2lkOiBvbGRfZmllbGQuZmllbGRfaWQsXG4gICAgICAgICAgICBuZXdfZmllbGRfaWQ6IG5ld19maWVsZC5maWVsZF9pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBiYXNlX2FwcC52aWV3c19saXN0LmZvckVhY2gob2xkX3ZpZXcgPT4ge1xuICAgICAgbmV3X2FwcC52aWV3c19saXN0LmZvckVhY2gobmV3X3ZpZXcgPT4ge1xuICAgICAgICBpZiAob2xkX3ZpZXcubmFtZSA9PSBuZXdfdmlldy5uYW1lKSB7XG4gICAgICAgICAgYXBwc0Nvbm5lY3RpbmdNYXAudmlld3MucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBvbGRfdmlldy5uYW1lLFxuICAgICAgICAgICAgb2xkX3ZpZXdfaWQ6IG9sZF92aWV3LnZpZXdfaWQsXG4gICAgICAgICAgICBuZXdfdmlld19pZDogbmV3X3ZpZXcudmlld19pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBjcmF3bGluZyhvYmplY3QsIGFjdGlvbikge1xuICAgIGxldCBwcm9wZXJ0aWVzID0gb2JqZWN0ID09PSBudWxsID8gW10gOiBPYmplY3Qua2V5cyhvYmplY3QpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgbGV0IHByb3BlcnR5VmFsdWUgPSBvYmplY3RbcHJvcF07XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9iamVjdCAhPSAnc3RyaW5nJykge1xuICAgICAgICAgIGFjdGlvbihwcm9wLCBwcm9wZXJ0eVZhbHVlLCBvYmplY3QpO1xuICAgICAgICAgIHNlbGYuY3Jhd2xpbmcocHJvcGVydHlWYWx1ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJlc2V0Vmlld3NJZHMoYXBwKSB7XG4gICAgYXBwLnZpZXdfaW5pdCA9IDA7XG4gICAgdGhpcy5jcmF3bGluZyhhcHAudmlld3NfbGlzdCwgZnVuY3Rpb24gKHByb3AsIHZhbHVlLCBwYXJlbnQpIHtcbiAgICAgIGlmIChwcm9wID09ICd2aWV3X2lkJyB8fCBwcm9wID09ICdjb250YWluZXJfaWQnKSB7XG4gICAgICAgIHBhcmVudFtwcm9wXSA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29ubmVjdEFwcHMoYXBwcywgYXBwc0Nvbm5lY3RpbmdNYXAsIHNvdXJjZV9hcHBzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgYXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICBhcHBzQ29ubmVjdGluZ01hcC5hcHBzLmZvckVhY2goYXBwTWFwID0+IHtcbiAgICAgICAgaWYgKGFwcC52aWV3X2luaXQgPT09IGFwcE1hcC5uZXdfdmlld19pbml0KSB7XG4gICAgICAgICAgYXBwc0Nvbm5lY3RpbmdNYXAudmlld3MuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICAgIGlmIChhcHBNYXAub2xkX3ZpZXdfaW5pdCA9PT0gdmlldy5vbGRfdmlld19pZCkge1xuICAgICAgICAgICAgICBhcHAudmlld19pbml0ID0gdmlldy5uZXdfdmlld19pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBzZWxmLmNyYXdsaW5nKGFwcC5maWVsZF9saXN0LCBmdW5jdGlvbiAocHJvcCwgdmFsdWUsIHBhcmVudCkge1xuICAgICAgICBpZiAocHJvcC5pbmRleE9mKFwiZmllbGRfaWRcIikgIT09IC0xIHx8IHByb3AuaW5kZXhPZihcIkZpZWxkSWRcIikgIT09IC0xIHx8IHByb3AuaW5kZXhPZihcImRlc3RpbmF0aW9uX2ZpZWxkXCIpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBmaWVsZHNBcnIgPSBTdHJpbmcodmFsdWUpLnNwbGl0KCcsJyksXG4gICAgICAgICAgICBuZXdGaWVsZHNBcnIgPSBbXTtcbiAgICAgICAgICBhcHBzQ29ubmVjdGluZ01hcC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZHNBcnIuZm9yRWFjaChmaWVsZEZyb21WYWx1ZSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZEZyb21WYWx1ZSA9PSBmaWVsZC5vbGRfZmllbGRfaWQpIHtcbiAgICAgICAgICAgICAgICBuZXdGaWVsZHNBcnIucHVzaChmaWVsZC5uZXdfZmllbGRfaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobmV3RmllbGRzQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFyZW50W3Byb3BdID0gbmV3RmllbGRzQXJyLmpvaW4oJywnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AuaW5kZXhPZihcImFwcF9pZFwiKSAhPSAtMSB8fCBwcm9wLmluZGV4T2YoXCJBcHBJZFwiKSAhPSAtMSB8fCBwcm9wLmluZGV4T2YoXCJkZXN0aW5hdGlvbl9hcHBcIikgIT0gLTEpIHtcbiAgICAgICAgICBhcHBzQ29ubmVjdGluZ01hcC5hcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBhcHAub2xkX2FwcF9pZCkge1xuICAgICAgICAgICAgICBwYXJlbnRbcHJvcF0gPSBhcHAubmV3X2FwcF9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC5pbmRleE9mKFwidmlld19pZFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICBhcHBzQ29ubmVjdGluZ01hcC52aWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IHZpZXcub2xkX3ZpZXdfaWQpIHtcbiAgICAgICAgICAgICAgcGFyZW50W3Byb3BdID0gdmlldy5uZXdfdmlld19pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC5pbmRleE9mKFwic3JjXCIpICE9PSAtMSAmJiBpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBwcm9uX25hbWUgPSAnY29udGFpbmVyX2lkJztcbiAgICAgICAgICBjb25zdCBvbGRfYXBwX2lkID0gYXBwc0Nvbm5lY3RpbmdNYXAuYXBwcy5maW5kKGFwcE1hcCA9PiBhcHBNYXAubmV3X2FwcF9pZCA9PT0gYXBwLmFwcF9pZCkub2xkX2FwcF9pZDtcbiAgICAgICAgICBjb25zdCBwYXRoID0gc2VsZi5maW5kUGF0aChzb3VyY2VfYXBwc1tvbGRfYXBwX2lkXS52aWV3c19saXN0LCBwcm9uX25hbWUsIHZhbHVlKTtcbiAgICAgICAgICBwYXJlbnRbcHJvcF0gPSBgJHtzZWxmLmdldFZhbHVlQnlQYXRoKGFwcC52aWV3c19saXN0LCBwYXRoLCBwcm9uX25hbWUpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AuaW5kZXhPZihcInRyaWdnZXJcIikgIT09IC0xICYmIHZhbHVlLm1vZGVsICYmIHZhbHVlLm1vZGVsLm5vZGVzKSB7XG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB2YWx1ZS5tb2RlbC5ub2RlcztcbiAgICAgICAgICBjb25zdCBub2RlUHJvcGVydGllcyA9IFtcImlucHV0c1wiLCBcIm91dHB1dHNcIl07XG4gICAgICAgICAgZm9yIChjb25zdCBpbmRleCBpbiBub2Rlcykge1xuICAgICAgICAgICAgbm9kZVByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpbmRleF07XG4gICAgICAgICAgICAgIGNvbnN0IG51bWVyaWNQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMobm9kZVtwcm9wZXJ0eV0pLmZpbHRlcihwcm9wID0+IHByb3AgIT09ICcnICYmICFpc05hTihwcm9wKSk7IC8vIGZpZWxkX2lkIGFzIGtleXNcblxuICAgICAgICAgICAgICBudW1lcmljUHJvcGVydGllcy5mb3JFYWNoKG9sZF9maWVsZF9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVzcG9uZEZpZWxkT2ZDb25uZWN0aW5nTWFwID0gYXBwc0Nvbm5lY3RpbmdNYXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC5vbGRfZmllbGRfaWQgPT0gb2xkX2ZpZWxkX2lkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29ycmVzcG9uZEZpZWxkT2ZDb25uZWN0aW5nTWFwLmxlbmd0aCAhPT0gMCAmJiBjb3JyZXNwb25kRmllbGRPZkNvbm5lY3RpbmdNYXBbMF0ubmV3X2ZpZWxkX2lkKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuZXdfZmllbGRfaWQgPSBjb3JyZXNwb25kRmllbGRPZkNvbm5lY3RpbmdNYXBbMF0ubmV3X2ZpZWxkX2lkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uT2JqZWN0Q29weSA9IG5vZGVbcHJvcGVydHldW29sZF9maWVsZF9pZF07XG4gICAgICAgICAgICAgICAgICBjb25uZWN0aW9uT2JqZWN0Q29weS5jb25uZWN0aW9ucy5mb3JFYWNoKGNvbm5lY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5pbnB1dCA9PSBvbGRfZmllbGRfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlucHV0ID0gbmV3X2ZpZWxkX2lkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLm91dHB1dCA9PSBvbGRfZmllbGRfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm91dHB1dCA9IG5ld19maWVsZF9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZVtwcm9wZXJ0eV1bb2xkX2ZpZWxkX2lkXTtcbiAgICAgICAgICAgICAgICAgIG5vZGVbcHJvcGVydHldW25ld19maWVsZF9pZF0gPSBjb25uZWN0aW9uT2JqZWN0Q29weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFwcHM7XG4gIH1cbiAgZ2V0VmFsdWVCeVBhdGgoc291cmNlLCBwYXRoLCBwcm9wKSB7XG4gICAgbGV0IHRlbXAgPSBzb3VyY2U7XG4gICAgcGF0aC5zcGxpdCgnLicpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0ZW1wID0gdGVtcFtpdGVtXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcFtwcm9wXTtcbiAgfVxuICBmaW5kUGF0aChzb3VyY2UsIHByb3AsIHZhbHVlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgdG9DbGVhclBhdGggPSBmYWxzZTtcbiAgICBsZXQgcGF0aCA9IFtdO1xuICAgIHNlbGYuY3Jhd2xpbmcoc291cmNlLCBmdW5jdGlvbiAocHJvcFNvdXJjZSwgdmFsdWVTb3VyY2UsIHBhcmVudFNvdXJjZSkge1xuICAgICAgaWYgKHRvQ2xlYXJQYXRoKSB7XG4gICAgICAgIHBhdGgucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKHRvQ2xlYXJQYXRoKSB7XG4gICAgICAgICAgICBpdGVtLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaXRlbS5wYXJlbnQgPT09IHBhcmVudFNvdXJjZSkge1xuICAgICAgICAgICAgICB0b0NsZWFyUGF0aCA9IGZhbHNlO1xuICAgICAgICAgICAgICBwYXRoID0gcGF0aC5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kZWxldGUpO1xuICAgICAgICAgICAgICBwYXRoLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0ZvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50U291cmNlW3Byb3BTb3VyY2VdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHBhdGgucHVzaCh7XG4gICAgICAgICAgICBwcm9wOiBwcm9wU291cmNlLFxuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRTb3VyY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVTb3VyY2UgPT0gdmFsdWUgJiYgcHJvcCA9PT0gcHJvcFNvdXJjZSkge1xuICAgICAgICAgIGlzRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHBhcmVudFNvdXJjZSkucG9wKCkgPT09IHByb3BTb3VyY2UgJiYgdHlwZW9mIHBhcmVudFNvdXJjZVtwcm9wU291cmNlXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0b0NsZWFyUGF0aCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGF0aC5tYXAoaXRlbSA9PiBpdGVtLnByb3ApLmpvaW4oJy4nKTtcbiAgfVxuICBwcmVwYXJlQXBwVGVtcGxhdGUoYXBwVG9UZW1wbGF0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBhcHAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFwcFRvVGVtcGxhdGUpKTtcbiAgICBzZWxmLmNyYXdsaW5nKGFwcC52aWV3c19saXN0LCBmdW5jdGlvbiAocHJvcCwgdmFsdWUsIHBhcmVudCkge1xuICAgICAgaWYgKHByb3AgPT0gXCJlbGVtZW50X2lkXCIpIHtcbiAgICAgICAgcGFyZW50LmVsZW1lbnRfaWQgPSAtTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgcGFyZW50LmNyZWF0ZV9lbGVtZW50ID0gLU51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXBwLmZpZWxkX2xpc3QuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBmaWVsZC5jcmVhdGVfZmllbGQgPSAtTnVtYmVyKGZpZWxkLmZpZWxkX2lkKTtcbiAgICAgIGZpZWxkLmVsZW1lbnRfaWQgPSAtTnVtYmVyKGZpZWxkLmZpZWxkX2lkKTtcbiAgICAgIGZpZWxkLmZpZWxkX2lkID0gLU51bWJlcihmaWVsZC5maWVsZF9pZCk7XG4gICAgICBmaWVsZC5maWVsZF92YWx1ZSA9IFwiXCI7IC8qIFNob3VsZCBiZSByZW1vdmVkIHdoZW4gd2UgdXBkYXRlIGNyZWF0ZUFwcCBBUEkqL1xuICAgIH0pO1xuXG4gICAgYXBwLml0ZW1zX2xpc3QgPSBbXTtcbiAgICBkZWxldGUgYXBwLmFwcF9pZDtcbiAgICBkZWxldGUgYXBwLmljb24uaWQ7XG4gICAgZGVsZXRlIGFwcC5ncm91cF9pZDtcbiAgICBkZWxldGUgYXBwLnRyYXNoO1xuICAgIGRlbGV0ZSBhcHAubGFzdF91cGRhdGU7XG4gICAgZGVsZXRlIGFwcC5maWxlX2xpc3Q7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL1V0aWxzL0ZJbGVIZWxwZXIvRmlsZUhlbHBlci5qc1xuY2xhc3MgRmlsZUhlbHBlciB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1Yikge1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICB9XG4gIGZpbGVJbnN0YWxsZXJIZWxwZXIoYXBwSWQsIGl0ZW1zLCBlbGVtZW50SWQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBmaWxlcyA9IFtbXV07XG4gICAgICBsZXQgY2hhaW5Qcm9taXNlcyA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaXRlbV9pZDtcbiAgICAgICAgY29uc3QgZmllbGQgPSBpdGVtLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmVsZW1lbnRfaWQgPT09IGVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5maWVsZF92YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVJZHMgPSBmaWVsZC5maWVsZF92YWx1ZS5zcGxpdCgnLicpO1xuICAgICAgICAgIGZpbGVJZHMuZm9yRWFjaChmaWxlSWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3RmlsZSA9IHtcbiAgICAgICAgICAgICAgc291cmNlOiBmaWxlSWQsXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgYXBwX2lkOiBhcHBJZCxcbiAgICAgICAgICAgICAgICBpdGVtX2lkOiBpdGVtSWQsXG4gICAgICAgICAgICAgICAgZWxlbWVudF9pZDogZWxlbWVudElkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZmlsZXNbZmlsZXMubGVuZ3RoIC0gMV0ubGVuZ3RoICE9PSAxMCkge1xuICAgICAgICAgICAgICAvLyAxMCAtIG1heCBkdXBsaWNhdGUgZmlsZXNcbiAgICAgICAgICAgICAgZmlsZXNbZmlsZXMubGVuZ3RoIC0gMV0ucHVzaChuZXdGaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpbGVzLnB1c2goW25ld0ZpbGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmaWxlcy5mb3JFYWNoKGZpbGVQYWNrID0+IHtcbiAgICAgICAgY2hhaW5Qcm9taXNlcyA9IGNoYWluUHJvbWlzZXMudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZ3VkaHViLmR1cGxpY2F0ZUZpbGUoZmlsZVBhY2spO1xuICAgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgcmVzdWx0cyA9IFsuLi5yZXN1bHRzLCAuLi5yZXN1bHRdO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY2hhaW5Qcm9taXNlcy50aGVuKCgpID0+IHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLml0ZW1faWQ7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBpdGVtLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmVsZW1lbnRfaWQgPT09IGVsZW1lbnRJZCk7XG4gICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLmZpZWxkX3ZhbHVlKSB7XG4gICAgICAgICAgICBmaWVsZC5maWVsZF92YWx1ZSA9ICcnO1xuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICBpZiAoZmlsZS5pdGVtX2lkID09PSBpdGVtSWQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5maWVsZF92YWx1ZSA9IGZpZWxkLmZpZWxkX3ZhbHVlLnNwbGl0KCcsJykuZmlsdGVyKGZpbGVJZCA9PiBmaWxlSWQpLmNvbmNhdChmaWxlLmZpbGVfaWQpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9jb21wYXJlT2JqZWN0cy9jb21wYXJlT2JqZWN0cy5qc1xuZnVuY3Rpb24gY29tcGFyZU9iamVjdHModGFyZ2V0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhcmdldCkgPT09IEpTT04uc3RyaW5naWZ5KHNvdXJjZSk7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvZHluYW1pY1Byb21pc2VBbGwvZHluYW1pY1Byb21pc2VBbGwuanNcbmFzeW5jIGZ1bmN0aW9uIGR5bmFtaWNQcm9taXNlQWxsKHByb21pc2VzKSB7XG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGFsbERvbmUgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHByb21pc2Ugb2YgcHJvbWlzZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBfY2hlY2tQcm9taXNlU3RhdHVzKHByb21pc2UpO1xuICAgIGlmIChyZXN1bHQuc3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgYWxsRG9uZSA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuc3RhdGUgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIHRocm93IHJlc3VsdC5yZWFzb247XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGFsbERvbmUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZHluYW1pY1Byb21pc2VBbGwocHJvbWlzZXMpO1xufVxuZnVuY3Rpb24gX2NoZWNrUHJvbWlzZVN0YXR1cyhwcm9taXNlKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSB7XG4gICAgc3RhdGU6ICdwZW5kaW5nJ1xuICB9O1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtwcm9taXNlLCBwZW5kaW5nXSkudGhlbih2YWx1ZSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBwZW5kaW5nKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogJ3Jlc29sdmVkJyxcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfSwgcmVhc29uID0+ICh7XG4gICAgc3RhdGU6ICdyZWplY3RlZCcsXG4gICAgcmVhc29uXG4gIH0pKTtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9maWx0ZXIvc29ydEl0ZW1zLmpzXG4vKipcbiAqIFNvcnQgaXRlbXMgYnkgZmllbGQgdmFsdWUgb2YgZ2l2ZW4gZmllbGRcbiAqIFxuICogQHBhcmFtIHthcnJheX0gaXRlbXMgLSBpdGVtcyBvZiBhcHBsaWNhdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBvYmplY3Qgd2l0aCBvcHRpb25zIGZvciBzb3J0aW5nXG4gKiAgQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSBzb3J0X2ZpZWxkX2lkIC0gZmllbGQgaWQgZm9yIHNvcnRpbmcgaXRlbXMgXG4gKiAgQHByb3BlcnR5IHtib29sZWFufSBkZXNjZW5kaW5nIC0gc29ydCB0eXBlIChpZiBzZXQgdG8gdHJ1ZSAtIGl0ZW1zIHNvcnQgYnkgZGVzY2VuZGluZyBlbHNlIGJ5IGFzY2VuZGluZylcbiAqIFxuICovXG5cbmZ1bmN0aW9uIHNvcnRJdGVtcyhpdGVtcywgb3B0aW9ucykge1xuICAvKi0tIHN0b3AgZmlsdGVyaW5nIGlmIGFyZ3VtZW50cyBhcmUgZW1wdHkqL1xuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFpdGVtc1swXS5maWVsZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHZhciBjb21wYXJlRmllbGRJZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zb3J0X2ZpZWxkX2lkIHx8IGl0ZW1zWzBdLmZpZWxkc1swXS5maWVsZF9pZDtcblxuICAvKiBHZXQgZmllbGQgdmFsdWUqL1xuICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGl0ZW0pIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW0uZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbS5maWVsZHNbaV0uZmllbGRfaWQgPT0gY29tcGFyZUZpZWxkSWQpIHtcbiAgICAgICAgcmVzdWx0ID0gaXRlbS5maWVsZHNbaV0uZmllbGRfdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyogU29ydCBpdGVtcyBhcnJheSovXG4gIGl0ZW1zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYVZhbCA9IGdldEZpZWxkVmFsdWUoYSk7XG4gICAgdmFyIGJWYWwgPSBnZXRGaWVsZFZhbHVlKGIpO1xuICAgIGlmIChhVmFsID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiVmFsID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKC9eXFxkKyQvLnRlc3QoYVZhbCkgJiYgL15cXGQrJC8udGVzdChiVmFsKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihhVmFsKSA8IE51bWJlcihiVmFsKSA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKC9eXFxkKyQvLnRlc3QoYVZhbCkgfHwgL15cXGQrJC8udGVzdChiVmFsKSkge1xuICAgICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QoYVZhbCkgPyAtMSA6IDE7XG4gICAgfVxuICAgIHJldHVybiBhVmFsLnRvTG93ZXJDYXNlKCkgPiBiVmFsLnRvTG93ZXJDYXNlKCkgPyAxIDogLTE7XG4gIH0pO1xuICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmRlc2NlbmRpbmcgPyBpdGVtcy5yZXZlcnNlKCkgOiBpdGVtcztcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9VdGlscy5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jbGFzcyBVdGlscyB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1Yikge1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICAgIHRoaXMuTWVyZ2VGaWVsZHMgPSBuZXcgRmllbGRzT3BlcmF0b3IoZ3VkaHViKTtcbiAgICB0aGlzLkl0ZW1zU2VsZWN0aW9uID0gbmV3IEl0ZW1zU2VsZWN0aW9uKGd1ZGh1Yik7XG4gICAgdGhpcy5BcHBzVGVtcGxhdGVTZXJ2aWNlID0gbmV3IEFwcHNUZW1wbGF0ZVNlcnZpY2UoZ3VkaHViKTtcbiAgICB0aGlzLkZpbGVIZWxwZXIgPSBuZXcgRmlsZUhlbHBlcihndWRodWIpO1xuICB9XG4gIHByZWZpbHRlcihmaWx0ZXJzX2xpc3QsIHZhcmlhYmxlcyA9IHt9KSB7XG4gICAgcmV0dXJuIGZpbHRlclByZXBhcmF0aW9uKGZpbHRlcnNfbGlzdCwgdGhpcy5ndWRodWIuc3RvcmFnZSwgdGhpcy5ndWRodWIucGlwZVNlcnZpY2UsIHZhcmlhYmxlcyk7XG4gIH1cbiAgZmlsdGVyKGl0ZW1zLCBmaWx0ZXJfbGlzdCkge1xuICAgIHJldHVybiBmaWx0ZXIoaXRlbXMsIGZpbHRlcl9saXN0KTtcbiAgfVxuICBtZXJnZUZpbHRlcnMoc3JjLCBkZXN0KSB7XG4gICAgcmV0dXJuIG1lcmdlRmlsdGVycyhzcmMsIGRlc3QpO1xuICB9XG4gIGdyb3VwKGZpZWxkR3JvdXAsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIGdyb3VwKGZpZWxkR3JvdXAsIGl0ZW1zKTtcbiAgfVxuICBhc3luYyBnZXRGaWx0ZXJlZEl0ZW1zKGl0ZW1zID0gW10sIGZpbHRlcnNfbGlzdCA9IFtdLCBlbGVtZW50X2FwcF9pZCwgYXBwX2lkLCBpdGVtX2lkLCBmaWVsZF9ncm91cCA9IFwiXCIsIHNlYXJjaCwgc2VhcmNoX3BhcmFtcykge1xuICAgIGNvbnN0IG1vZGlmaWVkX2ZpbHRlcnNfbGlzdCA9IGF3YWl0IHRoaXMucHJlZmlsdGVyKGZpbHRlcnNfbGlzdCwge1xuICAgICAgZWxlbWVudF9hcHBfaWQsXG4gICAgICBhcHBfaWQsXG4gICAgICBpdGVtX2lkXG4gICAgfSk7XG4gICAgY29uc3QgaXRlbXNMaXN0ID0gdGhpcy5maWx0ZXIoaXRlbXMsIG1vZGlmaWVkX2ZpbHRlcnNfbGlzdCk7XG4gICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLmdyb3VwKGZpZWxkX2dyb3VwLCBpdGVtc0xpc3QpO1xuICAgIHJldHVybiBuZXdJdGVtcy5maWx0ZXIobmV3SXRlbSA9PiB7XG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2hWYWx1ZShbbmV3SXRlbV0sIHNlYXJjaCkubGVuZ3RoID09PSAxO1xuICAgICAgfSBlbHNlIHJldHVybiB0cnVlO1xuICAgIH0pLmZpbHRlcihuZXdJdGVtID0+IHtcbiAgICAgIGlmIChzZWFyY2hfcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2hWYWx1ZShbbmV3SXRlbV0sIHNlYXJjaF9wYXJhbXMpLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0gZWxzZSByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICBqc29uVG9JdGVtcyhqc29uLCBtYXApIHtcbiAgICByZXR1cm4ganNvblRvSXRlbXMoanNvbiwgbWFwKTtcbiAgfVxuICBnZXREYXRlKHF1ZXJ5S2V5KSB7XG4gICAgcmV0dXJuIGdldF9kYXRlX2dldERhdGUocXVlcnlLZXkpO1xuICB9XG4gIGNoZWNrUmVjdXJyaW5nRGF0ZShkYXRlLCBvcHRpb24pIHtcbiAgICByZXR1cm4gY2hlY2tSZWN1cnJpbmdEYXRlKGRhdGUsIG9wdGlvbik7XG4gIH1cbiAgcG9wdWxhdGVJdGVtcyhpdGVtcywgbW9kZWwsIGtlZXBfZGF0YSkge1xuICAgIHJldHVybiBwb3B1bGF0ZUl0ZW1zKGl0ZW1zLCBtb2RlbCwga2VlcF9kYXRhKTtcbiAgfVxuICBwb3B1bGF0ZVdpdGhEYXRlKGl0ZW1zLCBtb2RlbCkge1xuICAgIHJldHVybiBwb3B1bGF0ZVdpdGhEYXRlKGl0ZW1zLCBtb2RlbCk7XG4gIH1cbiAgcG9wdWxhdGVXaXRoSXRlbVJlZihzb3VyY2VJdGVtc1JlZiwgc3JjRmllbGRJZFRvQ29tcGFyZSwgZGVzdGluYXRpb25JdGVtcywgZGVzdEZpZWxkSWRUb0NvbXBhcmUsIGRlc3RGaWVsZEZvclJlZiwgYXBwX2lkKSB7XG4gICAgcmV0dXJuIHBvcHVsYXRlV2l0aEl0ZW1SZWYoc291cmNlSXRlbXNSZWYsIHNyY0ZpZWxkSWRUb0NvbXBhcmUsIGRlc3RpbmF0aW9uSXRlbXMsIGRlc3RGaWVsZElkVG9Db21wYXJlLCBkZXN0RmllbGRGb3JSZWYsIGFwcF9pZCk7XG4gIH1cblxuICAvL2hlcmVcbiAgY29tcGFyZUl0ZW1zKHNvdXJjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBmaWVsZFRvQ29tcGFyZSkge1xuICAgIHJldHVybiBjb21wYXJlSXRlbXMoc291cmNlSXRlbXMsIGRlc3RpbmF0aW9uSXRlbXMsIGZpZWxkVG9Db21wYXJlKTtcbiAgfVxuICBtZXJnZUl0ZW1zKHNvdXJjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBtZXJnZUJ5RmllbGRJZCkge1xuICAgIHJldHVybiBtZXJnZUl0ZW1zKHNvdXJjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBtZXJnZUJ5RmllbGRJZCk7XG4gIH1cbiAgbWVyZ2VPYmplY3RzKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpO1xuICB9XG4gIG1ha2VOZXN0ZWRMaXN0KGFyciwgaWQsIHBhcmVudF9pZCwgY2hpbGRyZW5fcHJvcGVydHksIHByaW9yaXR5X3Byb3BlcnR5KSB7XG4gICAgcmV0dXJuIG1ha2VOZXN0ZWRMaXN0KGFyciwgaWQsIHBhcmVudF9pZCwgY2hpbGRyZW5fcHJvcGVydHksIHByaW9yaXR5X3Byb3BlcnR5KTtcbiAgfVxuICBhc3luYyBtZXJnZUNodW5rcyhjaHVua3MpIHtcbiAgICByZXR1cm4gbWVyZ2VfY2h1bmtzX21lcmdlQ2h1bmtzKGNodW5rcyk7XG5cbiAgICAvLyBjb25zdCBjaHVua1dvcmtlckJsb2IgPSBuZXcgQmxvYihbbWVyZ2VDaHVua3NXb3JrZXIoKV0sIHtcbiAgICAvLyAgIHR5cGU6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiLFxuICAgIC8vIH0pO1xuICAgIC8vIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGNodW5rV29ya2VyQmxvYikpO1xuICAgIC8vIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKGNodW5rcyk7XG4gICAgLy8gdGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XG4gICAgLy8gICBjb25zdCB7IGRpZmYgfSA9IGV2ZW50LmRhdGE7XG4gICAgLy8gICBjYWxsYmFjayhldmVudC5kYXRhKTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIG1lcmdlRmllbGRMaXN0cyhmaWVsZHNUb1ZpZXcsIGZpZWxkTGlzdCkge1xuICAgIHJldHVybiB0aGlzLk1lcmdlRmllbGRzLm1lcmdlRmllbGRMaXN0cyhmaWVsZHNUb1ZpZXcsIGZpZWxkTGlzdCk7XG4gIH1cbiAgY3JlYXRlRmllbGRzTGlzdFRvVmlldyhhcHBJZCwgdGFibGVTZXR0aW5nc0ZpZWxkTGlzdFRvVmlldykge1xuICAgIHJldHVybiB0aGlzLk1lcmdlRmllbGRzLmNyZWF0ZUZpZWxkc0xpc3RUb1ZpZXcoYXBwSWQsIHRhYmxlU2V0dGluZ3NGaWVsZExpc3RUb1ZpZXcpO1xuICB9XG4gIGNyZWF0ZUZpZWxkc0xpc3RUb1ZpZXdXaXRoRGF0YVR5cGUoYXBwSWQsIHRhYmxlU2V0dGluZ3NGaWVsZExpc3RUb1ZpZXcpIHtcbiAgICByZXR1cm4gdGhpcy5NZXJnZUZpZWxkcy5jcmVhdGVGaWVsZHNMaXN0VG9WaWV3V2l0aERhdGFUeXBlKGFwcElkLCB0YWJsZVNldHRpbmdzRmllbGRMaXN0VG9WaWV3KTtcbiAgfVxuICBzZWxlY3RJdGVtcyhhcHBJZCwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy5JdGVtc1NlbGVjdGlvbi5zZWxlY3RJdGVtcyhhcHBJZCwgaXRlbXMpO1xuICB9XG4gIGdldFNlbGVjdGVkSXRlbXMoYXBwSWQpIHtcbiAgICByZXR1cm4gdGhpcy5JdGVtc1NlbGVjdGlvbi5nZXRTZWxlY3RlZEl0ZW1zKGFwcElkKTtcbiAgfVxuICBjbGVhclNlbGVjdGVkSXRlbXMoYXBwSWQpIHtcbiAgICByZXR1cm4gdGhpcy5JdGVtc1NlbGVjdGlvbi5jbGVhclNlbGVjdGVkSXRlbXMoYXBwSWQpO1xuICB9XG4gIGlzSXRlbVNlbGVjdGVkKGFwcElkLCBpdGVtSWQpIHtcbiAgICByZXR1cm4gdGhpcy5JdGVtc1NlbGVjdGlvbi5pc0l0ZW1TZWxlY3RlZChhcHBJZCwgaXRlbUlkKTtcbiAgfVxuICBqc29uQ29uc3RydWN0b3Ioc2NoZW1lLCBpdGVtLCB2YXJpYWJsZXMsIGFwcElkKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVyKHNjaGVtZSwgaXRlbSwgdGhpcywgdmFyaWFibGVzLCBhcHBJZCk7XG4gIH1cbiAgZmlsZUluc3RhbGxlckhlbHBlcihhcHBJZCwgaXRlbXMsIGVsZW1lbnRJZCkge1xuICAgIHJldHVybiB0aGlzLkZpbGVIZWxwZXIuZmlsZUluc3RhbGxlckhlbHBlcihhcHBJZCwgaXRlbXMsIGVsZW1lbnRJZCk7XG4gIH1cbiAgY3JlYXRlQXBwc0Zyb21UZW1wbGF0ZShwYWNrLCBtYXhOdW1iZXJPZkluc3N0YWxsZWRJdGVtcywgcHJvZ3Jlc3NDYWxsYmFjaywgaW5zdGFsbEZyb21NYXN0ZXIpIHtcbiAgICByZXR1cm4gdGhpcy5BcHBzVGVtcGxhdGVTZXJ2aWNlLmNyZWF0ZUFwcHNGcm9tVGVtcGxhdGUocGFjaywgbWF4TnVtYmVyT2ZJbnNzdGFsbGVkSXRlbXMsIHByb2dyZXNzQ2FsbGJhY2ssIGluc3RhbGxGcm9tTWFzdGVyKTtcbiAgfVxuICBjcmVhdGVBcHBzKHBhY2spIHtcbiAgICByZXR1cm4gdGhpcy5BcHBzVGVtcGxhdGVTZXJ2aWNlLmNyZWF0ZUFwcHMocGFjayk7XG4gIH1cbiAgY3JlYXRlSXRlbXMoY3JlYXRlX2FwcHMsIG1heE51bWJlck9mSW5zc3RhbGxlZEl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuQXBwc1RlbXBsYXRlU2VydmljZS5jcmVhdGVJdGVtcyhjcmVhdGVfYXBwcywgbWF4TnVtYmVyT2ZJbnNzdGFsbGVkSXRlbXMpO1xuICB9XG4gIGFyZVZpZXdMaXN0c0VxdWFsKGxpc3QxLCBsaXN0Mikge1xuICAgIGxldCBzb3J0ZWRMaXN0MSA9IGxpc3QxLnNvcnQoKGUxLCBlMikgPT4gZTEudmlld19pZCAtIGUyLnZpZXdfaWQpO1xuICAgIGxldCBzb3J0ZWRMaXN0MiA9IGxpc3QyLnNvcnQoKGUxLCBlMikgPT4gZTEudmlld19pZCAtIGUyLnZpZXdfaWQpO1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmVPYmplY3RzKHNvcnRlZExpc3QxLCBzb3J0ZWRMaXN0Mik7XG4gIH1cbiAgYXJlRmllbGRMaXN0c0VxdWFsKGxpc3QxLCBsaXN0Mikge1xuICAgIGxldCBzb3J0ZWRMaXN0MSA9IGxpc3QxLnNvcnQoKGUxLCBlMikgPT4gZTEuZmllbGRfaWQgLSBlMi5maWVsZF9pZCk7XG4gICAgbGV0IHNvcnRlZExpc3QyID0gbGlzdDIuc29ydCgoZTEsIGUyKSA9PiBlMS5maWVsZF9pZCAtIGUyLmZpZWxkX2lkKTtcbiAgICByZXR1cm4gdGhpcy5jb21wYXJlT2JqZWN0cyhzb3J0ZWRMaXN0MSwgc29ydGVkTGlzdDIpO1xuICB9XG4gIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICByZXR1cm4gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMik7XG4gIH1cblxuICAvL1xuICBjb21wYXJlQXBwc0l0ZW1zTGlzdHMoaXRlbXNfbGlzdDEsIGl0ZW1zX2xpc3QyLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNodW5rV29ya2VyQmxvYiA9IG5ldyBCbG9iKFtjb21wYXJlX2l0ZW1zX2xpc3RzX1dvcmtlcigpXSwge1xuICAgICAgdHlwZTogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCJcbiAgICB9KTtcbiAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChjaHVua1dvcmtlckJsb2IpKTtcbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICBpdGVtc19saXN0MSxcbiAgICAgIGl0ZW1zX2xpc3QyXG4gICAgfSk7XG4gICAgdGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkaWZmXG4gICAgICB9ID0gZXZlbnQuZGF0YTtcbiAgICAgIGNhbGxiYWNrKGRpZmYpO1xuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQcm9taXNlQWxsKHByb21pc2VzQXJyYXkpIHtcbiAgICByZXR1cm4gZHluYW1pY1Byb21pc2VBbGwocHJvbWlzZXNBcnJheSk7XG4gIH1cbiAgc29ydEl0ZW1zKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNvcnRJdGVtcyhpdGVtcywgb3B0aW9ucyk7XG4gIH1cbiAgZGVib3VuY2UoZnVuYywgZGVsYXkpIHtcbiAgICBsZXQgdGltZW91dElkO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9O1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvQXV0aC9BdXRoLmpzXG5jbGFzcyBBdXRoIHtcbiAgY29uc3RydWN0b3IocmVxLCBzdG9yYWdlKSB7XG4gICAgdGhpcy5yZXEgPSByZXE7XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTtcbiAgfVxuICBhc3luYyBsb2dpbih7XG4gICAgdXNlcm5hbWUsXG4gICAgcGFzc3dvcmRcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMubG9naW5BcGkodXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICB0aGlzLnN0b3JhZ2UudXBkYXRlVXNlcih1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuICBhc3luYyBsb2dpbldpdGhUb2tlbih0b2tlbikge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmxvZ2luV2l0aFRva2VuQXBpKHRva2VuKTtcbiAgICB0aGlzLnN0b3JhZ2UudXBkYXRlVXNlcih1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuICBhc3luYyBsb2dvdXQodG9rZW4pIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubG9nb3V0QXBpKHRva2VuKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cbiAgYXN5bmMgc2lnbnVwKHVzZXIpIHtcbiAgICBjb25zdCBuZXdVc2VyID0gYXdhaXQgdGhpcy5zaWdudXBBcGkodXNlcik7XG4gICAgcmV0dXJuIG5ld1VzZXI7XG4gIH1cbiAgYXN5bmMgdXBkYXRlVG9rZW4oYXV0aF9rZXkpIHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51cGRhdGVUb2tlbkFwaShhdXRoX2tleSk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cbiAgYXN5bmMgdXBkYXRlVXNlcih1c2VyRGF0YSkge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJBcGkodXNlckRhdGEpO1xuICAgIHRoaXMuc3RvcmFnZS51cGRhdGVVc2VyKHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG4gIGFzeW5jIHVwZGF0ZUF2YXRhcihpbWFnZURhdGEpIHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdmF0YXJVcGxvYWRBcGkoaW1hZ2VEYXRhKTtcbiAgICB0aGlzLnN0b3JhZ2UudXBkYXRlVXNlcih1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuICBhc3luYyBnZXRVc2Vyc0xpc3Qoa2V5d29yZCkge1xuICAgIGNvbnN0IHVzZXJzTGlzdCA9IGF3YWl0IHRoaXMuZ2V0VXNlcnNMaXN0QXBpKGtleXdvcmQpO1xuICAgIHJldHVybiB1c2Vyc0xpc3Q7XG4gIH1cbiAgYXN5bmMgbG9naW5BcGkodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnJlcS5heGlvc1JlcXVlc3Qoe1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiBgJHt0aGlzLnJlcS5yb290fS9hdXRoL2xvZ2luYCxcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbG9naW5XaXRoVG9rZW5BcGkodG9rZW4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMucmVxLmF4aW9zUmVxdWVzdCh7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmw6IGAke3RoaXMucmVxLnJvb3R9L2F1dGgvbG9naW4/YWNjZXNzdG9rZW49JHt0b2tlbn1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG4gIGFzeW5jIHVwZGF0ZVRva2VuQXBpKGF1dGhfa2V5KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnJlcS5heGlvc1JlcXVlc3Qoe1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiBgJHt0aGlzLnJlcS5yb290fS9hdXRoL2xvZ2luYCxcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGF1dGhfa2V5XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgbG9nb3V0QXBpKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLnBvc3Qoe1xuICAgICAgdXJsOiBcIi9hdXRoL2xvZ291dFwiLFxuICAgICAgZm9ybToge1xuICAgICAgICB0b2tlblxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNpZ251cEFwaSh1c2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLmF4aW9zUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHVybDogYCR7dGhpcy5yZXEucm9vdH0vYXV0aC9zaW5ndXBgLFxuICAgICAgZm9ybToge1xuICAgICAgICB1c2VyOiBKU09OLnN0cmluZ2lmeSh1c2VyKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldFVzZXJzTGlzdEFwaShrZXl3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLmdldCh7XG4gICAgICB1cmw6IFwiL2F1dGgvdXNlcmxpc3RcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBrZXl3b3JkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlVXNlckFwaSh1c2VyRGF0YSkge1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXV0aC91cGRhdGV1c2VyXCIsXG4gICAgICBmb3JtOiB7XG4gICAgICAgIHVzZXI6IEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF2YXRhclVwbG9hZEFwaShpbWFnZSkge1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXV0aC9hdmF0YXItdXBsb2FkXCIsXG4gICAgICBmb3JtOiB7XG4gICAgICAgIGltYWdlXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0VXNlckJ5SWRBcGkoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuZ2V0KHtcbiAgICAgIHVybDogXCIvYXV0aC9nZXR1c2VyYnlpZFwiLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGlkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0VmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuZ2V0KHtcbiAgICAgIHVybDogXCIvdmVyc2lvblwiXG4gICAgfSk7XG4gIH1cbiAgZ2V0VXNlckZyb21TdG9yYWdlKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRVc2Vyc0xpc3QoKS5maW5kKHVzZXIgPT4gdXNlci51c2VyX2lkID09IGlkKTtcbiAgfVxuICBzYXZlVXNlclRvU3RvcmFnZShzYXZlVXNlcikge1xuICAgIGNvbnN0IHVzZXJzTGlzdCA9IHRoaXMuc3RvcmFnZS5nZXRVc2Vyc0xpc3QoKTtcbiAgICBjb25zdCB1c2VySW5TdG9yYWdlID0gdXNlcnNMaXN0LmZpbmQodXNlciA9PiB1c2VyLnVzZXJfaWQgPT0gc2F2ZVVzZXIudXNlcl9pZCk7XG4gICAgaWYgKCF1c2VySW5TdG9yYWdlKSB7XG4gICAgICB1c2Vyc0xpc3QucHVzaChzYXZlVXNlcik7XG4gICAgICByZXR1cm4gc2F2ZVVzZXI7XG4gICAgfVxuICAgIHJldHVybiB1c2VySW5TdG9yYWdlO1xuICB9XG4gIGFzeW5jIGdldFVzZXJCeUlkKHVzZXJJZCkge1xuICAgIGxldCB1c2VyID0gdGhpcy5nZXRVc2VyRnJvbVN0b3JhZ2UodXNlcklkKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGxldCByZWNlaXZlZFVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXJCeUlkQXBpKHVzZXJJZCk7XG4gICAgICBpZiAoIXJlY2VpdmVkVXNlcikgcmV0dXJuIG51bGw7XG4gICAgICB1c2VyID0gdGhpcy5nZXRVc2VyRnJvbVN0b3JhZ2UodXNlcklkKTtcbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICB0aGlzLnNhdmVVc2VyVG9TdG9yYWdlKHJlY2VpdmVkVXNlcik7XG4gICAgICAgIHVzZXIgPSByZWNlaXZlZFVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyO1xuICB9XG4gIGFzeW5jIGdldFRva2VuKCkge1xuICAgIGNvbnN0IGV4cGlyeURhdGUgPSBuZXcgRGF0ZSh0aGlzLnN0b3JhZ2UuZ2V0VXNlcigpLmV4cGlyeWRhdGUpO1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICBsZXQgYWNjZXNzdG9rZW4gPSB0aGlzLnN0b3JhZ2UuZ2V0VXNlcigpLmFjY2Vzc3Rva2VuO1xuXG4gICAgLyotLSBjaGVja2luZyBpZiB0b2tlbiBleGlzdHMgYW5kIGlmIGl0J3Mgbm90IGV4cGlyZWQqL1xuICAgIGlmIChleHBpcnlEYXRlIDwgY3VycmVudERhdGUgfHwgIWFjY2Vzc3Rva2VuKSB7XG4gICAgICAvKi0tIElmIHRva2VuIGlzIGV4cGlyZWQgd2Ugc2VuZCByZXF1ZXN0IHRvIHNlcnZlciB0byB1cGRhdGUgaXQqL1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMudXBkYXRlVG9rZW4odGhpcy5zdG9yYWdlLmdldFVzZXIoKS5hdXRoX2tleSk7XG4gICAgICB0aGlzLnN0b3JhZ2UudXBkYXRlVXNlcih1c2VyKTtcbiAgICAgIGFjY2Vzc3Rva2VuID0gdXNlci5hY2Nlc3N0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2Vzc3Rva2VuO1xuICB9XG59XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vR1VESFVCL0dIQ29uc3RydWN0b3IvY3JlYXRlQW5ndWxhck1vZHVsZUluc3RhbmNlLmpzXG52YXIgY3JlYXRlQW5ndWxhck1vZHVsZUluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjApO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0dIQ29uc3RydWN0b3IvY3JlYXRlQ2xhc3NJbnN0YW5jZS5qc1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNsYXNzSW5zdGFuY2UoZ3VkaHViLCBtb2R1bGVfaWQsIGpzX3VybCwgY3NzX3VybCwgbm9kZVdpbmRvdykge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIHVybCB0byBqYXZhc2NyaXB0IGZpbGUgb2YgbW9kdWxlXG5cbiAgICBpZiAoIWpzX3VybCkge1xuICAgICAgY29uc29sZS5lcnJvcihgSlMgbGluayBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGlzIGRhdGEgdHlwZSAtICR7bW9kdWxlX2lkfWApO1xuICAgIH1cblxuICAgIC8vIEltcG9ydCBtb2R1bGUgdXNpbmcgZHluYW1pYyBpbXBvcnRcblxuICAgIGxldCBkb3dubG9hZE1vZHVsZSA9IHVybCA9PiB7XG4gICAgICBpZiAoIWNvbnN0cy8qIElTX0JST1dTRVJfTUFJTl9USFJFQUQgKi8uU1IgJiYgIWdsb2JhbC5oYXNPd25Qcm9wZXJ0eSgnd2luZG93JykpIHtcbiAgICAgICAgZ2xvYmFsLndpbmRvdyA9IHByb3h5O1xuICAgICAgICBnbG9iYWwuZG9jdW1lbnQgPSBub2RlV2luZG93LmRvY3VtZW50O1xuICAgICAgICBnbG9iYWwuRWxlbWVudCA9IG5vZGVXaW5kb3cuRWxlbWVudDtcbiAgICAgICAgZ2xvYmFsLkNoYXJhY3RlckRhdGEgPSBub2RlV2luZG93LkNoYXJhY3RlckRhdGE7XG4gICAgICAgIGdsb2JhbC50aGlzID0gcHJveHk7XG4gICAgICAgIGdsb2JhbC5zZWxmID0gcHJveHk7XG4gICAgICAgIGdsb2JhbC5CbG9iID0gbm9kZVdpbmRvdy5CbG9iO1xuICAgICAgICBnbG9iYWwuTm9kZSA9IG5vZGVXaW5kb3cuTm9kZTtcbiAgICAgICAgZ2xvYmFsLm5hdmlnYXRvciA9IG5vZGVXaW5kb3cubmF2aWdhdG9yO1xuICAgICAgICBnbG9iYWwuSFRNTEVsZW1lbnQgPSBub2RlV2luZG93LkhUTUxFbGVtZW50O1xuICAgICAgICBnbG9iYWwuWE1MSHR0cFJlcXVlc3QgPSBub2RlV2luZG93LlhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICBnbG9iYWwuV2ViU29ja2V0ID0gbm9kZVdpbmRvdy5XZWJTb2NrZXQ7XG4gICAgICAgIGdsb2JhbC5jcnlwdG8gPSBub2RlV2luZG93LmNyeXB0bztcbiAgICAgICAgZ2xvYmFsLkRPTVBhcnNlciA9IG5vZGVXaW5kb3cuRE9NUGFyc2VyO1xuICAgICAgICBnbG9iYWwuU3ltYm9sID0gbm9kZVdpbmRvdy5TeW1ib2w7XG4gICAgICAgIGdsb2JhbC5kb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQgPSBjb21tYW5kID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnUVVFUlkgQ09NTUFORCBTVVBQT1JURUQ6ICcsIGNvbW1hbmQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgZ2xvYmFsLmFuZ3VsYXIgPSBhbmd1bGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICBsZXQgbW9kdWxlRGF0YSA9IGF3YWl0IGF4aW9zLmdldCh1cmwpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBmZXRjaDogJHt1cmx9IGluIGdoY29uc3RydWN0b3IuIE1vZHVsZSBpZDogJHttb2R1bGVfaWR9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZW5jb2RlZEpzID0gZW5jb2RlVVJJQ29tcG9uZW50KG1vZHVsZURhdGEuZGF0YSk7XG4gICAgICAgIGxldCBkYXRhVXJpID0gJ2RhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZWRKcztcbiAgICAgICAgcmVzb2x2ZShkYXRhVXJpKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgbGV0IG1vZHVsZURhdGEgPSBhd2FpdCBkb3dubG9hZE1vZHVsZShqc191cmwpO1xuICAgIGxldCBtb2R1bGU7XG4gICAgdHJ5IHtcbiAgICAgIG1vZHVsZSA9IGF3YWl0IGltcG9ydCggLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL21vZHVsZURhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coYEVycm9yIHdoaWxlIGltcG9ydGluZyBtb2R1bGU6ICR7bW9kdWxlX2lkfWApO1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGluZyBjbGFzcyBmcm9tIGltcG9ydGVkIG1vZHVsZVxuXG4gICAgbGV0IGltcG9ydGVkQ2xhc3MgPSBuZXcgbW9kdWxlLmRlZmF1bHQobW9kdWxlX2lkKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIHVybCB0byBjc3MgZmlsZSBvZiBtb2R1bGVcbiAgICAvLyBJZiB0cnVlLCBhbmQgdGhlcmUgaXMgbm8gY3NzIGZvciB0aGlzIGRhdGEgdHlwZSwgdGhhbiBjcmVhdGUgbGluayB0YWcgdG8gdGhpcyBjc3MgaW4gaGVhZFxuXG4gICAgaWYgKGNzc191cmwgJiYgY29uc3RzLyogSVNfQlJPV1NFUl9NQUlOX1RIUkVBRCAqLy5TUikge1xuICAgICAgY29uc3QgbGlua1RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmtUYWcuaHJlZiA9IGNzc191cmw7XG4gICAgICBsaW5rVGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1tb2R1bGUnLCBtb2R1bGVfaWQpO1xuICAgICAgbGlua1RhZy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmtUYWcpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgdHlwZTogbW9kdWxlX2lkLFxuICAgICAgLy8qKioqKioqKioqKioqKiogR0VUIFRFTVBMQVRFICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICBnZXRUZW1wbGF0ZTogZnVuY3Rpb24gKHJlZiwgY2hhbmdlRmllbGROYW1lLCBkaXNwbGF5RmllbGROYW1lLCBmaWVsZF9tb2RlbCwgYXBwSWQsIGl0ZW1JZCkge1xuICAgICAgICBsZXQgZGlzcGxheUZpZWxkTmFtZUNoZWNrZWQgPSBkaXNwbGF5RmllbGROYW1lID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICByZXR1cm4gaW1wb3J0ZWRDbGFzcy5nZXRUZW1wbGF0ZShyZWYsIGNoYW5nZUZpZWxkTmFtZSwgZGlzcGxheUZpZWxkTmFtZUNoZWNrZWQsIGZpZWxkX21vZGVsLCBhcHBJZCwgaXRlbUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgREVGQVVMVCBWQUxVRSAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0RGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoZmllbGRNb2RlbCwgdmFsdWVzQXJyYXksIGl0ZW1zTGlzdCwgY3VycmVudEFwcElkKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgICAgICBsZXQgZ2V0VmFsdWVGdW5jdGlvbiA9IGltcG9ydGVkQ2xhc3MuZ2V0RGVmYXVsdFZhbHVlO1xuICAgICAgICAgIGlmIChnZXRWYWx1ZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBnZXRWYWx1ZUZ1bmN0aW9uKGZpZWxkTW9kZWwsIHZhbHVlc0FycmF5LCBpdGVtc0xpc3QsIGN1cnJlbnRBcHBJZCk7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBTRVRUSU5HUyAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0U2V0dGluZ3M6IGZ1bmN0aW9uIChzY29wZSwgc2V0dGluZ1R5cGUsIGZpZWxkTW9kZWxzKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRlZENsYXNzLmdldFNldHRpbmdzKHNjb3BlLCBzZXR0aW5nVHlwZSwgZmllbGRNb2RlbHMpO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEZJTFRFUioqKioqKioqKioqKioqKiovL1xuXG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgZ2V0U2VhcmNoT3B0aW9uczogZnVuY3Rpb24gKGZpZWxkTW9kZWwpIHtcbiAgICAgICAgICBsZXQgZF90eXBlID0gaW1wb3J0ZWRDbGFzcztcbiAgICAgICAgICBpZiAoZF90eXBlLmZpbHRlciAmJiBkX3R5cGUuZmlsdGVyLmdldFNlYXJjaE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBpbXBvcnRlZENsYXNzLmZpbHRlci5nZXRTZWFyY2hPcHRpb25zKGZpZWxkTW9kZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICAgIGdldERyb3Bkb3duVmFsdWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IGRfdHlwZSA9IGltcG9ydGVkQ2xhc3M7XG4gICAgICAgICAgaWYgKGRfdHlwZS5maWx0ZXIgJiYgZF90eXBlLmZpbHRlci5nZXREcm9wZG93blZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIGRfdHlwZS5maWx0ZXIuZ2V0RHJvcGRvd25WYWx1ZXMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBJTlRFUlBSRVRBVElPTiAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0SW50ZXJwcmV0YXRpb246IGZ1bmN0aW9uICh2YWx1ZSwgaW50ZXJwcmV0YXRpb25faWQsIGRhdGFUeXBlLCBmaWVsZCwgaXRlbUlkLCBhcHBJZCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgcmVzb2x2ZSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnREYXRhVHlwZSA9IGltcG9ydGVkQ2xhc3M7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBpbnRlcnByX2FyciA9IGF3YWl0IGN1cnJlbnREYXRhVHlwZS5nZXRJbnRlcnByZXRhdGlvbihndWRodWIsIHZhbHVlLCBhcHBJZCwgaXRlbUlkLCBmaWVsZCwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBpbnRlcnByX2Fyci5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PSBpbnRlcnByZXRhdGlvbl9pZCkgfHwgaW50ZXJwcl9hcnIuZmluZChpdGVtID0+IGl0ZW0uaWQgPT0gJ2RlZmF1bHQnKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBkYXRhLmNvbnRlbnQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBodG1sOiByZXN1bHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRVJST1IgSU4gJHttb2R1bGVfaWR9YCwgZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGh0bWw6ICc8c3Bhbj5ubyBpbnRlcnByZXRhdGlvbjwvc3Bhbj4nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBJTlRFUlBSRVRBVElPTlMgTElTVCAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0SW50ZXJwcmV0YXRpb25zTGlzdDogZnVuY3Rpb24gKGZpZWxkX3ZhbHVlLCBhcHBJZCwgaXRlbUlkLCBmaWVsZCkge1xuICAgICAgICByZXR1cm4gaW1wb3J0ZWRDbGFzcy5nZXRJbnRlcnByZXRhdGlvbihmaWVsZF92YWx1ZSwgYXBwSWQsIGl0ZW1JZCwgZmllbGQpO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBJTlRFUlBSRVRBVEVEIFZBTFVFICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICBnZXRJbnRlcnByZXRhdGVkVmFsdWU6IGZ1bmN0aW9uIChmaWVsZF92YWx1ZSwgZmllbGRfbW9kZWwsIGFwcElkLCBpdGVtSWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICAgIGxldCBnZXRJbnRlcnByZXRhdGVkVmFsdWVGdW5jdGlvbiA9IGltcG9ydGVkQ2xhc3MuZ2V0SW50ZXJwcmV0YXRlZFZhbHVlO1xuICAgICAgICAgIGlmIChnZXRJbnRlcnByZXRhdGVkVmFsdWVGdW5jdGlvbikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gYXdhaXQgZ2V0SW50ZXJwcmV0YXRlZFZhbHVlRnVuY3Rpb24oZmllbGRfdmFsdWUsIGZpZWxkX21vZGVsLCBhcHBJZCwgaXRlbUlkKTtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGZpZWxkX3ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIE9OIE1FU1NBR0UgKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIG9uTWVzc2FnZTogZnVuY3Rpb24gKGFwcElkLCB1c2VySWQsIHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBvbk1lc3NhZ2VGdW5jdGlvbiA9IGltcG9ydGVkQ2xhc3Mub25NZXNzYWdlO1xuICAgICAgICAgIGlmIChvbk1lc3NhZ2VGdW5jdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb25NZXNzYWdlRnVuY3Rpb24oYXBwSWQsIHVzZXJJZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBFWFRFTkQgQ09OVFJPTExFUiAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZXh0ZW5kQ29udHJvbGxlcjogZnVuY3Rpb24gKGFjdGlvblNjb3BlKSB7XG4gICAgICAgIGltcG9ydGVkQ2xhc3MuZ2V0QWN0aW9uU2NvcGUoYWN0aW9uU2NvcGUpO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIFJVTiBBQ1RJT04gKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIHJ1bkFjdGlvbjogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1wb3J0ZWRDbGFzcy5ydW5BY3Rpb24oc2NvcGUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBXSU5ET1cgU0NPUEUgKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIGdldFdpbmRvd1Njb3BlOiBmdW5jdGlvbiAod2luZG93U2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGltcG9ydGVkQ2xhc3MuZ2V0V2luZG93U2NvcGUod2luZG93U2NvcGUpO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBXSU5ET1cgSFRNTCAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0V2luZG93SFRNTDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRlZENsYXNzLmdldFdpbmRvd0hUTUwoc2NvcGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coZXJyKTtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIGluIGNyZWF0ZUNsYXNzSW5zdGFuY2UgKGdoY29uc3RydWN0b3IpLiBNb2R1bGUgaWQ6ICR7bW9kdWxlX2lkfS4gSlMgdXJsOiAke2pzX3VybH1gKTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0dIQ29uc3RydWN0b3IvZ2hjb25zdHJ1Y3Rvci5qc1xuXG5cbmNsYXNzIEdIQ29uc3RydWN0b3Ige1xuICBjb25zdHJ1Y3RvcihndWRodWIpIHtcbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5tb2R1bGVzUXVldWUgPSB7fTtcbiAgICB0aGlzLmFuZ3VsYXJJbmplY3RvcjtcbiAgICB0aGlzLm5vZGVXaW5kb3c7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIEdFVCBJTlNUQU5DRSAqKioqKioqKioqKioqKiovXG4gIC8vIEZpcnN0bHksIGNoZWNrIGlmIG1vZHVsZSBpcyBsb2FkaW5nIHJpZ2h0IG5vdyBpbiBtb2R1bGVzIHF1ZXVlLlxuICAvLyBJZiBub3QsIGNoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZS4gSWYgbm90LCBjcmVhdGUgbmV3IGluc3RhbmNlIGFuZCBwdXQgbG9hZGluZyB0byBtb2R1bGVzIHF1ZXVlLlxuICAvLyBJZiB5ZXMsIHJldHVybiBtb2R1bGUgZnJvbSBjYWNoZS5cblxuICBhc3luYyBnZXRJbnN0YW5jZShtb2R1bGVfaWQpIHtcbiAgICBpZiAodGhpcy5nZXRDYWNoZWQobW9kdWxlX2lkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkKG1vZHVsZV9pZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZHVsZXNRdWV1ZVttb2R1bGVfaWRdKSB7XG4gICAgICBhd2FpdCB0aGlzLm1vZHVsZXNRdWV1ZVttb2R1bGVfaWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZHVsZXNRdWV1ZVttb2R1bGVfaWRdID0gdGhpcy5jcmVhdGVJbnN0YW5jZShtb2R1bGVfaWQpO1xuICAgICAgYXdhaXQgdGhpcy5tb2R1bGVzUXVldWVbbW9kdWxlX2lkXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkKG1vZHVsZV9pZCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIFBVVCBUTyBDQUNIRSAqKioqKioqKioqKioqKiovXG4gIC8vIEp1c3QgcHVzaGluZyBtb2R1bGUgdG8gY2FjaGUuXG5cbiAgcHVwVG9DYWNoZShtb2R1bGVfaWQsIG1vZHVsZSkge1xuICAgIHRoaXMuY2FjaGVbbW9kdWxlX2lkXSA9IG1vZHVsZTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKiogR0VUIENBQ0hFRCAqKioqKioqKioqKioqKiovXG4gIC8vIEZpbmQgbW9kdWxlIGluIGNhY2hlIGFuZCByZXR1cm4gaXQuXG5cbiAgZ2V0Q2FjaGVkKG1vZHVsZV9pZCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlW21vZHVsZV9pZF07XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIElOSVQgQU5HVUxBUiBJTkpFQ1RPUiAqKioqKioqKioqKioqKiovXG4gIC8vIFNhdmVzIGFuZ3VsYXIgaW5qZWN0b3IgdG8gdGhpcy5hbmd1bGFySW5qZWN0b3IuXG4gIC8vIEl0J3MgbmVlZGVkIHRvIGNvcnJlY3RseSB0YWtlcyBtb2R1bGUncyBmdW5jdGlvbnMsIHRoYXQgdXNlcyBhbmd1bGFyIHNlcnZpY2VzLlxuXG4gIGluaXRBbmd1bGFySW5qZWN0b3IoYW5ndWxhckluamVjdG9yKSB7XG4gICAgdGhpcy5hbmd1bGFySW5qZWN0b3IgPSBhbmd1bGFySW5qZWN0b3I7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIElOSVQgSlNET00gV0lORE9XICoqKioqKioqKioqKioqKi9cbiAgLy8gU2F2ZXMganNkb20ncyB3aW5kb3cgb2JqZWN0IHRvIHRoaXMud2luZG93LlxuICAvLyBJdCdzIG5lZWRlZCB0byBldmFsIGJyb3dzZXIgY29kZSBvbiBub2RlIHdoZW4gbGlicmFyeSB3b3JrcyBpbiBub2RlIGVudmlyb25tZW50LlxuXG4gIGluaXRKc2RvbVdpbmRvdyh3aW5kb3cpIHtcbiAgICB0aGlzLm5vZGVXaW5kb3cgPSB3aW5kb3c7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIENSRUFURSBJTlNUQU5DRSAqKioqKioqKioqKioqKiovXG4gIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBcImFuZ3VsYXJcIiBvciBcImNsYXNzXCJcbiAgLy8gVGhhbiwgY3JlYXRpbmcgaW5zdGFuY2UgZm9yIHRoYXQgdHlwZSBvZiBtb2R1bGVcbiAgLy8gRmluYWxseSwgcmV0dXJucyB0aGUgcmVzdWx0IChjcmVhdGVkIGluc3RhbmNlKSBhbmQgcHV0aW5nIGl0IHRvIHRoZSBjYWNoZVxuXG4gIGFzeW5jIGNyZWF0ZUluc3RhbmNlKG1vZHVsZV9pZCkge1xuICAgIGxldCBtb2R1bGUgPSB0aGlzLmd1ZGh1Yi5zdG9yYWdlLmdldE1vZHVsZVVybChtb2R1bGVfaWQpO1xuICAgIGlmICghbW9kdWxlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ2Fubm90IGZpbmQgbW9kdWxlOiAke21vZHVsZV9pZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdnaF9lbGVtZW50Jykge1xuICAgICAgaWYgKG1vZHVsZS50ZWNobm9sb2d5ID09PSAnYW5ndWxhcicpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgKDAsY3JlYXRlQW5ndWxhck1vZHVsZUluc3RhbmNlLyogZGVmYXVsdCAqLy5aKSh0aGlzLmd1ZGh1YiwgbW9kdWxlX2lkLCBtb2R1bGUudXJsLCB0aGlzLmFuZ3VsYXJJbmplY3RvciwgdGhpcy5ub2RlV2luZG93KTtcbiAgICAgIH0gZWxzZSBpZiAobW9kdWxlLnRlY2hub2xvZ3kgPT09ICdjbGFzcycpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY3JlYXRlQ2xhc3NJbnN0YW5jZSh0aGlzLmd1ZGh1YiwgbW9kdWxlX2lkLCBtb2R1bGUuanMsIG1vZHVsZS5jc3MsIHRoaXMubm9kZVdpbmRvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMucHVwVG9DYWNoZShtb2R1bGVfaWQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9BcHBQcm9jZXNzb3IvQXBwUHJvY2Vzc29yLmpzXG5cbmNsYXNzIEFwcFByb2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKHN0b3JhZ2UsIHBpcGVTZXJ2aWNlLCByZXEsIHdlYnNvY2tldCxcbiAgLy8gY2h1bmtzTWFuYWdlcixcbiAgdXRpbCwgYWN0aXZhdGVTVywgZGF0YVNlcnZpY2UpIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSBzdG9yYWdlO1xuICAgIHRoaXMucGlwZVNlcnZpY2UgPSBwaXBlU2VydmljZTtcbiAgICB0aGlzLnJlcSA9IHJlcTtcbiAgICB0aGlzLndzID0gd2Vic29ja2V0O1xuICAgIHRoaXMuYXBwbGlzdFJlY2VpdmVkID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmF0ZVNXID0gYWN0aXZhdGVTVzsgLy8gd2UgdXNlIHRoaXMgZmxhZyB0byBjaGVjayBpZiBhcHBsaXN0IHdhcyByZWNlaXZlZC4gVGhlIHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgcmVjZWl2ZSBhbiBhcHAgaXQgYWxzbyBnb2VzIHRvIGFwcF9saXN0IGFzIGEgcmVzdWx0IHlvdSBoYXZlIHRoZSBhcHBfbGlzdCB3aXRoIG9uZSBhcHAuXG4gICAgLy8gdGhpcy5jaHVua3NNYW5hZ2VyID0gY2h1bmtzTWFuYWdlcjtcbiAgICB0aGlzLnV0aWwgPSB1dGlsO1xuICAgIHRoaXMuYXBwTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IGRhdGFTZXJ2aWNlO1xuICAgIHRoaXMuYXBwUmVxdWVzdENhY2hlID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gdGhpcy5kYXRhU2VydmljZVJlcXVlc3RlZElkU2V0ID0gbmV3IFNldDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU5ld0FwcEFwaShhcHApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvYXBwL2NyZWF0ZVwiLFxuICAgICAgICBmb3JtOiB7XG4gICAgICAgICAgYXBwOiBKU09OLnN0cmluZ2lmeShhcHApXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmVzcG9uc2UuZnJvbV9hcHBzX2xpc3QgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyB1cGRhdGVBcHBBcGkoYXBwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL2FwcC91cGRhdGVcIixcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGFwcDogSlNPTi5zdHJpbmdpZnkoYXBwKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZGVsZXRlQXBwQXBpKGFwcF9pZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9hcHAvZGVsZXRlXCIsXG4gICAgICAgIGZvcm06IHtcbiAgICAgICAgICBhcHBfaWRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldEFwcExpc3RBcGkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXEuZ2V0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvYXBwbGlzdC9nZXRcIlxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYXBwc19saXN0Lm1hcChhcHAgPT4ge1xuICAgICAgICBhcHAuZnJvbV9hcHBzX2xpc3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGdldEFwcExpc3RGcm9tU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEFwcHNMaXN0KCk7XG4gIH1cbiAgZ2V0QXBwRnJvbVN0b3JhZ2UoYXBwX2lkKSB7XG4gICAgY29uc3QgYXBwID0gdGhpcy5zdG9yYWdlLmdldEFwcChhcHBfaWQpO1xuICAgIHJldHVybiBhcHAgJiYgYXBwLmZpZWxkX2xpc3QubGVuZ3RoID8gYXBwIDogbnVsbDtcbiAgfVxuICBhZGROZXdBcHBUb1N0b3JhZ2UoYXBwKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRBcHBzTGlzdCgpLnB1c2goYXBwKTtcbiAgfVxuICBzYXZlQXBwSW5TdG9yYWdlKGFwcCkge1xuICAgIGFwcC5pdGVtc19vYmplY3QgPSB7fTtcbiAgICBmb3IgKGxldCBpdGVtID0gMDsgaXRlbSA8IGFwcC5pdGVtc19saXN0Lmxlbmd0aDsgaXRlbSsrKSB7XG4gICAgICBhcHAuaXRlbXNfb2JqZWN0W2FwcC5pdGVtc19saXN0W2l0ZW1dLml0ZW1faWRdID0ge307XG4gICAgICBmb3IgKGxldCBmaWVsZCA9IDA7IGZpZWxkIDwgYXBwLml0ZW1zX2xpc3RbaXRlbV0uZmllbGRzLmxlbmd0aDsgZmllbGQrKykge1xuICAgICAgICBhcHAuaXRlbXNfb2JqZWN0W2FwcC5pdGVtc19saXN0W2l0ZW1dLml0ZW1faWRdW2FwcC5pdGVtc19saXN0W2l0ZW1dLmZpZWxkc1tmaWVsZF0uZmllbGRfaWRdID0gYXBwLml0ZW1zX2xpc3RbaXRlbV0uZmllbGRzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RvcmFnZUFwcCA9IHRoaXMuc3RvcmFnZS5nZXRBcHAoYXBwLmFwcF9pZCk7XG4gICAgaWYgKHN0b3JhZ2VBcHApIHtcbiAgICAgIGFwcC5mcm9tX2FwcHNfbGlzdCA9IHN0b3JhZ2VBcHAuZnJvbV9hcHBzX2xpc3Q7XG4gICAgICBhcHAucGVybWlzc2lvbiA9IHN0b3JhZ2VBcHAucGVybWlzc2lvbjtcbiAgICAgIHRoaXMuc3RvcmFnZS51cGRhdGVBcHAoYXBwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwLmZyb21fYXBwc19saXN0ID0gZmFsc2U7XG4gICAgICB0aGlzLmFkZE5ld0FwcFRvU3RvcmFnZShhcHApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBcHBGcm9tU3RvcmFnZShhcHAuYXBwX2lkKTtcbiAgfVxuICB1cGRhdGVBcHBGaWVsZHNBbmRWaWV3cyhhcHApIHtcbiAgICBjb25zdCBzdG9yYWdlQXBwID0gdGhpcy5nZXRBcHBGcm9tU3RvcmFnZShhcHAuYXBwX2lkKTtcbiAgICBhcHAuaXRlbXNfbGlzdCA9IHN0b3JhZ2VBcHAuaXRlbXNfbGlzdDtcbiAgICBhcHAuZmlsZV9saXN0ID0gc3RvcmFnZUFwcC5maWxlX2xpc3Q7XG4gICAgYXBwLmZyb21fYXBwc19saXN0ID0gc3RvcmFnZUFwcC5mcm9tX2FwcHNfbGlzdDtcbiAgICBhcHAuaXRlbXNfb2JqZWN0ID0gc3RvcmFnZUFwcC5pdGVtc19vYmplY3Q7XG4gICAgdGhpcy5zdG9yYWdlLnVwZGF0ZUFwcChhcHApO1xuICAgIC8vLS0gU2VuZGluZyB1cGRhdGVzIGZvciBWaWV3cyBVcGRhdGVzXG4gICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwX3ZpZXdzX3VwZGF0ZVwiLCB7XG4gICAgICBhcHBfaWQ6IGFwcC5hcHBfaWRcbiAgICB9LCBhcHAudmlld3NfbGlzdCk7XG5cbiAgICAvLy0tIFNlbmRpbmcgdXBkYXRlcyBmb3IgdXBkYXRpbmcgRmllbGRzXG4gICAgYXBwLmZpZWxkX2xpc3QuZm9yRWFjaChmaWVsZE1vZGVsID0+IHtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX21vZGVsX3VwZGF0ZVwiLCB7XG4gICAgICAgIGFwcF9pZDogYXBwLmFwcF9pZCxcbiAgICAgICAgZmllbGRfaWQ6IGZpZWxkTW9kZWwuZmllbGRfaWRcbiAgICAgIH0sIGZpZWxkTW9kZWwpO1xuICAgIH0pO1xuICB9XG4gIHVwZGF0ZUFwcEluU3RvcmFnZShhcHApIHtcbiAgICBjb25zdCBzdG9yYWdlQXBwID0gdGhpcy5zdG9yYWdlLmdldEFwcChhcHAuYXBwX2lkKTtcbiAgICBpZiAoc3RvcmFnZUFwcCkge1xuICAgICAgdGhpcy5zdG9yYWdlLnVwZGF0ZUFwcChhcHApO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwX3VwZGF0ZVwiLCB7XG4gICAgICAgIGFwcF9pZDogYXBwLmFwcF9pZFxuICAgICAgfSwgYXBwKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1zX3VwZGF0ZVwiLCB7XG4gICAgICAgIGFwcF9pZDogYXBwLmFwcF9pZFxuICAgICAgfSwgYXBwLml0ZW1zX2xpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE5ld0FwcFRvU3RvcmFnZShhcHApO1xuICAgIH1cbiAgICA7XG4gIH1cbiAgZGVsZXRpbmdBcHBGcm9tU3RvcmFnZShhcHBfaWQpIHtcbiAgICBsZXQgYXBwTGlzdCA9IHRoaXMuc3RvcmFnZS5nZXRBcHBzTGlzdCgpO1xuICAgIGFwcExpc3QuZm9yRWFjaCgoYXBwLCBrZXkpID0+IHtcbiAgICAgIGlmIChhcHAuYXBwX2lkID09IGFwcF9pZCkgYXBwTGlzdC5zcGxpY2Uoa2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXBwTGlzdDtcbiAgfVxuXG4gIC8vLS0gaGVyZSB3ZSBjaGVjayBpZiBhcHAgYWxyZWFkeSBpbiBzdG9yYWdlIHRoZW4gd2UgZG9udCB1cGRhdGUgaXQuXG4gIC8vLS0gdGhlIHRoaW5nIGlzIHRoYXQgaXMgcG9zaWJsZSB0aGF0IHdlIHJlY2VpdmUgYXBwIGJlZm9yZSByZWNlaXZlbmcgYW4gYXBwbGlzdFxuICB1cGRhdGVBcHBzTGlzdEluU3RvcmFnZShhcHBzTGlzdCA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBhcHAgb2YgYXBwc0xpc3QpIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VBcHAgPSB0aGlzLnN0b3JhZ2UuZ2V0QXBwKGFwcC5hcHBfaWQpO1xuICAgICAgaWYgKHN0b3JhZ2VBcHApIHtcbiAgICAgICAgc3RvcmFnZUFwcC5mcm9tX2FwcHNfbGlzdCA9IGFwcC5mcm9tX2FwcHNfbGlzdDtcbiAgICAgICAgc3RvcmFnZUFwcC5wZXJtaXNzaW9uID0gYXBwLnBlcm1pc3Npb247XG4gICAgICB9IGVsc2UgdGhpcy5hZGROZXdBcHBUb1N0b3JhZ2UoYXBwKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgcmVmcmVzaEFwcHMoYXBwc19pZCA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBhcHBfaWQgb2YgYXBwc19pZCkge1xuICAgICAgaWYgKGFwcF9pZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldEFwcChhcHBfaWQpO1xuICAgICAgICAgIGlmIChhcHApIHtcbiAgICAgICAgICAgIGFwcC5pdGVtc19vYmplY3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gPSAwOyBpdGVtIDwgYXBwLml0ZW1zX2xpc3QubGVuZ3RoOyBpdGVtKyspIHtcbiAgICAgICAgICAgICAgYXBwLml0ZW1zX29iamVjdFthcHAuaXRlbXNfbGlzdFtpdGVtXS5pdGVtX2lkXSA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGxldCBmaWVsZCA9IDA7IGZpZWxkIDwgYXBwLml0ZW1zX2xpc3RbaXRlbV0uZmllbGRzLmxlbmd0aDsgZmllbGQrKykge1xuICAgICAgICAgICAgICAgIGFwcC5pdGVtc19vYmplY3RbYXBwLml0ZW1zX2xpc3RbaXRlbV0uaXRlbV9pZF1bYXBwLml0ZW1zX2xpc3RbaXRlbV0uZmllbGRzW2ZpZWxkXS5maWVsZF9pZF0gPSBhcHAuaXRlbXNfbGlzdFtpdGVtXS5maWVsZHNbZmllbGRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFwcEluU3RvcmFnZShhcHApO1xuICAgICAgICAgICAgLy8gVGhpcyBlbWl0IG5lZWRzIHRvIHVwZGF0ZSB2YWx1ZXMgaW4gYXBwIGFmdGVyIHdlYnNvY2tldHMgcmVjb25uZWN0XG4gICAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoJ2doX2FwcF92aWV3c191cGRhdGUnLCB7XG4gICAgICAgICAgICAgIGFwcF9pZDogYXBwLmFwcF9pZFxuICAgICAgICAgICAgfSwgYXBwLnZpZXdzX2xpc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcIkFwcHMgcmVmcmVzaGVkOiBcIiwgSlNPTi5zdHJpbmdpZnkoYXBwc19pZCkpO1xuICB9XG4gIGFzeW5jIHJlZnJlc2hBcHBzTGlzdCgpIHtcbiAgICBsZXQgY3VycmVudEFwcHNMaXN0ID0gdGhpcy5nZXRBcHBMaXN0RnJvbVN0b3JhZ2UoKTtcbiAgICBsZXQgYXBwc0xpc3RGcm9tQXBpID0gYXdhaXQgdGhpcy5nZXRBcHBMaXN0QXBpKCk7XG4gICAgbGV0IG1lcmdlZEFwcHNMaXN0ID0gYXBwc0xpc3RGcm9tQXBpLm1hcChhcGlBcHAgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYXBpQXBwLFxuICAgICAgICAuLi5jdXJyZW50QXBwc0xpc3QuZmluZChhcHAgPT4gYXBwLmFwcF9pZCA9PT0gYXBpQXBwLmFwcF9pZClcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBcHBzTGlzdEluU3RvcmFnZShtZXJnZWRBcHBzTGlzdCk7XG4gICAgdGhpcy5waXBlU2VydmljZS5lbWl0KCdnaF9hcHBzX2xpc3RfcmVmcmVzaGVkJywge30pO1xuICB9XG4gIGFzeW5jIGdldEFwcHNMaXN0KCkge1xuICAgIGxldCBhcHBfbGlzdCA9IHRoaXMuZ2V0QXBwTGlzdEZyb21TdG9yYWdlKCk7XG4gICAgaWYgKCF0aGlzLmFwcGxpc3RSZWNlaXZlZCkge1xuICAgICAgbGV0IHJlY2VpdmVkX2FwcF9saXN0ID0gYXdhaXQgdGhpcy5nZXRBcHBMaXN0QXBpKCk7XG4gICAgICBpZiAoIXJlY2VpdmVkX2FwcF9saXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gZm9yIG9wcmltaXphdGlvbiBwdXJwb3NlOiBpbiBjYXNlIHdoZW4gdGhlcmUgd2FzIHNldmVyYWxzIGNhbGxzIGF0IHNhbWUgbW9tZW50IG9mIHRoZSBnZXRBcHBMaXN0cyBvbmUgY2FsbCB3aWxsIG92ZXJ3cml0ZSBhcHBfbGlzdCBvZiBhbm90aGVyIGNhbGwgd2l0aCB0aGUgc2FtZSBhcHBfbGlzdCxcbiAgICAgIHRoaXMudXBkYXRlQXBwc0xpc3RJblN0b3JhZ2UocmVjZWl2ZWRfYXBwX2xpc3QpO1xuICAgICAgdGhpcy5hcHBsaXN0UmVjZWl2ZWQgPSB0cnVlO1xuICAgICAgYXBwX2xpc3QgPSByZWNlaXZlZF9hcHBfbGlzdDtcblxuICAgICAgLy8gSGVyZSB3ZSBnZXQgZGVmYXVsdCB1c2VyJ3MgYXBwXG4gICAgICAvLyBXZSBkbyBpdCBoZXJlIHRvIGRvIGl0IG9ubHkgb25jZVxuICAgICAgLy8gV2UgZG8gaXQgYmVjYXVzZSB3ZSBuZWVkIHRvIGluaXRpYWxpemUgV2ViU29ja2V0cywgd2hpY2ggd2UgZG8gaW4gZ2V0QXBwIG1ldGhvZFxuICAgICAgLy8gdGhpcy5nZXRBcHAodGhpcy5zdG9yYWdlLmdldFVzZXIoKS5hcHBfaW5pdCk7IC8vIGNvbW1lbnRlZCBkdWUgdG8gdW5maW5pc2hlZCBhcHBfaW5pdCBkZXZlbG9wbWVudCwgaXRzIHNoYXBlIGNhdXNlcyBleGNlcHRpb25zXG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcF9saXN0O1xuICB9XG5cbiAgLy8qKioqKioqKioqIEdFVCBBUFAgSU5GTyAqKioqKioqKioqKiovXG4gIC8vLS0gaXQgcmV0dXJzIEFwcCB3aXRoIEVtcHR5IGZpZWxkc19saXN0LCBpdGVtc19saXN0LCBmaWxlX2xpc3QsIHZpZXdzX2xpc3RcbiAgLy8tLSBTdWNoIHNpbW1wbGUgZGF0YSBuZWVkZWQgdG8gcmVuZGVyIEFwcCBJY29ucywgYW5kIGRvIHNvbWUgc2ltcGxlIHVwZGF0ZXMgaW4gQXBwIGxpa2UgdXBkYXRpbmcgQXBwIG5hbWUgaWNvbiBwZXJtaXNpb25zIGV0YyB3aGVuIGZ1bGwgYXBwIGRhdGEgaXMgbm90IG5lZWRlZFxuICBhc3luYyBnZXRBcHBJbmZvKGFwcF9pZCkge1xuICAgIGNvbnN0IGFwcF9saXN0ID0gYXdhaXQgdGhpcy5nZXRBcHBzTGlzdCgpO1xuICAgIHJldHVybiBhcHBfbGlzdCA/IGFwcF9saXN0LmZpbmQoYXBwID0+IGFwcC5hcHBfaWQgPT0gYXBwX2lkKSA6IG51bGw7XG4gIH1cbiAgYXN5bmMgZGVsZXRlQXBwKGFwcF9pZCkge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQXBwQXBpKGFwcF9pZCk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRpbmdBcHBGcm9tU3RvcmFnZShhcHBfaWQpO1xuICB9XG4gIGFzeW5jIGdldEFwcChhcHBfaWQsIHRyYXNoID0gZmFsc2UpIHtcbiAgICBpZiAoIWFwcF9pZCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFwcCA9IHRoaXMuZ2V0QXBwRnJvbVN0b3JhZ2UoYXBwX2lkKTtcbiAgICBpZiAoYXBwKSByZXR1cm4gYXBwO1xuICAgIGlmICh0aGlzLmFwcFJlcXVlc3RDYWNoZS5oYXMoYXBwX2lkKSkgcmV0dXJuIHRoaXMuYXBwUmVxdWVzdENhY2hlLmdldChhcHBfaWQpO1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBsZXQgcHIgPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgYXBwID0gYXdhaXQgc2VsZi5kYXRhU2VydmljZS5nZXRBcHAoYXBwX2lkKTtcbiAgICAgICAgaWYgKCFhcHApIHJlamVjdCgpO1xuXG4gICAgICAgIC8vISEhIHRlbXBvcmFyeSBjaGVjayAhISEhIGlmIGFwcCBoYXMgY2hhbmtzIHByb3BlcnR5IHRoZW4gd2Ugc3RhcnQgZ2V0dGluZyBpdFxuICAgICAgICAvLyBpZiAoXG4gICAgICAgIC8vICAgcmVjZWl2ZWRBcHAuY2h1bmtzICYmXG4gICAgICAgIC8vICAgcmVjZWl2ZWRBcHAuY2h1bmtzLmxlbmd0aFxuICAgICAgICAvLyApIHtcbiAgICAgICAgLy8gICAvLyBoZXJlIHNob3VsZCBiZSBjaGVja2VkIGlzIG1lcmdlIHJlcXVpcmVkXG5cbiAgICAgICAgLy8gICBsZXQgY2h1bmtzID0gYXdhaXQgc2VsZi5jaHVua3NNYW5hZ2VyLmdldENodW5rcyhhcHBfaWQsIHJlY2VpdmVkQXBwLmNodW5rcyk7XG4gICAgICAgIC8vICAgcmVjZWl2ZWRBcHAuaXRlbXNfbGlzdCA9IHNlbGYudXRpbC5tZXJnZUNodW5rcyhbXG4gICAgICAgIC8vICAgICAuLi5jaHVua3MsXG4gICAgICAgIC8vICAgICByZWNlaXZlZEFwcCxcbiAgICAgICAgLy8gICBdKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIFRoaXMgY29kZSBmb3IgdHJhc2ggbXVzdCBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHJldHVybiB0cmFzaCA/IGFwcCA6IHsuLi5hcHAsIGl0ZW1zX2xpc3Q6IGFwcC5pdGVtc19saXN0LmZpbHRlcihpdGVtID0+ICFpdGVtLnRyYXNoKX07XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IHRyYXNoID8gYXBwIDoge1xuICAgICAgICAgIC4uLmFwcCxcbiAgICAgICAgICBpdGVtc19saXN0OiBhcHAuaXRlbXNfbGlzdC5maWx0ZXIoaXRlbSA9PiAhaXRlbS50cmFzaClcbiAgICAgICAgfTtcbiAgICAgICAgZmlsdGVyZWQgPSB0cmFzaCA/IGZpbHRlcmVkIDoge1xuICAgICAgICAgIC4uLmZpbHRlcmVkLFxuICAgICAgICAgIGZpZWxkX2xpc3Q6IGZpbHRlcmVkLmZpZWxkX2xpc3QuZmlsdGVyKGYgPT4gIWYudHJhc2gpXG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmUoZmlsdGVyZWQpO1xuICAgICAgICBzZWxmLnNhdmVBcHBJblN0b3JhZ2UoZmlsdGVyZWQpO1xuICAgICAgICBzZWxmLndzLmFkZFN1YnNjcmlwdGlvbihhcHBfaWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5hcHBSZXF1ZXN0Q2FjaGUuc2V0KGFwcF9pZCwgcHIpO1xuICAgIHJldHVybiBwcjtcbiAgfVxuICBhc3luYyB1cGRhdGVBcHAoYXBwKSB7XG4gICAgaWYgKCFhcHAudmlld3NfbGlzdCB8fCAhYXBwLnZpZXdzX2xpc3QubGVuZ3RoIHx8ICFhcHAuc2hvdykge1xuICAgICAgY29uc3Qgc3RvcmFnZUFwcCA9IGF3YWl0IHRoaXMuZ2V0QXBwKGFwcC5hcHBfaWQpO1xuICAgICAgaWYgKCFhcHAudmlld3NfbGlzdCB8fCAhYXBwLnZpZXdzX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgIGFwcC52aWV3c19saXN0ID0gc3RvcmFnZUFwcC52aWV3c19saXN0O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBhcHAuc2hvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgYXBwLnNob3cgPSBzdG9yYWdlQXBwLnNob3c7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWRBcHAgPSBhd2FpdCB0aGlzLnVwZGF0ZUFwcEFwaShhcHApO1xuICAgIHRoaXMudXBkYXRlQXBwRmllbGRzQW5kVmlld3ModXBkYXRlZEFwcCk7XG4gICAgcmV0dXJuIHVwZGF0ZWRBcHA7XG4gIH1cbiAgYXN5bmMgdXBkYXRlQXBwSW5mbyhhcHBJbmZvID0ge30pIHtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9hcHBfaW5mb191cGRhdGVcIiwge1xuICAgICAgYXBwX2lkOiBhcHBJbmZvLmFwcF9pZFxuICAgIH0sIGFwcEluZm8pO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUFwcChhcHBJbmZvKTtcbiAgfVxuICBhc3luYyBjcmVhdGVOZXdBcHAoYXBwKSB7XG4gICAgY29uc3QgbmV3QXBwID0gYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBBcGkoYXBwKTtcbiAgICBuZXdBcHAuaXRlbXNfb2JqZWN0ID0ge307XG4gICAgdGhpcy5hZGROZXdBcHBUb1N0b3JhZ2UobmV3QXBwKTtcbiAgICByZXR1cm4gbmV3QXBwO1xuICB9XG4gIGFzeW5jIGdldEFwcFZpZXdzKGFwcF9pZCkge1xuICAgIGlmIChhcHBfaWQpIHtcbiAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuZ2V0QXBwKGFwcF9pZCk7XG4gICAgICByZXR1cm4gYXBwLnZpZXdzX2xpc3Q7XG4gICAgfVxuICB9XG4gIGFzeW5jIGhhbmRsZUFwcENoYW5nZShpZCwgcHJldlZlcnNpb24sIG5leHRWZXJzaW9uKSB7XG4gICAgbGV0IHJlczEgPSB0aGlzLnV0aWwuYXJlVmlld0xpc3RzRXF1YWwocHJldlZlcnNpb24udmlld3NfbGlzdCwgbmV4dFZlcnNpb24udmlld3NfbGlzdCk7XG4gICAgbGV0IHJlczIgPSB0aGlzLnV0aWwuYXJlRmllbGRMaXN0c0VxdWFsKHByZXZWZXJzaW9uLmZpZWxkX2xpc3QsIG5leHRWZXJzaW9uLmZpZWxkX2xpc3QpO1xuICAgIGlmIChyZXMxIHx8IHJlczIpIHtcbiAgICAgIHRoaXMudXBkYXRlQXBwRmllbGRzQW5kVmlld3Moe1xuICAgICAgICBpZCxcbiAgICAgICAgdmlld3NfbGlzdDogbmV4dFZlcnNpb24udmlld3NfbGlzdCxcbiAgICAgICAgZmllbGRfbGlzdDogbmV4dFZlcnNpb24uZmllbGRfbGlzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNsZWFyQXBwUHJvY2Vzc29yKCkge1xuICAgIHRoaXMuZ2V0QXBwTGlzdFByb21pc2VzID0gbnVsbDtcbiAgICB0aGlzLmdldEFwcFByb21pc2VzID0ge307XG4gICAgdGhpcy5hcHBsaXN0UmVjZWl2ZWQgPSBmYWxzZTtcbiAgfVxuICBhcHBMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5waXBlU2VydmljZS5vblJvb3QoXCJnaF9hcHBfZ2V0XCIsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXBwX2lkKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuZ2V0QXBwKGRhdGEuYXBwX2lkKTtcbiAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwX2dldFwiLCBkYXRhLCBhcHApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfYXBwc19saXN0X2dldFwiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBjb25zdCBhcHBMaXN0ID0gYXdhaXQgdGhpcy5nZXRBcHBzTGlzdCgpO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwc19saXN0X2dldFwiLCBkYXRhLCBhcHBMaXN0KTtcbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdChcImdoX2RlbGV0ZV9hcHBcIiwge30sIGFzeW5jIChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgYXBwTGlzdCA9IGF3YWl0IHRoaXMuZGVsZXRlQXBwKGRhdGEuYXBwX2lkKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2FwcHNfbGlzdF91cGRhdGVcIiwge1xuICAgICAgICByZWNpcGllbnQ6IFwiYWxsXCJcbiAgICAgIH0sIGFwcExpc3QpO1xuICAgIH0pO1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfYXBwX3VwZGF0ZVwiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBkYXRhLmFwcC5pdGVtc19saXN0ID0gW107XG4gICAgICBkYXRhLmFwcC5maWxlX2xpc3QgPSBbXTtcbiAgICAgIGNvbnN0IG5ld0FwcCA9IGF3YWl0IHRoaXMudXBkYXRlQXBwKGRhdGEuYXBwKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2FwcF92aWV3c191cGRhdGVcIiwge1xuICAgICAgICBhcHBfaWQ6IG5ld0FwcC5hcHBfaWRcbiAgICAgIH0sIG5ld0FwcC52aWV3c19saXN0KTtcbiAgICAgIGNvbnN0IGFwcHNMaXN0ID0gYXdhaXQgdGhpcy5nZXRBcHBzTGlzdCgpO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwc19saXN0X3VwZGF0ZVwiLCB7XG4gICAgICAgIHJlY2lwaWVudDogXCJhbGxcIlxuICAgICAgfSwgYXBwc0xpc3QpO1xuICAgICAgbmV3QXBwLmZpZWxkX2xpc3QuZm9yRWFjaChmaWVsZE1vZGVsID0+IHtcbiAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfbW9kZWxfdXBkYXRlXCIsIHtcbiAgICAgICAgICBhcHBfaWQ6IG5ld0FwcC5hcHBfaWQsXG4gICAgICAgICAgZmllbGRfaWQ6IGZpZWxkTW9kZWwuZmllbGRfaWRcbiAgICAgICAgfSwgZmllbGRNb2RlbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdChcImdoX2FwcF92aWV3X2dldFwiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmFwcF9pZCkge1xuICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmdldEFwcChkYXRhLmFwcF9pZCk7XG4gICAgICAgIGFwcC52aWV3c19saXN0LmZvckVhY2goKHZpZXcsIGtleSkgPT4ge1xuICAgICAgICAgIGlmICh2aWV3LnZpZXdfaWQgPT0gZGF0YS52aWV3X2lkKSB7XG4gICAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9hcHBfdmlld19nZXRcIiwgZGF0YSwgYXBwLnZpZXdzX2xpc3Rba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBhcHBfbmFtZSwgYXBwX2lkLCBhcHBfaWNvblxuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfYXBwX2luZm9fZ2V0XCIsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGFwcEluZm8gPSBhd2FpdCB0aGlzLmdldEFwcEluZm8oZGF0YS5hcHBfaWQpO1xuICAgICAgaWYgKGFwcEluZm8pIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2FwcF9pbmZvX2dldFwiLCBkYXRhLCBhcHBJbmZvKTtcbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdChcImdoX2FwcF9pbmZvX3VwZGF0ZVwiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmFwcCkge1xuICAgICAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgdGhpcy51cGRhdGVBcHBJbmZvKGRhdGEuYXBwKTtcbiAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfYXBwX2luZm9fdXBkYXRlXCIsIHtcbiAgICAgICAgICBhcHBfaWQ6IGRhdGEuYXBwLmFwcF9pZFxuICAgICAgICB9LCBhcHBJbmZvKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdChcImdoX2FwcF9jcmVhdGVcIiwge30sIGFzeW5jIChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHAoZGF0YS5hcHApO1xuICAgICAgY29uc3QgYXBwc0xpc3QgPSBhd2FpdCB0aGlzLmdldEFwcHNMaXN0KCk7XG4gICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9hcHBzX2xpc3RfdXBkYXRlXCIsIHtcbiAgICAgICAgcmVjaXBpZW50OiBcImFsbFwiXG4gICAgICB9LCBhcHBzTGlzdCk7XG4gICAgfSk7XG4gICAgaWYgKGNvbnN0cy8qIElTX0JST1dTRVJfTUFJTl9USFJFQUQgKi8uU1IgJiYgdGhpcy5hY3RpdmF0ZVNXKSB7XG4gICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09IFwicmVmcmVzaCBhcHBcIikge1xuICAgICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuZ2V0QXBwKGV2ZW50LmRhdGEucGF5bG9hZC5hcHBfaWQpO1xuICAgICAgICAgIGlmIChhcHApIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jb21wYXJlQXBwc0l0ZW1zTGlzdHMoYXBwLml0ZW1zX2xpc3QsIGV2ZW50LmRhdGEucGF5bG9hZC5pdGVtc19saXN0LmZpbHRlcihpdGVtID0+ICFpdGVtLnRyYXNoKSwgKHtcbiAgICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXMsXG4gICAgICAgICAgICAgIGRpZmZfZmllbGRzX2l0ZW1zX0lkcyxcbiAgICAgICAgICAgICAgZGlmZl9pdGVtcyxcbiAgICAgICAgICAgICAgbmV3SXRlbXMsXG4gICAgICAgICAgICAgIGRlbGV0ZWRJdGVtc1xuICAgICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGlmZl9pdGVtcy5sZW5ndGggfHwgbmV3SXRlbXMubGVuZ3RoIHx8IGRlbGV0ZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtc191cGRhdGVcIiwge1xuICAgICAgICAgICAgICAgICAgYXBwX2lkOiBldmVudC5kYXRhLnBheWxvYWQuYXBwX2lkXG4gICAgICAgICAgICAgICAgfSwgZXZlbnQuZGF0YS5wYXlsb2FkLml0ZW1zX2xpc3QuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0udHJhc2gpKTtcbiAgICAgICAgICAgICAgICBkaWZmX2l0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtX3VwZGF0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBhcHBfaWQ6IGV2ZW50LmRhdGEucGF5bG9hZC5hcHBfaWQsXG4gICAgICAgICAgICAgICAgICBpdGVtX2lkOiBpdGVtLml0ZW1faWRcbiAgICAgICAgICAgICAgICB9LCBpdGVtKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlmZl9maWVsZHNfaXRlbXNfSWRzLmZvckVhY2goaXRlbV9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRpZmZfZmllbGRzX2l0ZW1zW2l0ZW1faWRdO1xuICAgICAgICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGl0ZW0uZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF92YWx1ZV91cGRhdGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBhcHBfaWQ6IGV2ZW50LmRhdGEucGF5bG9hZC5hcHBfaWQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1faWQsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZC5maWVsZF9pZFxuICAgICAgICAgICAgICAgICAgfSwgZmllbGQuZmllbGRfdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudC5kYXRhLnBheWxvYWQuaXRlbXNfbGlzdCA9IGF3YWl0IHRoaXMudXRpbC5tZXJnZUNodW5rcyhbYXBwLCBldmVudC5kYXRhLnBheWxvYWRdKTsgLy9oZXJlIGNoZWNrIEFzayBBbmRyZXdcbiAgICAgICAgICB0aGlzLnNhdmVBcHBJblN0b3JhZ2UoZXZlbnQuZGF0YS5wYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiAoZXZlbnQuZGF0YS50eXBlID09PSBcInJlZnJlc2ggYXBwTGlzdFwiKSB7XG4gICAgICAgIC8vICAgdGhpcy5zdG9yYWdlLnVuc2V0QXBwcygpO1xuICAgICAgICAvLyAgIHRoaXMudXBkYXRlQXBwc0xpc3RJblN0b3JhZ2UoXG4gICAgICAgIC8vICAgICBldmVudC5kYXRhLnBheWxvYWQuYXBwc19saXN0Lm1hcCgoYXBwKSA9PiB7XG4gICAgICAgIC8vICAgICAgIGFwcC5mcm9tX2FwcHNfbGlzdCA9IHRydWU7XG4gICAgICAgIC8vICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgIC8vICAgICB9KVxuICAgICAgICAvLyAgICk7XG4gICAgICAgIC8vICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFxuICAgICAgICAvLyAgICAgXCJnaF9hcHBzX2xpc3RfdXBkYXRlXCIsXG4gICAgICAgIC8vICAgICB7IHJlY2lwaWVudDogXCJhbGxcIiB9LFxuICAgICAgICAvLyAgICAgZXZlbnQuZGF0YS5wYXlsb2FkLmFwcHNfbGlzdFxuICAgICAgICAvLyAgICk7XG4gICAgICAgIC8vIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0l0ZW1Qcm9jZXNzb3IvSXRlbVByb2Nlc3Nvci5qc1xuXG5jbGFzcyBJdGVtUHJvY2Vzc29yIHtcbiAgY29uc3RydWN0b3Ioc3RvcmFnZSwgcGlwZVNlcnZpY2UsIHJlcSwgYXBwUHJvY2Vzc29yLCB1dGlsKSB7XG4gICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlID0gcGlwZVNlcnZpY2U7XG4gICAgdGhpcy5yZXEgPSByZXE7XG4gICAgdGhpcy5hcHBQcm9jZXNzb3IgPSBhcHBQcm9jZXNzb3I7XG4gICAgdGhpcy51dGlsID0gdXRpbDtcbiAgICB0aGlzLml0ZW1MaXN0ZW5lcnMoKTtcbiAgfVxuICBhc3luYyBhZGRJdGVtc0FwaShhcHBfaWQsIGl0ZW1zTGlzdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9pdGVtcy9hZGRcIixcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGl0ZW1zOiBKU09OLnN0cmluZ2lmeShpdGVtc0xpc3QpLFxuICAgICAgICAgIGFwcF9pZFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgdXBkYXRlSXRlbXNBcGkoYXBwX2lkLCBpdGVtc0xpc3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvaXRlbXMvdXBkYXRlXCIsXG4gICAgICAgIGZvcm06IHtcbiAgICAgICAgICBpdGVtczogSlNPTi5zdHJpbmdpZnkoaXRlbXNMaXN0KSxcbiAgICAgICAgICBhcHBfaWRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGRlbGV0ZUl0ZW1zQXBpKGl0ZW1zX2lkcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9pdGVtcy9kZWxldGVcIixcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGl0ZW1zX2lkczogSlNPTi5zdHJpbmdpZnkoaXRlbXNfaWRzKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLmZyb21fYXBwc19saXN0ID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgYWRkSXRlbXNUb1N0b3JhZ2UoYXBwX2lkLCBpdGVtcykge1xuICAgIC8vICEhISEhIE5lZWQgdG8gZml4IHRoaXNcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICBpZiAoYXBwKSB7XG4gICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBhcHAuaXRlbXNfbGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICBhcHAuaXRlbXNfb2JqZWN0W2l0ZW0uaXRlbV9pZF0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgZmllbGQgPSAwOyBmaWVsZCA8IGl0ZW0uZmllbGRzLmxlbmd0aDsgZmllbGQrKykge1xuICAgICAgICAgIGFwcC5pdGVtc19vYmplY3RbaXRlbS5pdGVtX2lkXVtpdGVtLmZpZWxkc1tmaWVsZF0uZmllbGRfaWRdID0gaXRlbS5maWVsZHNbZmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1fdXBkYXRlXCIsIHtcbiAgICAgICAgICBhcHBfaWRcbiAgICAgICAgfSwgW2l0ZW1dKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfaXRlbXNfdXBkYXRlXCIsIHtcbiAgICAgICAgYXBwX2lkXG4gICAgICB9LCBhcHAuaXRlbXNfbGlzdCk7XG4gICAgICB0aGlzLnN0b3JhZ2UudXBkYXRlQXBwKGFwcCk7XG4gICAgfVxuICAgIHJldHVybiBhcHA7XG4gIH1cbiAgYXN5bmMgdXBkYXRlSXRlbXNJblN0b3JhZ2UoYXBwX2lkLCBpdGVtcykge1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1zX3VwZGF0ZVwiLCB7XG4gICAgICBhcHBfaWRcbiAgICB9LCBpdGVtcyk7XG4gICAgLy8tLSBnZXR0aW5nIGFwcCBmcm9tIHN0b3JhZ2VcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICBpZiAoYXBwICYmIGl0ZW1zKSB7XG4gICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzVG9FbWl0ID0ge1xuICAgICAgICAgIGFwcF9pZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtX3VwZGF0ZVwiLCBhZGRyZXNzVG9FbWl0LCBbaXRlbV0pO1xuICAgICAgICBhZGRyZXNzVG9FbWl0Lml0ZW1faWQgPSBpdGVtLml0ZW1faWQ7XG4gICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1fdXBkYXRlXCIsIGFkZHJlc3NUb0VtaXQsIGl0ZW0pO1xuICAgICAgICAvLy0tIExvb2tpbmcgZm9yIHVwZGF0ZWQgaXRlbSBpbiB0aGUgbWFpbiBzdG9yYWdlIGFjY29yZGluZyB0byAnaXRlbV9pZCdcbiAgICAgICAgY29uc3QgZnVuZGVkSXRlbSA9IGFwcC5pdGVtc19saXN0LmZpbmQoc3RvcmFnZUl0ZW0gPT4gc3RvcmFnZUl0ZW0uaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpO1xuICAgICAgICBpZiAoZnVuZGVkSXRlbSkge1xuICAgICAgICAgIC8vLS0gVXBkYXRpbmcgdmFsdWUgaW4gZXhpc3RpbmcgZmllbGRzXG4gICAgICAgICAgaXRlbS5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdW5kZWRGaWVsZCA9IGZ1bmRlZEl0ZW0uZmllbGRzLmZpbmQoc3RvcmFnZUZpZWxkID0+IHN0b3JhZ2VGaWVsZC5maWVsZF9pZCA9PSBmaWVsZC5maWVsZF9pZCk7XG4gICAgICAgICAgICBhZGRyZXNzVG9FbWl0LmZpZWxkX2lkID0gZmllbGQuZmllbGRfaWQ7XG4gICAgICAgICAgICBpZiAoZnVuZGVkRmllbGQpIHtcbiAgICAgICAgICAgICAgLy8tLSBDaGVja2luZyBpZiB2YWx1ZSBvZiBleGlzdGluZyBmaWVsZHMgd2VyZSB1cGRhdGVkLCBiZWNhdXNlIHdlIGFyZSBub3Qgc2VuZGluZyB1cGRhdGVzIGlmIHZhbHVlIGRpZG4ndCBjaGFuZ2VkXG4gICAgICAgICAgICAgIGlmIChmdW5kZWRGaWVsZC5maWVsZF92YWx1ZSAhPSBmaWVsZC5maWVsZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIGZ1bmRlZEZpZWxkLmZpZWxkX3ZhbHVlID0gZmllbGQuZmllbGRfdmFsdWU7XG4gICAgICAgICAgICAgICAgYXBwLml0ZW1zX29iamVjdFtmdW5kZWRJdGVtLml0ZW1faWRdW2Z1bmRlZEZpZWxkLmZpZWxkX2lkXSA9IGZ1bmRlZEZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX3ZhbHVlX3VwZGF0ZVwiLCBhZGRyZXNzVG9FbWl0LCBmaWVsZC5maWVsZF92YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vLS0gUHVzaGluZyBuZXcgZmllbGRzIHRvIHRoZSBzdG9yYWdlIChpdCdzIHdoZW4gdXNlciBlbnRlcnMgbmV3IHZhbHVlKVxuICAgICAgICAgICAgICBmdW5kZWRJdGVtLmZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgYXBwLml0ZW1zX29iamVjdFtmdW5kZWRJdGVtLml0ZW1faWRdW2ZpZWxkLmZpZWxkX2lkXSA9IGZpZWxkO1xuICAgICAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF92YWx1ZV91cGRhdGVcIiwgYWRkcmVzc1RvRW1pdCwgZmllbGQuZmllbGRfdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgLy9oZXJlXG5cbiAgLy8vLy9cbiAgaGFuZGxlSXRlbXNDaGFuZ2UoaWQsIHByZXZWZXJzaW9uLCBuZXh0VmVyc2lvbikge1xuICAgIGxldCBjb21wYXJlUmVzID0gdGhpcy51dGlsLmNvbXBhcmVJdGVtcyhwcmV2VmVyc2lvbi5pdGVtc19saXN0LCBuZXh0VmVyc2lvbi5pdGVtc19saXN0KTtcbiAgICB0aGlzLnVwZGF0ZUl0ZW1zSW5TdG9yYWdlKGlkLCBjb21wYXJlUmVzLmRpZmZfc3JjX2l0ZW1zKTtcbiAgICB0aGlzLmFkZEl0ZW1zVG9TdG9yYWdlKGlkLCBjb21wYXJlUmVzLm5ld19zcmNfaXRlbXMpO1xuICB9XG5cbiAgLy9cbiAgdHJpZ2dlckl0ZW1zQ2hhbmdlKGlkLCBjb21wYXJlUmVzKSB7XG4gICAgdGhpcy51cGRhdGVJdGVtc0luU3RvcmFnZShpZCwgY29tcGFyZVJlcy5kaWZmX3NyY19pdGVtcyk7XG4gICAgdGhpcy5hZGRJdGVtc1RvU3RvcmFnZShpZCwgY29tcGFyZVJlcy5uZXdfc3JjX2l0ZW1zKTtcbiAgfVxuXG4gIC8vXG4gIGhhbmRsZURpZmYoaWQsIGNvbXBhcmUpIHtcbiAgICB0aGlzLnVwZGF0ZUl0ZW1zSW5TdG9yYWdlKGlkLCBjb21wYXJlLmRpZmZfc3JjX2l0ZW1zKTtcbiAgICB0aGlzLmFkZEl0ZW1zVG9TdG9yYWdlKGlkLCBjb21wYXJlLm5ld19zcmNfaXRlbXMpO1xuICAgIHRoaXMuZGVsZXRlSXRlbXNGcm9tU3RvcmFnZShpZCwgY29tcGFyZS50cmFzaF9zcmNfaXRlbXMpO1xuICB9XG4gIGFzeW5jIGRlbGV0ZUl0ZW1zRnJvbVN0b3JhZ2UoYXBwX2lkLCBpdGVtc0ZvckRlbGV0ZSA9IFtdKSB7XG4gICAgY29uc3QgYXBwID0gYXdhaXQgdGhpcy5hcHBQcm9jZXNzb3IuZ2V0QXBwKGFwcF9pZCk7XG4gICAgaWYgKGFwcCkge1xuICAgICAgYXBwLml0ZW1zX2xpc3QgPSBhcHAuaXRlbXNfbGlzdC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtc0ZvckRlbGV0ZS5maW5kKGZpbmRlZEl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGZpbmRlZEl0ZW0uaXRlbV9pZCkpIHtcbiAgICAgICAgICBkZWxldGUgYXBwLml0ZW1zX29iamVjdFtpdGVtLml0ZW1faWRdO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfaXRlbXNfdXBkYXRlXCIsIHtcbiAgICAgICAgYXBwX2lkXG4gICAgICB9LCBhcHAuaXRlbXNfbGlzdCk7XG4gICAgICB0aGlzLnN0b3JhZ2UudXBkYXRlQXBwKGFwcCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldEl0ZW1zKGFwcF9pZCwgdHJhc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuYXBwUHJvY2Vzc29yLmdldEFwcChhcHBfaWQsIHRyYXNoKTtcbiAgICBpZiAoIWFwcCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFwcC5pdGVtc19saXN0O1xuICB9XG4gIGFzeW5jIGFkZE5ld0l0ZW1zKGFwcF9pZCwgaXRlbXNMaXN0KSB7XG4gICAgY29uc3QgcHJlcGFyZWRJdGVtc0xpc3QgPSBpdGVtc0xpc3QubWFwKGl0ZW0gPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICBmaWVsZHM6IGZpbHRlckZpZWxkcyhpdGVtLmZpZWxkcylcbiAgICB9KSk7XG4gICAgY29uc3QgbmV3SXRlbXMgPSBhd2FpdCB0aGlzLmFkZEl0ZW1zQXBpKGFwcF9pZCwgcHJlcGFyZWRJdGVtc0xpc3QpO1xuICAgIGF3YWl0IHRoaXMuYWRkSXRlbXNUb1N0b3JhZ2UoYXBwX2lkLCBuZXdJdGVtcyk7XG4gICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfaXRlbXNfYWRkXCIsIHtcbiAgICAgIGFwcF9pZFxuICAgIH0sIG5ld0l0ZW1zKTtcbiAgICByZXR1cm4gbmV3SXRlbXM7XG4gIH1cbiAgYXN5bmMgdXBkYXRlSXRlbXMoYXBwX2lkLCBpdGVtc0xpc3QpIHtcbiAgICBjb25zdCBwcmVwYXJlZEl0ZW1zTGlzdCA9IGl0ZW1zTGlzdC5tYXAoaXRlbSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIGZpZWxkczogZmlsdGVyRmllbGRzKGl0ZW0uZmllbGRzKVxuICAgIH0pKTtcbiAgICBjb25zdCB1cGRhdGVkSXRlbXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUl0ZW1zQXBpKGFwcF9pZCwgcHJlcGFyZWRJdGVtc0xpc3QpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZUl0ZW1zSW5TdG9yYWdlKGFwcF9pZCwgdXBkYXRlZEl0ZW1zKTtcbiAgfVxuICBhc3luYyBkZWxldGVJdGVtcyhhcHBfaWQsIGl0ZW1zSWRzKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlSXRlbXNBcGkoaXRlbXNJZHMpLnRoZW4oYXN5bmMgaXRlbXMgPT4gYXdhaXQgdGhpcy5kZWxldGVJdGVtc0Zyb21TdG9yYWdlKGFwcF9pZCwgaXRlbXMpKTtcbiAgfVxuICBpdGVtTGlzdGVuZXJzKCkge1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfaXRlbXNfZ2V0XCIsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXBwX2lkKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5nZXRJdGVtcyhkYXRhLmFwcF9pZCk7XG4gICAgICAgIGlmIChpdGVtcykge1xuICAgICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1zX2dldFwiLCBkYXRhLCBpdGVtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfaXRlbXNfZ2V0XCIsIGRhdGEsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfaXRlbXNfYWRkXCIsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXBwX2lkICYmIGRhdGEuaXRlbXMpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmFkZE5ld0l0ZW1zKGRhdGEuYXBwX2lkLCBkYXRhLml0ZW1zKTtcbiAgICAgICAgaWYgKGl0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfaXRlbXNfYWRkXCIsIGRhdGEsIGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtc19hZGRcIiwgZGF0YSwgW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5waXBlU2VydmljZS5vblJvb3QoXCJnaF9pdGVtc191cGRhdGVcIiwge30sIGFzeW5jIChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5hcHBfaWQgJiYgZGF0YS5pdGVtcykge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMudXBkYXRlSXRlbXMoZGF0YS5hcHBfaWQsIGRhdGEuaXRlbXMpO1xuICAgICAgICBpZiAoaXRlbXMpIHtcbiAgICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtc191cGRhdGVcIiwgZGF0YSwgaXRlbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2l0ZW1zX3VwZGF0ZVwiLCBkYXRhLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qIC0tLS0gRklFTEQgVkFMVUUgR0VUIExJU1RFTklORyAtLS0tICovXG4gICAgdGhpcy5waXBlU2VydmljZS5vblJvb3QoXCJnaF9pdGVtX2dldFwiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmFwcF9pZCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZ2V0SXRlbXMoZGF0YS5hcHBfaWQpO1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uaXRlbV9pZCA9PSBkYXRhLml0ZW1faWQpO1xuICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9pdGVtX2dldFwiLCBkYXRhLCBpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEdFVFRJTkcgRklMVEVSRUQgSVRFTVxuICAgIC8qIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZDogY3VycmVudCBhcHBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9hcHBfaWQ6IGZvciByZWZlcmVuY2UgYXBwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zSWQ6IGN1cnJlbnQgaXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzX2xpc3Q6IGZpbHRlcnMgbGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZ3JvdXBlID86IGZpZWxkIGdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g/OiBzZWFyY2ggdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KFwiZ2hfZmlsdGVyZWRfaXRlbXNfZ2V0XCIsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuZWxlbWVudF9hcHBfaWQpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmdldEl0ZW1zKGRhdGEuZWxlbWVudF9hcHBfaWQpO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gYXdhaXQgdGhpcy51dGlsLmdldEZpbHRlcmVkSXRlbXMoaXRlbXMsIGRhdGEuZmlsdGVyc19saXN0LCBkYXRhLmVsZW1lbnRfYXBwX2lkLCBkYXRhLmFwcF9pZCwgZGF0YS5pdGVtX2lkLCBkYXRhLmZpZWxkX2dyb3VwZSwgZGF0YS5zZWFyY2gsIGRhdGEuc2VhcmNoX3BhcmFtcyk7XG4gICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2ZpbHRlcmVkX2l0ZW1zX2dldFwiLCBkYXRhLCBmaWx0ZXJlZEl0ZW1zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdChcImdoX2ZpbHRlcl9pdGVtc1wiLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBhd2FpdCB0aGlzLnV0aWwuZ2V0RmlsdGVyZWRJdGVtcyhkYXRhLml0ZW1zLCBkYXRhLmZpbHRlcnNfbGlzdCwgZGF0YS5lbGVtZW50X2FwcF9pZCwgZGF0YS5hcHBfaWQsIGRhdGEuaXRlbV9pZCwgZGF0YS5maWVsZF9ncm91cGUsIGRhdGEuc2VhcmNoLCBkYXRhLnNlYXJjaF9wYXJhbXMpO1xuICAgICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoXCJnaF9maWx0ZXJfaXRlbXNcIiwgZGF0YSwgZmlsdGVyZWRJdGVtcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9GaWVsZFByb2Nlc3Nvci9GaWVsZFByb2Nlc3Nvci5qc1xuY2xhc3MgRmllbGRQcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihzdG9yYWdlLCByZXEsIGFwcFByb2Nlc3NvciwgaXRlbVByb2Nlc3NvciwgcGlwZVNlcnZpY2UpIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSBzdG9yYWdlO1xuICAgIHRoaXMucmVxID0gcmVxO1xuICAgIHRoaXMuYXBwUHJvY2Vzc29yID0gYXBwUHJvY2Vzc29yO1xuICAgIHRoaXMuaXRlbVByb2Nlc3NvciA9IGl0ZW1Qcm9jZXNzb3I7XG4gICAgdGhpcy5waXBlU2VydmljZSA9IHBpcGVTZXJ2aWNlO1xuICAgIHRoaXMuZmllbGRMaXN0ZW5lcnMoKTtcbiAgfVxuICBkZWxldGVGaWVsZEFwaShmaWVsZF9pZCkge1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXBpL2FwcC9kZWxldGUtZmllbGRcIixcbiAgICAgIGZvcm06IHtcbiAgICAgICAgZmllbGRfaWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhc3luYyB1cGRhdGVkRmllbGRBcGkoYXBwX2lkLCBmaWVsZE1vZGVsID0ge30pIHtcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICBjb25zdCBhcHBUb1VwZGF0ZSA9IHtcbiAgICAgIGFwcF9pZCxcbiAgICAgIGFwcF9uYW1lOiBhcHAuYXBwX25hbWUsXG4gICAgICBncm91cF9pZDogYXBwLmdyb3VwX2lkLFxuICAgICAgaWNvbjogYXBwLmljb24sXG4gICAgICBmaWVsZF9saXN0OiBhcHAuZmllbGRfbGlzdC5tYXAoZmllbGQgPT4gZmllbGQuZmllbGRfaWQgPT0gZmllbGRNb2RlbC5maWVsZF9pZCA/IHtcbiAgICAgICAgLi4uZmllbGQsXG4gICAgICAgIC4uLmZpZWxkTW9kZWxcbiAgICAgIH0gOiBmaWVsZCksXG4gICAgICB2aWV3c19saXN0OiBhcHAudmlld3NfbGlzdFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYXBwUHJvY2Vzc29yLnVwZGF0ZUFwcChhcHBUb1VwZGF0ZSk7XG4gIH1cbiAgc2V0RmllbGRWYWx1ZUFwaShhcHBfaWQsIGl0ZW1faWQsIGZpZWxkX2lkLCBmaWVsZF92YWx1ZSkge1xuICAgIGNvbnN0IGl0ZW1Ub1VwZGF0ZSA9IFt7XG4gICAgICBpdGVtX2lkLFxuICAgICAgZmllbGRzOiBbe1xuICAgICAgICBmaWVsZF9pZCxcbiAgICAgICAgZmllbGRfdmFsdWVcbiAgICAgIH1dXG4gICAgfV07XG4gICAgcmV0dXJuIHRoaXMuaXRlbVByb2Nlc3Nvci51cGRhdGVJdGVtcyhhcHBfaWQsIGl0ZW1Ub1VwZGF0ZSk7XG4gIH1cbiAgZGVsZXRlRmllbGRJblN0b3JhZ2UoYXBwX2lkLCBmaWVsZF9pZCkge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuc3RvcmFnZS5nZXRBcHAoYXBwX2lkKTtcbiAgICBhcHAuZmllbGRfbGlzdCA9IGFwcC5maWVsZF9saXN0LmZpbHRlcihmaWVsZCA9PiBmaWVsZC5maWxlX2lkICE9IGZpZWxkX2lkKTtcbiAgICBhcHAuaXRlbXNfbGlzdCA9IGFwcC5pdGVtc19saXN0Lm1hcChpdGVtID0+IHtcbiAgICAgIGl0ZW0uZmllbGRzID0gaXRlbS5maWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmZpZWxkX2lkICE9IGZpZWxkX2lkKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICAgIHRoaXMuc3RvcmFnZS51cGRhdGVBcHAoYXBwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB1cGRhdGVGaWVsZEluU3RvcmFnZShhcHBfaWQsIGZpZWxkTW9kZWwpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLnN0b3JhZ2UuZ2V0QXBwKGFwcF9pZCk7XG4gICAgYXBwLmZpZWxkX2xpc3QgPSBhcHAuZmllbGRfbGlzdC5tYXAoZmllbGQgPT4gZmllbGQuZmllbGRfaWQgPT0gZmllbGRNb2RlbC5maWVsZF9pZCA/IHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgLi4uZmllbGRNb2RlbFxuICAgIH0gOiBmaWVsZCk7XG4gICAgdGhpcy5zdG9yYWdlLnVwZGF0ZUFwcChhcHApO1xuICAgIHJldHVybiBmaWVsZE1vZGVsO1xuICB9XG5cbiAgLy9UaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCBmb3Igc2V0RmllbGRWYWx1ZSgpXG4gIC8vISEhISEgMSkgQ2hhbmdlIGZvciBlYWNoIHRvIGZvclxuICAvLyEhISEhIDIpIFN0b3AgaXRlcmF0aW9uIGFmdGVyIHZhbHVlIGhhcyBiZWVuIGZvdW5kXG4gIHVwZGF0ZUZpZWxkVmFsdWUoYXBwX2lkLCBpdGVtX2lkLCBmaWVsZF9pZCwgZmllbGRfdmFsdWUpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLnN0b3JhZ2UuZ2V0QXBwKGFwcF9pZCk7XG4gICAgYXBwLml0ZW1zX2xpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLml0ZW1faWQgPT0gaXRlbV9pZCkge1xuICAgICAgICBpdGVtLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQuZmllbGRfaWQgPT0gZmllbGRfaWQpIHtcbiAgICAgICAgICAgIGZpZWxkLmZpZWxkX3ZhbHVlID0gZmllbGRfdmFsdWU7XG4gICAgICAgICAgICBhcHAuaXRlbXNfb2JqZWN0W2l0ZW0uaXRlbV9pZF1bZmllbGQuZmllbGRfaWRdID0gZmllbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnN0b3JhZ2UudXBkYXRlQXBwKGFwcCk7XG4gICAgcmV0dXJuIGZpZWxkX3ZhbHVlO1xuICB9XG4gIGFzeW5jIGdldEZpZWxkKGFwcF9pZCwgZmllbGRfaWQpIHtcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICBpZiAoIWFwcCkgcmV0dXJuIG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcHAuZmllbGRfbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFwcC5maWVsZF9saXN0W2ldLmZpZWxkX2lkID09IGZpZWxkX2lkKSB7XG4gICAgICAgIHJldHVybiBhcHAuZmllbGRfbGlzdFtpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgYXN5bmMgZ2V0RmllbGRJZEJ5TmFtZVNwYWNlKGFwcF9pZCwgbmFtZV9zcGFjZSkge1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuYXBwUHJvY2Vzc29yLmdldEFwcChhcHBfaWQpO1xuICAgIGlmICghYXBwKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFwcC5maWVsZF9saXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXBwLmZpZWxkX2xpc3RbaV0ubmFtZV9zcGFjZSA9PSBuYW1lX3NwYWNlKSB7XG4gICAgICAgIHJldHVybiBhcHAuZmllbGRfbGlzdFtpXS5maWVsZF9pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyEhISEhIFNob3UgQmUgUmVuYW1lZCB0byAgZ2V0RmllbGRzKCkgISEhISEhIVxuICBhc3luYyBnZXRGaWVsZE1vZGVscyhhcHBfaWQpIHtcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICBpZiAoIWFwcCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFwcC5maWVsZF9saXN0O1xuICB9XG5cbiAgLy8hISEhISBTaG91IEJlIGFkZGVkIGZpZWxkSUQgYXJndW1lbnQgISEhISEhIVxuICBhc3luYyB1cGRhdGVGaWVsZChhcHBfaWQsIGZpZWxkTW9kZWwpIHtcbiAgICBpZiAoIWFwcF9pZCB8fCAhZmllbGRNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdNb2RlbCA9IGF3YWl0IHRoaXMudXBkYXRlZEZpZWxkQXBpKGFwcF9pZCwgZmllbGRNb2RlbCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRmllbGRJblN0b3JhZ2UoYXBwX2lkLCBuZXdNb2RlbCk7XG4gIH1cbiAgYXN5bmMgZGVsZXRlRmllbGQoYXBwX2lkLCBmaWVsZF9pZCkge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRmllbGRBcGkoZmllbGRfaWQpO1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUZpZWxkSW5TdG9yYWdlKGFwcF9pZCwgZmllbGRfaWQpO1xuICB9XG5cbiAgLy90aGlzIG1ldGhvZCBzaG91bGQgYWx3YWlzZSByZXR1cm4gdmFsdWUgaWYgbm8gdmFsdWUgd2UgcmV0dXJuIG51bGxcbiAgYXN5bmMgZ2V0RmllbGRWYWx1ZShhcHBfaWQsIGl0ZW1faWQsIGZpZWxkX2lkKSB7XG4gICAgbGV0IGZpZWxkVmFsdWUgPSBudWxsO1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuYXBwUHJvY2Vzc29yLmdldEFwcChhcHBfaWQpO1xuICAgIHRyeSB7XG4gICAgICBmaWVsZFZhbHVlID0gYXBwLml0ZW1zX29iamVjdFtpdGVtX2lkXVtmaWVsZF9pZF0uZmllbGRfdmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgIHJldHVybiBmaWVsZFZhbHVlO1xuICB9XG4gIGFzeW5jIHNldEZpZWxkVmFsdWUoYXBwX2lkLCBpdGVtX2lkLCBmaWVsZF9pZCwgZmllbGRfdmFsdWUpIHtcbiAgICBpZiAoIWFwcF9pZCB8fCAhaXRlbV9pZCB8fCAhZmllbGRfaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zZXRGaWVsZFZhbHVlQXBpKGFwcF9pZCwgaXRlbV9pZCwgZmllbGRfaWQsIGZpZWxkX3ZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVGaWVsZFZhbHVlKGFwcF9pZCwgaXRlbV9pZCwgZmllbGRfaWQsIGZpZWxkX3ZhbHVlKTtcbiAgfVxuICBmaWVsZExpc3RlbmVycygpIHtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdCgnZ2hfdmFsdWVfZ2V0Jywge30sIGFzeW5jIChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEuYXBwX2lkICYmIGRhdGEuaXRlbV9pZCAmJiBkYXRhLmZpZWxkX2lkKSB7XG4gICAgICAgIGxldCBmaWVsZF92YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0RmllbGRWYWx1ZShkYXRhLmFwcF9pZCwgZGF0YS5pdGVtX2lkLCBkYXRhLmZpZWxkX2lkKTtcbiAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KCdnaF92YWx1ZV9nZXQnLCBkYXRhLCBmaWVsZF92YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5waXBlU2VydmljZS5vblJvb3QoJ2doX3ZhbHVlX3NldCcsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhLml0ZW1faWQpIHtcbiAgICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGRhdGEuYXBwX2lkLCBkYXRhLml0ZW1faWQsIGRhdGEuZmllbGRfaWQsIGRhdGEubmV3X3ZhbHVlKTtcbiAgICAgICAgZGVsZXRlIGRhdGEubmV3X3ZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub25Sb290KCdnaF9tb2RlbF9nZXQnLCB7fSwgYXN5bmMgKGV2ZW50LCBkYXRhKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgZmllbGRfbW9kZWwgPSBhd2FpdCB0aGlzLmdldEZpZWxkKGRhdGEuYXBwX2lkLCBkYXRhLmZpZWxkX2lkKTtcbiAgICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KCdnaF9tb2RlbF9nZXQnLCBkYXRhLCBmaWVsZF9tb2RlbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZygnRmllbGQgbW9kZWw6ICcsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdCgnZ2hfbW9kZWxfdXBkYXRlJywge30sIGFzeW5jIChldmVudCwgZGF0YSkgPT4ge1xuICAgICAgbGV0IGZpZWxkX21vZGVsID0gYXdhaXQgdGhpcy51cGRhdGVGaWVsZChkYXRhLmFwcF9pZCwgZGF0YS5maWVsZF9tb2RlbCk7XG4gICAgICB0aGlzLnBpcGVTZXJ2aWNlLmVtaXQoJ2doX21vZGVsX3VwZGF0ZScsIHtcbiAgICAgICAgYXBwX2lkOiBkYXRhLmFwcF9pZCxcbiAgICAgICAgZmllbGRfaWQ6IGRhdGEuZmllbGRfaWRcbiAgICAgIH0sIGZpZWxkX21vZGVsKTtcbiAgICB9KTtcbiAgICB0aGlzLnBpcGVTZXJ2aWNlLm9uUm9vdCgnZ2hfbW9kZWxzX2dldCcsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGxldCBmaWVsZF9tb2RlbHMgPSBhd2FpdCB0aGlzLmdldEZpZWxkTW9kZWxzKGRhdGEuYXBwX2lkKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdCgnZ2hfbW9kZWxzX2dldCcsIGRhdGEsIGZpZWxkX21vZGVscyk7XG4gICAgfSk7XG4gICAgdGhpcy5waXBlU2VydmljZS5vblJvb3QoJ2doX21vZGVsX2RlbGV0ZScsIHt9LCBhc3luYyAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLmRlbGV0ZUZpZWxkKGRhdGEuYXBwX2lkLCBkYXRhLmZpZWxkX2lkKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdCgnZ2hfbW9kZWxfZGVsZXRlJywgZGF0YSwgc3RhdHVzKTtcbiAgICB9KTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0ZpbGVNYW5hZ2VyL0ZpbGVNYW5hZ2VyLmpzXG5jbGFzcyBGaWxlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHN0b3JhZ2UsIHBpcGVTZXJ2aWNlLCByZXEsIGFwcFByb2Nlc3Nvcikge1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7XG4gICAgdGhpcy5waXBlU2VydmljZSA9IHBpcGVTZXJ2aWNlO1xuICAgIHRoaXMucmVxID0gcmVxO1xuICAgIHRoaXMuYXBwUHJvY2Vzc29yID0gYXBwUHJvY2Vzc29yO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogVVBMT0FEIEZJTEUgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyB1cGxvYWRGaWxlQXBpKGZpbGVEYXRhLCBhcHBfaWQsIGl0ZW1faWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgXCJmaWxlLTBcIjogZmlsZURhdGEsXG4gICAgICAgIGFwcF9pZCxcbiAgICAgICAgaXRlbV9pZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9maWxlL2Zvcm11cGxvYWRcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgdXBsb2FkRmlsZUZyb21TdHJpbmdBcGkoZmlsZU9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvZmlsZS91cGxvYWRcIixcbiAgICAgICAgZm9ybToge1xuICAgICAgICAgIGZpbGU6IEpTT04uc3RyaW5naWZ5KGZpbGVPYmplY3QpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIHVwZGF0ZUZpbGVGcm9tU3RyaW5nQXBpKGRhdGEsIGZpbGVfaWQsIGZpbGVfbmFtZSwgZXh0ZW5zaW9uLCBmb3JtYXQsIGFsdCwgdGl0bGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZU9iaiA9IHtcbiAgICAgICAgZmlsZV9uYW1lLFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgIGZpbGVfaWQsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgc291cmNlOiBkYXRhLFxuICAgICAgICBhbHQsXG4gICAgICAgIHRpdGxlXG4gICAgICB9O1xuICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2ZpbGUvdXBkYXRlXCIsXG4gICAgICAgIGZvcm06IHtcbiAgICAgICAgICBmaWxlOiBKU09OLnN0cmluZ2lmeShmaWxlT2JqKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBkdXBsaWNhdGVGaWxlQXBpKGZpbGVzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLnBvc3Qoe1xuICAgICAgdXJsOiBcIi9hcGkvbmV3L2ZpbGUvZHVwbGljYXRlXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIH0sXG4gICAgICBmb3JtOiB7XG4gICAgICAgIGZpbGVzOiBKU09OLnN0cmluZ2lmeShmaWxlcylcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhc3luYyBkb3dubG9hZEZpbGVGcm9tU3RyaW5nKGFwcF9pZCwgZmlsZV9pZCkge1xuICAgIGlmIChhd2FpdCB0aGlzLmlzRmlsZUV4aXN0cyhhcHBfaWQsIGZpbGVfaWQpKSB7XG4gICAgICBsZXQgZmlsZSA9IGF3YWl0IHRoaXMuZ2V0RmlsZShhcHBfaWQsIGZpbGVfaWQpO1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcS5nZXQoe1xuICAgICAgICB1cmw6IGZpbGUudXJsICsgJz90aW1lc3RhbXA9JyArIGZpbGUubGFzdF91cGRhdGUsXG4gICAgICAgIGV4dGVybmFsUmVzb3VyY2U6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdHlwZTogJ2ZpbGUnXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGR1cGxpY2F0ZUZpbGUoZmlsZXMpIHtcbiAgICBsZXQgZHVwbGljYXRlZEZpbGVzID0gYXdhaXQgdGhpcy5kdXBsaWNhdGVGaWxlQXBpKGZpbGVzKTtcbiAgICBkdXBsaWNhdGVkRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIHRoaXMuYWRkRmlsZVRvU3RvcmFnZShmaWxlLmFwcF9pZCwgZmlsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGR1cGxpY2F0ZWRGaWxlcztcbiAgfVxuICBhc3luYyBkZWxldGVGaWxlQXBpKGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLnJlcS5nZXQoe1xuICAgICAgICB1cmw6IGAvZmlsZS9kZWxldGU/ZmlsZV9pZD0ke2lkfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGFkZEZpbGVUb1N0b3JhZ2UoYXBwX2lkLCBmaWxlKSB7XG4gICAgY29uc3QgYXBwID0gdGhpcy5zdG9yYWdlLmdldEFwcChhcHBfaWQpO1xuICAgIGlmIChhcHApIHtcbiAgICAgIGFwcC5maWxlX2xpc3QucHVzaChmaWxlKTtcbiAgICAgIHRoaXMuc3RvcmFnZS51cGRhdGVBcHAoYXBwKTtcbiAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2ZpbGVfdXBsb2FkXCIsIHtcbiAgICAgICAgYXBwX2lkLFxuICAgICAgICBpdGVtX2lkOiBmaWxlLml0ZW1faWQsXG4gICAgICAgIGZpbGVfaWQ6IGZpbGUuZmlsZV9pZFxuICAgICAgfSwgZmlsZSk7XG4gICAgfVxuICB9XG4gIGFkZEZpbGVzVG9TdG9yYWdlKGFwcF9pZCwgZmlsZXMpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLnN0b3JhZ2UuZ2V0QXBwKGFwcF9pZCk7XG4gICAgaWYgKGFwcCkge1xuICAgICAgYXBwLmZpbGVfbGlzdC5wdXNoKC4uLmZpbGVzKTtcbiAgICAgIHRoaXMuc3RvcmFnZS51cGRhdGVBcHAoYXBwKTtcbiAgICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2ZpbGVfdXBsb2FkXCIsIHtcbiAgICAgICAgICBhcHBfaWQsXG4gICAgICAgICAgaXRlbV9pZDogZmlsZS5pdGVtX2lkLFxuICAgICAgICAgIGZpbGVfaWQ6IGZpbGUuZmlsZV9pZFxuICAgICAgICB9LCBmaWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBkZWxldGVGaWxlRnJvbVN0b3JhZ2UoZmlsZUlkLCBhcHBfaWQpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLnN0b3JhZ2UuZ2V0QXBwKGFwcF9pZCk7XG4gICAgaWYgKGFwcCkge1xuICAgICAgbGV0IGRlbGV0ZWRGaWxlO1xuICAgICAgYXBwLmZpbGVfbGlzdCA9IGFwcC5maWxlX2xpc3QuZmlsdGVyKGZpbGUgPT4ge1xuICAgICAgICBpZiAoZmlsZS5maWxlX2lkICE9IGZpbGVJZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZWRGaWxlID0gZmlsZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yYWdlLnVwZGF0ZUFwcChhcHApO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfZmlsZV9kZWxldGVcIiwge1xuICAgICAgICBmaWxlX2lkOiBmaWxlSWRcbiAgICAgIH0sIGRlbGV0ZWRGaWxlKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlRmlsZUluU3RvcmFnZShmaWxlSWQsIGFwcF9pZCwgbmV3RmlsZSkge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuc3RvcmFnZS5nZXRBcHAoYXBwX2lkKTtcbiAgICBpZiAoYXBwKSB7XG4gICAgICBhcHAuZmlsZV9saXN0ID0gYXBwLmZpbGVfbGlzdC5tYXAoZmlsZSA9PiBmaWxlLmZpbGVfaWQgPT0gZmlsZUlkID8gbmV3RmlsZSA6IGZpbGUpO1xuICAgICAgdGhpcy5zdG9yYWdlLnVwZGF0ZUFwcChhcHApO1xuICAgICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ2hfZmlsZV91cGRhdGVcIiwge1xuICAgICAgICBmaWxlX2lkOiBmaWxlSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBhc3luYyBnZXRGaWxlKGFwcF9pZCwgZmlsZV9pZCkge1xuICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuYXBwUHJvY2Vzc29yLmdldEFwcChhcHBfaWQpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZmluZGVkRmlsZSA9IGFwcC5maWxlX2xpc3QuZmluZChmaWxlID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbGUuZmlsZV9pZCA9PSBmaWxlX2lkO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZGVkRmlsZSkge1xuICAgICAgICByZXNvbHZlKGZpbmRlZEZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgZ2V0RmlsZXMoYXBwX2lkLCBmaWxlc0lkID0gW10pIHtcbiAgICBjb25zdCBhcHAgPSBhd2FpdCB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGZpbmRlZEZpbGVzID0gYXBwLmZpbGVfbGlzdC5maWx0ZXIoZmlsZSA9PiB7XG4gICAgICAgIHJldHVybiBmaWxlc0lkLnNvbWUoaWQgPT4ge1xuICAgICAgICAgIHJldHVybiBpZCA9PSBmaWxlLmZpbGVfaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZGVkRmlsZXMpIHtcbiAgICAgICAgcmVzb2x2ZShmaW5kZWRGaWxlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhc3luYyB1cGxvYWRGaWxlKGZpbGVEYXRhLCBhcHBfaWQsIGl0ZW1faWQpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlQXBpKGZpbGVEYXRhLCBhcHBfaWQsIGl0ZW1faWQpO1xuICAgIHRoaXMuYWRkRmlsZVRvU3RvcmFnZShhcHBfaWQsIGZpbGUpO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIGFzeW5jIHVwbG9hZEZpbGVGcm9tU3RyaW5nKGZpbGVPYmplY3QpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlRnJvbVN0cmluZ0FwaShmaWxlT2JqZWN0KTtcbiAgICB0aGlzLmFkZEZpbGVUb1N0b3JhZ2UoZmlsZS5hcHBfaWQsIGZpbGUpO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIGFzeW5jIHVwZGF0ZUZpbGVGcm9tU3RyaW5nKGRhdGEsIGZpbGVfaWQsIGZpbGVfbmFtZSwgZXh0ZW5zaW9uLCBmb3JtYXQsIGFsdCwgdGl0bGUpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy51cGRhdGVGaWxlRnJvbVN0cmluZ0FwaShkYXRhLCBmaWxlX2lkLCBmaWxlX25hbWUsIGV4dGVuc2lvbiwgZm9ybWF0LCBhbHQsIHRpdGxlKTtcbiAgICB0aGlzLnVwZGF0ZUZpbGVJblN0b3JhZ2UoZmlsZV9pZCwgZmlsZS5hcHBfaWQsIGZpbGUpO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIGFzeW5jIGRlbGV0ZUZpbGUoaWQsIGFwcF9pZCkge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZUFwaShpZCk7XG4gICAgdGhpcy5kZWxldGVGaWxlRnJvbVN0b3JhZ2UoaWQsIGFwcF9pZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXN5bmMgaXNGaWxlRXhpc3RzKGFwcF9pZCwgZmlsZV9pZCkge1xuICAgIGxldCB1cmxQYXR0ZXJuID0gL14oaHR0cHM/OlxcL1xcLyk/KFtcXGRhLXpcXC4tXSspXFwuKFthLXpcXC5dezIsNn0pKFtcXC9cXHcgXFwuLV0qKSpcXC8/JC87XG4gICAgaWYgKEJvb2xlYW4oZmlsZV9pZCkpIHtcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgdGhpcy5nZXRGaWxlKGFwcF9pZCwgZmlsZV9pZCk7XG4gICAgICBpZiAoQm9vbGVhbihmaWxlKSkge1xuICAgICAgICByZXR1cm4gdXJsUGF0dGVybi50ZXN0KGZpbGUudXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RvY3VtZW50TWFuYWdlci9Eb2N1bWVudE1hbmFnZXIuanNcbi8qIFxuICAgIERvY3VtZW50IFRlbXBsYXRlIHJlcXVlc3RcbiAge1xuICAgICBhcHBfaWQ6IDEsXG4gICAgIGl0ZW1faWQ6IDFcbiAgICAgZWxlbWVudF9pZDogMSxcbiAgICAgZGF0YToge31cbiAgfVxuXG4qL1xuXG5jbGFzcyBEb2N1bWVudE1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcihyZXEsIHBpcGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5yZXEgPSByZXE7XG4gICAgdGhpcy5waXBlU2VydmljZSA9IHBpcGVTZXJ2aWNlO1xuICB9XG4gIGNyZWF0ZURvY3VtZW50KGRvY3VtZW50T2JqZWN0KSB7XG4gICAgdGhpcy5lbWl0RG9jdW1lbnRJbnNlcnQoZG9jdW1lbnRPYmplY3QpO1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXBpL25ldy9kb2N1bWVudC9pbnNlcnQtb25lXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIH0sXG4gICAgICBmb3JtOiB7XG4gICAgICAgIGRvY3VtZW50OiBKU09OLnN0cmluZ2lmeShkb2N1bWVudE9iamVjdClcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBlbWl0RG9jdW1lbnRJbnNlcnQoZGF0YSkge1xuICAgIGNvbnN0IGRhdGFUb0VtaXQgPSB0eXBlb2YgZGF0YS5kYXRhID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShkYXRhLmRhdGEpIDogZGF0YS5kYXRhO1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdoX2RvY3VtZW50X2luc2VydF9vbmVcIiwge1xuICAgICAgYXBwX2lkOiBkYXRhLmFwcF9pZCxcbiAgICAgIGl0ZW1faWQ6IGRhdGEuaXRlbV9pZCxcbiAgICAgIGVsZW1lbnRfaWQ6IGRhdGEuZWxlbWVudF9pZFxuICAgIH0sIGRhdGFUb0VtaXQpO1xuICB9XG4gIGdldERvY3VtZW50KGRvY3VtZW50QWRkcmVzcykge1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXBpL25ldy9kb2N1bWVudC9maW5kLW9uZVwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXG4gICAgICB9LFxuICAgICAgZm9ybToge1xuICAgICAgICBkb2N1bWVudDogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRBZGRyZXNzKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldERvY3VtZW50cyhkb2N1bWVudHNBZGRyZXNzZXMpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEucG9zdCh7XG4gICAgICB1cmw6IFwiL2FwaS9uZXcvZG9jdW1lbnQvZmluZFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXG4gICAgICB9LFxuICAgICAgZm9ybToge1xuICAgICAgICBkb2N1bWVudDogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzQWRkcmVzc2VzKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZURvY3VtZW50KGRvY3VtZW50QWRkcmVzcykge1xuICAgIHJldHVybiB0aGlzLnJlcS5wb3N0KHtcbiAgICAgIHVybDogXCIvYXBpL25ldy9kb2N1bWVudC9yZW1vdmUtb25lXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIH0sXG4gICAgICBmb3JtOiB7XG4gICAgICAgIGRvY3VtZW50OiBKU09OLnN0cmluZ2lmeShkb2N1bWVudEFkZHJlc3MpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9HSENvbnN0cnVjdG9yL2ludGVycHJpdGF0ZS5qc1xuY2xhc3MgSW50ZXJwcml0YXRlIHtcbiAgY29uc3RydWN0b3IoZ3VkaHViKSB7XG4gICAgdGhpcy5ndWRodWIgPSBndWRodWI7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKiogR0VUIElOVEVSUFJFVEFUSU9OIE9CSiAqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgLy8gSW4gdGhpcyBtZXRob2Qgd2UgYXJlIGxvb2tpbmcgZm9yIGludGVycHJldGF0aW9uIGluIGRhdGEgbW9kZWwgYWNjb3JkaW5nIHRvIGludGVycHJldGF0aW9uIHNyY1xuICAvLyB0aGVuIHdlIG1lcmdlZCB3aXRoIGRlZmF1bHQgaW50ZXJwcmV0YXRpb24gZnJvbSBkZWZhdWx0RmllbGREYXRhTW9kZWxcbiAgLy8gaWYgdGhlcmUgYXJlIG5vIGN1cnJlbnQgaW50ZXJwcmV0YXRpb24gd2UgdXNlIGRlZmF1bHQgaW50ZXJwcmV0YXRpb25cbiAgYXN5bmMgZ2V0SW50ZXJwcmV0YXRpb25PYmooZmllbGREYXRhTW9kZWwsIGRlZmF1bHRGaWVsZERhdGFNb2RlbCwgc3JjLCBjb250YWluZXJJZCwgaXRlbUlkLCBhcHBJZCkge1xuICAgIHZhciBjdXJyZW50SW50cnByID0gW107XG4gICAgLy8gQ3JlYXRpbmcgZGVmYXVsdCBpbnRlcnByZXRhdGlvblxuICAgIHZhciBkZWZhdWx0SW50cnByT2JqID0gZGVmYXVsdEZpZWxkRGF0YU1vZGVsLmRhdGFfbW9kZWwuaW50ZXJwcmV0YXRpb24uZmluZChmdW5jdGlvbiAoaW50ZXJwcml0YXRpb24pIHtcbiAgICAgIHJldHVybiBpbnRlcnByaXRhdGlvbi5zcmMgPT0gc3JjO1xuICAgIH0pIHx8IGRlZmF1bHRGaWVsZERhdGFNb2RlbC5kYXRhX21vZGVsLmludGVycHJldGF0aW9uLmZpbmQoZnVuY3Rpb24gKGludGVycHJpdGF0aW9uKSB7XG4gICAgICByZXR1cm4gaW50ZXJwcml0YXRpb24uc3JjID09ICd0YWJsZSc7XG4gICAgfSkgfHwge1xuICAgICAgaWQ6ICdkZWZhdWx0J1xuICAgIH07XG4gICAgdmFyIGludGVycHJldGF0aW9uID0gZGVmYXVsdEludHJwck9iajtcbiAgICBpZiAoZmllbGREYXRhTW9kZWwuZGF0YV9tb2RlbCAmJiBmaWVsZERhdGFNb2RlbC5kYXRhX21vZGVsLmludGVycHJldGF0aW9uKSB7XG4gICAgICAvLyBUbyBkZXRlY3QgaW50ZXJwcmV0YXRpb24gd2UgdXNlIChjb250YWluZXJfaWQpLCBpZiB0aGVyZSBpcyBub3QgKGNvbnRhaW5lcl9pZCkgd2UgdXNlIChzcmMpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkRGF0YU1vZGVsLmRhdGFfbW9kZWwuaW50ZXJwcmV0YXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGZpZWxkRGF0YU1vZGVsLmRhdGFfbW9kZWwuaW50ZXJwcmV0YXRpb25baV0uc3JjID09IHNyYyB8fCBmaWVsZERhdGFNb2RlbC5kYXRhX21vZGVsLmludGVycHJldGF0aW9uW2ldLnNyYyA9PSBjb250YWluZXJJZCkge1xuICAgICAgICAgIGN1cnJlbnRJbnRycHIucHVzaChmaWVsZERhdGFNb2RlbC5kYXRhX21vZGVsLmludGVycHJldGF0aW9uW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50SW50cnByLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjdXJyZW50SW50cnByW2ldLnNldHRpbmdzICYmIGN1cnJlbnRJbnRycHJbaV0uc2V0dGluZ3MuY29uZGl0aW9uX2ZpbHRlciAmJiBjdXJyZW50SW50cnByW2ldLnNldHRpbmdzLmZpbHRlcnNfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IGd1ZGh1Yi5nZXRJdGVtKGFwcElkLCBpdGVtSWQpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gZ3VkaHViLmZpbHRlcihbaXRlbV0sIGN1cnJlbnRJbnRycHJbaV0uc2V0dGluZ3MuZmlsdGVyc19saXN0KTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24gPSBjdXJyZW50SW50cnByW2ldO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJwcmV0YXRpb24gPSBndWRodWIubWVyZ2VPYmplY3RzKGludGVycHJldGF0aW9uLCBjdXJyZW50SW50cnByW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW50ZXJwcmV0YXRpb247XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKiogR0VUIElOVEVSUFJFVEFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGdldEludGVycHJldGF0aW9uKHZhbHVlLCBmaWVsZCwgZGF0YVR5cGUsIHNvdXJjZSwgaXRlbUlkLCBhcHBJZCwgY29udGFpbmVySWQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLyotLSBCeSBkZWZhdWx0IHdlIHVzZSAnZGF0YV90eXBlJyBmcm9tIGZpZWxkIGJ1dCBpbiBjYXNlIGlmIGZpZWxkIGlzIHVuZGVmaW5lZCB3ZSB1c2UgJ2RhdGFUeXBlJyBmcm9tIGF0dHJpYnV0ZSovXG4gICAgICB2YXIgZGF0YV90eXBlID0gZmllbGQgJiYgZmllbGQuZGF0YV90eXBlID8gZmllbGQuZGF0YV90eXBlIDogZGF0YVR5cGU7XG5cbiAgICAgIC8qLS0tLSBDb25zdHJ1Y3RpbmcgRGF0YSBPYmplY3QgLS0tLSovXG4gICAgICBpZiAoZGF0YV90eXBlKSB7XG4gICAgICAgIC8qLS0gaWYgd2UgaGF2ZSBkYXRhX3R5cGUgdGhlbiB3ZSBjb25zdHJ1Y3QgbmV3IGRhdGEgb2JqZWN0IHRvIGludGVycHJpdGF0ZSB2YWx1ZSovXG4gICAgICAgIGd1ZGh1Yi5naGNvbnN0cnVjdG9yLmdldEluc3RhbmNlKGRhdGFfdHlwZSkudGhlbihhc3luYyBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgaW50ZXJwcmV0YXRpb25PYmogPSBhd2FpdCBzZWxmLmdldEludGVycHJldGF0aW9uT2JqKGZpZWxkLCBkYXRhLmdldFRlbXBsYXRlKCkubW9kZWwsIHNvdXJjZSwgY29udGFpbmVySWQsIGl0ZW1JZCwgYXBwSWQpO1xuICAgICAgICAgICAgZGF0YS5nZXRJbnRlcnByZXRhdGlvbih2YWx1ZSwgaW50ZXJwcmV0YXRpb25PYmouaWQsIGRhdGFfdHlwZSwgZmllbGQsIGl0ZW1JZCwgYXBwSWQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQsIGludGVycHJldGF0aW9uT2JqKVxuXG4gICAgICAgICAgICAgIHJlc29sdmUoZ3VkaHViLm1lcmdlT2JqZWN0cyhyZXN1bHQsIGludGVycHJldGF0aW9uT2JqKSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignR2V0IEludGVycHJldGF0aW9uOiBkYXRhX3R5cGUgaXMgdW5kZWZpbmVkJywgZGF0YVR5cGUsIGZpZWxkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKiogR0VUIElOVEVSUFJFVEFUSU9OIEJZIElEICoqKioqKioqKioqKioqKioqKioqKi9cblxuICAvLyBXZSBhZGQgYWJpbGl0eSB0byBwYXNzIHZhbHVlIGFzIGFyZ3VtZW50LCB0byByZWR1Y2UgbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gdGhpcyBjYXNlIChnZXRGaWVsZFZhbHVlKVxuICAvLyBUaGlzIGhlbHBzIGlmIHlvdSBjYWxsIG1ldGhvZCBtYW55IHRpbWVzLCBmb3IgZXhhbXBsZSBpbiBjYWxjdWxhdG9yIHN1bSBhbmQgeW91IGFscmVhZHkgaGF2ZSBmaWVsZCB2YWx1ZVxuICAvLyBCeSBkZWZhdWx0LCB2YWx1ZSBpcyBudWxsLCB0byBub3QgYnJlYWsgb2xkIGNvZGUgd29ya2luZyB3aXRoIHRoaXMgbWV0aG9kXG5cbiAgLy8gRm9yIGZpZWxkIHNhbWUgYXMgYWJvdmUgZm9yIHZhbHVlXG4gIGFzeW5jIGdldEludGVycHJldGF0aW9uQnlJZChhcHBJZCwgaXRlbUlkLCBmaWVsZElkLCBpbnRlcnByZXRhdGlvbklkLCB2YWx1ZSA9IG51bGwsIGZpZWxkID0gbnVsbCkge1xuICAgIGxldCBmaWVsZFZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IGF3YWl0IHRoaXMuZ3VkaHViLmdldEZpZWxkVmFsdWUoYXBwSWQsIGl0ZW1JZCwgZmllbGRJZCkgOiB2YWx1ZTtcbiAgICBsZXQgZmllbGRNb2RlbCA9IGZpZWxkID09IG51bGwgPyBhd2FpdCB0aGlzLmd1ZGh1Yi5nZXRGaWVsZChhcHBJZCwgZmllbGRJZCkgOiBmaWVsZDtcbiAgICBpZiAoZmllbGRNb2RlbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5ndWRodWIuZ2hjb25zdHJ1Y3Rvci5nZXRJbnN0YW5jZShmaWVsZE1vZGVsLmRhdGFfdHlwZSk7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRlZFZhbHVlID0gYXdhaXQgaW5zdGFuY2UuZ2V0SW50ZXJwcmV0YXRpb24oZmllbGRWYWx1ZSwgaW50ZXJwcmV0YXRpb25JZCwgZmllbGRNb2RlbC5kYXRhX3R5cGUsIGZpZWxkTW9kZWwsIGl0ZW1JZCwgYXBwSWQpO1xuICAgIGlmIChpbnRlcnByZXRhdGVkVmFsdWUuaHRtbCA9PSAnPHNwYW4+bm8gaW50ZXJwcmV0YXRpb248L3NwYW4+Jykge1xuICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnByZXRhdGVkVmFsdWUuaHRtbDtcbiAgICB9XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9XZWJTb2NrZXQvV2Vic29ja2V0SGFuZGxlci5qc1xuZnVuY3Rpb24gV2Vic29ja2V0SGFuZGxlcihndWRodWIsIG1lc3NhZ2UpIHtcbiAgc3dpdGNoIChtZXNzYWdlLmFwaSkge1xuICAgIGNhc2UgXCIvaXRlbXMvdXBkYXRlXCI6XG4gICAgICBjb25zb2xlLmxvZyhcIi9pdGVtcy91cGRhdGUgLSBcIiwgbWVzc2FnZSk7XG4gICAgICBndWRodWIuaXRlbVByb2Nlc3Nvci51cGRhdGVJdGVtc0luU3RvcmFnZShtZXNzYWdlLmFwcF9pZCwgbWVzc2FnZS5yZXNwb25zZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiL2l0ZW1zL2FkZFwiOlxuICAgICAgY29uc29sZS5sb2coXCIvaXRlbXMvYWRkIC0gXCIsIG1lc3NhZ2UpO1xuICAgICAgZ3VkaHViLml0ZW1Qcm9jZXNzb3IuYWRkSXRlbXNUb1N0b3JhZ2UobWVzc2FnZS5hcHBfaWQsIG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIi9pdGVtcy9kZWxldGVcIjpcbiAgICAgIGNvbnNvbGUubG9nKFwiL2l0ZW1zL2RlbGV0ZSAtIFwiLCBtZXNzYWdlKTtcbiAgICAgIGd1ZGh1Yi5pdGVtUHJvY2Vzc29yLmRlbGV0ZUl0ZW1zRnJvbVN0b3JhZ2UobWVzc2FnZS5hcHBfaWQsIG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIi9hcHAvdXBkYXRlXCI6XG4gICAgICBjb25zb2xlLmxvZyhcIi9hcHAvdXBkYXRlIC0gXCIsIG1lc3NhZ2UpO1xuICAgICAgZ3VkaHViLmFwcFByb2Nlc3Nvci51cGRhdGVBcHBGaWVsZHNBbmRWaWV3cyhtZXNzYWdlLnJlc3BvbnNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIvZmlsZS9kZWxldGVcIjpcbiAgICAgIGNvbnNvbGUubG9nKFwiZmlsZS9kZWxldGUgLSBcIiwgbWVzc2FnZSk7XG4gICAgICBndWRodWIuZmlsZU1hbmFnZXIuZGVsZXRlRmlsZUZyb21TdG9yYWdlKG1lc3NhZ2UucmVzcG9uc2UuZmlsZV9pZCwgbWVzc2FnZS5hcHBfaWQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIi9maWxlL3VwbG9hZFwiOlxuICAgICAgY29uc29sZS5sb2coXCJmaWxlL3VwbG9hZCAtIFwiLCBtZXNzYWdlKTtcbiAgICAgIGd1ZGh1Yi5maWxlTWFuYWdlci5hZGRGaWxlVG9TdG9yYWdlKG1lc3NhZ2UuYXBwX2lkLCBtZXNzYWdlLnJlc3BvbnNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIvZmlsZS9mb3JtdXBsb2FkXCI6XG4gICAgICAvL0knbSBub3Qgc2h1cmUgaWYgd2UgYXJlIHVzaW5nIGl0IChwcm9iYWJseSBpbiBjb250YWN0IGZvcm0pXG4gICAgICBjb25zb2xlLmxvZyhcImZpbGUvZm9ybXVwbG9hZCAtIFwiLCBtZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIvZmlsZS91cGRhdGVcIjpcbiAgICAgIC8vSSdtIG5vdCBzaHVyZSBpZiB3ZSBhcmUgdXNpbmcgaXQgKHByb2JhYmx5IGluIGNvbnRhY3QgZm9ybSlcbiAgICAgIGd1ZGh1Yi5maWxlTWFuYWdlci51cGRhdGVGaWxlSW5TdG9yYWdlKG1lc3NhZ2UucmVzcG9uc2UuZmlsZV9pZCwgbWVzc2FnZS5yZXNwb25zZS5hcHBfaWQsIG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgY29uc29sZS5sb2coXCJmaWxlL3VwZGF0ZSAtIFwiLCBtZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIvbmV3L2ZpbGUvZHVwbGljYXRlXCI6XG4gICAgICAvL0knbSBub3Qgc2h1cmUgaWYgd2UgYXJlIHVzaW5nIGl0IChwcm9iYWJseSBpbiBjb250YWN0IGZvcm0pXG4gICAgICBndWRodWIuZmlsZU1hbmFnZXIuYWRkRmlsZXNUb1N0b3JhZ2UobWVzc2FnZS5hcHBfaWQsIG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgY29uc29sZS5sb2coXCJuZXcvZmlsZS9kdXBsaWNhdGUgLSBcIiwgbWVzc2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcvYXBpL25ldy9kb2N1bWVudC9pbnNlcnQtb25lJzpcbiAgICAgIGd1ZGh1Yi5kb2N1bWVudE1hbmFnZXIuZW1pdERvY3VtZW50SW5zZXJ0KG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgY29uc29sZS5sb2coJy9hcGkvbmV3L2RvY3VtZW50L2luc2VydC1vbmUgLSAnLCBtZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJy93cy9lbWl0LXRvLXVzZXInOlxuICAgICAgY29uc29sZS5sb2coJy93cy9lbWl0LXRvLXVzZXIgLSAnLCBtZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJy93cy9icm9hZGNhc3QtdG8tYXBwLXN1YnNjcmliZXJzJzpcbiAgICAgIGNvbnNvbGUubG9nKCcvd3MvYnJvYWRjYXN0LXRvLWFwcC1zdWJzY3JpYmVycyAtICcsIG1lc3NhZ2UpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKG1lc3NhZ2UucmVzcG9uc2UpO1xuICAgICAgaWYgKCFyZXNwb25zZS5kYXRhX3R5cGUpIHJldHVybjtcbiAgICAgIGd1ZGh1Yi5naGNvbnN0cnVjdG9yLmdldEluc3RhbmNlKHJlc3BvbnNlLmRhdGFfdHlwZSkudGhlbihpbnN0YW5jZSA9PiB7XG4gICAgICAgIGluc3RhbmNlLm9uTWVzc2FnZShtZXNzYWdlLmFwcF9pZCwgbWVzc2FnZS51c2VyX2lkLCByZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLndhcm4oXCJXRUJTT0NLRVRTIGlzIG5vdCBwcm9jZXNzIHRoaXMgQVBJOlwiLCBtZXNzYWdlLmFwaSk7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9ncm91cE1hbmFnZXIvR3JvdXBNYW5hZ2VyLmpzXG5jbGFzcyBHcm91cE1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcihndWRodWIsIHJlcSkge1xuICAgIHRoaXMucmVxID0gcmVxO1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogQ1JFQVRFIEdST1VQICoqKioqKioqKioqKioqKioqKioqKi8vXG5cbiAgYXN5bmMgY3JlYXRlR3JvdXBBcGkoZ3JvdXBOYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGdyb3VwX25hbWU6IGdyb3VwTmFtZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL3NoYXJpbmctZ3JvdXAvY3JlYXRlLWdyb3VwXCIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIFVQREFURSBHUk9VUCAqKioqKioqKioqKioqKioqKioqKiovL1xuXG4gIGFzeW5jIHVwZGF0ZUdyb3VwQXBpKGdyb3VwSWQsIGdyb3VwTmFtZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICBncm91cF9uYW1lOiBncm91cE5hbWUsXG4gICAgICAgIGdyb3VwX2lkOiBncm91cElkXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JvdXAgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvc2hhcmluZy1ncm91cC91cGRhdGUtZ3JvdXBcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogREVMRVRFIEdST1VQICoqKioqKioqKioqKioqKioqKioqKi8vXG5cbiAgYXN5bmMgZGVsZXRlR3JvdXBBcGkoZ3JvdXBJZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICBncm91cF9pZDogZ3JvdXBJZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL3NoYXJpbmctZ3JvdXAvZGVsZXRlLWdyb3VwXCIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIEFERCBVU0VSIFRPIEdST1VQICoqKioqKioqKioqKioqKioqKioqKi8vXG5cbiAgYXN5bmMgYWRkVXNlclRvR3JvdXBBcGkoZ3JvdXBJZCwgdXNlcklkLCBwZXJtaXNzaW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGdyb3VwX2lkOiBncm91cElkLFxuICAgICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgICAgIGdyb3VwX3Blcm1pc3Npb246IHBlcm1pc3Npb25cbiAgICAgIH07XG4gICAgICBjb25zdCBncm91cCA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9zaGFyaW5nLWdyb3VwL2FkZC11c2VyLXRvLWdyb3VwXCIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIEdFVCBVU0VSUyBCWSBHUk9VUCAqKioqKioqKioqKioqKioqKioqKiovL1xuXG4gIGFzeW5jIGdldFVzZXJzQnlHcm91cEFwaShncm91cElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGdyb3VwX2lkOiBncm91cElkXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JvdXAgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvc2hhcmluZy1ncm91cC9nZXQtdXNlcnMtYnktZ3JvdXBcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogVVBEQVRFIFVTRVIgSU4gR1JPVVAgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyB1cGRhdGVVc2VySW5Hcm91cEFwaSh1c2VySWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgdG9rZW46IGF3YWl0IHRoaXMuZ3VkaHViLmF1dGguZ2V0VG9rZW4oKSxcbiAgICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgICAgICBncm91cF9pZDogZ3JvdXBJZCxcbiAgICAgICAgZ3JvdXBfcGVybWlzc2lvbjogcGVybWlzc2lvblxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL3NoYXJpbmctZ3JvdXAvdXBkYXRlLXVzZXItaW4tZ3JvdXBcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogUkVNT1ZFIFVTRVIgRlJPTSBHUk9VUCAqKioqKioqKioqKioqKioqKioqKiovL1xuXG4gIGFzeW5jIGRlbGV0ZVVzZXJGcm9tR3JvdXBBcGkodXNlcklkLCBncm91cElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICAgICAgZ3JvdXBfaWQ6IGdyb3VwSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBncm91cCA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9zaGFyaW5nLWdyb3VwL2RlbGV0ZS11c2VyLWZyb20tZ3JvdXBcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogR0VUIEdST1VQUyBCWSBVU0VSICoqKioqKioqKioqKioqKioqKioqKi8vXG5cbiAgYXN5bmMgZ2V0R3JvdXBzQnlVc2VyQXBpKHVzZXJJZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICB1c2VyX2lkOiB1c2VySWRcbiAgICAgIH07XG4gICAgICBjb25zdCBncm91cCA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9zaGFyaW5nLWdyb3VwL2dldC1ncm91cHMtYnktdXNlclwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBncm91cDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9zaGFyaW5nL0FwcEdyb3VwU2hhcmluZy5qc1xuY2xhc3MgQXBwR3JvdXBTaGFyaW5nIHtcbiAgY29uc3RydWN0b3IoZ3VkaHViLCByZXEpIHtcbiAgICB0aGlzLnJlcSA9IHJlcTtcbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIEFERCBBUFAgVE8gR1JPVVAgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyBhZGRBcHBUb0dyb3VwQXBpKGFwcElkLCBncm91cElkLCBwZXJtaXNzaW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGFwcF9pZDogYXBwSWQsXG4gICAgICAgIGdyb3VwX2lkOiBncm91cElkLFxuICAgICAgICBhcHBfcGVybWlzc2lvbjogcGVybWlzc2lvblxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL3NoYXJpbmctZ3JvdXAvYWRkLWFwcC10by1ncm91cFwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBncm91cDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyoqKioqKioqKioqKioqKioqKioqKiBHRVQgQVBQUyBCWSBHUk9VUCAqKioqKioqKioqKioqKioqKioqKiovL1xuXG4gIGFzeW5jIGdldEFwcHNCeUdyb3VwQXBpKGdyb3VwSWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgdG9rZW46IGF3YWl0IHRoaXMuZ3VkaHViLmF1dGguZ2V0VG9rZW4oKSxcbiAgICAgICAgZ3JvdXBfaWQ6IGdyb3VwSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBncm91cCA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9zaGFyaW5nLWdyb3VwL2dldC1hcHBzLWJ5LWdyb3VwXCIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqIFVQREFURSBBUFAgSU4gR1JPVVAgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyB1cGRhdGVBcHBJbkdyb3VwQXBpKGFwcElkLCBncm91cElkLCBwZXJtaXNzaW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGdyb3VwX2lkOiBncm91cElkLFxuICAgICAgICBhcHBfaWQ6IGFwcElkLFxuICAgICAgICBhcHBfcGVybWlzc2lvbjogcGVybWlzc2lvblxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvYXBpL3NoYXJpbmctZ3JvdXAvdXBkYXRlLWFwcC1pbi1ncm91cFwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBncm91cDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyoqKioqKioqKioqKioqKioqKioqKiBERUxFVEUgQVBQIEZST00gR1JPVVAgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyBkZWxldGVBcHBGcm9tR3JvdXBBcGkoYXBwSWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgdG9rZW46IGF3YWl0IHRoaXMuZ3VkaHViLmF1dGguZ2V0VG9rZW4oKSxcbiAgICAgICAgZ3JvdXBfaWQ6IGdyb3VwSWQsXG4gICAgICAgIGFwcF9pZDogYXBwSWQsXG4gICAgICAgIGFwcF9wZXJtaXNzaW9uOiBwZXJtaXNzaW9uXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JvdXAgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvc2hhcmluZy1ncm91cC9kZWxldGUtYXBwLWZyb20tZ3JvdXBcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKiogR0VUIEdST1VQUyBCWSBBUFAgKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBhc3luYyBnZXRHcm91cHNCeUFwcEFwaShhcHBJZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICBhcHBfaWQ6IGFwcElkXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JvdXAgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9hcGkvc2hhcmluZy1ncm91cC9nZXQtZ3JvdXBzLWJ5LWFwcFwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBncm91cDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9VdGlscy9zaGFyaW5nL0dyb3VwU2hhcmluZy5qc1xuXG5cbmNsYXNzIEdyb3VwU2hhcmluZyB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1YiwgcmVxLCBwaXBlU2VydmljZSkge1xuICAgIHRoaXMucmVxID0gcmVxO1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICAgIHRoaXMucGlwZVNlcnZpY2UgPSBwaXBlU2VydmljZTtcbiAgICB0aGlzLmdyb3VwTWFuYWdlciA9IG5ldyBHcm91cE1hbmFnZXIoZ3VkaHViLCByZXEpO1xuICAgIHRoaXMuYXBwR3JvdXBTaGFyaW5nID0gbmV3IEFwcEdyb3VwU2hhcmluZyhndWRodWIsIHJlcSk7XG4gIH1cbiAgY3JlYXRlR3JvdXAoZ3JvdXBOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBNYW5hZ2VyLmNyZWF0ZUdyb3VwQXBpKGdyb3VwTmFtZSk7XG4gIH1cbiAgdXBkYXRlR3JvdXAoZ3JvdXBJZCwgZ3JvdXBOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBNYW5hZ2VyLnVwZGF0ZUdyb3VwQXBpKGdyb3VwSWQsIGdyb3VwTmFtZSk7XG4gIH1cbiAgZGVsZXRlR3JvdXAoZ3JvdXBJZCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwTWFuYWdlci5kZWxldGVHcm91cEFwaShncm91cElkKTtcbiAgfVxuICBhc3luYyBhZGRVc2VyVG9Hcm91cCh1c2VySWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pIHtcbiAgICBsZXQgbmV3VXNlciA9IGF3YWl0IHRoaXMuZ3JvdXBNYW5hZ2VyLmFkZFVzZXJUb0dyb3VwQXBpKHVzZXJJZCwgZ3JvdXBJZCwgcGVybWlzc2lvbik7XG4gICAgdGhpcy5waXBlU2VydmljZS5lbWl0KFwiZ3JvdXBfbWVtYmVyc19hZGRcIiwge1xuICAgICAgYXBwX2lkOiBcImdyb3VwX3NoYXJpbmdcIlxuICAgIH0sIG5ld1VzZXIpO1xuICAgIHJldHVybiBuZXdVc2VyO1xuICB9XG4gIGdldFVzZXJzQnlHcm91cChncm91cElkKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBNYW5hZ2VyLmdldFVzZXJzQnlHcm91cEFwaShncm91cElkKTtcbiAgfVxuICBhc3luYyB1cGRhdGVVc2VySW5Hcm91cCh1c2VySWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pIHtcbiAgICBsZXQgdXBkYXRlZFVzZXIgPSBhd2FpdCB0aGlzLmdyb3VwTWFuYWdlci51cGRhdGVVc2VySW5Hcm91cEFwaSh1c2VySWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pO1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdyb3VwX21lbWJlcnNfdXBkYXRlXCIsIHtcbiAgICAgIGFwcF9pZDogXCJncm91cF9zaGFyaW5nXCJcbiAgICB9LCB1cGRhdGVkVXNlcik7XG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyO1xuICB9XG4gIGFzeW5jIGRlbGV0ZVVzZXJGcm9tR3JvdXAodXNlcklkLCBncm91cElkKSB7XG4gICAgbGV0IGRlbGV0ZWRVc2VyID0gYXdhaXQgdGhpcy5ncm91cE1hbmFnZXIuZGVsZXRlVXNlckZyb21Hcm91cEFwaSh1c2VySWQsIGdyb3VwSWQpO1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdChcImdyb3VwX21lbWJlcnNfZGVsZXRlXCIsIHtcbiAgICAgIGFwcF9pZDogXCJncm91cF9zaGFyaW5nXCJcbiAgICB9LCBkZWxldGVkVXNlcik7XG4gICAgcmV0dXJuIGRlbGV0ZWRVc2VyO1xuICB9XG4gIGdldEdyb3Vwc0J5VXNlcih1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cE1hbmFnZXIuZ2V0R3JvdXBzQnlVc2VyQXBpKHVzZXJJZCk7XG4gIH1cbiAgYWRkQXBwVG9Hcm91cChhcHBJZCwgZ3JvdXBJZCwgcGVybWlzc2lvbikge1xuICAgIHJldHVybiB0aGlzLmFwcEdyb3VwU2hhcmluZy5hZGRBcHBUb0dyb3VwQXBpKGFwcElkLCBncm91cElkLCBwZXJtaXNzaW9uKTtcbiAgfVxuICBnZXRBcHBzQnlHcm91cChncm91cElkKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwR3JvdXBTaGFyaW5nLmdldEFwcHNCeUdyb3VwQXBpKGdyb3VwSWQpO1xuICB9XG4gIHVwZGF0ZUFwcEluR3JvdXAoYXBwSWQsIGdyb3VwSWQsIHBlcm1pc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBHcm91cFNoYXJpbmcudXBkYXRlQXBwSW5Hcm91cEFwaShhcHBJZCwgZ3JvdXBJZCwgcGVybWlzc2lvbik7XG4gIH1cbiAgZGVsZXRlQXBwRnJvbUdyb3VwKGFwcElkLCBncm91cElkLCBwZXJtaXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwR3JvdXBTaGFyaW5nLmRlbGV0ZUFwcEZyb21Hcm91cEFwaShhcHBJZCwgZ3JvdXBJZCwgcGVybWlzc2lvbik7XG4gIH1cbiAgZ2V0R3JvdXBzQnlBcHAoYXBwSWQpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBHcm91cFNoYXJpbmcuZ2V0R3JvdXBzQnlBcHBBcGkoYXBwSWQpO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvVXRpbHMvc2hhcmluZy9TaGFyaW5nLmpzXG5jbGFzcyBTaGFyaW5nIHtcbiAgY29uc3RydWN0b3IoZ3VkaHViLCByZXEpIHtcbiAgICB0aGlzLnJlcSA9IHJlcTtcbiAgICB0aGlzLmd1ZGh1YiA9IGd1ZGh1YjtcbiAgfVxuICBhc3luYyBhZGQoYXBwSWQsIHVzZXJJZCwgcGVybWlzc2lvbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICBhcHBfaWQ6IGFwcElkLFxuICAgICAgICB1c2VyX2lkOiB1c2VySWQsXG4gICAgICAgIHNoYXJpbmdfcGVybWlzc2lvbjogcGVybWlzc2lvblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvc2hhcmluZy9hZGRcIixcbiAgICAgICAgZm9ybVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIHVwZGF0ZShhcHBJZCwgdXNlcklkLCBwZXJtaXNzaW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLmd1ZGh1Yi5hdXRoLmdldFRva2VuKCksXG4gICAgICAgIGFwcF9pZDogYXBwSWQsXG4gICAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICAgICAgc2hhcmluZ19wZXJtaXNzaW9uOiBwZXJtaXNzaW9uXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9zaGFyaW5nL3VwZGF0ZVwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZGVsZXRlKGFwcElkLCB1c2VySWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgdG9rZW46IGF3YWl0IHRoaXMuZ3VkaHViLmF1dGguZ2V0VG9rZW4oKSxcbiAgICAgICAgYXBwX2lkOiBhcHBJZCxcbiAgICAgICAgdXNlcl9pZDogdXNlcklkXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcS5wb3N0KHtcbiAgICAgICAgdXJsOiBcIi9zaGFyaW5nL2RlbGV0ZVwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZ2V0QXBwVXNlcnMoYXBwSWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgdG9rZW46IGF3YWl0IHRoaXMuZ3VkaHViLmF1dGguZ2V0VG9rZW4oKSxcbiAgICAgICAgYXBwX2lkOiBhcHBJZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXEucG9zdCh7XG4gICAgICAgIHVybDogXCIvc2hhcmluZy9nZXQtYXBwLXVzZXJzXCIsXG4gICAgICAgIGZvcm1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBhZGRJbnZpdGF0aW9uKGd1ZXN0c0VtYWlscywgYXBwcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5ndWRodWIuYXV0aC5nZXRUb2tlbigpLFxuICAgICAgICBndWVzdHNfZW1haWxzOiBndWVzdHNFbWFpbHMsXG4gICAgICAgIGFwcHNcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxLnBvc3Qoe1xuICAgICAgICB1cmw6IFwiL2FwaS9pbnZpdGF0aW9uL2FkZFwiLFxuICAgICAgICBmb3JtXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL0dVREhVQi9XZWJTb2NrZXQvV2ViU29ja2V0RW1pdHRlci5qc1xuY2xhc3MgV2ViU29ja2V0RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKGd1ZGh1Yikge1xuICAgIHRoaXMuZ3VkaHViID0gZ3VkaHViO1xuICB9XG4gIGFzeW5jIGVtaXRUb1VzZXIodXNlcl9pZCwgZGF0YSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICB1c2VyX2lkLFxuICAgICAgZGF0YTogdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiBkYXRhXG4gICAgfTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ3VkaHViLnJlcS5wb3N0KHtcbiAgICAgIHVybDogJy93cy9lbWl0LXRvLXVzZXInLFxuICAgICAgZm9ybTogbWVzc2FnZVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuICBhc3luYyBicm9hZGNhc3RUb0FwcFN1YnNjcmliZXJzKGFwcF9pZCwgZGF0YV90eXBlLCBkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIGFwcF9pZCxcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGF0YV90eXBlLFxuICAgICAgICBkYXRhXG4gICAgICB9KVxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmd1ZGh1Yi5yZXEucG9zdCh7XG4gICAgICB1cmw6ICcvd3MvYnJvYWRjYXN0LXRvLWFwcC1zdWJzY3JpYmVycycsXG4gICAgICBmb3JtOiBtZXNzYWdlXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9HVURIVUIvZ3VkaHViLmpzXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vLyBpbXBvcnQgeyBDaHVua3NNYW5hZ2VyIH0gZnJvbSBcIi4vQ2h1bmtzTWFuYWdlci9DaHVua3NNYW5hZ2VyLmpzXCI7XG5cblxuXG5cblxuXG5cblxuY2xhc3MgR3VkSHViIHtcbiAgY29uc3RydWN0b3IoYXV0aEtleSwgb3B0aW9ucyA9IHtcbiAgICBzZXJ2ZXJfdXJsOiBzZXJ2ZXJfdXJsLFxuICAgIHdzc191cmw6IHdzc191cmwsXG4gICAgbm9kZV9zZXJ2ZXJfdXJsOiBub2RlX3NlcnZlcl91cmwsXG4gICAgaW5pdFdlYnNvY2tldDogZmFsc2UsXG4gICAgYWN0aXZhdGVTVzogZmFsc2UsXG4gICAgc3dMaW5rOiBcIlwiLFxuICAgIGFzeW5jX21vZHVsZXNfcGF0aDogYXN5bmNfbW9kdWxlc19wYXRoLFxuICAgIGZpbGVfc2VydmVyX3VybDogZmlsZV9zZXJ2ZXJfdXJsLFxuICAgIGF1dG9tYXRpb25fbW9kdWxlc19wYXRoOiBhdXRvbWF0aW9uX21vZHVsZXNfcGF0aCxcbiAgICBhY2Nlc3N0b2tlbjogdGhpcy5hY2Nlc3N0b2tlbixcbiAgICBleHBpcnlkYXRlOiB0aGlzLmV4cGlyeWRhdGVcbiAgfSkge1xuICAgIHRoaXMuc2VyaWFsaXplZCA9IHtcbiAgICAgIGF1dGhLZXksXG4gICAgICBvcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLmNvbmZpZyA9IG9wdGlvbnM7XG4gICAgdGhpcy5naGNvbnN0cnVjdG9yID0gbmV3IEdIQ29uc3RydWN0b3IodGhpcyk7XG4gICAgdGhpcy5pbnRlcnByaXRhdGUgPSBuZXcgSW50ZXJwcml0YXRlKHRoaXMpO1xuICAgIHRoaXMucGlwZVNlcnZpY2UgPSBuZXcgUGlwZVNlcnZpY2UoKTtcbiAgICB0aGlzLnN0b3JhZ2UgPSBuZXcgU3RvcmFnZShvcHRpb25zLmFzeW5jX21vZHVsZXNfcGF0aCwgb3B0aW9ucy5maWxlX3NlcnZlcl91cmwsIG9wdGlvbnMuYXV0b21hdGlvbl9tb2R1bGVzX3BhdGgpO1xuICAgIHRoaXMudXRpbCA9IG5ldyBVdGlscyh0aGlzKTtcbiAgICB0aGlzLnJlcSA9IG5ldyBHdWRIdWJIdHRwc1NlcnZpY2Uob3B0aW9ucy5zZXJ2ZXJfdXJsKTtcbiAgICB0aGlzLmF1dGggPSBuZXcgQXV0aCh0aGlzLnJlcSwgdGhpcy5zdG9yYWdlKTtcbiAgICB0aGlzLnNoYXJpbmcgPSBuZXcgU2hhcmluZyh0aGlzLCB0aGlzLnJlcSk7XG4gICAgdGhpcy5ncm91cFNoYXJpbmcgPSBuZXcgR3JvdXBTaGFyaW5nKHRoaXMsIHRoaXMucmVxLCB0aGlzLnBpcGVTZXJ2aWNlKTtcblxuICAgIC8vIExvZ2luIHdpdGggYWNjZXNzIHRva2VuIC0gcGFzcyB0byBzZXRVc2VyIGFjY2VzcyB0b2tlbiBhbmQgYWZ0ZXIgaXQgdXNlciBjYW4gIG1ha2UgcmVxdWVzdHMgd2l0aCBhY2Nlc3MgdG9rZW5cbiAgICAvLyBUaGlzIG1ldGhvZCBjcmVhdGVkIGZvciBvcHRpbWl6ZSBHdWRIdWIgIGluaXRpYWxpemF0aW9uIHdpdGhvdXQgYXV0aCBrZXlcbiAgICBpZiAoYXV0aEtleSkge1xuICAgICAgdGhpcy5zdG9yYWdlLnNldFVzZXIoe1xuICAgICAgICBhdXRoX2tleTogYXV0aEtleVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmFjY2Vzc3Rva2VuICYmIG9wdGlvbnMuZXhwaXJ5ZGF0ZSkge1xuICAgICAgdGhpcy5zdG9yYWdlLnNldFVzZXIoe1xuICAgICAgICBhY2Nlc3N0b2tlbjogb3B0aW9ucy5hY2Nlc3N0b2tlbixcbiAgICAgICAgZXhwaXJ5ZGF0ZTogb3B0aW9ucy5leHBpcnlkYXRlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yZXEuaW5pdCh0aGlzLmF1dGguZ2V0VG9rZW4uYmluZCh0aGlzLmF1dGgpKTtcbiAgICB0aGlzLndzID0gbmV3IFdlYlNvY2tldEFwaShvcHRpb25zLndzc191cmwsIHRoaXMuYXV0aCk7XG5cbiAgICAvL3RvZG9cbiAgICAvLyB0aGlzLmNodW5rc01hbmFnZXIgPSBuZXcgQ2h1bmtzTWFuYWdlcihcbiAgICAvLyAgIHRoaXMuc3RvcmFnZSxcbiAgICAvLyAgIHRoaXMucGlwZVNlcnZpY2UsXG4gICAgLy8gICB0aGlzLnJlcSxcbiAgICAvLyAgIHRoaXMudXRpbCxcbiAgICAvLyAgIG5ldyBDaHVua0RhdGFTZXJ2aWNlKHRoaXMucmVxLCBjaHVua0RhdGFTZXJ2aWNlQ29uZiwgdGhpcyksXG4gICAgLy8gKTtcbiAgICB0aGlzLmFwcFByb2Nlc3NvciA9IG5ldyBBcHBQcm9jZXNzb3IodGhpcy5zdG9yYWdlLCB0aGlzLnBpcGVTZXJ2aWNlLCB0aGlzLnJlcSwgdGhpcy53cyxcbiAgICAvLyB0aGlzLmNodW5rc01hbmFnZXIsXG4gICAgdGhpcy51dGlsLCBvcHRpb25zLmFjdGl2YXRlU1csIG5ldyBleHBvcnRfQXBwRGF0YVNlcnZpY2UodGhpcy5yZXEsIGFwcERhdGFTZXJ2aWNlQ29uZiwgdGhpcykpO1xuICAgIHRoaXMuaXRlbVByb2Nlc3NvciA9IG5ldyBJdGVtUHJvY2Vzc29yKHRoaXMuc3RvcmFnZSwgdGhpcy5waXBlU2VydmljZSwgdGhpcy5yZXEsIHRoaXMuYXBwUHJvY2Vzc29yLCB0aGlzLnV0aWwpO1xuICAgIHRoaXMuZmllbGRQcm9jZXNzb3IgPSBuZXcgRmllbGRQcm9jZXNzb3IodGhpcy5zdG9yYWdlLCB0aGlzLnJlcSwgdGhpcy5hcHBQcm9jZXNzb3IsIHRoaXMuaXRlbVByb2Nlc3NvciwgdGhpcy5waXBlU2VydmljZSk7XG4gICAgdGhpcy5maWxlTWFuYWdlciA9IG5ldyBGaWxlTWFuYWdlcih0aGlzLnN0b3JhZ2UsIHRoaXMucGlwZVNlcnZpY2UsIHRoaXMucmVxLCB0aGlzLmFwcFByb2Nlc3Nvcik7XG4gICAgdGhpcy5kb2N1bWVudE1hbmFnZXIgPSBuZXcgRG9jdW1lbnRNYW5hZ2VyKHRoaXMucmVxLCB0aGlzLnBpcGVTZXJ2aWNlKTtcbiAgICB0aGlzLndlYnNvY2tldHNlbWl0dGVyID0gbmV3IFdlYlNvY2tldEVtaXR0ZXIodGhpcyk7XG4gICAgaWYgKG9wdGlvbnMuaW5pdFdlYnNvY2tldCkge1xuICAgICAgY29uc3QgZ3VkaHViID0gdGhpcztcbiAgICAgIHRoaXMud3MuaW5pdFdlYlNvY2tldChXZWJzb2NrZXRIYW5kbGVyLmJpbmQodGhpcywgZ3VkaHViKSwgdGhpcy5hcHBQcm9jZXNzb3IucmVmcmVzaEFwcHMuYmluZCh0aGlzLmFwcFByb2Nlc3NvcikpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hY3RpdmF0ZVNXKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlU1cob3B0aW9ucy5zd0xpbmspO1xuICAgIH1cbiAgfVxuICBhc3luYyBhY3RpdmF0ZVNXKHN3TGluaykge1xuICAgIGlmIChjb25zdHMvKiBJU19CUk9XU0VSX01BSU5fVEhSRUFEICovLlNSICYmIFwic2VydmljZVdvcmtlclwiIGluIHdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN3ID0gYXdhaXQgd2luZG93Lm5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKHN3TGluayk7XG4gICAgICAgIHN3LnVwZGF0ZSgpLnRoZW4oKCkgPT4gY29uc29sZS5sb2coXCIlY1NXIC0+Pj4gU2VydmljZSB3b3JrZXIgc3VjY2Vzc2Z1bCB1cGRhdGVkXCIsIFwiZGlzcGxheTogaW5saW5lLWJsb2NrIDsgYmFja2dyb3VuZC1jb2xvcjogIzY4OWYzOCA7IGNvbG9yOiAjZmZmZmZmIDsgZm9udC13ZWlnaHQ6IGJvbGQgOyBwYWRkaW5nOiAzcHggN3B4OyBib3JkZXItcmFkaXVzOiAzcHg7XCIpKS5jYXRjaCgoKSA9PiBjb25zb2xlLndhcm4oXCJTVyAtPj4+IFNlcnZpY2Ugd29ya2VyIGlzIG5vdCB1cGRhdGVkXCIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXCIlY1NXIC0+Pj4gU2VydmljZSB3b3JrZXIgaXMgcmVnaXN0ZXJlZFwiLCBcImRpc3BsYXk6IGlubGluZS1ibG9jayA7IGJhY2tncm91bmQtY29sb3I6ICM2ODlmMzggOyBjb2xvcjogI2ZmZmZmZiA7IGZvbnQtd2VpZ2h0OiBib2xkIDsgcGFkZGluZzogM3B4IDdweDsgYm9yZGVyLXJhZGl1czogM3B4O1wiLCBzdyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCIlY1NXIC0+Pj4gU2VydmljZSB3b3JrZXIgaXMgbm90IHJlZ2lzdGVyZWRcIiwgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2sgOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZDMyZjJmIDsgY29sb3I6ICNmZmZmZmYgOyBmb250LXdlaWdodDogYm9sZCA7IHBhZGRpbmc6IDNweCA3cHg7IGJvcmRlci1yYWRpdXM6IDNweDtcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIiVjU1cgLT4+PiBTZXJ2aWNlV29ya2VycyBub3Qgc3VwcG9ydGVkXCIsIFwiZGlzcGxheTogaW5saW5lLWJsb2NrIDsgYmFja2dyb3VuZC1jb2xvcjogI2QzMmYyZiA7IGNvbG9yOiAjZmZmZmZmIDsgZm9udC13ZWlnaHQ6IGJvbGQgOyBwYWRkaW5nOiAzcHggN3B4OyBib3JkZXItcmFkaXVzOiAzcHg7XCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKioqKioqKiBQSVBFU0VSVklDRSBNRVRIT0RTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgLy89PT09PT09PT09PT09IE9OIFBJUEUgPT09PT09PT09PT09PT09Ly9cbiAgb24odHlwZXMsIGRlc3RpbmF0aW9uLCBmbikge1xuICAgIHRoaXMucGlwZVNlcnZpY2Uub24odHlwZXMsIGRlc3RpbmF0aW9uLCBmbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLz09PT09PT09PT09PT0gRU1JVCBQSVBFID09PT09PT09PT09PT09Ly9cbiAgZW1pdCh0eXBlcywgZGVzdGluYXRpb24sIGFkZHJlc3MsIHBhcmFtcykge1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZW1pdCh0eXBlcywgZGVzdGluYXRpb24sIGFkZHJlc3MsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLz09PT09PT09PT09PSBERUxFVEUgTElTVEVORVIgPT09PT09PT0vL1xuICBkZXN0cm95KHR5cGVzLCBkZXN0aW5hdGlvbiwgZnVuYykge1xuICAgIHRoaXMucGlwZVNlcnZpY2UuZGVzdHJveSh0eXBlcywgZGVzdGluYXRpb24sIGZ1bmMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZJTFRFUkFUSU9OICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgcHJlZmlsdGVyKGZpbHRlcnNfbGlzdCwgdmFyaWFibGVzKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5wcmVmaWx0ZXIoZmlsdGVyc19saXN0LCB2YXJpYWJsZXMpO1xuICB9XG5cbiAgLy89PT09PT09PT09PT0gREVCT1VOQ0UgPT09PT09PT0vL1xuICBkZWJvdW5jZShmdW5jLCBkZWxheSkge1xuICAgIHJldHVybiB0aGlzLnV0aWwuZGVib3VuY2UoZnVuYywgZGVsYXkpO1xuICB9XG5cbiAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqIFdFQlNPQ0tFVFMgRU1JVFRFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cblxuICBlbWl0VG9Vc2VyKHVzZXJfaWQsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzb2NrZXRzZW1pdHRlci5lbWl0VG9Vc2VyKHVzZXJfaWQsIGRhdGEpO1xuICB9XG4gIGJyb2FkY2FzdFRvQXBwU3Vic2NyaWJlcnMoYXBwX2lkLCBkYXRhX3R5cGUsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzb2NrZXRzZW1pdHRlci5icm9hZGNhc3RUb0FwcFN1YnNjcmliZXJzKGFwcF9pZCwgZGF0YV90eXBlLCBkYXRhKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqIElOVEVSUFJJVEFURSAqKioqKioqKioqKioqKioqKioqL1xuXG4gIGdldEludGVycHJldGF0aW9uKHZhbHVlLCBmaWVsZCwgZGF0YVR5cGUsIHNvdXJjZSwgaXRlbUlkLCBhcHBJZCwgY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnByaXRhdGUuZ2V0SW50ZXJwcmV0YXRpb24odmFsdWUsIGZpZWxkLCBkYXRhVHlwZSwgc291cmNlLCBpdGVtSWQsIGFwcElkLCBjb250YWluZXJJZCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKiBHRVQgSU5URVJQUkVUQVRJT04gQlkgSUQgKioqKioqKioqKioqKioqKioqKi9cblxuICBnZXRJbnRlcnByZXRhdGlvbkJ5SWQoYXBwSWQsIGl0ZW1JZCwgZmllbGRJZCwgaW50ZXJwcmV0YXRpb25JZCwgdmFsdWUsIGZpZWxkKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJwcml0YXRlLmdldEludGVycHJldGF0aW9uQnlJZChhcHBJZCwgaXRlbUlkLCBmaWVsZElkLCBpbnRlcnByZXRhdGlvbklkLCB2YWx1ZSwgZmllbGQpO1xuICB9XG5cbiAgLy89PT09PT09PT09PT0gRklMVEVSID09PT09PT09PT0vL1xuICBmaWx0ZXIoaXRlbXMsIGZpbHRlcl9saXN0KSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5maWx0ZXIoaXRlbXMsIGZpbHRlcl9saXN0KTtcbiAgfVxuXG4gIC8vPT09PT09PT09PT09IE1FUkdFIEZJTFRFUlMgPT09PT09PT09PS8vXG4gIG1lcmdlRmlsdGVycyhzb3VyY2UsIGRlc3RpbmF0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5tZXJnZUZpbHRlcnMoc291cmNlLCBkZXN0aW5hdGlvbik7XG4gIH1cblxuICAvLz09PT09PT09PT09PSBHUk9VUCA9PT09PT09PT09Ly9cbiAgZ3JvdXAoZmllbGRHcm91cCwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsLmdyb3VwKGZpZWxkR3JvdXAsIGl0ZW1zKTtcbiAgfVxuXG4gIC8vPT09PT09PT09PT09IEdFVCBGSUxURVJFRCBJVEVNUyA9PT09PT09PT09Ly9cbiAgLy9pdCByZXR1cm5zIGl0ZW1zIHdpdGggYXBwbHllZCBmaWx0ZXJcbiAgZ2V0RmlsdGVyZWRJdGVtcyhpdGVtcywgZmlsdGVyc19saXN0LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy51dGlsLmdldEZpbHRlcmVkSXRlbXMoaXRlbXMsIGZpbHRlcnNfbGlzdCwgb3B0aW9ucy5lbGVtZW50X2FwcF9pZCwgb3B0aW9ucy5hcHBfaWQsIG9wdGlvbnMuaXRlbV9pZCwgb3B0aW9ucy5maWVsZF9ncm91cCwgb3B0aW9ucy5zZWFyY2gsIG9wdGlvbnMuc2VhcmNoX3BhcmFtcyk7XG4gIH1cbiAgc29ydEl0ZW1zKGl0ZW1zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5zb3J0SXRlbXMoaXRlbXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy9cbiAgLy9oZXJlXG4gIHRyaWdnZXJBcHBDaGFuZ2UoaWQsIHByZXZWZXJzaW9uLCBuZXdWZXJzaW9uKSB7XG4gICAgdGhpcy5pdGVtUHJvY2Vzc29yLmhhbmRsZUl0ZW1zQ2hhbmdlKGlkLCBwcmV2VmVyc2lvbiwgbmV3VmVyc2lvbik7XG4gICAgdGhpcy5hcHBQcm9jZXNzb3IuaGFuZGxlQXBwQ2hhbmdlKGlkLCBwcmV2VmVyc2lvbiwgbmV3VmVyc2lvbik7XG4gIH1cblxuICAvL1xuICAvL1RPRE8gaGFuZGxlQXBwQ2hhbmdlXG4gIHRyaWdnZXJJZW1zQ2hhbmdlKGlkLCBjb21wYXJlUmVzKSB7XG4gICAgdGhpcy5pdGVtUHJvY2Vzc29yLnRyaWdnZXJJdGVtc0NoYW5nZShpZCwgY29tcGFyZVJlcyk7XG4gIH1cbiAganNvblRvSXRlbXMoanNvbiwgbWFwKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5qc29uVG9JdGVtcyhqc29uLCBtYXApO1xuICB9XG4gIGdldERhdGUocXVlcnlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsLmdldERhdGUocXVlcnlLZXkpO1xuICB9XG4gIHBvcHVsYXRlV2l0aERhdGUoaXRlbXMsIG1vZGVsKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5wb3B1bGF0ZVdpdGhEYXRlKGl0ZW1zLCBtb2RlbCk7XG4gIH1cbiAgY2hlY2tSZWN1cnJpbmdEYXRlKGRhdGUsIG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLnV0aWwuY2hlY2tSZWN1cnJpbmdEYXRlKGRhdGUsIG9wdGlvbik7XG4gIH1cbiAgcG9wdWxhdGVJdGVtcyhpdGVtcywgbW9kZWwsIGtlZXBfZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnV0aWwucG9wdWxhdGVJdGVtcyhpdGVtcywgbW9kZWwsIGtlZXBfZGF0YSk7XG4gIH1cbiAgcG9wdWxhdGVXaXRoSXRlbVJlZihzb3VyY2VJdGVtc1JlZiwgc3JjRmllbGRJZFRvQ29tcGFyZSwgZGVzdGluYXRpb25JdGVtcywgZGVzdEZpZWxkSWRUb0NvbXBhcmUsIGRlc3RGaWVsZEZvclJlZiwgYXBwX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5wb3B1bGF0ZVdpdGhJdGVtUmVmKHNvdXJjZUl0ZW1zUmVmLCBzcmNGaWVsZElkVG9Db21wYXJlLCBkZXN0aW5hdGlvbkl0ZW1zLCBkZXN0RmllbGRJZFRvQ29tcGFyZSwgZGVzdEZpZWxkRm9yUmVmLCBhcHBfaWQpO1xuICB9XG4gIGNvbXBhcmVJdGVtcyhzb3VyY2VJdGVtcywgZGVzdGluYXRpb25JdGVtcywgZmllbGRUb0NvbXBhcmUpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsLmNvbXBhcmVJdGVtcyhzb3VyY2VJdGVtcywgZGVzdGluYXRpb25JdGVtcywgZmllbGRUb0NvbXBhcmUpO1xuICB9XG4gIG1lcmdlSXRlbXMoc291cmNlSXRlbXMsIGRlc3RpbmF0aW9uSXRlbXMsIG1lcmdlQnlGaWVsZElkKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5tZXJnZUl0ZW1zKHNvdXJjZUl0ZW1zLCBkZXN0aW5hdGlvbkl0ZW1zLCBtZXJnZUJ5RmllbGRJZCk7XG4gIH1cbiAgbWVyZ2VPYmplY3RzKHNvdXJjZU9iamVjdCwgZGVzdGluYXRpb25PYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsLm1lcmdlT2JqZWN0cyhzb3VyY2VPYmplY3QsIGRlc3RpbmF0aW9uT2JqZWN0KTtcbiAgfVxuICBtYWtlTmVzdGVkTGlzdChhcnIsIGlkLCBwYXJlbnRfaWQsIGNoaWxkcmVuX3Byb3BlcnR5LCBwcmlvcml0eV9wcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLnV0aWwubWFrZU5lc3RlZExpc3QoYXJyLCBpZCwgcGFyZW50X2lkLCBjaGlsZHJlbl9wcm9wZXJ0eSwgcHJpb3JpdHlfcHJvcGVydHkpO1xuICB9XG4gIGpzb25Db25zdHJ1Y3RvcihzY2hlbWUsIGl0ZW1zLCB2YXJpYWJsZXMsIGFwcElkKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbC5qc29uQ29uc3RydWN0b3Ioc2NoZW1lLCBpdGVtcywgdmFyaWFibGVzLCBhcHBJZCk7XG4gIH1cblxuICAvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQVBQIFBST0NFU1NPUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgZ2V0QXBwc0xpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwUHJvY2Vzc29yLmdldEFwcHNMaXN0KCk7XG4gIH1cbiAgZ2V0QXBwSW5mbyhhcHBfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBQcm9jZXNzb3IuZ2V0QXBwSW5mbyhhcHBfaWQpO1xuICB9XG4gIGRlbGV0ZUFwcChhcHBfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBQcm9jZXNzb3IuZGVsZXRlQXBwKGFwcF9pZCk7XG4gIH1cbiAgZ2V0QXBwKGFwcF9pZCkge1xuICAgIHJldHVybiB0aGlzLmFwcFByb2Nlc3Nvci5nZXRBcHAoYXBwX2lkKTtcbiAgfVxuICB1cGRhdGVBcHAoYXBwKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwUHJvY2Vzc29yLnVwZGF0ZUFwcChhcHApO1xuICB9XG4gIHVwZGF0ZUFwcEluZm8oYXBwSW5mbykge1xuICAgIHJldHVybiB0aGlzLmFwcFByb2Nlc3Nvci51cGRhdGVBcHBJbmZvKGFwcEluZm8pO1xuICB9XG4gIGNyZWF0ZU5ld0FwcChhcHApIHtcbiAgICByZXR1cm4gdGhpcy5hcHBQcm9jZXNzb3IuY3JlYXRlTmV3QXBwKGFwcCk7XG4gIH1cbiAgZ2V0SXRlbXMoYXBwX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVByb2Nlc3Nvci5nZXRJdGVtcyhhcHBfaWQpO1xuICB9XG4gIGFzeW5jIGdldEl0ZW0oYXBwX2lkLCBpdGVtX2lkKSB7XG4gICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmdldEl0ZW1zKGFwcF9pZCk7XG4gICAgaWYgKGl0ZW1zKSB7XG4gICAgICByZXR1cm4gaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uaXRlbV9pZCA9PSBpdGVtX2lkKTtcbiAgICB9XG4gIH1cbiAgYWRkTmV3SXRlbXMoYXBwX2lkLCBpdGVtc0xpc3QpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtUHJvY2Vzc29yLmFkZE5ld0l0ZW1zKGFwcF9pZCwgaXRlbXNMaXN0KTtcbiAgfVxuICB1cGRhdGVJdGVtcyhhcHBfaWQsIGl0ZW1zTGlzdCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1Qcm9jZXNzb3IudXBkYXRlSXRlbXMoYXBwX2lkLCBpdGVtc0xpc3QpO1xuICB9XG4gIGRlbGV0ZUl0ZW1zKGFwcF9pZCwgaXRlbXNJZHMpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtUHJvY2Vzc29yLmRlbGV0ZUl0ZW1zKGFwcF9pZCwgaXRlbXNJZHMpO1xuICB9XG4gIGdldEZpZWxkKGFwcF9pZCwgZmllbGRfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFByb2Nlc3Nvci5nZXRGaWVsZChhcHBfaWQsIGZpZWxkX2lkKTtcbiAgfVxuICBnZXRGaWVsZElkQnlOYW1lU3BhY2UoYXBwX2lkLCBuYW1lX3NwYWNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRQcm9jZXNzb3IuZ2V0RmllbGRJZEJ5TmFtZVNwYWNlKGFwcF9pZCwgbmFtZV9zcGFjZSk7XG4gIH1cbiAgZ2V0RmllbGRNb2RlbHMoYXBwX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRQcm9jZXNzb3IuZ2V0RmllbGRNb2RlbHMoYXBwX2lkKTtcbiAgfVxuICB1cGRhdGVGaWVsZChhcHBfaWQsIGZpZWxkTW9kZWwpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFByb2Nlc3Nvci51cGRhdGVGaWVsZChhcHBfaWQsIGZpZWxkTW9kZWwpO1xuICB9XG4gIGRlbGV0ZUZpZWxkKGFwcF9pZCwgZmllbGRfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFByb2Nlc3Nvci5kZWxldGVGaWVsZChhcHBfaWQsIGZpZWxkX2lkKTtcbiAgfVxuICBnZXRGaWVsZFZhbHVlKGFwcF9pZCwgaXRlbV9pZCwgZmllbGRfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFByb2Nlc3Nvci5nZXRGaWVsZFZhbHVlKGFwcF9pZCwgaXRlbV9pZCwgZmllbGRfaWQpO1xuICB9XG4gIHNldEZpZWxkVmFsdWUoYXBwX2lkLCBpdGVtX2lkLCBmaWVsZF9pZCwgZmllbGRfdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFByb2Nlc3Nvci5zZXRGaWVsZFZhbHVlKGFwcF9pZCwgaXRlbV9pZCwgZmllbGRfaWQsIGZpZWxkX3ZhbHVlKTtcbiAgfVxuICBnZXRGaWxlKGFwcF9pZCwgZmlsZV9pZCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLmdldEZpbGUoYXBwX2lkLCBmaWxlX2lkKTtcbiAgfVxuICBnZXRGaWxlcyhhcHBfaWQsIGZpbGVzSWQpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlTWFuYWdlci5nZXRGaWxlcyhhcHBfaWQsIGZpbGVzSWQpO1xuICB9XG4gIHVwbG9hZEZpbGUoZmlsZURhdGEsIGFwcF9pZCwgaXRlbV9pZCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLnVwbG9hZEZpbGUoZmlsZURhdGEsIGFwcF9pZCwgaXRlbV9pZCk7XG4gIH1cbiAgdXBsb2FkRmlsZUZyb21TdHJpbmcoc291cmNlLCBmaWxlX25hbWUsIGFwcF9pZCwgaXRlbV9pZCwgZXh0ZW5zaW9uLCBmb3JtYXQsIGVsZW1lbnRfaWQpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlTWFuYWdlci51cGxvYWRGaWxlRnJvbVN0cmluZyhzb3VyY2UsIGZpbGVfbmFtZSwgYXBwX2lkLCBpdGVtX2lkLCBleHRlbnNpb24sIGZvcm1hdCwgZWxlbWVudF9pZCk7XG4gIH1cbiAgdXBkYXRlRmlsZUZyb21TdHJpbmcoZGF0YSwgZmlsZV9pZCwgZmlsZV9uYW1lLCBleHRlbnNpb24sIGZvcm1hdCwgYWx0LCB0aXRsZSkge1xuICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLnVwZGF0ZUZpbGVGcm9tU3RyaW5nKGRhdGEsIGZpbGVfaWQsIGZpbGVfbmFtZSwgZXh0ZW5zaW9uLCBmb3JtYXQsIGFsdCwgdGl0bGUpO1xuICB9XG4gIGRlbGV0ZUZpbGUoYXBwX2lkLCBpZCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLmRlbGV0ZUZpbGUoYXBwX2lkLCBpZCk7XG4gIH1cbiAgZHVwbGljYXRlRmlsZShmaWxlcykge1xuICAgIHJldHVybiB0aGlzLmZpbGVNYW5hZ2VyLmR1cGxpY2F0ZUZpbGUoZmlsZXMpO1xuICB9XG4gIGRvd25sb2FkRmlsZUZyb21TdHJpbmcoYXBwX2lkLCBmaWxlX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZU1hbmFnZXIuZG93bmxvYWRGaWxlRnJvbVN0cmluZyhhcHBfaWQsIGZpbGVfaWQpO1xuICB9XG4gIGNyZWF0ZURvY3VtZW50KGRvY3VtZW50T2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRNYW5hZ2VyLmNyZWF0ZURvY3VtZW50KGRvY3VtZW50T2JqZWN0KTtcbiAgfVxuICBnZXREb2N1bWVudChkb2N1bWVudEFkZHJlc3MpIHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudE1hbmFnZXIuZ2V0RG9jdW1lbnQoZG9jdW1lbnRBZGRyZXNzKTtcbiAgfVxuICBnZXREb2N1bWVudHMoZG9jdW1lbnRBZGRyZXNzKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRNYW5hZ2VyLmdldERvY3VtZW50cyhkb2N1bWVudEFkZHJlc3MpO1xuICB9XG4gIGRlbGV0ZURvY3VtZW50KGRvY3VtZW50QWRkcmVzcykge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50TWFuYWdlci5kZWxldGVEb2N1bWVudChkb2N1bWVudEFkZHJlc3MpO1xuICB9XG4gIGxvZ2luKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmxvZ2luKGRhdGEpO1xuICB9XG4gIGxvZ2luV2l0aFRva2VuKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5sb2dpbldpdGhUb2tlbih0b2tlbik7XG4gIH1cbiAgbG9nb3V0KHRva2VuKSB7XG4gICAgdGhpcy5hcHBQcm9jZXNzb3IuY2xlYXJBcHBQcm9jZXNzb3IoKTtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmxvZ291dCh0b2tlbik7XG4gIH1cbiAgc2lnbnVwKHVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnNpZ251cCh1c2VyKTtcbiAgfVxuICBnZXRVc2Vyc0xpc3Qoa2V5d29yZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VXNlcnNMaXN0KGtleXdvcmQpO1xuICB9XG4gIHVwZGF0ZVRva2VuKGF1dGhfa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC51cGRhdGVUb2tlbihhdXRoX2tleSk7XG4gIH1cbiAgYXZhdGFyVXBsb2FkQXBpKGltYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5hdmF0YXJVcGxvYWRBcGkoaW1hZ2UpO1xuICB9XG4gIGdldFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5nZXRWZXJzaW9uKCk7XG4gIH1cbiAgZ2V0VXNlckJ5SWQodXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5nZXRVc2VyQnlJZCh1c2VySWQpO1xuICB9XG4gIGdldFRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VG9rZW4oKTtcbiAgfVxuICB1cGRhdGVVc2VyKHVzZXJEYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC51cGRhdGVVc2VyKHVzZXJEYXRhKTtcbiAgfVxuICB1cGRhdGVBdmF0YXIoaW1hZ2VEYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC51cGRhdGVBdmF0YXIoaW1hZ2VEYXRhKTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vR1VESFVCL0RhdGFTZXJ2aWNlL0luZGV4ZWREQi9hcHBSZXF1ZXN0V29ya2VyLmpzXG5cblxuXG5cblxuXG5cbmxldCBhcHBSZXF1ZXN0V29ya2VyX2d1ZGh1YiA9IHt9O1xubGV0IGFwcERhdGFTZXJ2aWNlID0ge307XG5sZXQgY2h1bmtEYXRhU2VydmljZSA9IHt9O1xuXG4vL1RPRE8gYWxzbyBDaHVua0RhdGFTZXJ2aWNlICEhISEhISEhISEhISEhISEhISEhISEhXG5cbnNlbGYub25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24gKGUpIHtcbiAgaWYgKGUuZGF0YS50eXBlID09PSAnaW5pdCcpIHtcbiAgICBlLmRhdGEuZ3VkaHViU2VyaWFsaXplZC5vcHRpb25zLmluaXRXZWJzb2NrZXQgPSBmYWxzZTtcbiAgICBhcHBSZXF1ZXN0V29ya2VyX2d1ZGh1YiA9IG5ldyBHdWRIdWIoZS5kYXRhLmd1ZGh1YlNlcmlhbGl6ZWQuYXV0aEtleSwgZS5kYXRhLmd1ZGh1YlNlcmlhbGl6ZWQub3B0aW9ucyk7XG4gICAgYXBwRGF0YVNlcnZpY2UgPSBuZXcgSW5kZXhlZERCQXBwU2VydmljZUZvcldvcmtlcihhcHBSZXF1ZXN0V29ya2VyX2d1ZGh1Yi5yZXEsIGFwcHNDb25mLCBhcHBSZXF1ZXN0V29ya2VyX2d1ZGh1Yik7XG4gICAgY2h1bmtEYXRhU2VydmljZSA9IG5ldyBJbmRleGVkREJDaHVua1NlcnZpY2UoYXBwUmVxdWVzdFdvcmtlcl9ndWRodWIucmVxLCBjaHVua3NNZXJnZUNvbmYsIGFwcFJlcXVlc3RXb3JrZXJfZ3VkaHViKTtcbiAgfVxuICBpZiAoZS5kYXRhLnR5cGUgPT09ICdwcm9jZXNzRGF0YScpIHtcbiAgICAvL3RvZG8gY2FjaGVkIGNvdWxkIG5vdCBleGlzdCAhISEhISEhISEhISEhISEhISEhXG5cbiAgICBsZXQgY2FjaGVkID0gYXdhaXQgYXBwRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkKGUuZGF0YS5pZCk7IC8vIG1lcmdlID9cblxuICAgIGxldCBjYWNoZWRDaHVua3NMaXN0ID0gY2FjaGVkLmNodW5rcztcbiAgICBsZXQgbmV4dFZlcnNpb24gPSBhd2FpdCBhcHBEYXRhU2VydmljZS5nZXRBcHBXaXRob3V0UHJvY2Vzc2luZyhlLmRhdGEuaWQpO1xuICAgIGxldCBpc01lcmdlZENodW5rVXBkYXRlZCA9IHRydWU7XG4gICAgaWYgKGNhY2hlZENodW5rc0xpc3QubGVuZ3RoICE9IG5leHRWZXJzaW9uLmNodW5rcy5sZW5ndGgpIGlzTWVyZ2VkQ2h1bmtVcGRhdGVkID0gZmFsc2U7XG5cbiAgICAvL1RPRE8gaGVyZSBvbGQgY2h1bmtzIHNob3VsZCBiZSBleGFjdGx5IHdpdGggaWRzIHRoYXQgY2FtZSBmcm9tIGFwcCBnZXQgcmVxdWVzdFxuICAgIGlmIChuZXh0VmVyc2lvbi5jaHVua3Muc29tZShlbnRyeSA9PiAhY2FjaGVkQ2h1bmtzTGlzdC5pbmNsdWRlcyhlbnRyeSkpKSBpc01lcmdlZENodW5rVXBkYXRlZCA9IGZhbHNlO1xuICAgIGlmICghaXNNZXJnZWRDaHVua1VwZGF0ZWQpIHtcbiAgICAgIC8vIFRPRE8gdGhpcyBpcyByZXBldGl0aXZlIG9wZXJhdGlvbiBmb3IgZ2V0Q2FjaGVkLCBtYXliZSBwdXQgYWxsIGNvZGUgaW4gcHJvY2VzcyBvciBpbiBnZXRDYWNoZWRcblxuICAgICAgbGV0IHJlcyA9IGF3YWl0IGNodW5rRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkTWVyZ2VkQ2h1bmsoZS5kYXRhLmlkLCBjYWNoZWQuY2h1bmtzKTtcblxuICAgICAgLy8gaWYgKCFyZXMpIHJlcyA9IFtdO1xuXG4gICAgICAvLyAvLyBUT0RPIGNoZWNrIHRoYXQgcmVzIGFsd2F5cyBleGlzdHNcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICBjYWNoZWQuaXRlbXNfbGlzdCA9IGF3YWl0IGFwcFJlcXVlc3RXb3JrZXJfZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW1xuICAgICAgICAvLyBjYWNoZWRBcHAsXG4gICAgICAgIHJlcywgY2FjaGVkXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZW50RGF0YS5pdGVtc19saXN0ID0gYXdhaXQgdGhpcy5ndWRodWIudXRpbC5tZXJnZUNodW5rcyhbXG4gICAgICAgIC8vICAgICBjYWNoZWRBcHAsXG4gICAgICAgIC8vICAgICBzZW50RGF0YSxcbiAgICAgICAgLy8gXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5leHRWZXJzaW9uID0gYXdhaXQgYXBwRGF0YVNlcnZpY2UuZ2V0QXBwV2l0aFNwZWNpZmljQ2h1bmtzTGlzdChlLmRhdGEuaWQsIG5ld0NodW5rc0xpc3QpOyAvL3RvZG8gY2hlY2sgdGhhdCBoZXJlIG1vc3QgcmVjZW50IGFsd2F5c1xuICAgICAgbmV4dFZlcnNpb24gPSBhd2FpdCBhcHBEYXRhU2VydmljZS5nZXRBcHAoZS5kYXRhLmlkKTsgLy90b2RvIGNoZWNrIHRoYXQgaGVyZSBtb3N0IHJlY2VudCBhbHdheXNcblxuICAgICAgLy9UT0RPINGC0YPRgiDQtNC+0YHRgtCw0YLQvtGH0L3QviDRgdGA0LDQstC90LjRgtGMINC90L7QstGL0LUg0YfQsNC90LrQuCvQsNC/0L8g0Lgg0LfQsNC60LXRiNC40YDQvtCy0LDQvdC90YvQuSDQsNC/0L8sINGC0L7Qs9C00LAg0LHRg9C00LXRgiDRgdCz0LXQvdC10YDQuNGA0L7QstCw0L3QsCDQstGB0Y8g0LjQvdGE0LAg0L4g0L3QvtCy0YvRhSDQtNCw0L3QvdGL0YVcblxuICAgICAgLy8gcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGxldCBjb21wYXJpc29uID0gZ3VkaHViLmNvbXBhcmVJdGVtcyhjYWNoZWQuaXRlbXNfbGlzdCwgbmV3VmVyc2lvbi5pdGVtc19saXN0KTtcbiAgICBsZXQgY29tcGFyaXNvbiA9IGFwcFJlcXVlc3RXb3JrZXJfZ3VkaHViLmNvbXBhcmVJdGVtcyhuZXh0VmVyc2lvbi5pdGVtc19saXN0LCBjYWNoZWQuaXRlbXNfbGlzdCk7XG5cbiAgICAvLyBhc3luYyBoYW5kbGVBcHBDaGFuZ2UoaWQsIHByZXZWZXJzaW9uLCBuZXh0VmVyc2lvbikge1xuICAgIGxldCBmbGFnMSA9IGFwcFJlcXVlc3RXb3JrZXJfZ3VkaHViLnV0aWwuYXJlVmlld0xpc3RzRXF1YWwoY2FjaGVkLnZpZXdzX2xpc3QsIG5leHRWZXJzaW9uLnZpZXdzX2xpc3QpO1xuICAgIGxldCBmbGFnMiA9IGFwcFJlcXVlc3RXb3JrZXJfZ3VkaHViLnV0aWwuYXJlRmllbGRMaXN0c0VxdWFsKGNhY2hlZC5maWVsZF9saXN0LCBuZXh0VmVyc2lvbi5maWVsZF9saXN0KTtcblxuICAgIC8vIGlmIChcbiAgICAvLyAgIHJlczEgfHxcbiAgICAvLyAgIHJlczJcbiAgICAvLyApIHtcbiAgICAvLyAgIHRoaXMudXBkYXRlQXBwRmllbGRzQW5kVmlld3Moe2lkLCB2aWV3c19saXN0OiBuZXh0VmVyc2lvbi52aWV3c19saXN0LCBmaWVsZF9saXN0OiBuZXh0VmVyc2lvbi5maWVsZF9saXN0fSk7XG4gICAgLy8gfVxuICAgIC8vIH1cblxuICAgIHRoaXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgaWQ6IGUuZGF0YS5pZCxcbiAgICAgIGNvbXBhcmVSZXM6IGNvbXBhcmlzb24sXG4gICAgICBuZXdWZXJzaW9uOiBuZXh0VmVyc2lvbixcbiAgICAgIHR5cGU6IGUuZGF0YS50eXBlLFxuICAgICAgdmlld0xpc3RDaGFuZ2VkOiBmbGFnMSxcbiAgICAgIGZpZWxkTGlzdENoYW5nZWQ6IGZsYWcyXG4gICAgfSk7XG5cbiAgICAvLy8gdG9kbyBwcm9jZXNzIGRhdGEgbWVyZ2UgYW5kIHRoZW4gY2FsbCBtZXJnZSBhbmQgY29tcGFyZSBhbmQgdGhlbiByZXR1cm4gZnJvbSBoZXJlIGZvciBleGFtcGxlIGV2ZW50IHRvIHVwZGF0ZVxuXG4gICAgLy8gYWxzbyBkb250IGZvcmdldCB0aGF0IG1haW4gdGhyZWFkIGFsc28gdXNlcyBBcHBEYXRhU2VydmljZSAhISEhISEhISEhISEhISEhISEgbWFrZSB0ZW1wb3JhcmlsZSBhIHNlcGFyYXRlIGNsYXNzIGZvciBpdCBtYXliZVxuICB9XG5cbiAgaWYgKGUuZGF0YS50eXBlID09PSAncmVxdWVzdEFwcCcpIHtcbiAgICAvLyAvL3RvZG8gY2FjaGVkIGNvdWxkIG5vdCBleGlzdCAhISEhISEhISEhISEhISEhISEhXG5cbiAgICAvLyBsZXQgY2FjaGVkID0gYXdhaXQgYXBwRGF0YVNlcnZpY2UuZ2V0Q2FjaGVkKGUuZGF0YS5pZCk7IC8vIG1lcmdlID9cblxuICAgIC8vIGxldCBjYWNoZWRDaHVua3NMaXN0ID0gY2FjaGVkLmNodW5rcztcblxuICAgIC8vIGxldCBuZXh0VmVyc2lvbiA9IGF3YWl0IGFwcERhdGFTZXJ2aWNlLmdldEFwcFdpdGhvdXRQcm9jZXNzaW5nKGUuZGF0YS5pZCk7XG5cbiAgICAvLyBsZXQgaXNNZXJnZWRDaHVua1VwZGF0ZWQgPSB0cnVlO1xuXG4gICAgLy8gaWYgKFxuICAgIC8vICAgY2FjaGVkQ2h1bmtzTGlzdC5sZW5ndGggIT0gbmV4dFZlcnNpb24uY2h1bmtzLmxlbmd0aFxuICAgIC8vICkgaXNNZXJnZWRDaHVua1VwZGF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIC8vVE9ETyBoZXJlIG9sZCBjaHVua3Mgc2hvdWxkIGJlIGV4YWN0bHkgd2l0aCBpZHMgdGhhdCBjYW1lIGZyb20gYXBwIGdldCByZXF1ZXN0XG4gICAgLy8gaWYgKFxuICAgIC8vICAgbmV4dFZlcnNpb24uY2h1bmtzLnNvbWUoZW50cnkgPT4gIWNhY2hlZENodW5rc0xpc3QuaW5jbHVkZXMoZW50cnkpKVxuICAgIC8vICkgaXNNZXJnZWRDaHVua1VwZGF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIGlmIChcbiAgICAvLyAgICFpc01lcmdlZENodW5rVXBkYXRlZFxuICAgIC8vICkge1xuXG4gICAgLy8gICAvLyBUT0RPIHRoaXMgaXMgcmVwZXRpdGl2ZSBvcGVyYXRpb24gZm9yIGdldENhY2hlZCwgbWF5YmUgcHV0IGFsbCBjb2RlIGluIHByb2Nlc3Mgb3IgaW4gZ2V0Q2FjaGVkXG5cbiAgICAvLyAgIGxldCByZXMgPSBhd2FpdCBjaHVua0RhdGFTZXJ2aWNlLmdldENhY2hlZE1lcmdlZENodW5rKGUuZGF0YS5pZCwgY2FjaGVkLmNodW5rcyk7XG5cbiAgICAvLyAgIC8vIGlmICghcmVzKSByZXMgPSBbXTtcblxuICAgIC8vICAgLy8gLy8gVE9ETyBjaGVjayB0aGF0IHJlcyBhbHdheXMgZXhpc3RzXG5cbiAgICAvLyAgIGlmIChcbiAgICAvLyAgICAgICByZXNcbiAgICAvLyAgICkge1xuICAgIC8vICAgICAgIGNhY2hlZC5pdGVtc19saXN0ID0gYXdhaXQgZ3VkaHViLnV0aWwubWVyZ2VDaHVua3MoW1xuICAgIC8vICAgICAgICAgICAvLyBjYWNoZWRBcHAsXG4gICAgLy8gICAgICAgICAgIHJlcyxcbiAgICAvLyAgICAgICAgICAgY2FjaGVkLFxuICAgIC8vICAgICAgIF0pO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyBzZW50RGF0YS5pdGVtc19saXN0ID0gYXdhaXQgdGhpcy5ndWRodWIudXRpbC5tZXJnZUNodW5rcyhbXG4gICAgLy8gICAgICAgLy8gICAgIGNhY2hlZEFwcCxcbiAgICAvLyAgICAgICAvLyAgICAgc2VudERhdGEsXG4gICAgLy8gICAgICAgLy8gXSk7XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIC8vIG5leHRWZXJzaW9uID0gYXdhaXQgYXBwRGF0YVNlcnZpY2UuZ2V0QXBwV2l0aFNwZWNpZmljQ2h1bmtzTGlzdChlLmRhdGEuaWQsIG5ld0NodW5rc0xpc3QpOyAvL3RvZG8gY2hlY2sgdGhhdCBoZXJlIG1vc3QgcmVjZW50IGFsd2F5c1xuICAgIC8vICAgbmV4dFZlcnNpb24gPSBhd2FpdCBhcHBEYXRhU2VydmljZS5nZXRBcHAoZS5kYXRhLmlkKTsgLy90b2RvIGNoZWNrIHRoYXQgaGVyZSBtb3N0IHJlY2VudCBhbHdheXNcblxuICAgIC8vICAgLy9UT0RPINGC0YPRgiDQtNC+0YHRgtCw0YLQvtGH0L3QviDRgdGA0LDQstC90LjRgtGMINC90L7QstGL0LUg0YfQsNC90LrQuCvQsNC/0L8g0Lgg0LfQsNC60LXRiNC40YDQvtCy0LDQvdC90YvQuSDQsNC/0L8sINGC0L7Qs9C00LAg0LHRg9C00LXRgiDRgdCz0LXQvdC10YDQuNGA0L7QstCw0L3QsCDQstGB0Y8g0LjQvdGE0LAg0L4g0L3QvtCy0YvRhSDQtNCw0L3QvdGL0YVcblxuICAgIC8vICAgLy8gcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIGxldCBkYXRhID0gYXdhaXQgYXBwRGF0YVNlcnZpY2UuZ2V0QXBwKGUuZGF0YS5pZCk7IC8vdG9kbyBjaGVjayBwcm9jZXNzIHJlcXVlc3QgbWV0aG9kIHNlZW1zIHRoZXJlIGkgcmV0dXJuIGNhaGNlZCB2ZXJzaW9uIG5vdCBtb3N0IHJlY2VudCBkYXRhIGZyb20gc2VydmVyXG5cbiAgICB0aGlzLnBvc3RNZXNzYWdlKHtcbiAgICAgIGlkOiBlLmRhdGEuaWQsXG4gICAgICB0eXBlOiBlLmRhdGEudHlwZSxcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRoaXMuYXBwUmVxdWVzdEFuZFByb2Nlc3NXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiAncmVxdWVzdEFwcCcsIGlkOiBpZCB9KTtcbn07XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL0dVREhVQi9EYXRhU2VydmljZS9JbmRleGVkREIvYXBwUmVxdWVzdFdvcmtlci5qc18rXzY4X21vZHVsZXM/Iik7fSw5NjA6KF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgiLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgWjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gY3JlYXRlQW5ndWxhck1vZHVsZUluc3RhbmNlKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgYXhpb3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTY2OSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2NvbnN0c19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzgpO1xuXG5cblxuLyoqKioqKioqKioqKioqKiBGQUtFIEFOR1VMQVIgJFEgKioqKioqKioqKioqKioqL1xuLy8gSXQncyBuZWVkZWQgd2hlbiB3ZSBpbXBvcnQgYW5ndWxhciBjb2RlLlxuXG5sZXQgJHEgPSB7XG4gIHdoZW46IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgcmVzb2x2ZShhKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqKioqKioqKioqKioqKiBGQUtFIEFOR1VMQVIgKioqKioqKioqKioqKioqL1xuLy8gSXQncyBuZWVkZWQgd2hlbiB3ZSBpbXBvcnQgYW5ndWxhciBjb2RlLlxuXG5sZXQgZmFjdG9yeVJldHVybnMgPSB7fTtcbmxldCBhbmd1bGFyID0ge1xuICBtb2R1bGUoKSB7XG4gICAgcmV0dXJuIGFuZ3VsYXI7XG4gIH0sXG4gIGRpcmVjdGl2ZSgpIHtcbiAgICByZXR1cm4gYW5ndWxhcjtcbiAgfSxcbiAgZmFjdG9yeShuYW1lLCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZmFjdG9yeVJldHVybnNbbmFtZV0gPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0oJHEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeVJldHVybnNbbmFtZV0gPSBhcmdzKCRxKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coJ0VycnJvciBpbiBkYXRhIHR5cGU6ICcsIG5hbWUpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gYW5ndWxhcjtcbiAgfSxcbiAgc2VydmljZSgpIHtcbiAgICByZXR1cm4gYW5ndWxhcjtcbiAgfSxcbiAgcnVuKCkge1xuICAgIHJldHVybiBhbmd1bGFyO1xuICB9LFxuICBmaWx0ZXIoKSB7XG4gICAgcmV0dXJuIGFuZ3VsYXI7XG4gIH0sXG4gIGNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGFuZ3VsYXI7XG4gIH0sXG4gIHZhbHVlKCkge1xuICAgIHJldHVybiBhbmd1bGFyO1xuICB9LFxuICBlbGVtZW50KCkge1xuICAgIHJldHVybiBhbmd1bGFyO1xuICB9LFxuICBpbmplY3RvcigpIHtcbiAgICByZXR1cm4gYW5ndWxhcjtcbiAgfSxcbiAgaW52b2tlKCkge1xuICAgIHJldHVybiBhbmd1bGFyO1xuICB9XG59O1xuXG4vKioqKioqKioqKioqKioqIENSRUFURSBJTlNUQU5DRSAqKioqKioqKioqKioqKiovXG4vLyBIZXJlIHdlIGFyZSBpbXBvcnRpbmcgbW9kdWxlcyB1c2luZyBkeW5hbWljIGltcG9ydC5cbi8vIEZvciBicm93c2VyOiBqdXN0IGRvIGR5bmFtaWMgaW1wb3J0IHdpdGggdXJsIGFzIHBhcmFtZXRlci5cbi8vIEluIG5vZGUgZW52aXJvbm1lbnQgd2UgY2FuJ3QgZHluYW1pY2FsbHkgaW1wb3J0IG1vZHVsZSBmcm9tIHVybCwgc28gd2UgZG93bmxvYWQgbW9kdWxlJ3MgY29kZSB2aWEgYXhpb3MgYW5kIHRyYW5zZm9ybSBpdCB0byBkYXRhIHVybC5cbi8vIFRoZW4gY3JlYXRpbmcgY2xhc3NlcyBmcm9tIGltcG9ydGVkIG1vZHVsZXMuXG4vLyBGaW5hbGx5LCBjcmVhdGluZyBpbnN0YW5jZSBvZiBtb2R1bGUsIHVzaW5nIGZ1bmN0aW9ucyBmcm9tIGltcG9ydGVkIGNsYXNzZXMuIElmIHdlIGluIGJyb3dzZXIgLSBhbHNvIHRha2VzIG1ldGhvZHMgZnJvbSBhbmd1bGFyJ3MgaW5qZWN0b3IuXG5cbi8qKiogVE9ETyAqKiovXG4vLyBOZWVkIHRvIG1ha2UgYW5ndWxhciBtb2R1bGVzIGluc3RhbmNlcyBjcmVhdGlvbiBzaW1pbGFyIHRvIHB1cmUganMgY2xhc3Nlcy5cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQW5ndWxhck1vZHVsZUluc3RhbmNlKGd1ZGh1YiwgbW9kdWxlX2lkLCBtb2R1bGVfdXJsLCBhbmd1bGFySW5qZWN0b3IsIG5vZGVXaW5kb3cpIHtcbiAgdHJ5IHtcbiAgICBsZXQgYW5ndWxhck1vZHVsZTtcbiAgICBsZXQgaW1wb3J0ZWRDbGFzcztcbiAgICBpZiAoX2NvbnN0c19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLyogLklTX0JST1dTRVJfTUFJTl9USFJFQUQgKi8gLlNSKSB7XG4gICAgICBpZiAod2luZG93LmFuZ3VsYXIpIHtcbiAgICAgICAgLy8gRG93bmxvYWQgbW9kdWxlIHdpdGggJG9jTGF6eUxvYWQgaWYgbW9kdWxlIG5vdCBpbiBpbmplY3RvciBhbHJlYWR5LlxuXG4gICAgICAgIGlmICghYW5ndWxhckluamVjdG9yLmhhcyhtb2R1bGVfaWQpKSB7XG4gICAgICAgICAgYXdhaXQgYW5ndWxhckluamVjdG9yLmdldCgnJG9jTGF6eUxvYWQnKS5sb2FkKG1vZHVsZV91cmwpO1xuICAgICAgICB9XG4gICAgICAgIGFuZ3VsYXJNb2R1bGUgPSBhd2FpdCBhbmd1bGFySW5qZWN0b3IuZ2V0KG1vZHVsZV9pZCk7XG5cbiAgICAgICAgLy8gVGhlbiwgZHluYW1pY2FsbHkgaW1wb3J0IG1vZHVsZXMgZnJvbSB1cmwuXG5cbiAgICAgICAgbGV0IG1vZHVsZSA9IGF3YWl0IGF4aW9zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZ2V0KG1vZHVsZV91cmwpO1xuICAgICAgICBtb2R1bGUgPSBtb2R1bGUuZGF0YTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmFsKG1vZHVsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRVJST1IgV0hJTEUgRVZBTCgpIElOIEdIQ09OU1RSVUNUT1IuIE1PRFVMRSBJRDogJHttb2R1bGVfaWR9YCk7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGltcG9ydGVkQ2xhc3MgPSBmYWN0b3J5UmV0dXJuc1ttb2R1bGVfaWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1vZHVsZSA9IGF3YWl0IGF4aW9zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZ2V0KG1vZHVsZV91cmwpO1xuICAgICAgICBtb2R1bGUgPSBtb2R1bGUuZGF0YTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmFsKG1vZHVsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciB3aGlsZSBpbXBvcnRpbmcgbW9kdWxlOiAke21vZHVsZV9pZH1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW9kdWxlcyBhbHdheXMgZXhwb3J0cyBjbGFzc2VzIGFzIGRlZmF1bHQsIHNvIHdlIGNyZWF0ZSBuZXcgY2xhc3MgaW5zdGFuY2UuXG5cbiAgICAgICAgaW1wb3J0ZWRDbGFzcyA9IGZhY3RvcnlSZXR1cm5zW21vZHVsZV9pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG5vZGVXaW5kb3csIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcGVydHldO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICBnbG9iYWxbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBub2RlJ3MgZ2xvYmFsIG9iamVjdCBkb24ndCBoYXZlIHdpbmRvdyBhbmQgaXQncyBtZXRob2RzIHlldCAtIHNldCBpdC5cbiAgICAgIGlmICghZ2xvYmFsLmhhc093blByb3BlcnR5KCd3aW5kb3cnKSkge1xuICAgICAgICBnbG9iYWwud2luZG93ID0gcHJveHk7XG4gICAgICAgIGdsb2JhbC5kb2N1bWVudCA9IG5vZGVXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgIGdsb2JhbC5FbGVtZW50ID0gbm9kZVdpbmRvdy5FbGVtZW50O1xuICAgICAgICBnbG9iYWwuQ2hhcmFjdGVyRGF0YSA9IG5vZGVXaW5kb3cuQ2hhcmFjdGVyRGF0YTtcbiAgICAgICAgZ2xvYmFsLnRoaXMgPSBwcm94eTtcbiAgICAgICAgZ2xvYmFsLnNlbGYgPSBwcm94eTtcbiAgICAgICAgZ2xvYmFsLkJsb2IgPSBub2RlV2luZG93LkJsb2I7XG4gICAgICAgIGdsb2JhbC5Ob2RlID0gbm9kZVdpbmRvdy5Ob2RlO1xuICAgICAgICBnbG9iYWwubmF2aWdhdG9yID0gbm9kZVdpbmRvdy5uYXZpZ2F0b3I7XG4gICAgICAgIGdsb2JhbC5IVE1MRWxlbWVudCA9IG5vZGVXaW5kb3cuSFRNTEVsZW1lbnQ7XG4gICAgICAgIGdsb2JhbC5YTUxIdHRwUmVxdWVzdCA9IG5vZGVXaW5kb3cuWE1MSHR0cFJlcXVlc3Q7XG4gICAgICAgIGdsb2JhbC5XZWJTb2NrZXQgPSBub2RlV2luZG93LldlYlNvY2tldDtcbiAgICAgICAgZ2xvYmFsLmNyeXB0byA9IG5vZGVXaW5kb3cuY3J5cHRvO1xuICAgICAgICBnbG9iYWwuRE9NUGFyc2VyID0gbm9kZVdpbmRvdy5ET01QYXJzZXI7XG4gICAgICAgIGdsb2JhbC5TeW1ib2wgPSBub2RlV2luZG93LlN5bWJvbDtcbiAgICAgICAgZ2xvYmFsLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCA9IGNvbW1hbmQgPT4ge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgZ2xvYmFsLmFuZ3VsYXIgPSBhbmd1bGFyO1xuICAgICAgfVxuXG4gICAgICAvLyBEb3dubG9hZGluZyBtb2R1bGUncyBjb2RlIGFuZCB0cmFuc2Zvcm0gaXQgdG8gZGF0YSB1cmwuXG5cbiAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGF4aW9zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZ2V0KG1vZHVsZV91cmwpO1xuICAgICAgbGV0IGNvZGUgPSByZXNwb25zZS5kYXRhO1xuICAgICAgbGV0IGVuY29kZWRDb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50KGNvZGUpO1xuICAgICAgZW5jb2RlZENvZGUgPSAnZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlZENvZGU7XG4gICAgICBsZXQgbW9kdWxlO1xuXG4gICAgICAvLyBUaGVuLCBkeW5hbWljYWxseSBpbXBvcnQgbW9kdWxlcyBmcm9tIGRhdGEgdXJsLlxuXG4gICAgICB0cnkge1xuICAgICAgICBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9lbmNvZGVkQ29kZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHdoaWxlIGltcG9ydGluZyBtb2R1bGU6ICR7bW9kdWxlX2lkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBNb2R1bGVzIGFsd2F5cyBleHBvcnRzIGNsYXNzZXMgYXMgZGVmYXVsdCwgc28gd2UgY3JlYXRlIG5ldyBjbGFzcyBpbnN0YW5jZS5cblxuICAgICAgaW1wb3J0ZWRDbGFzcyA9IG5ldyBtb2R1bGUuZGVmYXVsdCgpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgdHlwZTogbW9kdWxlX2lkLFxuICAgICAgLy8qKioqKioqKioqKioqKiogR0VUIFRFTVBMQVRFICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICBnZXRUZW1wbGF0ZTogZnVuY3Rpb24gKHJlZiwgY2hhbmdlRmllbGROYW1lLCBkaXNwbGF5RmllbGROYW1lLCBmaWVsZF9tb2RlbCwgYXBwSWQsIGl0ZW1JZCkge1xuICAgICAgICBsZXQgZGlzcGxheUZpZWxkTmFtZUNoZWNrZWQgPSBkaXNwbGF5RmllbGROYW1lID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICByZXR1cm4gaW1wb3J0ZWRDbGFzcy5nZXRUZW1wbGF0ZShyZWYsIGNoYW5nZUZpZWxkTmFtZSwgZGlzcGxheUZpZWxkTmFtZUNoZWNrZWQsIGZpZWxkX21vZGVsLCBhcHBJZCwgaXRlbUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgREVGQVVMVCBWQUxVRSAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0RGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoZmllbGRNb2RlbCwgdmFsdWVzQXJyYXksIGl0ZW1zTGlzdCwgY3VycmVudEFwcElkKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgICAgICBsZXQgZ2V0VmFsdWVGdW5jdGlvbiA9IGltcG9ydGVkQ2xhc3MuZ2V0RGVmYXVsdFZhbHVlO1xuICAgICAgICAgIGlmIChnZXRWYWx1ZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBnZXRWYWx1ZUZ1bmN0aW9uKGZpZWxkTW9kZWwsIHZhbHVlc0FycmF5LCBpdGVtc0xpc3QsIGN1cnJlbnRBcHBJZCk7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEdFVCBTRVRUSU5HUyAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0U2V0dGluZ3M6IGZ1bmN0aW9uIChzY29wZSwgc2V0dGluZ1R5cGUsIGZpZWxkTW9kZWxzKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRlZENsYXNzLmdldFNldHRpbmdzKHNjb3BlLCBzZXR0aW5nVHlwZSwgZmllbGRNb2RlbHMpO1xuICAgICAgfSxcbiAgICAgIC8vKioqKioqKioqKioqKioqIEZJTFRFUioqKioqKioqKioqKioqKiovL1xuXG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgZ2V0U2VhcmNoT3B0aW9uczogZnVuY3Rpb24gKGZpZWxkTW9kZWwpIHtcbiAgICAgICAgICBsZXQgZF90eXBlID0gaW1wb3J0ZWRDbGFzcztcbiAgICAgICAgICBpZiAoZF90eXBlLmZpbHRlciAmJiBkX3R5cGUuZmlsdGVyLmdldFNlYXJjaE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBpbXBvcnRlZENsYXNzLmZpbHRlci5nZXRTZWFyY2hPcHRpb25zKGZpZWxkTW9kZWwpIHx8IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RHJvcGRvd25WYWx1ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgZF90eXBlID0gaW1wb3J0ZWRDbGFzcztcbiAgICAgICAgICBpZiAoZF90eXBlLmZpbHRlciAmJiBkX3R5cGUuZmlsdGVyLmdldERyb3Bkb3duVmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZF90eXBlLmZpbHRlci5nZXREcm9wZG93blZhbHVlcygpIHx8IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgSU5URVJQUkVUQVRJT04gKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIGdldEludGVycHJldGF0aW9uOiBmdW5jdGlvbiAodmFsdWUsIGludGVycHJldGF0aW9uX2lkLCBkYXRhVHlwZSwgZmllbGQsIGl0ZW1JZCwgYXBwSWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICAgIGxldCBjdXJyZW50RGF0YVR5cGUgPSBpbXBvcnRlZENsYXNzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgaW50ZXJwcl9hcnIgPSBhd2FpdCBjdXJyZW50RGF0YVR5cGUuZ2V0SW50ZXJwcmV0YXRpb24oZ3VkaHViLCB2YWx1ZSwgYXBwSWQsIGl0ZW1JZCwgZmllbGQsIGRhdGFUeXBlKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gaW50ZXJwcl9hcnIuZmluZChpdGVtID0+IGl0ZW0uaWQgPT0gaW50ZXJwcmV0YXRpb25faWQpIHx8IGludGVycHJfYXJyLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09ICdkZWZhdWx0Jyk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZGF0YS5jb250ZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgaHRtbDogcmVzdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEVSUk9SIElOICR7bW9kdWxlX2lkfWAsIGVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBodG1sOiAnPHNwYW4+bm8gaW50ZXJwcmV0YXRpb248L3NwYW4+J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgSU5URVJQUkVUQVRJT05TIExJU1QgKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIGdldEludGVycHJldGF0aW9uc0xpc3Q6IGZ1bmN0aW9uIChmaWVsZF92YWx1ZSwgYXBwSWQsIGl0ZW1JZCwgZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIGltcG9ydGVkQ2xhc3MuZ2V0SW50ZXJwcmV0YXRpb24oZmllbGRfdmFsdWUsIGFwcElkLCBpdGVtSWQsIGZpZWxkKTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgSU5URVJQUkVUQVRFRCBWQUxVRSAqKioqKioqKioqKioqKioqLy9cblxuICAgICAgZ2V0SW50ZXJwcmV0YXRlZFZhbHVlOiBmdW5jdGlvbiAoZmllbGRfdmFsdWUsIGZpZWxkX21vZGVsLCBhcHBJZCwgaXRlbUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgICAgICBsZXQgZ2V0SW50ZXJwcmV0YXRlZFZhbHVlRnVuY3Rpb24gPSBpbXBvcnRlZENsYXNzLmdldEludGVycHJldGF0ZWRWYWx1ZTtcbiAgICAgICAgICBpZiAoZ2V0SW50ZXJwcmV0YXRlZFZhbHVlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF3YWl0IGdldEludGVycHJldGF0ZWRWYWx1ZUZ1bmN0aW9uKGZpZWxkX3ZhbHVlLCBmaWVsZF9tb2RlbCwgYXBwSWQsIGl0ZW1JZCk7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShmaWVsZF92YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyoqKioqKioqKioqKioqKiBPTiBNRVNTQUdFICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICBvbk1lc3NhZ2U6IGZ1bmN0aW9uIChhcHBJZCwgdXNlcklkLCByZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgcmVzb2x2ZSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25NZXNzYWdlRnVuY3Rpb24gPSBpbXBvcnRlZENsYXNzLm9uTWVzc2FnZTtcbiAgICAgICAgICBpZiAob25NZXNzYWdlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9uTWVzc2FnZUZ1bmN0aW9uKGFwcElkLCB1c2VySWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdlIG5lZWQgdGhlc2UgbWV0aG9kcyBpbiBicm93c2VyIGVudmlyb25tZW50IG9ubHlcblxuICAgIGlmIChfY29uc3RzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18vKiAuSVNfQlJPV1NFUl9NQUlOX1RIUkVBRCAqLyAuU1IpIHtcbiAgICAgIC8vKioqKioqKioqKioqKioqIEVYVEVORCBDT05UUk9MTEVSICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICByZXN1bHQuZXh0ZW5kQ29udHJvbGxlciA9IGZ1bmN0aW9uIChhY3Rpb25TY29wZSkge1xuICAgICAgICBhbmd1bGFyTW9kdWxlLmdldEFjdGlvblNjb3BlKGFjdGlvblNjb3BlKTtcbiAgICAgIH07XG5cbiAgICAgIC8vKioqKioqKioqKioqKioqIFJVTiBBQ1RJT04gKioqKioqKioqKioqKioqKi8vXG5cbiAgICAgIHJlc3VsdC5ydW5BY3Rpb24gPSBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhbmd1bGFyTW9kdWxlLnJ1bkFjdGlvbihzY29wZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9O1xuXG4gICAgICAvLyoqKioqKioqKioqKioqKiBHRVQgV0lORE9XIFNDT1BFICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICByZXN1bHQuZ2V0V2luZG93U2NvcGUgPSBmdW5jdGlvbiAod2luZG93U2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGFuZ3VsYXJNb2R1bGUuZ2V0V2luZG93U2NvcGUod2luZG93U2NvcGUpO1xuICAgICAgfTtcblxuICAgICAgLy8qKioqKioqKioqKioqKiogR0VUIFdJTkRPVyBIVE1MICoqKioqKioqKioqKioqKiovL1xuXG4gICAgICByZXN1bHQuZ2V0V2luZG93SFRNTCA9IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICByZXR1cm4gYW5ndWxhck1vZHVsZS5nZXRXaW5kb3dIVE1MKHNjb3BlKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgY29uc29sZS5sb2coYEZhaWxlZCBpbiBjcmVhdGVBbmd1bGFyTW9kdWxlSW5zdGFuY2UgKGdoY29uc3RydWN0b3IpLiBNb2R1bGUgaWQ6ICR7bW9kdWxlX2lkfS5gKTtcbiAgfVxufVxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9AZ3VkaHViL2NvcmUvLi9HVURIVUIvR0hDb25zdHJ1Y3Rvci9jcmVhdGVBbmd1bGFyTW9kdWxlSW5zdGFuY2UuanM/Iik7fSw3Mzg6KF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7ZXZhbCgnLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUWc6ICgpID0+ICgvKiBiaW5kaW5nICovIElTX0JST1dTRVIpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBTUjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gSVNfQlJPV1NFUl9NQUlOX1RIUkVBRClcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogdW51c2VkIGhhcm1vbnkgZXhwb3J0cyBJU19CUk9XU0VSX1dPUktFUiwgSVNfTk9ERSAqL1xuY29uc3QgSVNfQlJPV1NFUl9NQUlOX1RIUkVBRCA9ICFbdHlwZW9mIHdpbmRvdywgdHlwZW9mIGRvY3VtZW50XS5pbmNsdWRlcygidW5kZWZpbmVkIik7XG5jb25zdCBJU19CUk9XU0VSX1dPUktFUiA9IHR5cGVvZiBzZWxmID09PSAib2JqZWN0IiAmJiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT0gXCd1bmRlZmluZWRcJztcbmNvbnN0IElTX0JST1dTRVIgPSBJU19CUk9XU0VSX01BSU5fVEhSRUFEIHx8IElTX0JST1dTRVJfV09SS0VSO1xuY29uc3QgSVNfTk9ERSA9XG4vLyBAdHMtZXhwZWN0LWVycm9yXG50eXBlb2YgcHJvY2VzcyAhPT0gInVuZGVmaW5lZCIgJiZcbi8vIEB0cy1leHBlY3QtZXJyb3JcbnByb2Nlc3MudmVyc2lvbnMgIT0gbnVsbCAmJlxuLy8gQHRzLWV4cGVjdC1lcnJvclxucHJvY2Vzcy52ZXJzaW9ucy5ub2RlICE9IG51bGw7XG5cbi8vICAgSVNfV0VCXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL0dVREhVQi9jb25zdHMuanM/Jyk7fSw4NTkzOm1vZHVsZT0+eyJ1c2Ugc3RyaWN0IjtldmFsKCdtb2R1bGUuZXhwb3J0cyA9IEpTT04ucGFyc2UoXCd7Im5hbWUiOiJheGlvcyIsInZlcnNpb24iOiIwLjIxLjQiLCJkZXNjcmlwdGlvbiI6IlByb21pc2UgYmFzZWQgSFRUUCBjbGllbnQgZm9yIHRoZSBicm93c2VyIGFuZCBub2RlLmpzIiwibWFpbiI6ImluZGV4LmpzIiwic2NyaXB0cyI6eyJ0ZXN0IjoiZ3J1bnQgdGVzdCIsInN0YXJ0Ijoibm9kZSAuL3NhbmRib3gvc2VydmVyLmpzIiwiYnVpbGQiOiJOT0RFX0VOVj1wcm9kdWN0aW9uIGdydW50IGJ1aWxkIiwicHJldmVyc2lvbiI6Im5wbSB0ZXN0IiwidmVyc2lvbiI6Im5wbSBydW4gYnVpbGQgJiYgZ3J1bnQgdmVyc2lvbiAmJiBnaXQgYWRkIC1BIGRpc3QgJiYgZ2l0IGFkZCBDSEFOR0VMT0cubWQgYm93ZXIuanNvbiBwYWNrYWdlLmpzb24iLCJwb3N0dmVyc2lvbiI6ImdpdCBwdXNoICYmIGdpdCBwdXNoIC0tdGFncyIsImV4YW1wbGVzIjoibm9kZSAuL2V4YW1wbGVzL3NlcnZlci5qcyIsImNvdmVyYWxscyI6ImNhdCBjb3ZlcmFnZS9sY292LmluZm8gfCAuL25vZGVfbW9kdWxlcy9jb3ZlcmFsbHMvYmluL2NvdmVyYWxscy5qcyIsImZpeCI6ImVzbGludCAtLWZpeCBsaWIvKiovKi5qcyJ9LCJyZXBvc2l0b3J5Ijp7InR5cGUiOiJnaXQiLCJ1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MuZ2l0In0sImtleXdvcmRzIjpbInhociIsImh0dHAiLCJhamF4IiwicHJvbWlzZSIsIm5vZGUiXSwiYXV0aG9yIjoiTWF0dCBaYWJyaXNraWUiLCJsaWNlbnNlIjoiTUlUIiwiYnVncyI6eyJ1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MvaXNzdWVzIn0sImhvbWVwYWdlIjoiaHR0cHM6Ly9heGlvcy1odHRwLmNvbSIsImRldkRlcGVuZGVuY2llcyI6eyJjb3ZlcmFsbHMiOiJeMy4wLjAiLCJlczYtcHJvbWlzZSI6Il40LjIuNCIsImdydW50IjoiXjEuMy4wIiwiZ3J1bnQtYmFubmVyIjoiXjAuNi4wIiwiZ3J1bnQtY2xpIjoiXjEuMi4wIiwiZ3J1bnQtY29udHJpYi1jbGVhbiI6Il4xLjEuMCIsImdydW50LWNvbnRyaWItd2F0Y2giOiJeMS4wLjAiLCJncnVudC1lc2xpbnQiOiJeMjMuMC4wIiwiZ3J1bnQta2FybWEiOiJeNC4wLjAiLCJncnVudC1tb2NoYS10ZXN0IjoiXjAuMTMuMyIsImdydW50LXRzIjoiXjYuMC4wLWJldGEuMTkiLCJncnVudC13ZWJwYWNrIjoiXjQuMC4yIiwiaXN0YW5idWwtaW5zdHJ1bWVudGVyLWxvYWRlciI6Il4xLjAuMCIsImphc21pbmUtY29yZSI6Il4yLjQuMSIsImthcm1hIjoiXjYuMy4yIiwia2FybWEtY2hyb21lLWxhdW5jaGVyIjoiXjMuMS4wIiwia2FybWEtZmlyZWZveC1sYXVuY2hlciI6Il4yLjEuMCIsImthcm1hLWphc21pbmUiOiJeMS4xLjEiLCJrYXJtYS1qYXNtaW5lLWFqYXgiOiJeMC4xLjEzIiwia2FybWEtc2FmYXJpLWxhdW5jaGVyIjoiXjEuMC4wIiwia2FybWEtc2F1Y2UtbGF1bmNoZXIiOiJeNC4zLjYiLCJrYXJtYS1zaW5vbiI6Il4xLjAuNSIsImthcm1hLXNvdXJjZW1hcC1sb2FkZXIiOiJeMC4zLjgiLCJrYXJtYS13ZWJwYWNrIjoiXjQuMC4yIiwibG9hZC1ncnVudC10YXNrcyI6Il4zLjUuMiIsIm1pbmltaXN0IjoiXjEuMi4wIiwibW9jaGEiOiJeOC4yLjEiLCJzaW5vbiI6Il40LjUuMCIsInRlcnNlci13ZWJwYWNrLXBsdWdpbiI6Il40LjIuMyIsInR5cGVzY3JpcHQiOiJeNC4wLjUiLCJ1cmwtc2VhcmNoLXBhcmFtcyI6Il4wLjEwLjAiLCJ3ZWJwYWNrIjoiXjQuNDQuMiIsIndlYnBhY2stZGV2LXNlcnZlciI6Il4zLjExLjAifSwiYnJvd3NlciI6eyIuL2xpYi9hZGFwdGVycy9odHRwLmpzIjoiLi9saWIvYWRhcHRlcnMveGhyLmpzIn0sImpzZGVsaXZyIjoiZGlzdC9heGlvcy5taW4uanMiLCJ1bnBrZyI6ImRpc3QvYXhpb3MubWluLmpzIiwidHlwaW5ncyI6Ii4vaW5kZXguZC50cyIsImRlcGVuZGVuY2llcyI6eyJmb2xsb3ctcmVkaXJlY3RzIjoiXjEuMTQuMCJ9LCJidW5kbGVzaXplIjpbeyJwYXRoIjoiLi9kaXN0L2F4aW9zLm1pbi5qcyIsInRocmVzaG9sZCI6IjVrQiJ9XX1cJyk7XG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL0BndWRodWIvY29yZS8uL25vZGVfbW9kdWxlcy9heGlvcy9wYWNrYWdlLmpzb24/Jyk7fX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18oZSl7dmFyIG49X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW2VdO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG4uZXhwb3J0czt2YXIgdD1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV09e2V4cG9ydHM6e319O3JldHVybiBfX3dlYnBhY2tfbW9kdWxlc19fW2VdKHQsdC5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLHQuZXhwb3J0czt9X193ZWJwYWNrX3JlcXVpcmVfXy5tPV9fd2VicGFja19tb2R1bGVzX18sX193ZWJwYWNrX3JlcXVpcmVfXy5kPShlLG4pPT57Zm9yKHZhciB0IGluIG4pX193ZWJwYWNrX3JlcXVpcmVfXy5vKG4sdCkmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZSx0KSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6blt0XX0pO30sX193ZWJwYWNrX3JlcXVpcmVfXy51PWU9PmUrIi5hcHBSZXF1ZXN0V29ya2VyLmJ1bmRsZWQuanMiLF9fd2VicGFja19yZXF1aXJlX18uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO31jYXRjaChlKXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93O319KCksX193ZWJwYWNrX3JlcXVpcmVfXy5vPShlLG4pPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSwoKCk9Pnt2YXIgZTtfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cyYmKGU9X193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uKyIiKTt2YXIgbj1fX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7aWYoIWUmJm4mJihuLmN1cnJlbnRTY3JpcHQmJihlPW4uY3VycmVudFNjcmlwdC5zcmMpLCFlKSl7dmFyIHQ9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYodC5sZW5ndGgpZm9yKHZhciByPXQubGVuZ3RoLTE7cj4tMSYmIWU7KWU9dFtyLS1dLnNyYzt9aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciIpO2U9ZS5yZXBsYWNlKC8jLiokLywiIikucmVwbGFjZSgvXD8uKiQvLCIiKS5yZXBsYWNlKC9cL1teXC9dKyQvLCIvIiksX193ZWJwYWNrX3JlcXVpcmVfXy5wPWU7fSkoKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmI9c2VsZi5sb2NhdGlvbisiIjt2YXIgX193ZWJwYWNrX2V4cG9ydHNfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDI1MzgpO30pKCk7";\n\n//# sourceURL=webpack://@gudhub/core/./GUDHUB/DataService/IndexedDB/appRequestWorker.bundled.js?')}},__webpack_module_cache__={};function __webpack_require__(I){var g=__webpack_module_cache__[I];if(void 0!==g)return g.exports;var C=__webpack_module_cache__[I]={exports:{}};return __webpack_modules__[I](C,C.exports,__webpack_require__),C.exports}var __webpack_exports__=__webpack_require__(9127)})();
|