project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
178 KiB

{"remainingRequest":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js!F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\eslint-loader\\index.js??ref--13-0!F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\src\\views\\dashboard\\mixins\\echarts-wordcloud.js","dependencies":[{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\src\\views\\dashboard\\mixins\\echarts-wordcloud.js","mtime":1634007167328},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:dmFyIF90eXBlb2YgPSByZXF1aXJlKCJGOi93b3Jrc3BhY2UvZ2N5L1JLLWh0bWwvUkstcHJvamVjdC9ydW95aS11aS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YiKS5kZWZhdWx0OwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbGwuanMiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnLmpzIik7CgooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgewogIGlmICgodHlwZW9mIGV4cG9ydHMgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKGV4cG9ydHMpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBtb2R1bGUgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAnb2JqZWN0JykgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoImVjaGFydHMiKSk7ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoWyJlY2hhcnRzIl0sIGZhY3RvcnkpO2Vsc2UgaWYgKCh0eXBlb2YgZXhwb3J0cyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoZXhwb3J0cykpID09PSAnb2JqZWN0JykgZXhwb3J0c1siZWNoYXJ0cy13b3JkY2xvdWQiXSA9IGZhY3RvcnkocmVxdWlyZSgiZWNoYXJ0cyIpKTtlbHNlIHJvb3RbImVjaGFydHMtd29yZGNsb3VkIl0gPSBmYWN0b3J5KHJvb3RbImVjaGFydHMiXSk7Cn0pKHNlbGYsIGZ1bmN0aW9uIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2VjaGFydHNfbGliX2VjaGFydHNfXykgewogIHJldHVybiAoCiAgICAvKioqKioqLwogICAgZnVuY3Rpb24gKCkgewogICAgICAvLyB3ZWJwYWNrQm9vdHN0cmFwCgogICAgICAvKioqKioqLwogICAgICAidXNlIHN0cmljdCI7CiAgICAgIC8qKioqKiovCgogICAgICB2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9IHsKICAgICAgICAvKioqLwogICAgICAgICIuL2luZGV4LmpzIjoKICAgICAgICAvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAgICAgICAgICEqKiogLi9pbmRleC5qcyArIDQgbW9kdWxlcyAqKiohCiAgICAgICAgICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAvKioqLwogICAgICAgIGZ1bmN0aW9uIGluZGV4SnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAgIC8vIEVTTSBDT01QQVQgRkxBRwogICAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlY2hhcnRzIgoKCiAgICAgICAgICB2YXIgZXh0ZXJuYWxfZWNoYXJ0c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCJlY2hhcnRzL2xpYi9lY2hhcnRzIik7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL1dvcmRDbG91ZFNlcmllcy5qcwoKCiAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5leHRlbmRTZXJpZXNNb2RlbCh7CiAgICAgICAgICAgIHR5cGU6ICdzZXJpZXMud29yZENsb3VkJywKICAgICAgICAgICAgdmlzdWFsU3R5bGVBY2Nlc3NQYXRoOiAndGV4dFN0eWxlJywKICAgICAgICAgICAgdmlzdWFsU3R5bGVNYXBwZXI6IGZ1bmN0aW9uIHZpc3VhbFN0eWxlTWFwcGVyKG1vZGVsKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGZpbGw6IG1vZGVsLmdldCgnY29sb3InKQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpc3VhbERyYXdUeXBlOiAnZmlsbCcsCiAgICAgICAgICAgIG9wdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIG9wdGlvblVwZGF0ZWQoKSB7CiAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uOwogICAgICAgICAgICAgIG9wdGlvbi5ncmlkU2l6ZSA9IE1hdGgubWF4KE1hdGguZmxvb3Iob3B0aW9uLmdyaWRTaXplKSwgNCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldEluaXRpYWxEYXRhOiBmdW5jdGlvbiBnZXRJbml0aWFsRGF0YShvcHRpb24sIGVjTW9kZWwpIHsKICAgICAgICAgICAgICB2YXIgZGltZW5zaW9ucyA9IGV4dGVybmFsX2VjaGFydHNfLmhlbHBlci5jcmVhdGVEaW1lbnNpb25zKG9wdGlvbi5kYXRhLCB7CiAgICAgICAgICAgICAgICBjb29yZERpbWVuc2lvbnM6IFsndmFsdWUnXQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IGV4dGVybmFsX2VjaGFydHNfLkxpc3QoZGltZW5zaW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgbGlzdC5pbml0RGF0YShvcHRpb24uZGF0YSk7CiAgICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIE1vc3Qgb2Ygb3B0aW9ucyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdGltZHJlYW0vd29yZGNsb3VkMi5qcy9ibG9iL2doLXBhZ2VzL0FQSS5tZAogICAgICAgICAgICBkZWZhdWx0T3B0aW9uOiB7CiAgICAgICAgICAgICAgbWFza0ltYWdlOiBudWxsLAogICAgICAgICAgICAgIC8vIFNoYXBlIGNhbiBiZSAnY2lyY2xlJywgJ2NhcmRpb2lkJywgJ2RpYW1vbmQnLCAndHJpYW5nbGUtZm9yd2FyZCcsICd0cmlhbmdsZScsICdwZW50YWdvbicsICdzdGFyJwogICAgICAgICAgICAgIHNoYXBlOiAnY2lyY2xlJywKICAgICAgICAgICAgICBsZWZ0OiAnY2VudGVyJywKICAgICAgICAgICAgICB0b3A6ICdjZW50ZXInLAogICAgICAgICAgICAgIHdpZHRoOiAnNzAlJywKICAgICAgICAgICAgICBoZWlnaHQ6ICc4MCUnLAogICAgICAgICAgICAgIHNpemVSYW5nZTogWzEyLCA2MF0sCiAgICAgICAgICAgICAgcm90YXRpb25SYW5nZTogWy05MCwgOTBdLAogICAgICAgICAgICAgIHJvdGF0aW9uU3RlcDogNDUsCiAgICAgICAgICAgICAgZ3JpZFNpemU6IDgsCiAgICAgICAgICAgICAgZHJhd091dE9mQm91bmQ6IGZhbHNlLAogICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9Xb3JkQ2xvdWRWaWV3LmpzCgogICAgICAgICAgZXh0ZXJuYWxfZWNoYXJ0c18uZXh0ZW5kQ2hhcnRWaWV3KHsKICAgICAgICAgICAgdHlwZTogJ3dvcmRDbG91ZCcsCiAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKHNlcmllc01vZGVsLCBlY01vZGVsLCBhcGkpIHsKICAgICAgICAgICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3VwOwogICAgICAgICAgICAgIGdyb3VwLnJlbW92ZUFsbCgpOwogICAgICAgICAgICAgIHZhciBkYXRhID0gc2VyaWVzTW9kZWwuZ2V0RGF0YSgpOwogICAgICAgICAgICAgIHZhciBncmlkU2l6ZSA9IHNlcmllc01vZGVsLmdldCgnZ3JpZFNpemUnKTsKCiAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2Uub25kcmF3ID0gZnVuY3Rpb24gKHRleHQsIHNpemUsIGRhdGFJZHgsIGRyYXduKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbU1vZGVsID0gZGF0YS5nZXRJdGVtTW9kZWwoZGF0YUlkeCk7CiAgICAgICAgICAgICAgICB2YXIgdGV4dFN0eWxlTW9kZWwgPSBpdGVtTW9kZWwuZ2V0TW9kZWwoJ3RleHRTdHlsZScpOwogICAgICAgICAgICAgICAgdmFyIHRleHRFbCA9IG5ldyBleHRlcm5hbF9lY2hhcnRzXy5ncmFwaGljLlRleHQoewogICAgICAgICAgICAgICAgICBzdHlsZTogZXh0ZXJuYWxfZWNoYXJ0c18uaGVscGVyLmNyZWF0ZVRleHRTdHlsZSh0ZXh0U3R5bGVNb2RlbCksCiAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSAvIGRyYXduLmluZm8ubXUsCiAgICAgICAgICAgICAgICAgIHNjYWxlWTogMSAvIGRyYXduLmluZm8ubXUsCiAgICAgICAgICAgICAgICAgIHg6IChkcmF3bi5neCArIGRyYXduLmluZm8uZ3cgLyAyKSAqIGdyaWRTaXplLAogICAgICAgICAgICAgICAgICB5OiAoZHJhd24uZ3kgKyBkcmF3bi5pbmZvLmdoIC8gMikgKiBncmlkU2l6ZSwKICAgICAgICAgICAgICAgICAgcm90YXRpb246IGRyYXduLnJvdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0U3R5bGUoewogICAgICAgICAgICAgICAgICB4OiBkcmF3bi5pbmZvLmZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICAgICAgICAgICAgeTogZHJhd24uaW5mby5maWxsVGV4dE9mZnNldFkgKyBzaXplICogMC41LAogICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJywKICAgICAgICAgICAgICAgICAgZmlsbDogZGF0YS5nZXRJdGVtVmlzdWFsKGRhdGFJZHgsICdzdHlsZScpLmZpbGwsCiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBzaXplCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdyb3VwLmFkZCh0ZXh0RWwpOwogICAgICAgICAgICAgICAgZGF0YS5zZXRJdGVtR3JhcGhpY0VsKGRhdGFJZHgsIHRleHRFbCk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuZW5zdXJlU3RhdGUoJ2VtcGhhc2lzJykuc3R5bGUgPSBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuY3JlYXRlVGV4dFN0eWxlKGl0ZW1Nb2RlbC5nZXRNb2RlbChbJ2VtcGhhc2lzJywgJ3RleHRTdHlsZSddKSwgewogICAgICAgICAgICAgICAgICBzdGF0ZTogJ2VtcGhhc2lzJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuZW5zdXJlU3RhdGUoJ2JsdXInKS5zdHlsZSA9IGV4dGVybmFsX2VjaGFydHNfLmhlbHBlci5jcmVhdGVUZXh0U3R5bGUoaXRlbU1vZGVsLmdldE1vZGVsKFsnYmx1cicsICd0ZXh0U3R5bGUnXSksIHsKICAgICAgICAgICAgICAgICAgc3RhdGU6ICdibHVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuZW5hYmxlSG92ZXJFbXBoYXNpcyh0ZXh0RWwsIGl0ZW1Nb2RlbC5nZXQoWydlbXBoYXNpcycsICdmb2N1cyddKSwgaXRlbU1vZGVsLmdldChbJ2VtcGhhc2lzJywgJ2JsdXJTY29wZSddKSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuc3RhdGVUcmFuc2l0aW9uID0gewogICAgICAgICAgICAgICAgICBkdXJhdGlvbjogc2VyaWVzTW9kZWwuZ2V0KCdhbmltYXRpb24nKSA/IHNlcmllc01vZGVsLmdldChbJ3N0YXRlQW5pbWF0aW9uJywgJ2R1cmF0aW9uJ10pIDogMCwKICAgICAgICAgICAgICAgICAgZWFzaW5nOiBzZXJpZXNNb2RlbC5nZXQoWydzdGF0ZUFuaW1hdGlvbicsICdlYXNpbmcnXSkKICAgICAgICAgICAgICAgIH07IC8vIFRPRE8KCiAgICAgICAgICAgICAgICB0ZXh0RWwuX19oaWdoRG93bkRpc3BhdGNoZXIgPSB0cnVlOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHRoaXMuX21vZGVsID0gc2VyaWVzTW9kZWw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICAgICAgICAgIHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7CgogICAgICAgICAgICAgIHRoaXMuX21vZGVsLmxheW91dEluc3RhbmNlLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlzcG9zZTogZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgICAgICAgICAgICB0aGlzLl9tb2RlbC5sYXlvdXRJbnN0YW5jZS5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9sYXlvdXQuanMKCiAgICAgICAgICAvKiEKICAgICAgICAgICAqIHdvcmRjbG91ZDIuanMKICAgICAgICAgICAqIGh0dHA6Ly90aW1kcmVhbS5vcmcvd29yZGNsb3VkMi5qcy8KICAgICAgICAgICAqCiAgICAgICAgICAgKiBDb3B5cmlnaHQgMjAxMSAtIDIwMTMgVGltIENoaWVuCiAgICAgICAgICAgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICAgICAgICAgICAqLwogICAgICAgICAgLy8gc2V0SW1tZWRpYXRlCgogICAgICAgICAgaWYgKCF3aW5kb3cuc2V0SW1tZWRpYXRlKSB7CiAgICAgICAgICAgIHdpbmRvdy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiBzZXR1cFNldEltbWVkaWF0ZSgpIHsKICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm1zU2V0SW1tZWRpYXRlIHx8IHdpbmRvdy53ZWJraXRTZXRJbW1lZGlhdGUgfHwgd2luZG93Lm1velNldEltbWVkaWF0ZSB8fCB3aW5kb3cub1NldEltbWVkaWF0ZSB8fCBmdW5jdGlvbiBzZXR1cFNldFplcm9UaW1lb3V0KCkgewogICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cucG9zdE1lc3NhZ2UgfHwgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBbdW5kZWZpbmVkXTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ3plcm8tdGltZW91dC1tZXNzYWdlJzsgLy8gTGlrZSBzZXRUaW1lb3V0LCBidXQgb25seSB0YWtlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LiAgVGhlcmUncwogICAgICAgICAgICAgICAgLy8gbm8gdGltZSBhcmd1bWVudCAoYWx3YXlzIHplcm8pIGFuZCBubyBhcmd1bWVudHMgKHlvdSBoYXZlIHRvCiAgICAgICAgICAgICAgICAvLyB1c2UgYSBjbG9zdXJlKS4KCiAgICAgICAgICAgICAgICB2YXIgc2V0WmVyb1RpbWVvdXQgPSBmdW5jdGlvbiBzZXRaZXJvVGltZW91dChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSBjYWxsYmFja3MubGVuZ3RoOwogICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlICsgaWQudG9TdHJpbmcoMzYpLCAnKicpOwogICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gc2V0WmVyb1RpbWVvdXRNZXNzYWdlKGV2dCkgewogICAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBjaGVja2luZyBldmVudCBzb3VyY2UsIHJldGFyZGVkIElFIGNvbmZ1c2VkIHRoaXMgd2luZG93CiAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCB3aXRoIGFub3RoZXIgaW4gdGhlIHByZXNlbmNlIG9mIGlmcmFtZQogICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2dC5kYXRhICE9PSAnc3RyaW5nJyB8fCBldnQuZGF0YS5zdWJzdHIoMCwgbWVzc2FnZS5sZW5ndGgpICE9PSBtZXNzYWdlCiAgICAgICAgICAgICAgICAgIC8qIHx8CiAgICAgICAgICAgICAgICAgIGV2dC5zb3VyY2UgIT09IHdpbmRvdyAqLwogICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcGFyc2VJbnQoZXZ0LmRhdGEuc3Vic3RyKG1lc3NhZ2UubGVuZ3RoKSwgMzYpOwoKICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFja3NbaWRdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaWRdKCk7CiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgICAgIC8qIHNwZWNpZnkgY2xlYXJJbW1lZGlhdGUoKSBoZXJlIHNpbmNlIHdlIG5lZWQgdGhlIHNjb3BlICovCgogICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJaZXJvVGltZW91dChpZCkgewogICAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrc1tpZF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBzZXRaZXJvVGltZW91dDsKICAgICAgICAgICAgICB9KCkgfHwgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGVGYWxsYmFjayhmbikgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZm4sIDApOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIXdpbmRvdy5jbGVhckltbWVkaWF0ZSkgewogICAgICAgICAgICB3aW5kb3cuY2xlYXJJbW1lZGlhdGUgPSBmdW5jdGlvbiBzZXR1cENsZWFySW1tZWRpYXRlKCkgewogICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubXNDbGVhckltbWVkaWF0ZSB8fCB3aW5kb3cud2Via2l0Q2xlYXJJbW1lZGlhdGUgfHwgd2luZG93Lm1vekNsZWFySW1tZWRpYXRlIHx8IHdpbmRvdy5vQ2xlYXJJbW1lZGlhdGUgfHwgLy8gImNsZWFyWmVyb1RpbWVvdXQiIGlzIGltcGxlbWVudCBvbiB0aGUgcHJldmlvdXMgYmxvY2sgfHwKICAgICAgICAgICAgICAvLyBmYWxsYmFjawogICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlRmFsbGJhY2sodGltZXIpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgIH0gLy8gQ2hlY2sgaWYgV29yZENsb3VkIGNhbiBydW4gb24gdGhpcyBicm93c2VyCgoKICAgICAgICAgIHZhciBpc1N1cHBvcnRlZCA9IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkgewogICAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CgogICAgICAgICAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLmdldENvbnRleHQpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCiAgICAgICAgICAgIGlmICghY3R4LmdldEltYWdlRGF0YSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjdHguZmlsbFRleHQpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQXJyYXkucHJvdG90eXBlLnNvbWUpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQXJyYXkucHJvdG90eXBlLnB1c2gpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSgpOyAvLyBGaW5kIG91dCBpZiB0aGUgYnJvd3NlciBpbXBvc2UgbWluaXVtIGZvbnQgc2l6ZSBieQogICAgICAgICAgLy8gZHJhd2luZyBzbWFsbCB0ZXh0cyBvbiBhIGNhbnZhcyBhbmQgbWVhc3VyZSBpdCdzIHdpZHRoLgoKCiAgICAgICAgICB2YXIgbWluRm9udFNpemUgPSBmdW5jdGlvbiBnZXRNaW5Gb250U2l6ZSgpIHsKICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7IC8vIHN0YXJ0IGZyb20gMjAKCiAgICAgICAgICAgIHZhciBzaXplID0gMjA7IC8vIHR3byBzaXplcyB0byBtZWFzdXJlCgogICAgICAgICAgICB2YXIgaGFuV2lkdGgsIG1XaWR0aDsKCiAgICAgICAgICAgIHdoaWxlIChzaXplKSB7CiAgICAgICAgICAgICAgY3R4LmZvbnQgPSBzaXplLnRvU3RyaW5nKDEwKSArICdweCBzYW5zLXNlcmlmJzsKCiAgICAgICAgICAgICAgaWYgKGN0eC5tZWFzdXJlVGV4dCgiXHVGRjM3Iikud2lkdGggPT09IGhhbldpZHRoICYmIGN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoID09PSBtV2lkdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzaXplICsgMTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGhhbldpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KCJcdUZGMzciKS53aWR0aDsKICAgICAgICAgICAgICBtV2lkdGggPSBjdHgubWVhc3VyZVRleHQoJ20nKS53aWR0aDsKICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfSgpOyAvLyBCYXNlZCBvbiBodHRwOi8vanNmcm9taGVsbC5jb20vYXJyYXkvc2h1ZmZsZQoKCiAgICAgICAgICB2YXIgc2h1ZmZsZUFycmF5ID0gZnVuY3Rpb24gc2h1ZmZsZUFycmF5KGFycikgewogICAgICAgICAgICBmb3IgKHZhciBqLCB4LCBpID0gYXJyLmxlbmd0aDsgaTsgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpLCB4ID0gYXJyWy0taV0sIGFycltpXSA9IGFycltqXSwgYXJyW2pdID0geCkge30KCiAgICAgICAgICAgIHJldHVybiBhcnI7CiAgICAgICAgICB9OwoKICAgICAgICAgIHZhciBXb3JkQ2xvdWQgPSBmdW5jdGlvbiBXb3JkQ2xvdWQoZWxlbWVudHMsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkgewogICAgICAgICAgICAgIGVsZW1lbnRzID0gW2VsZW1lbnRzXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGkpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7CgogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50c1tpXSkgewogICAgICAgICAgICAgICAgICB0aHJvdyAnVGhlIGVsZW1lbnQgaWQgc3BlY2lmaWVkIGlzIG5vdCBmb3VuZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVsLnRhZ05hbWUgJiYgIWVsLmFwcGVuZENoaWxkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnWW91IG11c3QgcGFzcyB2YWxpZCBIVE1MIGVsZW1lbnRzLCBvciBJRCBvZiB0aGUgZWxlbWVudC4nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qIERlZmF1bHQgdmFsdWVzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IG9wdGlvbnMgb2JqZWN0ICovCgogICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSB7CiAgICAgICAgICAgICAgbGlzdDogW10sCiAgICAgICAgICAgICAgZm9udEZhbWlseTogJyJUcmVidWNoZXQgTVMiLCAiSGVpdGkgVEMiLCAi5b6u6Luf5q2j6buR6auUIiwgJyArICciQXJpYWwgVW5pY29kZSBNUyIsICJEcm9pZCBGYWxsYmFjayBTYW5zIiwgc2Fucy1zZXJpZicsCiAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsCiAgICAgICAgICAgICAgY29sb3I6ICdyYW5kb20tZGFyaycsCiAgICAgICAgICAgICAgbWluU2l6ZTogMCwKICAgICAgICAgICAgICAvLyAwIHRvIGRpc2FibGUKICAgICAgICAgICAgICB3ZWlnaHRGYWN0b3I6IDEsCiAgICAgICAgICAgICAgY2xlYXJDYW52YXM6IHRydWUsCiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZicsCiAgICAgICAgICAgICAgLy8gb3BhcXVlIHdoaXRlID0gcmdiYSgyNTUsIDI1NSwgMjU1LCAxKQogICAgICAgICAgICAgIGdyaWRTaXplOiA4LAogICAgICAgICAgICAgIGRyYXdPdXRPZkJvdW5kOiBmYWxzZSwKICAgICAgICAgICAgICBvcmlnaW46IG51bGwsCiAgICAgICAgICAgICAgZHJhd01hc2s6IGZhbHNlLAogICAgICAgICAgICAgIG1hc2tDb2xvcjogJ3JnYmEoMjU1LDAsMCwwLjMpJywKICAgICAgICAgICAgICBtYXNrR2FwV2lkdGg6IDAuMywKICAgICAgICAgICAgICBsYXlvdXRBbmltYXRpb246IHRydWUsCiAgICAgICAgICAgICAgd2FpdDogMCwKICAgICAgICAgICAgICBhYm9ydFRocmVzaG9sZDogMCwKICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiBub29wKCkge30sCiAgICAgICAgICAgICAgbWluUm90YXRpb246IC1NYXRoLlBJIC8gMiwKICAgICAgICAgICAgICBtYXhSb3RhdGlvbjogTWF0aC5QSSAvIDIsCiAgICAgICAgICAgICAgcm90YXRpb25TdGVwOiAwLjEsCiAgICAgICAgICAgICAgc2h1ZmZsZTogdHJ1ZSwKICAgICAgICAgICAgICByb3RhdGVSYXRpbzogMC4xLAogICAgICAgICAgICAgIHNoYXBlOiAnY2lyY2xlJywKICAgICAgICAgICAgICBlbGxpcHRpY2l0eTogMC42NSwKICAgICAgICAgICAgICBjbGFzc2VzOiBudWxsLAogICAgICAgICAgICAgIGhvdmVyOiBudWxsLAogICAgICAgICAgICAgIGNsaWNrOiBudWxsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAob3B0aW9ucykgewogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvbnZlcnQgd2VpZ2h0RmFjdG9yIGludG8gYSBmdW5jdGlvbiAqLwoKCiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3Mud2VpZ2h0RmFjdG9yICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IHNldHRpbmdzLndlaWdodEZhY3RvcjsKCiAgICAgICAgICAgICAgc2V0dGluZ3Mud2VpZ2h0RmFjdG9yID0gZnVuY3Rpb24gd2VpZ2h0RmFjdG9yKHB0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHQgKiBmYWN0b3I7IC8vaW4gcHgKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvbnZlcnQgc2hhcGUgaW50byBhIGZ1bmN0aW9uICovCgoKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5zaGFwZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hhcGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2NpcmNsZSc6CiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgLy8gJ2NpcmNsZScgaXMgdGhlIGRlZmF1bHQgYW5kIGEgc2hvcnRjdXQgaW4gdGhlIGNvZGUgbG9vcC4KICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSAnY2lyY2xlJzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnY2FyZGlvaWQnOgogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlQ2FyZGlvaWQodGhldGEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguc2luKHRoZXRhKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBUbyB3b3JrIG91dCBhbiBYLWdvbiwgb25lIGhhcyB0byBjYWxjdWxhdGUgIm0iLAogICAgICAgICAgICAgICAgd2hlcmUgMS8oY29zKDIqUEkvWCkrbSpzaW4oMipQSS9YKSkgPSAxLyhjb3MoMCkrbSpzaW4oMCkpCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9MSUyRiUyOGNvcyUyODIqUEklMkZYJTI5JTJCbSpzaW4lMjgKICAgICAgICAgICAgICAgIDIqUEklMkZYJTI5JTI5KyUzRCsxJTJGJTI4Y29zJTI4MCUyOSUyQm0qc2luJTI4MCUyOSUyOQogICAgICAgICAgICAgICAgQ29weSB0aGUgc29sdXRpb24gaW50byBwb2xhciBlcXVhdGlvbiByID0gMS8oY29zKHQnKSArIG0qc2luKHQnKSkKICAgICAgICAgICAgICAgIHdoZXJlIHQnIGVxdWFscyB0byBtb2QodCwgMlBJL1gpOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICBjYXNlICdkaWFtb25kJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3NxdWFyZSc6CiAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cud29sZnJhbWFscGhhLmNvbS9pbnB1dC8/aT1wbG90K3IrJTNEKzElMkYlMjhjb3MlMjhtb2QrCiAgICAgICAgICAgICAgICAgIC8vICUyOHQlMkMrUEklMkYyJTI5JTI5JTJCc2luJTI4bW9kKyUyOHQlMkMrUEklMkYyJTI5JTI5JTI5JTJDK3QrJTNECiAgICAgICAgICAgICAgICAgIC8vICswKy4uKzIqUEkKICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSBmdW5jdGlvbiBzaGFwZVNxdWFyZSh0aGV0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGV0YVByaW1lID0gdGhldGEgJSAoMiAqIE1hdGguUEkgLyA0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlLWZvcndhcmQnOgogICAgICAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgICAgICAgICAvLyAlMjh0JTJDKzIqUEklMkYzJTI5JTI5JTJCc3FydCUyODMlMjlzaW4lMjhtb2QrJTI4dCUyQysyKlBJJTJGMyUyOQogICAgICAgICAgICAgICAgICAvLyAlMjklMjklMkMrdCslM0QrMCsuLisyKlBJCiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVUcmlhbmdsZSh0aGV0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGV0YVByaW1lID0gdGhldGEgJSAoMiAqIE1hdGguUEkgLyAzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc3FydCgzKSAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlLXVwcmlnaHQnOgogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlVHJpYW5nbGUodGhldGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9ICh0aGV0YSArIE1hdGguUEkgKiAzIC8gMikgJSAoMiAqIE1hdGguUEkgLyAzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc3FydCgzKSAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3BlbnRhZ29uJzoKICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSBmdW5jdGlvbiBzaGFwZVBlbnRhZ29uKHRoZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIDAuNzI2NTQzICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnc3Rhcic6CiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVTdGFyKHRoZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyAxMCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KSAtIDIgKiBNYXRoLlBJIC8gMTAgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyAoTWF0aC5jb3MoMiAqIE1hdGguUEkgLyAxMCAtIHRoZXRhUHJpbWUpICsgMy4wNzc2OCAqIE1hdGguc2luKDIgKiBNYXRoLlBJIC8gMTAgLSB0aGV0YVByaW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsgMy4wNzc2OCAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogTWFrZSBzdXJlIGdyaWRTaXplIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBpcyBub3Qgc21hbGxlciB0aGFuIDRweCAqLwoKCiAgICAgICAgICAgIHNldHRpbmdzLmdyaWRTaXplID0gTWF0aC5tYXgoTWF0aC5mbG9vcihzZXR0aW5ncy5ncmlkU2l6ZSksIDQpOwogICAgICAgICAgICAvKiBzaG9ydGhhbmQgKi8KCiAgICAgICAgICAgIHZhciBnID0gc2V0dGluZ3MuZ3JpZFNpemU7CiAgICAgICAgICAgIHZhciBtYXNrUmVjdFdpZHRoID0gZyAtIHNldHRpbmdzLm1hc2tHYXBXaWR0aDsKICAgICAgICAgICAgLyogbm9ybWFsaXplIHJvdGF0aW9uIHNldHRpbmdzICovCgogICAgICAgICAgICB2YXIgcm90YXRpb25SYW5nZSA9IE1hdGguYWJzKHNldHRpbmdzLm1heFJvdGF0aW9uIC0gc2V0dGluZ3MubWluUm90YXRpb24pOwogICAgICAgICAgICB2YXIgbWluUm90YXRpb24gPSBNYXRoLm1pbihzZXR0aW5ncy5tYXhSb3RhdGlvbiwgc2V0dGluZ3MubWluUm90YXRpb24pOwogICAgICAgICAgICB2YXIgcm90YXRpb25TdGVwID0gc2V0dGluZ3Mucm90YXRpb25TdGVwOwogICAgICAgICAgICAvKiBpbmZvcm1hdGlvbi9vYmplY3QgYXZhaWxhYmxlIHRvIGFsbCBmdW5jdGlvbnMsIHNldCB3aGVuIHN0YXJ0KCkgKi8KCiAgICAgICAgICAgIHZhciBncmlkLCAvLyAyZCBhcnJheSBjb250YWluaW5nIGZpbGxpbmcgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmd4LCBuZ3ksIC8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGdyaWQKICAgICAgICAgICAgY2VudGVyLCAvLyBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjbG91ZAogICAgICAgICAgICBtYXhSYWRpdXM7CiAgICAgICAgICAgIC8qIHRpbWVzdGFtcCBmb3IgbWVhc3VyaW5nIGVhY2ggcHV0V29yZCgpIGFjdGlvbiAqLwoKICAgICAgICAgICAgdmFyIGVzY2FwZVRpbWU7CiAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBjb2xvciBvZiB0aGUgdGV4dCAqLwoKICAgICAgICAgICAgdmFyIGdldFRleHRDb2xvcjsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHJhbmRvbV9oc2xfY29sb3IobWluLCBtYXgpIHsKICAgICAgICAgICAgICByZXR1cm4gJ2hzbCgnICsgKE1hdGgucmFuZG9tKCkgKiAzNjApLnRvRml4ZWQoKSArICcsJyArIChNYXRoLnJhbmRvbSgpICogMzAgKyA3MCkudG9GaXhlZCgpICsgJyUsJyArIChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW4pLnRvRml4ZWQoKSArICclKSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3MuY29sb3IpIHsKICAgICAgICAgICAgICBjYXNlICdyYW5kb20tZGFyayc6CiAgICAgICAgICAgICAgICBnZXRUZXh0Q29sb3IgPSBmdW5jdGlvbiBnZXRSYW5kb21EYXJrQ29sb3IoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21faHNsX2NvbG9yKDEwLCA1MCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlICdyYW5kb20tbGlnaHQnOgogICAgICAgICAgICAgICAgZ2V0VGV4dENvbG9yID0gZnVuY3Rpb24gZ2V0UmFuZG9tTGlnaHRDb2xvcigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbV9oc2xfY29sb3IoNTAsIDkwKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLmNvbG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgIGdldFRleHRDb2xvciA9IHNldHRpbmdzLmNvbG9yOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBjbGFzc2VzIG9mIHRoZSB0ZXh0ICovCgoKICAgICAgICAgICAgdmFyIGdldFRleHRDbGFzc2VzID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY2xhc3NlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIGdldFRleHRDbGFzc2VzID0gc2V0dGluZ3MuY2xhc3NlczsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBJbnRlcmFjdGl2ZSAqLwoKCiAgICAgICAgICAgIHZhciBpbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgaW5mb0dyaWQgPSBbXTsKICAgICAgICAgICAgdmFyIGhvdmVyZWQ7CgogICAgICAgICAgICB2YXIgZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50ID0gZnVuY3Rpb24gZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50KGV2dCkgewogICAgICAgICAgICAgIHZhciBjYW52YXMgPSBldnQuY3VycmVudFRhcmdldDsKICAgICAgICAgICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICB2YXIgY2xpZW50WDsKICAgICAgICAgICAgICB2YXIgY2xpZW50WTsKICAgICAgICAgICAgICAvKiogRGV0ZWN0IGlmIHRvdWNoZXMgYXJlIGF2YWlsYWJsZSAqLwoKICAgICAgICAgICAgICBpZiAoZXZ0LnRvdWNoZXMpIHsKICAgICAgICAgICAgICAgIGNsaWVudFggPSBldnQudG91Y2hlc1swXS5jbGllbnRYOwogICAgICAgICAgICAgICAgY2xpZW50WSA9IGV2dC50b3VjaGVzWzBdLmNsaWVudFk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNsaWVudFggPSBldnQuY2xpZW50WDsKICAgICAgICAgICAgICAgIGNsaWVudFkgPSBldnQuY2xpZW50WTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBldmVudFggPSBjbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICAgICAgICAgIHZhciBldmVudFkgPSBjbGllbnRZIC0gcmVjdC50b3A7CiAgICAgICAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKGV2ZW50WCAqIChjYW52YXMud2lkdGggLyByZWN0LndpZHRoIHx8IDEpIC8gZyk7CiAgICAgICAgICAgICAgdmFyIHkgPSBNYXRoLmZsb29yKGV2ZW50WSAqIChjYW52YXMuaGVpZ2h0IC8gcmVjdC5oZWlnaHQgfHwgMSkgLyBnKTsKICAgICAgICAgICAgICByZXR1cm4gaW5mb0dyaWRbeF1beV07CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgd29yZGNsb3VkaG92ZXIgPSBmdW5jdGlvbiB3b3JkY2xvdWRob3ZlcihldnQpIHsKICAgICAgICAgICAgICB2YXIgaW5mbyA9IGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpOwoKICAgICAgICAgICAgICBpZiAoaG92ZXJlZCA9PT0gaW5mbykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaG92ZXJlZCA9IGluZm87CgogICAgICAgICAgICAgIGlmICghaW5mbykgewogICAgICAgICAgICAgICAgc2V0dGluZ3MuaG92ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIGV2dCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBzZXR0aW5ncy5ob3ZlcihpbmZvLml0ZW0sIGluZm8uZGltZW5zaW9uLCBldnQpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHdvcmRjbG91ZGNsaWNrID0gZnVuY3Rpb24gd29yZGNsb3VkY2xpY2soZXZ0KSB7CiAgICAgICAgICAgICAgdmFyIGluZm8gPSBnZXRJbmZvR3JpZEZyb21Nb3VzZVRvdWNoRXZlbnQoZXZ0KTsKCiAgICAgICAgICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBzZXR0aW5ncy5jbGljayhpbmZvLml0ZW0sIGluZm8uZGltZW5zaW9uLCBldnQpOwogICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBHZXQgcG9pbnRzIG9uIHRoZSBncmlkIGZvciBhIGdpdmVuIHJhZGl1cyBhd2F5IGZyb20gdGhlIGNlbnRlciAqLwoKCiAgICAgICAgICAgIHZhciBwb2ludHNBdFJhZGl1cyA9IFtdOwoKICAgICAgICAgICAgdmFyIGdldFBvaW50c0F0UmFkaXVzID0gZnVuY3Rpb24gZ2V0UG9pbnRzQXRSYWRpdXMocmFkaXVzKSB7CiAgICAgICAgICAgICAgaWYgKHBvaW50c0F0UmFkaXVzW3JhZGl1c10pIHsKICAgICAgICAgICAgICAgIHJldHVybiBwb2ludHNBdFJhZGl1c1tyYWRpdXNdOwogICAgICAgICAgICAgIH0gLy8gTG9vayBmb3IgdGhlc2UgbnVtYmVyIG9mIHBvaW50cyBvbiBlYWNoIHJhZGl1cwoKCiAgICAgICAgICAgICAgdmFyIFQgPSByYWRpdXMgKiA4OyAvLyBHZXR0aW5nIGFsbCB0aGUgcG9pbnRzIGF0IHRoaXMgcmFkaXVzCgogICAgICAgICAgICAgIHZhciB0ID0gVDsKICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gW107CgogICAgICAgICAgICAgIGlmIChyYWRpdXMgPT09IDApIHsKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0sIGNlbnRlclsxXSwgMF0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgd2hpbGUgKHQtLSkgewogICAgICAgICAgICAgICAgLy8gZGlzdG9ydCB0aGUgcmFkaXVzIHRvIHB1dCB0aGUgY2xvdWQgaW4gc2hhcGUKICAgICAgICAgICAgICAgIHZhciByeCA9IDE7CgogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNoYXBlICE9PSAnY2lyY2xlJykgewogICAgICAgICAgICAgICAgICByeCA9IHNldHRpbmdzLnNoYXBlKHQgLyBUICogMiAqIE1hdGguUEkpOyAvLyAwIHRvIDEKICAgICAgICAgICAgICAgIH0gLy8gUHVzaCBbeCwgeSwgdF07IHQgaXMgdXNlZCBzb2xlbHkgZm9yIGdldFRleHRDb2xvcigpCgoKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0gKyByYWRpdXMgKiByeCAqIE1hdGguY29zKC10IC8gVCAqIDIgKiBNYXRoLlBJKSwgY2VudGVyWzFdICsgcmFkaXVzICogcnggKiBNYXRoLnNpbigtdCAvIFQgKiAyICogTWF0aC5QSSkgKiBzZXR0aW5ncy5lbGxpcHRpY2l0eSwgdCAvIFQgKiAyICogTWF0aC5QSV0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcG9pbnRzQXRSYWRpdXNbcmFkaXVzXSA9IHBvaW50czsKICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYWQgc3BlbnQgdG9vIG11Y2ggdGltZSAqLwoKCiAgICAgICAgICAgIHZhciBleGNlZWRUaW1lID0gZnVuY3Rpb24gZXhjZWVkVGltZSgpIHsKICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3MuYWJvcnRUaHJlc2hvbGQgPiAwICYmIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZXNjYXBlVGltZSA+IHNldHRpbmdzLmFib3J0VGhyZXNob2xkOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBHZXQgdGhlIGRlZyBvZiByb3RhdGlvbiBhY2NvcmRpbmcgdG8gc2V0dGluZ3MsIGFuZCBsdWNrLiAqLwoKCiAgICAgICAgICAgIHZhciBnZXRSb3RhdGVEZWcgPSBmdW5jdGlvbiBnZXRSb3RhdGVEZWcoKSB7CiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnJvdGF0ZVJhdGlvID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gc2V0dGluZ3Mucm90YXRlUmF0aW8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uUmFuZ2UgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBtaW5Sb3RhdGlvbjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiBtaW5Sb3RhdGlvbiArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIHJvdGF0aW9uUmFuZ2UgLyByb3RhdGlvblN0ZXApICogcm90YXRpb25TdGVwOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGdldFRleHRJbmZvID0gZnVuY3Rpb24gZ2V0VGV4dEluZm8od29yZCwgd2VpZ2h0LCByb3RhdGVEZWcpIHsKICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGFjdXRhbCBmb250IHNpemUKICAgICAgICAgICAgICAvLyBmb250U2l6ZSA9PT0gMCBtZWFucyB3ZWlnaHRGYWN0b3IgZnVuY3Rpb24gd2FudHMgdGhlIHRleHQgc2tpcHBlZCwKICAgICAgICAgICAgICAvLyBhbmQgc2l6ZSA8IG1pblNpemUgbWVhbnMgd2UgY2Fubm90IGRyYXcgdGhlIHRleHQuCiAgICAgICAgICAgICAgdmFyIGRlYnVnID0gZmFsc2U7CiAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gc2V0dGluZ3Mud2VpZ2h0RmFjdG9yKHdlaWdodCk7CgogICAgICAgICAgICAgIGlmIChmb250U2l6ZSA8PSBzZXR0aW5ncy5taW5TaXplKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfSAvLyBTY2FsZSBmYWN0b3IgaGVyZSBpcyB0byBtYWtlIHN1cmUgZmlsbFRleHQgaXMgbm90IGxpbWl0ZWQgYnkKICAgICAgICAgICAgICAvLyB0aGUgbWluaXVtIGZvbnQgc2l6ZSBzZXQgYnkgYnJvd3Nlci4KICAgICAgICAgICAgICAvLyBJdCB3aWxsIGFsd2F5cyBiZSAxIG9yIDJuLgoKCiAgICAgICAgICAgICAgdmFyIG11ID0gMTsKCiAgICAgICAgICAgICAgaWYgKGZvbnRTaXplIDwgbWluRm9udFNpemUpIHsKICAgICAgICAgICAgICAgIG11ID0gZnVuY3Rpb24gY2FsY3VsYXRlU2NhbGVGYWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBtdSA9IDI7CgogICAgICAgICAgICAgICAgICB3aGlsZSAobXUgKiBmb250U2l6ZSA8IG1pbkZvbnRTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgbXUgKz0gMjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgcmV0dXJuIG11OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIGZjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICAgICAgICB2YXIgZmN0eCA9IGZjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBmY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsgKGZvbnRTaXplICogbXUpLnRvU3RyaW5nKDEwKSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseTsgLy8gRXN0aW1hdGUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgdGV4dCB3aXRoIG1lYXN1cmVUZXh0KCkuCgogICAgICAgICAgICAgIHZhciBmdyA9IGZjdHgubWVhc3VyZVRleHQod29yZCkud2lkdGggLyBtdTsKICAgICAgICAgICAgICB2YXIgZmggPSBNYXRoLm1heChmb250U2l6ZSAqIG11LCBmY3R4Lm1lYXN1cmVUZXh0KCdtJykud2lkdGgsIGZjdHgubWVhc3VyZVRleHQoIlx1RkYzNyIpLndpZHRoKSAvIG11OyAvLyBDcmVhdGUgYSBib3VuZGFyeSBib3ggdGhhdCBpcyBsYXJnZXIgdGhhbiBvdXIgZXN0aW1hdGVzLAogICAgICAgICAgICAgIC8vIHNvIHRleHQgZG9uJ3QgZ2V0IGN1dCBvZiAoaXQgc2lsbCBtaWdodCkKCiAgICAgICAgICAgICAgdmFyIGJveFdpZHRoID0gZncgKyBmaCAqIDI7CiAgICAgICAgICAgICAgdmFyIGJveEhlaWdodCA9IGZoICogMzsKICAgICAgICAgICAgICB2YXIgZmd3ID0gTWF0aC5jZWlsKGJveFdpZHRoIC8gZyk7CiAgICAgICAgICAgICAgdmFyIGZnaCA9IE1hdGguY2VpbChib3hIZWlnaHQgLyBnKTsKICAgICAgICAgICAgICBib3hXaWR0aCA9IGZndyAqIGc7CiAgICAgICAgICAgICAgYm94SGVpZ2h0ID0gZmdoICogZzsgLy8gQ2FsY3VsYXRlIHRoZSBwcm9wZXIgb2Zmc2V0cyB0byBtYWtlIHRoZSB0ZXh0IGNlbnRlcmVkIGF0CiAgICAgICAgICAgICAgLy8gdGhlIHByZWZlcnJlZCBwb3NpdGlvbi4KICAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbXBseSBoYWxmIG9mIHRoZSB3aWR0aC4KCiAgICAgICAgICAgICAgdmFyIGZpbGxUZXh0T2Zmc2V0WCA9IC1mdyAvIDI7IC8vIEluc3RlYWQgb2YgbW92aW5nIHRoZSBib3ggdG8gdGhlIGV4YWN0IG1pZGRsZSBvZiB0aGUgcHJlZmVycmVkCiAgICAgICAgICAgICAgLy8gcG9zaXRpb24sIGZvciBZLW9mZnNldCB3ZSBtb3ZlIDAuNCBpbnN0ZWFkLCBzbyBMYXRpbiBhbHBoYWJldHMgbG9vawogICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGNlbnRlcmVkLgoKICAgICAgICAgICAgICB2YXIgZmlsbFRleHRPZmZzZXRZID0gLWZoICogMC40OyAvLyBDYWxjdWxhdGUgdGhlIGFjdHVhbCBkaW1lbnNpb24gb2YgdGhlIGNhbnZhcywgY29uc2lkZXJpbmcgdGhlIHJvdGF0aW9uLgoKICAgICAgICAgICAgICB2YXIgY2doID0gTWF0aC5jZWlsKChib3hXaWR0aCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpICsgYm94SGVpZ2h0ICogTWF0aC5hYnMoTWF0aC5jb3Mocm90YXRlRGVnKSkpIC8gZyk7CiAgICAgICAgICAgICAgdmFyIGNndyA9IE1hdGguY2VpbCgoYm94V2lkdGggKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSArIGJveEhlaWdodCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpKSAvIGcpOwogICAgICAgICAgICAgIHZhciB3aWR0aCA9IGNndyAqIGc7CiAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IGNnaCAqIGc7CiAgICAgICAgICAgICAgZmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpOwogICAgICAgICAgICAgIGZjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpOwoKICAgICAgICAgICAgICBpZiAoZGVidWcpIHsKICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBmY2FudmFzIHRvIHRoZSBET00KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmNhbnZhcyk7IC8vIFNhdmUgaXQncyBzdGF0ZSBzbyB0aGF0IHdlIGNvdWxkIHJlc3RvcmUgYW5kIGRyYXcgdGhlIGdyaWQgY29ycmVjdGx5LgoKICAgICAgICAgICAgICAgIGZjdHguc2F2ZSgpOwogICAgICAgICAgICAgIH0gLy8gU2NhbGUgdGhlIGNhbnZhcyB3aXRoIHxtdXwuCgoKICAgICAgICAgICAgICBmY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKICAgICAgICAgICAgICBmY3R4LnRyYW5zbGF0ZSh3aWR0aCAqIG11IC8gMiwgaGVpZ2h0ICogbXUgLyAyKTsKICAgICAgICAgICAgICBmY3R4LnJvdGF0ZSgtcm90YXRlRGVnKTsgLy8gT25jZSB0aGUgd2lkdGgvaGVpZ2h0IGlzIHNldCwgY3R4IGluZm8gd2lsbCBiZSByZXNldC4KICAgICAgICAgICAgICAvLyBTZXQgaXQgYWdhaW4gaGVyZS4KCiAgICAgICAgICAgICAgZmN0eC5mb250ID0gc2V0dGluZ3MuZm9udFdlaWdodCArICcgJyArIChmb250U2l6ZSAqIG11KS50b1N0cmluZygxMCkgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHk7IC8vIEZpbGwgdGhlIHRleHQgaW50byB0aGUgZmNhbnZhcy4KICAgICAgICAgICAgICAvLyBYWFg6IFdlIGNhbm5vdCBiZWNhdXNlIHRleHRCYXNlbGluZSA9ICd0b3AnIGhlcmUgYmVjYXVzZQogICAgICAgICAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIGRpZmZlcmVudCBkZWZhdWx0IGxpbmUtaGVpZ2h0IGZvciBjYW52YXMuCiAgICAgICAgICAgICAgLy8gUGxlYXNlIHJlYWQgaHR0cHM6Ly9idWd6aWwubGEvNzM3ODUyI2M2LgogICAgICAgICAgICAgIC8vIEhlcmUsIHdlIHVzZSB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJyBhbmQgZHJhdyB0aGUgdGV4dCBhdCBleGFjdGx5CiAgICAgICAgICAgICAgLy8gMC41ICogZm9udFNpemUgbG93ZXIuCgogICAgICAgICAgICAgIGZjdHguZmlsbFN0eWxlID0gJyMwMDAnOwogICAgICAgICAgICAgIGZjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgZmN0eC5maWxsVGV4dCh3b3JkLCBmaWxsVGV4dE9mZnNldFggKiBtdSwgKGZpbGxUZXh0T2Zmc2V0WSArIGZvbnRTaXplICogMC41KSAqIG11KTsgLy8gR2V0IHRoZSBwaXhlbHMgb2YgdGhlIHRleHQKCiAgICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IGZjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7CgogICAgICAgICAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgLy8gRHJhdyB0aGUgYm94IG9mIHRoZSBvcmlnaW5hbCBlc3RpbWF0aW9uCiAgICAgICAgICAgICAgICBmY3R4LnN0cm9rZVJlY3QoZmlsbFRleHRPZmZzZXRYICogbXUsIGZpbGxUZXh0T2Zmc2V0WSwgZncgKiBtdSwgZmggKiBtdSk7CiAgICAgICAgICAgICAgICBmY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICB9IC8vIFJlYWQgdGhlIHBpeGVscyBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG9jY3VwaWVkIGFycmF5CgoKICAgICAgICAgICAgICB2YXIgb2NjdXBpZWQgPSBbXTsKICAgICAgICAgICAgICB2YXIgZ3ggPSBjZ3csCiAgICAgICAgICAgICAgICAgIGd5LAogICAgICAgICAgICAgICAgICB4LAogICAgICAgICAgICAgICAgICB5OwogICAgICAgICAgICAgIHZhciBib3VuZHMgPSBbY2doIC8gMiwgY2d3IC8gMiwgY2doIC8gMiwgY2d3IC8gMl07CgogICAgICAgICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICAgICAgICBneSA9IGNnaDsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICAgICAgICB5ID0gZzsKCiAgICAgICAgICAgICAgICAgIHNpbmdsZUdyaWRMb29wOiB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHktLSkgewogICAgICAgICAgICAgICAgICAgICAgeCA9IGc7CgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHgtLSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhWygoZ3kgKiBnICsgeSkgKiB3aWR0aCArIChneCAqIGcgKyB4KSkgKiA0ICsgM10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cGllZC5wdXNoKFtneCwgZ3ldKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGd4IDwgYm91bmRzWzNdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbM10gPSBneDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChneCA+IGJvdW5kc1sxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzWzFdID0gZ3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3kgPCBib3VuZHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1swXSA9IGd5OwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGd5ID4gYm91bmRzWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMl0gPSBneTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChneCAqIGcsIGd5ICogZywgZyAtIDAuNSwgZyAtIDAuNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzaW5nbGVHcmlkTG9vcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICAgICAgICBmY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDI1NSwgMC41KSc7CiAgICAgICAgICAgICAgICAgICAgICBmY3R4LmZpbGxSZWN0KGd4ICogZywgZ3kgKiBnLCBnIC0gMC41LCBnIC0gMC41KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgwLCAyNTUsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChib3VuZHNbM10gKiBnLCBib3VuZHNbMF0gKiBnLCAoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgKiBnLCAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgKiBnKTsKICAgICAgICAgICAgICB9IC8vIFJldHVybiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY3JlYXRlIHRoZSB0ZXh0IG9uIHRoZSByZWFsIGNhbnZhcwoKCiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG11OiBtdSwKICAgICAgICAgICAgICAgIG9jY3VwaWVkOiBvY2N1cGllZCwKICAgICAgICAgICAgICAgIGJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgZ3c6IGNndywKICAgICAgICAgICAgICAgIGdoOiBjZ2gsCiAgICAgICAgICAgICAgICBmaWxsVGV4dE9mZnNldFg6IGZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICAgICAgICAgIGZpbGxUZXh0T2Zmc2V0WTogZmlsbFRleHRPZmZzZXRZLAogICAgICAgICAgICAgICAgZmlsbFRleHRXaWR0aDogZncsCiAgICAgICAgICAgICAgICBmaWxsVGV4dEhlaWdodDogZmgsCiAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgcm9vbSBhdmFpbGFibGUgaW4gdGhlIGdpdmVuIGRpbWVuc2lvbiAqLwoKCiAgICAgICAgICAgIHZhciBjYW5GaXRUZXh0ID0gZnVuY3Rpb24gY2FuRml0VGV4dChneCwgZ3ksIGd3LCBnaCwgb2NjdXBpZWQpIHsKICAgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBvY2N1cGllZCBwb2ludHMsCiAgICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwoKICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcHggPSBneCArIG9jY3VwaWVkW2ldWzBdOwogICAgICAgICAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgICAgICAgICBpZiAocHggPj0gbmd4IHx8IHB5ID49IG5neSB8fCBweCA8IDAgfHwgcHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuZHJhd091dE9mQm91bmQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghZ3JpZFtweF1bcHldKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBBY3R1YWxseSBkcmF3IHRoZSB0ZXh0IG9uIHRoZSBncmlkICovCgoKICAgICAgICAgICAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoZ3gsIGd5LCBpbmZvLCB3b3JkLCB3ZWlnaHQsIGRpc3RhbmNlLCB0aGV0YSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gaW5mby5mb250U2l6ZTsKICAgICAgICAgICAgICB2YXIgY29sb3I7CgogICAgICAgICAgICAgIGlmIChnZXRUZXh0Q29sb3IpIHsKICAgICAgICAgICAgICAgIGNvbG9yID0gZ2V0VGV4dENvbG9yKHdvcmQsIHdlaWdodCwgZm9udFNpemUsIGRpc3RhbmNlLCB0aGV0YSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbG9yID0gc2V0dGluZ3MuY29sb3I7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgY2xhc3NlczsKCiAgICAgICAgICAgICAgaWYgKGdldFRleHRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICBjbGFzc2VzID0gZ2V0VGV4dENsYXNzZXMod29yZCwgd2VpZ2h0LCBmb250U2l6ZSwgZGlzdGFuY2UsIHRoZXRhKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2xhc3NlcyA9IHNldHRpbmdzLmNsYXNzZXM7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgZGltZW5zaW9uOwogICAgICAgICAgICAgIHZhciBib3VuZHMgPSBpbmZvLmJvdW5kczsKICAgICAgICAgICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgICAgICAgICB4OiAoZ3ggKyBib3VuZHNbM10pICogZywKICAgICAgICAgICAgICAgIHk6IChneSArIGJvdW5kc1swXSkgKiBnLAogICAgICAgICAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgIGg6IChib3VuZHNbMl0gLSBib3VuZHNbMF0gKyAxKSAqIGcKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwuZ2V0Q29udGV4dCkgewogICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gZWwuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgICAgdmFyIG11ID0gaW5mby5tdTsgLy8gU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBiZWZvcmUgbWVzc2luZyBpdAoKICAgICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgICAgY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKICAgICAgICAgICAgICAgICAgY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsgKGZvbnRTaXplICogbXUpLnRvU3RyaW5nKDEwKSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseTsKICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOyAvLyBUcmFuc2xhdGUgdGhlIGNhbnZhcyBwb3NpdGlvbiB0byB0aGUgb3JpZ2luIGNvb3JkaW5hdGUgb2Ygd2hlcmUKICAgICAgICAgICAgICAgICAgLy8gdGhlIHRleHQgc2hvdWxkIGJlIHB1dC4KCiAgICAgICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoKGd4ICsgaW5mby5ndyAvIDIpICogZyAqIG11LCAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICogbXUpOwoKICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZURlZyAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGN0eC5yb3RhdGUoLXJvdGF0ZURlZyk7CiAgICAgICAgICAgICAgICAgIH0gLy8gRmluYWxseSwgZmlsbCB0aGUgdGV4dC4KICAgICAgICAgICAgICAgICAgLy8gWFhYOiBXZSBjYW5ub3QgYmVjYXVzZSB0ZXh0QmFzZWxpbmUgPSAndG9wJyBoZXJlIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIHVzZXMgZGlmZmVyZW50IGRlZmF1bHQgbGluZS1oZWlnaHQgZm9yIGNhbnZhcy4KICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIHJlYWQgaHR0cHM6Ly9idWd6aWwubGEvNzM3ODUyI2M2LgogICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSB1c2UgdGV4dEJhc2VsaW5lID0gJ21pZGRsZScgYW5kIGRyYXcgdGhlIHRleHQgYXQgZXhhY3RseQogICAgICAgICAgICAgICAgICAvLyAwLjUgKiBmb250U2l6ZSBsb3dlci4KCgogICAgICAgICAgICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dCh3b3JkLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WCAqIG11LCAoaW5mby5maWxsVGV4dE9mZnNldFkgKyBmb250U2l6ZSAqIDAuNSkgKiBtdSk7IC8vIFRoZSBiZWxvdyBib3ggaXMgYWx3YXlzIG1hdGNoZXMgaG93IDxzcGFuPnMgYXJlIHBvc2l0aW9uZWQKCiAgICAgICAgICAgICAgICAgIC8qIGN0eC5zdHJva2VSZWN0KGluZm8uZmlsbFRleHRPZmZzZXRYLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WSwKICAgICAgICAgICAgICAgICAgICBpbmZvLmZpbGxUZXh0V2lkdGgsIGluZm8uZmlsbFRleHRIZWlnaHQpOyAqLwogICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBzdGF0ZS4KCiAgICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBkcmF3VGV4dCBvbiBESVYgZWxlbWVudAogICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybVJ1bGUgPSAnJzsKICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUnVsZSA9ICdyb3RhdGUoJyArIC1yb3RhdGVEZWcgLyBNYXRoLlBJICogMTgwICsgJ2RlZykgJzsKCiAgICAgICAgICAgICAgICAgIGlmIChpbmZvLm11ICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUnVsZSArPSAndHJhbnNsYXRlWCgtJyArIGluZm8uZmlsbFRleHRXaWR0aCAvIDQgKyAncHgpICcgKyAnc2NhbGUoJyArIDEgLyBpbmZvLm11ICsgJyknOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2YXIgc3R5bGVSdWxlcyA9IHsKICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKICAgICAgICAgICAgICAgICAgICAnZm9udCc6IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKyBmb250U2l6ZSAqIGluZm8ubXUgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiAoZ3ggKyBpbmZvLmd3IC8gMikgKiBnICsgaW5mby5maWxsVGV4dE9mZnNldFggKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd0b3AnOiAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICsgaW5mby5maWxsVGV4dE9mZnNldFkgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd3aWR0aCc6IGluZm8uZmlsbFRleHRXaWR0aCArICdweCcsCiAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGluZm8uZmlsbFRleHRIZWlnaHQgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICdsaW5lSGVpZ2h0JzogZm9udFNpemUgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd3aGl0ZVNwYWNlJzogJ25vd3JhcCcsCiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6IHRyYW5zZm9ybVJ1bGUsCiAgICAgICAgICAgICAgICAgICAgJ3dlYmtpdFRyYW5zZm9ybSc6IHRyYW5zZm9ybVJ1bGUsCiAgICAgICAgICAgICAgICAgICAgJ21zVHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnLAogICAgICAgICAgICAgICAgICAgICd3ZWJraXRUcmFuc2Zvcm1PcmlnaW4nOiAnNTAlIDQwJScsCiAgICAgICAgICAgICAgICAgICAgJ21zVHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZVJ1bGVzLmNvbG9yID0gY29sb3I7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB3b3JkOwoKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY3NzUHJvcCBpbiBzdHlsZVJ1bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZVtjc3NQcm9wXSA9IHN0eWxlUnVsZXNbY3NzUHJvcF07CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgYXR0cmlidXRlc1thdHRyaWJ1dGVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi5jbGFzc05hbWUgKz0gY2xhc3NlczsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qIEhlbHAgZnVuY3Rpb24gdG8gdXBkYXRlR3JpZCAqLwoKCiAgICAgICAgICAgIHZhciBmaWxsR3JpZEF0ID0gZnVuY3Rpb24gZmlsbEdyaWRBdCh4LCB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKHggPj0gbmd4IHx8IHkgPj0gbmd5IHx8IHggPCAwIHx8IHkgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBncmlkW3hdW3ldID0gZmFsc2U7CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgdmFyIGN0eCA9IGVsZW1lbnRzWzBdLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeCAqIGcsIHkgKiBnLCBtYXNrUmVjdFdpZHRoLCBtYXNrUmVjdFdpZHRoKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChpbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgaW5mb0dyaWRbeF1beV0gPSB7CiAgICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW0sCiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbjogZGltZW5zaW9uCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBmaWxsaW5nIGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBzcGFjZSB3aXRoIG9jY3VwaWVkIHBvaW50cy4KICAgICAgICAgICAgICAgRHJhdyB0aGUgbWFzayBvbiB0aGUgY2FudmFzIGlmIG5lY2Vzc2FyeS4gKi8KCgogICAgICAgICAgICB2YXIgdXBkYXRlR3JpZCA9IGZ1bmN0aW9uIHVwZGF0ZUdyaWQoZ3gsIGd5LCBndywgZ2gsIGluZm8sIGl0ZW0pIHsKICAgICAgICAgICAgICB2YXIgb2NjdXBpZWQgPSBpbmZvLm9jY3VwaWVkOwogICAgICAgICAgICAgIHZhciBkcmF3TWFzayA9IHNldHRpbmdzLmRyYXdNYXNrOwogICAgICAgICAgICAgIHZhciBjdHg7CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgY3R4ID0gZWxlbWVudHNbMF0uZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MubWFza0NvbG9yOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIGRpbWVuc2lvbjsKCiAgICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CiAgICAgICAgICAgICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgICAgICAgICAgIHg6IChneCArIGJvdW5kc1szXSkgKiBnLAogICAgICAgICAgICAgICAgICB5OiAoZ3kgKyBib3VuZHNbMF0pICogZywKICAgICAgICAgICAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgICAgaDogKGJvdW5kc1syXSAtIGJvdW5kc1swXSArIDEpICogZwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwoKICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcHggPSBneCArIG9jY3VwaWVkW2ldWzBdOwogICAgICAgICAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgICAgICAgICBpZiAocHggPj0gbmd4IHx8IHB5ID49IG5neSB8fCBweCA8IDAgfHwgcHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZpbGxHcmlkQXQocHgsIHB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qIHB1dFdvcmQoKSBwcm9jZXNzZXMgZWFjaCBpdGVtIG9uIHRoZSBsaXN0LAogICAgICAgICAgICAgICBjYWxjdWxhdGUgaXQncyBzaXplIGFuZCBkZXRlcm1pbmUgaXQncyBwb3NpdGlvbiwgYW5kIGFjdHVhbGx5CiAgICAgICAgICAgICAgIHB1dCBpdCBvbiB0aGUgY2FudmFzLiAqLwoKCiAgICAgICAgICAgIHZhciBwdXRXb3JkID0gZnVuY3Rpb24gcHV0V29yZChpdGVtKSB7CiAgICAgICAgICAgICAgdmFyIHdvcmQsIHdlaWdodCwgYXR0cmlidXRlczsKCiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHsKICAgICAgICAgICAgICAgIHdvcmQgPSBpdGVtWzBdOwogICAgICAgICAgICAgICAgd2VpZ2h0ID0gaXRlbVsxXTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd29yZCA9IGl0ZW0ud29yZDsKICAgICAgICAgICAgICAgIHdlaWdodCA9IGl0ZW0ud2VpZ2h0OwogICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGl0ZW0uYXR0cmlidXRlczsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciByb3RhdGVEZWcgPSBnZXRSb3RhdGVEZWcoKTsgLy8gZ2V0IGluZm8gbmVlZGVkIHRvIHB1dCB0aGUgdGV4dCBvbnRvIHRoZSBjYW52YXMKCiAgICAgICAgICAgICAgdmFyIGluZm8gPSBnZXRUZXh0SW5mbyh3b3JkLCB3ZWlnaHQsIHJvdGF0ZURlZyk7IC8vIG5vdCBnZXR0aW5nIHRoZSBpbmZvIG1lYW5zIHdlIHNob3VsZG4ndCBiZSBkcmF3aW5nIHRoaXMgb25lLgoKICAgICAgICAgICAgICBpZiAoIWluZm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9IC8vIElmIGRyYXdPdXRPZkJvdW5kIGlzIHNldCB0byBmYWxzZSwKICAgICAgICAgICAgICAvLyBza2lwIHRoZSBsb29wIGlmIHdlIGhhdmUgYWxyZWFkeSBrbm93IHRoZSBib3VuZGluZyBib3ggb2YKICAgICAgICAgICAgICAvLyB3b3JkIGlzIGxhcmdlciB0aGFuIHRoZSBjYW52YXMuCgoKICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmRyYXdPdXRPZkJvdW5kKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CgogICAgICAgICAgICAgICAgaWYgKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEgPiBuZ3ggfHwgYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSA+IG5neSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSAvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIHRvIHB1dCB0aGUgdGV4dCBieQogICAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0IHBvaW50cwoKCiAgICAgICAgICAgICAgdmFyIHIgPSBtYXhSYWRpdXMgKyAxOwoKICAgICAgICAgICAgICB2YXIgdHJ5VG9QdXRXb3JkQXRQb2ludCA9IGZ1bmN0aW9uIHRyeVRvUHV0V29yZEF0UG9pbnQoZ3h5KSB7CiAgICAgICAgICAgICAgICB2YXIgZ3ggPSBNYXRoLmZsb29yKGd4eVswXSAtIGluZm8uZ3cgLyAyKTsKICAgICAgICAgICAgICAgIHZhciBneSA9IE1hdGguZmxvb3IoZ3h5WzFdIC0gaW5mby5naCAvIDIpOwogICAgICAgICAgICAgICAgdmFyIGd3ID0gaW5mby5ndzsKICAgICAgICAgICAgICAgIHZhciBnaCA9IGluZm8uZ2g7IC8vIElmIHdlIGNhbm5vdCBmaXQgdGhlIHRleHQgYXQgdGhpcyBwb3NpdGlvbiwgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICAvLyBhbmQgZ28gdG8gdGhlIG5leHQgcG9zaXRpb24uCgogICAgICAgICAgICAgICAgaWYgKCFjYW5GaXRUZXh0KGd4LCBneSwgZ3csIGdoLCBpbmZvLm9jY3VwaWVkKSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9IC8vIEFjdHVhbGx5IHB1dCB0aGUgdGV4dCBvbiB0aGUgY2FudmFzCgoKICAgICAgICAgICAgICAgIGRyYXdUZXh0KGd4LCBneSwgaW5mbywgd29yZCwgd2VpZ2h0LCBtYXhSYWRpdXMgLSByLCBneHlbMl0sIHJvdGF0ZURlZywgYXR0cmlidXRlcyk7IC8vIE1hcmsgdGhlIHNwYWNlcyBvbiB0aGUgZ3JpZCBhcyBmaWxsZWQKCiAgICAgICAgICAgICAgICB1cGRhdGVHcmlkKGd4LCBneSwgZ3csIGdoLCBpbmZvLCBpdGVtKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgIGd4OiBneCwKICAgICAgICAgICAgICAgICAgZ3k6IGd5LAogICAgICAgICAgICAgICAgICByb3Q6IHJvdGF0ZURlZywKICAgICAgICAgICAgICAgICAgaW5mbzogaW5mbwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICB3aGlsZSAoci0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gZ2V0UG9pbnRzQXRSYWRpdXMobWF4UmFkaXVzIC0gcik7CgogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNodWZmbGUpIHsKICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW10uY29uY2F0KHBvaW50cyk7CiAgICAgICAgICAgICAgICAgIHNodWZmbGVBcnJheShwb2ludHMpOwogICAgICAgICAgICAgICAgfSAvLyBUcnkgdG8gZml0IHRoZSB3b3JkcyBieSBsb29raW5nIGF0IGVhY2ggcG9pbnQuCiAgICAgICAgICAgICAgICAvLyBhcnJheS5zb21lKCkgd2lsbCBzdG9wIGFuZCByZXR1cm4gdHJ1ZQogICAgICAgICAgICAgICAgLy8gd2hlbiBwdXRXb3JkQXRQb2ludCgpIHJldHVybnMgdHJ1ZS4KCgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRyeVRvUHV0V29yZEF0UG9pbnQocG9pbnRzW2ldKTsKCiAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IC8vIHZhciBkcmF3biA9IHBvaW50cy5zb21lKHRyeVRvUHV0V29yZEF0UG9pbnQpOwogICAgICAgICAgICAgICAgLy8gaWYgKGRyYXduKSB7CiAgICAgICAgICAgICAgICAvLyAgIC8vIGxlYXZlIHB1dFdvcmQoKSBhbmQgcmV0dXJuIHRydWUKICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAvLyB9CgogICAgICAgICAgICAgIH0gLy8gd2UgdHJpZWQgYWxsIGRpc3RhbmNlcyBidXQgdGV4dCB3b24ndCBmaXQsIHJldHVybiBudWxsCgoKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogU2VuZCBET00gZXZlbnQgdG8gYWxsIGVsZW1lbnRzLiBXaWxsIHN0b3Agc2VuZGluZyBldmVudCBhbmQgcmV0dXJuCiAgICAgICAgICAgICAgIGlmIHRoZSBwcmV2aW91cyBvbmUgaXMgY2FuY2VsZWQgKGZvciBjYW5jZWxhYmxlIGV2ZW50cykuICovCgoKICAgICAgICAgICAgdmFyIHNlbmRFdmVudCA9IGZ1bmN0aW9uIHNlbmRFdmVudCh0eXBlLCBjYW5jZWxhYmxlLCBkZXRhaWwpIHsKICAgICAgICAgICAgICBpZiAoY2FuY2VsYWJsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuICFlbC5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsKICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpOwogICAgICAgICAgICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHRydWUsIGNhbmNlbGFibGUsIGRldGFpbCB8fCB7fSk7CiAgICAgICAgICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogU3RhcnQgZHJhd2luZyBvbiBhIGNhbnZhcyAqLwoKCiAgICAgICAgICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkgewogICAgICAgICAgICAgIC8vIEZvciBkaW1lbnNpb25zLCBjbGVhckNhbnZhcyBldGMuLAogICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgZWxlbWVudC4KICAgICAgICAgICAgICB2YXIgY2FudmFzID0gZWxlbWVudHNbMF07CgogICAgICAgICAgICAgIGlmIChjYW52YXMuZ2V0Q29udGV4dCkgewogICAgICAgICAgICAgICAgbmd4ID0gTWF0aC5jZWlsKGNhbnZhcy53aWR0aCAvIGcpOwogICAgICAgICAgICAgICAgbmd5ID0gTWF0aC5jZWlsKGNhbnZhcy5oZWlnaHQgLyBnKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICBuZ3ggPSBNYXRoLmNlaWwocmVjdC53aWR0aCAvIGcpOwogICAgICAgICAgICAgICAgbmd5ID0gTWF0aC5jZWlsKHJlY3QuaGVpZ2h0IC8gZyk7CiAgICAgICAgICAgICAgfSAvLyBTZW5kaW5nIGEgd29yZGNsb3Vkc3RhcnQgZXZlbnQgd2hpY2ggY2F1c2UgdGhlIHByZXZpb3VzIGxvb3AgdG8gc3RvcC4KICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBldmVudCBpcyBjYW5jZWxlZC4KCgogICAgICAgICAgICAgIGlmICghc2VuZEV2ZW50KCd3b3JkY2xvdWRzdGFydCcsIHRydWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSAvLyBEZXRlcm1pbmUgdGhlIGNlbnRlciBvZiB0aGUgd29yZCBjbG91ZAoKCiAgICAgICAgICAgICAgY2VudGVyID0gc2V0dGluZ3Mub3JpZ2luID8gW3NldHRpbmdzLm9yaWdpblswXSAvIGcsIHNldHRpbmdzLm9yaWdpblsxXSAvIGddIDogW25neCAvIDIsIG5neSAvIDJdOyAvLyBNYXhpdW0gcmFkaXVzIHRvIGxvb2sgZm9yIHNwYWNlCgogICAgICAgICAgICAgIG1heFJhZGl1cyA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG5neCAqIG5neCArIG5neSAqIG5neSkpOwogICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBjYW52YXMgb25seSBpZiB0aGUgY2xlYXJDYW52YXMgaXMgc2V0LAogICAgICAgICAgICAgICAgIGlmIG5vdCwgdXBkYXRlIHRoZSBncmlkIHRvIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZSAqLwoKICAgICAgICAgICAgICBncmlkID0gW107CiAgICAgICAgICAgICAgdmFyIGd4LCBneSwgaTsKCiAgICAgICAgICAgICAgaWYgKCFjYW52YXMuZ2V0Q29udGV4dCB8fCBzZXR0aW5ncy5jbGVhckNhbnZhcykgewogICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsKICAgICAgICAgICAgICAgICAgaWYgKGVsLmdldENvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gZWwuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgbmd4ICogKGcgKyAxKSwgbmd5ICogKGcgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIG5neCAqIChnICsgMSksIG5neSAqIChnICsgMSkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBncmlkIHdpdGggZW1wdHkgc3RhdGUgKi8KCiAgICAgICAgICAgICAgICBneCA9IG5neDsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3gtLSkgewogICAgICAgICAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgICBneSA9IG5neTsKCiAgICAgICAgICAgICAgICAgIHdoaWxlIChneS0tKSB7CiAgICAgICAgICAgICAgICAgICAgZ3JpZFtneF1bZ3ldID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgYmdQaXhlbCBieSBjcmVhdGluZwogICAgICAgICAgICAgICAgICAgYW5vdGhlciBjYW52YXMgYW5kIGZpbGwgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLiAqLwogICAgICAgICAgICAgICAgdmFyIGJjdHggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICAgICAgYmN0eC5maWxsU3R5bGUgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICAgICAgICBiY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICAgICAgICAgICAgdmFyIGJnUGl4ZWwgPSBiY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhOwogICAgICAgICAgICAgICAgLyogUmVhZCBiYWNrIHRoZSBwaXhlbHMgb2YgdGhlIGNhbnZhcyB3ZSBnb3QgdG8gdGVsbCB3aGljaCBwYXJ0IG9mIHRoZQogICAgICAgICAgICAgICAgICAgY2FudmFzIGlzIGVtcHR5LgogICAgICAgICAgICAgICAgICAgKG5vIGNsZWFyQ2FudmFzIG9ubHkgd29ya3Mgd2l0aCBhIGNhbnZhcywgbm90IGRpdnMpICovCgogICAgICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSgwLCAwLCBuZ3ggKiBnLCBuZ3kgKiBnKS5kYXRhOwogICAgICAgICAgICAgICAgZ3ggPSBuZ3g7CiAgICAgICAgICAgICAgICB2YXIgeCwgeTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3gtLSkgewogICAgICAgICAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgICBneSA9IG5neTsKCiAgICAgICAgICAgICAgICAgIHdoaWxlIChneS0tKSB7CiAgICAgICAgICAgICAgICAgICAgeSA9IGc7CgogICAgICAgICAgICAgICAgICAgIHNpbmdsZUdyaWRMb29wOiB3aGlsZSAoeS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICB4ID0gZzsKCiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeC0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSA0OwoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGFbKChneSAqIGcgKyB5KSAqIG5neCAqIGcgKyAoZ3ggKiBnICsgeCkpICogNCArIGldICE9PSBiZ1BpeGVsW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkW2d4XVtneV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNpbmdsZUdyaWRMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbZ3hdW2d5XSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgIGdyaWRbZ3hdW2d5XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gYmN0eCA9IGJnUGl4ZWwgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgfSAvLyBmaWxsIHRoZSBpbmZvR3JpZCB3aXRoIGVtcHR5IHN0YXRlIGlmIHdlIG5lZWQgaXQKCgogICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlciB8fCBzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgZ3JpZCB3aXRoIGVtcHR5IHN0YXRlICovCgogICAgICAgICAgICAgICAgZ3ggPSBuZ3ggKyAxOwoKICAgICAgICAgICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICAgICAgICAgIGluZm9HcmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlcikgewogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgd29yZGNsb3VkaG92ZXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB3b3JkY2xvdWRjbGljayk7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgd29yZGNsb3VkY2xpY2spOwogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUYXBIaWdobGlnaHRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsIDApJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBmdW5jdGlvbiBzdG9wSW50ZXJhY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIHN0b3BJbnRlcmFjdGlvbik7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB3b3JkY2xvdWRob3Zlcik7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHdvcmRjbG91ZGNsaWNrKTsKICAgICAgICAgICAgICAgICAgaG92ZXJlZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgdmFyIGxvb3BpbmdGdW5jdGlvbiwgc3RvcHBpbmdGdW5jdGlvbjsKICAgICAgICAgICAgICB2YXIgbGF5b3V0aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5sYXlvdXRBbmltYXRpb24pIHsKICAgICAgICAgICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uIGxvb3BpbmdGdW5jdGlvbihjYikgewogICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24gc3RvcHBpbmdGdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgbGF5b3V0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3Mud2FpdCAhPT0gMCkgewogICAgICAgICAgICAgICAgbG9vcGluZ0Z1bmN0aW9uID0gd2luZG93LnNldFRpbWVvdXQ7CiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uID0gd2luZG93LmNsZWFyVGltZW91dDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9vcGluZ0Z1bmN0aW9uID0gd2luZG93LnNldEltbWVkaWF0ZTsKICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24gPSB3aW5kb3cuY2xlYXJJbW1lZGlhdGU7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgdmFyIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHZhciBhbm90aGVyV29yZENsb3VkU3RhcnQgPSBmdW5jdGlvbiBhbm90aGVyV29yZENsb3VkU3RhcnQoKSB7CiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGFub3RoZXJXb3JkQ2xvdWRTdGFydCk7CiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uKHRpbWVyKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGFub3RoZXJXb3JkQ2xvdWRTdGFydCk7IC8vIEF0IGxlYXN0IHdhaXQgdGhlIGZvbGxvd2luZyBjb2RlIGJlZm9yZSBjYWxsIHRoZSBmaXJzdCBpdGVyYXRpb24uCgogICAgICAgICAgICAgIHZhciB0aW1lciA9IChzZXR0aW5ncy5sYXlvdXRBbmltYXRpb24gPyBsb29waW5nRnVuY3Rpb24gOiBzZXRUaW1lb3V0KShmdW5jdGlvbiBsb29wKCkgewogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRpbmcpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpID49IHNldHRpbmdzLmxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0b3AnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZHN0YXJ0JywgYW5vdGhlcldvcmRDbG91ZFN0YXJ0KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVzY2FwZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIHZhciBkcmF3biA9IHB1dFdvcmQoc2V0dGluZ3MubGlzdFtpXSk7CiAgICAgICAgICAgICAgICB2YXIgY2FuY2VsZWQgPSAhc2VuZEV2ZW50KCd3b3JkY2xvdWRkcmF3bicsIHRydWUsIHsKICAgICAgICAgICAgICAgICAgaXRlbTogc2V0dGluZ3MubGlzdFtpXSwKICAgICAgICAgICAgICAgICAgZHJhd246IGRyYXduCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoZXhjZWVkVGltZSgpIHx8IGNhbmNlbGVkKSB7CiAgICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5hYm9ydCgpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZGFib3J0JywgZmFsc2UpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0b3AnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZHN0YXJ0JywgYW5vdGhlcldvcmRDbG91ZFN0YXJ0KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIHRpbWVyID0gbG9vcGluZ0Z1bmN0aW9uKGxvb3AsIHNldHRpbmdzLndhaXQpOwogICAgICAgICAgICAgIH0sIHNldHRpbmdzLndhaXQpOwogICAgICAgICAgICB9OyAvLyBBbGwgc2V0LCBzdGFydCB0aGUgZHJhd2luZwoKCiAgICAgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgICB9OwoKICAgICAgICAgIFdvcmRDbG91ZC5pc1N1cHBvcnRlZCA9IGlzU3VwcG9ydGVkOwogICAgICAgICAgV29yZENsb3VkLm1pbkZvbnRTaXplID0gbWluRm9udFNpemU7CiAgICAgICAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgogICAgICAgICAgdmFyIGxheW91dCA9IFdvcmRDbG91ZDsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvd29yZENsb3VkLmpzCgogICAgICAgICAgaWYgKCFsYXlvdXQuaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSB5b3VyIGJyb3dzZXIgbm90IHN1cHBvcnQgd29yZENsb3VkJyk7CiAgICAgICAgICB9IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcmVhbS93b3JkY2xvdWQyLmpzL2Jsb2IvYzIzNmJlZTYwNDM2ZTA0ODk0OWY5YmVjYzRmMGY2N2JkODMyZGM1Yy9pbmRleC5qcyNMMjMzCgoKICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhbnZhc01hc2sobWFza0NhbnZhcykgewogICAgICAgICAgICB2YXIgY3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICB2YXIgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBtYXNrQ2FudmFzLndpZHRoLCBtYXNrQ2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgIHZhciBuZXdJbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CiAgICAgICAgICAgIHZhciB0b25lU3VtID0gMDsKICAgICAgICAgICAgdmFyIHRvbmVDbnQgPSAwOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkgewogICAgICAgICAgICAgIHZhciBhbHBoYSA9IGltYWdlRGF0YS5kYXRhW2kgKyAzXTsKCiAgICAgICAgICAgICAgaWYgKGFscGhhID4gMTI4KSB7CiAgICAgICAgICAgICAgICB2YXIgdG9uZSA9IGltYWdlRGF0YS5kYXRhW2ldICsgaW1hZ2VEYXRhLmRhdGFbaSArIDFdICsgaW1hZ2VEYXRhLmRhdGFbaSArIDJdOwogICAgICAgICAgICAgICAgdG9uZVN1bSArPSB0b25lOwogICAgICAgICAgICAgICAgKyt0b25lQ250OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRocmVzaG9sZCA9IHRvbmVTdW0gLyB0b25lQ250OwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkgewogICAgICAgICAgICAgIHZhciB0b25lID0gaW1hZ2VEYXRhLmRhdGFbaV0gKyBpbWFnZURhdGEuZGF0YVtpICsgMV0gKyBpbWFnZURhdGEuZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgdmFyIGFscGhhID0gaW1hZ2VEYXRhLmRhdGFbaSArIDNdOwoKICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAxMjggfHwgdG9uZSA+IHRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgLy8gQXJlYSBub3QgdG8gZHJhdwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaV0gPSAwOwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDFdID0gMDsKICAgICAgICAgICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2kgKyAyXSA9IDA7CiAgICAgICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgM10gPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBcmVhIHRvIGRyYXcKICAgICAgICAgICAgICAgIC8vIFRoZSBjb2xvciBtdXN0IGJlIHNhbWUgd2l0aCBiYWNrZ3JvdW5kQ29sb3IKICAgICAgICAgICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ldID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDFdID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDJdID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDNdID0gMjU1OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShuZXdJbWFnZURhdGEsIDAsIDApOwogICAgICAgICAgfQoKICAgICAgICAgIGV4dGVybmFsX2VjaGFydHNfLnJlZ2lzdGVyTGF5b3V0KGZ1bmN0aW9uIChlY01vZGVsLCBhcGkpIHsKICAgICAgICAgICAgZWNNb2RlbC5lYWNoU2VyaWVzQnlUeXBlKCd3b3JkQ2xvdWQnLCBmdW5jdGlvbiAoc2VyaWVzTW9kZWwpIHsKICAgICAgICAgICAgICB2YXIgZ3JpZFJlY3QgPSBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuZ2V0TGF5b3V0UmVjdChzZXJpZXNNb2RlbC5nZXRCb3hMYXlvdXRQYXJhbXMoKSwgewogICAgICAgICAgICAgICAgd2lkdGg6IGFwaS5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBhcGkuZ2V0SGVpZ2h0KCkKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB2YXIgZGF0YSA9IHNlcmllc01vZGVsLmdldERhdGEoKTsKICAgICAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gZ3JpZFJlY3Qud2lkdGg7CiAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGdyaWRSZWN0LmhlaWdodDsKICAgICAgICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgICAgdmFyIG1hc2tJbWFnZSA9IHNlcmllc01vZGVsLmdldCgnbWFza0ltYWdlJyk7CgogICAgICAgICAgICAgIGlmIChtYXNrSW1hZ2UpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0ltYWdlLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICB1cGRhdGVDYW52YXNNYXNrKGNhbnZhcyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgbWFzayBpbWFnZScpOwogICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgc2l6ZVJhbmdlID0gc2VyaWVzTW9kZWwuZ2V0KCdzaXplUmFuZ2UnKTsKICAgICAgICAgICAgICB2YXIgcm90YXRpb25SYW5nZSA9IHNlcmllc01vZGVsLmdldCgncm90YXRpb25SYW5nZScpOwogICAgICAgICAgICAgIHZhciB2YWx1ZUV4dGVudCA9IGRhdGEuZ2V0RGF0YUV4dGVudCgndmFsdWUnKTsKICAgICAgICAgICAgICB2YXIgREVHUkVFX1RPX1JBRCA9IE1hdGguUEkgLyAxODA7CiAgICAgICAgICAgICAgdmFyIGdyaWRTaXplID0gc2VyaWVzTW9kZWwuZ2V0KCdncmlkU2l6ZScpOwogICAgICAgICAgICAgIGxheW91dChjYW52YXMsIHsKICAgICAgICAgICAgICAgIGxpc3Q6IGRhdGEubWFwQXJyYXkoJ3ZhbHVlJywgZnVuY3Rpb24gKHZhbHVlLCBpZHgpIHsKICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1Nb2RlbCA9IGRhdGEuZ2V0SXRlbU1vZGVsKGlkeCk7CiAgICAgICAgICAgICAgICAgIHJldHVybiBbZGF0YS5nZXROYW1lKGlkeCksIGl0ZW1Nb2RlbC5nZXQoJ3RleHRTdHlsZS5mb250U2l6ZScsIHRydWUpIHx8IGV4dGVybmFsX2VjaGFydHNfLm51bWJlci5saW5lYXJNYXAodmFsdWUsIHZhbHVlRXh0ZW50LCBzaXplUmFuZ2UpLCBpZHhdOwogICAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAvLyBTb3J0IGZyb20gbGFyZ2UgdG8gc21hbGwgaW4gY2FzZSB0aGVyZSBpcyBubyBtb3JlIHJvb20gZm9yIG1vcmUgd29yZHMKICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbMV0gLSBhWzFdOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBzZXJpZXNNb2RlbC5nZXQoJ3RleHRTdHlsZS5mb250RmFtaWx5JykgfHwgc2VyaWVzTW9kZWwuZ2V0KCdlbXBoYXNpcy50ZXh0U3R5bGUuZm9udEZhbWlseScpIHx8IGVjTW9kZWwuZ2V0KCd0ZXh0U3R5bGUuZm9udEZhbWlseScpLAogICAgICAgICAgICAgICAgZm9udFdlaWdodDogc2VyaWVzTW9kZWwuZ2V0KCd0ZXh0U3R5bGUuZm9udFdlaWdodCcpIHx8IHNlcmllc01vZGVsLmdldCgnZW1waGFzaXMudGV4dFN0eWxlLmZvbnRXZWlnaHQnKSB8fCBlY01vZGVsLmdldCgndGV4dFN0eWxlLmZvbnRXZWlnaHQnKSwKICAgICAgICAgICAgICAgIGdyaWRTaXplOiBncmlkU2l6ZSwKICAgICAgICAgICAgICAgIGVsbGlwdGljaXR5OiBncmlkUmVjdC5oZWlnaHQgLyBncmlkUmVjdC53aWR0aCwKICAgICAgICAgICAgICAgIG1pblJvdGF0aW9uOiByb3RhdGlvblJhbmdlWzBdICogREVHUkVFX1RPX1JBRCwKICAgICAgICAgICAgICAgIG1heFJvdGF0aW9uOiByb3RhdGlvblJhbmdlWzFdICogREVHUkVFX1RPX1JBRCwKICAgICAgICAgICAgICAgIGNsZWFyQ2FudmFzOiAhbWFza0ltYWdlLAogICAgICAgICAgICAgICAgcm90YXRlUmF0aW86IDEsCiAgICAgICAgICAgICAgICByb3RhdGlvblN0ZXA6IHNlcmllc01vZGVsLmdldCgncm90YXRpb25TdGVwJykgKiBERUdSRUVfVE9fUkFELAogICAgICAgICAgICAgICAgZHJhd091dE9mQm91bmQ6IHNlcmllc01vZGVsLmdldCgnZHJhd091dE9mQm91bmQnKSwKICAgICAgICAgICAgICAgIGxheW91dEFuaW1hdGlvbjogc2VyaWVzTW9kZWwuZ2V0KCdsYXlvdXRBbmltYXRpb24nKSwKICAgICAgICAgICAgICAgIHNodWZmbGU6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hhcGU6IHNlcmllc01vZGVsLmdldCgnc2hhcGUnKQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBmdW5jdGlvbiBvbldvcmRDbG91ZERyYXduKGUpIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gZS5kZXRhaWwuaXRlbTsKCiAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwuZHJhd24gJiYgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2Uub25kcmF3KSB7CiAgICAgICAgICAgICAgICAgIGUuZGV0YWlsLmRyYXduLmd4ICs9IGdyaWRSZWN0LnggLyBncmlkU2l6ZTsKICAgICAgICAgICAgICAgICAgZS5kZXRhaWwuZHJhd24uZ3kgKz0gZ3JpZFJlY3QueSAvIGdyaWRTaXplOwogICAgICAgICAgICAgICAgICBzZXJpZXNNb2RlbC5sYXlvdXRJbnN0YW5jZS5vbmRyYXcoaXRlbVswXSwgaXRlbVsxXSwgaXRlbVsyXSwgZS5kZXRhaWwuZHJhd24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZGRyYXduJywgb25Xb3JkQ2xvdWREcmF3bik7CgogICAgICAgICAgICAgIGlmIChzZXJpZXNNb2RlbC5sYXlvdXRJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgLy8gRGlzcG9zZSBwcmV2aW91cwogICAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2UuZGlzcG9zZSgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2UgPSB7CiAgICAgICAgICAgICAgICBvbmRyYXc6IG51bGwsCiAgICAgICAgICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3VkZHJhd24nLCBvbldvcmRDbG91ZERyYXduKTsgLy8gQWJvcnQKCiAgICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRkcmF3bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IHRvIGNhbmNsZSB0aGUgZXZlbnQgYW5kIHN0b3AgdGhlIGxvb3AKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5yZWdpc3RlclByZXByb2Nlc3NvcihmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgICAgIHZhciBzZXJpZXMgPSAob3B0aW9uIHx8IHt9KS5zZXJpZXM7CiAgICAgICAgICAgICFleHRlcm5hbF9lY2hhcnRzXy51dGlsLmlzQXJyYXkoc2VyaWVzKSAmJiAoc2VyaWVzID0gc2VyaWVzID8gW3Nlcmllc10gOiBbXSk7CiAgICAgICAgICAgIHZhciBjb21wYXRzID0gWydzaGFkb3dDb2xvcicsICdzaGFkb3dCbHVyJywgJ3NoYWRvd09mZnNldFgnLCAnc2hhZG93T2Zmc2V0WSddOwogICAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy51dGlsLmVhY2goc2VyaWVzLCBmdW5jdGlvbiAoc2VyaWVzSXRlbSkgewogICAgICAgICAgICAgIGlmIChzZXJpZXNJdGVtICYmIHNlcmllc0l0ZW0udHlwZSA9PT0gJ3dvcmRDbG91ZCcpIHsKICAgICAgICAgICAgICAgIHZhciB0ZXh0U3R5bGUgPSBzZXJpZXNJdGVtLnRleHRTdHlsZSB8fCB7fTsKICAgICAgICAgICAgICAgIGNvbXBhdFRleHRTdHlsZSh0ZXh0U3R5bGUubm9ybWFsKTsKICAgICAgICAgICAgICAgIGNvbXBhdFRleHRTdHlsZSh0ZXh0U3R5bGUuZW1waGFzaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBmdW5jdGlvbiBjb21wYXRUZXh0U3R5bGUodGV4dFN0eWxlKSB7CiAgICAgICAgICAgICAgdGV4dFN0eWxlICYmIGV4dGVybmFsX2VjaGFydHNfLnV0aWwuZWFjaChjb21wYXRzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAodGV4dFN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlWyd0ZXh0JyArIGV4dGVybmFsX2VjaGFydHNfLmZvcm1hdC5jYXBpdGFsRmlyc3Qoa2V5KV0gPSB0ZXh0U3R5bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vaW5kZXguanMKCiAgICAgICAgICAvKioqLwogICAgICAgIH0sCgogICAgICAgIC8qKiovCiAgICAgICAgImVjaGFydHMvbGliL2VjaGFydHMiOgogICAgICAgIC8qISoqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgICAgICAgICAhKioqIGV4dGVybmFsICJlY2hhcnRzIiAqKiohCiAgICAgICAgICBcKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgIC8qKiovCiAgICAgICAgZnVuY3Rpb24gZWNoYXJ0c0xpYkVjaGFydHMobW9kdWxlKSB7CiAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfZWNoYXJ0c19saWJfZWNoYXJ0c19fOwogICAgICAgICAgLyoqKi8KICAgICAgICB9CiAgICAgICAgLyoqKioqKi8KCiAgICAgIH07CiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKioqKioqLwogICAgICAvLyBUaGUgbW9kdWxlIGNhY2hlCgogICAgICAvKioqKioqLwoKICAgICAgdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwogICAgICAvKioqKioqLwoKICAgICAgLyoqKioqKi8KICAgICAgLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KCiAgICAgIC8qKioqKiovCgogICAgICBmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CiAgICAgICAgLyoqKioqKi8KICAgICAgICAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKCiAgICAgICAgLyoqKioqKi8KICAgICAgICBpZiAoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkgewogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7CiAgICAgICAgICAvKioqKioqLwogICAgICAgIH0KICAgICAgICAvKioqKioqLwogICAgICAgIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCgogICAgICAgIC8qKioqKiovCgoKICAgICAgICB2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHsKICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAvLyBubyBtb2R1bGUuaWQgbmVlZGVkCgogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkCgogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAvKioqKioqLwoKICAgICAgICB9OwogICAgICAgIC8qKioqKiovCgogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCgogICAgICAgIC8qKioqKiovCgogICAgICAgIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwogICAgICAgIC8qKioqKiovCgogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKCiAgICAgICAgLyoqKioqKi8KCgogICAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0czsKICAgICAgICAvKioqKioqLwogICAgICB9CiAgICAgIC8qKioqKiovCgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLyoqKioqKi8KCiAgICAgIC8qIHdlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QgKi8KCiAgICAgIC8qKioqKiovCgoKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioqKioqLwogICAgICAgIC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKCiAgICAgICAgLyoqKioqKi8KICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbiAoZXhwb3J0cykgewogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgewogICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIH0KICAgICAgICAgIC8qKioqKiovCgoKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsKICAgICAgICAgICAgdmFsdWU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgLyoqKioqKi8KICAgICAgICB9OwogICAgICAgIC8qKioqKiovCgogICAgICB9KSgpOwogICAgICAvKioqKioqLwoKICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgIC8qKioqKiovCiAgICAgIC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkCgogICAgICAvKioqKioqLwogICAgICAvLyBzdGFydHVwCgogICAgICAvKioqKioqLwogICAgICAvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKCiAgICAgIC8qKioqKiovCgoKICAgICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4vaW5kZXguanMiKTsKICAgICAgLyoqKioqKi8KICAgIH0oKQogICk7Cn0pOw=="},{"version":3,"sources":["F:/workspace/gcy/RK-html/RK-project/ruoyi-ui/src/views/dashboard/mixins/echarts-wordcloud.js"],"names":["webpackUniversalModuleDefinition","root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__","__webpack_modules__","__unused_webpack_module","__webpack_exports__","__webpack_require__","r","external_echarts_","extendSeriesModel","type","visualStyleAccessPath","visualStyleMapper","model","fill","get","visualDrawType","optionUpdated","option","gridSize","Math","max","floor","getInitialData","ecModel","dimensions","helper","createDimensions","data","coordDimensions","list","List","initData","defaultOption","maskImage","shape","left","top","width","height","sizeRange","rotationRange","rotationStep","drawOutOfBound","textStyle","fontWeight","extendChartView","render","seriesModel","api","group","removeAll","getData","layoutInstance","ondraw","text","size","dataIdx","drawn","itemModel","getItemModel","textStyleModel","getModel","textEl","graphic","Text","style","createTextStyle","scaleX","info","mu","scaleY","x","gx","gw","y","gy","gh","rotation","rot","setStyle","fillTextOffsetX","fillTextOffsetY","verticalAlign","getItemVisual","fontSize","add","setItemGraphicEl","ensureState","state","enableHoverEmphasis","stateTransition","duration","easing","__highDownDispatcher","_model","remove","dispose","window","setImmediate","setupSetImmediate","msSetImmediate","webkitSetImmediate","mozSetImmediate","oSetImmediate","setupSetZeroTimeout","postMessage","addEventListener","callbacks","undefined","message","setZeroTimeout","callback","id","length","push","toString","setZeroTimeoutMessage","evt","substr","stopImmediatePropagation","parseInt","clearImmediate","clearZeroTimeout","setImmediateFallback","fn","setTimeout","setupClearImmediate","msClearImmediate","webkitClearImmediate","mozClearImmediate","oClearImmediate","clearImmediateFallback","timer","clearTimeout","isSupported","canvas","document","createElement","getContext","ctx","getImageData","fillText","Array","prototype","some","minFontSize","getMinFontSize","hanWidth","mWidth","font","measureText","shuffleArray","arr","j","i","random","WordCloud","elements","options","isArray","forEach","el","getElementById","tagName","appendChild","settings","fontFamily","color","minSize","weightFactor","clearCanvas","backgroundColor","origin","drawMask","maskColor","maskGapWidth","layoutAnimation","wait","abortThreshold","abort","noop","minRotation","PI","maxRotation","shuffle","rotateRatio","ellipticity","classes","hover","click","key","factor","pt","shapeCardioid","theta","sin","shapeSquare","thetaPrime","cos","shapeTriangle","sqrt","shapePentagon","shapeStar","g","maskRectWidth","abs","min","grid","ngx","ngy","center","maxRadius","escapeTime","getTextColor","random_hsl_color","toFixed","getRandomDarkColor","getRandomLightColor","getTextClasses","interactive","infoGrid","hovered","getInfoGridFromMouseTouchEvent","currentTarget","rect","getBoundingClientRect","clientX","clientY","touches","eventX","eventY","wordcloudhover","item","dimension","wordcloudclick","preventDefault","pointsAtRadius","getPointsAtRadius","radius","T","t","points","rx","exceedTime","Date","getTime","getRotateDeg","round","getTextInfo","word","weight","rotateDeg","debug","calculateScaleFactor","fcanvas","fctx","willReadFrequently","fw","fh","boxWidth","boxHeight","fgw","ceil","fgh","cgh","cgw","setAttribute","body","save","scale","translate","rotate","fillStyle","textBaseline","imageData","strokeRect","restore","occupied","bounds","singleGridLoop","fillRect","fillTextWidth","fillTextHeight","canFitText","px","py","drawText","distance","attributes","w","h","span","transformRule","styleRules","textContent","cssProp","attribute","className","fillGridAt","updateGrid","putWord","tryToPutWordAtPoint","gxy","concat","res","sendEvent","cancelable","detail","createEvent","initCustomEvent","dispatchEvent","start","clearRect","position","bctx","bgPixel","e","webkitTapHighlightColor","stopInteraction","removeEventListener","loopingFunction","stoppingFunction","layouting","cb","listener","anotherWordCloudStart","loop","canceled","layout","Error","updateCanvasMask","maskCanvas","newImageData","createImageData","toneSum","toneCnt","alpha","tone","threshold","putImageData","registerLayout","eachSeriesByType","gridRect","getLayoutRect","getBoxLayoutParams","getWidth","getHeight","drawImage","console","error","valueExtent","getDataExtent","DEGREE_TO_RAD","mapArray","value","idx","getName","number","linearMap","sort","a","b","onWordCloudDrawn","registerPreprocessor","series","util","compats","each","seriesItem","compatTextStyle","normal","emphasis","hasOwnProperty","format","capitalFirst","__webpack_module_cache__","moduleId","Symbol","toStringTag","Object","defineProperty"],"mappings":"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","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"echarts\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"echarts\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"echarts-wordcloud\"] = factory(require(\"echarts\"));\n\telse\n\t\troot[\"echarts-wordcloud\"] = factory(root[\"echarts\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__) {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./index.js\":\n/*!******************************!*\\\n !*** ./index.js + 4 modules ***!\n \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"echarts\"\nvar external_echarts_ = __webpack_require__(\"echarts/lib/echarts\");\n// CONCATENATED MODULE: ./src/WordCloudSeries.js\n external_echarts_.extendSeriesModel({\n\n type: 'series.wordCloud',\n\n visualStyleAccessPath: 'textStyle',\n visualStyleMapper: function (model) {\n return {\n fill: model.get('color')\n };\n },\n visualDrawType: 'fill',\n\n optionUpdated: function () {\n var option = this.option;\n option.gridSize = Math.max(Math.floor(option.gridSize), 4);\n },\n\n getInitialData: function (option, ecModel) {\n var dimensions = external_echarts_.helper.createDimensions(option.data, {\n coordDimensions: ['value']\n });\n var list = new external_echarts_.List(dimensions, this);\n list.initData(option.data);\n return list;\n },\n\n // Most of options are from https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md\n defaultOption: {\n\n maskImage: null,\n\n // Shape can be 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star'\n shape: 'circle',\n\n left: 'center',\n\n top: 'center',\n\n width: '70%',\n\n height: '80%',\n\n sizeRange: [12, 60],\n\n rotationRange: [-90, 90],\n\n rotationStep: 45,\n\n gridSize: 8,\n\n drawOutOfBound: false,\n\n textStyle: {\n fontWeight: 'normal'\n }\n }\n});\n\n// CONCATENATED MODULE: ./src/WordCloudView.js\n external_echarts_.extendChartView({\n\n type: 'wordCloud',\n\n render: function (seriesModel, ecModel, api) {\n var group = this.group;\n group.removeAll();\n\n var data = seriesModel.getData();\n\n var gridSize = seriesModel.get('gridSize');\n\n seriesModel.layoutInstance.ondraw = function (text, size, dataIdx, drawn) {\n var itemModel = data.getItemModel(dataIdx);\n var textStyleModel = itemModel.getModel('textStyle');\n\n var textEl = new external_echarts_.graphic.Text({\n style: external_echarts_.helper.createTextStyle(textStyleModel),\n scaleX: 1 / drawn.info.mu,\n scaleY: 1 / drawn.info.mu,\n x: (drawn.gx + drawn.info.gw / 2) * gridSize,\n y: (drawn.gy + drawn.info.gh / 2) * gridSize,\n rotation: drawn.rot\n });\n textEl.setStyle({\n x: drawn.info.fillTextOffsetX,\n y: drawn.info.fillTextOffsetY + size * 0.5,\n text: text,\n verticalAlign: 'middle',\n fill: data.getItemVisual(dataIdx, 'style').fill,\n fontSize: size\n });\n\n group.add(textEl);\n\n data.setItemGraphicEl(dataIdx, textEl);\n\n textEl.ensureState('emphasis').style = external_echarts_.helper.createTextStyle(itemModel.getModel(['emphasis', 'textStyle']), {\n state: 'emphasis'\n });\n textEl.ensureState('blur').style = external_echarts_.helper.createTextStyle(itemModel.getModel(['blur', 'textStyle']), {\n state: 'blur'\n });\n\n external_echarts_.helper.enableHoverEmphasis(\n textEl,\n itemModel.get(['emphasis', 'focus']),\n itemModel.get(['emphasis', 'blurScope'])\n );\n\n textEl.stateTransition = {\n duration: seriesModel.get('animation') ? seriesModel.get(['stateAnimation', 'duration']) : 0,\n easing: seriesModel.get(['stateAnimation', 'easing'])\n };\n // TODO\n textEl.__highDownDispatcher = true;\n };\n\n this._model = seriesModel;\n },\n\n remove: function () {\n this.group.removeAll();\n\n this._model.layoutInstance.dispose();\n },\n\n dispose: function () {\n this._model.layoutInstance.dispose();\n }\n});\n\n// CONCATENATED MODULE: ./src/layout.js\n /*!\n * wordcloud2.js\n * http://timdream.org/wordcloud2.js/\n *\n * Copyright 2011 - 2013 Tim Chien\n * Released under the MIT license\n */\n\n\n\n// setImmediate\nif (!window.setImmediate) {\n window.setImmediate = (function setupSetImmediate() {\n return window.msSetImmediate ||\n window.webkitSetImmediate ||\n window.mozSetImmediate ||\n window.oSetImmediate ||\n (function setupSetZeroTimeout() {\n if (!window.postMessage || !window.addEventListener) {\n return null;\n }\n\n var callbacks = [undefined];\n var message = 'zero-timeout-message';\n\n // Like setTimeout, but only takes a function argument. There's\n // no time argument (always zero) and no arguments (you have to\n // use a closure).\n var setZeroTimeout = function setZeroTimeout(callback) {\n var id = callbacks.length;\n callbacks.push(callback);\n window.postMessage(message + id.toString(36), '*');\n\n return id;\n };\n\n window.addEventListener('message', function setZeroTimeoutMessage(evt) {\n // Skipping checking event source, retarded IE confused this window\n // object with another in the presence of iframe\n if (typeof evt.data !== 'string' ||\n evt.data.substr(0, message.length) !== message/* ||\n evt.source !== window */) {\n return;\n }\n\n evt.stopImmediatePropagation();\n\n var id = parseInt(evt.data.substr(message.length), 36);\n if (!callbacks[id]) {\n return;\n }\n\n callbacks[id]();\n callbacks[id] = undefined;\n }, true);\n\n /* specify clearImmediate() here since we need the scope */\n window.clearImmediate = function clearZeroTimeout(id) {\n if (!callbacks[id]) {\n return;\n }\n\n callbacks[id] = undefined;\n };\n\n return setZeroTimeout;\n })() ||\n // fallback\n function setImmediateFallback(fn) {\n window.setTimeout(fn, 0);\n };\n })();\n}\n\nif (!window.clearImmediate) {\n window.clearImmediate = (function setupClearImmediate() {\n return window.msClearImmediate ||\n window.webkitClearImmediate ||\n window.mozClearImmediate ||\n window.oClearImmediate ||\n // \"clearZeroTimeout\" is implement on the previous block ||\n // fallback\n function clearImmediateFallback(timer) {\n window.clearTimeout(timer);\n };\n })();\n}\n\n // Check if WordCloud can run on this browser\n var isSupported = (function isSupported() {\n var canvas = document.createElement('canvas');\n if (!canvas || !canvas.getContext) {\n return false;\n }\n\n var ctx = canvas.getContext('2d');\n if (!ctx.getImageData) {\n return false;\n }\n if (!ctx.fillText) {\n return false;\n }\n\n if (!Array.prototype.some) {\n return false;\n }\n if (!Array.prototype.push) {\n return false;\n }\n\n return true;\n }());\n\n // Find out if the browser impose minium font size by\n // drawing small texts on a canvas and measure it's width.\n var minFontSize = (function getMinFontSize() {\n if (!isSupported) {\n return;\n }\n\n var ctx = document.createElement('canvas').getContext('2d');\n\n // start from 20\n var size = 20;\n\n // two sizes to measure\n var hanWidth, mWidth;\n\n while (size) {\n ctx.font = size.toString(10) + 'px sans-serif';\n if ((ctx.measureText('\\uFF37').width === hanWidth) &&\n (ctx.measureText('m').width) === mWidth) {\n return (size + 1);\n }\n\n hanWidth = ctx.measureText('\\uFF37').width;\n mWidth = ctx.measureText('m').width;\n\n size--;\n }\n\n return 0;\n })();\n\n // Based on http://jsfromhell.com/array/shuffle\n var shuffleArray = function shuffleArray(arr) {\n for (var j, x, i = arr.length; i;\n j = Math.floor(Math.random() * i),\n x = arr[--i], arr[i] = arr[j],\n arr[j] = x) {}\n return arr;\n };\n\n var WordCloud = function WordCloud(elements, options) {\n if (!isSupported) {\n return;\n }\n\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n\n elements.forEach(function(el, i) {\n if (typeof el === 'string') {\n elements[i] = document.getElementById(el);\n if (!elements[i]) {\n throw 'The element id specified is not found.';\n }\n } else if (!el.tagName && !el.appendChild) {\n throw 'You must pass valid HTML elements, or ID of the element.';\n }\n });\n\n /* Default values to be overwritten by options object */\n var settings = {\n list: [],\n fontFamily: '\"Trebuchet MS\", \"Heiti TC\", \"微軟正黑體\", ' +\n '\"Arial Unicode MS\", \"Droid Fallback Sans\", sans-serif',\n fontWeight: 'normal',\n color: 'random-dark',\n minSize: 0, // 0 to disable\n weightFactor: 1,\n clearCanvas: true,\n backgroundColor: '#fff', // opaque white = rgba(255, 255, 255, 1)\n\n gridSize: 8,\n drawOutOfBound: false,\n origin: null,\n\n drawMask: false,\n maskColor: 'rgba(255,0,0,0.3)',\n maskGapWidth: 0.3,\n\n layoutAnimation: true,\n\n wait: 0,\n abortThreshold: 0, // disabled\n abort: function noop() {},\n\n minRotation: - Math.PI / 2,\n maxRotation: Math.PI / 2,\n rotationStep: 0.1,\n\n shuffle: true,\n rotateRatio: 0.1,\n\n shape: 'circle',\n ellipticity: 0.65,\n\n classes: null,\n\n hover: null,\n click: null\n };\n\n if (options) {\n for (var key in options) {\n if (key in settings) {\n settings[key] = options[key];\n }\n }\n }\n\n /* Convert weightFactor into a function */\n if (typeof settings.weightFactor !== 'function') {\n var factor = settings.weightFactor;\n settings.weightFactor = function weightFactor(pt) {\n return pt * factor; //in px\n };\n }\n\n /* Convert shape into a function */\n if (typeof settings.shape !== 'function') {\n switch (settings.shape) {\n case 'circle':\n /* falls through */\n default:\n // 'circle' is the default and a shortcut in the code loop.\n settings.shape = 'circle';\n break;\n\n case 'cardioid':\n settings.shape = function shapeCardioid(theta) {\n return 1 - Math.sin(theta);\n };\n break;\n\n /*\n To work out an X-gon, one has to calculate \"m\",\n where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0))\n http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28\n 2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29\n Copy the solution into polar equation r = 1/(cos(t') + m*sin(t'))\n where t' equals to mod(t, 2PI/X);\n */\n\n case 'diamond':\n case 'square':\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D\n // +0+..+2*PI\n settings.shape = function shapeSquare(theta) {\n var thetaPrime = theta % (2 * Math.PI / 4);\n return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime));\n };\n break;\n\n case 'triangle-forward':\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29\n // %29%29%2C+t+%3D+0+..+2*PI\n settings.shape = function shapeTriangle(theta) {\n var thetaPrime = theta % (2 * Math.PI / 3);\n return 1 / (Math.cos(thetaPrime) +\n Math.sqrt(3) * Math.sin(thetaPrime));\n };\n break;\n\n case 'triangle':\n case 'triangle-upright':\n settings.shape = function shapeTriangle(theta) {\n var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3);\n return 1 / (Math.cos(thetaPrime) +\n Math.sqrt(3) * Math.sin(thetaPrime));\n };\n break;\n\n case 'pentagon':\n settings.shape = function shapePentagon(theta) {\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5);\n return 1 / (Math.cos(thetaPrime) +\n 0.726543 * Math.sin(thetaPrime));\n };\n break;\n\n case 'star':\n settings.shape = function shapeStar(theta) {\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10);\n if ((theta + 0.955) % (2 * Math.PI / 5) - (2 * Math.PI / 10) >= 0) {\n return 1 / (Math.cos((2 * Math.PI / 10) - thetaPrime) +\n 3.07768 * Math.sin((2 * Math.PI / 10) - thetaPrime));\n } else {\n return 1 / (Math.cos(thetaPrime) +\n 3.07768 * Math.sin(thetaPrime));\n }\n };\n break;\n }\n }\n\n /* Make sure gridSize is a whole number and is not smaller than 4px */\n settings.gridSize = Math.max(Math.floor(settings.gridSize), 4);\n\n /* shorthand */\n var g = settings.gridSize;\n var maskRectWidth = g - settings.maskGapWidth;\n\n /* normalize rotation settings */\n var rotationRange = Math.abs(settings.maxRotation - settings.minRotation);\n var minRotation = Math.min(settings.maxRotation, settings.minRotation);\n var rotationStep = settings.rotationStep;\n\n /* information/object available to all functions, set when start() */\n var grid, // 2d array containing filling information\n ngx, ngy, // width and height of the grid\n center, // position of the center of the cloud\n maxRadius;\n\n /* timestamp for measuring each putWord() action */\n var escapeTime;\n\n /* function for getting the color of the text */\n var getTextColor;\n function random_hsl_color(min, max) {\n return 'hsl(' +\n (Math.random() * 360).toFixed() + ',' +\n (Math.random() * 30 + 70).toFixed() + '%,' +\n (Math.random() * (max - min) + min).toFixed() + '%)';\n }\n switch (settings.color) {\n case 'random-dark':\n getTextColor = function getRandomDarkColor() {\n return random_hsl_color(10, 50);\n };\n break;\n\n case 'random-light':\n getTextColor = function getRandomLightColor() {\n return random_hsl_color(50, 90);\n };\n break;\n\n default:\n if (typeof settings.color === 'function') {\n getTextColor = settings.color;\n }\n break;\n }\n\n /* function for getting the classes of the text */\n var getTextClasses = null;\n if (typeof settings.classes === 'function') {\n getTextClasses = settings.classes;\n }\n\n /* Interactive */\n var interactive = false;\n var infoGrid = [];\n var hovered;\n\n var getInfoGridFromMouseTouchEvent =\n function getInfoGridFromMouseTouchEvent(evt) {\n var canvas = evt.currentTarget;\n var rect = canvas.getBoundingClientRect();\n var clientX;\n var clientY;\n /** Detect if touches are available */\n if (evt.touches) {\n clientX = evt.touches[0].clientX;\n clientY = evt.touches[0].clientY;\n } else {\n clientX = evt.clientX;\n clientY = evt.clientY;\n }\n var eventX = clientX - rect.left;\n var eventY = clientY - rect.top;\n\n var x = Math.floor(eventX * ((canvas.width / rect.width) || 1) / g);\n var y = Math.floor(eventY * ((canvas.height / rect.height) || 1) / g);\n\n return infoGrid[x][y];\n };\n\n var wordcloudhover = function wordcloudhover(evt) {\n var info = getInfoGridFromMouseTouchEvent(evt);\n\n if (hovered === info) {\n return;\n }\n\n hovered = info;\n if (!info) {\n settings.hover(undefined, undefined, evt);\n\n return;\n }\n\n settings.hover(info.item, info.dimension, evt);\n\n };\n\n var wordcloudclick = function wordcloudclick(evt) {\n var info = getInfoGridFromMouseTouchEvent(evt);\n if (!info) {\n return;\n }\n\n settings.click(info.item, info.dimension, evt);\n evt.preventDefault();\n };\n\n /* Get points on the grid for a given radius away from the center */\n var pointsAtRadius = [];\n var getPointsAtRadius = function getPointsAtRadius(radius) {\n if (pointsAtRadius[radius]) {\n return pointsAtRadius[radius];\n }\n\n // Look for these number of points on each radius\n var T = radius * 8;\n\n // Getting all the points at this radius\n var t = T;\n var points = [];\n\n if (radius === 0) {\n points.push([center[0], center[1], 0]);\n }\n\n while (t--) {\n // distort the radius to put the cloud in shape\n var rx = 1;\n if (settings.shape !== 'circle') {\n rx = settings.shape(t / T * 2 * Math.PI); // 0 to 1\n }\n\n // Push [x, y, t]; t is used solely for getTextColor()\n points.push([\n center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI),\n center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) *\n settings.ellipticity,\n t / T * 2 * Math.PI]);\n }\n\n pointsAtRadius[radius] = points;\n return points;\n };\n\n /* Return true if we had spent too much time */\n var exceedTime = function exceedTime() {\n return ((settings.abortThreshold > 0) &&\n ((new Date()).getTime() - escapeTime > settings.abortThreshold));\n };\n\n /* Get the deg of rotation according to settings, and luck. */\n var getRotateDeg = function getRotateDeg() {\n if (settings.rotateRatio === 0) {\n return 0;\n }\n\n if (Math.random() > settings.rotateRatio) {\n return 0;\n }\n\n if (rotationRange === 0) {\n return minRotation;\n }\n\n return minRotation + Math.round(Math.random() * rotationRange / rotationStep) * rotationStep;\n };\n\n var getTextInfo = function getTextInfo(word, weight, rotateDeg) {\n // calculate the acutal font size\n // fontSize === 0 means weightFactor function wants the text skipped,\n // and size < minSize means we cannot draw the text.\n var debug = false;\n var fontSize = settings.weightFactor(weight);\n if (fontSize <= settings.minSize) {\n return false;\n }\n\n // Scale factor here is to make sure fillText is not limited by\n // the minium font size set by browser.\n // It will always be 1 or 2n.\n var mu = 1;\n if (fontSize < minFontSize) {\n mu = (function calculateScaleFactor() {\n var mu = 2;\n while (mu * fontSize < minFontSize) {\n mu += 2;\n }\n return mu;\n })();\n }\n\n var fcanvas = document.createElement('canvas');\n var fctx = fcanvas.getContext('2d', { willReadFrequently: true });\n\n fctx.font = settings.fontWeight + ' ' +\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n // Estimate the dimension of the text with measureText().\n var fw = fctx.measureText(word).width / mu;\n var fh = Math.max(fontSize * mu,\n fctx.measureText('m').width,\n fctx.measureText('\\uFF37').width) / mu;\n\n // Create a boundary box that is larger than our estimates,\n // so text don't get cut of (it sill might)\n var boxWidth = fw + fh * 2;\n var boxHeight = fh * 3;\n var fgw = Math.ceil(boxWidth / g);\n var fgh = Math.ceil(boxHeight / g);\n boxWidth = fgw * g;\n boxHeight = fgh * g;\n\n // Calculate the proper offsets to make the text centered at\n // the preferred position.\n\n // This is simply half of the width.\n var fillTextOffsetX = - fw / 2;\n // Instead of moving the box to the exact middle of the preferred\n // position, for Y-offset we move 0.4 instead, so Latin alphabets look\n // vertical centered.\n var fillTextOffsetY = - fh * 0.4;\n\n // Calculate the actual dimension of the canvas, considering the rotation.\n var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) +\n boxHeight * Math.abs(Math.cos(rotateDeg))) / g);\n var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) +\n boxHeight * Math.abs(Math.sin(rotateDeg))) / g);\n var width = cgw * g;\n var height = cgh * g;\n\n fcanvas.setAttribute('width', width);\n fcanvas.setAttribute('height', height);\n\n if (debug) {\n // Attach fcanvas to the DOM\n document.body.appendChild(fcanvas);\n // Save it's state so that we could restore and draw the grid correctly.\n fctx.save();\n }\n\n // Scale the canvas with |mu|.\n fctx.scale(1 / mu, 1 / mu);\n fctx.translate(width * mu / 2, height * mu / 2);\n fctx.rotate(- rotateDeg);\n\n // Once the width/height is set, ctx info will be reset.\n // Set it again here.\n fctx.font = settings.fontWeight + ' ' +\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n // Fill the text into the fcanvas.\n // XXX: We cannot because textBaseline = 'top' here because\n // Firefox and Chrome uses different default line-height for canvas.\n // Please read https://bugzil.la/737852#c6.\n // Here, we use textBaseline = 'middle' and draw the text at exactly\n // 0.5 * fontSize lower.\n fctx.fillStyle = '#000';\n fctx.textBaseline = 'middle';\n fctx.fillText(word, fillTextOffsetX * mu,\n (fillTextOffsetY + fontSize * 0.5) * mu);\n\n // Get the pixels of the text\n var imageData = fctx.getImageData(0, 0, width, height).data;\n\n if (exceedTime()) {\n return false;\n }\n\n if (debug) {\n // Draw the box of the original estimation\n fctx.strokeRect(fillTextOffsetX * mu,\n fillTextOffsetY, fw * mu, fh * mu);\n fctx.restore();\n }\n\n // Read the pixels and save the information to the occupied array\n var occupied = [];\n var gx = cgw, gy, x, y;\n var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2];\n while (gx--) {\n gy = cgh;\n while (gy--) {\n y = g;\n singleGridLoop: {\n while (y--) {\n x = g;\n while (x--) {\n if (imageData[((gy * g + y) * width +\n (gx * g + x)) * 4 + 3]) {\n occupied.push([gx, gy]);\n\n if (gx < bounds[3]) {\n bounds[3] = gx;\n }\n if (gx > bounds[1]) {\n bounds[1] = gx;\n }\n if (gy < bounds[0]) {\n bounds[0] = gy;\n }\n if (gy > bounds[2]) {\n bounds[2] = gy;\n }\n\n if (debug) {\n fctx.fillStyle = 'rgba(255, 0, 0, 0.5)';\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n }\n break singleGridLoop;\n }\n }\n }\n if (debug) {\n fctx.fillStyle = 'rgba(0, 0, 255, 0.5)';\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n }\n }\n }\n }\n\n if (debug) {\n fctx.fillStyle = 'rgba(0, 255, 0, 0.5)';\n fctx.fillRect(bounds[3] * g,\n bounds[0] * g,\n (bounds[1] - bounds[3] + 1) * g,\n (bounds[2] - bounds[0] + 1) * g);\n }\n\n // Return information needed to create the text on the real canvas\n return {\n mu: mu,\n occupied: occupied,\n bounds: bounds,\n gw: cgw,\n gh: cgh,\n fillTextOffsetX: fillTextOffsetX,\n fillTextOffsetY: fillTextOffsetY,\n fillTextWidth: fw,\n fillTextHeight: fh,\n fontSize: fontSize\n };\n };\n\n /* Determine if there is room available in the given dimension */\n var canFitText = function canFitText(gx, gy, gw, gh, occupied) {\n // Go through the occupied points,\n // return false if the space is not available.\n var i = occupied.length;\n while (i--) {\n var px = gx + occupied[i][0];\n var py = gy + occupied[i][1];\n\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n if (!settings.drawOutOfBound) {\n return false;\n }\n continue;\n }\n\n if (!grid[px][py]) {\n return false;\n }\n }\n return true;\n };\n\n /* Actually draw the text on the grid */\n var drawText = function drawText(gx, gy, info, word, weight,\n distance, theta, rotateDeg, attributes) {\n\n var fontSize = info.fontSize;\n var color;\n if (getTextColor) {\n color = getTextColor(word, weight, fontSize, distance, theta);\n } else {\n color = settings.color;\n }\n\n var classes;\n if (getTextClasses) {\n classes = getTextClasses(word, weight, fontSize, distance, theta);\n } else {\n classes = settings.classes;\n }\n\n var dimension;\n var bounds = info.bounds;\n dimension = {\n x: (gx + bounds[3]) * g,\n y: (gy + bounds[0]) * g,\n w: (bounds[1] - bounds[3] + 1) * g,\n h: (bounds[2] - bounds[0] + 1) * g\n };\n\n elements.forEach(function(el) {\n if (el.getContext) {\n var ctx = el.getContext('2d');\n var mu = info.mu;\n\n // Save the current state before messing it\n ctx.save();\n ctx.scale(1 / mu, 1 / mu);\n\n ctx.font = settings.fontWeight + ' ' +\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n ctx.fillStyle = color;\n\n // Translate the canvas position to the origin coordinate of where\n // the text should be put.\n ctx.translate((gx + info.gw / 2) * g * mu,\n (gy + info.gh / 2) * g * mu);\n\n if (rotateDeg !== 0) {\n ctx.rotate(- rotateDeg);\n }\n\n // Finally, fill the text.\n\n // XXX: We cannot because textBaseline = 'top' here because\n // Firefox and Chrome uses different default line-height for canvas.\n // Please read https://bugzil.la/737852#c6.\n // Here, we use textBaseline = 'middle' and draw the text at exactly\n // 0.5 * fontSize lower.\n ctx.textBaseline = 'middle';\n ctx.fillText(word, info.fillTextOffsetX * mu,\n (info.fillTextOffsetY + fontSize * 0.5) * mu);\n\n // The below box is always matches how <span>s are positioned\n /* ctx.strokeRect(info.fillTextOffsetX, info.fillTextOffsetY,\n info.fillTextWidth, info.fillTextHeight); */\n\n // Restore the state.\n ctx.restore();\n } else {\n // drawText on DIV element\n var span = document.createElement('span');\n var transformRule = '';\n transformRule = 'rotate(' + (- rotateDeg / Math.PI * 180) + 'deg) ';\n if (info.mu !== 1) {\n transformRule +=\n 'translateX(-' + (info.fillTextWidth / 4) + 'px) ' +\n 'scale(' + (1 / info.mu) + ')';\n }\n var styleRules = {\n 'position': 'absolute',\n 'display': 'block',\n 'font': settings.fontWeight + ' ' +\n (fontSize * info.mu) + 'px ' + settings.fontFamily,\n 'left': ((gx + info.gw / 2) * g + info.fillTextOffsetX) + 'px',\n 'top': ((gy + info.gh / 2) * g + info.fillTextOffsetY) + 'px',\n 'width': info.fillTextWidth + 'px',\n 'height': info.fillTextHeight + 'px',\n 'lineHeight': fontSize + 'px',\n 'whiteSpace': 'nowrap',\n 'transform': transformRule,\n 'webkitTransform': transformRule,\n 'msTransform': transformRule,\n 'transformOrigin': '50% 40%',\n 'webkitTransformOrigin': '50% 40%',\n 'msTransformOrigin': '50% 40%'\n };\n if (color) {\n styleRules.color = color;\n }\n span.textContent = word;\n for (var cssProp in styleRules) {\n span.style[cssProp] = styleRules[cssProp];\n }\n if (attributes) {\n for (var attribute in attributes) {\n span.setAttribute(attribute, attributes[attribute]);\n }\n }\n if (classes) {\n span.className += classes;\n }\n el.appendChild(span);\n }\n });\n };\n\n /* Help function to updateGrid */\n var fillGridAt = function fillGridAt(x, y, drawMask, dimension, item) {\n if (x >= ngx || y >= ngy || x < 0 || y < 0) {\n return;\n }\n\n grid[x][y] = false;\n\n if (drawMask) {\n var ctx = elements[0].getContext('2d');\n ctx.fillRect(x * g, y * g, maskRectWidth, maskRectWidth);\n }\n\n if (interactive) {\n infoGrid[x][y] = { item: item, dimension: dimension };\n }\n };\n\n /* Update the filling information of the given space with occupied points.\n Draw the mask on the canvas if necessary. */\n var updateGrid = function updateGrid(gx, gy, gw, gh, info, item) {\n var occupied = info.occupied;\n var drawMask = settings.drawMask;\n var ctx;\n if (drawMask) {\n ctx = elements[0].getContext('2d');\n ctx.save();\n ctx.fillStyle = settings.maskColor;\n }\n\n var dimension;\n if (interactive) {\n var bounds = info.bounds;\n dimension = {\n x: (gx + bounds[3]) * g,\n y: (gy + bounds[0]) * g,\n w: (bounds[1] - bounds[3] + 1) * g,\n h: (bounds[2] - bounds[0] + 1) * g\n };\n }\n\n var i = occupied.length;\n while (i--) {\n var px = gx + occupied[i][0];\n var py = gy + occupied[i][1];\n\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n continue;\n }\n\n fillGridAt(px, py, drawMask, dimension, item);\n }\n\n if (drawMask) {\n ctx.restore();\n }\n };\n\n /* putWord() processes each item on the list,\n calculate it's size and determine it's position, and actually\n put it on the canvas. */\n var putWord = function putWord(item) {\n var word, weight, attributes;\n if (Array.isArray(item)) {\n word = item[0];\n weight = item[1];\n } else {\n word = item.word;\n weight = item.weight;\n attributes = item.attributes;\n }\n var rotateDeg = getRotateDeg();\n\n // get info needed to put the text onto the canvas\n var info = getTextInfo(word, weight, rotateDeg);\n\n // not getting the info means we shouldn't be drawing this one.\n if (!info) {\n return false;\n }\n\n if (exceedTime()) {\n return false;\n }\n\n // If drawOutOfBound is set to false,\n // skip the loop if we have already know the bounding box of\n // word is larger than the canvas.\n if (!settings.drawOutOfBound) {\n var bounds = info.bounds;\n if ((bounds[1] - bounds[3] + 1) > ngx ||\n (bounds[2] - bounds[0] + 1) > ngy) {\n return false;\n }\n }\n\n // Determine the position to put the text by\n // start looking for the nearest points\n var r = maxRadius + 1;\n\n var tryToPutWordAtPoint = function(gxy) {\n var gx = Math.floor(gxy[0] - info.gw / 2);\n var gy = Math.floor(gxy[1] - info.gh / 2);\n var gw = info.gw;\n var gh = info.gh;\n\n // If we cannot fit the text at this position, return false\n // and go to the next position.\n if (!canFitText(gx, gy, gw, gh, info.occupied)) {\n return false;\n }\n\n // Actually put the text on the canvas\n drawText(gx, gy, info, word, weight,\n (maxRadius - r), gxy[2], rotateDeg, attributes);\n\n // Mark the spaces on the grid as filled\n updateGrid(gx, gy, gw, gh, info, item);\n\n return {\n gx: gx,\n gy: gy,\n rot: rotateDeg,\n info: info\n };\n };\n\n while (r--) {\n var points = getPointsAtRadius(maxRadius - r);\n\n if (settings.shuffle) {\n points = [].concat(points);\n shuffleArray(points);\n }\n\n // Try to fit the words by looking at each point.\n // array.some() will stop and return true\n // when putWordAtPoint() returns true.\n for (var i = 0; i < points.length; i++) {\n var res = tryToPutWordAtPoint(points[i]);\n if (res) {\n return res;\n }\n }\n\n // var drawn = points.some(tryToPutWordAtPoint);\n // if (drawn) {\n // // leave putWord() and return true\n // return true;\n // }\n }\n // we tried all distances but text won't fit, return null\n return null;\n };\n\n /* Send DOM event to all elements. Will stop sending event and return\n if the previous one is canceled (for cancelable events). */\n var sendEvent = function sendEvent(type, cancelable, detail) {\n if (cancelable) {\n return !elements.some(function(el) {\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(type, true, cancelable, detail || {});\n return !el.dispatchEvent(evt);\n }, this);\n } else {\n elements.forEach(function(el) {\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(type, true, cancelable, detail || {});\n el.dispatchEvent(evt);\n }, this);\n }\n };\n\n /* Start drawing on a canvas */\n var start = function start() {\n // For dimensions, clearCanvas etc.,\n // we only care about the first element.\n var canvas = elements[0];\n\n if (canvas.getContext) {\n ngx = Math.ceil(canvas.width / g);\n ngy = Math.ceil(canvas.height / g);\n } else {\n var rect = canvas.getBoundingClientRect();\n ngx = Math.ceil(rect.width / g);\n ngy = Math.ceil(rect.height / g);\n }\n\n // Sending a wordcloudstart event which cause the previous loop to stop.\n // Do nothing if the event is canceled.\n if (!sendEvent('wordcloudstart', true)) {\n return;\n }\n\n // Determine the center of the word cloud\n center = (settings.origin) ?\n [settings.origin[0]/g, settings.origin[1]/g] :\n [ngx / 2, ngy / 2];\n\n // Maxium radius to look for space\n maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy));\n\n /* Clear the canvas only if the clearCanvas is set,\n if not, update the grid to the current canvas state */\n grid = [];\n\n var gx, gy, i;\n if (!canvas.getContext || settings.clearCanvas) {\n elements.forEach(function(el) {\n if (el.getContext) {\n var ctx = el.getContext('2d');\n ctx.fillStyle = settings.backgroundColor;\n ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n } else {\n el.textContent = '';\n el.style.backgroundColor = settings.backgroundColor;\n el.style.position = 'relative';\n }\n });\n\n /* fill the grid with empty state */\n gx = ngx;\n while (gx--) {\n grid[gx] = [];\n gy = ngy;\n while (gy--) {\n grid[gx][gy] = true;\n }\n }\n } else {\n /* Determine bgPixel by creating\n another canvas and fill the specified background color. */\n var bctx = document.createElement('canvas').getContext('2d');\n\n bctx.fillStyle = settings.backgroundColor;\n bctx.fillRect(0, 0, 1, 1);\n var bgPixel = bctx.getImageData(0, 0, 1, 1).data;\n\n /* Read back the pixels of the canvas we got to tell which part of the\n canvas is empty.\n (no clearCanvas only works with a canvas, not divs) */\n var imageData =\n canvas.getContext('2d').getImageData(0, 0, ngx * g, ngy * g).data;\n\n gx = ngx;\n var x, y;\n while (gx--) {\n grid[gx] = [];\n gy = ngy;\n while (gy--) {\n y = g;\n singleGridLoop: while (y--) {\n x = g;\n while (x--) {\n i = 4;\n while (i--) {\n if (imageData[((gy * g + y) * ngx * g +\n (gx * g + x)) * 4 + i] !== bgPixel[i]) {\n grid[gx][gy] = false;\n break singleGridLoop;\n }\n }\n }\n }\n if (grid[gx][gy] !== false) {\n grid[gx][gy] = true;\n }\n }\n }\n\n imageData = bctx = bgPixel = undefined;\n }\n\n // fill the infoGrid with empty state if we need it\n if (settings.hover || settings.click) {\n\n interactive = true;\n\n /* fill the grid with empty state */\n gx = ngx + 1;\n while (gx--) {\n infoGrid[gx] = [];\n }\n\n if (settings.hover) {\n canvas.addEventListener('mousemove', wordcloudhover);\n }\n\n if (settings.click) {\n canvas.addEventListener('click', wordcloudclick);\n canvas.addEventListener('touchstart', wordcloudclick);\n canvas.addEventListener('touchend', function (e) {\n e.preventDefault();\n });\n canvas.style.webkitTapHighlightColor = 'rgba(0, 0, 0, 0)';\n }\n\n canvas.addEventListener('wordcloudstart', function stopInteraction() {\n canvas.removeEventListener('wordcloudstart', stopInteraction);\n\n canvas.removeEventListener('mousemove', wordcloudhover);\n canvas.removeEventListener('click', wordcloudclick);\n hovered = undefined;\n });\n }\n\n i = 0;\n var loopingFunction, stoppingFunction;\n var layouting = true;\n if (!settings.layoutAnimation) {\n loopingFunction = function (cb) {\n cb();\n };\n stoppingFunction = function () {\n layouting = false;\n }\n }\n else if (settings.wait !== 0) {\n loopingFunction = window.setTimeout;\n stoppingFunction = window.clearTimeout;\n } else {\n loopingFunction = window.setImmediate;\n stoppingFunction = window.clearImmediate;\n }\n\n var addEventListener = function addEventListener(type, listener) {\n elements.forEach(function(el) {\n el.addEventListener(type, listener);\n }, this);\n };\n\n var removeEventListener = function removeEventListener(type, listener) {\n elements.forEach(function(el) {\n el.removeEventListener(type, listener);\n }, this);\n };\n\n var anotherWordCloudStart = function anotherWordCloudStart() {\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n stoppingFunction(timer);\n };\n\n addEventListener('wordcloudstart', anotherWordCloudStart);\n\n // At least wait the following code before call the first iteration.\n var timer = (settings.layoutAnimation ? loopingFunction : setTimeout)(function loop() {\n if (!layouting) {\n return;\n }\n if (i >= settings.list.length) {\n stoppingFunction(timer);\n sendEvent('wordcloudstop', false);\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n\n return;\n }\n escapeTime = (new Date()).getTime();\n var drawn = putWord(settings.list[i]);\n var canceled = !sendEvent('wordclouddrawn', true, {\n item: settings.list[i], drawn: drawn });\n if (exceedTime() || canceled) {\n stoppingFunction(timer);\n settings.abort();\n sendEvent('wordcloudabort', false);\n sendEvent('wordcloudstop', false);\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n return;\n }\n i++;\n timer = loopingFunction(loop, settings.wait);\n }, settings.wait);\n };\n\n // All set, start the drawing\n start();\n };\n\n WordCloud.isSupported = isSupported;\n WordCloud.minFontSize = minFontSize;\n\n /* harmony default export */ const layout = (WordCloud);\n// CONCATENATED MODULE: ./src/wordCloud.js\n if (!layout.isSupported) {\n throw new Error('Sorry your browser not support wordCloud');\n}\n\n// https://github.com/timdream/wordcloud2.js/blob/c236bee60436e048949f9becc4f0f67bd832dc5c/index.js#L233\nfunction updateCanvasMask(maskCanvas) {\n var ctx = maskCanvas.getContext('2d');\n var imageData = ctx.getImageData(\n 0, 0, maskCanvas.width, maskCanvas.height);\n var newImageData = ctx.createImageData(imageData);\n\n var toneSum = 0;\n var toneCnt = 0;\n for (var i = 0; i < imageData.data.length; i += 4) {\n var alpha = imageData.data[i + 3];\n if (alpha > 128) {\n var tone = imageData.data[i]\n + imageData.data[i + 1]\n + imageData.data[i + 2];\n toneSum += tone;\n ++toneCnt;\n }\n }\n var threshold = toneSum / toneCnt;\n\n for (var i = 0; i < imageData.data.length; i += 4) {\n var tone = imageData.data[i]\n + imageData.data[i + 1]\n + imageData.data[i + 2];\n var alpha = imageData.data[i + 3];\n\n if (alpha < 128 || tone > threshold) {\n // Area not to draw\n newImageData.data[i] = 0;\n newImageData.data[i + 1] = 0;\n newImageData.data[i + 2] = 0;\n newImageData.data[i + 3] = 0;\n }\n else {\n // Area to draw\n // The color must be same with backgroundColor\n newImageData.data[i] = 255;\n newImageData.data[i + 1] = 255;\n newImageData.data[i + 2] = 255;\n newImageData.data[i + 3] = 255;\n }\n }\n\n ctx.putImageData(newImageData, 0, 0);\n}\n\nexternal_echarts_.registerLayout(function (ecModel, api) {\n ecModel.eachSeriesByType('wordCloud', function (seriesModel) {\n var gridRect = external_echarts_.helper.getLayoutRect(\n seriesModel.getBoxLayoutParams(), {\n width: api.getWidth(),\n height: api.getHeight()\n }\n );\n var data = seriesModel.getData();\n\n var canvas = document.createElement('canvas');\n canvas.width = gridRect.width;\n canvas.height = gridRect.height;\n\n var ctx = canvas.getContext('2d');\n var maskImage = seriesModel.get('maskImage');\n if (maskImage) {\n try {\n ctx.drawImage(maskImage, 0, 0, canvas.width, canvas.height);\n updateCanvasMask(canvas);\n }\n catch (e) {\n console.error('Invalid mask image');\n console.error(e.toString());\n }\n }\n\n var sizeRange = seriesModel.get('sizeRange');\n var rotationRange = seriesModel.get('rotationRange');\n var valueExtent = data.getDataExtent('value');\n\n var DEGREE_TO_RAD = Math.PI / 180;\n var gridSize = seriesModel.get('gridSize');\n layout(canvas, {\n list: data.mapArray('value', function (value, idx) {\n var itemModel = data.getItemModel(idx);\n return [\n data.getName(idx),\n itemModel.get('textStyle.fontSize', true)\n || external_echarts_.number.linearMap(value, valueExtent, sizeRange),\n idx\n ];\n }).sort(function (a, b) {\n // Sort from large to small in case there is no more room for more words\n return b[1] - a[1];\n }),\n fontFamily: seriesModel.get('textStyle.fontFamily')\n || seriesModel.get('emphasis.textStyle.fontFamily')\n || ecModel.get('textStyle.fontFamily'),\n fontWeight: seriesModel.get('textStyle.fontWeight')\n || seriesModel.get('emphasis.textStyle.fontWeight')\n || ecModel.get('textStyle.fontWeight'),\n\n gridSize: gridSize,\n\n ellipticity: gridRect.height / gridRect.width,\n\n minRotation: rotationRange[0] * DEGREE_TO_RAD,\n maxRotation: rotationRange[1] * DEGREE_TO_RAD,\n\n clearCanvas: !maskImage,\n\n rotateRatio: 1,\n\n rotationStep: seriesModel.get('rotationStep') * DEGREE_TO_RAD,\n\n drawOutOfBound: seriesModel.get('drawOutOfBound'),\n\n layoutAnimation: seriesModel.get('layoutAnimation'),\n\n shuffle: false,\n\n shape: seriesModel.get('shape')\n });\n\n function onWordCloudDrawn(e) {\n var item = e.detail.item;\n if (e.detail.drawn && seriesModel.layoutInstance.ondraw) {\n e.detail.drawn.gx += gridRect.x / gridSize;\n e.detail.drawn.gy += gridRect.y / gridSize;\n seriesModel.layoutInstance.ondraw(\n item[0], item[1], item[2], e.detail.drawn\n );\n }\n }\n\n canvas.addEventListener('wordclouddrawn', onWordCloudDrawn);\n\n if (seriesModel.layoutInstance) {\n // Dispose previous\n seriesModel.layoutInstance.dispose();\n }\n\n seriesModel.layoutInstance = {\n ondraw: null,\n\n dispose: function () {\n canvas.removeEventListener('wordclouddrawn', onWordCloudDrawn);\n // Abort\n canvas.addEventListener('wordclouddrawn', function (e) {\n // Prevent default to cancle the event and stop the loop\n e.preventDefault();\n });\n }\n };\n });\n});\n\nexternal_echarts_.registerPreprocessor(function (option) {\n var series = (option || {}).series;\n !external_echarts_.util.isArray(series) && (series = series ? [series] : []);\n\n var compats = ['shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\n\n external_echarts_.util.each(series, function (seriesItem) {\n if (seriesItem && seriesItem.type === 'wordCloud') {\n var textStyle = seriesItem.textStyle || {};\n\n compatTextStyle(textStyle.normal);\n compatTextStyle(textStyle.emphasis);\n }\n });\n\n function compatTextStyle(textStyle) {\n textStyle && external_echarts_.util.each(compats, function (key) {\n if (textStyle.hasOwnProperty(key)) {\n textStyle['text' + external_echarts_.format.capitalFirst(key)] = textStyle[key];\n }\n });\n }\n});\n\n// CONCATENATED MODULE: ./index.js\n /***/ }),\n\n/***/ \"echarts/lib/echarts\":\n/*!**************************!*\\\n !*** external \"echarts\" ***!\n \\**************************/\n/***/ ((module) => {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__;\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/************************************************************************/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(\"./index.js\");\n/******/ })()\n;\n});\n//# sourceMappingURL=echarts-wordcloud.js.map\n"]}]}