| 1 |
- {"remainingRequest":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/select.js","dependencies":[{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/select.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbiIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvciIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Iik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb21lIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZSIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3RvciIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvciIpOwoKdmFyIF90eXBlb2YyID0gcmVxdWlyZSgiL3Vzci9sb2NhbC9kZXZlbG9wL3BocC93d3cvd2FpYmFvL3Byb2plY3QvTk4yMDIwMDYwODAxL2FkZG9ucy9hZG1pbi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YiKTsKCm1vZHVsZS5leHBvcnRzID0KLyoqKioqKi8KZnVuY3Rpb24gKG1vZHVsZXMpIHsKICAvLyB3ZWJwYWNrQm9vdHN0cmFwCgogIC8qKioqKiovCiAgLy8gVGhlIG1vZHVsZSBjYWNoZQoKICAvKioqKioqLwogIHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CiAgLyoqKioqKi8KCiAgLyoqKioqKi8KICAvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgoKICAvKioqKioqLwoKICBmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CiAgICAvKioqKioqLwoKICAgIC8qKioqKiovCiAgICAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKCiAgICAvKioqKioqLwogICAgaWYgKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7CiAgICAgIC8qKioqKiovCiAgICAgIHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwogICAgICAvKioqKioqLwogICAgfQogICAgLyoqKioqKi8KICAgIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCgogICAgLyoqKioqKi8KCgogICAgdmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0gewogICAgICAvKioqKioqLwogICAgICBpOiBtb2R1bGVJZCwKCiAgICAgIC8qKioqKiovCiAgICAgIGw6IGZhbHNlLAoKICAgICAgLyoqKioqKi8KICAgICAgZXhwb3J0czoge30KICAgICAgLyoqKioqKi8KCiAgICB9OwogICAgLyoqKioqKi8KCiAgICAvKioqKioqLwogICAgLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCgogICAgLyoqKioqKi8KCiAgICBtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsKICAgIC8qKioqKiovCgogICAgLyoqKioqKi8KICAgIC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWQKCiAgICAvKioqKioqLwoKICAgIG1vZHVsZS5sID0gdHJ1ZTsKICAgIC8qKioqKiovCgogICAgLyoqKioqKi8KICAgIC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCgogICAgLyoqKioqKi8KCiAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICAvKioqKioqLwogIH0KICAvKioqKioqLwoKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pCgogIC8qKioqKiovCgoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGUKCiAgLyoqKioqKi8KCiAgX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0cwoKICAvKioqKioqLwoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbiAoZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7CiAgICAvKioqKioqLwogICAgaWYgKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHsKICAgICAgLyoqKioqKi8KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIGdldDogZ2V0dGVyCiAgICAgIH0pOwogICAgICAvKioqKioqLwogICAgfQogICAgLyoqKioqKi8KCiAgfTsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKCiAgLyoqKioqKi8KCgogIF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgICAvKioqKioqLwogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgewogICAgICAvKioqKioqLwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7CiAgICAgICAgdmFsdWU6ICdNb2R1bGUnCiAgICAgIH0pOwogICAgICAvKioqKioqLwogICAgfQogICAgLyoqKioqKi8KCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgewogICAgICB2YWx1ZTogdHJ1ZQogICAgfSk7CiAgICAvKioqKioqLwogIH07CiAgLyoqKioqKi8KCiAgLyoqKioqKi8KICAvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKCiAgLyoqKioqKi8KICAvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXQKCiAgLyoqKioqKi8KICAvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnMKCiAgLyoqKioqKi8KICAvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKCiAgLyoqKioqKi8KICAvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlCgogIC8qKioqKiovCgoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbiAodmFsdWUsIG1vZGUpIHsKICAgIC8qKioqKiovCiAgICBpZiAobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7CiAgICAvKioqKioqLwoKICAgIGlmIChtb2RlICYgOCkgcmV0dXJuIHZhbHVlOwogICAgLyoqKioqKi8KCiAgICBpZiAobW9kZSAmIDQgJiYgX3R5cGVvZjIodmFsdWUpID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7CiAgICAvKioqKioqLwoKICAgIHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAvKioqKioqLwoKICAgIF9fd2VicGFja19yZXF1aXJlX18ucihucyk7CiAgICAvKioqKioqLwoKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICB2YWx1ZTogdmFsdWUKICAgIH0pOwogICAgLyoqKioqKi8KCiAgICBpZiAobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHsKICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICByZXR1cm4gdmFsdWVba2V5XTsKICAgICAgfS5iaW5kKG51bGwsIGtleSkpOwogICAgfQogICAgLyoqKioqKi8KCiAgICByZXR1cm4gbnM7CiAgICAvKioqKioqLwogIH07CiAgLyoqKioqKi8KCiAgLyoqKioqKi8KICAvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcwoKICAvKioqKioqLwoKCiAgX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24gKG1vZHVsZSkgewogICAgLyoqKioqKi8KICAgIHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPwogICAgLyoqKioqKi8KICAgIGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7CiAgICAgIHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsKICAgIH0gOgogICAgLyoqKioqKi8KICAgIGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7CiAgICAgIHJldHVybiBtb2R1bGU7CiAgICB9OwogICAgLyoqKioqKi8KCiAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7CiAgICAvKioqKioqLwoKCiAgICByZXR1cm4gZ2V0dGVyOwogICAgLyoqKioqKi8KICB9OwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsCgogIC8qKioqKiovCgoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsKICB9OwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KCiAgLyoqKioqKi8KCgogIF9fd2VicGFja19yZXF1aXJlX18ucCA9ICIvZGlzdC8iOwogIC8qKioqKiovCgogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCgogIC8qKioqKiovCgogIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYxKTsKICAvKioqKioqLwp9KAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKi8KWwovKiAwICovCgovKioqLwpmdW5jdGlvbiAobW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgInVzZSBzdHJpY3QiOwogIC8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLwoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImEiLCBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OwogIH0pOwogIC8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqLwogIC8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLgogIC8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsCiAgLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuCgoKICBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQoc2NyaXB0RXhwb3J0cywgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMsIGZ1bmN0aW9uYWxUZW1wbGF0ZSwgaW5qZWN0U3R5bGVzLCBzY29wZUlkLCBtb2R1bGVJZGVudGlmaWVyLAogIC8qIHNlcnZlciBvbmx5ICovCiAgc2hhZG93TW9kZQogIC8qIHZ1ZS1jbGkgb25seSAqLwogICkgewogICAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcAogICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJyA/IHNjcmlwdEV4cG9ydHMub3B0aW9ucyA6IHNjcmlwdEV4cG9ydHM7IC8vIHJlbmRlciBmdW5jdGlvbnMKCiAgICBpZiAocmVuZGVyKSB7CiAgICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyOwogICAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuczsKICAgICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlOwogICAgfSAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlCgoKICAgIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHsKICAgICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZTsKICAgIH0gLy8gc2NvcGVkSWQKCgogICAgaWYgKHNjb3BlSWQpIHsKICAgICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWQ7CiAgICB9CgogICAgdmFyIGhvb2s7CgogICAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsKICAgICAgLy8gc2VydmVyIGJ1aWxkCiAgICAgIGhvb2sgPSBmdW5jdGlvbiBob29rKGNvbnRleHQpIHsKICAgICAgICAvLyAyLjMgaW5qZWN0aW9uCiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGwKICAgICAgICB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0IHx8IC8vIHN0YXRlZnVsCiAgICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0OyAvLyBmdW5jdGlvbmFsCiAgICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlCgogICAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fOwogICAgICAgIH0gLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXMKCgogICAgICAgIGlmIChpbmplY3RTdHlsZXMpIHsKICAgICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpOwogICAgICAgIH0gLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlCgoKICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykgewogICAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpOwogICAgICAgIH0KICAgICAgfTsgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGUKICAgICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWQKCgogICAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2s7CiAgICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykgewogICAgICBob29rID0gc2hhZG93TW9kZSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpOwogICAgICB9IDogaW5qZWN0U3R5bGVzOwogICAgfQoKICAgIGlmIChob29rKSB7CiAgICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHsKICAgICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndAogICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXIKICAgICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rOyAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZQoKICAgICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlcjsKCiAgICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24oaCwgY29udGV4dCkgewogICAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpOwogICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpOwogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2sKICAgICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZTsKICAgICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKSA6IFtob29rXTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsCiAgICAgIG9wdGlvbnM6IG9wdGlvbnMKICAgIH07CiAgfQogIC8qKiovCgp9LCwsCi8qIDEgKi8KCi8qIDIgKi8KCi8qIDMgKi8KCi8qKiovCmZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwiKTsKICAvKioqLwp9LAovKiA0ICovCgovKioqLwpmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlciIpOwogIC8qKiovCn0sCi8qIDUgKi8KCi8qKiovCmZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImVsZW1lbnQtdWkvbGliL3V0aWxzL3Z1ZS1wb3BwZXIiKTsKICAvKioqLwp9LAovKiA2ICovCgovKioqLwpmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9taXhpbnMvbG9jYWxlIik7CiAgLyoqKi8KfSwsLCwKLyogNyAqLwoKLyogOCAqLwoKLyogOSAqLwoKLyogMTAgKi8KCi8qKiovCmZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImVsZW1lbnQtdWkvbGliL2lucHV0Iik7CiAgLyoqKi8KfSwsCi8qIDExICovCgovKiAxMiAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlIik7CiAgLyoqKi8KfSwsCi8qIDEzICovCgovKiAxNCAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyIik7CiAgLyoqKi8KfSwsCi8qIDE1ICovCgovKiAxNiAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50Iik7CiAgLyoqKi8KfSwKLyogMTcgKi8KCi8qKiovCmZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlIik7CiAgLyoqKi8KfSwsCi8qIDE4ICovCgovKiAxOSAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvbG9jYWxlIik7CiAgLyoqKi8KfSwsCi8qIDIwICovCgovKiAyMSAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkIik7CiAgLyoqKi8KfSwKLyogMjIgKi8KCi8qKiovCmZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImVsZW1lbnQtdWkvbGliL21peGlucy9mb2N1cyIpOwogIC8qKiovCn0sLCwsLCwsLCwKLyogMjMgKi8KCi8qIDI0ICovCgovKiAyNSAqLwoKLyogMjYgKi8KCi8qIDI3ICovCgovKiAyOCAqLwoKLyogMjkgKi8KCi8qIDMwICovCgovKiAzMSAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlldyIpOwogIC8qKiovCn0sLCwKLyogMzIgKi8KCi8qIDMzICovCgovKiAzNCAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICJ1c2Ugc3RyaWN0IjsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9N2E0NGM2NDImCgogIHZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICB2YXIgX3ZtID0gdGhpczsKCiAgICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnQ7CgogICAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oOwoKICAgIHJldHVybiBfYygibGkiLCB7CiAgICAgIGRpcmVjdGl2ZXM6IFt7CiAgICAgICAgbmFtZTogInNob3ciLAogICAgICAgIHJhd05hbWU6ICJ2LXNob3ciLAogICAgICAgIHZhbHVlOiBfdm0udmlzaWJsZSwKICAgICAgICBleHByZXNzaW9uOiAidmlzaWJsZSIKICAgICAgfV0sCiAgICAgIHN0YXRpY0NsYXNzOiAiZWwtc2VsZWN0LWRyb3Bkb3duX19pdGVtIiwKICAgICAgY2xhc3M6IHsKICAgICAgICBzZWxlY3RlZDogX3ZtLml0ZW1TZWxlY3RlZCwKICAgICAgICAiaXMtZGlzYWJsZWQiOiBfdm0uZGlzYWJsZWQgfHwgX3ZtLmdyb3VwRGlzYWJsZWQgfHwgX3ZtLmxpbWl0UmVhY2hlZCwKICAgICAgICBob3ZlcjogX3ZtLmhvdmVyCiAgICAgIH0sCiAgICAgIG9uOiB7CiAgICAgICAgbW91c2VlbnRlcjogX3ZtLmhvdmVySXRlbSwKICAgICAgICBjbGljazogZnVuY3Rpb24gY2xpY2soJGV2ZW50KSB7CiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICByZXR1cm4gX3ZtLnNlbGVjdE9wdGlvbkNsaWNrKCRldmVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBbX3ZtLl90KCJkZWZhdWx0IiwgW19jKCJzcGFuIiwgW192bS5fdihfdm0uX3MoX3ZtLmN1cnJlbnRMYWJlbCkpXSldKV0sIDIpOwogIH07CgogIHZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXTsKICByZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWU7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdhNDRjNjQyJgogIC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyIgoKICB2YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKICB2YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwiCgoKICB2YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCgoKICB2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKSA9PT0gInN5bWJvbCIgPyBmdW5jdGlvbiAob2JqKSB7CiAgICByZXR1cm4gX3R5cGVvZjIob2JqKTsKICB9IDogZnVuY3Rpb24gKG9iaikgewogICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogX3R5cGVvZjIob2JqKTsKICB9OyAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCgogIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCgogIHZhciBvcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSB7CiAgICBtaXhpbnM6IFtlbWl0dGVyX2RlZmF1bHQuYV0sCiAgICBuYW1lOiAnRWxPcHRpb24nLAogICAgY29tcG9uZW50TmFtZTogJ0VsT3B0aW9uJywKICAgIGluamVjdDogWydzZWxlY3QnXSwKICAgIHByb3BzOiB7CiAgICAgIHZhbHVlOiB7CiAgICAgICAgcmVxdWlyZWQ6IHRydWUKICAgICAgfSwKICAgICAgbGFiZWw6IFtTdHJpbmcsIE51bWJlcl0sCiAgICAgIGNyZWF0ZWQ6IEJvb2xlYW4sCiAgICAgIGRpc2FibGVkOiB7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICBkZWZhdWx0OiBmYWxzZQogICAgICB9CiAgICB9LAogICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbmRleDogLTEsCiAgICAgICAgZ3JvdXBEaXNhYmxlZDogZmFsc2UsCiAgICAgICAgdmlzaWJsZTogdHJ1ZSwKICAgICAgICBoaXRTdGF0ZTogZmFsc2UsCiAgICAgICAgaG92ZXI6IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgY29tcHV0ZWQ6IHsKICAgICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KCkgewogICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcy52YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3Qgb2JqZWN0XSc7CiAgICAgIH0sCiAgICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkgewogICAgICAgIHJldHVybiB0aGlzLmxhYmVsIHx8ICh0aGlzLmlzT2JqZWN0ID8gJycgOiB0aGlzLnZhbHVlKTsKICAgICAgfSwKICAgICAgY3VycmVudFZhbHVlOiBmdW5jdGlvbiBjdXJyZW50VmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwgdGhpcy5sYWJlbCB8fCAnJzsKICAgICAgfSwKICAgICAgaXRlbVNlbGVjdGVkOiBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdC5tdWx0aXBsZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuaXNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLnNlbGVjdC52YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zKHRoaXMuc2VsZWN0LnZhbHVlLCB0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbWl0UmVhY2hlZDogZnVuY3Rpb24gbGltaXRSZWFjaGVkKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdC5tdWx0aXBsZSkgewogICAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TZWxlY3RlZCAmJiAodGhpcy5zZWxlY3QudmFsdWUgfHwgW10pLmxlbmd0aCA+PSB0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0ICYmIHRoaXMuc2VsZWN0Lm11bHRpcGxlTGltaXQgPiAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgd2F0Y2g6IHsKICAgICAgY3VycmVudExhYmVsOiBmdW5jdGlvbiBjdXJyZW50TGFiZWwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXRoaXMuc2VsZWN0LnJlbW90ZSkgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnc2V0U2VsZWN0ZWQnKTsKICAgICAgfSwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7CiAgICAgICAgdmFyIF9zZWxlY3QgPSB0aGlzLnNlbGVjdCwKICAgICAgICAgICAgcmVtb3RlID0gX3NlbGVjdC5yZW1vdGUsCiAgICAgICAgICAgIHZhbHVlS2V5ID0gX3NlbGVjdC52YWx1ZUtleTsKCiAgICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXJlbW90ZSkgewogICAgICAgICAgaWYgKHZhbHVlS2V5ICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvbGRWYWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9sZFZhbCkpID09PSAnb2JqZWN0JyAmJiB2YWxbdmFsdWVLZXldID09PSBvbGRWYWxbdmFsdWVLZXldKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbFNlbGVjdCcsICdzZXRTZWxlY3RlZCcpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIG1ldGhvZHM6IHsKICAgICAgaXNFcXVhbDogZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzT2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gYSA9PT0gYjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy5zZWxlY3QudmFsdWVLZXk7CiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKShhLCB2YWx1ZUtleSkgPT09IE9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkoYiwgdmFsdWVLZXkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKCkgewogICAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdOwogICAgICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMV07CgogICAgICAgIGlmICghdGhpcy5pc09iamVjdCkgewogICAgICAgICAgcmV0dXJuIGFyciAmJiBhcnIuaW5kZXhPZih0YXJnZXQpID4gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMuc2VsZWN0LnZhbHVlS2V5OwogICAgICAgICAgcmV0dXJuIGFyciAmJiBhcnIuc29tZShmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKShpdGVtLCB2YWx1ZUtleSkgPT09IE9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkodGFyZ2V0LCB2YWx1ZUtleSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhhbmRsZUdyb3VwRGlzYWJsZWQ6IGZ1bmN0aW9uIGhhbmRsZUdyb3VwRGlzYWJsZWQodmFsKSB7CiAgICAgICAgdGhpcy5ncm91cERpc2FibGVkID0gdmFsOwogICAgICB9LAogICAgICBob3Zlckl0ZW06IGZ1bmN0aW9uIGhvdmVySXRlbSgpIHsKICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZ3JvdXBEaXNhYmxlZCkgewogICAgICAgICAgdGhpcy5zZWxlY3QuaG92ZXJJbmRleCA9IHRoaXMuc2VsZWN0Lm9wdGlvbnMuaW5kZXhPZih0aGlzKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNlbGVjdE9wdGlvbkNsaWNrOiBmdW5jdGlvbiBzZWxlY3RPcHRpb25DbGljaygpIHsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiB0aGlzLmdyb3VwRGlzYWJsZWQgIT09IHRydWUpIHsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU2VsZWN0JywgJ2hhbmRsZU9wdGlvbkNsaWNrJywgW3RoaXMsIHRydWVdKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHF1ZXJ5Q2hhbmdlOiBmdW5jdGlvbiBxdWVyeUNoYW5nZShxdWVyeSkgewogICAgICAgIHRoaXMudmlzaWJsZSA9IG5ldyBSZWdFeHAoT2JqZWN0KHV0aWxfWyJlc2NhcGVSZWdleHBTdHJpbmciXSkocXVlcnkpLCAnaScpLnRlc3QodGhpcy5jdXJyZW50TGFiZWwpIHx8IHRoaXMuY3JlYXRlZDsKCiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgICAgdGhpcy5zZWxlY3Qub3B0aW9ucy5wdXNoKHRoaXMpOwogICAgICB0aGlzLnNlbGVjdC5jYWNoZWRPcHRpb25zLnB1c2godGhpcyk7CiAgICAgIHRoaXMuc2VsZWN0Lm9wdGlvbnNDb3VudCsrOwogICAgICB0aGlzLnNlbGVjdC5maWx0ZXJlZE9wdGlvbnNDb3VudCsrOwogICAgICB0aGlzLiRvbigncXVlcnlDaGFuZ2UnLCB0aGlzLnF1ZXJ5Q2hhbmdlKTsKICAgICAgdGhpcy4kb24oJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLCB0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpOwogICAgfSwKICAgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7CiAgICAgIHZhciBfc2VsZWN0MiA9IHRoaXMuc2VsZWN0LAogICAgICAgICAgc2VsZWN0ZWQgPSBfc2VsZWN0Mi5zZWxlY3RlZCwKICAgICAgICAgIG11bHRpcGxlID0gX3NlbGVjdDIubXVsdGlwbGU7CiAgICAgIHZhciBzZWxlY3RlZE9wdGlvbnMgPSBtdWx0aXBsZSA/IHNlbGVjdGVkIDogW3NlbGVjdGVkXTsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpOwogICAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpOyAvLyBpZiBvcHRpb24gaXMgbm90IHNlbGVjdGVkLCByZW1vdmUgaXQgZnJvbSBjYWNoZQoKICAgICAgaWYgKGluZGV4ID4gLTEgJiYgc2VsZWN0ZWRJbmRleCA8IDApIHsKICAgICAgICB0aGlzLnNlbGVjdC5jYWNoZWRPcHRpb25zLnNwbGljZShpbmRleCwgMSk7CiAgICAgIH0KCiAgICAgIHRoaXMuc2VsZWN0Lm9uT3B0aW9uRGVzdHJveSh0aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcykpOwogICAgfQogIH07IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgoKICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgogIHZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfOyAvLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qcwoKICB2YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlCgogIC8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi8KCgogIHZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplclsiYSIKICAvKiBkZWZhdWx0ICovCiAgXSkoc3JjX29wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXywgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKTsKICAvKiBob3QgcmVsb2FkICovCgogIGlmIChmYWxzZSkgewogICAgdmFyIGFwaTsKICB9CgogIGNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9ICJwYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWUiOwogIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCiAgdmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fWyJhIl0gPSBjb21wb25lbnQuZXhwb3J0czsKICAvKioqLwp9LCwsLAovKiAzNSAqLwoKLyogMzYgKi8KCi8qIDM3ICovCgovKiAzOCAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdGFnIik7CiAgLyoqKi8KfSwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsCi8qIDM5ICovCgovKiA0MCAqLwoKLyogNDEgKi8KCi8qIDQyICovCgovKiA0MyAqLwoKLyogNDQgKi8KCi8qIDQ1ICovCgovKiA0NiAqLwoKLyogNDcgKi8KCi8qIDQ4ICovCgovKiA0OSAqLwoKLyogNTAgKi8KCi8qIDUxICovCgovKiA1MiAqLwoKLyogNTMgKi8KCi8qIDU0ICovCgovKiA1NSAqLwoKLyogNTYgKi8KCi8qIDU3ICovCgovKiA1OCAqLwoKLyogNTkgKi8KCi8qIDYwICovCgovKiA2MSAqLwoKLyoqKi8KZnVuY3Rpb24gKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICJ1c2Ugc3RyaWN0IjsKCiAgX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wZTRhYWRlNiYKCgogIHZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICB2YXIgX3ZtID0gdGhpczsKCiAgICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnQ7CgogICAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oOwoKICAgIHJldHVybiBfYygiZGl2IiwgewogICAgICBkaXJlY3RpdmVzOiBbewogICAgICAgIG5hbWU6ICJjbGlja291dHNpZGUiLAogICAgICAgIHJhd05hbWU6ICJ2LWNsaWNrb3V0c2lkZSIsCiAgICAgICAgdmFsdWU6IF92bS5oYW5kbGVDbG9zZSwKICAgICAgICBleHByZXNzaW9uOiAiaGFuZGxlQ2xvc2UiCiAgICAgIH1dLAogICAgICBzdGF0aWNDbGFzczogImVsLXNlbGVjdCIsCiAgICAgIGNsYXNzOiBbX3ZtLnNlbGVjdFNpemUgPyAiZWwtc2VsZWN0LS0iICsgX3ZtLnNlbGVjdFNpemUgOiAiIl0sCiAgICAgIG9uOiB7CiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKCRldmVudCkgewogICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgcmV0dXJuIF92bS50b2dnbGVNZW51KCRldmVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBbX3ZtLm11bHRpcGxlID8gX2MoImRpdiIsIHsKICAgICAgcmVmOiAidGFncyIsCiAgICAgIHN0YXRpY0NsYXNzOiAiZWwtc2VsZWN0X190YWdzIiwKICAgICAgc3R5bGU6IHsKICAgICAgICAibWF4LXdpZHRoIjogX3ZtLmlucHV0V2lkdGggLSAzMiArICJweCIsCiAgICAgICAgd2lkdGg6ICIxMDAlIgogICAgICB9CiAgICB9LCBbX3ZtLmNvbGxhcHNlVGFncyAmJiBfdm0uc2VsZWN0ZWQubGVuZ3RoID8gX2MoInNwYW4iLCBbX2MoImVsLXRhZyIsIHsKICAgICAgYXR0cnM6IHsKICAgICAgICBjbG9zYWJsZTogIV92bS5zZWxlY3REaXNhYmxlZCwKICAgICAgICBzaXplOiBfdm0uY29sbGFwc2VUYWdTaXplLAogICAgICAgIGhpdDogX3ZtLnNlbGVjdGVkWzBdLmhpdFN0YXRlLAogICAgICAgIHR5cGU6ICJpbmZvIiwKICAgICAgICAiZGlzYWJsZS10cmFuc2l0aW9ucyI6ICIiCiAgICAgIH0sCiAgICAgIG9uOiB7CiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCRldmVudCkgewogICAgICAgICAgX3ZtLmRlbGV0ZVRhZygkZXZlbnQsIF92bS5zZWxlY3RlZFswXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBbX2MoInNwYW4iLCB7CiAgICAgIHN0YXRpY0NsYXNzOiAiZWwtc2VsZWN0X190YWdzLXRleHQiCiAgICB9LCBbX3ZtLl92KF92bS5fcyhfdm0uc2VsZWN0ZWRbMF0uY3VycmVudExhYmVsKSldKV0pLCBfdm0uc2VsZWN0ZWQubGVuZ3RoID4gMSA/IF9jKCJlbC10YWciLCB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgY2xvc2FibGU6IGZhbHNlLAogICAgICAgIHNpemU6IF92bS5jb2xsYXBzZVRhZ1NpemUsCiAgICAgICAgdHlwZTogImluZm8iLAogICAgICAgICJkaXNhYmxlLXRyYW5zaXRpb25zIjogIiIKICAgICAgfQogICAgfSwgW19jKCJzcGFuIiwgewogICAgICBzdGF0aWNDbGFzczogImVsLXNlbGVjdF9fdGFncy10ZXh0IgogICAgfSwgW192bS5fdigiKyAiICsgX3ZtLl9zKF92bS5zZWxlY3RlZC5sZW5ndGggLSAxKSldKV0pIDogX3ZtLl9lKCldLCAxKSA6IF92bS5fZSgpLCAhX3ZtLmNvbGxhcHNlVGFncyA/IF9jKCJ0cmFuc2l0aW9uLWdyb3VwIiwgewogICAgICBvbjogewogICAgICAgICJhZnRlci1sZWF2ZSI6IF92bS5yZXNldElucHV0SGVpZ2h0CiAgICAgIH0KICAgIH0sIF92bS5fbChfdm0uc2VsZWN0ZWQsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHJldHVybiBfYygiZWwtdGFnIiwgewogICAgICAgIGtleTogX3ZtLmdldFZhbHVlS2V5KGl0ZW0pLAogICAgICAgIGF0dHJzOiB7CiAgICAgICAgICBjbG9zYWJsZTogIV92bS5zZWxlY3REaXNhYmxlZCwKICAgICAgICAgIHNpemU6IF92bS5jb2xsYXBzZVRhZ1NpemUsCiAgICAgICAgICBoaXQ6IGl0ZW0uaGl0U3RhdGUsCiAgICAgICAgICB0eXBlOiAiaW5mbyIsCiAgICAgICAgICAiZGlzYWJsZS10cmFuc2l0aW9ucyI6ICIiCiAgICAgICAgfSwKICAgICAgICBvbjogewogICAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCRldmVudCkgewogICAgICAgICAgICBfdm0uZGVsZXRlVGFnKCRldmVudCwgaXRlbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LCBbX2MoInNwYW4iLCB7CiAgICAgICAgc3RhdGljQ2xhc3M6ICJlbC1zZWxlY3RfX3RhZ3MtdGV4dCIKICAgICAgfSwgW192bS5fdihfdm0uX3MoaXRlbS5jdXJyZW50TGFiZWwpKV0pXSk7CiAgICB9KSwgMSkgOiBfdm0uX2UoKSwgX3ZtLmZpbHRlcmFibGUgPyBfYygiaW5wdXQiLCB7CiAgICAgIGRpcmVjdGl2ZXM6IFt7CiAgICAgICAgbmFtZTogIm1vZGVsIiwKICAgICAgICByYXdOYW1lOiAidi1tb2RlbCIsCiAgICAgICAgdmFsdWU6IF92bS5xdWVyeSwKICAgICAgICBleHByZXNzaW9uOiAicXVlcnkiCiAgICAgIH1dLAogICAgICByZWY6ICJpbnB1dCIsCiAgICAgIHN0YXRpY0NsYXNzOiAiZWwtc2VsZWN0X19pbnB1dCIsCiAgICAgIGNsYXNzOiBbX3ZtLnNlbGVjdFNpemUgPyAiaXMtIiArIF92bS5zZWxlY3RTaXplIDogIiJdLAogICAgICBzdHlsZTogewogICAgICAgICJmbGV4LWdyb3ciOiAiMSIsCiAgICAgICAgd2lkdGg6IF92bS5pbnB1dExlbmd0aCAvIChfdm0uaW5wdXRXaWR0aCAtIDMyKSArICIlIiwKICAgICAgICAibWF4LXdpZHRoIjogX3ZtLmlucHV0V2lkdGggLSA0MiArICJweCIKICAgICAgfSwKICAgICAgYXR0cnM6IHsKICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgZGlzYWJsZWQ6IF92bS5zZWxlY3REaXNhYmxlZCwKICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZQogICAgICB9LAogICAgICBkb21Qcm9wczogewogICAgICAgIHZhbHVlOiBfdm0ucXVlcnkKICAgICAgfSwKICAgICAgb246IHsKICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzLAogICAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoJGV2ZW50KSB7CiAgICAgICAgICBfdm0uc29mdEZvY3VzID0gZmFsc2U7CiAgICAgICAgfSwKICAgICAgICBrZXl1cDogX3ZtLm1hbmFnZVBsYWNlaG9sZGVyLAogICAgICAgIGtleWRvd246IFtfdm0ucmVzZXRJbnB1dFN0YXRlLCBmdW5jdGlvbiAoJGV2ZW50KSB7CiAgICAgICAgICBpZiAoISgiYnV0dG9uIiBpbiAkZXZlbnQpICYmIF92bS5faygkZXZlbnQua2V5Q29kZSwgImRvd24iLCA0MCwgJGV2ZW50LmtleSwgWyJEb3duIiwgIkFycm93RG93biJdKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICBfdm0ubmF2aWdhdGVPcHRpb25zKCJuZXh0Iik7CiAgICAgICAgfSwgZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgaWYgKCEoImJ1dHRvbiIgaW4gJGV2ZW50KSAmJiBfdm0uX2soJGV2ZW50LmtleUNvZGUsICJ1cCIsIDM4LCAkZXZlbnQua2V5LCBbIlVwIiwgIkFycm93VXAiXSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgX3ZtLm5hdmlnYXRlT3B0aW9ucygicHJldiIpOwogICAgICAgIH0sIGZ1bmN0aW9uICgkZXZlbnQpIHsKICAgICAgICAgIGlmICghKCJidXR0b24iIGluICRldmVudCkgJiYgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCAiZW50ZXIiLCAxMywgJGV2ZW50LmtleSwgIkVudGVyIikpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICByZXR1cm4gX3ZtLnNlbGVjdE9wdGlvbigkZXZlbnQpOwogICAgICAgIH0sIGZ1bmN0aW9uICgkZXZlbnQpIHsKICAgICAgICAgIGlmICghKCJidXR0b24iIGluICRldmVudCkgJiYgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCAiZXNjIiwgMjcsICRldmVudC5rZXksIFsiRXNjIiwgIkVzY2FwZSJdKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgfSwgZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgaWYgKCEoImJ1dHRvbiIgaW4gJGV2ZW50KSAmJiBfdm0uX2soJGV2ZW50LmtleUNvZGUsICJkZWxldGUiLCBbOCwgNDZdLCAkZXZlbnQua2V5LCBbIkJhY2tzcGFjZSIsICJEZWxldGUiLCAiRGVsIl0pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBfdm0uZGVsZXRlUHJldlRhZygkZXZlbnQpOwogICAgICAgIH0sIGZ1bmN0aW9uICgkZXZlbnQpIHsKICAgICAgICAgIGlmICghKCJidXR0b24iIGluICRldmVudCkgJiYgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCAidGFiIiwgOSwgJGV2ZW50LmtleSwgIlRhYiIpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgfV0sCiAgICAgICAgY29tcG9zaXRpb25zdGFydDogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLAogICAgICAgIGNvbXBvc2l0aW9udXBkYXRlOiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sCiAgICAgICAgY29tcG9zaXRpb25lbmQ6IF92bS5oYW5kbGVDb21wb3NpdGlvbiwKICAgICAgICBpbnB1dDogW2Z1bmN0aW9uICgkZXZlbnQpIHsKICAgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgX3ZtLnF1ZXJ5ID0gJGV2ZW50LnRhcmdldC52YWx1ZTsKICAgICAgICB9LCBfdm0uZGVib3VuY2VkUXVlcnlDaGFuZ2VdCiAgICAgIH0KICAgIH0pIDogX3ZtLl9lKCldLCAxKSA6IF92bS5fZSgpLCBfYygiZWwtaW5wdXQiLCB7CiAgICAgIHJlZjogInJlZmVyZW5jZSIsCiAgICAgIGNsYXNzOiB7CiAgICAgICAgImlzLWZvY3VzIjogX3ZtLnZpc2libGUKICAgICAgfSwKICAgICAgYXR0cnM6IHsKICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5jdXJyZW50UGxhY2Vob2xkZXIsCiAgICAgICAgbmFtZTogX3ZtLm5hbWUsCiAgICAgICAgaWQ6IF92bS5pZCwKICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZSwKICAgICAgICBzaXplOiBfdm0uc2VsZWN0U2l6ZSwKICAgICAgICBkaXNhYmxlZDogX3ZtLnNlbGVjdERpc2FibGVkLAogICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksCiAgICAgICAgInZhbGlkYXRlLWV2ZW50IjogZmFsc2UsCiAgICAgICAgdGFiaW5kZXg6IF92bS5tdWx0aXBsZSAmJiBfdm0uZmlsdGVyYWJsZSA/ICItMSIgOiBudWxsCiAgICAgIH0sCiAgICAgIG9uOiB7CiAgICAgICAgZm9jdXM6IF92bS5oYW5kbGVGb2N1cywKICAgICAgICBibHVyOiBfdm0uaGFuZGxlQmx1cgogICAgICB9LAogICAgICBuYXRpdmVPbjogewogICAgICAgIGtleXVwOiBmdW5jdGlvbiBrZXl1cCgkZXZlbnQpIHsKICAgICAgICAgIHJldHVybiBfdm0uZGVib3VuY2VkT25JbnB1dENoYW5nZSgkZXZlbnQpOwogICAgICAgIH0sCiAgICAgICAga2V5ZG93bjogW2Z1bmN0aW9uICgkZXZlbnQpIHsKICAgICAgICAgIGlmICghKCJidXR0b24iIGluICRldmVudCkgJiYgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCAiZG93biIsIDQwLCAkZXZlbnQua2V5LCBbIkRvd24iLCAiQXJyb3dEb3duIl0pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgIF92bS5uYXZpZ2F0ZU9wdGlvbnMoIm5leHQiKTsKICAgICAgICB9LCBmdW5jdGlvbiAoJGV2ZW50KSB7CiAgICAgICAgICBpZiAoISgiYnV0dG9uIiBpbiAkZXZlbnQpICYmIF92bS5faygkZXZlbnQua2V5Q29kZSwgInVwIiwgMzgsICRldmVudC5rZXksIFsiVXAiLCAiQXJyb3dVcCJdKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICBfdm0ubmF2aWdhdGVPcHRpb25zKCJwcmV2Iik7CiAgICAgICAgfSwgZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgaWYgKCEoImJ1dHRvbiIgaW4gJGV2ZW50KSAmJiBfdm0uX2soJGV2ZW50LmtleUNvZGUsICJlbnRlciIsIDEzLCAkZXZlbnQua2V5LCAiRW50ZXIiKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uKCRldmVudCk7CiAgICAgICAgfSwgZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgaWYgKCEoImJ1dHRvbiIgaW4gJGV2ZW50KSAmJiBfdm0uX2soJGV2ZW50LmtleUNvZGUsICJlc2MiLCAyNywgJGV2ZW50LmtleSwgWyJFc2MiLCAiRXNjYXBlIl0pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZTsKICAgICAgICB9LCBmdW5jdGlvbiAoJGV2ZW50KSB7CiAgICAgICAgICBpZiAoISgiYnV0dG9uIiBpbiAkZXZlbnQpICYmIF92bS5faygkZXZlbnQua2V5Q29kZSwgInRhYiIsIDksICRldmVudC5rZXksICJUYWIiKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICBfdm0udmlzaWJsZSA9IGZhbHNlOwogICAgICAgIH1dLAogICAgICAgIHBhc3RlOiBmdW5jdGlvbiBwYXN0ZSgkZXZlbnQpIHsKICAgICAgICAgIHJldHVybiBfdm0uZGVib3VuY2VkT25JbnB1dENoYW5nZSgkZXZlbnQpOwogICAgICAgIH0sCiAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24gbW91c2VlbnRlcigkZXZlbnQpIHsKICAgICAgICAgIF92bS5pbnB1dEhvdmVyaW5nID0gdHJ1ZTsKICAgICAgICB9LAogICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uIG1vdXNlbGVhdmUoJGV2ZW50KSB7CiAgICAgICAgICBfdm0uaW5wdXRIb3ZlcmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbW9kZWw6IHsKICAgICAgICB2YWx1ZTogX3ZtLnNlbGVjdGVkTGFiZWwsCiAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCQkdikgewogICAgICAgICAgX3ZtLnNlbGVjdGVkTGFiZWwgPSAkJHY7CiAgICAgICAgfSwKICAgICAgICBleHByZXNzaW9uOiAic2VsZWN0ZWRMYWJlbCIKICAgICAgfQogICAgfSwgW192bS4kc2xvdHMucHJlZml4ID8gX2MoInRlbXBsYXRlIiwgewogICAgICBzbG90OiAicHJlZml4IgogICAgfSwgW192bS5fdCgicHJlZml4IildLCAyKSA6IF92bS5fZSgpLCBfYygidGVtcGxhdGUiLCB7CiAgICAgIHNsb3Q6ICJzdWZmaXgiCiAgICB9LCBbX2MoImkiLCB7CiAgICAgIGRpcmVjdGl2ZXM6IFt7CiAgICAgICAgbmFtZTogInNob3ciLAogICAgICAgIHJhd05hbWU6ICJ2LXNob3ciLAogICAgICAgIHZhbHVlOiAhX3ZtLnNob3dDbG9zZSwKICAgICAgICBleHByZXNzaW9uOiAiIXNob3dDbG9zZSIKICAgICAgfV0sCiAgICAgIGNsYXNzOiBbImVsLXNlbGVjdF9fY2FyZXQiLCAiZWwtaW5wdXRfX2ljb24iLCAiZWwtaWNvbi0iICsgX3ZtLmljb25DbGFzc10KICAgIH0pLCBfdm0uc2hvd0Nsb3NlID8gX2MoImkiLCB7CiAgICAgIHN0YXRpY0NsYXNzOiAiZWwtc2VsZWN0X19jYXJldCBlbC1pbnB1dF9faWNvbiBlbC1pY29uLWNpcmNsZS1jbG9zZSIsCiAgICAgIG9uOiB7CiAgICAgICAgY2xpY2s6IF92bS5oYW5kbGVDbGVhckNsaWNrCiAgICAgIH0KICAgIH0pIDogX3ZtLl9lKCldKV0sIDIpLCBfYygidHJhbnNpdGlvbiIsIHsKICAgICAgYXR0cnM6IHsKICAgICAgICBuYW1lOiAiZWwtem9vbS1pbi10b3AiCiAgICAgIH0sCiAgICAgIG9uOiB7CiAgICAgICAgImJlZm9yZS1lbnRlciI6IF92bS5oYW5kbGVNZW51RW50ZXIsCiAgICAgICAgImFmdGVyLWxlYXZlIjogX3ZtLmRvRGVzdHJveQogICAgICB9CiAgICB9LCBbX2MoImVsLXNlbGVjdC1tZW51IiwgewogICAgICBkaXJlY3RpdmVzOiBbewogICAgICAgIG5hbWU6ICJzaG93IiwKICAgICAgICByYXdOYW1lOiAidi1zaG93IiwKICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUgJiYgX3ZtLmVtcHR5VGV4dCAhPT0gZmFsc2UsCiAgICAgICAgZXhwcmVzc2lvbjogInZpc2libGUgJiYgZW1wdHlUZXh0ICE9PSBmYWxzZSIKICAgICAgfV0sCiAgICAgIHJlZjogInBvcHBlciIsCiAgICAgIGF0dHJzOiB7CiAgICAgICAgImFwcGVuZC10by1ib2R5IjogX3ZtLnBvcHBlckFwcGVuZFRvQm9keQogICAgICB9CiAgICB9LCBbX2MoImVsLXNjcm9sbGJhciIsIHsKICAgICAgZGlyZWN0aXZlczogW3sKICAgICAgICBuYW1lOiAic2hvdyIsCiAgICAgICAgcmF3TmFtZTogInYtc2hvdyIsCiAgICAgICAgdmFsdWU6IF92bS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgIV92bS5sb2FkaW5nLAogICAgICAgIGV4cHJlc3Npb246ICJvcHRpb25zLmxlbmd0aCA+IDAgJiYgIWxvYWRpbmciCiAgICAgIH1dLAogICAgICByZWY6ICJzY3JvbGxiYXIiLAogICAgICBjbGFzczogewogICAgICAgICJpcy1lbXB0eSI6ICFfdm0uYWxsb3dDcmVhdGUgJiYgX3ZtLnF1ZXJ5ICYmIF92bS5maWx0ZXJlZE9wdGlvbnNDb3VudCA9PT0gMAogICAgICB9LAogICAgICBhdHRyczogewogICAgICAgIHRhZzogInVsIiwKICAgICAgICAid3JhcC1jbGFzcyI6ICJlbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAiLAogICAgICAgICJ2aWV3LWNsYXNzIjogImVsLXNlbGVjdC1kcm9wZG93bl9fbGlzdCIKICAgICAgfQogICAgfSwgW192bS5zaG93TmV3T3B0aW9uID8gX2MoImVsLW9wdGlvbiIsIHsKICAgICAgYXR0cnM6IHsKICAgICAgICB2YWx1ZTogX3ZtLnF1ZXJ5LAogICAgICAgIGNyZWF0ZWQ6ICIiCiAgICAgIH0KICAgIH0pIDogX3ZtLl9lKCksIF92bS5fdCgiZGVmYXVsdCIpXSwgMiksIF92bS5lbXB0eVRleHQgJiYgKCFfdm0uYWxsb3dDcmVhdGUgfHwgX3ZtLmxvYWRpbmcgfHwgX3ZtLmFsbG93Q3JlYXRlICYmIF92bS5vcHRpb25zLmxlbmd0aCA9PT0gMCkgPyBbX3ZtLiRzbG90cy5lbXB0eSA/IF92bS5fdCgiZW1wdHkiKSA6IF9jKCJwIiwgewogICAgICBzdGF0aWNDbGFzczogImVsLXNlbGVjdC1kcm9wZG93bl9fZW1wdHkiCiAgICB9LCBbX3ZtLl92KCJcbiAgICAgICAgICAiICsgX3ZtLl9zKF92bS5lbXB0eVRleHQpICsgIlxuICAgICAgICAiKV0pXSA6IF92bS5fZSgpXSwgMildLCAxKV0sIDEpOwogIH07CgogIHZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXTsKICByZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWU7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBlNGFhZGU2JgogIC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyIgoKICB2YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKICB2YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9mb2N1cyIKCgogIHZhciBmb2N1c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTsKCiAgdmFyIGZvY3VzX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGZvY3VzXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9sb2NhbGUiCgoKICB2YXIgbG9jYWxlXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgogIHZhciBsb2NhbGVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obG9jYWxlXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2lucHV0IgoKCiAgdmFyIGlucHV0XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApOwoKICB2YXIgaW5wdXRfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaW5wdXRfKTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4Mjg3NDgmCgoKICB2YXIgc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyID0gZnVuY3Rpb24gc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyKCkgewogICAgdmFyIF92bSA9IHRoaXM7CgogICAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50OwoKICAgIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaDsKCiAgICByZXR1cm4gX2MoImRpdiIsIHsKICAgICAgc3RhdGljQ2xhc3M6ICJlbC1zZWxlY3QtZHJvcGRvd24gZWwtcG9wcGVyIiwKICAgICAgY2xhc3M6IFt7CiAgICAgICAgImlzLW11bHRpcGxlIjogX3ZtLiRwYXJlbnQubXVsdGlwbGUKICAgICAgfSwgX3ZtLnBvcHBlckNsYXNzXSwKICAgICAgc3R5bGU6IHsKICAgICAgICBtaW5XaWR0aDogX3ZtLm1pbldpZHRoCiAgICAgIH0KICAgIH0sIFtfdm0uX3QoImRlZmF1bHQiKV0sIDIpOwogIH07CgogIHZhciBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9zdGF0aWNSZW5kZXJGbnMgPSBbXTsKICBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWU7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2ODI4NzQ4JgogIC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3Z1ZS1wb3BwZXIiCgogIHZhciB2dWVfcG9wcGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgogIHZhciB2dWVfcG9wcGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHZ1ZV9wb3BwZXJfKTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwoKICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgoKICB2YXIgc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gewogICAgbmFtZTogJ0VsU2VsZWN0RHJvcGRvd24nLAogICAgY29tcG9uZW50TmFtZTogJ0VsU2VsZWN0RHJvcGRvd24nLAogICAgbWl4aW5zOiBbdnVlX3BvcHBlcl9kZWZhdWx0LmFdLAogICAgcHJvcHM6IHsKICAgICAgcGxhY2VtZW50OiB7CiAgICAgICAgZGVmYXVsdDogJ2JvdHRvbS1zdGFydCcKICAgICAgfSwKICAgICAgYm91bmRhcmllc1BhZGRpbmc6IHsKICAgICAgICBkZWZhdWx0OiAwCiAgICAgIH0sCiAgICAgIHBvcHBlck9wdGlvbnM6IHsKICAgICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGdwdUFjY2VsZXJhdGlvbjogZmFsc2UKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9LAogICAgICB2aXNpYmxlQXJyb3c6IHsKICAgICAgICBkZWZhdWx0OiB0cnVlCiAgICAgIH0sCiAgICAgIGFwcGVuZFRvQm9keTogewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgZGVmYXVsdDogdHJ1ZQogICAgICB9CiAgICB9LAogICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBtaW5XaWR0aDogJycKICAgICAgfTsKICAgIH0sCiAgICBjb21wdXRlZDogewogICAgICBwb3BwZXJDbGFzczogZnVuY3Rpb24gcG9wcGVyQ2xhc3MoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5wb3BwZXJDbGFzczsKICAgICAgfQogICAgfSwKICAgIHdhdGNoOiB7CiAgICAgICckcGFyZW50LmlucHV0V2lkdGgnOiBmdW5jdGlvbiAkcGFyZW50SW5wdXRXaWR0aCgpIHsKICAgICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy4kcGFyZW50LiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArICdweCc7CiAgICAgIH0KICAgIH0sCiAgICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgdGhpcy5yZWZlcmVuY2VFbG0gPSB0aGlzLiRwYXJlbnQuJHJlZnMucmVmZXJlbmNlLiRlbDsKICAgICAgdGhpcy4kcGFyZW50LnBvcHBlckVsbSA9IHRoaXMucG9wcGVyRWxtID0gdGhpcy4kZWw7CiAgICAgIHRoaXMuJG9uKCd1cGRhdGVQb3BwZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKF90aGlzLiRwYXJlbnQudmlzaWJsZSkgX3RoaXMudXBkYXRlUG9wcGVyKCk7CiAgICAgIH0pOwogICAgICB0aGlzLiRvbignZGVzdHJveVBvcHBlcicsIHRoaXMuZGVzdHJveVBvcHBlcik7CiAgICB9CiAgfTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCgogIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCiAgdmFyIHNyY19zZWxlY3RfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187IC8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzCgogIHZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWUKCiAgLyogbm9ybWFsaXplIGNvbXBvbmVudCAqLwoKCiAgdmFyIGNvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyWyJhIgogIC8qIGRlZmF1bHQgKi8KICBdKShzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLCBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIsIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwogIC8qIGhvdCByZWxvYWQgKi8KCiAgaWYgKGZhbHNlKSB7CiAgICB2YXIgYXBpOwogIH0KCiAgY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gInBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZSI7CiAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKICB2YXIgc2VsZWN0X2Ryb3Bkb3duID0gY29tcG9uZW50LmV4cG9ydHM7IC8vIEVYVEVSTkFMIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWUgKyA0IG1vZHVsZXMKCiAgdmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdGFnIgoKCiAgdmFyIHRhZ18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTsKCiAgdmFyIHRhZ19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0YWdfKTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyIgoKCiAgdmFyIHNjcm9sbGJhcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTsKCiAgdmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAidGhyb3R0bGUtZGVib3VuY2UvZGVib3VuY2UiCgoKICB2YXIgZGVib3VuY2VfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgogIHZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9jbGlja291dHNpZGUiCgoKICB2YXIgY2xpY2tvdXRzaWRlXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpOwoKICB2YXIgY2xpY2tvdXRzaWRlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNsaWNrb3V0c2lkZV8pOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9yZXNpemUtZXZlbnQiCgoKICB2YXIgcmVzaXplX2V2ZW50XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi9sb2NhbGUiCgoKICB2YXIgbGliX2xvY2FsZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlldyIKCgogIHZhciBzY3JvbGxfaW50b192aWV3XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpOwoKICB2YXIgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxfaW50b192aWV3Xyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwiCgoKICB2YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvbmF2aWdhdGlvbi1taXhpbi5qcwoKICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgoKICB2YXIgbmF2aWdhdGlvbl9taXhpbiA9IHsKICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaG92ZXJPcHRpb246IC0xCiAgICAgIH07CiAgICB9LAogICAgY29tcHV0ZWQ6IHsKICAgICAgb3B0aW9uc0FsbERpc2FibGVkOiBmdW5jdGlvbiBvcHRpb25zQWxsRGlzYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgcmV0dXJuIG9wdGlvbi52aXNpYmxlOwogICAgICAgIH0pLmV2ZXJ5KGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQ7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICB3YXRjaDogewogICAgICBob3ZlckluZGV4OiBmdW5jdGlvbiBob3ZlckluZGV4KHZhbCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiB2YWwgPiAtMSkgewogICAgICAgICAgdGhpcy5ob3Zlck9wdGlvbiA9IHRoaXMub3B0aW9uc1t2YWxdIHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgdGhpcy5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgb3B0aW9uLmhvdmVyID0gX3RoaXMuaG92ZXJPcHRpb24gPT09IG9wdGlvbjsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIG1ldGhvZHM6IHsKICAgICAgbmF2aWdhdGVPcHRpb25zOiBmdW5jdGlvbiBuYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKSB7CiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7CiAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9PT0gMCkgcmV0dXJuOwoKICAgICAgICBpZiAoIXRoaXMub3B0aW9uc0FsbERpc2FibGVkKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHsKICAgICAgICAgICAgdGhpcy5ob3ZlckluZGV4Kys7CgogICAgICAgICAgICBpZiAodGhpcy5ob3ZlckluZGV4ID09PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2JykgewogICAgICAgICAgICB0aGlzLmhvdmVySW5kZXgtLTsKCiAgICAgICAgICAgIGlmICh0aGlzLmhvdmVySW5kZXggPCAwKSB7CiAgICAgICAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF07CgogICAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCBvcHRpb24uZ3JvdXBEaXNhYmxlZCA9PT0gdHJ1ZSB8fCAhb3B0aW9uLnZpc2libGUpIHsKICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczIuc2Nyb2xsVG9PcHRpb24oX3RoaXMyLmhvdmVyT3B0aW9uKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3NoYXJlZCIKCiAgdmFyIHNoYXJlZF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJgogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwogIC8vCiAgLy8KICAvLwoKICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgoKICB2YXIgc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gewogICAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIGxvY2FsZV9kZWZhdWx0LmEsIGZvY3VzX2RlZmF1bHQoKSgncmVmZXJlbmNlJyksIG5hdmlnYXRpb25fbWl4aW5dLAogICAgbmFtZTogJ0VsU2VsZWN0JywKICAgIGNvbXBvbmVudE5hbWU6ICdFbFNlbGVjdCcsCiAgICBpbmplY3Q6IHsKICAgICAgZWxGb3JtOiB7CiAgICAgICAgZGVmYXVsdDogJycKICAgICAgfSwKICAgICAgZWxGb3JtSXRlbTogewogICAgICAgIGRlZmF1bHQ6ICcnCiAgICAgIH0KICAgIH0sCiAgICBwcm92aWRlOiBmdW5jdGlvbiBwcm92aWRlKCkgewogICAgICByZXR1cm4gewogICAgICAgICdzZWxlY3QnOiB0aGlzCiAgICAgIH07CiAgICB9LAogICAgY29tcHV0ZWQ6IHsKICAgICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLmVsRm9ybUl0ZW0gfHwge30pLmVsRm9ybUl0ZW1TaXplOwogICAgICB9LAogICAgICByZWFkb25seTogZnVuY3Rpb24gcmVhZG9ubHkoKSB7CiAgICAgICAgcmV0dXJuICF0aGlzLmZpbHRlcmFibGUgfHwgdGhpcy5tdWx0aXBsZSB8fCAhT2JqZWN0KHV0aWxfWyJpc0lFIl0pKCkgJiYgIU9iamVjdCh1dGlsX1siaXNFZGdlIl0pKCkgJiYgIXRoaXMudmlzaWJsZTsKICAgICAgfSwKICAgICAgc2hvd0Nsb3NlOiBmdW5jdGlvbiBzaG93Q2xvc2UoKSB7CiAgICAgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAwIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gJyc7CiAgICAgICAgdmFyIGNyaXRlcmlhID0gdGhpcy5jbGVhcmFibGUgJiYgIXRoaXMuc2VsZWN0RGlzYWJsZWQgJiYgdGhpcy5pbnB1dEhvdmVyaW5nICYmIGhhc1ZhbHVlOwogICAgICAgIHJldHVybiBjcml0ZXJpYTsKICAgICAgfSwKICAgICAgaWNvbkNsYXNzOiBmdW5jdGlvbiBpY29uQ2xhc3MoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlICYmIHRoaXMuZmlsdGVyYWJsZSA/ICcnIDogdGhpcy52aXNpYmxlID8gJ2Fycm93LXVwIGlzLXJldmVyc2UnIDogJ2Fycm93LXVwJzsKICAgICAgfSwKICAgICAgZGVib3VuY2U6IGZ1bmN0aW9uIGRlYm91bmNlKCkgewogICAgICAgIHJldHVybiB0aGlzLnJlbW90ZSA/IDMwMCA6IDA7CiAgICAgIH0sCiAgICAgIGVtcHR5VGV4dDogZnVuY3Rpb24gZW1wdHlUZXh0KCkgewogICAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdUZXh0IHx8IHRoaXMudCgnZWwuc2VsZWN0LmxvYWRpbmcnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMucmVtb3RlICYmIHRoaXMucXVlcnkgPT09ICcnICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTsKCiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmIHRoaXMucXVlcnkgJiYgdGhpcy5vcHRpb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub01hdGNoVGV4dCB8fCB0aGlzLnQoJ2VsLnNlbGVjdC5ub01hdGNoJyk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9EYXRhVGV4dCB8fCB0aGlzLnQoJ2VsLnNlbGVjdC5ub0RhdGEnKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgICB9LAogICAgICBzaG93TmV3T3B0aW9uOiBmdW5jdGlvbiBzaG93TmV3T3B0aW9uKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgIHZhciBoYXNFeGlzdGluZ09wdGlvbiA9IHRoaXMub3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgcmV0dXJuICFvcHRpb24uY3JlYXRlZDsKICAgICAgICB9KS5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICAgIHJldHVybiBvcHRpb24uY3VycmVudExhYmVsID09PSBfdGhpcy5xdWVyeTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5xdWVyeSAhPT0gJycgJiYgIWhhc0V4aXN0aW5nT3B0aW9uOwogICAgICB9LAogICAgICBzZWxlY3RTaXplOiBmdW5jdGlvbiBzZWxlY3RTaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7CiAgICAgIH0sCiAgICAgIHNlbGVjdERpc2FibGVkOiBmdW5jdGlvbiBzZWxlY3REaXNhYmxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkOwogICAgICB9LAogICAgICBjb2xsYXBzZVRhZ1NpemU6IGZ1bmN0aW9uIGNvbGxhcHNlVGFnU2l6ZSgpIHsKICAgICAgICByZXR1cm4gWydzbWFsbCcsICdtaW5pJ10uaW5kZXhPZih0aGlzLnNlbGVjdFNpemUpID4gLTEgPyAnbWluaScgOiAnc21hbGwnOwogICAgICB9CiAgICB9LAogICAgY29tcG9uZW50czogewogICAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsCiAgICAgIEVsU2VsZWN0TWVudTogc2VsZWN0X2Ryb3Bkb3duLAogICAgICBFbE9wdGlvbjogc3JjX29wdGlvblsiYSIKICAgICAgLyogZGVmYXVsdCAqLwogICAgICBdLAogICAgICBFbFRhZzogdGFnX2RlZmF1bHQuYSwKICAgICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmEKICAgIH0sCiAgICBkaXJlY3RpdmVzOiB7CiAgICAgIENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYQogICAgfSwKICAgIHByb3BzOiB7CiAgICAgIG5hbWU6IFN0cmluZywKICAgICAgaWQ6IFN0cmluZywKICAgICAgdmFsdWU6IHsKICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICB9LAogICAgICBhdXRvY29tcGxldGU6IHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgZGVmYXVsdDogJ29mZicKICAgICAgfSwKCiAgICAgIC8qKiBARGVwcmVjYXRlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24gKi8KICAgICAgYXV0b0NvbXBsZXRlOiB7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gdmFsaWRhdG9yKHZhbCkgewogICAgICAgICAgZmFsc2UgJiYgZmFsc2U7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGF1dG9tYXRpY0Ryb3Bkb3duOiBCb29sZWFuLAogICAgICBzaXplOiBTdHJpbmcsCiAgICAgIGRpc2FibGVkOiBCb29sZWFuLAogICAgICBjbGVhcmFibGU6IEJvb2xlYW4sCiAgICAgIGZpbHRlcmFibGU6IEJvb2xlYW4sCiAgICAgIGFsbG93Q3JlYXRlOiBCb29sZWFuLAogICAgICBsb2FkaW5nOiBCb29sZWFuLAogICAgICBwb3BwZXJDbGFzczogU3RyaW5nLAogICAgICByZW1vdGU6IEJvb2xlYW4sCiAgICAgIGxvYWRpbmdUZXh0OiBTdHJpbmcsCiAgICAgIG5vTWF0Y2hUZXh0OiBTdHJpbmcsCiAgICAgIG5vRGF0YVRleHQ6IFN0cmluZywKICAgICAgcmVtb3RlTWV0aG9kOiBGdW5jdGlvbiwKICAgICAgZmlsdGVyTWV0aG9kOiBGdW5jdGlvbiwKICAgICAgbXVsdGlwbGU6IEJvb2xlYW4sCiAgICAgIG11bHRpcGxlTGltaXQ6IHsKICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgZGVmYXVsdDogMAogICAgICB9LAogICAgICBwbGFjZWhvbGRlcjogewogICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHsKICAgICAgICAgIHJldHVybiBPYmplY3QobGliX2xvY2FsZV9bInQiXSkoJ2VsLnNlbGVjdC5wbGFjZWhvbGRlcicpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBCb29sZWFuLAogICAgICByZXNlcnZlS2V5d29yZDogQm9vbGVhbiwKICAgICAgdmFsdWVLZXk6IHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgZGVmYXVsdDogJ3ZhbHVlJwogICAgICB9LAogICAgICBjb2xsYXBzZVRhZ3M6IEJvb2xlYW4sCiAgICAgIHBvcHBlckFwcGVuZFRvQm9keTogewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgZGVmYXVsdDogdHJ1ZQogICAgICB9CiAgICB9LAogICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcHRpb25zOiBbXSwKICAgICAgICBjYWNoZWRPcHRpb25zOiBbXSwKICAgICAgICBjcmVhdGVkTGFiZWw6IG51bGwsCiAgICAgICAgY3JlYXRlZFNlbGVjdGVkOiBmYWxzZSwKICAgICAgICBzZWxlY3RlZDogdGhpcy5tdWx0aXBsZSA/IFtdIDoge30sCiAgICAgICAgaW5wdXRMZW5ndGg6IDIwLAogICAgICAgIGlucHV0V2lkdGg6IDAsCiAgICAgICAgaW5pdGlhbElucHV0SGVpZ2h0OiAwLAogICAgICAgIGNhY2hlZFBsYWNlSG9sZGVyOiAnJywKICAgICAgICBvcHRpb25zQ291bnQ6IDAsCiAgICAgICAgZmlsdGVyZWRPcHRpb25zQ291bnQ6IDAsCiAgICAgICAgdmlzaWJsZTogZmFsc2UsCiAgICAgICAgc29mdEZvY3VzOiBmYWxzZSwKICAgICAgICBzZWxlY3RlZExhYmVsOiAnJywKICAgICAgICBob3ZlckluZGV4OiAtMSwKICAgICAgICBxdWVyeTogJycsCiAgICAgICAgcHJldmlvdXNRdWVyeTogbnVsbCwKICAgICAgICBpbnB1dEhvdmVyaW5nOiBmYWxzZSwKICAgICAgICBjdXJyZW50UGxhY2Vob2xkZXI6ICcnLAogICAgICAgIG1lbnVWaXNpYmxlT25Gb2N1czogZmFsc2UsCiAgICAgICAgaXNPbkNvbXBvc2l0aW9uOiBmYWxzZSwKICAgICAgICBpc1NpbGVudEJsdXI6IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgd2F0Y2g6IHsKICAgICAgc2VsZWN0RGlzYWJsZWQ6IGZ1bmN0aW9uIHNlbGVjdERpc2FibGVkKCkgewogICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczIucmVzZXRJbnB1dEhlaWdodCgpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICBwbGFjZWhvbGRlcjogZnVuY3Rpb24gcGxhY2Vob2xkZXIodmFsKSB7CiAgICAgICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdmFsOwogICAgICB9LAogICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGRWYWwpIHsKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7CgogICAgICAgICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoID4gMCB8fCB0aGlzLiRyZWZzLmlucHV0ICYmIHRoaXMucXVlcnkgIT09ICcnKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gJyc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiAhdGhpcy5yZXNlcnZlS2V5d29yZCkgewogICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcnlDaGFuZ2UodGhpcy5xdWVyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLnNldFNlbGVjdGVkKCk7CgogICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgIXRoaXMubXVsdGlwbGUpIHsKICAgICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDsKICAgICAgICB9CgogICAgICAgIGlmICghT2JqZWN0KHV0aWxfWyJ2YWx1ZUVxdWFscyJdKSh2YWwsIG9sZFZhbCkpIHsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsRm9ybUl0ZW0nLCAnZWwuZm9ybS5jaGFuZ2UnLCB2YWwpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHsKICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbFNlbGVjdERyb3Bkb3duJywgJ2Rlc3Ryb3lQb3BwZXInKTsKCiAgICAgICAgICBpZiAodGhpcy4kcmVmcy5pbnB1dCkgewogICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7CiAgICAgICAgICB0aGlzLnByZXZpb3VzUXVlcnkgPSBudWxsOwogICAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gJyc7CiAgICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gMjA7CiAgICAgICAgICB0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cyA9IGZhbHNlOwogICAgICAgICAgdGhpcy5yZXNldEhvdmVySW5kZXgoKTsKICAgICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKF90aGlzMy4kcmVmcy5pbnB1dCAmJiBfdGhpczMuJHJlZnMuaW5wdXQudmFsdWUgPT09ICcnICYmIF90aGlzMy5zZWxlY3RlZC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBfdGhpczMuY3VycmVudFBsYWNlaG9sZGVyID0gX3RoaXMzLmNhY2hlZFBsYWNlSG9sZGVyOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgJiYgdGhpcy5jcmVhdGVkTGFiZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbCA9IHRoaXMuY3JlYXRlZExhYmVsOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSB0aGlzLnNlbGVjdGVkLmN1cnJlbnRMYWJlbDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkTGFiZWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHsKICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7CgogICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkgewogICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5yZW1vdGUgPyAnJyA6IHRoaXMuc2VsZWN0ZWRMYWJlbDsKICAgICAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUNoYW5nZSh0aGlzLnF1ZXJ5KTsKCiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7CiAgICAgICAgICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbicsICdxdWVyeUNoYW5nZScsICcnKTsKICAgICAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbkdyb3VwJywgJ3F1ZXJ5Q2hhbmdlJyk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuc2VsZWN0ZWRMYWJlbDsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbCA9ICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy4kZW1pdCgndmlzaWJsZS1jaGFuZ2UnLCB2YWwpOwogICAgICB9LAogICAgICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKCkgewogICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwoKICAgICAgICBpZiAodGhpcy4kaXNTZXJ2ZXIpIHJldHVybjsKICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuYnJvYWRjYXN0KCdFbFNlbGVjdERyb3Bkb3duJywgJ3VwZGF0ZVBvcHBlcicpOwogICAgICAgIH0pOwoKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgaW5wdXRzID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTsKCiAgICAgICAgaWYgKFtdLmluZGV4T2YuY2FsbChpbnB1dHMsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpID09PSAtMSkgewogICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEZpcnN0T3B0aW9uICYmICh0aGlzLmZpbHRlcmFibGUgfHwgdGhpcy5yZW1vdGUpICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQpIHsKICAgICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBtZXRob2RzOiB7CiAgICAgIGhhbmRsZUNvbXBvc2l0aW9uOiBmdW5jdGlvbiBoYW5kbGVDb21wb3NpdGlvbihldmVudCkgewogICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgICB2YXIgdGV4dCA9IGV2ZW50LnRhcmdldC52YWx1ZTsKCiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb21wb3NpdGlvbmVuZCcpIHsKICAgICAgICAgIHRoaXMuaXNPbkNvbXBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykgewogICAgICAgICAgICByZXR1cm4gX3RoaXM1LmhhbmRsZVF1ZXJ5Q2hhbmdlKHRleHQpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBsYXN0Q2hhcmFjdGVyID0gdGV4dFt0ZXh0Lmxlbmd0aCAtIDFdIHx8ICcnOwogICAgICAgICAgdGhpcy5pc09uQ29tcG9zaXRpb24gPSAhT2JqZWN0KHNoYXJlZF9bImlzS29yZWFuIl0pKGxhc3RDaGFyYWN0ZXIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaGFuZGxlUXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVF1ZXJ5Q2hhbmdlKHZhbCkgewogICAgICAgIHZhciBfdGhpczYgPSB0aGlzOwoKICAgICAgICBpZiAodGhpcy5wcmV2aW91c1F1ZXJ5ID09PSB2YWwgfHwgdGhpcy5pc09uQ29tcG9zaXRpb24pIHJldHVybjsKCiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNRdWVyeSA9PT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykpIHsKICAgICAgICAgIHRoaXMucHJldmlvdXNRdWVyeSA9IHZhbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMucHJldmlvdXNRdWVyeSA9IHZhbDsKICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoX3RoaXM2LnZpc2libGUpIF90aGlzNi5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gLTE7CgogICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZmlsdGVyYWJsZSkgewogICAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbGVuZ3RoID0gX3RoaXM2LiRyZWZzLmlucHV0LnZhbHVlLmxlbmd0aCAqIDE1ICsgMjA7CiAgICAgICAgICAgIF90aGlzNi5pbnB1dExlbmd0aCA9IF90aGlzNi5jb2xsYXBzZVRhZ3MgPyBNYXRoLm1pbig1MCwgbGVuZ3RoKSA6IGxlbmd0aDsKCiAgICAgICAgICAgIF90aGlzNi5tYW5hZ2VQbGFjZWhvbGRlcigpOwoKICAgICAgICAgICAgX3RoaXM2LnJlc2V0SW5wdXRIZWlnaHQoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMucmVtb3RlICYmIHR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gLTE7CiAgICAgICAgICB0aGlzLnJlbW90ZU1ldGhvZCh2YWwpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0aGlzLmZpbHRlck1ldGhvZCh2YWwpOwogICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9IHRoaXMub3B0aW9uc0NvdW50OwogICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgdmFsKTsKICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCdFbE9wdGlvbkdyb3VwJywgJ3F1ZXJ5Q2hhbmdlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5kZWZhdWx0Rmlyc3RPcHRpb24gJiYgKHRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLnJlbW90ZSkgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCkgewogICAgICAgICAgdGhpcy5jaGVja0RlZmF1bHRGaXJzdE9wdGlvbigpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2Nyb2xsVG9PcHRpb246IGZ1bmN0aW9uIHNjcm9sbFRvT3B0aW9uKG9wdGlvbikgewogICAgICAgIHZhciB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG9wdGlvbikgJiYgb3B0aW9uWzBdID8gb3B0aW9uWzBdLiRlbCA6IG9wdGlvbi4kZWw7CgogICAgICAgIGlmICh0aGlzLiRyZWZzLnBvcHBlciAmJiB0YXJnZXQpIHsKICAgICAgICAgIHZhciBtZW51ID0gdGhpcy4kcmVmcy5wb3BwZXIuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAnKTsKICAgICAgICAgIHNjcm9sbF9pbnRvX3ZpZXdfZGVmYXVsdCgpKG1lbnUsIHRhcmdldCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRyZWZzLnNjcm9sbGJhciAmJiB0aGlzLiRyZWZzLnNjcm9sbGJhci5oYW5kbGVTY3JvbGwoKTsKICAgICAgfSwKICAgICAgaGFuZGxlTWVudUVudGVyOiBmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKSB7CiAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CgogICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBfdGhpczcuc2Nyb2xsVG9PcHRpb24oX3RoaXM3LnNlbGVjdGVkKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgZW1pdENoYW5nZTogZnVuY3Rpb24gZW1pdENoYW5nZSh2YWwpIHsKICAgICAgICBpZiAoIU9iamVjdCh1dGlsX1sidmFsdWVFcXVhbHMiXSkodGhpcy52YWx1ZSwgdmFsKSkgewogICAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdldE9wdGlvbjogZnVuY3Rpb24gZ2V0T3B0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIG9wdGlvbiA9IHZvaWQgMDsKICAgICAgICB2YXIgaXNPYmplY3QgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IG9iamVjdF0nOwogICAgICAgIHZhciBpc051bGwgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IG51bGxdJzsKICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IHVuZGVmaW5lZF0nOwoKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5jYWNoZWRPcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgY2FjaGVkT3B0aW9uID0gdGhpcy5jYWNoZWRPcHRpb25zW2ldOwogICAgICAgICAgdmFyIGlzRXF1YWwgPSBpc09iamVjdCA/IE9iamVjdCh1dGlsX1siZ2V0VmFsdWVCeVBhdGgiXSkoY2FjaGVkT3B0aW9uLnZhbHVlLCB0aGlzLnZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKSh2YWx1ZSwgdGhpcy52YWx1ZUtleSkgOiBjYWNoZWRPcHRpb24udmFsdWUgPT09IHZhbHVlOwoKICAgICAgICAgIGlmIChpc0VxdWFsKSB7CiAgICAgICAgICAgIG9wdGlvbiA9IGNhY2hlZE9wdGlvbjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9uKSByZXR1cm4gb3B0aW9uOwogICAgICAgIHZhciBsYWJlbCA9ICFpc09iamVjdCAmJiAhaXNOdWxsICYmICFpc1VuZGVmaW5lZCA/IHZhbHVlIDogJyc7CiAgICAgICAgdmFyIG5ld09wdGlvbiA9IHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGN1cnJlbnRMYWJlbDogbGFiZWwKICAgICAgICB9OwoKICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgbmV3T3B0aW9uLmhpdFN0YXRlID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3T3B0aW9uOwogICAgICB9LAogICAgICBzZXRTZWxlY3RlZDogZnVuY3Rpb24gc2V0U2VsZWN0ZWQoKSB7CiAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CgogICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uKHRoaXMudmFsdWUpOwoKICAgICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkgewogICAgICAgICAgICB0aGlzLmNyZWF0ZWRMYWJlbCA9IG9wdGlvbi5jdXJyZW50TGFiZWw7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlZFNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlZFNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gb3B0aW9uLmN1cnJlbnRMYWJlbDsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBvcHRpb247CiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlKSB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWxlY3RlZExhYmVsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwoKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkgewogICAgICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXN1bHQucHVzaChfdGhpczguZ2V0T3B0aW9uKHZhbHVlKSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSByZXN1bHQ7CiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM4LnJlc2V0SW5wdXRIZWlnaHQoKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgaGFuZGxlRm9jdXM6IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLnNvZnRGb2N1cykgewogICAgICAgICAgaWYgKHRoaXMuYXV0b21hdGljRHJvcGRvd24gfHwgdGhpcy5maWx0ZXJhYmxlKSB7CiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7CgogICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgdGhpcy5tZW51VmlzaWJsZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy4kZW1pdCgnZm9jdXMnLCBldmVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc29mdEZvY3VzID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9LAogICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkgewogICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICAgIHRoaXMuJHJlZnMucmVmZXJlbmNlLmJsdXIoKTsKICAgICAgfSwKICAgICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkgewogICAgICAgIHZhciBfdGhpczkgPSB0aGlzOwoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmIChfdGhpczkuaXNTaWxlbnRCbHVyKSB7CiAgICAgICAgICAgIF90aGlzOS5pc1NpbGVudEJsdXIgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF90aGlzOS4kZW1pdCgnYmx1cicsIGV2ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9LCA1MCk7CiAgICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSBmYWxzZTsKICAgICAgfSwKICAgICAgaGFuZGxlQ2xlYXJDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xlYXJDbGljayhldmVudCkgewogICAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWQoZXZlbnQpOwogICAgICB9LAogICAgICBkb0Rlc3Ryb3k6IGZ1bmN0aW9uIGRvRGVzdHJveSgpIHsKICAgICAgICB0aGlzLiRyZWZzLnBvcHBlciAmJiB0aGlzLiRyZWZzLnBvcHBlci5kb0Rlc3Ryb3koKTsKICAgICAgfSwKICAgICAgaGFuZGxlQ2xvc2U6IGZ1bmN0aW9uIGhhbmRsZUNsb3NlKCkgewogICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICB9LAogICAgICB0b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGU6IGZ1bmN0aW9uIHRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZShoaXQpIHsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpIHJldHVybjsKICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdOwogICAgICAgIGlmICghb3B0aW9uKSByZXR1cm47CgogICAgICAgIGlmIChoaXQgPT09IHRydWUgfHwgaGl0ID09PSBmYWxzZSkgewogICAgICAgICAgb3B0aW9uLmhpdFN0YXRlID0gaGl0OwogICAgICAgICAgcmV0dXJuIGhpdDsKICAgICAgICB9CgogICAgICAgIG9wdGlvbi5oaXRTdGF0ZSA9ICFvcHRpb24uaGl0U3RhdGU7CiAgICAgICAgcmV0dXJuIG9wdGlvbi5oaXRTdGF0ZTsKICAgICAgfSwKICAgICAgZGVsZXRlUHJldlRhZzogZnVuY3Rpb24gZGVsZXRlUHJldlRhZyhlKSB7CiAgICAgICAgaWYgKGUudGFyZ2V0LnZhbHVlLmxlbmd0aCA8PSAwICYmICF0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZSgpKSB7CiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlLnNsaWNlKCk7CiAgICAgICAgICB2YWx1ZS5wb3AoKTsKICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpOwogICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1hbmFnZVBsYWNlaG9sZGVyOiBmdW5jdGlvbiBtYW5hZ2VQbGFjZWhvbGRlcigpIHsKICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgIT09ICcnKSB7CiAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuJHJlZnMuaW5wdXQudmFsdWUgPyAnJyA6IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNldElucHV0U3RhdGU6IGZ1bmN0aW9uIHJlc2V0SW5wdXRTdGF0ZShlKSB7CiAgICAgICAgaWYgKGUua2V5Q29kZSAhPT0gOCkgdGhpcy50b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoZmFsc2UpOwogICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSB0aGlzLiRyZWZzLmlucHV0LnZhbHVlLmxlbmd0aCAqIDE1ICsgMjA7CiAgICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7CiAgICAgIH0sCiAgICAgIHJlc2V0SW5wdXRIZWlnaHQ6IGZ1bmN0aW9uIHJlc2V0SW5wdXRIZWlnaHQoKSB7CiAgICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwoKICAgICAgICBpZiAodGhpcy5jb2xsYXBzZVRhZ3MgJiYgIXRoaXMuZmlsdGVyYWJsZSkgcmV0dXJuOwogICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICghX3RoaXMxMC4kcmVmcy5yZWZlcmVuY2UpIHJldHVybjsKICAgICAgICAgIHZhciBpbnB1dENoaWxkTm9kZXMgPSBfdGhpczEwLiRyZWZzLnJlZmVyZW5jZS4kZWwuY2hpbGROb2RlczsKICAgICAgICAgIHZhciBpbnB1dCA9IFtdLmZpbHRlci5jYWxsKGlucHV0Q2hpbGROb2RlcywgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0udGFnTmFtZSA9PT0gJ0lOUFVUJzsKICAgICAgICAgIH0pWzBdOwogICAgICAgICAgdmFyIHRhZ3MgPSBfdGhpczEwLiRyZWZzLnRhZ3M7CiAgICAgICAgICB2YXIgc2l6ZUluTWFwID0gX3RoaXMxMC5pbml0aWFsSW5wdXRIZWlnaHQgfHwgNDA7CiAgICAgICAgICBpbnB1dC5zdHlsZS5oZWlnaHQgPSBfdGhpczEwLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/IHNpemVJbk1hcCArICdweCcgOiBNYXRoLm1heCh0YWdzID8gdGFncy5jbGllbnRIZWlnaHQgKyAodGFncy5jbGllbnRIZWlnaHQgPiBzaXplSW5NYXAgPyA2IDogMCkgOiAwLCBzaXplSW5NYXApICsgJ3B4JzsKCiAgICAgICAgICBpZiAoX3RoaXMxMC52aXNpYmxlICYmIF90aGlzMTAuZW1wdHlUZXh0ICE9PSBmYWxzZSkgewogICAgICAgICAgICBfdGhpczEwLmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgICAgcmVzZXRIb3ZlckluZGV4OiBmdW5jdGlvbiByZXNldEhvdmVySW5kZXgoKSB7CiAgICAgICAgdmFyIF90aGlzMTEgPSB0aGlzOwoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGlmICghX3RoaXMxMS5tdWx0aXBsZSkgewogICAgICAgICAgICBfdGhpczExLmhvdmVySW5kZXggPSBfdGhpczExLm9wdGlvbnMuaW5kZXhPZihfdGhpczExLnNlbGVjdGVkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChfdGhpczExLnNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBfdGhpczExLmhvdmVySW5kZXggPSBNYXRoLm1pbi5hcHBseShudWxsLCBfdGhpczExLnNlbGVjdGVkLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMTEub3B0aW9ucy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpczExLmhvdmVySW5kZXggPSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIDMwMCk7CiAgICAgIH0sCiAgICAgIGhhbmRsZU9wdGlvblNlbGVjdDogZnVuY3Rpb24gaGFuZGxlT3B0aW9uU2VsZWN0KG9wdGlvbiwgYnlDbGljaykgewogICAgICAgIHZhciBfdGhpczEyID0gdGhpczsKCiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHsKICAgICAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5zbGljZSgpOwogICAgICAgICAgdmFyIG9wdGlvbkluZGV4ID0gdGhpcy5nZXRWYWx1ZUluZGV4KHZhbHVlLCBvcHRpb24udmFsdWUpOwoKICAgICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xKSB7CiAgICAgICAgICAgIHZhbHVlLnNwbGljZShvcHRpb25JbmRleCwgMSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGlwbGVMaW1pdCA8PSAwIHx8IHZhbHVlLmxlbmd0aCA8IHRoaXMubXVsdGlwbGVMaW1pdCkgewogICAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7CiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UodmFsdWUpOwoKICAgICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkgewogICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcnlDaGFuZ2UoJycpOwogICAgICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gMjA7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIG9wdGlvbi52YWx1ZSk7CiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2Uob3B0aW9uLnZhbHVlKTsKICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5pc1NpbGVudEJsdXIgPSBieUNsaWNrOwogICAgICAgIHRoaXMuc2V0U29mdEZvY3VzKCk7CiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkgcmV0dXJuOwogICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzMTIuc2Nyb2xsVG9PcHRpb24ob3B0aW9uKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgc2V0U29mdEZvY3VzOiBmdW5jdGlvbiBzZXRTb2Z0Rm9jdXMoKSB7CiAgICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSB0cnVlOwogICAgICAgIHZhciBpbnB1dCA9IHRoaXMuJHJlZnMuaW5wdXQgfHwgdGhpcy4kcmVmcy5yZWZlcmVuY2U7CgogICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgaW5wdXQuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdldFZhbHVlSW5kZXg6IGZ1bmN0aW9uIGdldFZhbHVlSW5kZXgoKSB7CiAgICAgICAgdmFyIGFyciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzFdOwogICAgICAgIHZhciBpc09iamVjdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3Qgb2JqZWN0XSc7CgogICAgICAgIGlmICghaXNPYmplY3QpIHsKICAgICAgICAgIHJldHVybiBhcnIuaW5kZXhPZih2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMudmFsdWVLZXk7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMTsKICAgICAgICAgIGFyci5zb21lKGZ1bmN0aW9uIChpdGVtLCBpKSB7CiAgICAgICAgICAgIGlmIChPYmplY3QodXRpbF9bImdldFZhbHVlQnlQYXRoIl0pKGl0ZW0sIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKSh2YWx1ZSwgdmFsdWVLZXkpKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRvZ2dsZU1lbnU6IGZ1bmN0aW9uIHRvZ2dsZU1lbnUoKSB7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdERpc2FibGVkKSB7CiAgICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZU9uRm9jdXMpIHsKICAgICAgICAgICAgdGhpcy5tZW51VmlzaWJsZU9uRm9jdXMgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkgewogICAgICAgICAgICAodGhpcy4kcmVmcy5pbnB1dCB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZSkuZm9jdXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNlbGVjdE9wdGlvbjogZnVuY3Rpb24gc2VsZWN0T3B0aW9uKCkgewogICAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7CiAgICAgICAgICB0aGlzLnRvZ2dsZU1lbnUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKSB7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3B0aW9uU2VsZWN0KHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlbGV0ZVNlbGVjdGVkOiBmdW5jdGlvbiBkZWxldGVTZWxlY3RlZChldmVudCkgewogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMubXVsdGlwbGUgPyBbXSA6ICcnOwogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpOwogICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7CiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgdGhpcy4kZW1pdCgnY2xlYXInKTsKICAgICAgfSwKICAgICAgZGVsZXRlVGFnOiBmdW5jdGlvbiBkZWxldGVUYWcoZXZlbnQsIHRhZykgewogICAgICAgIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0ZWQuaW5kZXhPZih0YWcpOwoKICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiAhdGhpcy5zZWxlY3REaXNhYmxlZCkgewogICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZS5zbGljZSgpOwogICAgICAgICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpOwogICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKHZhbHVlKTsKICAgICAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZS10YWcnLCB0YWcudmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0sCiAgICAgIG9uSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uIG9uSW5wdXRDaGFuZ2UoKSB7CiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLnF1ZXJ5ICE9PSB0aGlzLnNlbGVjdGVkTGFiZWwpIHsKICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkTGFiZWw7CiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgb25PcHRpb25EZXN0cm95OiBmdW5jdGlvbiBvbk9wdGlvbkRlc3Ryb3koaW5kZXgpIHsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgdGhpcy5vcHRpb25zQ291bnQtLTsKICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQtLTsKICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVzZXRJbnB1dFdpZHRoOiBmdW5jdGlvbiByZXNldElucHV0V2lkdGgoKSB7CiAgICAgICAgdGhpcy5pbnB1dFdpZHRoID0gdGhpcy4kcmVmcy5yZWZlcmVuY2UuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOwogICAgICB9LAogICAgICBoYW5kbGVSZXNpemU6IGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZSgpIHsKICAgICAgICB0aGlzLnJlc2V0SW5wdXRXaWR0aCgpOwogICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKTsKICAgICAgfSwKICAgICAgY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb246IGZ1bmN0aW9uIGNoZWNrRGVmYXVsdEZpcnN0T3B0aW9uKCkgewogICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IC0xOyAvLyBoaWdobGlnaHQgdGhlIGNyZWF0ZWQgb3B0aW9uCgogICAgICAgIHZhciBoYXNDcmVhdGVkID0gZmFsc2U7CgogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uY3JlYXRlZCkgewogICAgICAgICAgICBoYXNDcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaGFzQ3JlYXRlZCkgcmV0dXJuOwoKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pICE9PSB0aGlzLm9wdGlvbnMubGVuZ3RoOyArK19pKSB7CiAgICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zW19pXTsKCiAgICAgICAgICBpZiAodGhpcy5xdWVyeSkgewogICAgICAgICAgICAvLyBoaWdobGlnaHQgZmlyc3Qgb3B0aW9ucyB0aGF0IHBhc3NlcyB0aGUgZmlsdGVyCiAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24uZ3JvdXBEaXNhYmxlZCAmJiBvcHRpb24udmlzaWJsZSkgewogICAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBoaWdobGlnaHQgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbgogICAgICAgICAgICBpZiAob3B0aW9uLml0ZW1TZWxlY3RlZCkgewogICAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBnZXRWYWx1ZUtleTogZnVuY3Rpb24gZ2V0VmFsdWVLZXkoaXRlbSkgewogICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbS52YWx1ZSkudG9Mb3dlckNhc2UoKSAhPT0gJ1tvYmplY3Qgb2JqZWN0XScpIHsKICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfWyJnZXRWYWx1ZUJ5UGF0aCJdKShpdGVtLnZhbHVlLCB0aGlzLnZhbHVlS2V5KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7CgogICAgICB0aGlzLmNhY2hlZFBsYWNlSG9sZGVyID0gdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyOwoKICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHsKICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIFtdKTsKICAgICAgfQoKICAgICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHsKICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsICcnKTsKICAgICAgfQoKICAgICAgdGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIGZ1bmN0aW9uICgpIHsKICAgICAgICBfdGhpczEzLm9uSW5wdXRDaGFuZ2UoKTsKICAgICAgfSk7CiAgICAgIHRoaXMuZGVib3VuY2VkUXVlcnlDaGFuZ2UgPSBkZWJvdW5jZV9kZWZhdWx0KCkodGhpcy5kZWJvdW5jZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICBfdGhpczEzLmhhbmRsZVF1ZXJ5Q2hhbmdlKGUudGFyZ2V0LnZhbHVlKTsKICAgICAgfSk7CiAgICAgIHRoaXMuJG9uKCdoYW5kbGVPcHRpb25DbGljaycsIHRoaXMuaGFuZGxlT3B0aW9uU2VsZWN0KTsKICAgICAgdGhpcy4kb24oJ3NldFNlbGVjdGVkJywgdGhpcy5zZXRTZWxlY3RlZCk7CiAgICB9LAogICAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgICAgdmFyIF90aGlzMTQgPSB0aGlzOwoKICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9ICcnOwogICAgICB9CgogICAgICBPYmplY3QocmVzaXplX2V2ZW50X1siYWRkUmVzaXplTGlzdGVuZXIiXSkodGhpcy4kZWwsIHRoaXMuaGFuZGxlUmVzaXplKTsKICAgICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMuJHJlZnMucmVmZXJlbmNlOwoKICAgICAgaWYgKHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuJGVsKSB7CiAgICAgICAgdmFyIHNpemVNYXAgPSB7CiAgICAgICAgICBtZWRpdW06IDM2LAogICAgICAgICAgc21hbGw6IDMyLAogICAgICAgICAgbWluaTogMjgKICAgICAgICB9OwogICAgICAgIHZhciBpbnB1dCA9IHJlZmVyZW5jZS4kZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTsKICAgICAgICB0aGlzLmluaXRpYWxJbnB1dEhlaWdodCA9IGlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCB8fCBzaXplTWFwW3RoaXMuc2VsZWN0U2l6ZV07CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLnJlbW90ZSAmJiB0aGlzLm11bHRpcGxlKSB7CiAgICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7CiAgICAgIH0KCiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAocmVmZXJlbmNlICYmIHJlZmVyZW5jZS4kZWwpIHsKICAgICAgICAgIF90aGlzMTQuaW5wdXRXaWR0aCA9IHJlZmVyZW5jZS4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zZXRTZWxlY3RlZCgpOwogICAgfSwKICAgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7CiAgICAgIGlmICh0aGlzLiRlbCAmJiB0aGlzLmhhbmRsZVJlc2l6ZSkgT2JqZWN0KHJlc2l6ZV9ldmVudF9bInJlbW92ZVJlc2l6ZUxpc3RlbmVyIl0pKHRoaXMuJGVsLCB0aGlzLmhhbmRsZVJlc2l6ZSk7CiAgICB9CiAgfTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCgogIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCiAgdmFyIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSBzZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc187IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlCgogIC8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi8KCiAgdmFyIHNlbGVjdF9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplclsiYSIKICAvKiBkZWZhdWx0ICovCiAgXSkoc3JjX3NlbGVjdHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXywgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKTsKICAvKiBob3QgcmVsb2FkICovCgogIGlmIChmYWxzZSkgewogICAgdmFyIHNlbGVjdF9hcGk7CiAgfQoKICBzZWxlY3RfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gInBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZSI7CiAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKICB2YXIgc3JjX3NlbGVjdCA9IHNlbGVjdF9jb21wb25lbnQuZXhwb3J0czsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3QvaW5kZXguanMKCiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCiAgc3JjX3NlbGVjdC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkgewogICAgVnVlLmNvbXBvbmVudChzcmNfc2VsZWN0Lm5hbWUsIHNyY19zZWxlY3QpOwogIH07CiAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKCiAgdmFyIHBhY2thZ2VzX3NlbGVjdCA9IF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IHNyY19zZWxlY3Q7CiAgLyoqKi8KfQovKioqKioqLwpdKTs="},null]}
|