diff --git a/addons/cetmix_tower_server/static/src/components/ace_variables/ace_variables.esm.js b/addons/cetmix_tower_server/static/src/components/ace_variables/ace_variables.esm.js new file mode 100644 index 0000000..65eb8a6 --- /dev/null +++ b/addons/cetmix_tower_server/static/src/components/ace_variables/ace_variables.esm.js @@ -0,0 +1 @@ +LyoqIEBvZG9vLW1vZHVsZSAqKi8KCmltcG9ydCB7QWNlRmllbGR9IGZyb20gIkB3ZWIvdmlld3MvZmllbGRzL2FjZS9hY2VfZmllbGQiOwppbXBvcnQge0F1dG9jb21wbGV0ZVBvcHVwfSBmcm9tICIuL2F1dG9jb21wbGV0ZV9wb3B1cC5lc20iOwppbXBvcnQge3JlZ2lzdHJ5fSBmcm9tICJAd2ViL2NvcmUvcmVnaXN0cnkiOwppbXBvcnQge3VzZVNlcnZpY2V9IGZyb20gIkB3ZWIvY29yZS91dGlscy9ob29rcyI7CmltcG9ydCB7dXNlU3RhdGV9IGZyb20gIkBvZG9vL293bCI7Cgpjb25zdCBQT1BVUF9GQUxMQkFDS19XSURUSCA9IDUwMDsKY29uc3QgUE9QVVBfRkFMTEJBQ0tfSEVJR0hUID0gMzAwOwoKY2xhc3MgQWNlQ29tbWFuZEZpZWxkIGV4dGVuZHMgQWNlRmllbGQgewogICAgLyoqCiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCByZXF1aXJlZCBzZXJ2aWNlcyBhbmQgcHJvcGVydGllcwogICAgICovCiAgICBzZXR1cCgpIHsKICAgICAgICBzdXBlci5zZXR1cCgpOwogICAgICAgIHRoaXMub3JtID0gdXNlU2VydmljZSgib3JtIik7CiAgICAgICAgdGhpcy5pbnB1dExpc3RlbmVyID0gbnVsbDsKICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUxpc3RlbmVyID0gbnVsbDsKICAgICAgICB0aGlzLmlucHV0VGltZW91dCA9IG51bGw7CiAgICAgICAgdGhpcy52YXJpYWJsZXMgPSBbXTsKICAgICAgICB0aGlzLnNlY3JldHMgPSBbXTsKCiAgICAgICAgLy8gVXNlIHJlYWN0aXZlIHN0YXRlIGZvciBwcm9wZXJ0aWVzIHRoYXQgYWZmZWN0IHJlbmRlcmluZwogICAgICAgIHRoaXMuc3RhdGUgPSB1c2VTdGF0ZSh7CiAgICAgICAgICAgIHNob3dQb3B1cDogZmFsc2UsCiAgICAgICAgICAgIHBvcHVwSXRlbXM6IFtdLAogICAgICAgICAgICBwb3B1cFBvc2l0aW9uOiB7fSwKICAgICAgICAgICAgc2VsZWN0ZWRJbmRleDogMCwKICAgICAgICAgICAgLy8gQWRkIHBvcHVwIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYWJsZXMgYW5kIHNlY3JldHMKICAgICAgICAgICAgcG9wdXBUeXBlOiAidmFyaWFibGVzIiwKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEluZGV4ID0gdGhpcy51cGRhdGVTZWxlY3RlZEluZGV4LmJpbmQodGhpcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2FkIHZhcmlhYmxlcyBmcm9tIHRoZSBiYWNrZW5kIHVzaW5nIE9STSBzZXJ2aWNlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0KICAgICAqLwogICAgYXN5bmMgbG9hZFZhcmlhYmxlcygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IGF3YWl0IHRoaXMub3JtLnNlYXJjaFJlYWQoCiAgICAgICAgICAgICAgICAiY3gudG93ZXIudmFyaWFibGUiLAogICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICBbIm5hbWUiLCAicmVmZXJlbmNlIl0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc29sZS5sb2coYExvYWRlZCAke3RoaXMudmFyaWFibGVzLmxlbmd0aH0gdmFyaWFibGVzIGZvciBhdXRvY29tcGxldGVgKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gbG9hZCB2YXJpYWJsZXMgZm9yIGF1dG9jb21wbGV0ZToiLCBlcnJvcik7CiAgICAgICAgICAgIHRoaXMudmFyaWFibGVzID0gW107CiAgICAgICAgICAgIHRoaXMuZW52LnNlcnZpY2VzLm5vdGlmaWNhdGlvbi5hZGQoCiAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgYXV0b2NvbXBsZXRlIHZhcmlhYmxlcyIsCiAgICAgICAgICAgICAgICB7dHlwZTogIndhcm5pbmcifQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExvYWQgc2VjcmV0cyBmcm9tIHRoZSBiYWNrZW5kIHVzaW5nIE9STSBzZXJ2aWNlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0KICAgICAqLwogICAgYXN5bmMgbG9hZFNlY3JldHMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5zZWNyZXRzID0gYXdhaXQgdGhpcy5vcm0uc2VhcmNoUmVhZCgKICAgICAgICAgICAgICAgICJjeC50b3dlci5rZXkiLAogICAgICAgICAgICAgICAgW1sia2V5X3R5cGUiLCAiPSIsICJzIl1dLAogICAgICAgICAgICAgICAgWyJuYW1lIiwgInJlZmVyZW5jZSJdCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkZWQgJHt0aGlzLnNlY3JldHMubGVuZ3RofSBzZWNyZXRzIGZvciBhdXRvY29tcGxldGVgKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gbG9hZCBzZWNyZXRzIGZvciBhdXRvY29tcGxldGU6IiwgZXJyb3IpOwogICAgICAgICAgICB0aGlzLnNlY3JldHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5lbnYuc2VydmljZXMubm90aWZpY2F0aW9uLmFkZCgiRmFpbGVkIHRvIGxvYWQgYXV0b2NvbXBsZXRlIHNlY3JldHMiLCB7CiAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB1cCBBQ0UgZWRpdG9yIHdpdGggY3VzdG9tIGF1dG9jb21wbGV0aW9uCiAgICAgKi8KICAgIHNldHVwQWNlKCkgewogICAgICAgIHN1cGVyLnNldHVwQWNlKCk7CgogICAgICAgIGlmICh0aGlzLmFjZUVkaXRvcikgewogICAgICAgICAgICB0aGlzLnNldHVwQ3VzdG9tQXV0b2NvbXBsZXRpb24oKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25maWd1cmUgY3VzdG9tIGF1dG9jb21wbGV0aW9uIGNvbW1hbmRzIGFuZCBrZXlib2FyZCBiaW5kaW5ncyBmb3IgQUNFIGVkaXRvcgogICAgICovCiAgICBzZXR1cEN1c3RvbUF1dG9jb21wbGV0aW9uKCkgewogICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgY29uZmxpY3RpbmcgY29tbWFuZHMgZmlyc3QKICAgICAgICB0aGlzLmFjZUVkaXRvci5jb21tYW5kcy5yZW1vdmVDb21tYW5kKCJzdGFydEF1dG9jb21wbGV0ZSIpOwogICAgICAgIHRoaXMuYWNlRWRpdG9yLmNvbW1hbmRzLnJlbW92ZUNvbW1hbmQoImV4cGFuZFNuaXBwZXQiKTsKCiAgICAgICAgLy8gT25seSBhZGQgdGhlIG1haW4gYXV0b2NvbXBsZXRlIHRyaWdnZXIgY29tbWFuZAogICAgICAgIHRoaXMuYWNlRWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmQoewogICAgICAgICAgICBuYW1lOiAiY3VzdG9tQXV0b0NvbXBsZXRlIiwKICAgICAgICAgICAgYmluZEtleToge3dpbjogIkN0cmwtU3BhY2UiLCBtYWM6IG51bGx9LAogICAgICAgICAgICBleGVjOiAoZWRpdG9yKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnNob3dDdXN0b21Db21wbGV0aW9ucyhlZGl0b3IpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CgogICAgICAgIC8vIFNldCB1cCBpbnB1dCBsaXN0ZW5lciBmb3Ige3sgYW5kICMhIHRyaWdnZXJzCiAgICAgICAgdGhpcy5pbnB1dExpc3RlbmVyID0gKCkgPT4gewogICAgICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgdGltZW91dAogICAgICAgICAgICBpZiAodGhpcy5pbnB1dFRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlucHV0VGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHRoZSB0ZXh0IGlzIGZ1bGx5IHByb2Nlc3NlZAogICAgICAgICAgICB0aGlzLmlucHV0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yID0gdGhpcy5hY2VFZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLmFjZUVkaXRvci5nZXRTZXNzaW9uKCk7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IGxpbmUuc3Vic3RyaW5nKDAsIGN1cnNvci5jb2x1bW4pOwoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YXJpYWJsZXMgdHJpZ2dlciB7ewogICAgICAgICAgICAgICAgaWYgKHRleHRCZWZvcmVDdXJzb3IuZW5kc1dpdGgoInt7IikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUge3sgc3ltYm9scyBmcm9tIGVkaXRvcgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gTWF0aC5tYXgoMCwgY3Vyc29yLmNvbHVtbiAtIDIpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDoge3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBzdGFydENvbHVtbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDoge3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1ufSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVwbGFjZShyYW5nZSwgIiIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY3Vyc29yIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q3Vyc29yID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGN1cnNvci5yb3csCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFjZUVkaXRvci5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihuZXdDdXJzb3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0N1c3RvbUNvbXBsZXRpb25zKHRoaXMuYWNlRWRpdG9yLCAidmFyaWFibGVzIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc2VjcmV0cyB0cmlnZ2VyICEjCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0QmVmb3JlQ3Vyc29yLmVuZHNXaXRoKCIjISIpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlICEjIHN5bWJvbHMgZnJvbSBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydENvbHVtbiA9IE1hdGgubWF4KDAsIGN1cnNvci5jb2x1bW4gLSAyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogc3RhcnRDb2x1bW59LAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbn0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlcGxhY2UocmFuZ2UsICIiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGN1cnNvciBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0N1cnNvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBjdXJzb3Iucm93LAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2VFZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24obmV3Q3Vyc29yKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDdXN0b21Db21wbGV0aW9ucyh0aGlzLmFjZUVkaXRvciwgInNlY3JldHMiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMTApOwogICAgICAgIH07CgogICAgICAgIHRoaXMuYWNlRWRpdG9yLm9uKCJpbnB1dCIsIHRoaXMuaW5wdXRMaXN0ZW5lcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG93IGN1c3RvbSBjb21wbGV0aW9ucyBwb3B1cCB3aXRoIGF2YWlsYWJsZSB2YXJpYWJsZXMgb3Igc2VjcmV0cwogICAgICogQHBhcmFtIHtPYmplY3R9IGVkaXRvciAtIEFDRSBlZGl0b3IgaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVHlwZSBvZiBjb21wbGV0aW9uICgndmFyaWFibGVzJyBvciAnc2VjcmV0cycpCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0KICAgICAqLwogICAgYXN5bmMgc2hvd0N1c3RvbUNvbXBsZXRpb25zKGVkaXRvciwgdHlwZSA9ICJ2YXJpYWJsZXMiKSB7CiAgICAgICAgY29uc3QgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGVkaXRvci5nZXRTZXNzaW9uKCk7CiAgICAgICAgY29uc3QgbGluZSA9IHNlc3Npb24uZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICBjb25zdCB0ZXh0QmVmb3JlQ3Vyc29yID0gbGluZS5zdWJzdHJpbmcoMCwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgIGxldCBpdGVtcyA9IFtdOwogICAgICAgIGxldCB0cmlnZ2VyTGVuZ3RoID0gMDsKCiAgICAgICAgaWYgKHR5cGUgPT09ICJzZWNyZXRzIikgewogICAgICAgICAgICAvLyBIYW5kbGUgc2VjcmV0cwogICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZWNyZXRzKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2VjcmV0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlbXMgPSB0aGlzLnNlY3JldHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRWYXJpYWJsZXMoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy52YXJpYWJsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW1zID0gdGhpcy52YXJpYWJsZXM7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFscmVhZHkgaW4gYSB2YXJpYWJsZSBjb250ZXh0CiAgICAgICAgICAgIGNvbnN0IGlzSW5WYXJpYWJsZUNvbnRleHQgPSB0ZXh0QmVmb3JlQ3Vyc29yLmVuZHNXaXRoKCJ7eyIpOwoKICAgICAgICAgICAgaWYgKGlzSW5WYXJpYWJsZUNvbnRleHQpIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJMZW5ndGggPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlUG9wdXBQb3NpdGlvbihlZGl0b3IsIGN1cnNvcik7CgogICAgICAgIC8vIFNldCBwb3B1cCB0eXBlIGluIHN0YXRlCiAgICAgICAgdGhpcy5zdGF0ZS5wb3B1cFR5cGUgPSB0eXBlOwoKICAgICAgICBhd2FpdCB0aGlzLnNob3dBdXRvY29tcGxldGVQb3B1cChpdGVtcywgcG9zaXRpb24sIGVkaXRvciwgdHJpZ2dlckxlbmd0aCwgdHlwZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGUgdGhlIG9wdGltYWwgcG9zaXRpb24gZm9yIHRoZSBhdXRvY29tcGxldGUgcG9wdXAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlZGl0b3IgLSBBQ0UgZWRpdG9yIGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY3Vyc29yIC0gQ3Vyc29yIHBvc2l0aW9uIG9iamVjdAogICAgICogQHJldHVybnMge09iamVjdH0gUG9zaXRpb24gb2JqZWN0IHdpdGggbGVmdCBhbmQgdG9wIGNvb3JkaW5hdGVzCiAgICAgKi8KICAgIGNhbGN1bGF0ZVBvcHVwUG9zaXRpb24oZWRpdG9yLCBjdXJzb3IpIHsKICAgICAgICBjb25zdCByZW5kZXJlciA9IGVkaXRvci5yZW5kZXJlcjsKCiAgICAgICAgLy8gQ2FsY3VsYXRlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIGVkaXRvcgogICAgICAgIGNvbnN0IGN1cnNvclBpeGVsUG9zID0gcmVuZGVyZXIudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXMoCiAgICAgICAgICAgIGN1cnNvci5yb3csCiAgICAgICAgICAgIGN1cnNvci5jb2x1bW4KICAgICAgICApOwoKICAgICAgICAvLyBHZXQgc2Nyb2xsIHBvc2l0aW9uCiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0CiAgICAgICAgY29uc3Qgdmlld3BvcnRMZWZ0ID0gY3Vyc29yUGl4ZWxQb3MucGFnZVggLSBzY3JvbGxMZWZ0OwogICAgICAgIGNvbnN0IHZpZXdwb3J0VG9wID0gY3Vyc29yUGl4ZWxQb3MucGFnZVkgLSBzY3JvbGxUb3A7CgogICAgICAgIC8vIFBvc2l0aW9uIHBvcHVwIGp1c3QgYmVsb3cgdGhlIGN1cnNvcgogICAgICAgIGNvbnN0IGZpbmFsTGVmdCA9IHZpZXdwb3J0TGVmdDsKICAgICAgICBjb25zdCBmaW5hbFRvcCA9IHZpZXdwb3J0VG9wICsgcmVuZGVyZXIubGluZUhlaWdodDsKCiAgICAgICAgLy8gRW5zdXJlIHBvcHVwIGRvZXNuJ3QgZ28gb3V0c2lkZSB2aWV3cG9ydAogICAgICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgICBjb25zdCBwb3B1cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hY2UtYXV0b2NvbXBsZXRlLXBvcHVwIik7CiAgICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwID8gcG9wdXAub2Zmc2V0V2lkdGggOiBQT1BVUF9GQUxMQkFDS19XSURUSDsKICAgICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwID8gcG9wdXAub2Zmc2V0SGVpZ2h0IDogUE9QVVBfRkFMTEJBQ0tfSEVJR0hUOwoKICAgICAgICBsZXQgYWRqdXN0ZWRMZWZ0ID0gZmluYWxMZWZ0OwogICAgICAgIGxldCBhZGp1c3RlZFRvcCA9IGZpbmFsVG9wOwoKICAgICAgICAvLyBBZGp1c3QgaWYgcG9wdXAgd291bGQgZ28gb2ZmLXNjcmVlbiBob3Jpem9udGFsbHkKICAgICAgICBpZiAoZmluYWxMZWZ0ICsgcG9wdXBXaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHsKICAgICAgICAgICAgYWRqdXN0ZWRMZWZ0ID0gZmluYWxMZWZ0IC0gcG9wdXBXaWR0aDsKICAgICAgICB9CgogICAgICAgIC8vIEFkanVzdCBpZiBwb3B1cCB3b3VsZCBnbyBvZmYtc2NyZWVuIHZlcnRpY2FsbHkKICAgICAgICBpZiAoZmluYWxUb3AgKyBwb3B1cEhlaWdodCA+IHZpZXdwb3J0SGVpZ2h0KSB7CiAgICAgICAgICAgIGFkanVzdGVkVG9wID0gZmluYWxUb3AgLSBwb3B1cEhlaWdodCAtIHJlbmRlcmVyLmxpbmVIZWlnaHQ7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIHN1cmUgcG9wdXAgaXMgbm90IHBvc2l0aW9uZWQgb2ZmLXNjcmVlbgogICAgICAgIGFkanVzdGVkTGVmdCA9IE1hdGgubWF4KDAsIGFkanVzdGVkTGVmdCk7CiAgICAgICAgYWRqdXN0ZWRUb3AgPSBNYXRoLm1heCgwLCBhZGp1c3RlZFRvcCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGxlZnQ6IGFkanVzdGVkTGVmdCwKICAgICAgICAgICAgdG9wOiBhZGp1c3RlZFRvcCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogRGlzcGxheSB0aGUgYXV0b2NvbXBsZXRlIHBvcHVwIHdpdGggdmFyaWFibGVzIG9yIHNlY3JldHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgogICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXMgLSBBcnJheSBvZiBhdmFpbGFibGUgdmFyaWFibGVzIG9yIHNlY3JldHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9iamVjdCB3aXRoIGxlZnQgYW5kIHRvcCBjb29yZGluYXRlcwogICAgICogQHBhcmFtIHtPYmplY3R9IGVkaXRvciAtIEFDRSBlZGl0b3IgaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0cmlnZ2VyTGVuZ3RoIC0gTGVuZ3RoIG9mIHRyaWdnZXIgdGV4dCB0aGF0IHNob3VsZCBiZSByZXBsYWNlZAogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUeXBlIG9mIGNvbXBsZXRpb24gKCd2YXJpYWJsZXMnIG9yICdzZWNyZXRzJykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fQogICAgICovCiAgICBhc3luYyBzaG93QXV0b2NvbXBsZXRlUG9wdXAoCiAgICAgICAgaXRlbXMsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgZWRpdG9yLAogICAgICAgIHRyaWdnZXJMZW5ndGgsCiAgICAgICAgdHlwZSA9ICJ2YXJpYWJsZXMiCiAgICApIHsKICAgICAgICB0aGlzLmhpZGVBdXRvY29tcGxldGVQb3B1cCgpOwoKICAgICAgICB0aGlzLnN0YXRlLnBvcHVwSXRlbXMgPSBpdGVtczsKICAgICAgICB0aGlzLnN0YXRlLnBvcHVwUG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICB0aGlzLnN0YXRlLnNob3dQb3B1cCA9IHRydWU7CiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDsKICAgICAgICB0aGlzLnN0YXRlLnBvcHVwVHlwZSA9IHR5cGU7CiAgICAgICAgdGhpcy5jdXJyZW50RWRpdG9yID0gZWRpdG9yOwogICAgICAgIHRoaXMuY3VycmVudFRyaWdnZXJMZW5ndGggPSB0cmlnZ2VyTGVuZ3RoOwogICAgICAgIHRoaXMuY3VycmVudFR5cGUgPSB0eXBlOwoKICAgICAgICAvLyBBZGQgY2xpY2sgb3V0c2lkZSBsaXN0ZW5lcgogICAgICAgIHRoaXMuY2xpY2tPdXRzaWRlTGlzdGVuZXIgPSAoZXZlbnQpID0+IHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2xpY2sgaXMgb3V0c2lkZSB0aGUgcG9wdXAgYW5kIGFjZSBlZGl0b3IKICAgICAgICAgICAgY29uc3QgcG9wdXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmFjZS1hdXRvY29tcGxldGUtcG9wdXAiKTsKICAgICAgICAgICAgY29uc3QgYWNlRWxlbWVudCA9IHRoaXMuYWNlRWRpdG9yLmNvbnRhaW5lcjsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHBvcHVwRWxlbWVudCAmJgogICAgICAgICAgICAgICAgIXBvcHVwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmCiAgICAgICAgICAgICAgICBhY2VFbGVtZW50ICYmCiAgICAgICAgICAgICAgICAhYWNlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgdGhpcy5oaWRlQXV0b2NvbXBsZXRlUG9wdXAoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xpY2tPdXRzaWRlTGlzdGVuZXIsIHRydWUpOwogICAgICAgIH0sIDApOwogICAgfQoKICAgIC8qKgogICAgICogSGlkZSB0aGUgYXV0b2NvbXBsZXRlIHBvcHVwIGFuZCBjbGVhbiB1cCBldmVudCBsaXN0ZW5lcnMKICAgICAqLwogICAgaGlkZUF1dG9jb21wbGV0ZVBvcHVwKCkgewogICAgICAgIC8vIFJlbW92ZSBjbGljayBvdXRzaWRlIGxpc3RlbmVyCiAgICAgICAgaWYgKHRoaXMuY2xpY2tPdXRzaWRlTGlzdGVuZXIpIHsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmNsaWNrT3V0c2lkZUxpc3RlbmVyLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5jbGlja091dHNpZGVMaXN0ZW5lciA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnN0YXRlLnNob3dQb3B1cCA9IGZhbHNlOwogICAgICAgIHRoaXMuc3RhdGUucG9wdXBWYXJpYWJsZXMgPSBbXTsKICAgICAgICB0aGlzLmN1cnJlbnRFZGl0b3IgPSBudWxsOwogICAgICAgIHRoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7CgogICAgICAgIC8vIFJldHVybiBmb2N1cyB0byB0aGUgQUNFIGVkaXRvcgogICAgICAgIGlmICh0aGlzLmFjZUVkaXRvcikgewogICAgICAgICAgICB0aGlzLmFjZUVkaXRvci5mb2N1cygpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgaW5kZXggaW4gdGhlIGF1dG9jb21wbGV0ZSBwb3B1cAogICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gTmV3IHNlbGVjdGVkIGluZGV4CiAgICAgKi8KICAgIHVwZGF0ZVNlbGVjdGVkSW5kZXgoaW5kZXgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0ZSkgewogICAgICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXggPSBpbmRleDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIYW5kbGUgc2VsZWN0aW9uIG9mIGEgY29tbWFuZCBmcm9tIHRoZSBhdXRvY29tcGxldGUgcG9wdXAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21tYW5kIC0gU2VsZWN0ZWQgY29tbWFuZCBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlZGl0b3IgLSBBQ0UgZWRpdG9yIGluc3RhbmNlCiAgICAgKi8KICAgIGhhbmRsZUNvbW1hbmRTZWxlY3Rpb24oY29tbWFuZCwgZWRpdG9yKSB7CiAgICAgICAgaWYgKCFjb21tYW5kIHx8ICFjb21tYW5kLnJlZmVyZW5jZSkgewogICAgICAgICAgICB0aGlzLmhpZGVBdXRvY29tcGxldGVQb3B1cCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICBjb25zdCBzZXNzaW9uID0gZWRpdG9yLmdldFNlc3Npb24oKTsKICAgICAgICBjb25zdCBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBsaW5lLnN1YnN0cmluZygwLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgLy8gR2V0IGxpbmUgbGVuZ3RoIGZvciB2YWxpZGF0aW9uCiAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHNlc3Npb24uZ2V0TGluZShjdXJzb3Iucm93KS5sZW5ndGg7CiAgICAgICAgY29uc3QgY3VycmVudFR5cGUgPSB0aGlzLmN1cnJlbnRUeXBlIHx8IHRoaXMuc3RhdGUucG9wdXBUeXBlOwoKICAgICAgICBsZXQgcmFuZ2UgPSBudWxsOwogICAgICAgIGxldCBpbnNlcnRUZXh0ID0gIiI7CgogICAgICAgIGlmIChjdXJyZW50VHlwZSA9PT0gInNlY3JldHMiKSB7CiAgICAgICAgICAgIC8vIEhhbmRsZSBzZWNyZXRzIGluc2VydGlvbgogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbnNpZGUgYSBzZWNyZXQgY29udGV4dCAoYmV0d2VlbiAjIWN4dG93ZXIuc2VjcmV0IGFuZCAhIykKICAgICAgICAgICAgY29uc3QgbGFzdFNlY3JldFN0YXJ0ID0gdGV4dEJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZigiIyFjeHRvd2VyLnNlY3JldCIpOwogICAgICAgICAgICBjb25zdCBsYXN0U2VjcmV0RW5kID0gdGV4dEJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZigiISMiKTsKCiAgICAgICAgICAgIC8vIENvdW50IG9jY3VycmVuY2VzIG9mIHN0YXJ0IGFuZCBlbmQgZGVsaW1pdGVycyBmb3IgbW9yZSByb2J1c3QgdmFsaWRhdGlvbgogICAgICAgICAgICBjb25zdCBzdGFydENvdW50ID0gKHRleHRCZWZvcmVDdXJzb3IubWF0Y2goLyMhY3h0b3dlclwuc2VjcmV0L2cpIHx8IFtdKQogICAgICAgICAgICAgICAgLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgZW5kQ291bnQgPSAodGV4dEJlZm9yZUN1cnNvci5tYXRjaCgvISMvZykgfHwgW10pLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgaXNJbnNpZGVTZWNyZXQgPQogICAgICAgICAgICAgICAgc3RhcnRDb3VudCA+IGVuZENvdW50ICYmCiAgICAgICAgICAgICAgICBsYXN0U2VjcmV0U3RhcnQgPiBsYXN0U2VjcmV0RW5kICYmCiAgICAgICAgICAgICAgICBsYXN0U2VjcmV0U3RhcnQgIT09IC0xOwoKICAgICAgICAgICAgaWYgKGlzSW5zaWRlU2VjcmV0KSB7CiAgICAgICAgICAgICAgICAvLyBXZSdyZSBpbnNpZGUgYSBzZWNyZXQgY29udGV4dCwgcmVwbGFjZSBmcm9tIGFmdGVyICMhY3h0b3dlciB0byBjdXJzb3IKICAgICAgICAgICAgICAgIHJhbmdlID0gewogICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGxhc3RTZWNyZXRTdGFydCArIDE2fSwKICAgICAgICAgICAgICAgICAgICBlbmQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbn0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gQ2xhbXAgcmFuZ2UgdG8gdmFsaWQgYm91bmRzCiAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLnN0YXJ0LmNvbHVtbiwgbGluZUxlbmd0aCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gTWF0aC5tYXgoCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLmVuZC5jb2x1bW4sIGxpbmVMZW5ndGgpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaW5zZXJ0VGV4dCA9IGAke2NvbW1hbmQucmVmZXJlbmNlfSEjYDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiBhIHNlY3JldCBjb250ZXh0LCBpbnNlcnQgY29tcGxldGUgc2VjcmV0CiAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyTGVuZ3RoID0gdGhpcy5jdXJyZW50VHJpZ2dlckxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgcmFuZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiAtIHRyaWdnZXJMZW5ndGh9LAogICAgICAgICAgICAgICAgICAgIGVuZDoge3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1ufSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBDbGFtcCByYW5nZSB0byB2YWxpZCBib3VuZHMKICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiA9IE1hdGgubWF4KAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4ocmFuZ2Uuc3RhcnQuY29sdW1uLCBsaW5lTGVuZ3RoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4ocmFuZ2UuZW5kLmNvbHVtbiwgbGluZUxlbmd0aCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpbnNlcnRUZXh0ID0gYCMhY3h0b3dlci5zZWNyZXQuJHtjb21tYW5kLnJlZmVyZW5jZX0hI2A7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBIYW5kbGUgdmFyaWFibGVzIGluc2VydGlvbiAoZXhpc3RpbmcgbG9naWMpCiAgICAgICAgICAgIGNvbnN0IGxhc3RPcGVuQnJhY2UgPSB0ZXh0QmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKCJ7eyIpOwogICAgICAgICAgICBjb25zdCBsYXN0Q2xvc2VCcmFjZSA9IHRleHRCZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoIn19Iik7CiAgICAgICAgICAgIGNvbnN0IGlzSW5zaWRlVmFyaWFibGUgPQogICAgICAgICAgICAgICAgbGFzdE9wZW5CcmFjZSA+IGxhc3RDbG9zZUJyYWNlICYmIGxhc3RPcGVuQnJhY2UgIT09IC0xOwoKICAgICAgICAgICAgaWYgKGlzSW5zaWRlVmFyaWFibGUpIHsKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluc2lkZSBhIHZhcmlhYmxlIGNvbnRleHQsIHJlcGxhY2UgZnJvbSBhZnRlciB7eyB0byBjdXJzb3IKICAgICAgICAgICAgICAgIHJhbmdlID0gewogICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGxhc3RPcGVuQnJhY2UgKyAyfSwKICAgICAgICAgICAgICAgICAgICBlbmQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbn0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gQ2xhbXAgcmFuZ2UgdG8gdmFsaWQgYm91bmRzCiAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLnN0YXJ0LmNvbHVtbiwgbGluZUxlbmd0aCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gTWF0aC5tYXgoCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLmVuZC5jb2x1bW4sIGxpbmVMZW5ndGgpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaW5zZXJ0VGV4dCA9IGAgJHtjb21tYW5kLnJlZmVyZW5jZX0gYDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiBhIHZhcmlhYmxlIGNvbnRleHQsIGluc2VydCBjb21wbGV0ZSB2YXJpYWJsZQogICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckxlbmd0aCA9IHRoaXMuY3VycmVudFRyaWdnZXJMZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgIHJhbmdlID0gewogICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gLSB0cmlnZ2VyTGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICBlbmQ6IHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbn0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gQ2xhbXAgcmFuZ2UgdG8gdmFsaWQgYm91bmRzCiAgICAgICAgICAgICAgICByYW5nZS5zdGFydC5jb2x1bW4gPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLnN0YXJ0LmNvbHVtbiwgbGluZUxlbmd0aCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gTWF0aC5tYXgoCiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uLAogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHJhbmdlLmVuZC5jb2x1bW4sIGxpbmVMZW5ndGgpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaW5zZXJ0VGV4dCA9IGB7eyAke2NvbW1hbmQucmVmZXJlbmNlfSB9fWA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJlcGxhY2UgdGhlIHRleHQKICAgICAgICBzZXNzaW9uLnJlcGxhY2UocmFuZ2UsIGluc2VydFRleHQpOwoKICAgICAgICAvLyBHZXQgdGhlIHVwZGF0ZWQgbGluZSBsZW5ndGggYWZ0ZXIgcmVwbGFjZW1lbnQKICAgICAgICBjb25zdCB1cGRhdGVkTGluZUxlbmd0aCA9IHNlc3Npb24uZ2V0TGluZShjdXJzb3Iucm93KS5sZW5ndGg7CgogICAgICAgIC8vIFBvc2l0aW9uIGN1cnNvciBhZnRlciB0aGUgaW5zZXJ0ZWQgdGV4dAogICAgICAgIGNvbnN0IG5ld0N1cnNvciA9IHsKICAgICAgICAgICAgcm93OiBjdXJzb3Iucm93LAogICAgICAgICAgICBjb2x1bW46IHJhbmdlLnN0YXJ0LmNvbHVtbiArIGluc2VydFRleHQubGVuZ3RoLAogICAgICAgIH07CgogICAgICAgIG5ld0N1cnNvci5jb2x1bW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuZXdDdXJzb3IuY29sdW1uLCB1cGRhdGVkTGluZUxlbmd0aCkpOwoKICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24obmV3Q3Vyc29yKTsKCiAgICAgICAgdGhpcy5oaWRlQXV0b2NvbXBsZXRlUG9wdXAoKTsKICAgICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENsZWFuIHVwIHJlc291cmNlcyB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQKICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAodGhpcy5pbnB1dFRpbWVvdXQpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5wdXRUaW1lb3V0KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuYWNlRWRpdG9yICYmIHRoaXMuaW5wdXRMaXN0ZW5lcikgewogICAgICAgICAgICB0aGlzLmFjZUVkaXRvci5vZmYoImlucHV0IiwgdGhpcy5pbnB1dExpc3RlbmVyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oaWRlQXV0b2NvbXBsZXRlUG9wdXAoKTsKICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICB9Cn0KCkFjZUNvbW1hbmRGaWVsZC50ZW1wbGF0ZSA9ICJjZXRtaXhfdG93ZXJfc2VydmVyLkFjZUNvbW1hbmRGaWVsZCI7CkFjZUNvbW1hbmRGaWVsZC5jb21wb25lbnRzID0gewogICAgQXV0b2NvbXBsZXRlUG9wdXAsCn07CgpyZWdpc3RyeS5jYXRlZ29yeSgiZmllbGRzIikuYWRkKCJhY2VfdG93ZXIiLCBBY2VDb21tYW5kRmllbGQpOwoKZXhwb3J0IHtBY2VDb21tYW5kRmllbGR9Owo= \ No newline at end of file