diff --git a/dist/optimal-select.js b/dist/optimal-select.js index e4923ca..f0c219a 100644 --- a/dist/optimal-select.js +++ b/dist/optimal-select.js @@ -119,7 +119,7 @@ function convertNodeList(nodes) { * @return {String} - [description] */ function escapeValue(value) { - return value && value.replace(/['"`\\/:\?&!#$%^()[\]{|}*+;,.<=>@~]/g, '\\$&').replace(/\n/g, '\A'); + return value && value.replace(/['"`\\/:\?&!#$%^()[\]{|}*+;,.<=>@~]/g, '\\$&').replace(/\n/g, ''); } /***/ }, @@ -1477,4 +1477,4 @@ exports.default = _select3.default; /***/ } /******/ ]); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBhOGUwMjk3Y2RkNDE2YmMwZjMyNiIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbGl0aWVzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL29wdGltaXplLmpzIiwid2VicGFjazovLy8uL3NyYy9hZGFwdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiXSwibmFtZXMiOlsiY29udmVydE5vZGVMaXN0IiwiZXNjYXBlVmFsdWUiLCJub2RlcyIsImxlbmd0aCIsImFyciIsIkFycmF5IiwiaSIsInZhbHVlIiwicmVwbGFjZSIsImdldENvbW1vbkFuY2VzdG9yIiwiZ2V0Q29tbW9uUHJvcGVydGllcyIsImVsZW1lbnRzIiwib3B0aW9ucyIsInJvb3QiLCJkb2N1bWVudCIsImFuY2VzdG9ycyIsImZvckVhY2giLCJlbGVtZW50IiwiaW5kZXgiLCJwYXJlbnRzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJzb3J0IiwiY3VyciIsIm5leHQiLCJzaGFsbG93QW5jZXN0b3IiLCJzaGlmdCIsImFuY2VzdG9yIiwicGFyZW50IiwibWlzc2luZyIsInNvbWUiLCJvdGhlclBhcmVudHMiLCJvdGhlclBhcmVudCIsImwiLCJjb21tb25Qcm9wZXJ0aWVzIiwiY2xhc3NlcyIsImF0dHJpYnV0ZXMiLCJ0YWciLCJjb21tb25DbGFzc2VzIiwiY29tbW9uQXR0cmlidXRlcyIsImNvbW1vblRhZyIsInVuZGVmaW5lZCIsImdldEF0dHJpYnV0ZSIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImVudHJ5IiwibmFtZSIsImVsZW1lbnRBdHRyaWJ1dGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImtleSIsImF0dHJpYnV0ZSIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVzTmFtZXMiLCJjb21tb25BdHRyaWJ1dGVzTmFtZXMiLCJuZXh0Q29tbW9uQXR0cmlidXRlcyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsIm9wdGltaXplIiwic2VsZWN0b3IiLCJpc0FycmF5Iiwibm9kZVR5cGUiLCJFcnJvciIsImdsb2JhbE1vZGlmaWVkIiwicGF0aCIsIm9wdGltaXplUGFydCIsInNob3J0ZW5lZCIsInBvcCIsImN1cnJlbnQiLCJwcmVQYXJ0Iiwiam9pbiIsInBvc3RQYXJ0IiwicGF0dGVybiIsIm1hdGNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwic2xpY2UiLCJ0ZXN0IiwiY29tcGFyZVJlc3VsdHMiLCJyZWZlcmVuY2VzIiwicmVmZXJlbmNlIiwiY29udGFpbnMiLCJkZXNjcmlwdGlvbiIsImRlc2NlbmRhbnQiLCJ0eXBlIiwibmFtZXMiLCJtYXAiLCJwYXJ0aWFsIiwiY2hhckF0IiwibWF0Y2giLCJldmVyeSIsImFkYXB0IiwiZ2xvYmFsIiwiY29udGV4dCIsIkVsZW1lbnRQcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImNoaWxkcmVuIiwibm9kZSIsImF0dHJpYnMiLCJOYW1lZE5vZGVNYXAiLCJjb25maWd1cmFibGUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIkhUTUxDb2xsZWN0aW9uIiwidHJhdmVyc2VEZXNjZW5kYW50cyIsImNoaWxkVGFncyIsInB1c2giLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiZGVzY2VuZGFudENsYXNzTmFtZSIsImNsYXNzIiwiaW5kZXhPZiIsInNlbGVjdG9ycyIsImluc3RydWN0aW9ucyIsImdldEluc3RydWN0aW9ucyIsImRpc2NvdmVyIiwidG90YWwiLCJzdGVwIiwiaW5jbHVzaXZlIiwiZG9uZSIsInJldmVyc2UiLCJwc2V1ZG8iLCJ2YWxpZGF0ZSIsImluc3RydWN0aW9uIiwiY2hlY2tQYXJlbnQiLCJzdWJzdHIiLCJub2RlQ2xhc3NOYW1lIiwiY2hlY2tDbGFzcyIsImdldEFuY2VzdG9yIiwiYXR0cmlidXRlS2V5IiwiYXR0cmlidXRlVmFsdWUiLCJoYXNBdHRyaWJ1dGUiLCJjaGVja0F0dHJpYnV0ZSIsIk5vZGVMaXN0IiwiaWQiLCJjaGVja0lkIiwiY2hlY2tVbml2ZXJzYWwiLCJjaGVja1RhZyIsInJ1bGUiLCJraW5kIiwicGFyc2VJbnQiLCJ2YWxpZGF0ZVBzZXVkbyIsImNvbXBhcmVTZXQiLCJub2RlSW5kZXgiLCJmaW5kSW5kZXgiLCJjaGlsZCIsImVuaGFuY2VJbnN0cnVjdGlvbiIsIm1hdGNoZWROb2RlIiwiaGFuZGxlciIsInByb2dyZXNzIiwiZ2V0U2luZ2xlU2VsZWN0b3IiLCJnZXRNdWx0aVNlbGVjdG9yIiwiZ2V0UXVlcnlTZWxlY3RvciIsIm9wdGltaXplZCIsImFuY2VzdG9yU2VsZWN0b3IiLCJjb21tb25TZWxlY3RvcnMiLCJnZXRDb21tb25TZWxlY3RvcnMiLCJkZXNjZW5kYW50U2VsZWN0b3IiLCJzZWxlY3Rvck1hdGNoZXMiLCJjb25zb2xlIiwid2FybiIsInNlbGVjdG9yUGF0aCIsImNsYXNzU2VsZWN0b3IiLCJhdHRyaWJ1dGVTZWxlY3RvciIsInBhcnRzIiwiaW5wdXQiLCJkZWZhdWx0SWdub3JlIiwic2tpcCIsInByaW9yaXR5IiwiaWdub3JlIiwiaWdub3JlQ2xhc3MiLCJza2lwQ29tcGFyZSIsInNraXBDaGVja3MiLCJjb21wYXJlIiwicHJlZGljYXRlIiwidG9TdHJpbmciLCJSZWdFeHAiLCJpZ25vcmVBdHRyaWJ1dGUiLCJkZWZhdWx0UHJlZGljYXRlIiwiY2hlY2tBdHRyaWJ1dGVzIiwiY2hlY2tDaGlsZHMiLCJmaW5kUGF0dGVybiIsImZpbmRBdHRyaWJ1dGVzUGF0dGVybiIsInNvcnRlZEtleXMiLCJjdXJyUG9zIiwibmV4dFBvcyIsImN1cnJlbnRJZ25vcmUiLCJjdXJyZW50RGVmYXVsdElnbm9yZSIsImNoZWNrSWdub3JlIiwiZmluZFRhZ1BhdHRlcm4iLCJjaGlsZFBhdHRlcm4iLCJjaGVjayIsInNlbGVjdCIsImNvbW1vbiIsImRlZmF1bHQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztRQ3BEZ0JBLGUsR0FBQUEsZTtRQWlCQUMsVyxHQUFBQSxXO0FBN0JoQjs7Ozs7O0FBTUE7Ozs7OztBQU1PLFNBQVNELGVBQVQsQ0FBMEJFLEtBQTFCLEVBQWlDO0FBQUEsTUFDOUJDLE1BRDhCLEdBQ25CRCxLQURtQixDQUM5QkMsTUFEOEI7O0FBRXRDLE1BQU1DLE1BQU0sSUFBSUMsS0FBSixDQUFVRixNQUFWLENBQVo7QUFDQSxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUgsTUFBcEIsRUFBNEJHLEdBQTVCLEVBQWlDO0FBQy9CRixRQUFJRSxDQUFKLElBQVNKLE1BQU1JLENBQU4sQ0FBVDtBQUNEO0FBQ0QsU0FBT0YsR0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNILFdBQVQsQ0FBc0JNLEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU9BLFNBQVNBLE1BQU1D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QyxFQUE4QytLLGdCQUE5QyxFQUFnRTtBQUM5RCxNQUFJLENBQUMvSyxLQUFMLEVBQVk7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNELE1BQU00TCxRQUFRakIsYUFBYUksZ0JBQTNCO0FBQ0EsTUFBSSxDQUFDYSxLQUFMLEVBQVk7QUFDVixXQUFPLEtBQVA7QUFDRDtBQUNELFNBQU9BLE1BQU1wSixJQUFOLEVBQVl4QyxLQUFaLEVBQW1CK0ssZ0JBQW5CLENBQVA7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JDelJnQjVCLGlCOzs7Ozs7b0JBQW1CQyxnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBQTdCeUMsTTtRQUNBeEksUTtRQUNLeUksTTtRQUVMQyxPIiwiZmlsZSI6Im9wdGltYWwtc2VsZWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiT3B0aW1hbFNlbGVjdFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJPcHRpbWFsU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGE4ZTAyOTdjZGQ0MTZiYzBmMzI2IiwiLyoqXG4gKiAjIFV0aWxpdGllc1xuICpcbiAqIENvbnZlbmllbmNlIGhlbHBlcnMuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgRE9NIG5vZGVzIG9mIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtICB7Tm9kZUxpc3R9ICAgICAgICAgICAgIG5vZGVzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE5vZGVMaXN0IChub2Rlcykge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gbm9kZXNcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IG5vZGVzW2ldXG4gIH1cbiAgcmV0dXJuIGFyclxufVxuXG4vKipcbiAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGxpbmUgYnJlYWtzIGFzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mICdDU1MuZXNjYXBlKCknXG4gKlxuICogRGVzY3JpcHRpb24gb2YgdmFsaWQgY2hhcmFjdGVyczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2Nzcy1lc2NhcGVzXG4gKlxuICogQHBhcmFtICB7U3RyaW5nP30gdmFsdWUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVZhbHVlICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUucmVwbGFjZSgvWydcImBcXFxcLzpcXD8mISMkJV4oKVtcXF17fH0qKzssLjw9PkB+XS9nLCAnXFxcXCQmJylcbiAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnXFxBJylcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlsaXRpZXMuanMiLCIvKipcbiAqICMgQ29tbW9uXG4gKlxuICogUHJvY2VzcyBjb2xsZWN0aW9ucyBmb3Igc2ltaWxhcml0aWVzLlxuICovXG5cbi8qKlxuICogRmluZCB0aGUgbGFzdCBjb21tb24gYW5jZXN0b3Igb2YgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnRzPn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25BbmNlc3RvciAoZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuXG4gIGNvbnN0IHtcbiAgICByb290ID0gZG9jdW1lbnRcbiAgfSA9IG9wdGlvbnNcblxuICBjb25zdCBhbmNlc3RvcnMgPSBbXVxuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG4gICAgd2hpbGUgKGVsZW1lbnQgIT09IHJvb3QpIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGVcbiAgICAgIHBhcmVudHMudW5zaGlmdChlbGVtZW50KVxuICAgIH1cbiAgICBhbmNlc3RvcnNbaW5kZXhdID0gcGFyZW50c1xuICB9KVxuXG4gIGFuY2VzdG9ycy5zb3J0KChjdXJyLCBuZXh0KSA9PiBjdXJyLmxlbmd0aCAtIG5leHQubGVuZ3RoKVxuXG4gIGNvbnN0IHNoYWxsb3dBbmNlc3RvciA9IGFuY2VzdG9ycy5zaGlmdCgpXG5cbiAgdmFyIGFuY2VzdG9yID0gbnVsbFxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2hhbGxvd0FuY2VzdG9yLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHBhcmVudCA9IHNoYWxsb3dBbmNlc3RvcltpXVxuICAgIGNvbnN0IG1pc3NpbmcgPSBhbmNlc3RvcnMuc29tZSgob3RoZXJQYXJlbnRzKSA9PiB7XG4gICAgICByZXR1cm4gIW90aGVyUGFyZW50cy5zb21lKChvdGhlclBhcmVudCkgPT4gb3RoZXJQYXJlbnQgPT09IHBhcmVudClcbiAgICB9KVxuXG4gICAgaWYgKG1pc3NpbmcpIHtcbiAgICAgIC8vIFRPRE86IGZpbmQgc2ltaWxhciBzdWItcGFyZW50cywgbm90IHRoZSB0b3Agcm9vdCwgZS5nLiBzaGFyaW5nIGEgY2xhc3Mgc2VsZWN0b3JcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgYW5jZXN0b3IgPSBwYXJlbnRcbiAgfVxuXG4gIHJldHVybiBhbmNlc3RvclxufVxuXG4vKipcbiAqIEdldCBhIHNldCBvZiBjb21tb24gcHJvcGVydGllcyBvZiBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25Qcm9wZXJ0aWVzIChlbGVtZW50cykge1xuXG4gIGNvbnN0IGNvbW1vblByb3BlcnRpZXMgPSB7XG4gICAgY2xhc3NlczogW10sXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgdGFnOiBudWxsXG4gIH1cblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG5cbiAgICB2YXIge1xuICAgICAgY2xhc3NlczogY29tbW9uQ2xhc3NlcyxcbiAgICAgIGF0dHJpYnV0ZXM6IGNvbW1vbkF0dHJpYnV0ZXMsXG4gICAgICB0YWc6IGNvbW1vblRhZ1xuICAgIH0gPSBjb21tb25Qcm9wZXJ0aWVzXG5cbiAgICAvLyB+IGNsYXNzZXNcbiAgICBpZiAoY29tbW9uQ2xhc3NlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpXG4gICAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy50cmltKCkuc3BsaXQoJyAnKVxuICAgICAgICBpZiAoIWNvbW1vbkNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29tbW9uUHJvcGVydGllcy5jbGFzc2VzID0gY2xhc3Nlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1vbkNsYXNzZXMgPSBjb21tb25DbGFzc2VzLmZpbHRlcigoZW50cnkpID0+IGNsYXNzZXMuc29tZSgobmFtZSkgPT4gbmFtZSA9PT0gZW50cnkpKVxuICAgICAgICAgIGlmIChjb21tb25DbGFzc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tbW9uUHJvcGVydGllcy5jbGFzc2VzID0gY29tbW9uQ2xhc3Nlc1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgY29tbW9uUHJvcGVydGllcy5jbGFzc2VzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiByZXN0cnVjdHVyZSByZW1vdmFsIGFzIDJ4IHNldCAvIDJ4IGRlbGV0ZSwgaW5zdGVhZCBvZiBtb2RpZnkgYWx3YXlzIHJlcGxhY2luZyB3aXRoIG5ldyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB+IGF0dHJpYnV0ZXNcbiAgICBpZiAoY29tbW9uQXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbGVtZW50QXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlc1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKGVsZW1lbnRBdHRyaWJ1dGVzKS5yZWR1Y2UoKGF0dHJpYnV0ZXMsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbGVtZW50QXR0cmlidXRlc1trZXldXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUubmFtZVxuICAgICAgICAvLyBOT1RFOiB3b3JrYXJvdW5kIGRldGVjdGlvbiBmb3Igbm9uLXN0YW5kYXJkIHBoYW50b21qcyBOYW1lZE5vZGVNYXAgYmVoYXZpb3VyXG4gICAgICAgIC8vIChpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTQ2MzQpXG4gICAgICAgIGlmIChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlTmFtZSAhPT0gJ2NsYXNzJykge1xuICAgICAgICAgIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGUudmFsdWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgICAgfSwge30pXG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXNOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpXG4gICAgICBjb25zdCBjb21tb25BdHRyaWJ1dGVzTmFtZXMgPSBPYmplY3Qua2V5cyhjb21tb25BdHRyaWJ1dGVzKVxuXG4gICAgICBpZiAoYXR0cmlidXRlc05hbWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWNvbW1vbkF0dHJpYnV0ZXNOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbW9uQXR0cmlidXRlcyA9IGNvbW1vbkF0dHJpYnV0ZXNOYW1lcy5yZWR1Y2UoKG5leHRDb21tb25BdHRyaWJ1dGVzLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbW1vbkF0dHJpYnV0ZXNbbmFtZV1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gYXR0cmlidXRlc1tuYW1lXSkge1xuICAgICAgICAgICAgICBuZXh0Q29tbW9uQXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dENvbW1vbkF0dHJpYnV0ZXNcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29tbW9uQXR0cmlidXRlcykubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmF0dHJpYnV0ZXMgPSBjb21tb25BdHRyaWJ1dGVzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLmF0dHJpYnV0ZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLmF0dHJpYnV0ZXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB+IHRhZ1xuICAgIGlmIChjb21tb25UYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFnID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIGlmICghY29tbW9uVGFnKSB7XG4gICAgICAgIGNvbW1vblByb3BlcnRpZXMudGFnID0gdGFnXG4gICAgICB9IGVsc2UgaWYgKHRhZyAhPT0gY29tbW9uVGFnKSB7XG4gICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLnRhZ1xuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY29tbW9uUHJvcGVydGllc1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbW1vbi5qcyIsIi8qKlxuICogIyBPcHRpbWl6ZVxuICpcbiAqIDEuKSBJbXByb3ZlIGVmZmljaWVuY3kgdGhyb3VnaCBzaG9ydGVyIHNlbGVjdG9ycyBieSByZW1vdmluZyByZWR1bmRhbmN5XG4gKiAyLikgSW1wcm92ZSByb2J1c3RuZXNzIHRocm91Z2ggc2VsZWN0b3IgdHJhbnNmb3JtYXRpb25cbiAqL1xuXG5pbXBvcnQgYWRhcHQgZnJvbSAnLi9hZGFwdCdcbmltcG9ydCB7IGNvbnZlcnROb2RlTGlzdCB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuXG4vKipcbiAqIEFwcGx5IGRpZmZlcmVudCBvcHRpbWl6YXRpb24gdGVjaG5pcXVlc1xuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR8QXJyYXkuPEhUTUxFbGVtZW50Pn0gZWxlbWVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcHRpbWl6ZSAoc2VsZWN0b3IsIGVsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcblxuICAvLyBjb252ZXJ0IHNpbmdsZSBlbnRyeSBhbmQgTm9kZUxpc3RcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkge1xuICAgIGVsZW1lbnRzID0gIWVsZW1lbnRzLmxlbmd0aCA/IFtlbGVtZW50c10gOiBjb252ZXJ0Tm9kZUxpc3QoZWxlbWVudHMpXG4gIH1cblxuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCB8fCBlbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCAtIHRvIGNvbXBhcmUgSFRNTEVsZW1lbnRzIGl0cyBuZWNlc3NhcnkgdG8gcHJvdmlkZSBhIHJlZmVyZW5jZSBvZiB0aGUgc2VsZWN0ZWQgbm9kZShzKSEgKG1pc3NpbmcgXCJlbGVtZW50c1wiKWApXG4gIH1cblxuICBjb25zdCBnbG9iYWxNb2RpZmllZCA9IGFkYXB0KGVsZW1lbnRzWzBdLCBvcHRpb25zKVxuXG4gIC8vIGNodW5rIHBhcnRzIG91dHNpZGUgb2YgcXVvdGVzIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNTY2MzcyOSlcbiAgdmFyIHBhdGggPSBzZWxlY3Rvci5yZXBsYWNlKC8+IC9nLCAnPicpLnNwbGl0KC9cXHMrKD89KD86KD86W15cIl0qXCIpezJ9KSpbXlwiXSokKS8pXG5cbiAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBvcHRpbWl6ZVBhcnQoJycsIHNlbGVjdG9yLCAnJywgZWxlbWVudHMpXG4gIH1cblxuICBjb25zdCBzaG9ydGVuZWQgPSBbcGF0aC5wb3AoKV1cbiAgd2hpbGUgKHBhdGgubGVuZ3RoID4gMSkgIHtcbiAgICBjb25zdCBjdXJyZW50ID0gcGF0aC5wb3AoKVxuICAgIGNvbnN0IHByZVBhcnQgPSBwYXRoLmpvaW4oJyAnKVxuICAgIGNvbnN0IHBvc3RQYXJ0ID0gc2hvcnRlbmVkLmpvaW4oJyAnKVxuXG4gICAgY29uc3QgcGF0dGVybiA9IGAke3ByZVBhcnR9ICR7cG9zdFBhcnR9YFxuICAgIGNvbnN0IG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHNob3J0ZW5lZC51bnNoaWZ0KG9wdGltaXplUGFydChwcmVQYXJ0LCBjdXJyZW50LCBwb3N0UGFydCwgZWxlbWVudHMpKVxuICAgIH1cbiAgfVxuICBzaG9ydGVuZWQudW5zaGlmdChwYXRoWzBdKVxuICBwYXRoID0gc2hvcnRlbmVkXG5cbiAgLy8gb3B0aW1pemUgc3RhcnQgKyBlbmRcbiAgcGF0aFswXSA9IG9wdGltaXplUGFydCgnJywgcGF0aFswXSwgcGF0aC5zbGljZSgxKS5qb2luKCcgJyksIGVsZW1lbnRzKVxuICBwYXRoW3BhdGgubGVuZ3RoLTFdID0gb3B0aW1pemVQYXJ0KHBhdGguc2xpY2UoMCwgLTEpLmpvaW4oJyAnKSwgcGF0aFtwYXRoLmxlbmd0aC0xXSwgJycsIGVsZW1lbnRzKVxuXG4gIGlmIChnbG9iYWxNb2RpZmllZCkge1xuICAgIGRlbGV0ZSBnbG9iYWwuZG9jdW1lbnRcbiAgfVxuXG4gIHJldHVybiBwYXRoLmpvaW4oJyAnKS5yZXBsYWNlKC8+L2csICc+ICcpLnRyaW0oKVxufVxuXG4vKipcbiAqIEltcHJvdmUgYSBjaHVuayBvZiB0aGUgc2VsZWN0b3JcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICBwcmVQYXJ0ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgIGN1cnJlbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgcG9zdFBhcnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBvcHRpbWl6ZVBhcnQgKHByZVBhcnQsIGN1cnJlbnQsIHBvc3RQYXJ0LCBlbGVtZW50cykge1xuICBpZiAocHJlUGFydC5sZW5ndGgpIHByZVBhcnQgPSBgJHtwcmVQYXJ0fSBgXG4gIGlmIChwb3N0UGFydC5sZW5ndGgpIHBvc3RQYXJ0ID0gYCAke3Bvc3RQYXJ0fWBcblxuICAvLyByb2J1c3RuZXNzOiBhdHRyaWJ1dGUgd2l0aG91dCB2YWx1ZSAoZ2VuZXJhbGl6YXRpb24pXG4gIGlmICgvXFxbKlxcXS8udGVzdChjdXJyZW50KSkge1xuICAgIGNvbnN0IGtleSA9IGN1cnJlbnQucmVwbGFjZSgvPS4qJC8sICddJylcbiAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtrZXl9JHtwb3N0UGFydH1gXG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgY3VycmVudCA9IGtleVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByb2J1c3RuZXNzOiByZXBsYWNlIHNwZWNpZmljIGtleS12YWx1ZSB3aXRoIGJhc2UgdGFnIChoZXVyaXN0aWMpXG4gICAgICBjb25zdCByZWZlcmVuY2VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgJHtwcmVQYXJ0fSR7a2V5fWApXG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV1cbiAgICAgICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHJlZmVyZW5jZS5jb250YWlucyhlbGVtZW50KSkpIHtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHJlZmVyZW5jZS50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtkZXNjcmlwdGlvbn0ke3Bvc3RQYXJ0fWBcbiAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICAgICAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gZGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHJvYnVzdG5lc3M6IGRlc2NlbmRhbnQgaW5zdGVhZCBjaGlsZCAoaGV1cmlzdGljKVxuICBpZiAoLz4vLnRlc3QoY3VycmVudCkpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50ID0gY3VycmVudC5yZXBsYWNlKC8+LywgJycpXG4gICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7ZGVzY2VuZGFudH0ke3Bvc3RQYXJ0fWBcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICBjdXJyZW50ID0gZGVzY2VuZGFudFxuICAgIH1cbiAgfVxuXG4gIC8vIHJvYnVzdG5lc3M6ICdudGgtb2YtdHlwZScgaW5zdGVhZCAnbnRoLWNoaWxkJyAoaGV1cmlzdGljKVxuICBpZiAoLzpudGgtY2hpbGQvLnRlc3QoY3VycmVudCkpIHtcbiAgICAvLyBUT0RPOiBjb25zaWRlciBjb21wbGV0ZSBjb3ZlcmFnZSBvZiAnbnRoLW9mLXR5cGUnIHJlcGxhY2VtZW50XG4gICAgY29uc3QgdHlwZSA9IGN1cnJlbnQucmVwbGFjZSgvbnRoLWNoaWxkL2csICdudGgtb2YtdHlwZScpXG4gICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7dHlwZX0ke3Bvc3RQYXJ0fWBcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICBjdXJyZW50ID0gdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8vIGVmZmljaWVuY3k6IGNvbWJpbmF0aW9ucyBvZiBjbGFzc25hbWUgKHBhcnRpYWwgcGVybXV0YXRpb25zKVxuICBpZiAoL1xcLlxcUytcXC5cXFMrLy50ZXN0KGN1cnJlbnQpKSB7XG4gICAgdmFyIG5hbWVzID0gY3VycmVudC50cmltKCkuc3BsaXQoJy4nKS5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBgLiR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoY3VyciwgbmV4dCkgPT4gY3Vyci5sZW5ndGggLSBuZXh0Lmxlbmd0aClcbiAgICB3aGlsZSAobmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYXJ0aWFsID0gY3VycmVudC5yZXBsYWNlKG5hbWVzLnNoaWZ0KCksICcnKS50cmltKClcbiAgICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke3BhcnRpYWx9JHtwb3N0UGFydH1gLnRyaW0oKVxuICAgICAgaWYgKCFwYXR0ZXJuLmxlbmd0aCB8fCBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJz4nIHx8IHBhdHRlcm4uY2hhckF0KHBhdHRlcm4ubGVuZ3RoLTEpID09PSAnPicpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgICBjdXJyZW50ID0gcGFydGlhbFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJvYnVzdG5lc3M6IGRlZ3JhZGUgY29tcGxleCBjbGFzc25hbWUgKGhldXJpc3RpYylcbiAgICBuYW1lcyA9IGN1cnJlbnQgJiYgY3VycmVudC5tYXRjaCgvXFwuL2cpXG4gICAgaWYgKG5hbWVzICYmIG5hbWVzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAke3ByZVBhcnR9JHtjdXJyZW50fWApXG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV1cbiAgICAgICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHJlZmVyZW5jZS5jb250YWlucyhlbGVtZW50KSApKSB7XG4gICAgICAgICAgLy8gVE9ETzpcbiAgICAgICAgICAvLyAtIGNoZWNrIHVzaW5nIGF0dHJpYnV0ZXMgKyByZWdhcmQgZXhjbHVkZXNcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHJlZmVyZW5jZS50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtkZXNjcmlwdGlvbn0ke3Bvc3RQYXJ0fWBcbiAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICAgICAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gZGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdXJyZW50XG59XG5cbi8qKlxuICogRXZhbHVhdGUgbWF0Y2hlcyB3aXRoIGV4cGVjdGVkIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gbWF0Y2hlcyAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjb21wYXJlUmVzdWx0cyAobWF0Y2hlcywgZWxlbWVudHMpIHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IG1hdGNoZXNcbiAgcmV0dXJuIGxlbmd0aCA9PT0gZWxlbWVudHMubGVuZ3RoICYmIGVsZW1lbnRzLmV2ZXJ5KChlbGVtZW50KSA9PiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1hdGNoZXNbaV0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0pXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvb3B0aW1pemUuanMiLCIvKipcbiAqICMgQWRhcHRcbiAqXG4gKiBDaGVjayBhbmQgZXh0ZW5kIHRoZSBlbnZpcm9ubWVudCBmb3IgdW5pdmVyc2FsIHVzYWdlLlxuICovXG5cbi8qKlxuICogTW9kaWZ5IHRoZSBjb250ZXh0IGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudFxuICpcbiAqIEBwYXJhbSAge0hUTUxFTGVtZW50fSBlbGVtZW50IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRhcHQgKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAvLyBkZXRlY3QgZW52aXJvbm1lbnQgc2V0dXBcbiAgaWYgKGdsb2JhbC5kb2N1bWVudCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9IGVsc2Uge1xuICAgIGdsb2JhbC5kb2N1bWVudCA9IG9wdGlvbnMuY29udGV4dCB8fCAoKCkgPT4ge1xuICAgICAgdmFyIHJvb3QgPSBlbGVtZW50XG4gICAgICB3aGlsZSAocm9vdC5wYXJlbnQpIHtcbiAgICAgICAgcm9vdCA9IHJvb3QucGFyZW50XG4gICAgICB9XG4gICAgICByZXR1cm4gcm9vdFxuICAgIH0pKClcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYjU1L2RvbWhhbmRsZXIvYmxvYi9tYXN0ZXIvaW5kZXguanMjTDc1XG4gIGNvbnN0IEVsZW1lbnRQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsLmRvY3VtZW50KVxuXG4gIC8vIGFsdGVybmF0aXZlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGVsZW1lbnRzIHdpdGggZmlsdGVyaW5nIGludmFsaWQgZWxlbWVudHMgKGUuZy4gdGV4dG5vZGVzKVxuICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkVGFncycpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZFRhZ3MnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZmlsdGVyKChub2RlKSA9PiB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZiNTUvZG9tZWxlbWVudHR5cGUvYmxvYi9tYXN0ZXIvaW5kZXguanMjTDEyXG4gICAgICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ3RhZycgfHwgbm9kZS50eXBlID09PSAnc2NyaXB0JyB8fCBub2RlLnR5cGUgPT09ICdzdHlsZSdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnRQcm90b3R5cGUsICdhdHRyaWJ1dGVzJykpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9hdHRyaWJ1dGVzXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05hbWVkTm9kZU1hcFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50UHJvdG90eXBlLCAnYXR0cmlidXRlcycsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQgKCkge1xuICAgICAgICBjb25zdCB7IGF0dHJpYnMgfSA9IHRoaXNcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc05hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlicylcbiAgICAgICAgY29uc3QgTmFtZWROb2RlTWFwID0gYXR0cmlidXRlc05hbWVzLnJlZHVjZSgoYXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW2luZGV4XSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogYXR0cmlic1thdHRyaWJ1dGVOYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgICAgICB9LCB7IH0pXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOYW1lZE5vZGVNYXAsICdsZW5ndGgnLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogYXR0cmlidXRlc05hbWVzLmxlbmd0aFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gTmFtZWROb2RlTWFwXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5nZXRBdHRyaWJ1dGUpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvZG9tL0VsZW1lbnQvZ2V0QXR0cmlidXRlXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0QXR0cmlidXRlXG4gICAgRWxlbWVudFByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlic1tuYW1lXSB8fCBudWxsXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLndlYnBsYXRmb3JtLm9yZy93aWtpL2RvbS9Eb2N1bWVudC9nZXRFbGVtZW50c0J5VGFnTmFtZVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2dldEVsZW1lbnRzQnlUYWdOYW1lXG4gICAgRWxlbWVudFByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7XG4gICAgICBjb25zdCBIVE1MQ29sbGVjdGlvbiA9IFtdXG4gICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKHRoaXMuY2hpbGRUYWdzLCAoZGVzY2VuZGFudCkgPT4ge1xuICAgICAgICBpZiAoZGVzY2VuZGFudC5uYW1lID09PSB0YWdOYW1lIHx8IHRhZ05hbWUgPT09ICcqJykge1xuICAgICAgICAgIEhUTUxDb2xsZWN0aW9uLnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBIVE1MQ29sbGVjdGlvblxuICAgIH1cbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLndlYnBsYXRmb3JtLm9yZy93aWtpL2RvbS9Eb2N1bWVudC9nZXRFbGVtZW50c0J5Q2xhc3NOYW1lXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0RWxlbWVudHNCeUNsYXNzTmFtZVxuICAgIEVsZW1lbnRQcm90b3R5cGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gY2xhc3NOYW1lLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykuc3BsaXQoJyAnKVxuICAgICAgY29uc3QgSFRNTENvbGxlY3Rpb24gPSBbXVxuICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbdGhpc10sIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2NlbmRhbnRDbGFzc05hbWUgPSBkZXNjZW5kYW50LmF0dHJpYnMuY2xhc3NcbiAgICAgICAgaWYgKGRlc2NlbmRhbnRDbGFzc05hbWUgJiYgbmFtZXMuZXZlcnkoKG5hbWUpID0+IGRlc2NlbmRhbnRDbGFzc05hbWUuaW5kZXhPZihuYW1lKSA+IC0xKSkge1xuICAgICAgICAgIEhUTUxDb2xsZWN0aW9uLnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBIVE1MQ29sbGVjdGlvblxuICAgIH1cbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLndlYnBsYXRmb3JtLm9yZy93aWtpL2Nzcy9zZWxlY3RvcnNfYXBpL3F1ZXJ5U2VsZWN0b3JBbGxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9xdWVyeVNlbGVjdG9yQWxsXG4gICAgRWxlbWVudFByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsID0gZnVuY3Rpb24gKHNlbGVjdG9ycykge1xuICAgICAgc2VsZWN0b3JzID0gc2VsZWN0b3JzLnJlcGxhY2UoLyg+KShcXFMpL2csICckMSAkMicpLnRyaW0oKSAvLyBhZGQgc3BhY2UgZm9yICc+JyBzZWxlY3RvclxuXG4gICAgICAvLyB1c2luZyByaWdodCB0byBsZWZ0IGV4ZWN1dGlvbiA9PiBodHRwczovL2dpdGh1Yi5jb20vZmI1NS9jc3Mtc2VsZWN0I2hvdy1kb2VzLWl0LXdvcmtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGdldEluc3RydWN0aW9ucyhzZWxlY3RvcnMpXG4gICAgICBjb25zdCBkaXNjb3ZlciA9IGluc3RydWN0aW9ucy5zaGlmdCgpXG5cbiAgICAgIGNvbnN0IHRvdGFsID0gaW5zdHJ1Y3Rpb25zLmxlbmd0aFxuICAgICAgcmV0dXJuIGRpc2NvdmVyKHRoaXMpLmZpbHRlcigobm9kZSkgPT4ge1xuICAgICAgICB2YXIgc3RlcCA9IDBcbiAgICAgICAgd2hpbGUgKHN0ZXAgPCB0b3RhbCkge1xuICAgICAgICAgIG5vZGUgPSBpbnN0cnVjdGlvbnNbc3RlcF0obm9kZSwgdGhpcylcbiAgICAgICAgICBpZiAoIW5vZGUpIHsgLy8gaGllcmFyY2h5IGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwICs9IDFcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUuY29udGFpbnMpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9jb250YWluc1xuICAgIEVsZW1lbnRQcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgdmFyIGluY2x1c2l2ZSA9IGZhbHNlXG4gICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFt0aGlzXSwgKGRlc2NlbmRhbnQsIGRvbmUpID0+IHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICBpbmNsdXNpdmUgPSB0cnVlXG4gICAgICAgICAgZG9uZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gaW5jbHVzaXZlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0cmFuc2Zvcm1hdGlvbiBzdGVwc1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSAgIHNlbGVjdG9ycyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0FycmF5LjxGdW5jdGlvbj59ICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25zIChzZWxlY3RvcnMpIHtcbiAgcmV0dXJuIHNlbGVjdG9ycy5zcGxpdCgnICcpLnJldmVyc2UoKS5tYXAoKHNlbGVjdG9yLCBzdGVwKSA9PiB7XG4gICAgY29uc3QgZGlzY292ZXIgPSBzdGVwID09PSAwXG4gICAgY29uc3QgW3R5cGUsIHBzZXVkb10gPSBzZWxlY3Rvci5zcGxpdCgnOicpXG5cbiAgICB2YXIgdmFsaWRhdGUgPSBudWxsXG4gICAgdmFyIGluc3RydWN0aW9uID0gbnVsbFxuXG4gICAgc3dpdGNoICh0cnVlKSB7XG5cbiAgICAgIC8vIGNoaWxkOiAnPidcbiAgICAgIGNhc2UgLz4vLnRlc3QodHlwZSk6XG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tQYXJlbnQgKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gKHZhbGlkYXRlKSA9PiB2YWxpZGF0ZShub2RlLnBhcmVudCkgJiYgbm9kZS5wYXJlbnRcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyBjbGFzczogJy4nXG4gICAgICBjYXNlIC9eXFwuLy50ZXN0KHR5cGUpOlxuICAgICAgICBjb25zdCBuYW1lcyA9IHR5cGUuc3Vic3RyKDEpLnNwbGl0KCcuJylcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGVDbGFzc05hbWUgPSBub2RlLmF0dHJpYnMuY2xhc3NcbiAgICAgICAgICByZXR1cm4gbm9kZUNsYXNzTmFtZSAmJiBuYW1lcy5ldmVyeSgobmFtZSkgPT4gbm9kZUNsYXNzTmFtZS5pbmRleE9mKG5hbWUpID4gLTEpXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja0NsYXNzIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG5hbWVzLmpvaW4oJyAnKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykgPyBub2RlKHZhbGlkYXRlKSA6IGdldEFuY2VzdG9yKG5vZGUsIHJvb3QsIHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIGF0dHJpYnV0ZTogJ1trZXk9XCJ2YWx1ZVwiXSdcbiAgICAgIGNhc2UgL15cXFsvLnRlc3QodHlwZSk6XG4gICAgICAgIGNvbnN0IFthdHRyaWJ1dGVLZXksIGF0dHJpYnV0ZVZhbHVlXSA9IHR5cGUucmVwbGFjZSgvXFxbfFxcXXxcIi9nLCAnJykuc3BsaXQoJz0nKVxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzQXR0cmlidXRlID0gT2JqZWN0LmtleXMobm9kZS5hdHRyaWJzKS5pbmRleE9mKGF0dHJpYnV0ZUtleSkgPiAtMVxuICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUpIHsgLy8gcmVnYXJkIG9wdGlvbmFsIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZVZhbHVlIHx8IChub2RlLmF0dHJpYnNbYXR0cmlidXRlS2V5XSA9PT0gYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGUgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IE5vZGVMaXN0ID0gW11cbiAgICAgICAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW25vZGVdLCAoZGVzY2VuZGFudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsaWRhdGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICBOb2RlTGlzdC5wdXNoKGRlc2NlbmRhbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gTm9kZUxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykgPyBub2RlKHZhbGlkYXRlKSA6IGdldEFuY2VzdG9yKG5vZGUsIHJvb3QsIHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIGlkOiAnIydcbiAgICAgIGNhc2UgL14jLy50ZXN0KHR5cGUpOlxuICAgICAgICBjb25zdCBpZCA9IHR5cGUuc3Vic3RyKDEpXG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5hdHRyaWJzLmlkID09PSBpZFxuICAgICAgICB9XG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tJZCAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgY29uc3QgTm9kZUxpc3QgPSBbXVxuICAgICAgICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbbm9kZV0sIChkZXNjZW5kYW50LCBkb25lKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgIE5vZGVMaXN0LnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gdW5pdmVyc2FsOiAnKidcbiAgICAgIGNhc2UgL1xcKi8udGVzdCh0eXBlKTpcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4gdHJ1ZVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrVW5pdmVyc2FsIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQpID0+IE5vZGVMaXN0LnB1c2goZGVzY2VuZGFudCkpXG4gICAgICAgICAgICByZXR1cm4gTm9kZUxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykgPyBub2RlKHZhbGlkYXRlKSA6IGdldEFuY2VzdG9yKG5vZGUsIHJvb3QsIHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIHRhZzogJy4uLidcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5uYW1lID09PSB0eXBlXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja1RhZyAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgY29uc3QgTm9kZUxpc3QgPSBbXVxuICAgICAgICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbbm9kZV0sIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgIE5vZGVMaXN0LnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBzZXVkbykge1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uXG4gICAgfVxuXG4gICAgY29uc3QgcnVsZSA9IHBzZXVkby5tYXRjaCgvLShjaGlsZHx0eXBlKVxcKChcXGQrKVxcKSQvKVxuICAgIGNvbnN0IGtpbmQgPSBydWxlWzFdXG4gICAgY29uc3QgaW5kZXggPSBwYXJzZUludChydWxlWzJdLCAxMCkgLSAxXG5cbiAgICBjb25zdCB2YWxpZGF0ZVBzZXVkbyA9IChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB2YXIgY29tcGFyZVNldCA9IG5vZGUucGFyZW50LmNoaWxkVGFnc1xuICAgICAgICBpZiAoa2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgY29tcGFyZVNldCA9IGNvbXBhcmVTZXQuZmlsdGVyKHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IGNvbXBhcmVTZXQuZmluZEluZGV4KChjaGlsZCkgPT4gY2hpbGQgPT09IG5vZGUpXG4gICAgICAgIGlmIChub2RlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGVuaGFuY2VJbnN0cnVjdGlvbiAobm9kZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnN0cnVjdGlvbihub2RlKVxuICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgIHJldHVybiBtYXRjaC5yZWR1Y2UoKE5vZGVMaXN0LCBtYXRjaGVkTm9kZSkgPT4ge1xuICAgICAgICAgIGlmICh2YWxpZGF0ZVBzZXVkbyhtYXRjaGVkTm9kZSkpIHtcbiAgICAgICAgICAgIE5vZGVMaXN0LnB1c2gobWF0Y2hlZE5vZGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICB9LCBbXSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0ZVBzZXVkbyhtYXRjaCkgJiYgbWF0Y2hcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogV2Fsa2luZyByZWN1cnNpdmUgdG8gaW52b2tlIGNhbGxiYWNrc1xuICpcbiAqIEBwYXJhbSB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gbm9kZXMgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259ICAgICAgICAgICAgaGFuZGxlciAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VEZXNjZW5kYW50cyAobm9kZXMsIGhhbmRsZXIpIHtcbiAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgIHZhciBwcm9ncmVzcyA9IHRydWVcbiAgICBoYW5kbGVyKG5vZGUsICgpID0+IHByb2dyZXNzID0gZmFsc2UpXG4gICAgaWYgKG5vZGUuY2hpbGRUYWdzICYmIHByb2dyZXNzKSB7XG4gICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKG5vZGUuY2hpbGRUYWdzLCBoYW5kbGVyKVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBCdWJibGUgdXAgZnJvbSBib3R0b20gdG8gdG9wXG4gKlxuICogQHBhcmFtICB7SFRNTEVMZW1lbnR9IG5vZGUgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVMZW1lbnR9IHJvb3QgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7RnVuY3Rpb259ICAgIHZhbGlkYXRlIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7SFRNTEVMZW1lbnR9ICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRBbmNlc3RvciAobm9kZSwgcm9vdCwgdmFsaWRhdGUpIHtcbiAgd2hpbGUgKG5vZGUucGFyZW50KSB7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50XG4gICAgaWYgKHZhbGlkYXRlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gcm9vdCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9hZGFwdC5qcyIsIi8qKlxuICogIyBTZWxlY3RcbiAqXG4gKiBDb25zdHJ1Y3QgYSB1bmlxdWUgQ1NTIHF1ZXJ5IHNlbGVjdG9yIHRvIGFjY2VzcyB0aGUgc2VsZWN0ZWQgRE9NIGVsZW1lbnQocykuXG4gKiBGb3IgbG9uZ2V2aXR5IGl0IGFwcGxpZXMgZGlmZmVyZW50IG1hdGNoaW5nIGFuZCBvcHRpbWl6YXRpb24gc3RyYXRlZ2llcy5cbiAqL1xuXG5pbXBvcnQgYWRhcHQgZnJvbSAnLi9hZGFwdCdcbmltcG9ydCBtYXRjaCBmcm9tICcuL21hdGNoJ1xuaW1wb3J0IG9wdGltaXplIGZyb20gJy4vb3B0aW1pemUnXG5pbXBvcnQgeyBjb252ZXJ0Tm9kZUxpc3QgfSBmcm9tICcuL3V0aWxpdGllcydcbmltcG9ydCB7IGdldENvbW1vbkFuY2VzdG9yLCBnZXRDb21tb25Qcm9wZXJ0aWVzIH0gZnJvbSAnLi9jb21tb24nXG5cbi8qKlxuICogR2V0IGEgc2VsZWN0b3IgZm9yIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgb3B0aW9ucyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2luZ2xlU2VsZWN0b3IgKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAzKSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZVxuICB9XG5cbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgLSBvbmx5IEhUTUxFbGVtZW50cyBvciByZXByZXNlbnRhdGlvbnMgb2YgdGhlbSBhcmUgc3VwcG9ydGVkISAobm90IFwiJHt0eXBlb2YgZWxlbWVudH1cIilgKVxuICB9XG5cbiAgY29uc3QgZ2xvYmFsTW9kaWZpZWQgPSBhZGFwdChlbGVtZW50LCBvcHRpb25zKVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gbWF0Y2goZWxlbWVudCwgb3B0aW9ucylcbiAgY29uc3Qgb3B0aW1pemVkID0gb3B0aW1pemUoc2VsZWN0b3IsIGVsZW1lbnQsIG9wdGlvbnMpXG5cbiAgLy8gZGVidWdcbiAgLy8gY29uc29sZS5sb2coYFxuICAvLyAgIHNlbGVjdG9yOiAgJHtzZWxlY3Rvcn1cbiAgLy8gICBvcHRpbWl6ZWQ6ICR7b3B0aW1pemVkfVxuICAvLyBgKVxuXG4gIGlmIChnbG9iYWxNb2RpZmllZCkge1xuICAgIGRlbGV0ZSBnbG9iYWwuZG9jdW1lbnRcbiAgfVxuXG4gIHJldHVybiBvcHRpbWl6ZWRcbn1cblxuLyoqXG4gKiBHZXQgYSBzZWxlY3RvciB0byBtYXRjaCBtdWx0aXBsZSBkZXNjZW5kYW50cyBmcm9tIGFuIGFuY2VzdG9yXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50PnxOb2RlTGlzdH0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXVsdGlTZWxlY3RvciAoZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50cykpIHtcbiAgICBlbGVtZW50cyA9IGNvbnZlcnROb2RlTGlzdChlbGVtZW50cylcbiAgfVxuXG4gIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCAtIG9ubHkgYW4gQXJyYXkgb2YgSFRNTEVsZW1lbnRzIG9yIHJlcHJlc2VudGF0aW9ucyBvZiB0aGVtIGlzIHN1cHBvcnRlZCFgKVxuICB9XG5cbiAgY29uc3QgZ2xvYmFsTW9kaWZpZWQgPSBhZGFwdChlbGVtZW50c1swXSwgb3B0aW9ucylcblxuICBjb25zdCBhbmNlc3RvciA9IGdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnRzLCBvcHRpb25zKVxuICBjb25zdCBhbmNlc3RvclNlbGVjdG9yID0gZ2V0U2luZ2xlU2VsZWN0b3IoYW5jZXN0b3IsIG9wdGlvbnMpXG5cbiAgLy8gVE9ETzogY29uc2lkZXIgdXNhZ2Ugb2YgbXVsdGlwbGUgc2VsZWN0b3JzICsgcGFyZW50LWNoaWxkIHJlbGF0aW9uICsgY2hlY2sgZm9yIHBhcnQgcmVkdW5kYW5jeVxuICBjb25zdCBjb21tb25TZWxlY3RvcnMgPSBnZXRDb21tb25TZWxlY3RvcnMoZWxlbWVudHMpXG4gIGNvbnN0IGRlc2NlbmRhbnRTZWxlY3RvciA9IGNvbW1vblNlbGVjdG9yc1swXVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gb3B0aW1pemUoYCR7YW5jZXN0b3JTZWxlY3Rvcn0gJHtkZXNjZW5kYW50U2VsZWN0b3J9YCwgZWxlbWVudHMsIG9wdGlvbnMpXG4gIGNvbnN0IHNlbGVjdG9yTWF0Y2hlcyA9IGNvbnZlcnROb2RlTGlzdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSlcblxuICBpZiAoIWVsZW1lbnRzLmV2ZXJ5KChlbGVtZW50KSA9PiBzZWxlY3Rvck1hdGNoZXMuc29tZSgoZW50cnkpID0+IGVudHJ5ID09PSBlbGVtZW50KSApKSB7XG4gICAgLy8gVE9ETzogY2x1c3RlciBtYXRjaGVzIHRvIHNwbGl0IGludG8gc2ltaWxhciBncm91cHMgZm9yIHN1YiBzZWxlY3Rpb25zXG4gICAgcmV0dXJuIGNvbnNvbGUud2FybihgXG4gICAgICBUaGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuXFwndCBiZSBlZmZpY2llbnRseSBtYXBwZWQuXG4gICAgICBJdHMgcHJvYmFibHkgYmVzdCB0byB1c2UgbXVsdGlwbGUgc2luZ2xlIHNlbGVjdG9ycyBpbnN0ZWFkIVxuICAgIGAsIGVsZW1lbnRzKVxuICB9XG5cbiAgaWYgKGdsb2JhbE1vZGlmaWVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudFxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbi8qKlxuICogR2V0IHNlbGVjdG9ycyB0byBkZXNjcmliZSBhIHNldCBvZiBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudHM+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tbW9uU2VsZWN0b3JzIChlbGVtZW50cykge1xuXG4gIGNvbnN0IHsgY2xhc3NlcywgYXR0cmlidXRlcywgdGFnIH0gPSBnZXRDb21tb25Qcm9wZXJ0aWVzKGVsZW1lbnRzKVxuXG4gIGNvbnN0IHNlbGVjdG9yUGF0aCA9IFtdXG5cbiAgaWYgKHRhZykge1xuICAgIHNlbGVjdG9yUGF0aC5wdXNoKHRhZylcbiAgfVxuXG4gIGlmIChjbGFzc2VzKSB7XG4gICAgY29uc3QgY2xhc3NTZWxlY3RvciA9IGNsYXNzZXMubWFwKChuYW1lKSA9PiBgLiR7bmFtZX1gKS5qb2luKCcnKVxuICAgIHNlbGVjdG9yUGF0aC5wdXNoKGNsYXNzU2VsZWN0b3IpXG4gIH1cblxuICBpZiAoYXR0cmlidXRlcykge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVNlbGVjdG9yID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKChwYXJ0cywgbmFtZSkgPT4ge1xuICAgICAgcGFydHMucHVzaChgWyR7bmFtZX09XCIke2F0dHJpYnV0ZXNbbmFtZV19XCJdYClcbiAgICAgIHJldHVybiBwYXJ0c1xuICAgIH0sIFtdKS5qb2luKCcnKVxuICAgIHNlbGVjdG9yUGF0aC5wdXNoKGF0dHJpYnV0ZVNlbGVjdG9yKVxuICB9XG5cbiAgaWYgKHNlbGVjdG9yUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBUT0RPOiBjaGVjayBmb3IgcGFyZW50LWNoaWxkIHJlbGF0aW9uXG4gIH1cblxuICByZXR1cm4gW1xuICAgIHNlbGVjdG9yUGF0aC5qb2luKCcnKVxuICBdXG59XG5cbi8qKlxuICogQ2hvb3NlIGFjdGlvbiBkZXBlbmRpbmcgb24gdGhlIGlucHV0IChtdWx0aXBsZS9zaW5nbGUpXG4gKlxuICogTk9URTogZXh0ZW5kZWQgZGV0ZWN0aW9uIGlzIHVzZWQgZm9yIHNwZWNpYWwgY2FzZXMgbGlrZSB0aGUgPHNlbGVjdD4gZWxlbWVudCB3aXRoIDxvcHRpb25zPlxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fE5vZGVMaXN0fEFycmF5LjxIVE1MRWxlbWVudD59IGlucHV0ICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UXVlcnlTZWxlY3RvciAoaW5wdXQsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoaW5wdXQubGVuZ3RoICYmICFpbnB1dC5uYW1lKSB7XG4gICAgcmV0dXJuIGdldE11bHRpU2VsZWN0b3IoaW5wdXQsIG9wdGlvbnMpXG4gIH1cbiAgcmV0dXJuIGdldFNpbmdsZVNlbGVjdG9yKGlucHV0LCBvcHRpb25zKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NlbGVjdC5qcyIsIi8qKlxuICogIyBNYXRjaFxuICpcbiAqIFJldHJpZXZlIHNlbGVjdG9yIGZvciBhIG5vZGUuXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlVmFsdWUgfSBmcm9tICcuL3V0aWxpdGllcydcblxuY29uc3QgZGVmYXVsdElnbm9yZSA9IHtcbiAgYXR0cmlidXRlIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdzdHlsZScsXG4gICAgICAnZGF0YS1yZWFjdGlkJyxcbiAgICAgICdkYXRhLXJlYWN0LWNoZWNrc3VtJ1xuICAgIF0uaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+IC0xXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gbm9kZSAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICBvcHRpb25zIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoIChub2RlLCBvcHRpb25zKSB7XG5cbiAgY29uc3Qge1xuICAgIHJvb3QgPSBkb2N1bWVudCxcbiAgICBza2lwID0gbnVsbCxcbiAgICBwcmlvcml0eSA9IFsnaWQnLCAnY2xhc3MnLCAnaHJlZicsICdzcmMnXSxcbiAgICBpZ25vcmUgPSB7fVxuICB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHBhdGggPSBbXVxuICB2YXIgZWxlbWVudCA9IG5vZGVcbiAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoXG4gIHZhciBpZ25vcmVDbGFzcyA9IGZhbHNlXG5cbiAgY29uc3Qgc2tpcENvbXBhcmUgPSBza2lwICYmIChBcnJheS5pc0FycmF5KHNraXApID8gc2tpcCA6IFtza2lwXSkubWFwKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAoZWxlbWVudCkgPT4gZWxlbWVudCA9PT0gZW50cnlcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5XG4gIH0pXG5cbiAgY29uc3Qgc2tpcENoZWNrcyA9IChlbGVtZW50KSA9PiB7XG4gICAgcmV0dXJuIHNraXAgJiYgc2tpcENvbXBhcmUuc29tZSgoY29tcGFyZSkgPT4gY29tcGFyZShlbGVtZW50KSlcbiAgfVxuXG4gIE9iamVjdC5rZXlzKGlnbm9yZSkuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgIGlmICh0eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICBpZ25vcmVDbGFzcyA9IHRydWVcbiAgICB9XG4gICAgdmFyIHByZWRpY2F0ZSA9IGlnbm9yZVt0eXBlXVxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnZnVuY3Rpb24nKSByZXR1cm5cbiAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZS50b1N0cmluZygpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgcHJlZGljYXRlID0gbmV3IFJlZ0V4cChlc2NhcGVWYWx1ZShwcmVkaWNhdGUpLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZSA/IC8oPzopLyA6IC8uXi9cbiAgICB9XG4gICAgLy8gY2hlY2sgY2xhc3MtL2F0dHJpYnV0ZW5hbWUgZm9yIHJlZ2V4XG4gICAgaWdub3JlW3R5cGVdID0gKG5hbWUsIHZhbHVlKSA9PiBwcmVkaWNhdGUudGVzdCh2YWx1ZSlcbiAgfSlcblxuICBpZiAoaWdub3JlQ2xhc3MpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRyaWJ1dGUgPSBpZ25vcmUuYXR0cmlidXRlXG4gICAgaWdub3JlLmF0dHJpYnV0ZSA9IChuYW1lLCB2YWx1ZSwgZGVmYXVsdFByZWRpY2F0ZSkgPT4ge1xuICAgICAgcmV0dXJuIGlnbm9yZS5jbGFzcyh2YWx1ZSkgfHwgaWdub3JlQXR0cmlidXRlICYmIGlnbm9yZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgZGVmYXVsdFByZWRpY2F0ZSlcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoZWxlbWVudCAhPT0gcm9vdCkge1xuICAgIGlmIChza2lwQ2hlY2tzKGVsZW1lbnQpICE9PSB0cnVlKSB7XG4gICAgICAvLyB+IGdsb2JhbFxuICAgICAgaWYgKGNoZWNrQXR0cmlidXRlcyhwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoLCByb290KSkgYnJlYWtcbiAgICAgIGlmIChjaGVja1RhZyhlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHJvb3QpKSBicmVha1xuXG4gICAgICAvLyB+IGxvY2FsXG4gICAgICBjaGVja0F0dHJpYnV0ZXMocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aClcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGNoZWNrVGFnKGVsZW1lbnQsIGlnbm9yZSwgcGF0aClcbiAgICAgIH1cblxuICAgICAgLy8gZGVmaW5lIG9ubHkgb25lIHBhcnQgZWFjaCBpdGVyYXRpb25cbiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGNoZWNrQ2hpbGRzKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZVxuICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoXG4gIH1cblxuICBpZiAoZWxlbWVudCA9PT0gcm9vdCkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBmaW5kUGF0dGVybihwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKVxuICAgIHBhdGgudW5zaGlmdChwYXR0ZXJuKVxuICB9XG5cbiAgcmV0dXJuIHBhdGguam9pbignICcpXG59XG5cbi8qKlxuICogRXh0ZW5kIHBhdGggd2l0aCBhdHRyaWJ1dGUgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcmlvcml0eSAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwYXRoICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBwYXJlbnQgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVzIChwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoLCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgY29uc3QgcGF0dGVybiA9IGZpbmRBdHRyaWJ1dGVzUGF0dGVybihwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKVxuICBpZiAocGF0dGVybikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcGF0aC51bnNoaWZ0KHBhdHRlcm4pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBMb29rdXAgYXR0cmlidXRlIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJpb3JpdHkgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgZWxlbWVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgaWdub3JlICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmc/fSAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVzUGF0dGVybiAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSkge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzXG4gIGNvbnN0IHNvcnRlZEtleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5zb3J0KChjdXJyLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgY3VyclBvcyA9IHByaW9yaXR5LmluZGV4T2YoYXR0cmlidXRlc1tjdXJyXS5uYW1lKVxuICAgIGNvbnN0IG5leHRQb3MgPSBwcmlvcml0eS5pbmRleE9mKGF0dHJpYnV0ZXNbbmV4dF0ubmFtZSlcbiAgICBpZiAobmV4dFBvcyA9PT0gLTEpIHtcbiAgICAgIGlmIChjdXJyUG9zID09PSAtMSkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBjdXJyUG9zIC0gbmV4dFBvc1xuICB9KVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc29ydGVkS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzb3J0ZWRLZXlzW2ldXG4gICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1trZXldXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5uYW1lXG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBlc2NhcGVWYWx1ZShhdHRyaWJ1dGUudmFsdWUpXG5cbiAgICBjb25zdCBjdXJyZW50SWdub3JlID0gaWdub3JlW2F0dHJpYnV0ZU5hbWVdIHx8IGlnbm9yZS5hdHRyaWJ1dGVcbiAgICBjb25zdCBjdXJyZW50RGVmYXVsdElnbm9yZSA9IGRlZmF1bHRJZ25vcmVbYXR0cmlidXRlTmFtZV0gfHwgZGVmYXVsdElnbm9yZS5hdHRyaWJ1dGVcbiAgICBpZiAoY2hlY2tJZ25vcmUoY3VycmVudElnbm9yZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGN1cnJlbnREZWZhdWx0SWdub3JlKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB2YXIgcGF0dGVybiA9IGBbJHthdHRyaWJ1dGVOYW1lfT1cIiR7YXR0cmlidXRlVmFsdWV9XCJdYFxuXG4gICAgaWYgKCgvXFxiXFxkLykudGVzdChhdHRyaWJ1dGVWYWx1ZSkgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2lkJykge1xuICAgICAgICBwYXR0ZXJuID0gYCMke2F0dHJpYnV0ZVZhbHVlfWBcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gYXR0cmlidXRlVmFsdWUudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJy4nKVxuICAgICAgICBwYXR0ZXJuID0gYC4ke2NsYXNzTmFtZX1gXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdHRlcm5cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEV4dGVuZCBwYXRoIHdpdGggdGFnIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgZWxlbWVudCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHBhdGggICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgcGFyZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja1RhZyAoZWxlbWVudCwgaWdub3JlLCBwYXRoLCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgY29uc3QgcGF0dGVybiA9IGZpbmRUYWdQYXR0ZXJuKGVsZW1lbnQsIGlnbm9yZSlcbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBjb25zdCBtYXRjaGVzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHBhdHRlcm4pXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIExvb2t1cCB0YWcgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIGlnbm9yZSAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZmluZFRhZ1BhdHRlcm4gKGVsZW1lbnQsIGlnbm9yZSkge1xuICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgaWYgKGNoZWNrSWdub3JlKGlnbm9yZS50YWcsIG51bGwsIHRhZ05hbWUpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gdGFnTmFtZVxufVxuXG4vKipcbiAqIEV4dGVuZCBwYXRoIHdpdGggc3BlY2lmaWMgY2hpbGQgaWRlbnRpZmllclxuICpcbiAqIE5PVEU6ICdjaGlsZFRhZ3MnIGlzIGEgY3VzdG9tIHByb3BlcnR5IHRvIHVzZSBhcyBhIHZpZXcgZmlsdGVyIGZvciB0YWdzIHVzaW5nICdhZGFwdGVyLmpzJ1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcmlvcml0eSAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwYXRoICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY2hlY2tDaGlsZHMgKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgpIHtcbiAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50LmNoaWxkVGFncyB8fCBwYXJlbnQuY2hpbGRyZW5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgaWYgKGNoaWxkID09PSBlbGVtZW50KSB7XG4gICAgICBjb25zdCBjaGlsZFBhdHRlcm4gPSBmaW5kUGF0dGVybihwcmlvcml0eSwgY2hpbGQsIGlnbm9yZSlcbiAgICAgIGlmICghY2hpbGRQYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oYFxuICAgICAgICAgIEVsZW1lbnQgY291bGRuXFwndCBiZSBtYXRjaGVkIHRocm91Z2ggc3RyaWN0IGlnbm9yZSBwYXR0ZXJuIVxuICAgICAgICBgLCBjaGlsZCwgaWdub3JlLCBjaGlsZFBhdHRlcm4pXG4gICAgICB9XG4gICAgICBjb25zdCBwYXR0ZXJuID0gYD4gJHtjaGlsZFBhdHRlcm59Om50aC1jaGlsZCgke2krMX0pYFxuICAgICAgcGF0aC51bnNoaWZ0KHBhdHRlcm4pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBMb29rdXAgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcmlvcml0eSAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZmluZFBhdHRlcm4gKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpIHtcbiAgdmFyIHBhdHRlcm4gPSBmaW5kQXR0cmlidXRlc1BhdHRlcm4ocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSlcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcGF0dGVybiA9IGZpbmRUYWdQYXR0ZXJuKGVsZW1lbnQsIGlnbm9yZSlcbiAgfVxuICByZXR1cm4gcGF0dGVyblxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHdpdGggY3VzdG9tIGFuZCBkZWZhdWx0IGZ1bmN0aW9uc1xuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBwcmVkaWNhdGUgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7c3RyaW5nP30gIG5hbWUgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdmFsdWUgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBkZWZhdWx0UHJlZGljYXRlIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNoZWNrSWdub3JlIChwcmVkaWNhdGUsIG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGNvbnN0IGNoZWNrID0gcHJlZGljYXRlIHx8IGRlZmF1bHRQcmVkaWNhdGVcbiAgaWYgKCFjaGVjaykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBjaGVjayhuYW1lLCB2YWx1ZSwgZGVmYXVsdFByZWRpY2F0ZSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tYXRjaC5qcyIsImV4cG9ydCBzZWxlY3QsIHsgZ2V0U2luZ2xlU2VsZWN0b3IsIGdldE11bHRpU2VsZWN0b3IgfSBmcm9tICcuL3NlbGVjdCdcbmV4cG9ydCBvcHRpbWl6ZSBmcm9tICcuL29wdGltaXplJ1xuZXhwb3J0ICogYXMgY29tbW9uIGZyb20gJy4vY29tbW9uJ1xuXG5leHBvcnQgZGVmYXVsdCBmcm9tICcuL3NlbGVjdCdcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA1M2IyNDM5NmViY2IyZTUwZDJiOCIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbGl0aWVzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL29wdGltaXplLmpzIiwid2VicGFjazovLy8uL3NyYy9hZGFwdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiXSwibmFtZXMiOlsiY29udmVydE5vZGVMaXN0IiwiZXNjYXBlVmFsdWUiLCJub2RlcyIsImxlbmd0aCIsImFyciIsIkFycmF5IiwiaSIsInZhbHVlIiwicmVwbGFjZSIsImdldENvbW1vbkFuY2VzdG9yIiwiZ2V0Q29tbW9uUHJvcGVydGllcyIsImVsZW1lbnRzIiwib3B0aW9ucyIsInJvb3QiLCJkb2N1bWVudCIsImFuY2VzdG9ycyIsImZvckVhY2giLCJlbGVtZW50IiwiaW5kZXgiLCJwYXJlbnRzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJzb3J0IiwiY3VyciIsIm5leHQiLCJzaGFsbG93QW5jZXN0b3IiLCJzaGlmdCIsImFuY2VzdG9yIiwicGFyZW50IiwibWlzc2luZyIsInNvbWUiLCJvdGhlclBhcmVudHMiLCJvdGhlclBhcmVudCIsImwiLCJjb21tb25Qcm9wZXJ0aWVzIiwiY2xhc3NlcyIsImF0dHJpYnV0ZXMiLCJ0YWciLCJjb21tb25DbGFzc2VzIiwiY29tbW9uQXR0cmlidXRlcyIsImNvbW1vblRhZyIsInVuZGVmaW5lZCIsImdldEF0dHJpYnV0ZSIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImVudHJ5IiwibmFtZSIsImVsZW1lbnRBdHRyaWJ1dGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImtleSIsImF0dHJpYnV0ZSIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVzTmFtZXMiLCJjb21tb25BdHRyaWJ1dGVzTmFtZXMiLCJuZXh0Q29tbW9uQXR0cmlidXRlcyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsIm9wdGltaXplIiwic2VsZWN0b3IiLCJpc0FycmF5Iiwibm9kZVR5cGUiLCJFcnJvciIsImdsb2JhbE1vZGlmaWVkIiwicGF0aCIsIm9wdGltaXplUGFydCIsInNob3J0ZW5lZCIsInBvcCIsImN1cnJlbnQiLCJwcmVQYXJ0Iiwiam9pbiIsInBvc3RQYXJ0IiwicGF0dGVybiIsIm1hdGNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwic2xpY2UiLCJ0ZXN0IiwiY29tcGFyZVJlc3VsdHMiLCJyZWZlcmVuY2VzIiwicmVmZXJlbmNlIiwiY29udGFpbnMiLCJkZXNjcmlwdGlvbiIsImRlc2NlbmRhbnQiLCJ0eXBlIiwibmFtZXMiLCJtYXAiLCJwYXJ0aWFsIiwiY2hhckF0IiwibWF0Y2giLCJldmVyeSIsImFkYXB0IiwiZ2xvYmFsIiwiY29udGV4dCIsIkVsZW1lbnRQcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImNoaWxkcmVuIiwibm9kZSIsImF0dHJpYnMiLCJOYW1lZE5vZGVNYXAiLCJjb25maWd1cmFibGUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIkhUTUxDb2xsZWN0aW9uIiwidHJhdmVyc2VEZXNjZW5kYW50cyIsImNoaWxkVGFncyIsInB1c2giLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiZGVzY2VuZGFudENsYXNzTmFtZSIsImNsYXNzIiwiaW5kZXhPZiIsInNlbGVjdG9ycyIsImluc3RydWN0aW9ucyIsImdldEluc3RydWN0aW9ucyIsImRpc2NvdmVyIiwidG90YWwiLCJzdGVwIiwiaW5jbHVzaXZlIiwiZG9uZSIsInJldmVyc2UiLCJwc2V1ZG8iLCJ2YWxpZGF0ZSIsImluc3RydWN0aW9uIiwiY2hlY2tQYXJlbnQiLCJzdWJzdHIiLCJub2RlQ2xhc3NOYW1lIiwiY2hlY2tDbGFzcyIsImdldEFuY2VzdG9yIiwiYXR0cmlidXRlS2V5IiwiYXR0cmlidXRlVmFsdWUiLCJoYXNBdHRyaWJ1dGUiLCJjaGVja0F0dHJpYnV0ZSIsIk5vZGVMaXN0IiwiaWQiLCJjaGVja0lkIiwiY2hlY2tVbml2ZXJzYWwiLCJjaGVja1RhZyIsInJ1bGUiLCJraW5kIiwicGFyc2VJbnQiLCJ2YWxpZGF0ZVBzZXVkbyIsImNvbXBhcmVTZXQiLCJub2RlSW5kZXgiLCJmaW5kSW5kZXgiLCJjaGlsZCIsImVuaGFuY2VJbnN0cnVjdGlvbiIsIm1hdGNoZWROb2RlIiwiaGFuZGxlciIsInByb2dyZXNzIiwiZ2V0U2luZ2xlU2VsZWN0b3IiLCJnZXRNdWx0aVNlbGVjdG9yIiwiZ2V0UXVlcnlTZWxlY3RvciIsIm9wdGltaXplZCIsImFuY2VzdG9yU2VsZWN0b3IiLCJjb21tb25TZWxlY3RvcnMiLCJnZXRDb21tb25TZWxlY3RvcnMiLCJkZXNjZW5kYW50U2VsZWN0b3IiLCJzZWxlY3Rvck1hdGNoZXMiLCJjb25zb2xlIiwid2FybiIsInNlbGVjdG9yUGF0aCIsImNsYXNzU2VsZWN0b3IiLCJhdHRyaWJ1dGVTZWxlY3RvciIsInBhcnRzIiwiaW5wdXQiLCJkZWZhdWx0SWdub3JlIiwic2tpcCIsInByaW9yaXR5IiwiaWdub3JlIiwiaWdub3JlQ2xhc3MiLCJza2lwQ29tcGFyZSIsInNraXBDaGVja3MiLCJjb21wYXJlIiwicHJlZGljYXRlIiwidG9TdHJpbmciLCJSZWdFeHAiLCJpZ25vcmVBdHRyaWJ1dGUiLCJkZWZhdWx0UHJlZGljYXRlIiwiY2hlY2tBdHRyaWJ1dGVzIiwiY2hlY2tDaGlsZHMiLCJmaW5kUGF0dGVybiIsImZpbmRBdHRyaWJ1dGVzUGF0dGVybiIsInNvcnRlZEtleXMiLCJjdXJyUG9zIiwibmV4dFBvcyIsImN1cnJlbnRJZ25vcmUiLCJjdXJyZW50RGVmYXVsdElnbm9yZSIsImNoZWNrSWdub3JlIiwiZmluZFRhZ1BhdHRlcm4iLCJjaGlsZFBhdHRlcm4iLCJjaGVjayIsInNlbGVjdCIsImNvbW1vbiIsImRlZmF1bHQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztRQ3BEZ0JBLGUsR0FBQUEsZTtRQWlCQUMsVyxHQUFBQSxXO0FBN0JoQjs7Ozs7O0FBTUE7Ozs7OztBQU1PLFNBQVNELGVBQVQsQ0FBMEJFLEtBQTFCLEVBQWlDO0FBQUEsTUFDOUJDLE1BRDhCLEdBQ25CRCxLQURtQixDQUM5QkMsTUFEOEI7O0FBRXRDLE1BQU1DLE1BQU0sSUFBSUMsS0FBSixDQUFVRixNQUFWLENBQVo7QUFDQSxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUgsTUFBcEIsRUFBNEJHLEdBQTVCLEVBQWlDO0FBQy9CRixRQUFJRSxDQUFKLElBQVNKLE1BQU1JLENBQU4sQ0FBVDtBQUNEO0FBQ0QsU0FBT0YsR0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNILFdBQVQsQ0FBc0JNLEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU9BLFNBQVNBLE1BQU1D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QyxFQUE4QytLLGdCQUE5QyxFQUFnRTtBQUM5RCxNQUFJLENBQUMvSyxLQUFMLEVBQVk7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNELE1BQU00TCxRQUFRakIsYUFBYUksZ0JBQTNCO0FBQ0EsTUFBSSxDQUFDYSxLQUFMLEVBQVk7QUFDVixXQUFPLEtBQVA7QUFDRDtBQUNELFNBQU9BLE1BQU1wSixJQUFOLEVBQVl4QyxLQUFaLEVBQW1CK0ssZ0JBQW5CLENBQVA7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JDelJnQjVCLGlCOzs7Ozs7b0JBQW1CQyxnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBQTdCeUMsTTtRQUNBeEksUTtRQUNLeUksTTtRQUVMQyxPIiwiZmlsZSI6Im9wdGltYWwtc2VsZWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiT3B0aW1hbFNlbGVjdFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJPcHRpbWFsU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDUzYjI0Mzk2ZWJjYjJlNTBkMmI4IiwiLyoqXG4gKiAjIFV0aWxpdGllc1xuICpcbiAqIENvbnZlbmllbmNlIGhlbHBlcnMuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgRE9NIG5vZGVzIG9mIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtICB7Tm9kZUxpc3R9ICAgICAgICAgICAgIG5vZGVzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE5vZGVMaXN0IChub2Rlcykge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gbm9kZXNcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IG5vZGVzW2ldXG4gIH1cbiAgcmV0dXJuIGFyclxufVxuXG4vKipcbiAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGxpbmUgYnJlYWtzIGFzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mICdDU1MuZXNjYXBlKCknXG4gKlxuICogRGVzY3JpcHRpb24gb2YgdmFsaWQgY2hhcmFjdGVyczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2Nzcy1lc2NhcGVzXG4gKlxuICogQHBhcmFtICB7U3RyaW5nP30gdmFsdWUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVZhbHVlICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUucmVwbGFjZSgvWydcImBcXFxcLzpcXD8mISMkJV4oKVtcXF17fH0qKzssLjw9PkB+XS9nLCAnXFxcXCQmJylcbiAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnJyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdXRpbGl0aWVzLmpzIiwiLyoqXG4gKiAjIENvbW1vblxuICpcbiAqIFByb2Nlc3MgY29sbGVjdGlvbnMgZm9yIHNpbWlsYXJpdGllcy5cbiAqL1xuXG4vKipcbiAqIEZpbmQgdGhlIGxhc3QgY29tbW9uIGFuY2VzdG9yIG9mIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50cz59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uQW5jZXN0b3IgKGVsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcblxuICBjb25zdCB7XG4gICAgcm9vdCA9IGRvY3VtZW50XG4gIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgYW5jZXN0b3JzID0gW11cblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxuICAgIHdoaWxlIChlbGVtZW50ICE9PSByb290KSB7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gICAgICBwYXJlbnRzLnVuc2hpZnQoZWxlbWVudClcbiAgICB9XG4gICAgYW5jZXN0b3JzW2luZGV4XSA9IHBhcmVudHNcbiAgfSlcblxuICBhbmNlc3RvcnMuc29ydCgoY3VyciwgbmV4dCkgPT4gY3Vyci5sZW5ndGggLSBuZXh0Lmxlbmd0aClcblxuICBjb25zdCBzaGFsbG93QW5jZXN0b3IgPSBhbmNlc3RvcnMuc2hpZnQoKVxuXG4gIHZhciBhbmNlc3RvciA9IG51bGxcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHNoYWxsb3dBbmNlc3Rvci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBwYXJlbnQgPSBzaGFsbG93QW5jZXN0b3JbaV1cbiAgICBjb25zdCBtaXNzaW5nID0gYW5jZXN0b3JzLnNvbWUoKG90aGVyUGFyZW50cykgPT4ge1xuICAgICAgcmV0dXJuICFvdGhlclBhcmVudHMuc29tZSgob3RoZXJQYXJlbnQpID0+IG90aGVyUGFyZW50ID09PSBwYXJlbnQpXG4gICAgfSlcblxuICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAvLyBUT0RPOiBmaW5kIHNpbWlsYXIgc3ViLXBhcmVudHMsIG5vdCB0aGUgdG9wIHJvb3QsIGUuZy4gc2hhcmluZyBhIGNsYXNzIHNlbGVjdG9yXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGFuY2VzdG9yID0gcGFyZW50XG4gIH1cblxuICByZXR1cm4gYW5jZXN0b3Jcbn1cblxuLyoqXG4gKiBHZXQgYSBzZXQgb2YgY29tbW9uIHByb3BlcnRpZXMgb2YgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUHJvcGVydGllcyAoZWxlbWVudHMpIHtcblxuICBjb25zdCBjb21tb25Qcm9wZXJ0aWVzID0ge1xuICAgIGNsYXNzZXM6IFtdLFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIHRhZzogbnVsbFxuICB9XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuXG4gICAgdmFyIHtcbiAgICAgIGNsYXNzZXM6IGNvbW1vbkNsYXNzZXMsXG4gICAgICBhdHRyaWJ1dGVzOiBjb21tb25BdHRyaWJ1dGVzLFxuICAgICAgdGFnOiBjb21tb25UYWdcbiAgICB9ID0gY29tbW9uUHJvcGVydGllc1xuXG4gICAgLy8gfiBjbGFzc2VzXG4gICAgaWYgKGNvbW1vbkNsYXNzZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNsYXNzZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgaWYgKGNsYXNzZXMpIHtcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMudHJpbSgpLnNwbGl0KCcgJylcbiAgICAgICAgaWYgKCFjb21tb25DbGFzc2VzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuY2xhc3NlcyA9IGNsYXNzZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tb25DbGFzc2VzID0gY29tbW9uQ2xhc3Nlcy5maWx0ZXIoKGVudHJ5KSA9PiBjbGFzc2VzLnNvbWUoKG5hbWUpID0+IG5hbWUgPT09IGVudHJ5KSlcbiAgICAgICAgICBpZiAoY29tbW9uQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuY2xhc3NlcyA9IGNvbW1vbkNsYXNzZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuY2xhc3Nlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogcmVzdHJ1Y3R1cmUgcmVtb3ZhbCBhcyAyeCBzZXQgLyAyeCBkZWxldGUsIGluc3RlYWQgb2YgbW9kaWZ5IGFsd2F5cyByZXBsYWNpbmcgd2l0aCBuZXcgY29sbGVjdGlvblxuICAgICAgICBkZWxldGUgY29tbW9uUHJvcGVydGllcy5jbGFzc2VzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gfiBhdHRyaWJ1dGVzXG4gICAgaWYgKGNvbW1vbkF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZWxlbWVudEF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhlbGVtZW50QXR0cmlidXRlcykucmVkdWNlKChhdHRyaWJ1dGVzLCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWxlbWVudEF0dHJpYnV0ZXNba2V5XVxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5hbWVcbiAgICAgICAgLy8gTk9URTogd29ya2Fyb3VuZCBkZXRlY3Rpb24gZm9yIG5vbi1zdGFuZGFyZCBwaGFudG9tanMgTmFtZWROb2RlTWFwIGJlaGF2aW91clxuICAgICAgICAvLyAoaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvaXNzdWVzLzE0NjM0KVxuICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZU5hbWUgIT09ICdjbGFzcycpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gYXR0cmlidXRlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICAgIH0sIHt9KVxuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKVxuICAgICAgY29uc3QgY29tbW9uQXR0cmlidXRlc05hbWVzID0gT2JqZWN0LmtleXMoY29tbW9uQXR0cmlidXRlcylcblxuICAgICAgaWYgKGF0dHJpYnV0ZXNOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFjb21tb25BdHRyaWJ1dGVzTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29tbW9uUHJvcGVydGllcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1vbkF0dHJpYnV0ZXMgPSBjb21tb25BdHRyaWJ1dGVzTmFtZXMucmVkdWNlKChuZXh0Q29tbW9uQXR0cmlidXRlcywgbmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb21tb25BdHRyaWJ1dGVzW25hbWVdXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGF0dHJpYnV0ZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgbmV4dENvbW1vbkF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHRDb21tb25BdHRyaWJ1dGVzXG4gICAgICAgICAgfSwge30pXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbW1vbkF0dHJpYnV0ZXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tbW9uUHJvcGVydGllcy5hdHRyaWJ1dGVzID0gY29tbW9uQXR0cmlidXRlc1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgY29tbW9uUHJvcGVydGllcy5hdHRyaWJ1dGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgY29tbW9uUHJvcGVydGllcy5hdHRyaWJ1dGVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gfiB0YWdcbiAgICBpZiAoY29tbW9uVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHRhZyA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoIWNvbW1vblRhZykge1xuICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLnRhZyA9IHRhZ1xuICAgICAgfSBlbHNlIGlmICh0YWcgIT09IGNvbW1vblRhZykge1xuICAgICAgICBkZWxldGUgY29tbW9uUHJvcGVydGllcy50YWdcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGNvbW1vblByb3BlcnRpZXNcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb21tb24uanMiLCIvKipcbiAqICMgT3B0aW1pemVcbiAqXG4gKiAxLikgSW1wcm92ZSBlZmZpY2llbmN5IHRocm91Z2ggc2hvcnRlciBzZWxlY3RvcnMgYnkgcmVtb3ZpbmcgcmVkdW5kYW5jeVxuICogMi4pIEltcHJvdmUgcm9idXN0bmVzcyB0aHJvdWdoIHNlbGVjdG9yIHRyYW5zZm9ybWF0aW9uXG4gKi9cblxuaW1wb3J0IGFkYXB0IGZyb20gJy4vYWRhcHQnXG5pbXBvcnQgeyBjb252ZXJ0Tm9kZUxpc3QgfSBmcm9tICcuL3V0aWxpdGllcydcblxuLyoqXG4gKiBBcHBseSBkaWZmZXJlbnQgb3B0aW1pemF0aW9uIHRlY2huaXF1ZXNcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fEFycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3B0aW1pemUgKHNlbGVjdG9yLCBlbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG5cbiAgLy8gY29udmVydCBzaW5nbGUgZW50cnkgYW5kIE5vZGVMaXN0XG4gIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50cykpIHtcbiAgICBlbGVtZW50cyA9ICFlbGVtZW50cy5sZW5ndGggPyBbZWxlbWVudHNdIDogY29udmVydE5vZGVMaXN0KGVsZW1lbnRzKVxuICB9XG5cbiAgaWYgKCFlbGVtZW50cy5sZW5ndGggfHwgZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgLSB0byBjb21wYXJlIEhUTUxFbGVtZW50cyBpdHMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgYSByZWZlcmVuY2Ugb2YgdGhlIHNlbGVjdGVkIG5vZGUocykhIChtaXNzaW5nIFwiZWxlbWVudHNcIilgKVxuICB9XG5cbiAgY29uc3QgZ2xvYmFsTW9kaWZpZWQgPSBhZGFwdChlbGVtZW50c1swXSwgb3B0aW9ucylcblxuICAvLyBjaHVuayBwYXJ0cyBvdXRzaWRlIG9mIHF1b3RlcyAoaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjU2NjM3MjkpXG4gIHZhciBwYXRoID0gc2VsZWN0b3IucmVwbGFjZSgvPiAvZywgJz4nKS5zcGxpdCgvXFxzKyg/PSg/Oig/OlteXCJdKlwiKXsyfSkqW15cIl0qJCkvKVxuXG4gIGlmIChwYXRoLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gb3B0aW1pemVQYXJ0KCcnLCBzZWxlY3RvciwgJycsIGVsZW1lbnRzKVxuICB9XG5cbiAgY29uc3Qgc2hvcnRlbmVkID0gW3BhdGgucG9wKCldXG4gIHdoaWxlIChwYXRoLmxlbmd0aCA+IDEpICB7XG4gICAgY29uc3QgY3VycmVudCA9IHBhdGgucG9wKClcbiAgICBjb25zdCBwcmVQYXJ0ID0gcGF0aC5qb2luKCcgJylcbiAgICBjb25zdCBwb3N0UGFydCA9IHNob3J0ZW5lZC5qb2luKCcgJylcblxuICAgIGNvbnN0IHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSAke3Bvc3RQYXJ0fWBcbiAgICBjb25zdCBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBzaG9ydGVuZWQudW5zaGlmdChvcHRpbWl6ZVBhcnQocHJlUGFydCwgY3VycmVudCwgcG9zdFBhcnQsIGVsZW1lbnRzKSlcbiAgICB9XG4gIH1cbiAgc2hvcnRlbmVkLnVuc2hpZnQocGF0aFswXSlcbiAgcGF0aCA9IHNob3J0ZW5lZFxuXG4gIC8vIG9wdGltaXplIHN0YXJ0ICsgZW5kXG4gIHBhdGhbMF0gPSBvcHRpbWl6ZVBhcnQoJycsIHBhdGhbMF0sIHBhdGguc2xpY2UoMSkuam9pbignICcpLCBlbGVtZW50cylcbiAgcGF0aFtwYXRoLmxlbmd0aC0xXSA9IG9wdGltaXplUGFydChwYXRoLnNsaWNlKDAsIC0xKS5qb2luKCcgJyksIHBhdGhbcGF0aC5sZW5ndGgtMV0sICcnLCBlbGVtZW50cylcblxuICBpZiAoZ2xvYmFsTW9kaWZpZWQpIHtcbiAgICBkZWxldGUgZ2xvYmFsLmRvY3VtZW50XG4gIH1cblxuICByZXR1cm4gcGF0aC5qb2luKCcgJykucmVwbGFjZSgvPi9nLCAnPiAnKS50cmltKClcbn1cblxuLyoqXG4gKiBJbXByb3ZlIGEgY2h1bmsgb2YgdGhlIHNlbGVjdG9yXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgcHJlUGFydCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICBjdXJyZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgIHBvc3RQYXJ0IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb3B0aW1pemVQYXJ0IChwcmVQYXJ0LCBjdXJyZW50LCBwb3N0UGFydCwgZWxlbWVudHMpIHtcbiAgaWYgKHByZVBhcnQubGVuZ3RoKSBwcmVQYXJ0ID0gYCR7cHJlUGFydH0gYFxuICBpZiAocG9zdFBhcnQubGVuZ3RoKSBwb3N0UGFydCA9IGAgJHtwb3N0UGFydH1gXG5cbiAgLy8gcm9idXN0bmVzczogYXR0cmlidXRlIHdpdGhvdXQgdmFsdWUgKGdlbmVyYWxpemF0aW9uKVxuICBpZiAoL1xcWypcXF0vLnRlc3QoY3VycmVudCkpIHtcbiAgICBjb25zdCBrZXkgPSBjdXJyZW50LnJlcGxhY2UoLz0uKiQvLCAnXScpXG4gICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7a2V5fSR7cG9zdFBhcnR9YFxuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgIGN1cnJlbnQgPSBrZXlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcm9idXN0bmVzczogcmVwbGFjZSBzcGVjaWZpYyBrZXktdmFsdWUgd2l0aCBiYXNlIHRhZyAoaGV1cmlzdGljKVxuICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCR7cHJlUGFydH0ke2tleX1gKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldXG4gICAgICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiByZWZlcmVuY2UuY29udGFpbnMoZWxlbWVudCkpKSB7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSByZWZlcmVuY2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7ZGVzY3JpcHRpb259JHtwb3N0UGFydH1gXG4gICAgICAgICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgY3VycmVudCA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByb2J1c3RuZXNzOiBkZXNjZW5kYW50IGluc3RlYWQgY2hpbGQgKGhldXJpc3RpYylcbiAgaWYgKC8+Ly50ZXN0KGN1cnJlbnQpKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudCA9IGN1cnJlbnQucmVwbGFjZSgvPi8sICcnKVxuICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2Rlc2NlbmRhbnR9JHtwb3N0UGFydH1gXG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgY3VycmVudCA9IGRlc2NlbmRhbnRcbiAgICB9XG4gIH1cblxuICAvLyByb2J1c3RuZXNzOiAnbnRoLW9mLXR5cGUnIGluc3RlYWQgJ250aC1jaGlsZCcgKGhldXJpc3RpYylcbiAgaWYgKC86bnRoLWNoaWxkLy50ZXN0KGN1cnJlbnQpKSB7XG4gICAgLy8gVE9ETzogY29uc2lkZXIgY29tcGxldGUgY292ZXJhZ2Ugb2YgJ250aC1vZi10eXBlJyByZXBsYWNlbWVudFxuICAgIGNvbnN0IHR5cGUgPSBjdXJyZW50LnJlcGxhY2UoL250aC1jaGlsZC9nLCAnbnRoLW9mLXR5cGUnKVxuICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke3R5cGV9JHtwb3N0UGFydH1gXG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgY3VycmVudCA9IHR5cGVcbiAgICB9XG4gIH1cblxuICAvLyBlZmZpY2llbmN5OiBjb21iaW5hdGlvbnMgb2YgY2xhc3NuYW1lIChwYXJ0aWFsIHBlcm11dGF0aW9ucylcbiAgaWYgKC9cXC5cXFMrXFwuXFxTKy8udGVzdChjdXJyZW50KSkge1xuICAgIHZhciBuYW1lcyA9IGN1cnJlbnQudHJpbSgpLnNwbGl0KCcuJykuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gYC4ke25hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGN1cnIsIG5leHQpID0+IGN1cnIubGVuZ3RoIC0gbmV4dC5sZW5ndGgpXG4gICAgd2hpbGUgKG5hbWVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcGFydGlhbCA9IGN1cnJlbnQucmVwbGFjZShuYW1lcy5zaGlmdCgpLCAnJykudHJpbSgpXG4gICAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtwYXJ0aWFsfSR7cG9zdFBhcnR9YC50cmltKClcbiAgICAgIGlmICghcGF0dGVybi5sZW5ndGggfHwgcGF0dGVybi5jaGFyQXQoMCkgPT09ICc+JyB8fCBwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuLmxlbmd0aC0xKSA9PT0gJz4nKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgICAgY3VycmVudCA9IHBhcnRpYWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByb2J1c3RuZXNzOiBkZWdyYWRlIGNvbXBsZXggY2xhc3NuYW1lIChoZXVyaXN0aWMpXG4gICAgbmFtZXMgPSBjdXJyZW50ICYmIGN1cnJlbnQubWF0Y2goL1xcLi9nKVxuICAgIGlmIChuYW1lcyAmJiBuYW1lcy5sZW5ndGggPiAyKSB7XG4gICAgICBjb25zdCByZWZlcmVuY2VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgJHtwcmVQYXJ0fSR7Y3VycmVudH1gKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldXG4gICAgICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiByZWZlcmVuY2UuY29udGFpbnMoZWxlbWVudCkgKSkge1xuICAgICAgICAgIC8vIFRPRE86XG4gICAgICAgICAgLy8gLSBjaGVjayB1c2luZyBhdHRyaWJ1dGVzICsgcmVnYXJkIGV4Y2x1ZGVzXG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSByZWZlcmVuY2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7ZGVzY3JpcHRpb259JHtwb3N0UGFydH1gXG4gICAgICAgICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHRzKG1hdGNoZXMsIGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgY3VycmVudCA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3VycmVudFxufVxuXG4vKipcbiAqIEV2YWx1YXRlIG1hdGNoZXMgd2l0aCBleHBlY3RlZCBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IG1hdGNoZXMgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVJlc3VsdHMgKG1hdGNoZXMsIGVsZW1lbnRzKSB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBtYXRjaGVzXG4gIHJldHVybiBsZW5ndGggPT09IGVsZW1lbnRzLmxlbmd0aCAmJiBlbGVtZW50cy5ldmVyeSgoZWxlbWVudCkgPT4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzW2ldID09PSBlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL29wdGltaXplLmpzIiwiLyoqXG4gKiAjIEFkYXB0XG4gKlxuICogQ2hlY2sgYW5kIGV4dGVuZCB0aGUgZW52aXJvbm1lbnQgZm9yIHVuaXZlcnNhbCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIE1vZGlmeSB0aGUgY29udGV4dCBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnRcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRUxlbWVudH0gZWxlbWVudCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICBvcHRpb25zIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkYXB0IChlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgLy8gZGV0ZWN0IGVudmlyb25tZW50IHNldHVwXG4gIGlmIChnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWwuZG9jdW1lbnQgPSBvcHRpb25zLmNvbnRleHQgfHwgKCgpID0+IHtcbiAgICAgIHZhciByb290ID0gZWxlbWVudFxuICAgICAgd2hpbGUgKHJvb3QucGFyZW50KSB7XG4gICAgICAgIHJvb3QgPSByb290LnBhcmVudFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJvb3RcbiAgICB9KSgpXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmI1NS9kb21oYW5kbGVyL2Jsb2IvbWFzdGVyL2luZGV4LmpzI0w3NVxuICBjb25zdCBFbGVtZW50UHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbC5kb2N1bWVudClcblxuICAvLyBhbHRlcm5hdGl2ZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBlbGVtZW50cyB3aXRoIGZpbHRlcmluZyBpbnZhbGlkIGVsZW1lbnRzIChlLmcuIHRleHRub2RlcylcbiAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZFRhZ3MnKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50UHJvdG90eXBlLCAnY2hpbGRUYWdzJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4ge1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYjU1L2RvbWVsZW1lbnR0eXBlL2Jsb2IvbWFzdGVyL2luZGV4LmpzI0wxMlxuICAgICAgICAgIHJldHVybiBub2RlLnR5cGUgPT09ICd0YWcnIHx8IG5vZGUudHlwZSA9PT0gJ3NjcmlwdCcgfHwgbm9kZS50eXBlID09PSAnc3R5bGUnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50UHJvdG90eXBlLCAnYXR0cmlidXRlcycpKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvYXR0cmlidXRlc1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OYW1lZE5vZGVNYXBcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudFByb3RvdHlwZSwgJ2F0dHJpYnV0ZXMnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0ICgpIHtcbiAgICAgICAgY29uc3QgeyBhdHRyaWJzIH0gPSB0aGlzXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNOYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnMpXG4gICAgICAgIGNvbnN0IE5hbWVkTm9kZU1hcCA9IGF0dHJpYnV0ZXNOYW1lcy5yZWR1Y2UoKGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXR0cmlidXRlc1tpbmRleF0gPSB7XG4gICAgICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgdmFsdWU6IGF0dHJpYnNbYXR0cmlidXRlTmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICAgICAgfSwgeyB9KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmFtZWROb2RlTWFwLCAnbGVuZ3RoJywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IGF0dHJpYnV0ZXNOYW1lcy5sZW5ndGhcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIE5hbWVkTm9kZU1hcFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUuZ2V0QXR0cmlidXRlKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLndlYnBsYXRmb3JtLm9yZy93aWtpL2RvbS9FbGVtZW50L2dldEF0dHJpYnV0ZVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2dldEF0dHJpYnV0ZVxuICAgIEVsZW1lbnRQcm90b3R5cGUuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnNbbmFtZV0gfHwgbnVsbFxuICAgIH1cbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZSkge1xuICAgIC8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9kb20vRG9jdW1lbnQvZ2V0RWxlbWVudHNCeVRhZ05hbWVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRFbGVtZW50c0J5VGFnTmFtZVxuICAgIEVsZW1lbnRQcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbiAodGFnTmFtZSkge1xuICAgICAgY29uc3QgSFRNTENvbGxlY3Rpb24gPSBbXVxuICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyh0aGlzLmNoaWxkVGFncywgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQubmFtZSA9PT0gdGFnTmFtZSB8fCB0YWdOYW1lID09PSAnKicpIHtcbiAgICAgICAgICBIVE1MQ29sbGVjdGlvbi5wdXNoKGRlc2NlbmRhbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gSFRNTENvbGxlY3Rpb25cbiAgICB9XG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkge1xuICAgIC8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9kb20vRG9jdW1lbnQvZ2V0RWxlbWVudHNCeUNsYXNzTmFtZVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2dldEVsZW1lbnRzQnlDbGFzc05hbWVcbiAgICBFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IGNsYXNzTmFtZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLnNwbGl0KCcgJylcbiAgICAgIGNvbnN0IEhUTUxDb2xsZWN0aW9uID0gW11cbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW3RoaXNdLCAoZGVzY2VuZGFudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjZW5kYW50Q2xhc3NOYW1lID0gZGVzY2VuZGFudC5hdHRyaWJzLmNsYXNzXG4gICAgICAgIGlmIChkZXNjZW5kYW50Q2xhc3NOYW1lICYmIG5hbWVzLmV2ZXJ5KChuYW1lKSA9PiBkZXNjZW5kYW50Q2xhc3NOYW1lLmluZGV4T2YobmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICBIVE1MQ29sbGVjdGlvbi5wdXNoKGRlc2NlbmRhbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gSFRNTENvbGxlY3Rpb25cbiAgICB9XG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCkge1xuICAgIC8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9jc3Mvc2VsZWN0b3JzX2FwaS9xdWVyeVNlbGVjdG9yQWxsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcXVlcnlTZWxlY3RvckFsbFxuICAgIEVsZW1lbnRQcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCA9IGZ1bmN0aW9uIChzZWxlY3RvcnMpIHtcbiAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5yZXBsYWNlKC8oPikoXFxTKS9nLCAnJDEgJDInKS50cmltKCkgLy8gYWRkIHNwYWNlIGZvciAnPicgc2VsZWN0b3JcblxuICAgICAgLy8gdXNpbmcgcmlnaHQgdG8gbGVmdCBleGVjdXRpb24gPT4gaHR0cHM6Ly9naXRodWIuY29tL2ZiNTUvY3NzLXNlbGVjdCNob3ctZG9lcy1pdC13b3JrXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBnZXRJbnN0cnVjdGlvbnMoc2VsZWN0b3JzKVxuICAgICAgY29uc3QgZGlzY292ZXIgPSBpbnN0cnVjdGlvbnMuc2hpZnQoKVxuXG4gICAgICBjb25zdCB0b3RhbCA9IGluc3RydWN0aW9ucy5sZW5ndGhcbiAgICAgIHJldHVybiBkaXNjb3Zlcih0aGlzKS5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICAgICAgdmFyIHN0ZXAgPSAwXG4gICAgICAgIHdoaWxlIChzdGVwIDwgdG90YWwpIHtcbiAgICAgICAgICBub2RlID0gaW5zdHJ1Y3Rpb25zW3N0ZXBdKG5vZGUsIHRoaXMpXG4gICAgICAgICAgaWYgKCFub2RlKSB7IC8vIGhpZXJhcmNoeSBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RlcCArPSAxXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmNvbnRhaW5zKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvY29udGFpbnNcbiAgICBFbGVtZW50UHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHZhciBpbmNsdXNpdmUgPSBmYWxzZVxuICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbdGhpc10sIChkZXNjZW5kYW50LCBkb25lKSA9PiB7XG4gICAgICAgIGlmIChkZXNjZW5kYW50ID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgaW5jbHVzaXZlID0gdHJ1ZVxuICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIGluY2x1c2l2ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogUmV0cmlldmUgdHJhbnNmb3JtYXRpb24gc3RlcHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gICBzZWxlY3RvcnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtBcnJheS48RnVuY3Rpb24+fSAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGdldEluc3RydWN0aW9ucyAoc2VsZWN0b3JzKSB7XG4gIHJldHVybiBzZWxlY3RvcnMuc3BsaXQoJyAnKS5yZXZlcnNlKCkubWFwKChzZWxlY3Rvciwgc3RlcCkgPT4ge1xuICAgIGNvbnN0IGRpc2NvdmVyID0gc3RlcCA9PT0gMFxuICAgIGNvbnN0IFt0eXBlLCBwc2V1ZG9dID0gc2VsZWN0b3Iuc3BsaXQoJzonKVxuXG4gICAgdmFyIHZhbGlkYXRlID0gbnVsbFxuICAgIHZhciBpbnN0cnVjdGlvbiA9IG51bGxcblxuICAgIHN3aXRjaCAodHJ1ZSkge1xuXG4gICAgICAvLyBjaGlsZDogJz4nXG4gICAgICBjYXNlIC8+Ly50ZXN0KHR5cGUpOlxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrUGFyZW50IChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICh2YWxpZGF0ZSkgPT4gdmFsaWRhdGUobm9kZS5wYXJlbnQpICYmIG5vZGUucGFyZW50XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gY2xhc3M6ICcuJ1xuICAgICAgY2FzZSAvXlxcLi8udGVzdCh0eXBlKTpcbiAgICAgICAgY29uc3QgbmFtZXMgPSB0eXBlLnN1YnN0cigxKS5zcGxpdCgnLicpXG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBub2RlQ2xhc3NOYW1lID0gbm9kZS5hdHRyaWJzLmNsYXNzXG4gICAgICAgICAgcmV0dXJuIG5vZGVDbGFzc05hbWUgJiYgbmFtZXMuZXZlcnkoKG5hbWUpID0+IG5vZGVDbGFzc05hbWUuaW5kZXhPZihuYW1lKSA+IC0xKVxuICAgICAgICB9XG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tDbGFzcyAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShuYW1lcy5qb2luKCcgJykpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyBhdHRyaWJ1dGU6ICdba2V5PVwidmFsdWVcIl0nXG4gICAgICBjYXNlIC9eXFxbLy50ZXN0KHR5cGUpOlxuICAgICAgICBjb25zdCBbYXR0cmlidXRlS2V5LCBhdHRyaWJ1dGVWYWx1ZV0gPSB0eXBlLnJlcGxhY2UoL1xcW3xcXF18XCIvZywgJycpLnNwbGl0KCc9JylcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhc0F0dHJpYnV0ZSA9IE9iamVjdC5rZXlzKG5vZGUuYXR0cmlicykuaW5kZXhPZihhdHRyaWJ1dGVLZXkpID4gLTFcbiAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKSB7IC8vIHJlZ2FyZCBvcHRpb25hbCBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVWYWx1ZSB8fCAobm9kZS5hdHRyaWJzW2F0dHJpYnV0ZUtleV0gPT09IGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyBpZDogJyMnXG4gICAgICBjYXNlIC9eIy8udGVzdCh0eXBlKTpcbiAgICAgICAgY29uc3QgaWQgPSB0eXBlLnN1YnN0cigxKVxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuYXR0cmlicy5pZCA9PT0gaWRcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrSWQgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IE5vZGVMaXN0ID0gW11cbiAgICAgICAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW25vZGVdLCAoZGVzY2VuZGFudCwgZG9uZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsaWRhdGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICBOb2RlTGlzdC5wdXNoKGRlc2NlbmRhbnQpXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gTm9kZUxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykgPyBub2RlKHZhbGlkYXRlKSA6IGdldEFuY2VzdG9yKG5vZGUsIHJvb3QsIHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIHVuaXZlcnNhbDogJyonXG4gICAgICBjYXNlIC9cXCovLnRlc3QodHlwZSk6XG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHRydWVcbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja1VuaXZlcnNhbCAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgY29uc3QgTm9kZUxpc3QgPSBbXVxuICAgICAgICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbbm9kZV0sIChkZXNjZW5kYW50KSA9PiBOb2RlTGlzdC5wdXNoKGRlc2NlbmRhbnQpKVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyB0YWc6ICcuLi4nXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUubmFtZSA9PT0gdHlwZVxuICAgICAgICB9XG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tUYWcgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IE5vZGVMaXN0ID0gW11cbiAgICAgICAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW25vZGVdLCAoZGVzY2VuZGFudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsaWRhdGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICBOb2RlTGlzdC5wdXNoKGRlc2NlbmRhbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gTm9kZUxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygbm9kZSA9PT0gJ2Z1bmN0aW9uJykgPyBub2RlKHZhbGlkYXRlKSA6IGdldEFuY2VzdG9yKG5vZGUsIHJvb3QsIHZhbGlkYXRlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwc2V1ZG8pIHtcbiAgICAgIHJldHVybiBpbnN0cnVjdGlvblxuICAgIH1cblxuICAgIGNvbnN0IHJ1bGUgPSBwc2V1ZG8ubWF0Y2goLy0oY2hpbGR8dHlwZSlcXCgoXFxkKylcXCkkLylcbiAgICBjb25zdCBraW5kID0gcnVsZVsxXVxuICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocnVsZVsyXSwgMTApIC0gMVxuXG4gICAgY29uc3QgdmFsaWRhdGVQc2V1ZG8gPSAobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdmFyIGNvbXBhcmVTZXQgPSBub2RlLnBhcmVudC5jaGlsZFRhZ3NcbiAgICAgICAgaWYgKGtpbmQgPT09ICd0eXBlJykge1xuICAgICAgICAgIGNvbXBhcmVTZXQgPSBjb21wYXJlU2V0LmZpbHRlcih2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlSW5kZXggPSBjb21wYXJlU2V0LmZpbmRJbmRleCgoY2hpbGQpID0+IGNoaWxkID09PSBub2RlKVxuICAgICAgICBpZiAobm9kZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBlbmhhbmNlSW5zdHJ1Y3Rpb24gKG5vZGUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5zdHJ1Y3Rpb24obm9kZSlcbiAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICByZXR1cm4gbWF0Y2gucmVkdWNlKChOb2RlTGlzdCwgbWF0Y2hlZE5vZGUpID0+IHtcbiAgICAgICAgICBpZiAodmFsaWRhdGVQc2V1ZG8obWF0Y2hlZE5vZGUpKSB7XG4gICAgICAgICAgICBOb2RlTGlzdC5wdXNoKG1hdGNoZWROb2RlKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gTm9kZUxpc3RcbiAgICAgICAgfSwgW10pXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGVQc2V1ZG8obWF0Y2gpICYmIG1hdGNoXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIFdhbGtpbmcgcmVjdXJzaXZlIHRvIGludm9rZSBjYWxsYmFja3NcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxIVE1MRWxlbWVudD59IG5vZGVzICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSAgICAgICAgICAgIGhhbmRsZXIgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlRGVzY2VuZGFudHMgKG5vZGVzLCBoYW5kbGVyKSB7XG4gIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICB2YXIgcHJvZ3Jlc3MgPSB0cnVlXG4gICAgaGFuZGxlcihub2RlLCAoKSA9PiBwcm9ncmVzcyA9IGZhbHNlKVxuICAgIGlmIChub2RlLmNoaWxkVGFncyAmJiBwcm9ncmVzcykge1xuICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhub2RlLmNoaWxkVGFncywgaGFuZGxlcilcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQnViYmxlIHVwIGZyb20gYm90dG9tIHRvIHRvcFxuICpcbiAqIEBwYXJhbSAge0hUTUxFTGVtZW50fSBub2RlICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFTGVtZW50fSByb290ICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgICB2YWxpZGF0ZSAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0hUTUxFTGVtZW50fSAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZ2V0QW5jZXN0b3IgKG5vZGUsIHJvb3QsIHZhbGlkYXRlKSB7XG4gIHdoaWxlIChub2RlLnBhcmVudCkge1xuICAgIG5vZGUgPSBub2RlLnBhcmVudFxuICAgIGlmICh2YWxpZGF0ZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IHJvb3QpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvYWRhcHQuanMiLCIvKipcbiAqICMgU2VsZWN0XG4gKlxuICogQ29uc3RydWN0IGEgdW5pcXVlIENTUyBxdWVyeSBzZWxlY3RvciB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIERPTSBlbGVtZW50KHMpLlxuICogRm9yIGxvbmdldml0eSBpdCBhcHBsaWVzIGRpZmZlcmVudCBtYXRjaGluZyBhbmQgb3B0aW1pemF0aW9uIHN0cmF0ZWdpZXMuXG4gKi9cblxuaW1wb3J0IGFkYXB0IGZyb20gJy4vYWRhcHQnXG5pbXBvcnQgbWF0Y2ggZnJvbSAnLi9tYXRjaCdcbmltcG9ydCBvcHRpbWl6ZSBmcm9tICcuL29wdGltaXplJ1xuaW1wb3J0IHsgY29udmVydE5vZGVMaXN0IH0gZnJvbSAnLi91dGlsaXRpZXMnXG5pbXBvcnQgeyBnZXRDb21tb25BbmNlc3RvciwgZ2V0Q29tbW9uUHJvcGVydGllcyB9IGZyb20gJy4vY29tbW9uJ1xuXG4vKipcbiAqIEdldCBhIHNlbGVjdG9yIGZvciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbmdsZVNlbGVjdG9yIChlbGVtZW50LCBvcHRpb25zID0ge30pIHtcblxuICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMykge1xuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGVcbiAgfVxuXG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlucHV0IC0gb25seSBIVE1MRWxlbWVudHMgb3IgcmVwcmVzZW50YXRpb25zIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCEgKG5vdCBcIiR7dHlwZW9mIGVsZW1lbnR9XCIpYClcbiAgfVxuXG4gIGNvbnN0IGdsb2JhbE1vZGlmaWVkID0gYWRhcHQoZWxlbWVudCwgb3B0aW9ucylcblxuICBjb25zdCBzZWxlY3RvciA9IG1hdGNoKGVsZW1lbnQsIG9wdGlvbnMpXG4gIGNvbnN0IG9wdGltaXplZCA9IG9wdGltaXplKHNlbGVjdG9yLCBlbGVtZW50LCBvcHRpb25zKVxuXG4gIC8vIGRlYnVnXG4gIC8vIGNvbnNvbGUubG9nKGBcbiAgLy8gICBzZWxlY3RvcjogICR7c2VsZWN0b3J9XG4gIC8vICAgb3B0aW1pemVkOiAke29wdGltaXplZH1cbiAgLy8gYClcblxuICBpZiAoZ2xvYmFsTW9kaWZpZWQpIHtcbiAgICBkZWxldGUgZ2xvYmFsLmRvY3VtZW50XG4gIH1cblxuICByZXR1cm4gb3B0aW1pemVkXG59XG5cbi8qKlxuICogR2V0IGEgc2VsZWN0b3IgdG8gbWF0Y2ggbXVsdGlwbGUgZGVzY2VuZGFudHMgZnJvbSBhbiBhbmNlc3RvclxuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD58Tm9kZUxpc3R9IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpU2VsZWN0b3IgKGVsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHMpKSB7XG4gICAgZWxlbWVudHMgPSBjb252ZXJ0Tm9kZUxpc3QoZWxlbWVudHMpXG4gIH1cblxuICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgLSBvbmx5IGFuIEFycmF5IG9mIEhUTUxFbGVtZW50cyBvciByZXByZXNlbnRhdGlvbnMgb2YgdGhlbSBpcyBzdXBwb3J0ZWQhYClcbiAgfVxuXG4gIGNvbnN0IGdsb2JhbE1vZGlmaWVkID0gYWRhcHQoZWxlbWVudHNbMF0sIG9wdGlvbnMpXG5cbiAgY29uc3QgYW5jZXN0b3IgPSBnZXRDb21tb25BbmNlc3RvcihlbGVtZW50cywgb3B0aW9ucylcbiAgY29uc3QgYW5jZXN0b3JTZWxlY3RvciA9IGdldFNpbmdsZVNlbGVjdG9yKGFuY2VzdG9yLCBvcHRpb25zKVxuXG4gIC8vIFRPRE86IGNvbnNpZGVyIHVzYWdlIG9mIG11bHRpcGxlIHNlbGVjdG9ycyArIHBhcmVudC1jaGlsZCByZWxhdGlvbiArIGNoZWNrIGZvciBwYXJ0IHJlZHVuZGFuY3lcbiAgY29uc3QgY29tbW9uU2VsZWN0b3JzID0gZ2V0Q29tbW9uU2VsZWN0b3JzKGVsZW1lbnRzKVxuICBjb25zdCBkZXNjZW5kYW50U2VsZWN0b3IgPSBjb21tb25TZWxlY3RvcnNbMF1cblxuICBjb25zdCBzZWxlY3RvciA9IG9wdGltaXplKGAke2FuY2VzdG9yU2VsZWN0b3J9ICR7ZGVzY2VuZGFudFNlbGVjdG9yfWAsIGVsZW1lbnRzLCBvcHRpb25zKVxuICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBjb252ZXJ0Tm9kZUxpc3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpXG5cbiAgaWYgKCFlbGVtZW50cy5ldmVyeSgoZWxlbWVudCkgPT4gc2VsZWN0b3JNYXRjaGVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeSA9PT0gZWxlbWVudCkgKSkge1xuICAgIC8vIFRPRE86IGNsdXN0ZXIgbWF0Y2hlcyB0byBzcGxpdCBpbnRvIHNpbWlsYXIgZ3JvdXBzIGZvciBzdWIgc2VsZWN0aW9uc1xuICAgIHJldHVybiBjb25zb2xlLndhcm4oYFxuICAgICAgVGhlIHNlbGVjdGVkIGVsZW1lbnRzIGNhblxcJ3QgYmUgZWZmaWNpZW50bHkgbWFwcGVkLlxuICAgICAgSXRzIHByb2JhYmx5IGJlc3QgdG8gdXNlIG11bHRpcGxlIHNpbmdsZSBzZWxlY3RvcnMgaW5zdGVhZCFcbiAgICBgLCBlbGVtZW50cylcbiAgfVxuXG4gIGlmIChnbG9iYWxNb2RpZmllZCkge1xuICAgIGRlbGV0ZSBnbG9iYWwuZG9jdW1lbnRcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG4vKipcbiAqIEdldCBzZWxlY3RvcnMgdG8gZGVzY3JpYmUgYSBzZXQgb2YgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnRzPn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1vblNlbGVjdG9ycyAoZWxlbWVudHMpIHtcblxuICBjb25zdCB7IGNsYXNzZXMsIGF0dHJpYnV0ZXMsIHRhZyB9ID0gZ2V0Q29tbW9uUHJvcGVydGllcyhlbGVtZW50cylcblxuICBjb25zdCBzZWxlY3RvclBhdGggPSBbXVxuXG4gIGlmICh0YWcpIHtcbiAgICBzZWxlY3RvclBhdGgucHVzaCh0YWcpXG4gIH1cblxuICBpZiAoY2xhc3Nlcykge1xuICAgIGNvbnN0IGNsYXNzU2VsZWN0b3IgPSBjbGFzc2VzLm1hcCgobmFtZSkgPT4gYC4ke25hbWV9YCkuam9pbignJylcbiAgICBzZWxlY3RvclBhdGgucHVzaChjbGFzc1NlbGVjdG9yKVxuICB9XG5cbiAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVTZWxlY3RvciA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZSgocGFydHMsIG5hbWUpID0+IHtcbiAgICAgIHBhcnRzLnB1c2goYFske25hbWV9PVwiJHthdHRyaWJ1dGVzW25hbWVdfVwiXWApXG4gICAgICByZXR1cm4gcGFydHNcbiAgICB9LCBbXSkuam9pbignJylcbiAgICBzZWxlY3RvclBhdGgucHVzaChhdHRyaWJ1dGVTZWxlY3RvcilcbiAgfVxuXG4gIGlmIChzZWxlY3RvclBhdGgubGVuZ3RoKSB7XG4gICAgLy8gVE9ETzogY2hlY2sgZm9yIHBhcmVudC1jaGlsZCByZWxhdGlvblxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBzZWxlY3RvclBhdGguam9pbignJylcbiAgXVxufVxuXG4vKipcbiAqIENob29zZSBhY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCAobXVsdGlwbGUvc2luZ2xlKVxuICpcbiAqIE5PVEU6IGV4dGVuZGVkIGRldGVjdGlvbiBpcyB1c2VkIGZvciBzcGVjaWFsIGNhc2VzIGxpa2UgdGhlIDxzZWxlY3Q+IGVsZW1lbnQgd2l0aCA8b3B0aW9ucz5cbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudHxOb2RlTGlzdHxBcnJheS48SFRNTEVsZW1lbnQ+fSBpbnB1dCAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFF1ZXJ5U2VsZWN0b3IgKGlucHV0LCBvcHRpb25zID0ge30pIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCAmJiAhaW5wdXQubmFtZSkge1xuICAgIHJldHVybiBnZXRNdWx0aVNlbGVjdG9yKGlucHV0LCBvcHRpb25zKVxuICB9XG4gIHJldHVybiBnZXRTaW5nbGVTZWxlY3RvcihpbnB1dCwgb3B0aW9ucylcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZWxlY3QuanMiLCIvKipcbiAqICMgTWF0Y2hcbiAqXG4gKiBSZXRyaWV2ZSBzZWxlY3RvciBmb3IgYSBub2RlLlxuICovXG5cbmltcG9ydCB7IGVzY2FwZVZhbHVlIH0gZnJvbSAnLi91dGlsaXRpZXMnXG5cbmNvbnN0IGRlZmF1bHRJZ25vcmUgPSB7XG4gIGF0dHJpYnV0ZSAoYXR0cmlidXRlTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ2RhdGEtcmVhY3RpZCcsXG4gICAgICAnZGF0YS1yZWFjdC1jaGVja3N1bSdcbiAgICBdLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPiAtMVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IG5vZGUgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgb3B0aW9ucyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaCAobm9kZSwgb3B0aW9ucykge1xuXG4gIGNvbnN0IHtcbiAgICByb290ID0gZG9jdW1lbnQsXG4gICAgc2tpcCA9IG51bGwsXG4gICAgcHJpb3JpdHkgPSBbJ2lkJywgJ2NsYXNzJywgJ2hyZWYnLCAnc3JjJ10sXG4gICAgaWdub3JlID0ge31cbiAgfSA9IG9wdGlvbnNcblxuICBjb25zdCBwYXRoID0gW11cbiAgdmFyIGVsZW1lbnQgPSBub2RlXG4gIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aFxuICB2YXIgaWdub3JlQ2xhc3MgPSBmYWxzZVxuXG4gIGNvbnN0IHNraXBDb21wYXJlID0gc2tpcCAmJiAoQXJyYXkuaXNBcnJheShza2lwKSA/IHNraXAgOiBbc2tpcF0pLm1hcCgoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKGVsZW1lbnQpID0+IGVsZW1lbnQgPT09IGVudHJ5XG4gICAgfVxuICAgIHJldHVybiBlbnRyeVxuICB9KVxuXG4gIGNvbnN0IHNraXBDaGVja3MgPSAoZWxlbWVudCkgPT4ge1xuICAgIHJldHVybiBza2lwICYmIHNraXBDb21wYXJlLnNvbWUoKGNvbXBhcmUpID0+IGNvbXBhcmUoZWxlbWVudCkpXG4gIH1cblxuICBPYmplY3Qua2V5cyhpZ25vcmUpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgaWdub3JlQ2xhc3MgPSB0cnVlXG4gICAgfVxuICAgIHZhciBwcmVkaWNhdGUgPSBpZ25vcmVbdHlwZV1cbiAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuXG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUudG9TdHJpbmcoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByZWRpY2F0ZSA9IG5ldyBSZWdFeHAoZXNjYXBlVmFsdWUocHJlZGljYXRlKS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUgPyAvKD86KS8gOiAvLl4vXG4gICAgfVxuICAgIC8vIGNoZWNrIGNsYXNzLS9hdHRyaWJ1dGVuYW1lIGZvciByZWdleFxuICAgIGlnbm9yZVt0eXBlXSA9IChuYW1lLCB2YWx1ZSkgPT4gcHJlZGljYXRlLnRlc3QodmFsdWUpXG4gIH0pXG5cbiAgaWYgKGlnbm9yZUNsYXNzKSB7XG4gICAgY29uc3QgaWdub3JlQXR0cmlidXRlID0gaWdub3JlLmF0dHJpYnV0ZVxuICAgIGlnbm9yZS5hdHRyaWJ1dGUgPSAobmFtZSwgdmFsdWUsIGRlZmF1bHRQcmVkaWNhdGUpID0+IHtcbiAgICAgIHJldHVybiBpZ25vcmUuY2xhc3ModmFsdWUpIHx8IGlnbm9yZUF0dHJpYnV0ZSAmJiBpZ25vcmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGRlZmF1bHRQcmVkaWNhdGUpXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGVsZW1lbnQgIT09IHJvb3QpIHtcbiAgICBpZiAoc2tpcENoZWNrcyhlbGVtZW50KSAhPT0gdHJ1ZSkge1xuICAgICAgLy8gfiBnbG9iYWxcbiAgICAgIGlmIChjaGVja0F0dHJpYnV0ZXMocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aCwgcm9vdCkpIGJyZWFrXG4gICAgICBpZiAoY2hlY2tUYWcoZWxlbWVudCwgaWdub3JlLCBwYXRoLCByb290KSkgYnJlYWtcblxuICAgICAgLy8gfiBsb2NhbFxuICAgICAgY2hlY2tBdHRyaWJ1dGVzKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgpXG4gICAgICBpZiAocGF0aC5sZW5ndGggPT09IGxlbmd0aCkge1xuICAgICAgICBjaGVja1RhZyhlbGVtZW50LCBpZ25vcmUsIHBhdGgpXG4gICAgICB9XG5cbiAgICAgIC8vIGRlZmluZSBvbmx5IG9uZSBwYXJ0IGVhY2ggaXRlcmF0aW9uXG4gICAgICBpZiAocGF0aC5sZW5ndGggPT09IGxlbmd0aCkge1xuICAgICAgICBjaGVja0NoaWxkcyhwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGVcbiAgICBsZW5ndGggPSBwYXRoLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVsZW1lbnQgPT09IHJvb3QpIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gZmluZFBhdHRlcm4ocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSlcbiAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgfVxuXG4gIHJldHVybiBwYXRoLmpvaW4oJyAnKVxufVxuXG4vKipcbiAqIEV4dGVuZCBwYXRoIHdpdGggYXR0cmlidXRlIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJpb3JpdHkgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgZWxlbWVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgaWdub3JlICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcGF0aCAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgcGFyZW50ICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlcyAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aCwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gIGNvbnN0IHBhdHRlcm4gPSBmaW5kQXR0cmlidXRlc1BhdHRlcm4ocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSlcbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBjb25zdCBtYXRjaGVzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhdGgudW5zaGlmdChwYXR0ZXJuKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogTG9va3VwIGF0dHJpYnV0ZSBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nP30gICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBmaW5kQXR0cmlidXRlc1BhdHRlcm4gKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlc1xuICBjb25zdCBzb3J0ZWRLZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcykuc29ydCgoY3VyciwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGN1cnJQb3MgPSBwcmlvcml0eS5pbmRleE9mKGF0dHJpYnV0ZXNbY3Vycl0ubmFtZSlcbiAgICBjb25zdCBuZXh0UG9zID0gcHJpb3JpdHkuaW5kZXhPZihhdHRyaWJ1dGVzW25leHRdLm5hbWUpXG4gICAgaWYgKG5leHRQb3MgPT09IC0xKSB7XG4gICAgICBpZiAoY3VyclBvcyA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gY3VyclBvcyAtIG5leHRQb3NcbiAgfSlcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHNvcnRlZEtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc29ydGVkS2V5c1tpXVxuICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNba2V5XVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUubmFtZVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZXNjYXBlVmFsdWUoYXR0cmlidXRlLnZhbHVlKVxuXG4gICAgY29uc3QgY3VycmVudElnbm9yZSA9IGlnbm9yZVthdHRyaWJ1dGVOYW1lXSB8fCBpZ25vcmUuYXR0cmlidXRlXG4gICAgY29uc3QgY3VycmVudERlZmF1bHRJZ25vcmUgPSBkZWZhdWx0SWdub3JlW2F0dHJpYnV0ZU5hbWVdIHx8IGRlZmF1bHRJZ25vcmUuYXR0cmlidXRlXG4gICAgaWYgKGNoZWNrSWdub3JlKGN1cnJlbnRJZ25vcmUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBjdXJyZW50RGVmYXVsdElnbm9yZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFyIHBhdHRlcm4gPSBgWyR7YXR0cmlidXRlTmFtZX09XCIke2F0dHJpYnV0ZVZhbHVlfVwiXWBcblxuICAgIGlmICgoL1xcYlxcZC8pLnRlc3QoYXR0cmlidXRlVmFsdWUpID09PSBmYWxzZSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdpZCcpIHtcbiAgICAgICAgcGF0dGVybiA9IGAjJHthdHRyaWJ1dGVWYWx1ZX1gXG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcuJylcbiAgICAgICAgcGF0dGVybiA9IGAuJHtjbGFzc05hbWV9YFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXR0ZXJuXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBFeHRlbmQgcGF0aCB3aXRoIHRhZyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgaWdub3JlICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwYXRoICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIHBhcmVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY2hlY2tUYWcgKGVsZW1lbnQsIGlnbm9yZSwgcGF0aCwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gIGNvbnN0IHBhdHRlcm4gPSBmaW5kVGFnUGF0dGVybihlbGVtZW50LCBpZ25vcmUpXG4gIGlmIChwYXR0ZXJuKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShwYXR0ZXJuKVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcGF0aC51bnNoaWZ0KHBhdHRlcm4pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBMb29rdXAgdGFnIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICBpZ25vcmUgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGZpbmRUYWdQYXR0ZXJuIChlbGVtZW50LCBpZ25vcmUpIHtcbiAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gIGlmIChjaGVja0lnbm9yZShpZ25vcmUudGFnLCBudWxsLCB0YWdOYW1lKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIHRhZ05hbWVcbn1cblxuLyoqXG4gKiBFeHRlbmQgcGF0aCB3aXRoIHNwZWNpZmljIGNoaWxkIGlkZW50aWZpZXJcbiAqXG4gKiBOT1RFOiAnY2hpbGRUYWdzJyBpcyBhIGN1c3RvbSBwcm9wZXJ0eSB0byB1c2UgYXMgYSB2aWV3IGZpbHRlciBmb3IgdGFncyB1c2luZyAnYWRhcHRlci5qcydcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJpb3JpdHkgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgZWxlbWVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgaWdub3JlICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcGF0aCAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ2hpbGRzIChwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoKSB7XG4gIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZVxuICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZFRhZ3MgfHwgcGFyZW50LmNoaWxkcmVuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXVxuICAgIGlmIChjaGlsZCA9PT0gZWxlbWVudCkge1xuICAgICAgY29uc3QgY2hpbGRQYXR0ZXJuID0gZmluZFBhdHRlcm4ocHJpb3JpdHksIGNoaWxkLCBpZ25vcmUpXG4gICAgICBpZiAoIWNoaWxkUGF0dGVybikge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKGBcbiAgICAgICAgICBFbGVtZW50IGNvdWxkblxcJ3QgYmUgbWF0Y2hlZCB0aHJvdWdoIHN0cmljdCBpZ25vcmUgcGF0dGVybiFcbiAgICAgICAgYCwgY2hpbGQsIGlnbm9yZSwgY2hpbGRQYXR0ZXJuKVxuICAgICAgfVxuICAgICAgY29uc3QgcGF0dGVybiA9IGA+ICR7Y2hpbGRQYXR0ZXJufTpudGgtY2hpbGQoJHtpKzF9KWBcbiAgICAgIHBhdGgudW5zaGlmdChwYXR0ZXJuKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogTG9va3VwIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJpb3JpdHkgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gICAgZWxlbWVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgICAgaWdub3JlICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGZpbmRQYXR0ZXJuIChwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKSB7XG4gIHZhciBwYXR0ZXJuID0gZmluZEF0dHJpYnV0ZXNQYXR0ZXJuKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpXG4gIGlmICghcGF0dGVybikge1xuICAgIHBhdHRlcm4gPSBmaW5kVGFnUGF0dGVybihlbGVtZW50LCBpZ25vcmUpXG4gIH1cbiAgcmV0dXJuIHBhdHRlcm5cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB3aXRoIGN1c3RvbSBhbmQgZGVmYXVsdCBmdW5jdGlvbnNcbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gcHJlZGljYXRlICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge3N0cmluZz99ICBuYW1lICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7c3RyaW5nfSAgIHZhbHVlICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZGVmYXVsdFByZWRpY2F0ZSAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja0lnbm9yZSAocHJlZGljYXRlLCBuYW1lLCB2YWx1ZSwgZGVmYXVsdFByZWRpY2F0ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBjb25zdCBjaGVjayA9IHByZWRpY2F0ZSB8fCBkZWZhdWx0UHJlZGljYXRlXG4gIGlmICghY2hlY2spIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gY2hlY2sobmFtZSwgdmFsdWUsIGRlZmF1bHRQcmVkaWNhdGUpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbWF0Y2guanMiLCJleHBvcnQgc2VsZWN0LCB7IGdldFNpbmdsZVNlbGVjdG9yLCBnZXRNdWx0aVNlbGVjdG9yIH0gZnJvbSAnLi9zZWxlY3QnXG5leHBvcnQgb3B0aW1pemUgZnJvbSAnLi9vcHRpbWl6ZSdcbmV4cG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuL2NvbW1vbidcblxuZXhwb3J0IGRlZmF1bHQgZnJvbSAnLi9zZWxlY3QnXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/dist/optimal-select.min.js b/dist/optimal-select.min.js index 864b670..7014219 100644 --- a/dist/optimal-select.min.js +++ b/dist/optimal-select.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.OptimalSelect=t():e.OptimalSelect=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,r){"use strict";function n(e){for(var t=e.length,r=new Array(t),n=0;n@~]/g,"\\$&").replace(/\n/g,"A")}Object.defineProperty(t,"__esModule",{value:!0}),t.convertNodeList=n,t.escapeValue=o},function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.root,n=void 0===r?document:r,o=[];e.forEach(function(e,t){for(var r=[];e!==n;)e=e.parentNode,r.unshift(e);o[t]=r}),o.sort(function(e,t){return e.length-t.length});for(var u=o.shift(),i=null,l=function(){var e=u[a],t=o.some(function(t){return!t.some(function(t){return t===e})});return t?"break":void(i=e)},a=0,c=u.length;a2&&void 0!==arguments[2]?arguments[2]:{};if(Array.isArray(t)||(t=t.length?(0,c.convertNodeList)(t):[t]),!t.length||t.some(function(e){return 1!==e.nodeType}))throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing "elements")');var n=(0,a.default)(t[0],r),o=e.replace(/> /g,">").split(/\s+(?=(?:(?:[^"]*"){2})*[^"]*$)/);if(o.length<2)return u("",e,"",t);for(var i=[o.pop()];o.length>1;){var l=o.pop(),f=o.join(" "),s=i.join(" "),d=f+" "+s,p=document.querySelectorAll(d);p.length!==t.length&&i.unshift(u(f,l,s,t))}return i.unshift(o[0]),o=i,o[0]=u("",o[0],o.slice(1).join(" "),t),o[o.length-1]=u(o.slice(0,-1).join(" "),o[o.length-1],"",t),n&&delete!0,o.join(" ").replace(/>/g,"> ").trim()}function u(e,t,r,n){if(e.length&&(e+=" "),r.length&&(r=" "+r),/\[*\]/.test(t)){var o=t.replace(/=.*$/,"]"),u=""+e+o+r,l=document.querySelectorAll(u);if(i(l,n))t=o;else for(var a=document.querySelectorAll(""+e+o),c=function(){var o=a[f];if(n.some(function(e){return o.contains(e)})){var c=o.tagName.toLowerCase();return u=""+e+c+r,l=document.querySelectorAll(u),i(l,n)&&(t=c),"break"}},f=0,s=a.length;f/.test(t)){var p=t.replace(/>/,""),u=""+e+p+r,l=document.querySelectorAll(u);i(l,n)&&(t=p)}if(/:nth-child/.test(t)){var v=t.replace(/nth-child/g,"nth-of-type"),u=""+e+v+r,l=document.querySelectorAll(u);i(l,n)&&(t=v)}if(/\.\S+\.\S+/.test(t)){for(var y=t.trim().split(".").slice(1).map(function(e){return"."+e}).sort(function(e,t){return e.length-t.length});y.length;){var g=t.replace(y.shift(),"").trim(),u=(""+e+g+r).trim();if(!u.length||">"===u.charAt(0)||">"===u.charAt(u.length-1))break;var l=document.querySelectorAll(u);i(l,n)&&(t=g)}if(y=t&&t.match(/\./g),y&&y.length>2)for(var m=document.querySelectorAll(""+e+t),h=function(){var o=m[f];if(n.some(function(e){return o.contains(e)})){var a=o.tagName.toLowerCase();return u=""+e+a+r,l=document.querySelectorAll(u),i(l,n)&&(t=a),"break"}},f=0,s=m.length;f1&&void 0!==arguments[1]?arguments[1]:{};if(3===e.nodeType&&(e=e.parentNode),1!==e.nodeType)throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not "'+("undefined"==typeof e?"undefined":a(e))+'")');var r=(0,f.default)(e,t),n=(0,d.default)(e,t),o=(0,v.default)(n,e,t);return r&&delete!0,o}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Array.isArray(e)||(e=(0,y.convertNodeList)(e)),e.some(function(e){return 1!==e.nodeType}))throw new Error("Invalid input - only an Array of HTMLElements or representations of them is supported!");var r=(0,f.default)(e[0],t),n=(0,g.getCommonAncestor)(e,t),u=o(n,t),l=i(e),a=l[0],c=(0,v.default)(u+" "+a,e,t),s=(0,y.convertNodeList)(document.querySelectorAll(c));return e.every(function(e){return s.some(function(t){return t===e})})?(r&&delete!0,c):console.warn("\n The selected elements can't be efficiently mapped.\n Its probably best to use multiple single selectors instead!\n ",e)}function i(e){var t=(0,g.getCommonProperties)(e),r=t.classes,n=t.attributes,o=t.tag,u=[];if(o&&u.push(o),r){var i=r.map(function(e){return"."+e}).join("");u.push(i)}if(n){var l=Object.keys(n).reduce(function(e,t){return e.push("["+t+'="'+n[t]+'"]'),e},[]).join("");u.push(l)}return u.length,[u.join("")]}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.length&&!e.name?u(e,t):o(e,t)}Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getSingleSelector=o,t.getMultiSelector=u,t.default=l;var c=r(3),f=n(c),s=r(5),d=n(s),p=r(2),v=n(p),y=r(0),g=r(1)},function(e,t,r){"use strict";function n(e,t){var r=t.root,n=void 0===r?document:r,u=t.skip,l=void 0===u?null:u,f=t.priority,d=void 0===f?["id","class","href","src"]:f,p=t.ignore,v=void 0===p?{}:p,y=[],g=e,m=y.length,h=!1,b=l&&(Array.isArray(l)?l:[l]).map(function(e){return"function"!=typeof e?function(t){return t===e}:e}),S=function(e){return l&&b.some(function(t){return t(e)})};for(Object.keys(v).forEach(function(e){"class"===e&&(h=!0);var t=v[e];"function"!=typeof t&&("number"==typeof t&&(t=t.toString()),"string"==typeof t&&(t=new RegExp((0,s.escapeValue)(t).replace(/\\/g,"\\\\"))),"boolean"==typeof t&&(t=t?/(?:)/:/.^/),v[e]=function(e,r){return t.test(r)})}),h&&!function(){var e=v.attribute;v.attribute=function(t,r,n){return v.class(r)||e&&e(t,r,n)}}();g!==n;){if(S(g)!==!0){if(o(d,g,v,y,n))break;if(i(g,v,y,n))break;o(d,g,v,y),y.length===m&&i(g,v,y),y.length===m&&a(d,g,v,y)}g=g.parentNode,m=y.length}if(g===n){var j=c(d,g,v);y.unshift(j)}return y.join(" ")}function o(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.parentNode,i=u(e,t,r);if(i){var l=o.querySelectorAll(i);if(1===l.length)return n.unshift(i),!0}return!1}function u(e,t,r){for(var n=t.attributes,o=Object.keys(n).sort(function(t,r){var o=e.indexOf(n[t].name),u=e.indexOf(n[r].name);return u===-1?o===-1?0:-1:o-u}),u=0,i=o.length;u3&&void 0!==arguments[3]?arguments[3]:e.parentNode,o=l(e,t);if(o){var u=n.getElementsByTagName(o);if(1===u.length)return r.unshift(o),!0}return!1}function l(e,t){var r=e.tagName.toLowerCase();return f(t.tag,null,r)?null:r}function a(e,t,r,n){for(var o=t.parentNode,u=o.childTags||o.children,i=0,l=u.length;i-1}};e.exports=t.default},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.common=t.optimize=t.getMultiSelector=t.getSingleSelector=t.select=void 0;var u=r(4);Object.defineProperty(t,"getSingleSelector",{enumerable:!0,get:function(){return u.getSingleSelector}}),Object.defineProperty(t,"getMultiSelector",{enumerable:!0,get:function(){return u.getMultiSelector}});var i=o(u),l=r(2),a=o(l),c=r(1),f=n(c);t.select=i.default,t.optimize=a.default,t.common=f,t.default=i.default}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.OptimalSelect=t():e.OptimalSelect=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,r){"use strict";function n(e){for(var t=e.length,r=new Array(t),n=0;n@~]/g,"\\$&").replace(/\n/g,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.convertNodeList=n,t.escapeValue=o},function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.root,n=void 0===r?document:r,o=[];e.forEach(function(e,t){for(var r=[];e!==n;)e=e.parentNode,r.unshift(e);o[t]=r}),o.sort(function(e,t){return e.length-t.length});for(var u=o.shift(),i=null,l=function(){var e=u[a],t=o.some(function(t){return!t.some(function(t){return t===e})});return t?"break":void(i=e)},a=0,c=u.length;a2&&void 0!==arguments[2]?arguments[2]:{};if(Array.isArray(t)||(t=t.length?(0,c.convertNodeList)(t):[t]),!t.length||t.some(function(e){return 1!==e.nodeType}))throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing "elements")');var n=(0,a.default)(t[0],r),o=e.replace(/> /g,">").split(/\s+(?=(?:(?:[^"]*"){2})*[^"]*$)/);if(o.length<2)return u("",e,"",t);for(var i=[o.pop()];o.length>1;){var l=o.pop(),f=o.join(" "),s=i.join(" "),d=f+" "+s,p=document.querySelectorAll(d);p.length!==t.length&&i.unshift(u(f,l,s,t))}return i.unshift(o[0]),o=i,o[0]=u("",o[0],o.slice(1).join(" "),t),o[o.length-1]=u(o.slice(0,-1).join(" "),o[o.length-1],"",t),n&&delete!0,o.join(" ").replace(/>/g,"> ").trim()}function u(e,t,r,n){if(e.length&&(e+=" "),r.length&&(r=" "+r),/\[*\]/.test(t)){var o=t.replace(/=.*$/,"]"),u=""+e+o+r,l=document.querySelectorAll(u);if(i(l,n))t=o;else for(var a=document.querySelectorAll(""+e+o),c=function(){var o=a[f];if(n.some(function(e){return o.contains(e)})){var c=o.tagName.toLowerCase();return u=""+e+c+r,l=document.querySelectorAll(u),i(l,n)&&(t=c),"break"}},f=0,s=a.length;f/.test(t)){var p=t.replace(/>/,""),u=""+e+p+r,l=document.querySelectorAll(u);i(l,n)&&(t=p)}if(/:nth-child/.test(t)){var v=t.replace(/nth-child/g,"nth-of-type"),u=""+e+v+r,l=document.querySelectorAll(u);i(l,n)&&(t=v)}if(/\.\S+\.\S+/.test(t)){for(var y=t.trim().split(".").slice(1).map(function(e){return"."+e}).sort(function(e,t){return e.length-t.length});y.length;){var g=t.replace(y.shift(),"").trim(),u=(""+e+g+r).trim();if(!u.length||">"===u.charAt(0)||">"===u.charAt(u.length-1))break;var l=document.querySelectorAll(u);i(l,n)&&(t=g)}if(y=t&&t.match(/\./g),y&&y.length>2)for(var m=document.querySelectorAll(""+e+t),h=function(){var o=m[f];if(n.some(function(e){return o.contains(e)})){var a=o.tagName.toLowerCase();return u=""+e+a+r,l=document.querySelectorAll(u),i(l,n)&&(t=a),"break"}},f=0,s=m.length;f1&&void 0!==arguments[1]?arguments[1]:{};if(3===e.nodeType&&(e=e.parentNode),1!==e.nodeType)throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not "'+("undefined"==typeof e?"undefined":a(e))+'")');var r=(0,f.default)(e,t),n=(0,d.default)(e,t),o=(0,v.default)(n,e,t);return r&&delete!0,o}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Array.isArray(e)||(e=(0,y.convertNodeList)(e)),e.some(function(e){return 1!==e.nodeType}))throw new Error("Invalid input - only an Array of HTMLElements or representations of them is supported!");var r=(0,f.default)(e[0],t),n=(0,g.getCommonAncestor)(e,t),u=o(n,t),l=i(e),a=l[0],c=(0,v.default)(u+" "+a,e,t),s=(0,y.convertNodeList)(document.querySelectorAll(c));return e.every(function(e){return s.some(function(t){return t===e})})?(r&&delete!0,c):console.warn("\n The selected elements can't be efficiently mapped.\n Its probably best to use multiple single selectors instead!\n ",e)}function i(e){var t=(0,g.getCommonProperties)(e),r=t.classes,n=t.attributes,o=t.tag,u=[];if(o&&u.push(o),r){var i=r.map(function(e){return"."+e}).join("");u.push(i)}if(n){var l=Object.keys(n).reduce(function(e,t){return e.push("["+t+'="'+n[t]+'"]'),e},[]).join("");u.push(l)}return u.length,[u.join("")]}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.length&&!e.name?u(e,t):o(e,t)}Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getSingleSelector=o,t.getMultiSelector=u,t.default=l;var c=r(3),f=n(c),s=r(5),d=n(s),p=r(2),v=n(p),y=r(0),g=r(1)},function(e,t,r){"use strict";function n(e,t){var r=t.root,n=void 0===r?document:r,u=t.skip,l=void 0===u?null:u,f=t.priority,d=void 0===f?["id","class","href","src"]:f,p=t.ignore,v=void 0===p?{}:p,y=[],g=e,m=y.length,h=!1,b=l&&(Array.isArray(l)?l:[l]).map(function(e){return"function"!=typeof e?function(t){return t===e}:e}),S=function(e){return l&&b.some(function(t){return t(e)})};for(Object.keys(v).forEach(function(e){"class"===e&&(h=!0);var t=v[e];"function"!=typeof t&&("number"==typeof t&&(t=t.toString()),"string"==typeof t&&(t=new RegExp((0,s.escapeValue)(t).replace(/\\/g,"\\\\"))),"boolean"==typeof t&&(t=t?/(?:)/:/.^/),v[e]=function(e,r){return t.test(r)})}),h&&!function(){var e=v.attribute;v.attribute=function(t,r,n){return v.class(r)||e&&e(t,r,n)}}();g!==n;){if(S(g)!==!0){if(o(d,g,v,y,n))break;if(i(g,v,y,n))break;o(d,g,v,y),y.length===m&&i(g,v,y),y.length===m&&a(d,g,v,y)}g=g.parentNode,m=y.length}if(g===n){var j=c(d,g,v);y.unshift(j)}return y.join(" ")}function o(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.parentNode,i=u(e,t,r);if(i){var l=o.querySelectorAll(i);if(1===l.length)return n.unshift(i),!0}return!1}function u(e,t,r){for(var n=t.attributes,o=Object.keys(n).sort(function(t,r){var o=e.indexOf(n[t].name),u=e.indexOf(n[r].name);return u===-1?o===-1?0:-1:o-u}),u=0,i=o.length;u3&&void 0!==arguments[3]?arguments[3]:e.parentNode,o=l(e,t);if(o){var u=n.getElementsByTagName(o);if(1===u.length)return r.unshift(o),!0}return!1}function l(e,t){var r=e.tagName.toLowerCase();return f(t.tag,null,r)?null:r}function a(e,t,r,n){for(var o=t.parentNode,u=o.childTags||o.children,i=0,l=u.length;i-1}};e.exports=t.default},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.common=t.optimize=t.getMultiSelector=t.getSingleSelector=t.select=void 0;var u=r(4);Object.defineProperty(t,"getSingleSelector",{enumerable:!0,get:function(){return u.getSingleSelector}}),Object.defineProperty(t,"getMultiSelector",{enumerable:!0,get:function(){return u.getMultiSelector}});var i=o(u),l=r(2),a=o(l),c=r(1),f=n(c);t.select=i.default,t.optimize=a.default,t.common=f,t.default=i.default}])}); //# sourceMappingURL=optimal-select.min.js.map \ No newline at end of file diff --git a/dist/optimal-select.min.js.map b/dist/optimal-select.min.js.map index 0cee6c2..89ca5bd 100644 --- a/dist/optimal-select.min.js.map +++ b/dist/optimal-select.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///optimal-select.min.js","webpack:///webpack/bootstrap e2ae245b56dad6ed497e","webpack:///./src/utilities.js","webpack:///./src/common.js","webpack:///./src/optimize.js","webpack:///./src/adapt.js","webpack:///./src/select.js","webpack:///./src/match.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","convertNodeList","nodes","length","arr","Array","escapeValue","replace","getCommonAncestor","elements","options","arguments","undefined","_options$root","document","ancestors","forEach","element","index","parents","parentNode","unshift","sort","curr","next","shallowAncestor","shift","ancestor","_loop","parent","missing","some","otherParents","otherParent","_ret","getCommonProperties","commonProperties","classes","attributes","tag","commonClasses","commonAttributes","commonTag","getAttribute","trim","split","filter","entry","elementAttributes","keys","reduce","key","attribute","attributeName","attributesNames","commonAttributesNames","nextCommonAttributes","tagName","toLowerCase","_interopRequireDefault","obj","default","optimize","selector","isArray","_utilities","nodeType","Error","globalModified","_adapt2","path","optimizePart","shortened","pop","current","prePart","join","postPart","pattern","matches","querySelectorAll","slice","test","compareResults","references","reference","contains","description","descendant","type","names","map","partial","charAt","match","_loop2","_ret2","every","_adapt","adapt","Symbol","iterator","constructor","sliceIterator","_arr","_n","_d","_e","_s","_i","done","push","err","TypeError","getSingleSelector","_typeof","_match2","optimized","_optimize2","getMultiSelector","_common","ancestorSelector","commonSelectors","getCommonSelectors","descendantSelector","selectorMatches","console","warn","_getCommonProperties","selectorPath","classSelector","attributeSelector","parts","getQuerySelector","input","_match","_optimize","node","_options$skip","skip","_options$priority","priority","_options$ignore","ignore","ignoreClass","skipCompare","skipChecks","compare","predicate","toString","RegExp","ignoreAttribute","defaultPredicate","class","checkAttributes","checkTag","checkChilds","findPattern","findAttributesPattern","sortedKeys","currPos","indexOf","nextPos","attributeValue","currentIgnore","currentDefaultIgnore","defaultIgnore","checkIgnore","className","findTagPattern","getElementsByTagName","children","childTags","child","childPattern","check","_interopRequireWildcard","newObj","common","select","_select2","_select3","_optimize3","_common2"],"mappings":"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","file":"optimal-select.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertNodeList = convertNodeList;\nexports.escapeValue = escapeValue;\n/**\n * # Utilities\n *\n * Convenience helpers.\n */\n\n/**\n * Create an array with the DOM nodes of the list\n *\n * @param {NodeList} nodes - [description]\n * @return {Array.} - [description]\n */\nfunction convertNodeList(nodes) {\n var length = nodes.length;\n\n var arr = new Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = nodes[i];\n }\n return arr;\n}\n\n/**\n * Escape special characters and line breaks as a simplified version of 'CSS.escape()'\n *\n * Description of valid characters: https://mathiasbynens.be/notes/css-escapes\n *\n * @param {String?} value - [description]\n * @return {String} - [description]\n */\nfunction escapeValue(value) {\n return value && value.replace(/['\"`\\\\/:\\?&!#$%^()[\\]{|}*+;,.<=>@~]/g, '\\\\$&').replace(/\\n/g, '\\A');\n}\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getCommonAncestor = getCommonAncestor;\nexports.getCommonProperties = getCommonProperties;\n/**\n * # Common\n *\n * Process collections for similarities.\n */\n\n/**\n * Find the last common ancestor of elements\n *\n * @param {Array.} elements - [description]\n * @return {HTMLElement} - [description]\n */\nfunction getCommonAncestor(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$root = options.root,\n root = _options$root === undefined ? document : _options$root;\n\n\n var ancestors = [];\n\n elements.forEach(function (element, index) {\n var parents = [];\n while (element !== root) {\n element = element.parentNode;\n parents.unshift(element);\n }\n ancestors[index] = parents;\n });\n\n ancestors.sort(function (curr, next) {\n return curr.length - next.length;\n });\n\n var shallowAncestor = ancestors.shift();\n\n var ancestor = null;\n\n var _loop = function _loop() {\n var parent = shallowAncestor[i];\n var missing = ancestors.some(function (otherParents) {\n return !otherParents.some(function (otherParent) {\n return otherParent === parent;\n });\n });\n\n if (missing) {\n // TODO: find similar sub-parents, not the top root, e.g. sharing a class selector\n return 'break';\n }\n\n ancestor = parent;\n };\n\n for (var i = 0, l = shallowAncestor.length; i < l; i++) {\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n\n return ancestor;\n}\n\n/**\n * Get a set of common properties of elements\n *\n * @param {Array.} elements - [description]\n * @return {Object} - [description]\n */\nfunction getCommonProperties(elements) {\n\n var commonProperties = {\n classes: [],\n attributes: {},\n tag: null\n };\n\n elements.forEach(function (element) {\n var commonClasses = commonProperties.classes,\n commonAttributes = commonProperties.attributes,\n commonTag = commonProperties.tag;\n\n // ~ classes\n\n if (commonClasses !== undefined) {\n var classes = element.getAttribute('class');\n if (classes) {\n classes = classes.trim().split(' ');\n if (!commonClasses.length) {\n commonProperties.classes = classes;\n } else {\n commonClasses = commonClasses.filter(function (entry) {\n return classes.some(function (name) {\n return name === entry;\n });\n });\n if (commonClasses.length) {\n commonProperties.classes = commonClasses;\n } else {\n delete commonProperties.classes;\n }\n }\n } else {\n // TODO: restructure removal as 2x set / 2x delete, instead of modify always replacing with new collection\n delete commonProperties.classes;\n }\n }\n\n // ~ attributes\n if (commonAttributes !== undefined) {\n (function () {\n var elementAttributes = element.attributes;\n var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) {\n var attribute = elementAttributes[key];\n var attributeName = attribute.name;\n // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour\n // (issue: https://github.com/ariya/phantomjs/issues/14634)\n if (attribute && attributeName !== 'class') {\n attributes[attributeName] = attribute.value;\n }\n return attributes;\n }, {});\n\n var attributesNames = Object.keys(attributes);\n var commonAttributesNames = Object.keys(commonAttributes);\n\n if (attributesNames.length) {\n if (!commonAttributesNames.length) {\n commonProperties.attributes = attributes;\n } else {\n commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) {\n var value = commonAttributes[name];\n if (value === attributes[name]) {\n nextCommonAttributes[name] = value;\n }\n return nextCommonAttributes;\n }, {});\n if (Object.keys(commonAttributes).length) {\n commonProperties.attributes = commonAttributes;\n } else {\n delete commonProperties.attributes;\n }\n }\n } else {\n delete commonProperties.attributes;\n }\n })();\n }\n\n // ~ tag\n if (commonTag !== undefined) {\n var tag = element.tagName.toLowerCase();\n if (!commonTag) {\n commonProperties.tag = tag;\n } else if (tag !== commonTag) {\n delete commonProperties.tag;\n }\n }\n });\n\n return commonProperties;\n}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = optimize;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _utilities = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Apply different optimization techniques\n *\n * @param {string} selector - [description]\n * @param {HTMLElement|Array.} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\n/**\n * # Optimize\n *\n * 1.) Improve efficiency through shorter selectors by removing redundancy\n * 2.) Improve robustness through selector transformation\n */\n\nfunction optimize(selector, elements) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\n // convert single entry and NodeList\n if (!Array.isArray(elements)) {\n elements = !elements.length ? [elements] : (0, _utilities.convertNodeList)(elements);\n }\n\n if (!elements.length || elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing \"elements\")');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n // chunk parts outside of quotes (http://stackoverflow.com/a/25663729)\n var path = selector.replace(/> /g, '>').split(/\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n\n if (path.length < 2) {\n return optimizePart('', selector, '', elements);\n }\n\n var shortened = [path.pop()];\n while (path.length > 1) {\n var current = path.pop();\n var prePart = path.join(' ');\n var postPart = shortened.join(' ');\n\n var pattern = prePart + ' ' + postPart;\n var matches = document.querySelectorAll(pattern);\n if (matches.length !== elements.length) {\n shortened.unshift(optimizePart(prePart, current, postPart, elements));\n }\n }\n shortened.unshift(path[0]);\n path = shortened;\n\n // optimize start + end\n path[0] = optimizePart('', path[0], path.slice(1).join(' '), elements);\n path[path.length - 1] = optimizePart(path.slice(0, -1).join(' '), path[path.length - 1], '', elements);\n\n if (globalModified) {\n delete true;\n }\n\n return path.join(' ').replace(/>/g, '> ').trim();\n}\n\n/**\n * Improve a chunk of the selector\n *\n * @param {string} prePart - [description]\n * @param {string} current - [description]\n * @param {string} postPart - [description]\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction optimizePart(prePart, current, postPart, elements) {\n if (prePart.length) prePart = prePart + ' ';\n if (postPart.length) postPart = ' ' + postPart;\n\n // robustness: attribute without value (generalization)\n if (/\\[*\\]/.test(current)) {\n var key = current.replace(/=.*$/, ']');\n var pattern = '' + prePart + key + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = key;\n } else {\n // robustness: replace specific key-value with base tag (heuristic)\n var references = document.querySelectorAll('' + prePart + key);\n\n var _loop = function _loop() {\n var reference = references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n }\n }\n\n // robustness: descendant instead child (heuristic)\n if (/>/.test(current)) {\n var descendant = current.replace(/>/, '');\n var pattern = '' + prePart + descendant + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = descendant;\n }\n }\n\n // robustness: 'nth-of-type' instead 'nth-child' (heuristic)\n if (/:nth-child/.test(current)) {\n // TODO: consider complete coverage of 'nth-of-type' replacement\n var type = current.replace(/nth-child/g, 'nth-of-type');\n var pattern = '' + prePart + type + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = type;\n }\n }\n\n // efficiency: combinations of classname (partial permutations)\n if (/\\.\\S+\\.\\S+/.test(current)) {\n var names = current.trim().split('.').slice(1).map(function (name) {\n return '.' + name;\n }).sort(function (curr, next) {\n return curr.length - next.length;\n });\n while (names.length) {\n var partial = current.replace(names.shift(), '').trim();\n var pattern = ('' + prePart + partial + postPart).trim();\n if (!pattern.length || pattern.charAt(0) === '>' || pattern.charAt(pattern.length - 1) === '>') {\n break;\n }\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = partial;\n }\n }\n\n // robustness: degrade complex classname (heuristic)\n names = current && current.match(/\\./g);\n if (names && names.length > 2) {\n var _references = document.querySelectorAll('' + prePart + current);\n\n var _loop2 = function _loop2() {\n var reference = _references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n // TODO:\n // - check using attributes + regard excludes\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = _references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret2 = _loop2();\n\n if (_ret2 === 'break') break;\n }\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate matches with expected elements\n *\n * @param {Array.} matches - [description]\n * @param {Array.} elements - [description]\n * @return {Boolean} - [description]\n */\nfunction compareResults(matches, elements) {\n var length = matches.length;\n\n return length === elements.length && elements.every(function (element) {\n for (var i = 0; i < length; i++) {\n if (matches[i] === element) {\n return true;\n }\n }\n return false;\n });\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = adapt;\n/**\n * # Adapt\n *\n * Check and extend the environment for universal usage.\n */\n\n/**\n * Modify the context based on the environment\n *\n * @param {HTMLELement} element - [description]\n * @param {Object} options - [description]\n * @return {boolean} - [description]\n */\nfunction adapt(element, options) {\n\n // detect environment setup\n if (true) {\n return false;\n } else {\n global.document = options.context || function () {\n var root = element;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n }();\n }\n\n // https://github.com/fb55/domhandler/blob/master/index.js#L75\n var ElementPrototype = Object.getPrototypeOf(true);\n\n // alternative descriptor to access elements with filtering invalid elements (e.g. textnodes)\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'childTags')) {\n Object.defineProperty(ElementPrototype, 'childTags', {\n enumerable: true,\n get: function get() {\n return this.children.filter(function (node) {\n // https://github.com/fb55/domelementtype/blob/master/index.js#L12\n return node.type === 'tag' || node.type === 'script' || node.type === 'style';\n });\n }\n });\n }\n\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'attributes')) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap\n Object.defineProperty(ElementPrototype, 'attributes', {\n enumerable: true,\n get: function get() {\n var attribs = this.attribs;\n\n var attributesNames = Object.keys(attribs);\n var NamedNodeMap = attributesNames.reduce(function (attributes, attributeName, index) {\n attributes[index] = {\n name: attributeName,\n value: attribs[attributeName]\n };\n return attributes;\n }, {});\n Object.defineProperty(NamedNodeMap, 'length', {\n enumerable: false,\n configurable: false,\n value: attributesNames.length\n });\n return NamedNodeMap;\n }\n });\n }\n\n if (!ElementPrototype.getAttribute) {\n // https://docs.webplatform.org/wiki/dom/Element/getAttribute\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute\n ElementPrototype.getAttribute = function (name) {\n return this.attribs[name] || null;\n };\n }\n\n if (!ElementPrototype.getElementsByTagName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByTagName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName\n ElementPrototype.getElementsByTagName = function (tagName) {\n var HTMLCollection = [];\n traverseDescendants(this.childTags, function (descendant) {\n if (descendant.name === tagName || tagName === '*') {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.getElementsByClassName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByClassName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByClassName\n ElementPrototype.getElementsByClassName = function (className) {\n var names = className.trim().replace(/\\s+/g, ' ').split(' ');\n var HTMLCollection = [];\n traverseDescendants([this], function (descendant) {\n var descendantClassName = descendant.attribs.class;\n if (descendantClassName && names.every(function (name) {\n return descendantClassName.indexOf(name) > -1;\n })) {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.querySelectorAll) {\n // https://docs.webplatform.org/wiki/css/selectors_api/querySelectorAll\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll\n ElementPrototype.querySelectorAll = function (selectors) {\n var _this = this;\n\n selectors = selectors.replace(/(>)(\\S)/g, '$1 $2').trim(); // add space for '>' selector\n\n // using right to left execution => https://github.com/fb55/css-select#how-does-it-work\n var instructions = getInstructions(selectors);\n var discover = instructions.shift();\n\n var total = instructions.length;\n return discover(this).filter(function (node) {\n var step = 0;\n while (step < total) {\n node = instructions[step](node, _this);\n if (!node) {\n // hierarchy doesn't match\n return false;\n }\n step += 1;\n }\n return true;\n });\n };\n }\n\n if (!ElementPrototype.contains) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/contains\n ElementPrototype.contains = function (element) {\n var inclusive = false;\n traverseDescendants([this], function (descendant, done) {\n if (descendant === element) {\n inclusive = true;\n done();\n }\n });\n return inclusive;\n };\n }\n\n return true;\n}\n\n/**\n * Retrieve transformation steps\n *\n * @param {Array.} selectors - [description]\n * @return {Array.} - [description]\n */\nfunction getInstructions(selectors) {\n return selectors.split(' ').reverse().map(function (selector, step) {\n var discover = step === 0;\n\n var _selector$split = selector.split(':'),\n _selector$split2 = _slicedToArray(_selector$split, 2),\n type = _selector$split2[0],\n pseudo = _selector$split2[1];\n\n var validate = null;\n var instruction = null;\n\n (function () {\n switch (true) {\n\n // child: '>'\n case />/.test(type):\n instruction = function checkParent(node) {\n return function (validate) {\n return validate(node.parent) && node.parent;\n };\n };\n break;\n\n // class: '.'\n case /^\\./.test(type):\n var names = type.substr(1).split('.');\n validate = function validate(node) {\n var nodeClassName = node.attribs.class;\n return nodeClassName && names.every(function (name) {\n return nodeClassName.indexOf(name) > -1;\n });\n };\n instruction = function checkClass(node, root) {\n if (discover) {\n return node.getElementsByClassName(names.join(' '));\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // attribute: '[key=\"value\"]'\n case /^\\[/.test(type):\n var _type$replace$split = type.replace(/\\[|\\]|\"/g, '').split('='),\n _type$replace$split2 = _slicedToArray(_type$replace$split, 2),\n attributeKey = _type$replace$split2[0],\n attributeValue = _type$replace$split2[1];\n\n validate = function validate(node) {\n var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1;\n if (hasAttribute) {\n // regard optional attributeValue\n if (!attributeValue || node.attribs[attributeKey] === attributeValue) {\n return true;\n }\n }\n return false;\n };\n instruction = function checkAttribute(node, root) {\n if (discover) {\n var _ret2 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // id: '#'\n case /^#/.test(type):\n var id = type.substr(1);\n validate = function validate(node) {\n return node.attribs.id === id;\n };\n instruction = function checkId(node, root) {\n if (discover) {\n var _ret3 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant, done) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n done();\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === \"object\") return _ret3.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // universal: '*'\n case /\\*/.test(type):\n validate = function validate(node) {\n return true;\n };\n instruction = function checkUniversal(node, root) {\n if (discover) {\n var _ret4 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n return NodeList.push(descendant);\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret4 === 'undefined' ? 'undefined' : _typeof(_ret4)) === \"object\") return _ret4.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // tag: '...'\n default:\n validate = function validate(node) {\n return node.name === type;\n };\n instruction = function checkTag(node, root) {\n if (discover) {\n var _ret5 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === \"object\") return _ret5.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n }\n })();\n\n if (!pseudo) {\n return instruction;\n }\n\n var rule = pseudo.match(/-(child|type)\\((\\d+)\\)$/);\n var kind = rule[1];\n var index = parseInt(rule[2], 10) - 1;\n\n var validatePseudo = function validatePseudo(node) {\n if (node) {\n var compareSet = node.parent.childTags;\n if (kind === 'type') {\n compareSet = compareSet.filter(validate);\n }\n var nodeIndex = compareSet.findIndex(function (child) {\n return child === node;\n });\n if (nodeIndex === index) {\n return true;\n }\n }\n return false;\n };\n\n return function enhanceInstruction(node) {\n var match = instruction(node);\n if (discover) {\n return match.reduce(function (NodeList, matchedNode) {\n if (validatePseudo(matchedNode)) {\n NodeList.push(matchedNode);\n }\n return NodeList;\n }, []);\n }\n return validatePseudo(match) && match;\n };\n });\n}\n\n/**\n * Walking recursive to invoke callbacks\n *\n * @param {Array.} nodes - [description]\n * @param {Function} handler - [description]\n */\nfunction traverseDescendants(nodes, handler) {\n nodes.forEach(function (node) {\n var progress = true;\n handler(node, function () {\n return progress = false;\n });\n if (node.childTags && progress) {\n traverseDescendants(node.childTags, handler);\n }\n });\n}\n\n/**\n * Bubble up from bottom to top\n *\n * @param {HTMLELement} node - [description]\n * @param {HTMLELement} root - [description]\n * @param {Function} validate - [description]\n * @return {HTMLELement} - [description]\n */\nfunction getAncestor(node, root, validate) {\n while (node.parent) {\n node = node.parent;\n if (validate(node)) {\n return node;\n }\n if (node === root) {\n break;\n }\n }\n return null;\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /**\n * # Select\n *\n * Construct a unique CSS query selector to access the selected DOM element(s).\n * For longevity it applies different matching and optimization strategies.\n */\n\nexports.getSingleSelector = getSingleSelector;\nexports.getMultiSelector = getMultiSelector;\nexports.default = getQuerySelector;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _match = __webpack_require__(5);\n\nvar _match2 = _interopRequireDefault(_match);\n\nvar _optimize = __webpack_require__(2);\n\nvar _optimize2 = _interopRequireDefault(_optimize);\n\nvar _utilities = __webpack_require__(0);\n\nvar _common = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Get a selector for the provided element\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getSingleSelector(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (element.nodeType === 3) {\n element = element.parentNode;\n }\n\n if (element.nodeType !== 1) {\n throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not \"' + (typeof element === 'undefined' ? 'undefined' : _typeof(element)) + '\")');\n }\n\n var globalModified = (0, _adapt2.default)(element, options);\n\n var selector = (0, _match2.default)(element, options);\n var optimized = (0, _optimize2.default)(selector, element, options);\n\n // debug\n // console.log(`\n // selector: ${selector}\n // optimized: ${optimized}\n // `)\n\n if (globalModified) {\n delete true;\n }\n\n return optimized;\n}\n\n/**\n * Get a selector to match multiple descendants from an ancestor\n *\n * @param {Array.|NodeList} elements - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getMultiSelector(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (!Array.isArray(elements)) {\n elements = (0, _utilities.convertNodeList)(elements);\n }\n\n if (elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - only an Array of HTMLElements or representations of them is supported!');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n var ancestor = (0, _common.getCommonAncestor)(elements, options);\n var ancestorSelector = getSingleSelector(ancestor, options);\n\n // TODO: consider usage of multiple selectors + parent-child relation + check for part redundancy\n var commonSelectors = getCommonSelectors(elements);\n var descendantSelector = commonSelectors[0];\n\n var selector = (0, _optimize2.default)(ancestorSelector + ' ' + descendantSelector, elements, options);\n var selectorMatches = (0, _utilities.convertNodeList)(document.querySelectorAll(selector));\n\n if (!elements.every(function (element) {\n return selectorMatches.some(function (entry) {\n return entry === element;\n });\n })) {\n // TODO: cluster matches to split into similar groups for sub selections\n return console.warn('\\n The selected elements can\\'t be efficiently mapped.\\n Its probably best to use multiple single selectors instead!\\n ', elements);\n }\n\n if (globalModified) {\n delete true;\n }\n\n return selector;\n}\n\n/**\n * Get selectors to describe a set of elements\n *\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction getCommonSelectors(elements) {\n var _getCommonProperties = (0, _common.getCommonProperties)(elements),\n classes = _getCommonProperties.classes,\n attributes = _getCommonProperties.attributes,\n tag = _getCommonProperties.tag;\n\n var selectorPath = [];\n\n if (tag) {\n selectorPath.push(tag);\n }\n\n if (classes) {\n var classSelector = classes.map(function (name) {\n return '.' + name;\n }).join('');\n selectorPath.push(classSelector);\n }\n\n if (attributes) {\n var attributeSelector = Object.keys(attributes).reduce(function (parts, name) {\n parts.push('[' + name + '=\"' + attributes[name] + '\"]');\n return parts;\n }, []).join('');\n selectorPath.push(attributeSelector);\n }\n\n if (selectorPath.length) {\n // TODO: check for parent-child relation\n }\n\n return [selectorPath.join('')];\n}\n\n/**\n * Choose action depending on the input (multiple/single)\n *\n * NOTE: extended detection is used for special cases like the element with \n *\n * @param {HTMLElement|NodeList|Array.} input - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function getQuerySelector (input, options = {}) {\n if (input.length && !input.name) {\n return getMultiSelector(input, options)\n }\n return getSingleSelector(input, options)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/select.js","/**\n * # Match\n *\n * Retrieve selector for a node.\n */\n\nimport { escapeValue } from './utilities'\n\nconst defaultIgnore = {\n attribute (attributeName) {\n return [\n 'style',\n 'data-reactid',\n 'data-react-checksum'\n ].indexOf(attributeName) > -1\n }\n}\n\n/**\n * Get the path of the element\n *\n * @param {HTMLElement} node - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function match (node, options) {\n\n const {\n root = document,\n skip = null,\n priority = ['id', 'class', 'href', 'src'],\n ignore = {}\n } = options\n\n const path = []\n var element = node\n var length = path.length\n var ignoreClass = false\n\n const skipCompare = skip && (Array.isArray(skip) ? skip : [skip]).map((entry) => {\n if (typeof entry !== 'function') {\n return (element) => element === entry\n }\n return entry\n })\n\n const skipChecks = (element) => {\n return skip && skipCompare.some((compare) => compare(element))\n }\n\n Object.keys(ignore).forEach((type) => {\n if (type === 'class') {\n ignoreClass = true\n }\n var predicate = ignore[type]\n if (typeof predicate === 'function') return\n if (typeof predicate === 'number') {\n predicate = predicate.toString()\n }\n if (typeof predicate === 'string') {\n predicate = new RegExp(escapeValue(predicate).replace(/\\\\/g, '\\\\\\\\'))\n }\n if (typeof predicate === 'boolean') {\n predicate = predicate ? /(?:)/ : /.^/\n }\n // check class-/attributename for regex\n ignore[type] = (name, value) => predicate.test(value)\n })\n\n if (ignoreClass) {\n const ignoreAttribute = ignore.attribute\n ignore.attribute = (name, value, defaultPredicate) => {\n return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate)\n }\n }\n\n while (element !== root) {\n if (skipChecks(element) !== true) {\n // ~ global\n if (checkAttributes(priority, element, ignore, path, root)) break\n if (checkTag(element, ignore, path, root)) break\n\n // ~ local\n checkAttributes(priority, element, ignore, path)\n if (path.length === length) {\n checkTag(element, ignore, path)\n }\n\n // define only one part each iteration\n if (path.length === length) {\n checkChilds(priority, element, ignore, path)\n }\n }\n\n element = element.parentNode\n length = path.length\n }\n\n if (element === root) {\n const pattern = findPattern(priority, element, ignore)\n path.unshift(pattern)\n }\n\n return path.join(' ')\n}\n\n/**\n * Extend path with attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkAttributes (priority, element, ignore, path, parent = element.parentNode) {\n const pattern = findAttributesPattern(priority, element, ignore)\n if (pattern) {\n const matches = parent.querySelectorAll(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string?} - [description]\n */\nfunction findAttributesPattern (priority, element, ignore) {\n const attributes = element.attributes\n const sortedKeys = Object.keys(attributes).sort((curr, next) => {\n const currPos = priority.indexOf(attributes[curr].name)\n const nextPos = priority.indexOf(attributes[next].name)\n if (nextPos === -1) {\n if (currPos === -1) {\n return 0\n }\n return -1\n }\n return currPos - nextPos\n })\n\n for (var i = 0, l = sortedKeys.length; i < l; i++) {\n const key = sortedKeys[i]\n const attribute = attributes[key]\n const attributeName = attribute.name\n const attributeValue = escapeValue(attribute.value)\n\n const currentIgnore = ignore[attributeName] || ignore.attribute\n const currentDefaultIgnore = defaultIgnore[attributeName] || defaultIgnore.attribute\n if (checkIgnore(currentIgnore, attributeName, attributeValue, currentDefaultIgnore)) {\n continue\n }\n\n var pattern = `[${attributeName}=\"${attributeValue}\"]`\n\n if ((/\\b\\d/).test(attributeValue) === false) {\n if (attributeName === 'id') {\n pattern = `#${attributeValue}`\n }\n\n if (attributeName === 'class') {\n const className = attributeValue.trim().replace(/\\s+/g, '.')\n pattern = `.${className}`\n }\n }\n\n return pattern\n }\n return null\n}\n\n/**\n * Extend path with tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkTag (element, ignore, path, parent = element.parentNode) {\n const pattern = findTagPattern(element, ignore)\n if (pattern) {\n const matches = parent.getElementsByTagName(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {boolean} - [description]\n */\nfunction findTagPattern (element, ignore) {\n const tagName = element.tagName.toLowerCase()\n if (checkIgnore(ignore.tag, null, tagName)) {\n return null\n }\n return tagName\n}\n\n/**\n * Extend path with specific child identifier\n *\n * NOTE: 'childTags' is a custom property to use as a view filter for tags using 'adapter.js'\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @return {boolean} - [description]\n */\nfunction checkChilds (priority, element, ignore, path) {\n const parent = element.parentNode\n const children = parent.childTags || parent.children\n for (var i = 0, l = children.length; i < l; i++) {\n const child = children[i]\n if (child === element) {\n const childPattern = findPattern(priority, child, ignore)\n if (!childPattern) {\n return console.warn(`\n Element couldn\\'t be matched through strict ignore pattern!\n `, child, ignore, childPattern)\n }\n const pattern = `> ${childPattern}:nth-child(${i+1})`\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string} - [description]\n */\nfunction findPattern (priority, element, ignore) {\n var pattern = findAttributesPattern(priority, element, ignore)\n if (!pattern) {\n pattern = findTagPattern(element, ignore)\n }\n return pattern\n}\n\n/**\n * Validate with custom and default functions\n *\n * @param {Function} predicate - [description]\n * @param {string?} name - [description]\n * @param {string} value - [description]\n * @param {Function} defaultPredicate - [description]\n * @return {boolean} - [description]\n */\nfunction checkIgnore (predicate, name, value, defaultPredicate) {\n if (!value) {\n return true\n }\n const check = predicate || defaultPredicate\n if (!check) {\n return false\n }\n return check(name, value, defaultPredicate)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/match.js","export select, { getSingleSelector, getMultiSelector } from './select'\nexport optimize from './optimize'\nexport * as common from './common'\n\nexport default from './select'\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///optimal-select.min.js","webpack:///webpack/bootstrap c8a29d84547f0b915b76","webpack:///./src/utilities.js","webpack:///./src/common.js","webpack:///./src/optimize.js","webpack:///./src/adapt.js","webpack:///./src/select.js","webpack:///./src/match.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","convertNodeList","nodes","length","arr","Array","escapeValue","replace","getCommonAncestor","elements","options","arguments","undefined","_options$root","document","ancestors","forEach","element","index","parents","parentNode","unshift","sort","curr","next","shallowAncestor","shift","ancestor","_loop","parent","missing","some","otherParents","otherParent","_ret","getCommonProperties","commonProperties","classes","attributes","tag","commonClasses","commonAttributes","commonTag","getAttribute","trim","split","filter","entry","elementAttributes","keys","reduce","key","attribute","attributeName","attributesNames","commonAttributesNames","nextCommonAttributes","tagName","toLowerCase","_interopRequireDefault","obj","default","optimize","selector","isArray","_utilities","nodeType","Error","globalModified","_adapt2","path","optimizePart","shortened","pop","current","prePart","join","postPart","pattern","matches","querySelectorAll","slice","test","compareResults","references","reference","contains","description","descendant","type","names","map","partial","charAt","match","_loop2","_ret2","every","_adapt","adapt","Symbol","iterator","constructor","sliceIterator","_arr","_n","_d","_e","_s","_i","done","push","err","TypeError","getSingleSelector","_typeof","_match2","optimized","_optimize2","getMultiSelector","_common","ancestorSelector","commonSelectors","getCommonSelectors","descendantSelector","selectorMatches","console","warn","_getCommonProperties","selectorPath","classSelector","attributeSelector","parts","getQuerySelector","input","_match","_optimize","node","_options$skip","skip","_options$priority","priority","_options$ignore","ignore","ignoreClass","skipCompare","skipChecks","compare","predicate","toString","RegExp","ignoreAttribute","defaultPredicate","class","checkAttributes","checkTag","checkChilds","findPattern","findAttributesPattern","sortedKeys","currPos","indexOf","nextPos","attributeValue","currentIgnore","currentDefaultIgnore","defaultIgnore","checkIgnore","className","findTagPattern","getElementsByTagName","children","childTags","child","childPattern","check","_interopRequireWildcard","newObj","common","select","_select2","_select3","_optimize3","_common2"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,cAAAD,IAEAD,EAAA,cAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAE,EAAAF,EACAG,GAAA,EACAV,WAUA,OANAK,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,GAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KA+DA,OAnCAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAG,EAAA,SAAAK,GAA2C,MAAAA,IAG3CR,EAAAS,EAAA,SAAAf,EAAAgB,EAAAC,GACAX,EAAAY,EAAAlB,EAAAgB,IACAG,OAAAC,eAAApB,EAAAgB,GACAK,cAAA,EACAC,YAAA,EACAC,IAAAN,KAMAX,EAAAkB,EAAA,SAAAvB,GACA,GAAAgB,GAAAhB,KAAAwB,WACA,WAA2B,MAAAxB,GAAA,SAC3B,WAAiC,MAAAA,GAEjC,OADAK,GAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAQ,EAAAC,GAAsD,MAAAR,QAAAS,UAAAC,eAAAlB,KAAAe,EAAAC,IAGtDrB,EAAAwB,EAAA,GAGAxB,IAAAyB,EAAA,KDgBM,SAAS9B,EAAQD,EAASM,GAEhC,YEtEO,SAAS0B,GAAiBC,GAG/B,IAAK,GAFGC,GAAWD,EAAXC,OACFC,EAAM,GAAIC,OAAMF,GACbzB,EAAI,EAAGA,EAAIyB,EAAQzB,IAC1B0B,EAAI1B,GAAKwB,EAAMxB,EAEjB,OAAO0B,GAWF,QAASE,GAAavB,GAC3B,MAAOA,IAASA,EAAMwB,QAAQ,wCAAwC,QAChDA,QAAQ,MAAO,IFsDvCnB,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,IAETd,EE5EgBgC,kBF6EhBhC,EE5DgBqC,eFiGV,SAASpC,EAAQD,EAASM,GAEhC,YGpHO,SAASiC,GAAmBC,GAAwB,GAAdC,GAAcC,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,MAAAE,EAIrDH,EADF3C,OAHuD6C,SAAAC,EAGhDC,SAHgDD,EAMnDE,IAENN,GAASO,QAAQ,SAACC,EAASC,GAEzB,IADA,GAAMC,MACCF,IAAYlD,GACjBkD,EAAUA,EAAQG,WAClBD,EAAQE,QAAQJ,EAElBF,GAAUG,GAASC,IAGrBJ,EAAUO,KAAK,SAACC,EAAMC,GAAP,MAAgBD,GAAKpB,OAASqB,EAAKrB,QAMlD,KAAK,GAJCsB,GAAkBV,EAAUW,QAE9BC,EAAW,KArB0CC,EAAA,WAwBvD,GAAMC,GAASJ,EAAgB/C,GACzBoD,EAAUf,EAAUgB,KAAK,SAACC,GAC9B,OAAQA,EAAaD,KAAK,SAACE,GAAD,MAAiBA,KAAgBJ,KAG7D,OAAIC,GAEF,aAGFH,EAAWE,IAXJnD,EAAI,EAAGC,EAAI8C,EAAgBtB,OAAQzB,EAAIC,EAAGD,IAAK,IAAAwD,GAAAN,GAAA,cAAAM,EAQpD,MAMJ,MAAOP,GASF,QAASQ,GAAqB1B,GAEnC,GAAM2B,IACJC,WACAC,cACAC,IAAK,KAkFP,OA/EA9B,GAASO,QAAQ,SAACC,GAAY,GAGjBuB,GAGPJ,EAHFC,QACYI,EAEVL,EAFFE,WACKI,EACHN,EADFG,GAIF,IAAsB3B,SAAlB4B,EAA6B,CAC/B,GAAIH,GAAUpB,EAAQ0B,aAAa,QAC/BN,IACFA,EAAUA,EAAQO,OAAOC,MAAM,KAC1BL,EAAcrC,QAGjBqC,EAAgBA,EAAcM,OAAO,SAACC,GAAD,MAAWV,GAAQN,KAAK,SAAC9C,GAAD,MAAUA,KAAS8D,MAC5EP,EAAcrC,OAChBiC,EAAiBC,QAAUG,QAEpBJ,GAAiBC,SAN1BD,EAAiBC,QAAUA,SAWtBD,GAAiBC,QA4C5B,GAvCyBzB,SAArB6B,IAAgC,WAClC,GAAMO,GAAoB/B,EAAQqB,WAC5BA,EAAalD,OAAO6D,KAAKD,GAAmBE,OAAO,SAACZ,EAAYa,GACpE,GAAMC,GAAYJ,EAAkBG,GAC9BE,EAAgBD,EAAUnE,IAMhC,OAHImE,IAA+B,UAAlBC,IACff,EAAWe,GAAiBD,EAAUrE,OAEjCuD,OAGHgB,EAAkBlE,OAAO6D,KAAKX,GAC9BiB,EAAwBnE,OAAO6D,KAAKR,EAEtCa,GAAgBnD,OACboD,EAAsBpD,QAGzBsC,EAAmBc,EAAsBL,OAAO,SAACM,EAAsBvE,GACrE,GAAMF,GAAQ0D,EAAiBxD,EAI/B,OAHIF,KAAUuD,EAAWrD,KACvBuE,EAAqBvE,GAAQF,GAExByE,OAELpE,OAAO6D,KAAKR,GAAkBtC,OAChCiC,EAAiBE,WAAaG,QAEvBL,GAAiBE,YAZ1BF,EAAiBE,WAAaA,QAgBzBF,GAAiBE,cAKV1B,SAAd8B,EAAyB,CAC3B,GAAMH,GAAMtB,EAAQwC,QAAQC,aACvBhB,GAEMH,IAAQG,SACVN,GAAiBG,IAFxBH,EAAiBG,IAAMA,KAOtBH,EHdThD,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,IAETd,EG1HgBuC,oBH2HhBvC,EG7EgBkE,uBHkPV,SAASjE,EAAQD,EAASM,GAEhC,YAcA,SAASoF,GAAuBC,GAAO,MAAOA,IAAOA,EAAIlE,WAAakE,GAAQC,QAASD,GI1SxE,QAASE,GAAUC,EAAUtD,GAAwB,GAAdC,GAAcC,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,KAOlE,IAJKN,MAAM2D,QAAQvD,KACjBA,EAAYA,EAASN,QAAsB,EAAA8D,EAAAhE,iBAAgBQ,IAA5BA,KAG5BA,EAASN,QAAUM,EAASsB,KAAK,SAACd,GAAD,MAAkC,KAArBA,EAAQiD,WACzD,KAAM,IAAIC,OAAJ,6HAGR,IAAMC,IAAiB,EAAAC,EAAAR,SAAMpD,EAAS,GAAIC,GAGtC4D,EAAOP,EAASxD,QAAQ,MAAO,KAAKsC,MAAM,kCAE9C,IAAIyB,EAAKnE,OAAS,EAChB,MAAOoE,GAAa,GAAIR,EAAU,GAAItD,EAIxC,KADA,GAAM+D,IAAaF,EAAKG,OACjBH,EAAKnE,OAAS,GAAI,CACvB,GAAMuE,GAAUJ,EAAKG,MACfE,EAAUL,EAAKM,KAAK,KACpBC,EAAWL,EAAUI,KAAK,KAE1BE,EAAaH,EAAb,IAAwBE,EACxBE,EAAUjE,SAASkE,iBAAiBF,EACtCC,GAAQ5E,SAAWM,EAASN,QAC9BqE,EAAUnD,QAAQkD,EAAaI,EAASD,EAASG,EAAUpE,IAc/D,MAXA+D,GAAUnD,QAAQiD,EAAK,IACvBA,EAAOE,EAGPF,EAAK,GAAKC,EAAa,GAAID,EAAK,GAAIA,EAAKW,MAAM,GAAGL,KAAK,KAAMnE,GAC7D6D,EAAKA,EAAKnE,OAAO,GAAKoE,EAAaD,EAAKW,MAAM,GAAG,GAAIL,KAAK,KAAMN,EAAKA,EAAKnE,OAAO,GAAI,GAAIM,GAErF2D,UACK,EAGFE,EAAKM,KAAK,KAAKrE,QAAQ,KAAM,MAAMqC,OAY5C,QAAS2B,GAAcI,EAASD,EAASG,EAAUpE,GAKjD,GAJIkE,EAAQxE,SAAQwE,GAAA,KAChBE,EAAS1E,SAAQ0E,MAAeA,GAGhC,QAAQK,KAAKR,GAAU,CACzB,GAAMvB,GAAMuB,EAAQnE,QAAQ,OAAQ,KAChCuE,KAAaH,EAAUxB,EAAM0B,EAC7BE,EAAUjE,SAASkE,iBAAiBF,EACxC,IAAIK,EAAeJ,EAAStE,GAC1BiE,EAAUvB,MAIV,KAAK,GADCiC,GAAatE,SAASkE,iBAAT,GAA6BL,EAAUxB,GAFrDvB,EAAA,WAIH,GAAMyD,GAAYD,EAAW1G,EAC7B,IAAI+B,EAASsB,KAAK,SAACd,GAAD,MAAaoE,GAAUC,SAASrE,KAAW,CAC3D,GAAMsE,GAAcF,EAAU5B,QAAQC,aAMtC,OALIoB,MAAaH,EAAUY,EAAcV,EACrCE,EAAUjE,SAASkE,iBAAiBF,GACpCK,EAAeJ,EAAStE,KAC1BiE,EAAUa,GAEZ,UATK7G,EAAI,EAAGC,EAAIyG,EAAWjF,OAAQzB,EAAIC,EAAGD,IAAK,IAI3CoG,GACAC,EAL2C7C,EAAAN,GAAA,cAAAM,EAS/C,OAOR,GAAI,IAAIgD,KAAKR,GAAU,CACrB,GAAMc,GAAad,EAAQnE,QAAQ,IAAK,IACpCuE,KAAaH,EAAUa,EAAaX,EACpCE,EAAUjE,SAASkE,iBAAiBF,EACpCK,GAAeJ,EAAStE,KAC1BiE,EAAUc,GAKd,GAAI,aAAaN,KAAKR,GAAU,CAE9B,GAAMe,GAAOf,EAAQnE,QAAQ,aAAc,eACvCuE,KAAaH,EAAUc,EAAOZ,EAC9BE,EAAUjE,SAASkE,iBAAiBF,EACpCK,GAAeJ,EAAStE,KAC1BiE,EAAUe,GAKd,GAAI,aAAaP,KAAKR,GAAU,CAI9B,IAHA,GAAIgB,GAAQhB,EAAQ9B,OAAOC,MAAM,KAAKoC,MAAM,GACNU,IAAI,SAAC1G,GAAD,UAAcA,IAClBqC,KAAK,SAACC,EAAMC,GAAP,MAAgBD,GAAKpB,OAASqB,EAAKrB,SACvEuF,EAAMvF,QAAQ,CACnB,GAAMyF,GAAUlB,EAAQnE,QAAQmF,EAAMhE,QAAS,IAAIkB,OAC/CkC,GAAU,GAAGH,EAAUiB,EAAUf,GAAWjC,MAChD,KAAKkC,EAAQ3E,QAAgC,MAAtB2E,EAAQe,OAAO,IAAmD,MAArCf,EAAQe,OAAOf,EAAQ3E,OAAO,GAChF,KAEF,IAAI4E,GAAUjE,SAASkE,iBAAiBF,EACpCK,GAAeJ,EAAStE,KAC1BiE,EAAUkB,GAMd,GADAF,EAAQhB,GAAWA,EAAQoB,MAAM,OAC7BJ,GAASA,EAAMvF,OAAS,EAE1B,IAAK,GADCiF,GAAatE,SAASkE,iBAAT,GAA6BL,EAAUD,GAD7BqB,EAAA,WAG3B,GAAMV,GAAYD,EAAW1G,EAC7B,IAAI+B,EAASsB,KAAK,SAACd,GAAD,MAAaoE,GAAUC,SAASrE,KAAY,CAG5D,GAAMsE,GAAcF,EAAU5B,QAAQC,aAMtC,OALIoB,MAAaH,EAAUY,EAAcV,EACrCE,EAAUjE,SAASkE,iBAAiBF,GACpCK,EAAeJ,EAAStE,KAC1BiE,EAAUa,GAEZ,UAXK7G,EAAI,EAAGC,EAAIyG,EAAWjF,OAAQzB,EAAIC,EAAGD,IAAK,IAM3CoG,GACAC,EAP2CiB,EAAAD,GAAA,cAAAC,EAW/C,OAMR,MAAOtB,GAUT,QAASS,GAAgBJ,EAAStE,GAAU,GAClCN,GAAW4E,EAAX5E,MACR,OAAOA,KAAWM,EAASN,QAAUM,EAASwF,MAAM,SAAChF,GACnD,IAAK,GAAIvC,GAAI,EAAGA,EAAIyB,EAAQzB,IAC1B,GAAIqG,EAAQrG,KAAOuC,EACjB,OAAO,CAGX,QAAO,IJ8HX7B,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,IAETd,EAAQ4F,QIlSgBC,CAXxB,IAAAoC,GAAA3H,EAAA,GJiTI8F,EAAUV,EAAuBuC,GIhTrCjC,EAAA1F,EAAA,EJ0gBAL,GAAOD,QAAUA,EAAiB,SAI5B,SAASC,EAAQD,EAASM,GAEhC,YK3gBe,SAAS4H,GAAOlF,EAASP,GAIpC,OAAO,EL0gBXtB,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,GAGuB,mBAAXqH,SAAoD,gBAApBA,QAAOC,SAAwB,SAAUzC,GAAO,aAAcA,IAAS,SAAUA,GAAO,MAAOA,IAAyB,kBAAXwC,SAAyBxC,EAAI0C,cAAgBF,QAAUxC,IAAQwC,OAAOvG,UAAY,eAAkB+D,IAEjP,WAAc,QAAS2C,GAAcnG,EAAK1B,GAAK,GAAI8H,MAAeC,GAAK,EAAUC,GAAK,EAAWC,EAAK/F,MAAW,KAAM,IAAK,GAAiCgG,GAA7BC,EAAKzG,EAAIgG,OAAOC,cAAmBI,GAAMG,EAAKC,EAAGrF,QAAQsF,QAAoBN,EAAKO,KAAKH,EAAG7H,QAAYL,GAAK8H,EAAKrG,SAAWzB,GAA3D+H,GAAK,IAAoE,MAAOO,GAAON,GAAK,EAAMC,EAAKK,EAAO,QAAU,KAAWP,GAAMI,EAAW,QAAGA,EAAW,SAAO,QAAU,GAAIH,EAAI,KAAMC,IAAQ,MAAOH,GAAQ,MAAO,UAAUpG,EAAK1B,GAAK,GAAI2B,MAAM2D,QAAQ5D,GAAQ,MAAOA,EAAY,IAAIgG,OAAOC,WAAYjH,QAAOgB,GAAQ,MAAOmG,GAAcnG,EAAK1B,EAAa,MAAM,IAAIuI,WAAU,2DAEtlBhJ,GAAQ4F,QKthBgBsC,EL+5BxBjI,EAAOD,QAAUA,EAAiB,SAI5B,SAASC,EAAQD,EAASM,GAEhC,YAkCA,SAASoF,GAAuBC,GAAO,MAAOA,IAAOA,EAAIlE,WAAakE,GAAQC,QAASD,GMh8BhF,QAASsD,GAAmBjG,GAAuB,GAAdP,GAAcC,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,KAMxD,IAJyB,IAArBM,EAAQiD,WACVjD,EAAUA,EAAQG,YAGK,IAArBH,EAAQiD,SACV,KAAM,IAAIC,OAAJ,yGAAsGlD,GAAtG,YAAAkG,EAAsGlG,IAAtG,KAGR,IAAMmD,IAAiB,EAAAC,EAAAR,SAAM5C,EAASP,GAEhCqD,GAAW,EAAAqD,EAAAvD,SAAM5C,EAASP,GAC1B2G,GAAY,EAAAC,EAAAzD,SAASE,EAAU9C,EAASP,EAY9C,OAJI0D,WACK,EAGFiD,EAUF,QAASE,GAAkB9G,GAAwB,GAAdC,GAAcC,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,KAMxD,IAJKN,MAAM2D,QAAQvD,KACjBA,GAAW,EAAAwD,EAAAhE,iBAAgBQ,IAGzBA,EAASsB,KAAK,SAACd,GAAD,MAAkC,KAArBA,EAAQiD,WACrC,KAAM,IAAIC,OAAJ,yFAGR,IAAMC,IAAiB,EAAAC,EAAAR,SAAMpD,EAAS,GAAIC,GAEpCiB,GAAW,EAAA6F,EAAAhH,mBAAkBC,EAAUC,GACvC+G,EAAmBP,EAAkBvF,EAAUjB,GAG/CgH,EAAkBC,EAAmBlH,GACrCmH,EAAqBF,EAAgB,GAErC3D,GAAW,EAAAuD,EAAAzD,SAAY4D,EAAZ,IAAgCG,EAAsBnH,EAAUC,GAC3EmH,GAAkB,EAAA5D,EAAAhE,iBAAgBa,SAASkE,iBAAiBjB,GAElE,OAAKtD,GAASwF,MAAM,SAAChF,GAAD,MAAa4G,GAAgB9F,KAAK,SAACgB,GAAD,MAAWA,KAAU9B,OAQvEmD,UACK,EAGFL,GAVE+D,QAAQC,KAAR,sIAGJtH,GAgBP,QAASkH,GAAoBlH,GAAU,GAAAuH,IAEA,EAAAR,EAAArF,qBAAoB1B,GAAjD4B,EAF6B2F,EAE7B3F,QAASC,EAFoB0F,EAEpB1F,WAAYC,EAFQyF,EAERzF,IAEvB0F,IAMN,IAJI1F,GACF0F,EAAalB,KAAKxE,GAGhBF,EAAS,CACX,GAAM6F,GAAgB7F,EAAQsD,IAAI,SAAC1G,GAAD,UAAcA,IAAQ2F,KAAK,GAC7DqD,GAAalB,KAAKmB,GAGpB,GAAI5F,EAAY,CACd,GAAM6F,GAAoB/I,OAAO6D,KAAKX,GAAYY,OAAO,SAACkF,EAAOnJ,GAE/D,MADAmJ,GAAMrB,KAAN,IAAe9H,EAAf,KAAwBqD,EAAWrD,GAAnC,MACOmJ,OACFxD,KAAK,GACZqD,GAAalB,KAAKoB,GAOpB,MAJIF,GAAa9H,QAKf8H,EAAarD,KAAK,KAaP,QAASyD,GAAkBC,GAAqB,GAAd5H,GAAcC,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,KAC7D,OAAI2H,GAAMnI,SAAWmI,EAAMrJ,KAClBsI,EAAiBe,EAAO5H,GAE1BwG,EAAkBoB,EAAO5H,GNsyBlCtB,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,GAGT,IAAIoI,GAA4B,kBAAXf,SAAoD,gBAApBA,QAAOC,SAAwB,SAAUzC,GAAO,aAAcA,IAAS,SAAUA,GAAO,MAAOA,IAAyB,kBAAXwC,SAAyBxC,EAAI0C,cAAgBF,QAAUxC,IAAQwC,OAAOvG,UAAY,eAAkB+D,GAOtQ3F,GM56BgBiJ,oBN66BhBjJ,EM14BgBsJ,mBN24BhBtJ,EAAQ4F,QMvzBgBwE,CApIxB,IAAAnC,GAAA3H,EAAA,GN+7BI8F,EAAUV,EAAuBuC,GM97BrCqC,EAAAhK,EAAA,GNk8BI6I,EAAUzD,EAAuB4E,GMj8BrCC,EAAAjK,EAAA,GNq8BI+I,EAAa3D,EAAuB6E,GMp8BxCvE,EAAA1F,EAAA,GACAiJ,EAAAjJ,EAAA,IN6lCM,SAASL,EAAQD,EAASM,GAEhC,YOjlCe,SAASuH,GAAO2C,EAAM/H,GAAS,GAAAG,GAOxCH,EAJF3C,OAH0C6C,SAAAC,EAGnCC,SAHmCD,EAAA6H,EAOxChI,EAHFiI,OAJ0C/H,SAAA8H,EAInC,KAJmCA,EAAAE,EAOxClI,EAFFmI,WAL0CjI,SAAAgI,GAK9B,KAAM,QAAS,OAAQ,OALOA,EAAAE,EAOxCpI,EADFqI,SAN0CnI,SAAAkI,OAStCxE,KACFrD,EAAUwH,EACVtI,EAASmE,EAAKnE,OACd6I,GAAc,EAEZC,EAAcN,IAAStI,MAAM2D,QAAQ2E,GAAQA,GAAQA,IAAOhD,IAAI,SAAC5C,GACrE,MAAqB,kBAAVA,GACF,SAAC9B,GAAD,MAAaA,KAAY8B,GAE3BA,IAGHmG,EAAa,SAACjI,GAClB,MAAO0H,IAAQM,EAAYlH,KAAK,SAACoH,GAAD,MAAaA,GAAQlI,KA6BvD,KA1BA7B,OAAO6D,KAAK8F,GAAQ/H,QAAQ,SAACyE,GACd,UAATA,IACFuD,GAAc,EAEhB,IAAII,GAAYL,EAAOtD,EACE,mBAAd2D,KACc,gBAAdA,KACTA,EAAYA,EAAUC,YAEC,gBAAdD,KACTA,EAAY,GAAIE,SAAO,EAAArF,EAAA3D,aAAY8I,GAAW7I,QAAQ,MAAO,UAEtC,iBAAd6I,KACTA,EAAYA,EAAY,OAAS,MAGnCL,EAAOtD,GAAQ,SAACxG,EAAMF,GAAP,MAAiBqK,GAAUlE,KAAKnG,OAG7CiK,IAAa,WACf,GAAMO,GAAkBR,EAAO3F,SAC/B2F,GAAO3F,UAAY,SAACnE,EAAMF,EAAOyK,GAC/B,MAAOT,GAAOU,MAAM1K,IAAUwK,GAAmBA,EAAgBtK,EAAMF,EAAOyK,OAI3EvI,IAAYlD,GAAM,CACvB,GAAImL,EAAWjI,MAAa,EAAM,CAEhC,GAAIyI,EAAgBb,EAAU5H,EAAS8H,EAAQzE,EAAMvG,GAAO,KAC5D,IAAI4L,EAAS1I,EAAS8H,EAAQzE,EAAMvG,GAAO,KAG3C2L,GAAgBb,EAAU5H,EAAS8H,EAAQzE,GACvCA,EAAKnE,SAAWA,GAClBwJ,EAAS1I,EAAS8H,EAAQzE,GAIxBA,EAAKnE,SAAWA,GAClByJ,EAAYf,EAAU5H,EAAS8H,EAAQzE,GAI3CrD,EAAUA,EAAQG,WAClBjB,EAASmE,EAAKnE,OAGhB,GAAIc,IAAYlD,EAAM,CACpB,GAAM+G,GAAU+E,EAAYhB,EAAU5H,EAAS8H,EAC/CzE,GAAKjD,QAAQyD,GAGf,MAAOR,GAAKM,KAAK,KAanB,QAAS8E,GAAiBb,EAAU5H,EAAS8H,EAAQzE,GAAmC,GAA7BzC,GAA6BlB,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,GAApBM,EAAQG,WACpE0D,EAAUgF,EAAsBjB,EAAU5H,EAAS8H,EACzD,IAAIjE,EAAS,CACX,GAAMC,GAAUlD,EAAOmD,iBAAiBF,EACxC,IAAuB,IAAnBC,EAAQ5E,OAEV,MADAmE,GAAKjD,QAAQyD,IACN,EAGX,OAAO,EAWT,QAASgF,GAAuBjB,EAAU5H,EAAS8H,GAcjD,IAAK,GAbCzG,GAAarB,EAAQqB,WACrByH,EAAa3K,OAAO6D,KAAKX,GAAYhB,KAAK,SAACC,EAAMC,GACrD,GAAMwI,GAAUnB,EAASoB,QAAQ3H,EAAWf,GAAMtC,MAC5CiL,EAAUrB,EAASoB,QAAQ3H,EAAWd,GAAMvC,KAClD,OAAIiL,MAAY,EACVF,KAAY,EACP,GAEF,EAEFA,EAAUE,IAGVxL,EAAI,EAAGC,EAAIoL,EAAW5J,OAAQzB,EAAIC,EAAGD,IAAK,CACjD,GAAMyE,GAAM4G,EAAWrL,GACjB0E,EAAYd,EAAWa,GACvBE,EAAgBD,EAAUnE,KAC1BkL,GAAiB,EAAAlG,EAAA3D,aAAY8C,EAAUrE,OAEvCqL,EAAgBrB,EAAO1F,IAAkB0F,EAAO3F,UAChDiH,EAAuBC,EAAcjH,IAAkBiH,EAAclH,SAC3E,KAAImH,EAAYH,EAAe/G,EAAe8G,EAAgBE,GAA9D,CAIA,GAAIvF,OAAczB,EAAd,KAAgC8G,EAAhC,IAEJ,IAAK,OAAQjF,KAAKiF,MAAoB,IACd,OAAlB9G,IACFyB,MAAcqF,GAGM,UAAlB9G,GAA2B,CAC7B,GAAMmH,GAAYL,EAAevH,OAAOrC,QAAQ,OAAQ,IACxDuE,OAAc0F,EAIlB,MAAO1F,IAET,MAAO,MAYT,QAAS6E,GAAU1I,EAAS8H,EAAQzE,GAAmC,GAA7BzC,GAA6BlB,UAAAR,OAAA,GAAAS,SAAAD,UAAA,GAAAA,UAAA,GAApBM,EAAQG,WACnD0D,EAAU2F,EAAexJ,EAAS8H,EACxC,IAAIjE,EAAS,CACX,GAAMC,GAAUlD,EAAO6I,qBAAqB5F,EAC5C,IAAuB,IAAnBC,EAAQ5E,OAEV,MADAmE,GAAKjD,QAAQyD,IACN,EAGX,OAAO,EAUT,QAAS2F,GAAgBxJ,EAAS8H,GAChC,GAAMtF,GAAUxC,EAAQwC,QAAQC,aAChC,OAAI6G,GAAYxB,EAAOxG,IAAK,KAAMkB,GACzB,KAEFA,EAcT,QAASmG,GAAaf,EAAU5H,EAAS8H,EAAQzE,GAG/C,IAAK,GAFCzC,GAASZ,EAAQG,WACjBuJ,EAAW9I,EAAO+I,WAAa/I,EAAO8I,SACnCjM,EAAI,EAAGC,EAAIgM,EAASxK,OAAQzB,EAAIC,EAAGD,IAAK,CAC/C,GAAMmM,GAAQF,EAASjM,EACvB,IAAImM,IAAU5J,EAAS,CACrB,GAAM6J,GAAejB,EAAYhB,EAAUgC,EAAO9B,EAClD,KAAK+B,EACH,MAAOhD,SAAQC,KAAR,mFAEJ8C,EAAO9B,EAAQ+B,EAEpB,IAAMhG,QAAegG,EAAf,eAAyCpM,EAAE,GAA3C,GAEN,OADA4F,GAAKjD,QAAQyD,IACN,GAGX,OAAO,EAWT,QAAS+E,GAAahB,EAAU5H,EAAS8H,GACvC,GAAIjE,GAAUgF,EAAsBjB,EAAU5H,EAAS8H,EAIvD,OAHKjE,KACHA,EAAU2F,EAAexJ,EAAS8H,IAE7BjE,EAYT,QAASyF,GAAanB,EAAWnK,EAAMF,EAAOyK,GAC5C,IAAKzK,EACH,OAAO,CAET,IAAMgM,GAAQ3B,GAAaI,CAC3B,SAAKuB,GAGEA,EAAM9L,EAAMF,EAAOyK,GPq1B5BpK,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,IAETd,EAAQ4F,QOvlCgBiC,CAnBxB,IAAA7B,GAAA1F,EAAA,GAEM+L,GACJlH,UADoB,SACTC,GACT,OACE,QACA,eACA,uBACA4G,QAAQ5G,IAAiB,GPs4C/BnF,GAAOD,QAAUA,EAAiB,SAI5B,SAASC,EAAQD,EAASM,GAEhC,YAiCA,SAASyM,GAAwBpH,GAAO,GAAIA,GAAOA,EAAIlE,WAAc,MAAOkE,EAAc,IAAIqH,KAAa,IAAW,MAAPrH,EAAe,IAAK,GAAIT,KAAOS,GAAWxE,OAAOS,UAAUC,eAAelB,KAAKgF,EAAKT,KAAM8H,EAAO9H,GAAOS,EAAIT,GAAgC,OAAtB8H,GAAOpH,QAAUD,EAAYqH,EAElQ,QAAStH,GAAuBC,GAAO,MAAOA,IAAOA,EAAIlE,WAAakE,GAAQC,QAASD,GAhCvFxE,OAAOC,eAAepB,EAAS,cAC7Bc,OAAO,IAETd,EAAQ4F,QAAU5F,EAAQiN,OAASjN,EAAQ6F,SAAW7F,EAAQsJ,iBAAmBtJ,EAAQiJ,kBAAoBjJ,EAAQkN,OAASvK,MAE9H,IAAIwK,GAAW7M,EAAoB,EAEnCa,QAAOC,eAAepB,EAAS,qBAC7BsB,YAAY,EACZC,IAAK,WACH,MAAO4L,GQv6CMlE,qBR06CjB9H,OAAOC,eAAepB,EAAS,oBAC7BsB,YAAY,EACZC,IAAK,WACH,MAAO4L,GQ76CyB7D,mBRi7CpC,IAAI8D,GAAW1H,EAAuByH,GAElC9D,EAAa/I,EAAoB,GAEjC+M,EAAa3H,EAAuB2D,GAEpCiE,EAAWhN,EAAoB,GAE/BiJ,EAAUwD,EAAwBO,EAMtCtN,GQ/7COkN,OR+7CUE,EAASxH,QAC1B5F,EQ/7CO6F,SR+7CYwH,EAAWzH,QAC9B5F,EQ/7CYiN,OR+7CK1D,EACjBvJ,EQ97CO4F,QR87CWwH,EAASxH","file":"optimal-select.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertNodeList = convertNodeList;\nexports.escapeValue = escapeValue;\n/**\n * # Utilities\n *\n * Convenience helpers.\n */\n\n/**\n * Create an array with the DOM nodes of the list\n *\n * @param {NodeList} nodes - [description]\n * @return {Array.} - [description]\n */\nfunction convertNodeList(nodes) {\n var length = nodes.length;\n\n var arr = new Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = nodes[i];\n }\n return arr;\n}\n\n/**\n * Escape special characters and line breaks as a simplified version of 'CSS.escape()'\n *\n * Description of valid characters: https://mathiasbynens.be/notes/css-escapes\n *\n * @param {String?} value - [description]\n * @return {String} - [description]\n */\nfunction escapeValue(value) {\n return value && value.replace(/['\"`\\\\/:\\?&!#$%^()[\\]{|}*+;,.<=>@~]/g, '\\\\$&').replace(/\\n/g, '');\n}\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getCommonAncestor = getCommonAncestor;\nexports.getCommonProperties = getCommonProperties;\n/**\n * # Common\n *\n * Process collections for similarities.\n */\n\n/**\n * Find the last common ancestor of elements\n *\n * @param {Array.} elements - [description]\n * @return {HTMLElement} - [description]\n */\nfunction getCommonAncestor(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$root = options.root,\n root = _options$root === undefined ? document : _options$root;\n\n\n var ancestors = [];\n\n elements.forEach(function (element, index) {\n var parents = [];\n while (element !== root) {\n element = element.parentNode;\n parents.unshift(element);\n }\n ancestors[index] = parents;\n });\n\n ancestors.sort(function (curr, next) {\n return curr.length - next.length;\n });\n\n var shallowAncestor = ancestors.shift();\n\n var ancestor = null;\n\n var _loop = function _loop() {\n var parent = shallowAncestor[i];\n var missing = ancestors.some(function (otherParents) {\n return !otherParents.some(function (otherParent) {\n return otherParent === parent;\n });\n });\n\n if (missing) {\n // TODO: find similar sub-parents, not the top root, e.g. sharing a class selector\n return 'break';\n }\n\n ancestor = parent;\n };\n\n for (var i = 0, l = shallowAncestor.length; i < l; i++) {\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n\n return ancestor;\n}\n\n/**\n * Get a set of common properties of elements\n *\n * @param {Array.} elements - [description]\n * @return {Object} - [description]\n */\nfunction getCommonProperties(elements) {\n\n var commonProperties = {\n classes: [],\n attributes: {},\n tag: null\n };\n\n elements.forEach(function (element) {\n var commonClasses = commonProperties.classes,\n commonAttributes = commonProperties.attributes,\n commonTag = commonProperties.tag;\n\n // ~ classes\n\n if (commonClasses !== undefined) {\n var classes = element.getAttribute('class');\n if (classes) {\n classes = classes.trim().split(' ');\n if (!commonClasses.length) {\n commonProperties.classes = classes;\n } else {\n commonClasses = commonClasses.filter(function (entry) {\n return classes.some(function (name) {\n return name === entry;\n });\n });\n if (commonClasses.length) {\n commonProperties.classes = commonClasses;\n } else {\n delete commonProperties.classes;\n }\n }\n } else {\n // TODO: restructure removal as 2x set / 2x delete, instead of modify always replacing with new collection\n delete commonProperties.classes;\n }\n }\n\n // ~ attributes\n if (commonAttributes !== undefined) {\n (function () {\n var elementAttributes = element.attributes;\n var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) {\n var attribute = elementAttributes[key];\n var attributeName = attribute.name;\n // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour\n // (issue: https://github.com/ariya/phantomjs/issues/14634)\n if (attribute && attributeName !== 'class') {\n attributes[attributeName] = attribute.value;\n }\n return attributes;\n }, {});\n\n var attributesNames = Object.keys(attributes);\n var commonAttributesNames = Object.keys(commonAttributes);\n\n if (attributesNames.length) {\n if (!commonAttributesNames.length) {\n commonProperties.attributes = attributes;\n } else {\n commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) {\n var value = commonAttributes[name];\n if (value === attributes[name]) {\n nextCommonAttributes[name] = value;\n }\n return nextCommonAttributes;\n }, {});\n if (Object.keys(commonAttributes).length) {\n commonProperties.attributes = commonAttributes;\n } else {\n delete commonProperties.attributes;\n }\n }\n } else {\n delete commonProperties.attributes;\n }\n })();\n }\n\n // ~ tag\n if (commonTag !== undefined) {\n var tag = element.tagName.toLowerCase();\n if (!commonTag) {\n commonProperties.tag = tag;\n } else if (tag !== commonTag) {\n delete commonProperties.tag;\n }\n }\n });\n\n return commonProperties;\n}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = optimize;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _utilities = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Apply different optimization techniques\n *\n * @param {string} selector - [description]\n * @param {HTMLElement|Array.} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\n/**\n * # Optimize\n *\n * 1.) Improve efficiency through shorter selectors by removing redundancy\n * 2.) Improve robustness through selector transformation\n */\n\nfunction optimize(selector, elements) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\n // convert single entry and NodeList\n if (!Array.isArray(elements)) {\n elements = !elements.length ? [elements] : (0, _utilities.convertNodeList)(elements);\n }\n\n if (!elements.length || elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing \"elements\")');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n // chunk parts outside of quotes (http://stackoverflow.com/a/25663729)\n var path = selector.replace(/> /g, '>').split(/\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n\n if (path.length < 2) {\n return optimizePart('', selector, '', elements);\n }\n\n var shortened = [path.pop()];\n while (path.length > 1) {\n var current = path.pop();\n var prePart = path.join(' ');\n var postPart = shortened.join(' ');\n\n var pattern = prePart + ' ' + postPart;\n var matches = document.querySelectorAll(pattern);\n if (matches.length !== elements.length) {\n shortened.unshift(optimizePart(prePart, current, postPart, elements));\n }\n }\n shortened.unshift(path[0]);\n path = shortened;\n\n // optimize start + end\n path[0] = optimizePart('', path[0], path.slice(1).join(' '), elements);\n path[path.length - 1] = optimizePart(path.slice(0, -1).join(' '), path[path.length - 1], '', elements);\n\n if (globalModified) {\n delete true;\n }\n\n return path.join(' ').replace(/>/g, '> ').trim();\n}\n\n/**\n * Improve a chunk of the selector\n *\n * @param {string} prePart - [description]\n * @param {string} current - [description]\n * @param {string} postPart - [description]\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction optimizePart(prePart, current, postPart, elements) {\n if (prePart.length) prePart = prePart + ' ';\n if (postPart.length) postPart = ' ' + postPart;\n\n // robustness: attribute without value (generalization)\n if (/\\[*\\]/.test(current)) {\n var key = current.replace(/=.*$/, ']');\n var pattern = '' + prePart + key + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = key;\n } else {\n // robustness: replace specific key-value with base tag (heuristic)\n var references = document.querySelectorAll('' + prePart + key);\n\n var _loop = function _loop() {\n var reference = references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n }\n }\n\n // robustness: descendant instead child (heuristic)\n if (/>/.test(current)) {\n var descendant = current.replace(/>/, '');\n var pattern = '' + prePart + descendant + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = descendant;\n }\n }\n\n // robustness: 'nth-of-type' instead 'nth-child' (heuristic)\n if (/:nth-child/.test(current)) {\n // TODO: consider complete coverage of 'nth-of-type' replacement\n var type = current.replace(/nth-child/g, 'nth-of-type');\n var pattern = '' + prePart + type + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = type;\n }\n }\n\n // efficiency: combinations of classname (partial permutations)\n if (/\\.\\S+\\.\\S+/.test(current)) {\n var names = current.trim().split('.').slice(1).map(function (name) {\n return '.' + name;\n }).sort(function (curr, next) {\n return curr.length - next.length;\n });\n while (names.length) {\n var partial = current.replace(names.shift(), '').trim();\n var pattern = ('' + prePart + partial + postPart).trim();\n if (!pattern.length || pattern.charAt(0) === '>' || pattern.charAt(pattern.length - 1) === '>') {\n break;\n }\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = partial;\n }\n }\n\n // robustness: degrade complex classname (heuristic)\n names = current && current.match(/\\./g);\n if (names && names.length > 2) {\n var _references = document.querySelectorAll('' + prePart + current);\n\n var _loop2 = function _loop2() {\n var reference = _references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n // TODO:\n // - check using attributes + regard excludes\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = _references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret2 = _loop2();\n\n if (_ret2 === 'break') break;\n }\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate matches with expected elements\n *\n * @param {Array.} matches - [description]\n * @param {Array.} elements - [description]\n * @return {Boolean} - [description]\n */\nfunction compareResults(matches, elements) {\n var length = matches.length;\n\n return length === elements.length && elements.every(function (element) {\n for (var i = 0; i < length; i++) {\n if (matches[i] === element) {\n return true;\n }\n }\n return false;\n });\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = adapt;\n/**\n * # Adapt\n *\n * Check and extend the environment for universal usage.\n */\n\n/**\n * Modify the context based on the environment\n *\n * @param {HTMLELement} element - [description]\n * @param {Object} options - [description]\n * @return {boolean} - [description]\n */\nfunction adapt(element, options) {\n\n // detect environment setup\n if (true) {\n return false;\n } else {\n global.document = options.context || function () {\n var root = element;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n }();\n }\n\n // https://github.com/fb55/domhandler/blob/master/index.js#L75\n var ElementPrototype = Object.getPrototypeOf(true);\n\n // alternative descriptor to access elements with filtering invalid elements (e.g. textnodes)\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'childTags')) {\n Object.defineProperty(ElementPrototype, 'childTags', {\n enumerable: true,\n get: function get() {\n return this.children.filter(function (node) {\n // https://github.com/fb55/domelementtype/blob/master/index.js#L12\n return node.type === 'tag' || node.type === 'script' || node.type === 'style';\n });\n }\n });\n }\n\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'attributes')) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap\n Object.defineProperty(ElementPrototype, 'attributes', {\n enumerable: true,\n get: function get() {\n var attribs = this.attribs;\n\n var attributesNames = Object.keys(attribs);\n var NamedNodeMap = attributesNames.reduce(function (attributes, attributeName, index) {\n attributes[index] = {\n name: attributeName,\n value: attribs[attributeName]\n };\n return attributes;\n }, {});\n Object.defineProperty(NamedNodeMap, 'length', {\n enumerable: false,\n configurable: false,\n value: attributesNames.length\n });\n return NamedNodeMap;\n }\n });\n }\n\n if (!ElementPrototype.getAttribute) {\n // https://docs.webplatform.org/wiki/dom/Element/getAttribute\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute\n ElementPrototype.getAttribute = function (name) {\n return this.attribs[name] || null;\n };\n }\n\n if (!ElementPrototype.getElementsByTagName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByTagName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName\n ElementPrototype.getElementsByTagName = function (tagName) {\n var HTMLCollection = [];\n traverseDescendants(this.childTags, function (descendant) {\n if (descendant.name === tagName || tagName === '*') {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.getElementsByClassName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByClassName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByClassName\n ElementPrototype.getElementsByClassName = function (className) {\n var names = className.trim().replace(/\\s+/g, ' ').split(' ');\n var HTMLCollection = [];\n traverseDescendants([this], function (descendant) {\n var descendantClassName = descendant.attribs.class;\n if (descendantClassName && names.every(function (name) {\n return descendantClassName.indexOf(name) > -1;\n })) {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.querySelectorAll) {\n // https://docs.webplatform.org/wiki/css/selectors_api/querySelectorAll\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll\n ElementPrototype.querySelectorAll = function (selectors) {\n var _this = this;\n\n selectors = selectors.replace(/(>)(\\S)/g, '$1 $2').trim(); // add space for '>' selector\n\n // using right to left execution => https://github.com/fb55/css-select#how-does-it-work\n var instructions = getInstructions(selectors);\n var discover = instructions.shift();\n\n var total = instructions.length;\n return discover(this).filter(function (node) {\n var step = 0;\n while (step < total) {\n node = instructions[step](node, _this);\n if (!node) {\n // hierarchy doesn't match\n return false;\n }\n step += 1;\n }\n return true;\n });\n };\n }\n\n if (!ElementPrototype.contains) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/contains\n ElementPrototype.contains = function (element) {\n var inclusive = false;\n traverseDescendants([this], function (descendant, done) {\n if (descendant === element) {\n inclusive = true;\n done();\n }\n });\n return inclusive;\n };\n }\n\n return true;\n}\n\n/**\n * Retrieve transformation steps\n *\n * @param {Array.} selectors - [description]\n * @return {Array.} - [description]\n */\nfunction getInstructions(selectors) {\n return selectors.split(' ').reverse().map(function (selector, step) {\n var discover = step === 0;\n\n var _selector$split = selector.split(':'),\n _selector$split2 = _slicedToArray(_selector$split, 2),\n type = _selector$split2[0],\n pseudo = _selector$split2[1];\n\n var validate = null;\n var instruction = null;\n\n (function () {\n switch (true) {\n\n // child: '>'\n case />/.test(type):\n instruction = function checkParent(node) {\n return function (validate) {\n return validate(node.parent) && node.parent;\n };\n };\n break;\n\n // class: '.'\n case /^\\./.test(type):\n var names = type.substr(1).split('.');\n validate = function validate(node) {\n var nodeClassName = node.attribs.class;\n return nodeClassName && names.every(function (name) {\n return nodeClassName.indexOf(name) > -1;\n });\n };\n instruction = function checkClass(node, root) {\n if (discover) {\n return node.getElementsByClassName(names.join(' '));\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // attribute: '[key=\"value\"]'\n case /^\\[/.test(type):\n var _type$replace$split = type.replace(/\\[|\\]|\"/g, '').split('='),\n _type$replace$split2 = _slicedToArray(_type$replace$split, 2),\n attributeKey = _type$replace$split2[0],\n attributeValue = _type$replace$split2[1];\n\n validate = function validate(node) {\n var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1;\n if (hasAttribute) {\n // regard optional attributeValue\n if (!attributeValue || node.attribs[attributeKey] === attributeValue) {\n return true;\n }\n }\n return false;\n };\n instruction = function checkAttribute(node, root) {\n if (discover) {\n var _ret2 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // id: '#'\n case /^#/.test(type):\n var id = type.substr(1);\n validate = function validate(node) {\n return node.attribs.id === id;\n };\n instruction = function checkId(node, root) {\n if (discover) {\n var _ret3 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant, done) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n done();\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === \"object\") return _ret3.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // universal: '*'\n case /\\*/.test(type):\n validate = function validate(node) {\n return true;\n };\n instruction = function checkUniversal(node, root) {\n if (discover) {\n var _ret4 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n return NodeList.push(descendant);\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret4 === 'undefined' ? 'undefined' : _typeof(_ret4)) === \"object\") return _ret4.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // tag: '...'\n default:\n validate = function validate(node) {\n return node.name === type;\n };\n instruction = function checkTag(node, root) {\n if (discover) {\n var _ret5 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === \"object\") return _ret5.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n }\n })();\n\n if (!pseudo) {\n return instruction;\n }\n\n var rule = pseudo.match(/-(child|type)\\((\\d+)\\)$/);\n var kind = rule[1];\n var index = parseInt(rule[2], 10) - 1;\n\n var validatePseudo = function validatePseudo(node) {\n if (node) {\n var compareSet = node.parent.childTags;\n if (kind === 'type') {\n compareSet = compareSet.filter(validate);\n }\n var nodeIndex = compareSet.findIndex(function (child) {\n return child === node;\n });\n if (nodeIndex === index) {\n return true;\n }\n }\n return false;\n };\n\n return function enhanceInstruction(node) {\n var match = instruction(node);\n if (discover) {\n return match.reduce(function (NodeList, matchedNode) {\n if (validatePseudo(matchedNode)) {\n NodeList.push(matchedNode);\n }\n return NodeList;\n }, []);\n }\n return validatePseudo(match) && match;\n };\n });\n}\n\n/**\n * Walking recursive to invoke callbacks\n *\n * @param {Array.} nodes - [description]\n * @param {Function} handler - [description]\n */\nfunction traverseDescendants(nodes, handler) {\n nodes.forEach(function (node) {\n var progress = true;\n handler(node, function () {\n return progress = false;\n });\n if (node.childTags && progress) {\n traverseDescendants(node.childTags, handler);\n }\n });\n}\n\n/**\n * Bubble up from bottom to top\n *\n * @param {HTMLELement} node - [description]\n * @param {HTMLELement} root - [description]\n * @param {Function} validate - [description]\n * @return {HTMLELement} - [description]\n */\nfunction getAncestor(node, root, validate) {\n while (node.parent) {\n node = node.parent;\n if (validate(node)) {\n return node;\n }\n if (node === root) {\n break;\n }\n }\n return null;\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /**\n * # Select\n *\n * Construct a unique CSS query selector to access the selected DOM element(s).\n * For longevity it applies different matching and optimization strategies.\n */\n\nexports.getSingleSelector = getSingleSelector;\nexports.getMultiSelector = getMultiSelector;\nexports.default = getQuerySelector;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _match = __webpack_require__(5);\n\nvar _match2 = _interopRequireDefault(_match);\n\nvar _optimize = __webpack_require__(2);\n\nvar _optimize2 = _interopRequireDefault(_optimize);\n\nvar _utilities = __webpack_require__(0);\n\nvar _common = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Get a selector for the provided element\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getSingleSelector(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (element.nodeType === 3) {\n element = element.parentNode;\n }\n\n if (element.nodeType !== 1) {\n throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not \"' + (typeof element === 'undefined' ? 'undefined' : _typeof(element)) + '\")');\n }\n\n var globalModified = (0, _adapt2.default)(element, options);\n\n var selector = (0, _match2.default)(element, options);\n var optimized = (0, _optimize2.default)(selector, element, options);\n\n // debug\n // console.log(`\n // selector: ${selector}\n // optimized: ${optimized}\n // `)\n\n if (globalModified) {\n delete true;\n }\n\n return optimized;\n}\n\n/**\n * Get a selector to match multiple descendants from an ancestor\n *\n * @param {Array.|NodeList} elements - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getMultiSelector(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (!Array.isArray(elements)) {\n elements = (0, _utilities.convertNodeList)(elements);\n }\n\n if (elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - only an Array of HTMLElements or representations of them is supported!');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n var ancestor = (0, _common.getCommonAncestor)(elements, options);\n var ancestorSelector = getSingleSelector(ancestor, options);\n\n // TODO: consider usage of multiple selectors + parent-child relation + check for part redundancy\n var commonSelectors = getCommonSelectors(elements);\n var descendantSelector = commonSelectors[0];\n\n var selector = (0, _optimize2.default)(ancestorSelector + ' ' + descendantSelector, elements, options);\n var selectorMatches = (0, _utilities.convertNodeList)(document.querySelectorAll(selector));\n\n if (!elements.every(function (element) {\n return selectorMatches.some(function (entry) {\n return entry === element;\n });\n })) {\n // TODO: cluster matches to split into similar groups for sub selections\n return console.warn('\\n The selected elements can\\'t be efficiently mapped.\\n Its probably best to use multiple single selectors instead!\\n ', elements);\n }\n\n if (globalModified) {\n delete true;\n }\n\n return selector;\n}\n\n/**\n * Get selectors to describe a set of elements\n *\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction getCommonSelectors(elements) {\n var _getCommonProperties = (0, _common.getCommonProperties)(elements),\n classes = _getCommonProperties.classes,\n attributes = _getCommonProperties.attributes,\n tag = _getCommonProperties.tag;\n\n var selectorPath = [];\n\n if (tag) {\n selectorPath.push(tag);\n }\n\n if (classes) {\n var classSelector = classes.map(function (name) {\n return '.' + name;\n }).join('');\n selectorPath.push(classSelector);\n }\n\n if (attributes) {\n var attributeSelector = Object.keys(attributes).reduce(function (parts, name) {\n parts.push('[' + name + '=\"' + attributes[name] + '\"]');\n return parts;\n }, []).join('');\n selectorPath.push(attributeSelector);\n }\n\n if (selectorPath.length) {\n // TODO: check for parent-child relation\n }\n\n return [selectorPath.join('')];\n}\n\n/**\n * Choose action depending on the input (multiple/single)\n *\n * NOTE: extended detection is used for special cases like the element with \n *\n * @param {HTMLElement|NodeList|Array.} input - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function getQuerySelector (input, options = {}) {\n if (input.length && !input.name) {\n return getMultiSelector(input, options)\n }\n return getSingleSelector(input, options)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/select.js","/**\n * # Match\n *\n * Retrieve selector for a node.\n */\n\nimport { escapeValue } from './utilities'\n\nconst defaultIgnore = {\n attribute (attributeName) {\n return [\n 'style',\n 'data-reactid',\n 'data-react-checksum'\n ].indexOf(attributeName) > -1\n }\n}\n\n/**\n * Get the path of the element\n *\n * @param {HTMLElement} node - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function match (node, options) {\n\n const {\n root = document,\n skip = null,\n priority = ['id', 'class', 'href', 'src'],\n ignore = {}\n } = options\n\n const path = []\n var element = node\n var length = path.length\n var ignoreClass = false\n\n const skipCompare = skip && (Array.isArray(skip) ? skip : [skip]).map((entry) => {\n if (typeof entry !== 'function') {\n return (element) => element === entry\n }\n return entry\n })\n\n const skipChecks = (element) => {\n return skip && skipCompare.some((compare) => compare(element))\n }\n\n Object.keys(ignore).forEach((type) => {\n if (type === 'class') {\n ignoreClass = true\n }\n var predicate = ignore[type]\n if (typeof predicate === 'function') return\n if (typeof predicate === 'number') {\n predicate = predicate.toString()\n }\n if (typeof predicate === 'string') {\n predicate = new RegExp(escapeValue(predicate).replace(/\\\\/g, '\\\\\\\\'))\n }\n if (typeof predicate === 'boolean') {\n predicate = predicate ? /(?:)/ : /.^/\n }\n // check class-/attributename for regex\n ignore[type] = (name, value) => predicate.test(value)\n })\n\n if (ignoreClass) {\n const ignoreAttribute = ignore.attribute\n ignore.attribute = (name, value, defaultPredicate) => {\n return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate)\n }\n }\n\n while (element !== root) {\n if (skipChecks(element) !== true) {\n // ~ global\n if (checkAttributes(priority, element, ignore, path, root)) break\n if (checkTag(element, ignore, path, root)) break\n\n // ~ local\n checkAttributes(priority, element, ignore, path)\n if (path.length === length) {\n checkTag(element, ignore, path)\n }\n\n // define only one part each iteration\n if (path.length === length) {\n checkChilds(priority, element, ignore, path)\n }\n }\n\n element = element.parentNode\n length = path.length\n }\n\n if (element === root) {\n const pattern = findPattern(priority, element, ignore)\n path.unshift(pattern)\n }\n\n return path.join(' ')\n}\n\n/**\n * Extend path with attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkAttributes (priority, element, ignore, path, parent = element.parentNode) {\n const pattern = findAttributesPattern(priority, element, ignore)\n if (pattern) {\n const matches = parent.querySelectorAll(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string?} - [description]\n */\nfunction findAttributesPattern (priority, element, ignore) {\n const attributes = element.attributes\n const sortedKeys = Object.keys(attributes).sort((curr, next) => {\n const currPos = priority.indexOf(attributes[curr].name)\n const nextPos = priority.indexOf(attributes[next].name)\n if (nextPos === -1) {\n if (currPos === -1) {\n return 0\n }\n return -1\n }\n return currPos - nextPos\n })\n\n for (var i = 0, l = sortedKeys.length; i < l; i++) {\n const key = sortedKeys[i]\n const attribute = attributes[key]\n const attributeName = attribute.name\n const attributeValue = escapeValue(attribute.value)\n\n const currentIgnore = ignore[attributeName] || ignore.attribute\n const currentDefaultIgnore = defaultIgnore[attributeName] || defaultIgnore.attribute\n if (checkIgnore(currentIgnore, attributeName, attributeValue, currentDefaultIgnore)) {\n continue\n }\n\n var pattern = `[${attributeName}=\"${attributeValue}\"]`\n\n if ((/\\b\\d/).test(attributeValue) === false) {\n if (attributeName === 'id') {\n pattern = `#${attributeValue}`\n }\n\n if (attributeName === 'class') {\n const className = attributeValue.trim().replace(/\\s+/g, '.')\n pattern = `.${className}`\n }\n }\n\n return pattern\n }\n return null\n}\n\n/**\n * Extend path with tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkTag (element, ignore, path, parent = element.parentNode) {\n const pattern = findTagPattern(element, ignore)\n if (pattern) {\n const matches = parent.getElementsByTagName(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {boolean} - [description]\n */\nfunction findTagPattern (element, ignore) {\n const tagName = element.tagName.toLowerCase()\n if (checkIgnore(ignore.tag, null, tagName)) {\n return null\n }\n return tagName\n}\n\n/**\n * Extend path with specific child identifier\n *\n * NOTE: 'childTags' is a custom property to use as a view filter for tags using 'adapter.js'\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @return {boolean} - [description]\n */\nfunction checkChilds (priority, element, ignore, path) {\n const parent = element.parentNode\n const children = parent.childTags || parent.children\n for (var i = 0, l = children.length; i < l; i++) {\n const child = children[i]\n if (child === element) {\n const childPattern = findPattern(priority, child, ignore)\n if (!childPattern) {\n return console.warn(`\n Element couldn\\'t be matched through strict ignore pattern!\n `, child, ignore, childPattern)\n }\n const pattern = `> ${childPattern}:nth-child(${i+1})`\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string} - [description]\n */\nfunction findPattern (priority, element, ignore) {\n var pattern = findAttributesPattern(priority, element, ignore)\n if (!pattern) {\n pattern = findTagPattern(element, ignore)\n }\n return pattern\n}\n\n/**\n * Validate with custom and default functions\n *\n * @param {Function} predicate - [description]\n * @param {string?} name - [description]\n * @param {string} value - [description]\n * @param {Function} defaultPredicate - [description]\n * @return {boolean} - [description]\n */\nfunction checkIgnore (predicate, name, value, defaultPredicate) {\n if (!value) {\n return true\n }\n const check = predicate || defaultPredicate\n if (!check) {\n return false\n }\n return check(name, value, defaultPredicate)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/match.js","export select, { getSingleSelector, getMultiSelector } from './select'\nexport optimize from './optimize'\nexport * as common from './common'\n\nexport default from './select'\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/src/utilities.js b/src/utilities.js index da1837e..1b0cad2 100644 --- a/src/utilities.js +++ b/src/utilities.js @@ -29,5 +29,5 @@ export function convertNodeList (nodes) { */ export function escapeValue (value) { return value && value.replace(/['"`\\/:\?&!#$%^()[\]{|}*+;,.<=>@~]/g, '\\$&') - .replace(/\n/g, '\A') + .replace(/\n/g, ''); }